-
Notifications
You must be signed in to change notification settings - Fork 2.7k
/
Copy pathcontext.ts
56 lines (50 loc) · 1.73 KB
/
context.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
import { derived, type Readable } from "svelte/store"
import type { Chain, Ucs03Channel, UserAddresses } from "$lib/types"
import type { userBalancesQuery } from "$lib/queries/balance"
import type { RawIntentsStore } from "$lib/components/TransferFrom/transfer/raw-intents"
import { err, ok, type Result } from "neverthrow"
export interface TokenBalance {
denom: string
balance: Result<string, Error>
}
export interface BalanceQueryResult {
chain_id: string
balances: Record<string, string>
}
export interface ContextStore {
chains: Array<Chain>
baseTokens: Array<TokenBalance>
userAddress: UserAddresses
ucs03channels: Array<Ucs03Channel>
}
export function createContextStore(
rawIntents: RawIntentsStore,
chains: Array<Chain>,
userAddress: Readable<UserAddresses>,
balancesQuery: ReturnType<typeof userBalancesQuery>,
ucs03channels: Array<Ucs03Channel>
): Readable<ContextStore> {
const baseTokenStore = derived([balancesQuery, rawIntents], ([$balances, $rawIntents]) => {
const sourceChain = chains.find(c => c.chain_id === $rawIntents.source)
if (!sourceChain) return []
const chainBalances = $balances.find(b => b.data?.chain_id === $rawIntents.source)?.data
return sourceChain.tokens.map(token => ({
denom: token.denom,
balance:
chainBalances?.balances?.andThen(bal => {
if (bal[token.denom]) {
return ok(bal[token.denom])
}
return err(new Error("no balance for this asset"))
}) ?? err(new Error("chainbalances undefined"))
}))
})
return derived([userAddress, baseTokenStore], ([$userAddress, $baseTokens]) => {
return {
chains,
baseTokens: $baseTokens,
userAddress: $userAddress,
ucs03channels
}
})
}