diff --git a/app/src/lib/components/TransferFrom/index.svelte b/app/src/lib/components/TransferFrom/index.svelte index 22d914d1e7..edf34eef18 100644 --- a/app/src/lib/components/TransferFrom/index.svelte +++ b/app/src/lib/components/TransferFrom/index.svelte @@ -83,6 +83,9 @@ validation.subscribe(async data => { }) +
+{#each $balances as balance}{JSON.stringify(balance.data, null, 2)}{/each}
+
@@ -112,4 +115,4 @@ validation.subscribe(async data => { {#if TRANSFER_DEBUG} {/if} -
\ No newline at end of file + diff --git a/app/src/lib/components/token.svelte b/app/src/lib/components/token.svelte index e8d8296df1..fbb2d373ec 100644 --- a/app/src/lib/components/token.svelte +++ b/app/src/lib/components/token.svelte @@ -18,8 +18,6 @@ export let userAmount: string | null = null export let expanded = false $: chain = chains.find(c => c.chain_id === chainId) ?? null -$: graphqlToken = - chain?.tokens.find(t => t.denom?.toLowerCase() === (denom ?? "").toLowerCase()) ?? null $: tokenInfo = tokenInfoQuery(chainId, (denom ?? "").toLowerCase(), chains) diff --git a/app/src/lib/queries/balance/evm/multicall.ts b/app/src/lib/queries/balance/evm/multicall.ts index 7df989382a..c51919fa6b 100644 --- a/app/src/lib/queries/balance/evm/multicall.ts +++ b/app/src/lib/queries/balance/evm/multicall.ts @@ -3,6 +3,7 @@ import { raise } from "$lib/utilities/index.ts" import { config } from "$lib/wallet/evm/config.ts" import { erc20Abi, getAddress, type Address } from "viem" import type { NoRepetition } from "$lib/utilities/types.ts" +import { ResultAsync } from "neverthrow" /** * @example @@ -54,7 +55,9 @@ export async function erc20ReadMulticall({ const currentResult = accumulator.at(-1) const fn = functionNames[index % functionNames.length] if (!currentResult) return accumulator - currentResult[fn === "balanceOf" ? "balance" : fn] = result ?? (fn === "decimals" ? 0 : "") + if (result !== undefined) { + currentResult[fn === "balanceOf" ? "balance" : fn] = result ?? (fn === "decimals" ? 0 : "") + } return accumulator }, [] as Array> diff --git a/app/src/lib/queries/balance/index.ts b/app/src/lib/queries/balance/index.ts index 3d9be9a3a4..70ff12234d 100644 --- a/app/src/lib/queries/balance/index.ts +++ b/app/src/lib/queries/balance/index.ts @@ -5,6 +5,7 @@ import { erc20ReadMulticall } from "./evm/multicall.ts" import { getCosmosChainBalances } from "./cosmos.ts" import { getAptosChainBalances } from "./aptos.ts" import { createQueries } from "@tanstack/svelte-query" +import { errAsync, ok, ResultAsync, type Result } from "neverthrow" export type AssetMetadata = { denom: string @@ -144,6 +145,9 @@ function getAddressForChain(chain: Chain, addresses: UserAddresses): string | nu } } +export type Denom = string +export type RawBalances = Record + export function userBalancesQuery({ userAddr, chains @@ -165,48 +169,60 @@ export function userBalancesQuery({ enabled: Boolean(getAddressForChain(chain, userAddr)), refetchInterval: 4_000, refetchOnWindowFocus: false, - queryFn: async () => { + queryFn: async (): Promise> => { const address = getAddressForChain(chain, userAddr) - if (!address) return null - - let rawBalances: Record = {} + if (!address) return errAsync(new Error(`no user address for chain ${chain.chain_id}`)) if (chain.rpc_type === "evm") { const tokenList = chain.tokens.filter(tokens => isAddress(tokens.denom)) - const multicallResults = await erc20ReadMulticall({ - chainId: chain.chain_id, - functionNames: ["balanceOf"], - address: address as Address, - contractAddresses: tokenList.map(asset => asset.denom) as Array
- }) - - multicallResults.forEach((result, index) => { - rawBalances[tokenList[index].denom] = result.balance?.toString() ?? "0" - }) - } else if (chain.rpc_type === "cosmos") { - const url = chain.rpcs.find(rpc => rpc.type === "rest")?.url - if (!url) throw new Error(`No REST RPC available for chain ${chain.chain_id}`) - - const bech32Address = bech32ToBech32Address({ - toPrefix: chain.addr_prefix, - address: address - }) - - const cosmosBalances = await getCosmosChainBalances({ url, walletAddress: bech32Address }) - cosmosBalances.forEach(balance => { - rawBalances[balance.address] = balance.balance.toString() - }) - } else if (chain.rpc_type === "aptos") { - const url = chain.rpcs.find(rpc => rpc.type === "rpc")?.url - if (!url) throw new Error(`No RPC available for chain ${chain.chain_id}`) - - const aptosBalances = await getAptosChainBalances({ url, walletAddress: address }) - aptosBalances.forEach(balance => { - rawBalances[balance.address] = balance.balance.toString() - }) + return await ResultAsync.fromPromise( + erc20ReadMulticall({ + chainId: chain.chain_id, + functionNames: ["balanceOf"], + address: address as Address, + contractAddresses: tokenList.map(asset => asset.denom) as Array
+ }), + error => new Error("error fetching evm balances", { cause: error }) + ).andThen(multicallResultss => + ok( + multicallResultss.reduce((acc, curr, index) => { + console.log({ curr }) + if (curr.balance) { + acc[tokenList[index].denom] = curr.balance.toString() + } + return acc + }, {}) + ) + ) } - return { chain_id: chain.chain_id, balances: rawBalances } + return errAsync(new Error("unimplemented")) + + // if (chain.rpc_type === "cosmos") { + // const url = chain.rpcs.find(rpc => rpc.type === "rest")?.url + // if (!url) throw new Error(`No REST RPC available for chain ${chain.chain_id}`) + + // const bech32Address = bech32ToBech32Address({ + // toPrefix: chain.addr_prefix, + // address: address + // }) + + // const cosmosBalances = await getCosmosChainBalances({ url, walletAddress: bech32Address }) + // cosmosBalances.forEach(balance => { + // rawBalances[balance.address] = balance.balance.toString() + // }) + // } + // if (chain.rpc_type === "aptos") { + // const url = chain.rpcs.find(rpc => rpc.type === "rpc")?.url + // if (!url) throw new Error(`No RPC available for chain ${chain.chain_id}`) + + // const aptosBalances = await getAptosChainBalances({ url, walletAddress: address }) + // aptosBalances.forEach(balance => { + // rawBalances[balance.address] = balance.balance.toString() + // }) + // } + + // return { chain_id: chain.chain_id, balances: rawBalances } } })) })