harb/web-app/src/composables/useWallet.ts
openhands 878d1337df fix: Clean up dead code and stale domain references across landing + web-app (#189)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-02-23 13:04:02 +00:00

151 lines
4.8 KiB
TypeScript

import { ref, reactive, computed } from 'vue';
import { getAccount, watchAccount, watchChainId, type Config } from '@wagmi/core';
import { type WatchAccountReturnType, type GetAccountReturnType, type GetBalanceReturnType } from '@wagmi/core';
import { config, KRAIKEN_LOCAL_CHAIN } from '@/wagmi';
import { getAllowance, HarbContract, getNonce } from '@/contracts/harb';
import logger from '@/utils/logger';
import { setHarbContract } from '@/contracts/harb';
import { setStakeContract } from '@/contracts/stake';
import { chainsData, DEFAULT_CHAIN_ID } from '@/config';
import { createPublicClient, custom, formatUnits, type EIP1193Provider, type PublicClient, type Transport, type WalletClient } from 'viem';
import { getWalletPublicClient, setWalletPublicClient } from '@/services/walletRpc';
const balance = ref<GetBalanceReturnType>({
value: 0n,
decimals: 0,
symbol: '',
formatted: '',
});
const account = ref<GetAccountReturnType>(getAccount(config as Config));
if (!account.value.chainId) {
account.value.chainId = DEFAULT_CHAIN_ID;
}
const selectedChainId = computed(() => account.value.chainId ?? DEFAULT_CHAIN_ID);
export const chainData = computed(() => {
return chainsData.find(obj => obj.id === selectedChainId.value);
});
const TOKEN_DECIMALS = 18;
const TOKEN_SYMBOL = 'KRK';
async function syncWalletPublicClient(data: GetAccountReturnType | undefined = account.value): Promise<PublicClient | null> {
if (!data?.address || !data.connector) {
setWalletPublicClient(null);
return null;
}
try {
const connector = data.connector;
if (!connector || typeof connector.getProvider !== 'function') {
setWalletPublicClient(null);
return null;
}
const connectorAny = connector as {
getProvider?: () => Promise<unknown>;
getWalletClient?: (args: { chainId: number }) => Promise<WalletClient | null>;
};
const provider = connectorAny.getProvider ? await connectorAny.getProvider() : null;
const walletClient = connectorAny.getWalletClient
? await connectorAny.getWalletClient({ chainId: data.chainId ?? selectedChainId.value })
: null;
if (!provider || typeof (provider as { request?: unknown }).request !== 'function') {
setWalletPublicClient(null);
return null;
}
const chain = (walletClient as WalletClient | null)?.chain ?? KRAIKEN_LOCAL_CHAIN;
const transport = custom(provider as EIP1193Provider) as Transport;
const publicClient = createPublicClient({
chain,
transport,
}) as PublicClient;
setWalletPublicClient(publicClient);
return publicClient;
} catch (_error) {
logger.contract('Failed to create wallet public client');
setWalletPublicClient(null);
return null;
}
}
let unwatch: WatchAccountReturnType | null = null;
let unwatchChain: WatchAccountReturnType | null = null;
export function useWallet() {
async function loadBalance() {
logger.contract('loadBalance');
const userAddress = account.value.address;
if (!userAddress) {
return 0n;
}
let publicClient = getWalletPublicClient();
if (!publicClient) {
publicClient = await syncWalletPublicClient();
}
if (!publicClient) {
return 0n;
}
const value = (await publicClient.readContract({
abi: HarbContract.abi,
address: HarbContract.contractAddress,
functionName: 'balanceOf',
args: [userAddress],
})) as bigint;
balance.value = {
value,
decimals: TOKEN_DECIMALS,
symbol: TOKEN_SYMBOL,
formatted: formatUnits(value, TOKEN_DECIMALS),
} as GetBalanceReturnType;
return value;
}
if (!unwatch) {
unwatch = watchAccount(config as Config, {
async onChange(data) {
if (!data.address) {
logger.info(`disconnected`);
setWalletPublicClient(null);
balance.value = {
value: 0n,
decimals: 0,
symbol: '',
formatted: '',
};
} else if (account.value.address !== data.address || account.value.chainId !== data.chainId) {
logger.info(`Account changed!:`, data.address);
account.value = data;
await syncWalletPublicClient(data);
await loadBalance();
await getAllowance();
// await loadPositions();
await getNonce();
setHarbContract();
setStakeContract();
}
},
});
}
//funzt nicht mehr-> library Änderung?
if (account.value.address) {
void syncWalletPublicClient(account.value);
}
if (!unwatchChain) {
unwatchChain = watchChainId(config as Config, {
async onChange(_chainId) {
await syncWalletPublicClient(account.value);
await loadBalance();
await getAllowance();
await getNonce();
},
});
}
return reactive({ balance, account, loadBalance });
}