@@ -5,6 +5,7 @@ import { erc20ReadMulticall } from "./evm/multicall.ts"
5
5
import { getCosmosChainBalances } from "./cosmos.ts"
6
6
import { getAptosChainBalances } from "./aptos.ts"
7
7
import { createQueries } from "@tanstack/svelte-query"
8
+ import { errAsync , ok , ResultAsync , type Result } from "neverthrow"
8
9
9
10
export type AssetMetadata = {
10
11
denom : string
@@ -144,6 +145,9 @@ function getAddressForChain(chain: Chain, addresses: UserAddresses): string | nu
144
145
}
145
146
}
146
147
148
+ export type Denom = string
149
+ export type RawBalances = Record < Denom , string >
150
+
147
151
export function userBalancesQuery ( {
148
152
userAddr,
149
153
chains
@@ -165,48 +169,60 @@ export function userBalancesQuery({
165
169
enabled : Boolean ( getAddressForChain ( chain , userAddr ) ) ,
166
170
refetchInterval : 4_000 ,
167
171
refetchOnWindowFocus : false ,
168
- queryFn : async ( ) => {
172
+ queryFn : async ( ) : Promise < Result < RawBalances , Error > > => {
169
173
const address = getAddressForChain ( chain , userAddr )
170
- if ( ! address ) return null
171
-
172
- let rawBalances : Record < string , string > = { }
174
+ if ( ! address ) return errAsync ( new Error ( `no user address for chain ${ chain . chain_id } ` ) )
173
175
174
176
if ( chain . rpc_type === "evm" ) {
175
177
const tokenList = chain . tokens . filter ( tokens => isAddress ( tokens . denom ) )
176
- const multicallResults = await erc20ReadMulticall ( {
177
- chainId : chain . chain_id ,
178
- functionNames : [ "balanceOf" ] ,
179
- address : address as Address ,
180
- contractAddresses : tokenList . map ( asset => asset . denom ) as Array < Address >
181
- } )
182
-
183
- multicallResults . forEach ( ( result , index ) => {
184
- rawBalances [ tokenList [ index ] . denom ] = result . balance ?. toString ( ) ?? "0"
185
- } )
186
- } else if ( chain . rpc_type === "cosmos" ) {
187
- const url = chain . rpcs . find ( rpc => rpc . type === "rest" ) ?. url
188
- if ( ! url ) throw new Error ( `No REST RPC available for chain ${ chain . chain_id } ` )
189
-
190
- const bech32Address = bech32ToBech32Address ( {
191
- toPrefix : chain . addr_prefix ,
192
- address : address
193
- } )
194
-
195
- const cosmosBalances = await getCosmosChainBalances ( { url, walletAddress : bech32Address } )
196
- cosmosBalances . forEach ( balance => {
197
- rawBalances [ balance . address ] = balance . balance . toString ( )
198
- } )
199
- } else if ( chain . rpc_type === "aptos" ) {
200
- const url = chain . rpcs . find ( rpc => rpc . type === "rpc" ) ?. url
201
- if ( ! url ) throw new Error ( `No RPC available for chain ${ chain . chain_id } ` )
202
-
203
- const aptosBalances = await getAptosChainBalances ( { url, walletAddress : address } )
204
- aptosBalances . forEach ( balance => {
205
- rawBalances [ balance . address ] = balance . balance . toString ( )
206
- } )
178
+ return await ResultAsync . fromPromise (
179
+ erc20ReadMulticall ( {
180
+ chainId : chain . chain_id ,
181
+ functionNames : [ "balanceOf" ] ,
182
+ address : address as Address ,
183
+ contractAddresses : tokenList . map ( asset => asset . denom ) as Array < Address >
184
+ } ) ,
185
+ error => new Error ( "error fetching evm balances" , { cause : error } )
186
+ ) . andThen ( multicallResultss =>
187
+ ok (
188
+ multicallResultss . reduce ( ( acc , curr , index ) => {
189
+ console . log ( { curr } )
190
+ if ( curr . balance ) {
191
+ acc [ tokenList [ index ] . denom ] = curr . balance . toString ( )
192
+ }
193
+ return acc
194
+ } , { } )
195
+ )
196
+ )
207
197
}
208
198
209
- return { chain_id : chain . chain_id , balances : rawBalances }
199
+ return errAsync ( new Error ( "unimplemented" ) )
200
+
201
+ // if (chain.rpc_type === "cosmos") {
202
+ // const url = chain.rpcs.find(rpc => rpc.type === "rest")?.url
203
+ // if (!url) throw new Error(`No REST RPC available for chain ${chain.chain_id}`)
204
+
205
+ // const bech32Address = bech32ToBech32Address({
206
+ // toPrefix: chain.addr_prefix,
207
+ // address: address
208
+ // })
209
+
210
+ // const cosmosBalances = await getCosmosChainBalances({ url, walletAddress: bech32Address })
211
+ // cosmosBalances.forEach(balance => {
212
+ // rawBalances[balance.address] = balance.balance.toString()
213
+ // })
214
+ // }
215
+ // if (chain.rpc_type === "aptos") {
216
+ // const url = chain.rpcs.find(rpc => rpc.type === "rpc")?.url
217
+ // if (!url) throw new Error(`No RPC available for chain ${chain.chain_id}`)
218
+
219
+ // const aptosBalances = await getAptosChainBalances({ url, walletAddress: address })
220
+ // aptosBalances.forEach(balance => {
221
+ // rawBalances[balance.address] = balance.balance.toString()
222
+ // })
223
+ // }
224
+
225
+ // return { chain_id: chain.chain_id, balances: rawBalances }
210
226
}
211
227
} ) )
212
228
} )
0 commit comments