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 }
}
}))
})