@talismn/balances-react 1.3.2 → 1.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/package.json +7 -7
package/dist/index.js
CHANGED
|
@@ -191,7 +191,7 @@ var import_anylogger = __toESM(require("anylogger"));
|
|
|
191
191
|
// package.json
|
|
192
192
|
var package_default = {
|
|
193
193
|
name: "@talismn/balances-react",
|
|
194
|
-
version: "1.3.
|
|
194
|
+
version: "1.3.3",
|
|
195
195
|
author: "Talisman",
|
|
196
196
|
homepage: "https://talisman.xyz",
|
|
197
197
|
license: "GPL-3.0-or-later",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/atoms/config.ts","../src/atoms/allAddresses.ts","../src/atoms/balances.ts","../src/atoms/balancesProvider.ts","../src/atoms/chainConnectors.ts","../src/atoms/chaindataProvider.ts","../src/atoms/chaindata.ts","../src/atoms/tokenRates.ts","../src/log.ts","../package.json","../src/atoms/cryptoWaitReady.ts","../src/hooks/useBalances.ts","../src/hooks/useChainConnectors.ts","../src/hooks/useChaindata.ts","../src/hooks/useTokenRates.ts"],"sourcesContent":["import { useSetAtom } from \"jotai\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n coinsApiConfigAtom,\n enabledChainsAtom,\n enabledTokensAtom,\n enableTestnetsAtom,\n} from \"./atoms/config\"\n\nexport {\n evmErc20TokenId,\n evmNativeTokenId,\n subAssetTokenId,\n subNativeTokenId,\n subPsp22TokenId,\n subTokensTokenId,\n} from \"@talismn/chaindata-provider\"\nexport * from \"./atoms/allAddresses\"\n// export * from \"./atoms/balanceModules\"\nexport * from \"./atoms/balances\"\nexport * from \"./atoms/chainConnectors\"\nexport * from \"./atoms/chaindata\"\nexport * from \"./atoms/chaindataProvider\"\nexport * from \"./atoms/config\"\nexport * from \"./atoms/cryptoWaitReady\"\nexport * from \"./atoms/tokenRates\"\nexport * from \"./hooks/useBalances\"\nexport * from \"./hooks/useChainConnectors\"\nexport * from \"./hooks/useChaindata\"\nexport * from \"./hooks/useTokenRates\"\n\nexport type BalancesConfig = {\n coinsApiUrl?: string\n\n /** Enables balances fetching for tokens on testnet chains. */\n withTestnets?: boolean\n\n /**\n * A list of chain genesisHashes to fetch balances for.\n *\n * If undefined, balances will be fetched for all chains.\n *\n * Only applies to built-in chains, custom chains will always fetch balances.\n *\n * NOTE: This is an allowlist to enable the dapp to disable balances for chains it does not care about.\n * Adding a chain here which is not already supported by the library will not automagically begin to fetch balances.\n * It will just be ignored.\n *\n * In a similar vein, if you add testnets here then make sure you've also set the `useTestnets` prop to `true`.\n *\n * @example\n * enabledChains={[\n * // polkadot\n * \"0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3\",\n * // kusama\n * \"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe\",\n * // rococo\n * \"0x6408de7737c59c238890533af25896a2c20608d8b380bb01029acb392781063e\",\n * // westend\n * \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n * ]}\n */\n enabledChains?: string[]\n\n /**\n * A list of token ids to fetch balances for.\n *\n * If undefined, balances will be fetched for all tokens.\n *\n * If `enabledChains` is also defined, both filters will be applied,\n * such that only the intersection of enabledChains and enabledTokens will be fetched.\n *\n * @example\n * enabledTokens={[\n * // DOT (polkadot relay chain)\n * \"polkadot-substrate-native\",\n * // USDC (polkadot asset hub)\n * \"polkadot-asset-hub-substrate-assets-1337-usdc\",\n * // ETH (ethereum mainnet)\n * \"1-evm-native\",\n * // GM (gm chain)\n * \"gm-substrate-tokens-gm\",\n * ]}\n */\n enabledTokens?: string[]\n\n children?: ReactNode\n}\n\nexport const BalancesProvider = ({\n coinsApiUrl,\n\n withTestnets,\n enabledChains,\n enabledTokens,\n\n children,\n}: BalancesConfig) => {\n const setCoinsApiConfig = useSetAtom(coinsApiConfigAtom)\n useEffect(() => {\n setCoinsApiConfig({ apiUrl: coinsApiUrl })\n }, [coinsApiUrl, setCoinsApiConfig])\n\n const setEnableTestnets = useSetAtom(enableTestnetsAtom)\n useEffect(() => {\n setEnableTestnets(withTestnets ?? false)\n }, [setEnableTestnets, withTestnets])\n\n const setEnabledChains = useSetAtom(enabledChainsAtom)\n useEffect(() => {\n setEnabledChains(enabledChains)\n }, [enabledChains, setEnabledChains])\n\n const setEnabledTokens = useSetAtom(enabledTokensAtom)\n useEffect(() => {\n setEnabledTokens(enabledTokens)\n }, [enabledTokens, setEnabledTokens])\n\n return <>{children}</>\n}\n","import type { DotNetworkId, TokenId } from \"@talismn/chaindata-provider\"\nimport { type CoinsApiConfig, DEFAULT_COINSAPI_CONFIG } from \"@talismn/token-rates\"\nimport { atom } from \"jotai\"\n\nconst innerCoinsApiConfigAtom = atom<CoinsApiConfig>(DEFAULT_COINSAPI_CONFIG)\nexport const coinsApiConfigAtom = atom<CoinsApiConfig, [Partial<CoinsApiConfig>], void>(\n (get) => get(innerCoinsApiConfigAtom),\n (_get, set, options) =>\n set(innerCoinsApiConfigAtom, {\n apiUrl: options.apiUrl ?? DEFAULT_COINSAPI_CONFIG.apiUrl,\n })\n)\n\nexport const enableTestnetsAtom = atom<boolean>(false)\n\nexport const enabledChainsAtom = atom<DotNetworkId[] | undefined>(undefined)\nexport const enabledTokensAtom = atom<TokenId[] | undefined>(undefined)\n","import { atom } from \"jotai\"\n\n/** Sets the list of addresses for which token balances will be fetched by the balances subscription */\nexport const allAddressesAtom = atom<string[]>([])\n","import { type Address, type BalanceJson, Balances, type HydrateDb } from \"@talismn/balances\"\nimport type { TokenId } from \"@talismn/chaindata-provider\"\nimport { atom } from \"jotai\"\nimport { atomEffect } from \"jotai-effect\"\nimport { fromPairs, keyBy } from \"lodash-es\"\n\nimport { allAddressesAtom } from \"./allAddresses\"\nimport { balancesProviderAtom } from \"./balancesProvider\"\nimport { chaindataAtom, tokensAtom } from \"./chaindata\"\nimport { tokenRatesAtom } from \"./tokenRates\"\n\nconst addressesByTokenIdAtom = atom(async (get): Promise<Record<TokenId, Address[]>> => {\n const [tokens, addresses] = await Promise.all([get(tokensAtom), get(allAddressesAtom)])\n\n return fromPairs(tokens.map((token) => [token.id, addresses]))\n})\n\nconst rawBalancesAtom = atom<BalanceJson[]>([])\n\nconst subscribeBalancesAtom = atomEffect((get, set) => {\n const unsub = (async () => {\n const balancesProvider = get(balancesProviderAtom)\n const addressesByTokenId = await get(addressesByTokenIdAtom)\n const sub = balancesProvider.getBalances$(addressesByTokenId).subscribe((balances) => {\n set(rawBalancesAtom, balances.balances)\n })\n\n return () => {\n return sub.unsubscribe()\n }\n })()\n\n return () => {\n unsub.then((unsubscribe) => unsubscribe())\n }\n})\n\nconst balancesHydrateDataAtom = atom(async (get): Promise<HydrateDb> => {\n const [chaindata, tokenRates] = await Promise.all([get(chaindataAtom), get(tokenRatesAtom)])\n\n const networksById = keyBy(chaindata.networks, \"id\")\n const tokensById = keyBy(chaindata.tokens, \"id\")\n\n return { networks: networksById, tokens: tokensById, tokenRates }\n})\n\nexport const balancesAtom = atom(async (get): Promise<Balances> => {\n // subscribe to balancesProvider getBalance with addressesByTokenIdAtom as param\n get(subscribeBalancesAtom)\n\n const hydrate = await get(balancesHydrateDataAtom)\n const rawBalances = get(rawBalancesAtom)\n\n return new Balances(rawBalances, hydrate)\n})\n","import { BalancesProvider } from \"@talismn/balances\"\nimport { atom } from \"jotai\"\n\nimport { chainConnectorsAtom } from \"./chainConnectors\"\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\n\nexport const balancesProviderAtom = atom<BalancesProvider>((get) => {\n return new BalancesProvider(\n get(chaindataProviderAtom),\n get(chainConnectorsAtom)\n // TODO pass storage\n )\n})\n","import type { ChainConnectors } from \"@talismn/balances\"\nimport { ChainConnectorDot, ChainConnectorEth, ChainConnectorSol } from \"@talismn/chain-connectors\"\nimport { connectionMetaDb } from \"@talismn/connection-meta\"\nimport { atom } from \"jotai\"\n\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\n\nexport const chainConnectorsAtom = atom<ChainConnectors>((get) => {\n const chaindataProvider = get(chaindataProviderAtom)\n\n const substrate = new ChainConnectorDot(chaindataProvider, connectionMetaDb)\n const evm = new ChainConnectorEth(chaindataProvider)\n const solana = new ChainConnectorSol(chaindataProvider)\n\n return { substrate, evm, solana }\n})\n","import { ChaindataProvider } from \"@talismn/chaindata-provider\"\nimport { atom, useAtom } from \"jotai\"\nimport { atomEffect } from \"jotai-effect\"\n\nexport const chaindataProviderAtom = atom<ChaindataProvider>(() => {\n return new ChaindataProvider({\n // TODO pass persistedStorage\n })\n})\n\nexport const useSyncSwapsChaindata = () => useAtom(syncSwapsChaindataAtomEffect)\n\nconst syncSwapsChaindataAtomEffect = atomEffect((get) => {\n const chaindataProvider = get(chaindataProviderAtom)\n\n // keep subscription open when swaps modal is open\n const subscription = chaindataProvider.networks$.subscribe()\n\n // close susbcription when swaps modal closes\n return () => subscription.unsubscribe()\n})\n","import { firstThenDebounce } from \"@talismn/util\"\nimport { atom } from \"jotai\"\nimport { atomWithObservable } from \"jotai/utils\"\nimport { keyBy } from \"lodash-es\"\nimport { combineLatest } from \"rxjs\"\n\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\nimport { enabledChainsAtom, enabledTokensAtom, enableTestnetsAtom } from \"./config\"\n\nexport const chaindataAtom = atomWithObservable((get) => {\n return combineLatest({\n networks: get(chaindataProviderAtom).networks$,\n tokens: get(chaindataProviderAtom).tokens$,\n }).pipe(firstThenDebounce(1_000))\n})\n\nconst filteredChaindataAtom = atom(async (get) => {\n const enabledNetworkIds = get(enabledChainsAtom)\n const enabledTokenIds = get(enabledTokensAtom)\n const enableTestnets = get(enableTestnetsAtom)\n\n const chaindata = await get(chaindataAtom)\n const networks = chaindata.networks.filter(\n (n) => (enabledNetworkIds?.includes(n.id) || n.isDefault) && (enableTestnets || !n.isTestnet)\n )\n\n const networkById = keyBy(networks, (n) => n.id)\n const tokens = chaindata.tokens.filter(\n (token) =>\n (enabledTokenIds?.includes(token.id) || token.isDefault) && networkById[token.networkId]\n )\n\n return { networks, tokens }\n})\n\nexport const tokensAtom = atom(async (get) => {\n const chaindata = await get(filteredChaindataAtom)\n return chaindata.tokens\n})\n\nexport const networksAtom = atom(async (get) => {\n const chaindata = await get(filteredChaindataAtom)\n return chaindata.networks\n})\n","import {\n ALL_CURRENCY_IDS,\n fetchTokenRates,\n type TokenRatesStorage,\n tryToDeleteOldTokenRatesDb,\n} from \"@talismn/token-rates\"\nimport { isAbortError, isTruthy } from \"@talismn/util\"\nimport { atom } from \"jotai\"\nimport { atomWithObservable } from \"jotai/utils\"\nimport { atomEffect } from \"jotai-effect\"\nimport { keyBy } from \"lodash-es\"\nimport { ReplaySubject } from \"rxjs\"\n\nimport log from \"../log\"\nimport { tokensAtom } from \"./chaindata\"\nimport { coinsApiConfigAtom } from \"./config\"\n\nexport const tokenRatesAtom = atom(async (get) => {\n // runs a timer to keep tokenRates up to date\n get(tokenRatesFetcherAtomEffect)\n\n return (await get(tokenRatesDbAtom)).tokenRates\n})\n\n// TODO: Persist to storage\nconst tokenRates$ = new ReplaySubject<TokenRatesStorage>(1)\n\nconst tokenRatesDbAtom = atomWithObservable(() => {\n tryToDeleteOldTokenRatesDb()\n return tokenRates$.asObservable()\n})\n\nconst tokenRatesFetcherAtomEffect = atomEffect((get) => {\n // lets us tear down the existing timer when the effect is restarted\n const abort = new AbortController()\n\n // we have to get these synchronously so that jotai knows to restart our timer when they change\n const coinsApiConfig = get(coinsApiConfigAtom)\n const tokensPromise = get(tokensAtom)\n\n ;(async () => {\n const tokensById = keyBy(await tokensPromise, \"id\")\n\n const loopMs = 300_000 // 300_000ms = 300s = 5 minutes\n const retryTimeout = 5_000 // 5_000ms = 5 seconds\n\n const hydrate = async () => {\n try {\n if (abort.signal.aborted) return // don't fetch if aborted\n const tokenRates = await fetchTokenRates(tokensById, ALL_CURRENCY_IDS, coinsApiConfig)\n const putTokenRates: TokenRatesStorage = { tokenRates }\n\n if (abort.signal.aborted) return // don't insert into db if aborted\n tokenRates$.next(putTokenRates)\n\n if (abort.signal.aborted) return // don't schedule next loop if aborted\n setTimeout(hydrate, loopMs)\n } catch (error) {\n const retrying = !abort.signal.aborted\n const messageParts = [\n \"Failed to fetch tokenRates\",\n retrying && `retrying in ${Math.round(retryTimeout / 1000)} seconds`,\n !retrying && `giving up (timer no longer needed)`,\n ].filter(isTruthy)\n log.error(messageParts.join(\", \"), error)\n\n if (isAbortError(error)) return // don't schedule retry if aborted\n setTimeout(hydrate, retryTimeout)\n }\n }\n\n // launch the loop\n hydrate()\n })()\n\n return () => abort.abort(\"Unsubscribed\")\n})\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/balances-react\",\n \"version\": \"1.3.2\",\n \"author\": \"Talisman\",\n \"homepage\": \"https://talisman.xyz\",\n \"license\": \"GPL-3.0-or-later\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"directory\": \"packages/balances-react\",\n \"type\": \"git\",\n \"url\": \"https://github.com/TalismanSociety/talisman.git\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist .turbo node_modules\",\n \"build\": \"tsup --silent\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@talismn/balances\": \"workspace:*\",\n \"@talismn/chain-connectors\": \"workspace:*\",\n \"@talismn/chaindata-provider\": \"workspace:*\",\n \"@talismn/connection-meta\": \"workspace:*\",\n \"@talismn/token-rates\": \"workspace:*\",\n \"@talismn/util\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"jotai\": \"~2\",\n \"jotai-effect\": \"~1\",\n \"lodash-es\": \"4.17.21\",\n \"rxjs\": \"^7.8.1\"\n },\n \"devDependencies\": {\n \"@talismn/tsconfig\": \"workspace:*\",\n \"@types/lodash-es\": \"4.17.12\",\n \"@types/react\": \"^18.3.12\",\n \"react\": \"^18.3.1\",\n \"typescript\": \"^5.6.3\"\n },\n \"peerDependencies\": {\n \"@polkadot/util-crypto\": \"*\",\n \"react\": \"*\",\n \"react-dom\": \"*\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.tsx\",\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n }\n }\n}\n","import { cryptoWaitReady } from \"@polkadot/util-crypto\"\nimport { atom } from \"jotai\"\n\nexport const cryptoWaitReadyAtom = atom(async () => await cryptoWaitReady())\n","import type { Balances } from \"@talismn/balances\"\nimport { useAtomValue, useSetAtom } from \"jotai\"\nimport { useEffect, useMemo } from \"react\"\n\nimport { allAddressesAtom } from \"../atoms/allAddresses\"\nimport { balancesAtom } from \"../atoms/balances\"\n\nexport const useSetBalancesAddresses = (addresses: string[]) => {\n const setAllAddresses = useSetAtom(allAddressesAtom)\n useEffect(() => {\n setAllAddresses((a) => (JSON.stringify(a) === JSON.stringify(addresses) ? a : addresses))\n }, [addresses, setAllAddresses])\n}\n\n/**\n * @name useBalances\n * @description Hook to get the current balances state.\n * @param persistBackend an optional BalancesPersistBackend backend to use for persisting the balances state. By default, indexedDB is used.\n * @returns a Balances object containing the current balances state.\n */\n\nexport const useBalances = () => {\n return useAtomValue(balancesAtom)\n}\n\n// TODO: Extract to shared definition between extension and @talismn/balances-react\nexport type BalancesStatus =\n | { status: \"live\" }\n | { status: \"fetching\" }\n | { status: \"stale\"; staleChains: string[] }\n\n/**\n * Given a collection of `Balances`, this hook returns a `BalancesStatus` summary for the collection.\n *\n * @param balances The collection of balances to get the status from.\n * @returns An instance of `BalancesStatus` which represents the status of the balances collection.\n\n */\nexport const useBalancesStatus = (balances: Balances) =>\n useMemo<BalancesStatus>(() => {\n // stale\n const staleChains = getStaleChains(balances)\n if (staleChains.length > 0) return { status: \"stale\", staleChains }\n\n // fetching\n const hasCachedBalances = balances.each.some((b) => b.status === \"cache\")\n if (hasCachedBalances) return { status: \"fetching\" }\n\n // live\n return { status: \"live\" }\n }, [balances])\n\nexport const getStaleChains = (balances: Balances): string[] => [\n ...new Set(\n balances.each\n .filter((b) => b.status === \"stale\")\n .map((b) => b.network?.name ?? b.networkId ?? \"Unknown\")\n ),\n]\n","import { useAtomValue } from \"jotai\"\n\nimport { chainConnectorsAtom } from \"../atoms/chainConnectors\"\n\nexport const useChainConnectors = () => useAtomValue(chainConnectorsAtom)\n","import type { NetworkId, TokenId } from \"@talismn/chaindata-provider\"\nimport { useAtomValue } from \"jotai\"\nimport { keyBy } from \"lodash-es\"\nimport { useMemo } from \"react\"\n\nimport { chaindataAtom } from \"../atoms/chaindata\"\nimport { chaindataProviderAtom } from \"../atoms/chaindataProvider\"\n\nexport const useChaindataProvider = () => useAtomValue(chaindataProviderAtom)\nexport const useChaindata = () => useAtomValue(chaindataAtom)\n\nexport const useNetworks = () => useChaindata().networks\nexport const useNetworksById = () => {\n const { networks } = useChaindata()\n return useMemo(() => keyBy(networks, (n) => n.id), [networks])\n}\nexport const useNetwork = (networkId?: NetworkId) => {\n const networksById = useNetworksById()\n return networksById[networkId ?? \"\"] ?? null\n}\n\nexport const useTokens = () => useChaindata().tokens\nexport const useTokensById = () => {\n const { tokens } = useChaindata()\n return useMemo(() => keyBy(tokens, (t) => t.id), [tokens])\n}\nexport const useToken = (tokenId?: TokenId) => {\n const tokensById = useTokensById()\n return tokensById[tokenId ?? \"\"] ?? null\n}\n","import type { TokenId } from \"@talismn/chaindata-provider\"\nimport { useAtomValue } from \"jotai\"\n\nimport { tokenRatesAtom } from \"../atoms/tokenRates\"\n\nexport const useTokenRates = () => useAtomValue(tokenRatesAtom)\nexport const useTokenRate = (tokenId?: TokenId) => useTokenRates()[tokenId ?? \"\"] ?? undefined\n"],"mappings":"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","names":["BalancesProvider","import_jotai","import_react","import_chaindata_provider","import_jotai","import_balances","import_jotai","import_jotai_effect","import_lodash_es","import_jotai","import_jotai","import_jotai","import_jotai","import_token_rates","import_util","import_jotai","import_utils","import_jotai_effect","import_lodash_es","import_rxjs","anylogger","import_jotai","import_jotai","import_jotai","import_jotai","import_lodash_es","import_react","import_jotai","BalancesProvider"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/atoms/config.ts","../src/atoms/allAddresses.ts","../src/atoms/balances.ts","../src/atoms/balancesProvider.ts","../src/atoms/chainConnectors.ts","../src/atoms/chaindataProvider.ts","../src/atoms/chaindata.ts","../src/atoms/tokenRates.ts","../src/log.ts","../package.json","../src/atoms/cryptoWaitReady.ts","../src/hooks/useBalances.ts","../src/hooks/useChainConnectors.ts","../src/hooks/useChaindata.ts","../src/hooks/useTokenRates.ts"],"sourcesContent":["import { useSetAtom } from \"jotai\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n coinsApiConfigAtom,\n enabledChainsAtom,\n enabledTokensAtom,\n enableTestnetsAtom,\n} from \"./atoms/config\"\n\nexport {\n evmErc20TokenId,\n evmNativeTokenId,\n subAssetTokenId,\n subNativeTokenId,\n subPsp22TokenId,\n subTokensTokenId,\n} from \"@talismn/chaindata-provider\"\nexport * from \"./atoms/allAddresses\"\n// export * from \"./atoms/balanceModules\"\nexport * from \"./atoms/balances\"\nexport * from \"./atoms/chainConnectors\"\nexport * from \"./atoms/chaindata\"\nexport * from \"./atoms/chaindataProvider\"\nexport * from \"./atoms/config\"\nexport * from \"./atoms/cryptoWaitReady\"\nexport * from \"./atoms/tokenRates\"\nexport * from \"./hooks/useBalances\"\nexport * from \"./hooks/useChainConnectors\"\nexport * from \"./hooks/useChaindata\"\nexport * from \"./hooks/useTokenRates\"\n\nexport type BalancesConfig = {\n coinsApiUrl?: string\n\n /** Enables balances fetching for tokens on testnet chains. */\n withTestnets?: boolean\n\n /**\n * A list of chain genesisHashes to fetch balances for.\n *\n * If undefined, balances will be fetched for all chains.\n *\n * Only applies to built-in chains, custom chains will always fetch balances.\n *\n * NOTE: This is an allowlist to enable the dapp to disable balances for chains it does not care about.\n * Adding a chain here which is not already supported by the library will not automagically begin to fetch balances.\n * It will just be ignored.\n *\n * In a similar vein, if you add testnets here then make sure you've also set the `useTestnets` prop to `true`.\n *\n * @example\n * enabledChains={[\n * // polkadot\n * \"0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3\",\n * // kusama\n * \"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe\",\n * // rococo\n * \"0x6408de7737c59c238890533af25896a2c20608d8b380bb01029acb392781063e\",\n * // westend\n * \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n * ]}\n */\n enabledChains?: string[]\n\n /**\n * A list of token ids to fetch balances for.\n *\n * If undefined, balances will be fetched for all tokens.\n *\n * If `enabledChains` is also defined, both filters will be applied,\n * such that only the intersection of enabledChains and enabledTokens will be fetched.\n *\n * @example\n * enabledTokens={[\n * // DOT (polkadot relay chain)\n * \"polkadot-substrate-native\",\n * // USDC (polkadot asset hub)\n * \"polkadot-asset-hub-substrate-assets-1337-usdc\",\n * // ETH (ethereum mainnet)\n * \"1-evm-native\",\n * // GM (gm chain)\n * \"gm-substrate-tokens-gm\",\n * ]}\n */\n enabledTokens?: string[]\n\n children?: ReactNode\n}\n\nexport const BalancesProvider = ({\n coinsApiUrl,\n\n withTestnets,\n enabledChains,\n enabledTokens,\n\n children,\n}: BalancesConfig) => {\n const setCoinsApiConfig = useSetAtom(coinsApiConfigAtom)\n useEffect(() => {\n setCoinsApiConfig({ apiUrl: coinsApiUrl })\n }, [coinsApiUrl, setCoinsApiConfig])\n\n const setEnableTestnets = useSetAtom(enableTestnetsAtom)\n useEffect(() => {\n setEnableTestnets(withTestnets ?? false)\n }, [setEnableTestnets, withTestnets])\n\n const setEnabledChains = useSetAtom(enabledChainsAtom)\n useEffect(() => {\n setEnabledChains(enabledChains)\n }, [enabledChains, setEnabledChains])\n\n const setEnabledTokens = useSetAtom(enabledTokensAtom)\n useEffect(() => {\n setEnabledTokens(enabledTokens)\n }, [enabledTokens, setEnabledTokens])\n\n return <>{children}</>\n}\n","import type { DotNetworkId, TokenId } from \"@talismn/chaindata-provider\"\nimport { type CoinsApiConfig, DEFAULT_COINSAPI_CONFIG } from \"@talismn/token-rates\"\nimport { atom } from \"jotai\"\n\nconst innerCoinsApiConfigAtom = atom<CoinsApiConfig>(DEFAULT_COINSAPI_CONFIG)\nexport const coinsApiConfigAtom = atom<CoinsApiConfig, [Partial<CoinsApiConfig>], void>(\n (get) => get(innerCoinsApiConfigAtom),\n (_get, set, options) =>\n set(innerCoinsApiConfigAtom, {\n apiUrl: options.apiUrl ?? DEFAULT_COINSAPI_CONFIG.apiUrl,\n })\n)\n\nexport const enableTestnetsAtom = atom<boolean>(false)\n\nexport const enabledChainsAtom = atom<DotNetworkId[] | undefined>(undefined)\nexport const enabledTokensAtom = atom<TokenId[] | undefined>(undefined)\n","import { atom } from \"jotai\"\n\n/** Sets the list of addresses for which token balances will be fetched by the balances subscription */\nexport const allAddressesAtom = atom<string[]>([])\n","import { type Address, type BalanceJson, Balances, type HydrateDb } from \"@talismn/balances\"\nimport type { TokenId } from \"@talismn/chaindata-provider\"\nimport { atom } from \"jotai\"\nimport { atomEffect } from \"jotai-effect\"\nimport { fromPairs, keyBy } from \"lodash-es\"\n\nimport { allAddressesAtom } from \"./allAddresses\"\nimport { balancesProviderAtom } from \"./balancesProvider\"\nimport { chaindataAtom, tokensAtom } from \"./chaindata\"\nimport { tokenRatesAtom } from \"./tokenRates\"\n\nconst addressesByTokenIdAtom = atom(async (get): Promise<Record<TokenId, Address[]>> => {\n const [tokens, addresses] = await Promise.all([get(tokensAtom), get(allAddressesAtom)])\n\n return fromPairs(tokens.map((token) => [token.id, addresses]))\n})\n\nconst rawBalancesAtom = atom<BalanceJson[]>([])\n\nconst subscribeBalancesAtom = atomEffect((get, set) => {\n const unsub = (async () => {\n const balancesProvider = get(balancesProviderAtom)\n const addressesByTokenId = await get(addressesByTokenIdAtom)\n const sub = balancesProvider.getBalances$(addressesByTokenId).subscribe((balances) => {\n set(rawBalancesAtom, balances.balances)\n })\n\n return () => {\n return sub.unsubscribe()\n }\n })()\n\n return () => {\n unsub.then((unsubscribe) => unsubscribe())\n }\n})\n\nconst balancesHydrateDataAtom = atom(async (get): Promise<HydrateDb> => {\n const [chaindata, tokenRates] = await Promise.all([get(chaindataAtom), get(tokenRatesAtom)])\n\n const networksById = keyBy(chaindata.networks, \"id\")\n const tokensById = keyBy(chaindata.tokens, \"id\")\n\n return { networks: networksById, tokens: tokensById, tokenRates }\n})\n\nexport const balancesAtom = atom(async (get): Promise<Balances> => {\n // subscribe to balancesProvider getBalance with addressesByTokenIdAtom as param\n get(subscribeBalancesAtom)\n\n const hydrate = await get(balancesHydrateDataAtom)\n const rawBalances = get(rawBalancesAtom)\n\n return new Balances(rawBalances, hydrate)\n})\n","import { BalancesProvider } from \"@talismn/balances\"\nimport { atom } from \"jotai\"\n\nimport { chainConnectorsAtom } from \"./chainConnectors\"\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\n\nexport const balancesProviderAtom = atom<BalancesProvider>((get) => {\n return new BalancesProvider(\n get(chaindataProviderAtom),\n get(chainConnectorsAtom)\n // TODO pass storage\n )\n})\n","import type { ChainConnectors } from \"@talismn/balances\"\nimport { ChainConnectorDot, ChainConnectorEth, ChainConnectorSol } from \"@talismn/chain-connectors\"\nimport { connectionMetaDb } from \"@talismn/connection-meta\"\nimport { atom } from \"jotai\"\n\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\n\nexport const chainConnectorsAtom = atom<ChainConnectors>((get) => {\n const chaindataProvider = get(chaindataProviderAtom)\n\n const substrate = new ChainConnectorDot(chaindataProvider, connectionMetaDb)\n const evm = new ChainConnectorEth(chaindataProvider)\n const solana = new ChainConnectorSol(chaindataProvider)\n\n return { substrate, evm, solana }\n})\n","import { ChaindataProvider } from \"@talismn/chaindata-provider\"\nimport { atom, useAtom } from \"jotai\"\nimport { atomEffect } from \"jotai-effect\"\n\nexport const chaindataProviderAtom = atom<ChaindataProvider>(() => {\n return new ChaindataProvider({\n // TODO pass persistedStorage\n })\n})\n\nexport const useSyncSwapsChaindata = () => useAtom(syncSwapsChaindataAtomEffect)\n\nconst syncSwapsChaindataAtomEffect = atomEffect((get) => {\n const chaindataProvider = get(chaindataProviderAtom)\n\n // keep subscription open when swaps modal is open\n const subscription = chaindataProvider.networks$.subscribe()\n\n // close susbcription when swaps modal closes\n return () => subscription.unsubscribe()\n})\n","import { firstThenDebounce } from \"@talismn/util\"\nimport { atom } from \"jotai\"\nimport { atomWithObservable } from \"jotai/utils\"\nimport { keyBy } from \"lodash-es\"\nimport { combineLatest } from \"rxjs\"\n\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\nimport { enabledChainsAtom, enabledTokensAtom, enableTestnetsAtom } from \"./config\"\n\nexport const chaindataAtom = atomWithObservable((get) => {\n return combineLatest({\n networks: get(chaindataProviderAtom).networks$,\n tokens: get(chaindataProviderAtom).tokens$,\n }).pipe(firstThenDebounce(1_000))\n})\n\nconst filteredChaindataAtom = atom(async (get) => {\n const enabledNetworkIds = get(enabledChainsAtom)\n const enabledTokenIds = get(enabledTokensAtom)\n const enableTestnets = get(enableTestnetsAtom)\n\n const chaindata = await get(chaindataAtom)\n const networks = chaindata.networks.filter(\n (n) => (enabledNetworkIds?.includes(n.id) || n.isDefault) && (enableTestnets || !n.isTestnet)\n )\n\n const networkById = keyBy(networks, (n) => n.id)\n const tokens = chaindata.tokens.filter(\n (token) =>\n (enabledTokenIds?.includes(token.id) || token.isDefault) && networkById[token.networkId]\n )\n\n return { networks, tokens }\n})\n\nexport const tokensAtom = atom(async (get) => {\n const chaindata = await get(filteredChaindataAtom)\n return chaindata.tokens\n})\n\nexport const networksAtom = atom(async (get) => {\n const chaindata = await get(filteredChaindataAtom)\n return chaindata.networks\n})\n","import {\n ALL_CURRENCY_IDS,\n fetchTokenRates,\n type TokenRatesStorage,\n tryToDeleteOldTokenRatesDb,\n} from \"@talismn/token-rates\"\nimport { isAbortError, isTruthy } from \"@talismn/util\"\nimport { atom } from \"jotai\"\nimport { atomWithObservable } from \"jotai/utils\"\nimport { atomEffect } from \"jotai-effect\"\nimport { keyBy } from \"lodash-es\"\nimport { ReplaySubject } from \"rxjs\"\n\nimport log from \"../log\"\nimport { tokensAtom } from \"./chaindata\"\nimport { coinsApiConfigAtom } from \"./config\"\n\nexport const tokenRatesAtom = atom(async (get) => {\n // runs a timer to keep tokenRates up to date\n get(tokenRatesFetcherAtomEffect)\n\n return (await get(tokenRatesDbAtom)).tokenRates\n})\n\n// TODO: Persist to storage\nconst tokenRates$ = new ReplaySubject<TokenRatesStorage>(1)\n\nconst tokenRatesDbAtom = atomWithObservable(() => {\n tryToDeleteOldTokenRatesDb()\n return tokenRates$.asObservable()\n})\n\nconst tokenRatesFetcherAtomEffect = atomEffect((get) => {\n // lets us tear down the existing timer when the effect is restarted\n const abort = new AbortController()\n\n // we have to get these synchronously so that jotai knows to restart our timer when they change\n const coinsApiConfig = get(coinsApiConfigAtom)\n const tokensPromise = get(tokensAtom)\n\n ;(async () => {\n const tokensById = keyBy(await tokensPromise, \"id\")\n\n const loopMs = 300_000 // 300_000ms = 300s = 5 minutes\n const retryTimeout = 5_000 // 5_000ms = 5 seconds\n\n const hydrate = async () => {\n try {\n if (abort.signal.aborted) return // don't fetch if aborted\n const tokenRates = await fetchTokenRates(tokensById, ALL_CURRENCY_IDS, coinsApiConfig)\n const putTokenRates: TokenRatesStorage = { tokenRates }\n\n if (abort.signal.aborted) return // don't insert into db if aborted\n tokenRates$.next(putTokenRates)\n\n if (abort.signal.aborted) return // don't schedule next loop if aborted\n setTimeout(hydrate, loopMs)\n } catch (error) {\n const retrying = !abort.signal.aborted\n const messageParts = [\n \"Failed to fetch tokenRates\",\n retrying && `retrying in ${Math.round(retryTimeout / 1000)} seconds`,\n !retrying && `giving up (timer no longer needed)`,\n ].filter(isTruthy)\n log.error(messageParts.join(\", \"), error)\n\n if (isAbortError(error)) return // don't schedule retry if aborted\n setTimeout(hydrate, retryTimeout)\n }\n }\n\n // launch the loop\n hydrate()\n })()\n\n return () => abort.abort(\"Unsubscribed\")\n})\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/balances-react\",\n \"version\": \"1.3.3\",\n \"author\": \"Talisman\",\n \"homepage\": \"https://talisman.xyz\",\n \"license\": \"GPL-3.0-or-later\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"directory\": \"packages/balances-react\",\n \"type\": \"git\",\n \"url\": \"https://github.com/TalismanSociety/talisman.git\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist .turbo node_modules\",\n \"build\": \"tsup --silent\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@talismn/balances\": \"workspace:*\",\n \"@talismn/chain-connectors\": \"workspace:*\",\n \"@talismn/chaindata-provider\": \"workspace:*\",\n \"@talismn/connection-meta\": \"workspace:*\",\n \"@talismn/token-rates\": \"workspace:*\",\n \"@talismn/util\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"jotai\": \"~2\",\n \"jotai-effect\": \"~1\",\n \"lodash-es\": \"4.17.21\",\n \"rxjs\": \"^7.8.1\"\n },\n \"devDependencies\": {\n \"@talismn/tsconfig\": \"workspace:*\",\n \"@types/lodash-es\": \"4.17.12\",\n \"@types/react\": \"^18.3.12\",\n \"react\": \"^18.3.1\",\n \"typescript\": \"^5.6.3\"\n },\n \"peerDependencies\": {\n \"@polkadot/util-crypto\": \"*\",\n \"react\": \"*\",\n \"react-dom\": \"*\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.tsx\",\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n }\n }\n}\n","import { cryptoWaitReady } from \"@polkadot/util-crypto\"\nimport { atom } from \"jotai\"\n\nexport const cryptoWaitReadyAtom = atom(async () => await cryptoWaitReady())\n","import type { Balances } from \"@talismn/balances\"\nimport { useAtomValue, useSetAtom } from \"jotai\"\nimport { useEffect, useMemo } from \"react\"\n\nimport { allAddressesAtom } from \"../atoms/allAddresses\"\nimport { balancesAtom } from \"../atoms/balances\"\n\nexport const useSetBalancesAddresses = (addresses: string[]) => {\n const setAllAddresses = useSetAtom(allAddressesAtom)\n useEffect(() => {\n setAllAddresses((a) => (JSON.stringify(a) === JSON.stringify(addresses) ? a : addresses))\n }, [addresses, setAllAddresses])\n}\n\n/**\n * @name useBalances\n * @description Hook to get the current balances state.\n * @param persistBackend an optional BalancesPersistBackend backend to use for persisting the balances state. By default, indexedDB is used.\n * @returns a Balances object containing the current balances state.\n */\n\nexport const useBalances = () => {\n return useAtomValue(balancesAtom)\n}\n\n// TODO: Extract to shared definition between extension and @talismn/balances-react\nexport type BalancesStatus =\n | { status: \"live\" }\n | { status: \"fetching\" }\n | { status: \"stale\"; staleChains: string[] }\n\n/**\n * Given a collection of `Balances`, this hook returns a `BalancesStatus` summary for the collection.\n *\n * @param balances The collection of balances to get the status from.\n * @returns An instance of `BalancesStatus` which represents the status of the balances collection.\n\n */\nexport const useBalancesStatus = (balances: Balances) =>\n useMemo<BalancesStatus>(() => {\n // stale\n const staleChains = getStaleChains(balances)\n if (staleChains.length > 0) return { status: \"stale\", staleChains }\n\n // fetching\n const hasCachedBalances = balances.each.some((b) => b.status === \"cache\")\n if (hasCachedBalances) return { status: \"fetching\" }\n\n // live\n return { status: \"live\" }\n }, [balances])\n\nexport const getStaleChains = (balances: Balances): string[] => [\n ...new Set(\n balances.each\n .filter((b) => b.status === \"stale\")\n .map((b) => b.network?.name ?? b.networkId ?? \"Unknown\")\n ),\n]\n","import { useAtomValue } from \"jotai\"\n\nimport { chainConnectorsAtom } from \"../atoms/chainConnectors\"\n\nexport const useChainConnectors = () => useAtomValue(chainConnectorsAtom)\n","import type { NetworkId, TokenId } from \"@talismn/chaindata-provider\"\nimport { useAtomValue } from \"jotai\"\nimport { keyBy } from \"lodash-es\"\nimport { useMemo } from \"react\"\n\nimport { chaindataAtom } from \"../atoms/chaindata\"\nimport { chaindataProviderAtom } from \"../atoms/chaindataProvider\"\n\nexport const useChaindataProvider = () => useAtomValue(chaindataProviderAtom)\nexport const useChaindata = () => useAtomValue(chaindataAtom)\n\nexport const useNetworks = () => useChaindata().networks\nexport const useNetworksById = () => {\n const { networks } = useChaindata()\n return useMemo(() => keyBy(networks, (n) => n.id), [networks])\n}\nexport const useNetwork = (networkId?: NetworkId) => {\n const networksById = useNetworksById()\n return networksById[networkId ?? \"\"] ?? null\n}\n\nexport const useTokens = () => useChaindata().tokens\nexport const useTokensById = () => {\n const { tokens } = useChaindata()\n return useMemo(() => keyBy(tokens, (t) => t.id), [tokens])\n}\nexport const useToken = (tokenId?: TokenId) => {\n const tokensById = useTokensById()\n return tokensById[tokenId ?? \"\"] ?? null\n}\n","import type { TokenId } from \"@talismn/chaindata-provider\"\nimport { useAtomValue } from \"jotai\"\n\nimport { tokenRatesAtom } from \"../atoms/tokenRates\"\n\nexport const useTokenRates = () => useAtomValue(tokenRatesAtom)\nexport const useTokenRate = (tokenId?: TokenId) => useTokenRates()[tokenId ?? \"\"] ?? undefined\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA,0BAAAA;AAAA,EAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAAC,iBAA2B;AAC3B,IAAAC,gBAA0C;;;ACA1C,yBAA6D;AAC7D,mBAAqB;AAErB,IAAM,8BAA0B,mBAAqB,0CAAuB;AACrE,IAAM,yBAAqB;AAAA,EAChC,CAAC,QAAQ,IAAI,uBAAuB;AAAA,EACpC,CAAC,MAAM,KAAK,YACV,IAAI,yBAAyB;AAAA,IAC3B,QAAQ,QAAQ,UAAU,2CAAwB;AAAA,EACpD,CAAC;AACL;AAEO,IAAM,yBAAqB,mBAAc,KAAK;AAE9C,IAAM,wBAAoB,mBAAiC,MAAS;AACpE,IAAM,wBAAoB,mBAA4B,MAAS;;;ADNtE,IAAAC,6BAOO;;;AEjBP,IAAAC,gBAAqB;AAGd,IAAM,uBAAmB,oBAAe,CAAC,CAAC;;;ACHjD,IAAAC,mBAAyE;AAEzE,IAAAC,gBAAqB;AACrB,IAAAC,uBAA2B;AAC3B,IAAAC,oBAAiC;;;ACJjC,sBAAiC;AACjC,IAAAC,gBAAqB;;;ACArB,8BAAwE;AACxE,6BAAiC;AACjC,IAAAC,gBAAqB;;;ACHrB,gCAAkC;AAClC,IAAAC,gBAA8B;AAC9B,0BAA2B;AAEpB,IAAM,4BAAwB,oBAAwB,MAAM;AACjE,SAAO,IAAI,4CAAkB;AAAA;AAAA,EAE7B,CAAC;AACH,CAAC;AAEM,IAAM,wBAAwB,UAAM,uBAAQ,4BAA4B;AAE/E,IAAM,mCAA+B,gCAAW,CAAC,QAAQ;AACvD,QAAM,oBAAoB,IAAI,qBAAqB;AAGnD,QAAM,eAAe,kBAAkB,UAAU,UAAU;AAG3D,SAAO,MAAM,aAAa,YAAY;AACxC,CAAC;;;ADbM,IAAM,0BAAsB,oBAAsB,CAAC,QAAQ;AAChE,QAAM,oBAAoB,IAAI,qBAAqB;AAEnD,QAAM,YAAY,IAAI,0CAAkB,mBAAmB,uCAAgB;AAC3E,QAAM,MAAM,IAAI,0CAAkB,iBAAiB;AACnD,QAAM,SAAS,IAAI,0CAAkB,iBAAiB;AAEtD,SAAO,EAAE,WAAW,KAAK,OAAO;AAClC,CAAC;;;ADTM,IAAM,2BAAuB,oBAAuB,CAAC,QAAQ;AAClE,SAAO,IAAI;AAAA,IACT,IAAI,qBAAqB;AAAA,IACzB,IAAI,mBAAmB;AAAA;AAAA,EAEzB;AACF,CAAC;;;AGZD,kBAAkC;AAClC,IAAAC,gBAAqB;AACrB,mBAAmC;AACnC,uBAAsB;AACtB,kBAA8B;AAKvB,IAAM,oBAAgB,iCAAmB,CAAC,QAAQ;AACvD,aAAO,2BAAc;AAAA,IACnB,UAAU,IAAI,qBAAqB,EAAE;AAAA,IACrC,QAAQ,IAAI,qBAAqB,EAAE;AAAA,EACrC,CAAC,EAAE,SAAK,+BAAkB,GAAK,CAAC;AAClC,CAAC;AAED,IAAM,4BAAwB,oBAAK,OAAO,QAAQ;AAChD,QAAM,oBAAoB,IAAI,iBAAiB;AAC/C,QAAM,kBAAkB,IAAI,iBAAiB;AAC7C,QAAM,iBAAiB,IAAI,kBAAkB;AAE7C,QAAM,YAAY,MAAM,IAAI,aAAa;AACzC,QAAM,WAAW,UAAU,SAAS;AAAA,IAClC,CAAC,OAAO,mBAAmB,SAAS,EAAE,EAAE,KAAK,EAAE,eAAe,kBAAkB,CAAC,EAAE;AAAA,EACrF;AAEA,QAAM,kBAAc,wBAAM,UAAU,CAAC,MAAM,EAAE,EAAE;AAC/C,QAAM,SAAS,UAAU,OAAO;AAAA,IAC9B,CAAC,WACE,iBAAiB,SAAS,MAAM,EAAE,KAAK,MAAM,cAAc,YAAY,MAAM,SAAS;AAAA,EAC3F;AAEA,SAAO,EAAE,UAAU,OAAO;AAC5B,CAAC;AAEM,IAAM,iBAAa,oBAAK,OAAO,QAAQ;AAC5C,QAAM,YAAY,MAAM,IAAI,qBAAqB;AACjD,SAAO,UAAU;AACnB,CAAC;AAEM,IAAM,mBAAe,oBAAK,OAAO,QAAQ;AAC9C,QAAM,YAAY,MAAM,IAAI,qBAAqB;AACjD,SAAO,UAAU;AACnB,CAAC;;;AC3CD,IAAAC,sBAKO;AACP,IAAAC,eAAuC;AACvC,IAAAC,gBAAqB;AACrB,IAAAC,gBAAmC;AACnC,IAAAC,uBAA2B;AAC3B,IAAAC,oBAAsB;AACtB,IAAAC,eAA8B;;;ACX9B,uBAAsB;;;ACAtB;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,QAAU;AAAA,EACV,UAAY;AAAA,EACZ,SAAW;AAAA,EACX,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,YAAc;AAAA,IACZ,WAAa;AAAA,IACb,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,MAAQ;AAAA,EACR,QAAU;AAAA,EACV,OAAS;AAAA,IACP;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,EACV;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,IACR,OAAS;AAAA,IACT,OAAS;AAAA,IACT,WAAa;AAAA,EACf;AAAA,EACA,cAAgB;AAAA,IACd,qBAAqB;AAAA,IACrB,6BAA6B;AAAA,IAC7B,+BAA+B;AAAA,IAC/B,4BAA4B;AAAA,IAC5B,wBAAwB;AAAA,IACxB,iBAAiB;AAAA,IACjB,WAAa;AAAA,IACb,OAAS;AAAA,IACT,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,MAAQ;AAAA,EACV;AAAA,EACA,iBAAmB;AAAA,IACjB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,gBAAgB;AAAA,IAChB,OAAS;AAAA,IACT,YAAc;AAAA,EAChB;AAAA,EACA,kBAAoB;AAAA,IAClB,yBAAyB;AAAA,IACzB,OAAS;AAAA,IACT,aAAa;AAAA,EACf;AAAA,EACA,OAAS;AAAA,EACT,SAAW;AAAA,IACT,KAAK;AAAA,MACH,mBAAmB;AAAA,MACnB,QAAU;AAAA,QACR,OAAS;AAAA,QACT,SAAW;AAAA,MACb;AAAA,MACA,SAAW;AAAA,QACT,OAAS;AAAA,QACT,SAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AACF;;;AD/DA,IAAO,kBAAQ,iBAAAC,SAAU,gBAAY,IAAI;;;ADalC,IAAM,qBAAiB,oBAAK,OAAO,QAAQ;AAEhD,MAAI,2BAA2B;AAE/B,UAAQ,MAAM,IAAI,gBAAgB,GAAG;AACvC,CAAC;AAGD,IAAM,cAAc,IAAI,2BAAiC,CAAC;AAE1D,IAAM,uBAAmB,kCAAmB,MAAM;AAChD,sDAA2B;AAC3B,SAAO,YAAY,aAAa;AAClC,CAAC;AAED,IAAM,kCAA8B,iCAAW,CAAC,QAAQ;AAEtD,QAAM,QAAQ,IAAI,gBAAgB;AAGlC,QAAM,iBAAiB,IAAI,kBAAkB;AAC7C,QAAM,gBAAgB,IAAI,UAAU;AAEnC,GAAC,YAAY;AACZ,UAAM,iBAAa,yBAAM,MAAM,eAAe,IAAI;AAElD,UAAM,SAAS;AACf,UAAM,eAAe;AAErB,UAAM,UAAU,YAAY;AAC1B,UAAI;AACF,YAAI,MAAM,OAAO,QAAS;AAC1B,cAAM,aAAa,UAAM,qCAAgB,YAAY,sCAAkB,cAAc;AACrF,cAAM,gBAAmC,EAAE,WAAW;AAEtD,YAAI,MAAM,OAAO,QAAS;AAC1B,oBAAY,KAAK,aAAa;AAE9B,YAAI,MAAM,OAAO,QAAS;AAC1B,mBAAW,SAAS,MAAM;AAAA,MAC5B,SAAS,OAAO;AACd,cAAM,WAAW,CAAC,MAAM,OAAO;AAC/B,cAAM,eAAe;AAAA,UACnB;AAAA,UACA,YAAY,eAAe,KAAK,MAAM,eAAe,GAAI,CAAC;AAAA,UAC1D,CAAC,YAAY;AAAA,QACf,EAAE,OAAO,qBAAQ;AACjB,oBAAI,MAAM,aAAa,KAAK,IAAI,GAAG,KAAK;AAExC,gBAAI,2BAAa,KAAK,EAAG;AACzB,mBAAW,SAAS,YAAY;AAAA,MAClC;AAAA,IACF;AAGA,YAAQ;AAAA,EACV,GAAG;AAEH,SAAO,MAAM,MAAM,MAAM,cAAc;AACzC,CAAC;;;ALjED,IAAM,6BAAyB,oBAAK,OAAO,QAA6C;AACtF,QAAM,CAAC,QAAQ,SAAS,IAAI,MAAM,QAAQ,IAAI,CAAC,IAAI,UAAU,GAAG,IAAI,gBAAgB,CAAC,CAAC;AAEtF,aAAO,6BAAU,OAAO,IAAI,CAAC,UAAU,CAAC,MAAM,IAAI,SAAS,CAAC,CAAC;AAC/D,CAAC;AAED,IAAM,sBAAkB,oBAAoB,CAAC,CAAC;AAE9C,IAAM,4BAAwB,iCAAW,CAAC,KAAK,QAAQ;AACrD,QAAM,SAAS,YAAY;AACzB,UAAM,mBAAmB,IAAI,oBAAoB;AACjD,UAAM,qBAAqB,MAAM,IAAI,sBAAsB;AAC3D,UAAM,MAAM,iBAAiB,aAAa,kBAAkB,EAAE,UAAU,CAAC,aAAa;AACpF,UAAI,iBAAiB,SAAS,QAAQ;AAAA,IACxC,CAAC;AAED,WAAO,MAAM;AACX,aAAO,IAAI,YAAY;AAAA,IACzB;AAAA,EACF,GAAG;AAEH,SAAO,MAAM;AACX,UAAM,KAAK,CAAC,gBAAgB,YAAY,CAAC;AAAA,EAC3C;AACF,CAAC;AAED,IAAM,8BAA0B,oBAAK,OAAO,QAA4B;AACtE,QAAM,CAAC,WAAW,UAAU,IAAI,MAAM,QAAQ,IAAI,CAAC,IAAI,aAAa,GAAG,IAAI,cAAc,CAAC,CAAC;AAE3F,QAAM,mBAAe,yBAAM,UAAU,UAAU,IAAI;AACnD,QAAM,iBAAa,yBAAM,UAAU,QAAQ,IAAI;AAE/C,SAAO,EAAE,UAAU,cAAc,QAAQ,YAAY,WAAW;AAClE,CAAC;AAEM,IAAM,mBAAe,oBAAK,OAAO,QAA2B;AAEjE,MAAI,qBAAqB;AAEzB,QAAM,UAAU,MAAM,IAAI,uBAAuB;AACjD,QAAM,cAAc,IAAI,eAAe;AAEvC,SAAO,IAAI,0BAAS,aAAa,OAAO;AAC1C,CAAC;;;AQtDD,yBAAgC;AAChC,IAAAC,gBAAqB;AAEd,IAAM,0BAAsB,oBAAK,YAAY,UAAM,oCAAgB,CAAC;;;ACF3E,IAAAC,iBAAyC;AACzC,mBAAmC;AAK5B,IAAM,0BAA0B,CAAC,cAAwB;AAC9D,QAAM,sBAAkB,2BAAW,gBAAgB;AACnD,8BAAU,MAAM;AACd,oBAAgB,CAAC,MAAO,KAAK,UAAU,CAAC,MAAM,KAAK,UAAU,SAAS,IAAI,IAAI,SAAU;AAAA,EAC1F,GAAG,CAAC,WAAW,eAAe,CAAC;AACjC;AASO,IAAM,cAAc,MAAM;AAC/B,aAAO,6BAAa,YAAY;AAClC;AAeO,IAAM,oBAAoB,CAAC,iBAChC,sBAAwB,MAAM;AAE5B,QAAM,cAAc,eAAe,QAAQ;AAC3C,MAAI,YAAY,SAAS,EAAG,QAAO,EAAE,QAAQ,SAAS,YAAY;AAGlE,QAAM,oBAAoB,SAAS,KAAK,KAAK,CAAC,MAAM,EAAE,WAAW,OAAO;AACxE,MAAI,kBAAmB,QAAO,EAAE,QAAQ,WAAW;AAGnD,SAAO,EAAE,QAAQ,OAAO;AAC1B,GAAG,CAAC,QAAQ,CAAC;AAER,IAAM,iBAAiB,CAAC,aAAiC;AAAA,EAC9D,GAAG,IAAI;AAAA,IACL,SAAS,KACN,OAAO,CAAC,MAAM,EAAE,WAAW,OAAO,EAClC,IAAI,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,aAAa,SAAS;AAAA,EAC3D;AACF;;;AC1DA,IAAAC,iBAA6B;AAItB,IAAM,qBAAqB,UAAM,6BAAa,mBAAmB;;;ACHxE,IAAAC,iBAA6B;AAC7B,IAAAC,oBAAsB;AACtB,IAAAC,gBAAwB;AAKjB,IAAM,uBAAuB,UAAM,6BAAa,qBAAqB;AACrE,IAAM,eAAe,UAAM,6BAAa,aAAa;AAErD,IAAM,cAAc,MAAM,aAAa,EAAE;AACzC,IAAM,kBAAkB,MAAM;AACnC,QAAM,EAAE,SAAS,IAAI,aAAa;AAClC,aAAO,uBAAQ,UAAM,yBAAM,UAAU,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,QAAQ,CAAC;AAC/D;AACO,IAAM,aAAa,CAAC,cAA0B;AACnD,QAAM,eAAe,gBAAgB;AACrC,SAAO,aAAa,aAAa,EAAE,KAAK;AAC1C;AAEO,IAAM,YAAY,MAAM,aAAa,EAAE;AACvC,IAAM,gBAAgB,MAAM;AACjC,QAAM,EAAE,OAAO,IAAI,aAAa;AAChC,aAAO,uBAAQ,UAAM,yBAAM,QAAQ,CAAC,MAAM,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC;AAC3D;AACO,IAAM,WAAW,CAAC,YAAsB;AAC7C,QAAM,aAAa,cAAc;AACjC,SAAO,WAAW,WAAW,EAAE,KAAK;AACtC;;;AC5BA,IAAAC,iBAA6B;AAItB,IAAM,gBAAgB,UAAM,6BAAa,cAAc;AACvD,IAAM,eAAe,CAAC,YAAsB,cAAc,EAAE,WAAW,EAAE,KAAK;;;AfiH5E;AA7BF,IAAMC,oBAAmB,CAAC;AAAA,EAC/B;AAAA,EAEA;AAAA,EACA;AAAA,EACA;AAAA,EAEA;AACF,MAAsB;AACpB,QAAM,wBAAoB,2BAAW,kBAAkB;AACvD,+BAAU,MAAM;AACd,sBAAkB,EAAE,QAAQ,YAAY,CAAC;AAAA,EAC3C,GAAG,CAAC,aAAa,iBAAiB,CAAC;AAEnC,QAAM,wBAAoB,2BAAW,kBAAkB;AACvD,+BAAU,MAAM;AACd,sBAAkB,gBAAgB,KAAK;AAAA,EACzC,GAAG,CAAC,mBAAmB,YAAY,CAAC;AAEpC,QAAM,uBAAmB,2BAAW,iBAAiB;AACrD,+BAAU,MAAM;AACd,qBAAiB,aAAa;AAAA,EAChC,GAAG,CAAC,eAAe,gBAAgB,CAAC;AAEpC,QAAM,uBAAmB,2BAAW,iBAAiB;AACrD,+BAAU,MAAM;AACd,qBAAiB,aAAa;AAAA,EAChC,GAAG,CAAC,eAAe,gBAAgB,CAAC;AAEpC,SAAO,2EAAG,UAAS;AACrB;","names":["BalancesProvider","import_jotai","import_react","import_chaindata_provider","import_jotai","import_balances","import_jotai","import_jotai_effect","import_lodash_es","import_jotai","import_jotai","import_jotai","import_jotai","import_token_rates","import_util","import_jotai","import_utils","import_jotai_effect","import_lodash_es","import_rxjs","anylogger","import_jotai","import_jotai","import_jotai","import_jotai","import_lodash_es","import_react","import_jotai","BalancesProvider"]}
|
package/dist/index.mjs
CHANGED
|
@@ -133,7 +133,7 @@ import anylogger from "anylogger";
|
|
|
133
133
|
// package.json
|
|
134
134
|
var package_default = {
|
|
135
135
|
name: "@talismn/balances-react",
|
|
136
|
-
version: "1.3.
|
|
136
|
+
version: "1.3.3",
|
|
137
137
|
author: "Talisman",
|
|
138
138
|
homepage: "https://talisman.xyz",
|
|
139
139
|
license: "GPL-3.0-or-later",
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.tsx","../src/atoms/config.ts","../src/atoms/allAddresses.ts","../src/atoms/balances.ts","../src/atoms/balancesProvider.ts","../src/atoms/chainConnectors.ts","../src/atoms/chaindataProvider.ts","../src/atoms/chaindata.ts","../src/atoms/tokenRates.ts","../src/log.ts","../package.json","../src/atoms/cryptoWaitReady.ts","../src/hooks/useBalances.ts","../src/hooks/useChainConnectors.ts","../src/hooks/useChaindata.ts","../src/hooks/useTokenRates.ts"],"sourcesContent":["import { useSetAtom } from \"jotai\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n coinsApiConfigAtom,\n enabledChainsAtom,\n enabledTokensAtom,\n enableTestnetsAtom,\n} from \"./atoms/config\"\n\nexport {\n evmErc20TokenId,\n evmNativeTokenId,\n subAssetTokenId,\n subNativeTokenId,\n subPsp22TokenId,\n subTokensTokenId,\n} from \"@talismn/chaindata-provider\"\nexport * from \"./atoms/allAddresses\"\n// export * from \"./atoms/balanceModules\"\nexport * from \"./atoms/balances\"\nexport * from \"./atoms/chainConnectors\"\nexport * from \"./atoms/chaindata\"\nexport * from \"./atoms/chaindataProvider\"\nexport * from \"./atoms/config\"\nexport * from \"./atoms/cryptoWaitReady\"\nexport * from \"./atoms/tokenRates\"\nexport * from \"./hooks/useBalances\"\nexport * from \"./hooks/useChainConnectors\"\nexport * from \"./hooks/useChaindata\"\nexport * from \"./hooks/useTokenRates\"\n\nexport type BalancesConfig = {\n coinsApiUrl?: string\n\n /** Enables balances fetching for tokens on testnet chains. */\n withTestnets?: boolean\n\n /**\n * A list of chain genesisHashes to fetch balances for.\n *\n * If undefined, balances will be fetched for all chains.\n *\n * Only applies to built-in chains, custom chains will always fetch balances.\n *\n * NOTE: This is an allowlist to enable the dapp to disable balances for chains it does not care about.\n * Adding a chain here which is not already supported by the library will not automagically begin to fetch balances.\n * It will just be ignored.\n *\n * In a similar vein, if you add testnets here then make sure you've also set the `useTestnets` prop to `true`.\n *\n * @example\n * enabledChains={[\n * // polkadot\n * \"0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3\",\n * // kusama\n * \"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe\",\n * // rococo\n * \"0x6408de7737c59c238890533af25896a2c20608d8b380bb01029acb392781063e\",\n * // westend\n * \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n * ]}\n */\n enabledChains?: string[]\n\n /**\n * A list of token ids to fetch balances for.\n *\n * If undefined, balances will be fetched for all tokens.\n *\n * If `enabledChains` is also defined, both filters will be applied,\n * such that only the intersection of enabledChains and enabledTokens will be fetched.\n *\n * @example\n * enabledTokens={[\n * // DOT (polkadot relay chain)\n * \"polkadot-substrate-native\",\n * // USDC (polkadot asset hub)\n * \"polkadot-asset-hub-substrate-assets-1337-usdc\",\n * // ETH (ethereum mainnet)\n * \"1-evm-native\",\n * // GM (gm chain)\n * \"gm-substrate-tokens-gm\",\n * ]}\n */\n enabledTokens?: string[]\n\n children?: ReactNode\n}\n\nexport const BalancesProvider = ({\n coinsApiUrl,\n\n withTestnets,\n enabledChains,\n enabledTokens,\n\n children,\n}: BalancesConfig) => {\n const setCoinsApiConfig = useSetAtom(coinsApiConfigAtom)\n useEffect(() => {\n setCoinsApiConfig({ apiUrl: coinsApiUrl })\n }, [coinsApiUrl, setCoinsApiConfig])\n\n const setEnableTestnets = useSetAtom(enableTestnetsAtom)\n useEffect(() => {\n setEnableTestnets(withTestnets ?? false)\n }, [setEnableTestnets, withTestnets])\n\n const setEnabledChains = useSetAtom(enabledChainsAtom)\n useEffect(() => {\n setEnabledChains(enabledChains)\n }, [enabledChains, setEnabledChains])\n\n const setEnabledTokens = useSetAtom(enabledTokensAtom)\n useEffect(() => {\n setEnabledTokens(enabledTokens)\n }, [enabledTokens, setEnabledTokens])\n\n return <>{children}</>\n}\n","import type { DotNetworkId, TokenId } from \"@talismn/chaindata-provider\"\nimport { type CoinsApiConfig, DEFAULT_COINSAPI_CONFIG } from \"@talismn/token-rates\"\nimport { atom } from \"jotai\"\n\nconst innerCoinsApiConfigAtom = atom<CoinsApiConfig>(DEFAULT_COINSAPI_CONFIG)\nexport const coinsApiConfigAtom = atom<CoinsApiConfig, [Partial<CoinsApiConfig>], void>(\n (get) => get(innerCoinsApiConfigAtom),\n (_get, set, options) =>\n set(innerCoinsApiConfigAtom, {\n apiUrl: options.apiUrl ?? DEFAULT_COINSAPI_CONFIG.apiUrl,\n })\n)\n\nexport const enableTestnetsAtom = atom<boolean>(false)\n\nexport const enabledChainsAtom = atom<DotNetworkId[] | undefined>(undefined)\nexport const enabledTokensAtom = atom<TokenId[] | undefined>(undefined)\n","import { atom } from \"jotai\"\n\n/** Sets the list of addresses for which token balances will be fetched by the balances subscription */\nexport const allAddressesAtom = atom<string[]>([])\n","import { type Address, type BalanceJson, Balances, type HydrateDb } from \"@talismn/balances\"\nimport type { TokenId } from \"@talismn/chaindata-provider\"\nimport { atom } from \"jotai\"\nimport { atomEffect } from \"jotai-effect\"\nimport { fromPairs, keyBy } from \"lodash-es\"\n\nimport { allAddressesAtom } from \"./allAddresses\"\nimport { balancesProviderAtom } from \"./balancesProvider\"\nimport { chaindataAtom, tokensAtom } from \"./chaindata\"\nimport { tokenRatesAtom } from \"./tokenRates\"\n\nconst addressesByTokenIdAtom = atom(async (get): Promise<Record<TokenId, Address[]>> => {\n const [tokens, addresses] = await Promise.all([get(tokensAtom), get(allAddressesAtom)])\n\n return fromPairs(tokens.map((token) => [token.id, addresses]))\n})\n\nconst rawBalancesAtom = atom<BalanceJson[]>([])\n\nconst subscribeBalancesAtom = atomEffect((get, set) => {\n const unsub = (async () => {\n const balancesProvider = get(balancesProviderAtom)\n const addressesByTokenId = await get(addressesByTokenIdAtom)\n const sub = balancesProvider.getBalances$(addressesByTokenId).subscribe((balances) => {\n set(rawBalancesAtom, balances.balances)\n })\n\n return () => {\n return sub.unsubscribe()\n }\n })()\n\n return () => {\n unsub.then((unsubscribe) => unsubscribe())\n }\n})\n\nconst balancesHydrateDataAtom = atom(async (get): Promise<HydrateDb> => {\n const [chaindata, tokenRates] = await Promise.all([get(chaindataAtom), get(tokenRatesAtom)])\n\n const networksById = keyBy(chaindata.networks, \"id\")\n const tokensById = keyBy(chaindata.tokens, \"id\")\n\n return { networks: networksById, tokens: tokensById, tokenRates }\n})\n\nexport const balancesAtom = atom(async (get): Promise<Balances> => {\n // subscribe to balancesProvider getBalance with addressesByTokenIdAtom as param\n get(subscribeBalancesAtom)\n\n const hydrate = await get(balancesHydrateDataAtom)\n const rawBalances = get(rawBalancesAtom)\n\n return new Balances(rawBalances, hydrate)\n})\n","import { BalancesProvider } from \"@talismn/balances\"\nimport { atom } from \"jotai\"\n\nimport { chainConnectorsAtom } from \"./chainConnectors\"\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\n\nexport const balancesProviderAtom = atom<BalancesProvider>((get) => {\n return new BalancesProvider(\n get(chaindataProviderAtom),\n get(chainConnectorsAtom)\n // TODO pass storage\n )\n})\n","import type { ChainConnectors } from \"@talismn/balances\"\nimport { ChainConnectorDot, ChainConnectorEth, ChainConnectorSol } from \"@talismn/chain-connectors\"\nimport { connectionMetaDb } from \"@talismn/connection-meta\"\nimport { atom } from \"jotai\"\n\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\n\nexport const chainConnectorsAtom = atom<ChainConnectors>((get) => {\n const chaindataProvider = get(chaindataProviderAtom)\n\n const substrate = new ChainConnectorDot(chaindataProvider, connectionMetaDb)\n const evm = new ChainConnectorEth(chaindataProvider)\n const solana = new ChainConnectorSol(chaindataProvider)\n\n return { substrate, evm, solana }\n})\n","import { ChaindataProvider } from \"@talismn/chaindata-provider\"\nimport { atom, useAtom } from \"jotai\"\nimport { atomEffect } from \"jotai-effect\"\n\nexport const chaindataProviderAtom = atom<ChaindataProvider>(() => {\n return new ChaindataProvider({\n // TODO pass persistedStorage\n })\n})\n\nexport const useSyncSwapsChaindata = () => useAtom(syncSwapsChaindataAtomEffect)\n\nconst syncSwapsChaindataAtomEffect = atomEffect((get) => {\n const chaindataProvider = get(chaindataProviderAtom)\n\n // keep subscription open when swaps modal is open\n const subscription = chaindataProvider.networks$.subscribe()\n\n // close susbcription when swaps modal closes\n return () => subscription.unsubscribe()\n})\n","import { firstThenDebounce } from \"@talismn/util\"\nimport { atom } from \"jotai\"\nimport { atomWithObservable } from \"jotai/utils\"\nimport { keyBy } from \"lodash-es\"\nimport { combineLatest } from \"rxjs\"\n\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\nimport { enabledChainsAtom, enabledTokensAtom, enableTestnetsAtom } from \"./config\"\n\nexport const chaindataAtom = atomWithObservable((get) => {\n return combineLatest({\n networks: get(chaindataProviderAtom).networks$,\n tokens: get(chaindataProviderAtom).tokens$,\n }).pipe(firstThenDebounce(1_000))\n})\n\nconst filteredChaindataAtom = atom(async (get) => {\n const enabledNetworkIds = get(enabledChainsAtom)\n const enabledTokenIds = get(enabledTokensAtom)\n const enableTestnets = get(enableTestnetsAtom)\n\n const chaindata = await get(chaindataAtom)\n const networks = chaindata.networks.filter(\n (n) => (enabledNetworkIds?.includes(n.id) || n.isDefault) && (enableTestnets || !n.isTestnet)\n )\n\n const networkById = keyBy(networks, (n) => n.id)\n const tokens = chaindata.tokens.filter(\n (token) =>\n (enabledTokenIds?.includes(token.id) || token.isDefault) && networkById[token.networkId]\n )\n\n return { networks, tokens }\n})\n\nexport const tokensAtom = atom(async (get) => {\n const chaindata = await get(filteredChaindataAtom)\n return chaindata.tokens\n})\n\nexport const networksAtom = atom(async (get) => {\n const chaindata = await get(filteredChaindataAtom)\n return chaindata.networks\n})\n","import {\n ALL_CURRENCY_IDS,\n fetchTokenRates,\n type TokenRatesStorage,\n tryToDeleteOldTokenRatesDb,\n} from \"@talismn/token-rates\"\nimport { isAbortError, isTruthy } from \"@talismn/util\"\nimport { atom } from \"jotai\"\nimport { atomWithObservable } from \"jotai/utils\"\nimport { atomEffect } from \"jotai-effect\"\nimport { keyBy } from \"lodash-es\"\nimport { ReplaySubject } from \"rxjs\"\n\nimport log from \"../log\"\nimport { tokensAtom } from \"./chaindata\"\nimport { coinsApiConfigAtom } from \"./config\"\n\nexport const tokenRatesAtom = atom(async (get) => {\n // runs a timer to keep tokenRates up to date\n get(tokenRatesFetcherAtomEffect)\n\n return (await get(tokenRatesDbAtom)).tokenRates\n})\n\n// TODO: Persist to storage\nconst tokenRates$ = new ReplaySubject<TokenRatesStorage>(1)\n\nconst tokenRatesDbAtom = atomWithObservable(() => {\n tryToDeleteOldTokenRatesDb()\n return tokenRates$.asObservable()\n})\n\nconst tokenRatesFetcherAtomEffect = atomEffect((get) => {\n // lets us tear down the existing timer when the effect is restarted\n const abort = new AbortController()\n\n // we have to get these synchronously so that jotai knows to restart our timer when they change\n const coinsApiConfig = get(coinsApiConfigAtom)\n const tokensPromise = get(tokensAtom)\n\n ;(async () => {\n const tokensById = keyBy(await tokensPromise, \"id\")\n\n const loopMs = 300_000 // 300_000ms = 300s = 5 minutes\n const retryTimeout = 5_000 // 5_000ms = 5 seconds\n\n const hydrate = async () => {\n try {\n if (abort.signal.aborted) return // don't fetch if aborted\n const tokenRates = await fetchTokenRates(tokensById, ALL_CURRENCY_IDS, coinsApiConfig)\n const putTokenRates: TokenRatesStorage = { tokenRates }\n\n if (abort.signal.aborted) return // don't insert into db if aborted\n tokenRates$.next(putTokenRates)\n\n if (abort.signal.aborted) return // don't schedule next loop if aborted\n setTimeout(hydrate, loopMs)\n } catch (error) {\n const retrying = !abort.signal.aborted\n const messageParts = [\n \"Failed to fetch tokenRates\",\n retrying && `retrying in ${Math.round(retryTimeout / 1000)} seconds`,\n !retrying && `giving up (timer no longer needed)`,\n ].filter(isTruthy)\n log.error(messageParts.join(\", \"), error)\n\n if (isAbortError(error)) return // don't schedule retry if aborted\n setTimeout(hydrate, retryTimeout)\n }\n }\n\n // launch the loop\n hydrate()\n })()\n\n return () => abort.abort(\"Unsubscribed\")\n})\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/balances-react\",\n \"version\": \"1.3.2\",\n \"author\": \"Talisman\",\n \"homepage\": \"https://talisman.xyz\",\n \"license\": \"GPL-3.0-or-later\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"directory\": \"packages/balances-react\",\n \"type\": \"git\",\n \"url\": \"https://github.com/TalismanSociety/talisman.git\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist .turbo node_modules\",\n \"build\": \"tsup --silent\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@talismn/balances\": \"workspace:*\",\n \"@talismn/chain-connectors\": \"workspace:*\",\n \"@talismn/chaindata-provider\": \"workspace:*\",\n \"@talismn/connection-meta\": \"workspace:*\",\n \"@talismn/token-rates\": \"workspace:*\",\n \"@talismn/util\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"jotai\": \"~2\",\n \"jotai-effect\": \"~1\",\n \"lodash-es\": \"4.17.21\",\n \"rxjs\": \"^7.8.1\"\n },\n \"devDependencies\": {\n \"@talismn/tsconfig\": \"workspace:*\",\n \"@types/lodash-es\": \"4.17.12\",\n \"@types/react\": \"^18.3.12\",\n \"react\": \"^18.3.1\",\n \"typescript\": \"^5.6.3\"\n },\n \"peerDependencies\": {\n \"@polkadot/util-crypto\": \"*\",\n \"react\": \"*\",\n \"react-dom\": \"*\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.tsx\",\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n }\n }\n}\n","import { cryptoWaitReady } from \"@polkadot/util-crypto\"\nimport { atom } from \"jotai\"\n\nexport const cryptoWaitReadyAtom = atom(async () => await cryptoWaitReady())\n","import type { Balances } from \"@talismn/balances\"\nimport { useAtomValue, useSetAtom } from \"jotai\"\nimport { useEffect, useMemo } from \"react\"\n\nimport { allAddressesAtom } from \"../atoms/allAddresses\"\nimport { balancesAtom } from \"../atoms/balances\"\n\nexport const useSetBalancesAddresses = (addresses: string[]) => {\n const setAllAddresses = useSetAtom(allAddressesAtom)\n useEffect(() => {\n setAllAddresses((a) => (JSON.stringify(a) === JSON.stringify(addresses) ? a : addresses))\n }, [addresses, setAllAddresses])\n}\n\n/**\n * @name useBalances\n * @description Hook to get the current balances state.\n * @param persistBackend an optional BalancesPersistBackend backend to use for persisting the balances state. By default, indexedDB is used.\n * @returns a Balances object containing the current balances state.\n */\n\nexport const useBalances = () => {\n return useAtomValue(balancesAtom)\n}\n\n// TODO: Extract to shared definition between extension and @talismn/balances-react\nexport type BalancesStatus =\n | { status: \"live\" }\n | { status: \"fetching\" }\n | { status: \"stale\"; staleChains: string[] }\n\n/**\n * Given a collection of `Balances`, this hook returns a `BalancesStatus` summary for the collection.\n *\n * @param balances The collection of balances to get the status from.\n * @returns An instance of `BalancesStatus` which represents the status of the balances collection.\n\n */\nexport const useBalancesStatus = (balances: Balances) =>\n useMemo<BalancesStatus>(() => {\n // stale\n const staleChains = getStaleChains(balances)\n if (staleChains.length > 0) return { status: \"stale\", staleChains }\n\n // fetching\n const hasCachedBalances = balances.each.some((b) => b.status === \"cache\")\n if (hasCachedBalances) return { status: \"fetching\" }\n\n // live\n return { status: \"live\" }\n }, [balances])\n\nexport const getStaleChains = (balances: Balances): string[] => [\n ...new Set(\n balances.each\n .filter((b) => b.status === \"stale\")\n .map((b) => b.network?.name ?? b.networkId ?? \"Unknown\")\n ),\n]\n","import { useAtomValue } from \"jotai\"\n\nimport { chainConnectorsAtom } from \"../atoms/chainConnectors\"\n\nexport const useChainConnectors = () => useAtomValue(chainConnectorsAtom)\n","import type { NetworkId, TokenId } from \"@talismn/chaindata-provider\"\nimport { useAtomValue } from \"jotai\"\nimport { keyBy } from \"lodash-es\"\nimport { useMemo } from \"react\"\n\nimport { chaindataAtom } from \"../atoms/chaindata\"\nimport { chaindataProviderAtom } from \"../atoms/chaindataProvider\"\n\nexport const useChaindataProvider = () => useAtomValue(chaindataProviderAtom)\nexport const useChaindata = () => useAtomValue(chaindataAtom)\n\nexport const useNetworks = () => useChaindata().networks\nexport const useNetworksById = () => {\n const { networks } = useChaindata()\n return useMemo(() => keyBy(networks, (n) => n.id), [networks])\n}\nexport const useNetwork = (networkId?: NetworkId) => {\n const networksById = useNetworksById()\n return networksById[networkId ?? \"\"] ?? null\n}\n\nexport const useTokens = () => useChaindata().tokens\nexport const useTokensById = () => {\n const { tokens } = useChaindata()\n return useMemo(() => keyBy(tokens, (t) => t.id), [tokens])\n}\nexport const useToken = (tokenId?: TokenId) => {\n const tokensById = useTokensById()\n return tokensById[tokenId ?? \"\"] ?? null\n}\n","import type { TokenId } from \"@talismn/chaindata-provider\"\nimport { useAtomValue } from \"jotai\"\n\nimport { tokenRatesAtom } from \"../atoms/tokenRates\"\n\nexport const useTokenRates = () => useAtomValue(tokenRatesAtom)\nexport const useTokenRate = (tokenId?: TokenId) => useTokenRates()[tokenId ?? \"\"] ?? undefined\n"],"mappings":"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","names":["useSetAtom","useEffect","atom","atom","atomEffect","keyBy","atom","atom","atom","atom","atom","atom","atom","atom","atomWithObservable","atomEffect","keyBy","atom","atomWithObservable","atomEffect","keyBy","atom","atomEffect","keyBy","atom","useAtomValue","useAtomValue","useAtomValue","keyBy","useMemo","useAtomValue","useMemo","keyBy","useAtomValue","useAtomValue","BalancesProvider","useSetAtom","useEffect"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.tsx","../src/atoms/config.ts","../src/atoms/allAddresses.ts","../src/atoms/balances.ts","../src/atoms/balancesProvider.ts","../src/atoms/chainConnectors.ts","../src/atoms/chaindataProvider.ts","../src/atoms/chaindata.ts","../src/atoms/tokenRates.ts","../src/log.ts","../package.json","../src/atoms/cryptoWaitReady.ts","../src/hooks/useBalances.ts","../src/hooks/useChainConnectors.ts","../src/hooks/useChaindata.ts","../src/hooks/useTokenRates.ts"],"sourcesContent":["import { useSetAtom } from \"jotai\"\nimport { type ReactNode, useEffect } from \"react\"\n\nimport {\n coinsApiConfigAtom,\n enabledChainsAtom,\n enabledTokensAtom,\n enableTestnetsAtom,\n} from \"./atoms/config\"\n\nexport {\n evmErc20TokenId,\n evmNativeTokenId,\n subAssetTokenId,\n subNativeTokenId,\n subPsp22TokenId,\n subTokensTokenId,\n} from \"@talismn/chaindata-provider\"\nexport * from \"./atoms/allAddresses\"\n// export * from \"./atoms/balanceModules\"\nexport * from \"./atoms/balances\"\nexport * from \"./atoms/chainConnectors\"\nexport * from \"./atoms/chaindata\"\nexport * from \"./atoms/chaindataProvider\"\nexport * from \"./atoms/config\"\nexport * from \"./atoms/cryptoWaitReady\"\nexport * from \"./atoms/tokenRates\"\nexport * from \"./hooks/useBalances\"\nexport * from \"./hooks/useChainConnectors\"\nexport * from \"./hooks/useChaindata\"\nexport * from \"./hooks/useTokenRates\"\n\nexport type BalancesConfig = {\n coinsApiUrl?: string\n\n /** Enables balances fetching for tokens on testnet chains. */\n withTestnets?: boolean\n\n /**\n * A list of chain genesisHashes to fetch balances for.\n *\n * If undefined, balances will be fetched for all chains.\n *\n * Only applies to built-in chains, custom chains will always fetch balances.\n *\n * NOTE: This is an allowlist to enable the dapp to disable balances for chains it does not care about.\n * Adding a chain here which is not already supported by the library will not automagically begin to fetch balances.\n * It will just be ignored.\n *\n * In a similar vein, if you add testnets here then make sure you've also set the `useTestnets` prop to `true`.\n *\n * @example\n * enabledChains={[\n * // polkadot\n * \"0x91b171bb158e2d3848fa23a9f1c25182fb8e20313b2c1eb49219da7a70ce90c3\",\n * // kusama\n * \"0xb0a8d493285c2df73290dfb7e61f870f17b41801197a149ca93654499ea3dafe\",\n * // rococo\n * \"0x6408de7737c59c238890533af25896a2c20608d8b380bb01029acb392781063e\",\n * // westend\n * \"0xe143f23803ac50e8f6f8e62695d1ce9e4e1d68aa36c1cd2cfd15340213f3423e\",\n * ]}\n */\n enabledChains?: string[]\n\n /**\n * A list of token ids to fetch balances for.\n *\n * If undefined, balances will be fetched for all tokens.\n *\n * If `enabledChains` is also defined, both filters will be applied,\n * such that only the intersection of enabledChains and enabledTokens will be fetched.\n *\n * @example\n * enabledTokens={[\n * // DOT (polkadot relay chain)\n * \"polkadot-substrate-native\",\n * // USDC (polkadot asset hub)\n * \"polkadot-asset-hub-substrate-assets-1337-usdc\",\n * // ETH (ethereum mainnet)\n * \"1-evm-native\",\n * // GM (gm chain)\n * \"gm-substrate-tokens-gm\",\n * ]}\n */\n enabledTokens?: string[]\n\n children?: ReactNode\n}\n\nexport const BalancesProvider = ({\n coinsApiUrl,\n\n withTestnets,\n enabledChains,\n enabledTokens,\n\n children,\n}: BalancesConfig) => {\n const setCoinsApiConfig = useSetAtom(coinsApiConfigAtom)\n useEffect(() => {\n setCoinsApiConfig({ apiUrl: coinsApiUrl })\n }, [coinsApiUrl, setCoinsApiConfig])\n\n const setEnableTestnets = useSetAtom(enableTestnetsAtom)\n useEffect(() => {\n setEnableTestnets(withTestnets ?? false)\n }, [setEnableTestnets, withTestnets])\n\n const setEnabledChains = useSetAtom(enabledChainsAtom)\n useEffect(() => {\n setEnabledChains(enabledChains)\n }, [enabledChains, setEnabledChains])\n\n const setEnabledTokens = useSetAtom(enabledTokensAtom)\n useEffect(() => {\n setEnabledTokens(enabledTokens)\n }, [enabledTokens, setEnabledTokens])\n\n return <>{children}</>\n}\n","import type { DotNetworkId, TokenId } from \"@talismn/chaindata-provider\"\nimport { type CoinsApiConfig, DEFAULT_COINSAPI_CONFIG } from \"@talismn/token-rates\"\nimport { atom } from \"jotai\"\n\nconst innerCoinsApiConfigAtom = atom<CoinsApiConfig>(DEFAULT_COINSAPI_CONFIG)\nexport const coinsApiConfigAtom = atom<CoinsApiConfig, [Partial<CoinsApiConfig>], void>(\n (get) => get(innerCoinsApiConfigAtom),\n (_get, set, options) =>\n set(innerCoinsApiConfigAtom, {\n apiUrl: options.apiUrl ?? DEFAULT_COINSAPI_CONFIG.apiUrl,\n })\n)\n\nexport const enableTestnetsAtom = atom<boolean>(false)\n\nexport const enabledChainsAtom = atom<DotNetworkId[] | undefined>(undefined)\nexport const enabledTokensAtom = atom<TokenId[] | undefined>(undefined)\n","import { atom } from \"jotai\"\n\n/** Sets the list of addresses for which token balances will be fetched by the balances subscription */\nexport const allAddressesAtom = atom<string[]>([])\n","import { type Address, type BalanceJson, Balances, type HydrateDb } from \"@talismn/balances\"\nimport type { TokenId } from \"@talismn/chaindata-provider\"\nimport { atom } from \"jotai\"\nimport { atomEffect } from \"jotai-effect\"\nimport { fromPairs, keyBy } from \"lodash-es\"\n\nimport { allAddressesAtom } from \"./allAddresses\"\nimport { balancesProviderAtom } from \"./balancesProvider\"\nimport { chaindataAtom, tokensAtom } from \"./chaindata\"\nimport { tokenRatesAtom } from \"./tokenRates\"\n\nconst addressesByTokenIdAtom = atom(async (get): Promise<Record<TokenId, Address[]>> => {\n const [tokens, addresses] = await Promise.all([get(tokensAtom), get(allAddressesAtom)])\n\n return fromPairs(tokens.map((token) => [token.id, addresses]))\n})\n\nconst rawBalancesAtom = atom<BalanceJson[]>([])\n\nconst subscribeBalancesAtom = atomEffect((get, set) => {\n const unsub = (async () => {\n const balancesProvider = get(balancesProviderAtom)\n const addressesByTokenId = await get(addressesByTokenIdAtom)\n const sub = balancesProvider.getBalances$(addressesByTokenId).subscribe((balances) => {\n set(rawBalancesAtom, balances.balances)\n })\n\n return () => {\n return sub.unsubscribe()\n }\n })()\n\n return () => {\n unsub.then((unsubscribe) => unsubscribe())\n }\n})\n\nconst balancesHydrateDataAtom = atom(async (get): Promise<HydrateDb> => {\n const [chaindata, tokenRates] = await Promise.all([get(chaindataAtom), get(tokenRatesAtom)])\n\n const networksById = keyBy(chaindata.networks, \"id\")\n const tokensById = keyBy(chaindata.tokens, \"id\")\n\n return { networks: networksById, tokens: tokensById, tokenRates }\n})\n\nexport const balancesAtom = atom(async (get): Promise<Balances> => {\n // subscribe to balancesProvider getBalance with addressesByTokenIdAtom as param\n get(subscribeBalancesAtom)\n\n const hydrate = await get(balancesHydrateDataAtom)\n const rawBalances = get(rawBalancesAtom)\n\n return new Balances(rawBalances, hydrate)\n})\n","import { BalancesProvider } from \"@talismn/balances\"\nimport { atom } from \"jotai\"\n\nimport { chainConnectorsAtom } from \"./chainConnectors\"\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\n\nexport const balancesProviderAtom = atom<BalancesProvider>((get) => {\n return new BalancesProvider(\n get(chaindataProviderAtom),\n get(chainConnectorsAtom)\n // TODO pass storage\n )\n})\n","import type { ChainConnectors } from \"@talismn/balances\"\nimport { ChainConnectorDot, ChainConnectorEth, ChainConnectorSol } from \"@talismn/chain-connectors\"\nimport { connectionMetaDb } from \"@talismn/connection-meta\"\nimport { atom } from \"jotai\"\n\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\n\nexport const chainConnectorsAtom = atom<ChainConnectors>((get) => {\n const chaindataProvider = get(chaindataProviderAtom)\n\n const substrate = new ChainConnectorDot(chaindataProvider, connectionMetaDb)\n const evm = new ChainConnectorEth(chaindataProvider)\n const solana = new ChainConnectorSol(chaindataProvider)\n\n return { substrate, evm, solana }\n})\n","import { ChaindataProvider } from \"@talismn/chaindata-provider\"\nimport { atom, useAtom } from \"jotai\"\nimport { atomEffect } from \"jotai-effect\"\n\nexport const chaindataProviderAtom = atom<ChaindataProvider>(() => {\n return new ChaindataProvider({\n // TODO pass persistedStorage\n })\n})\n\nexport const useSyncSwapsChaindata = () => useAtom(syncSwapsChaindataAtomEffect)\n\nconst syncSwapsChaindataAtomEffect = atomEffect((get) => {\n const chaindataProvider = get(chaindataProviderAtom)\n\n // keep subscription open when swaps modal is open\n const subscription = chaindataProvider.networks$.subscribe()\n\n // close susbcription when swaps modal closes\n return () => subscription.unsubscribe()\n})\n","import { firstThenDebounce } from \"@talismn/util\"\nimport { atom } from \"jotai\"\nimport { atomWithObservable } from \"jotai/utils\"\nimport { keyBy } from \"lodash-es\"\nimport { combineLatest } from \"rxjs\"\n\nimport { chaindataProviderAtom } from \"./chaindataProvider\"\nimport { enabledChainsAtom, enabledTokensAtom, enableTestnetsAtom } from \"./config\"\n\nexport const chaindataAtom = atomWithObservable((get) => {\n return combineLatest({\n networks: get(chaindataProviderAtom).networks$,\n tokens: get(chaindataProviderAtom).tokens$,\n }).pipe(firstThenDebounce(1_000))\n})\n\nconst filteredChaindataAtom = atom(async (get) => {\n const enabledNetworkIds = get(enabledChainsAtom)\n const enabledTokenIds = get(enabledTokensAtom)\n const enableTestnets = get(enableTestnetsAtom)\n\n const chaindata = await get(chaindataAtom)\n const networks = chaindata.networks.filter(\n (n) => (enabledNetworkIds?.includes(n.id) || n.isDefault) && (enableTestnets || !n.isTestnet)\n )\n\n const networkById = keyBy(networks, (n) => n.id)\n const tokens = chaindata.tokens.filter(\n (token) =>\n (enabledTokenIds?.includes(token.id) || token.isDefault) && networkById[token.networkId]\n )\n\n return { networks, tokens }\n})\n\nexport const tokensAtom = atom(async (get) => {\n const chaindata = await get(filteredChaindataAtom)\n return chaindata.tokens\n})\n\nexport const networksAtom = atom(async (get) => {\n const chaindata = await get(filteredChaindataAtom)\n return chaindata.networks\n})\n","import {\n ALL_CURRENCY_IDS,\n fetchTokenRates,\n type TokenRatesStorage,\n tryToDeleteOldTokenRatesDb,\n} from \"@talismn/token-rates\"\nimport { isAbortError, isTruthy } from \"@talismn/util\"\nimport { atom } from \"jotai\"\nimport { atomWithObservable } from \"jotai/utils\"\nimport { atomEffect } from \"jotai-effect\"\nimport { keyBy } from \"lodash-es\"\nimport { ReplaySubject } from \"rxjs\"\n\nimport log from \"../log\"\nimport { tokensAtom } from \"./chaindata\"\nimport { coinsApiConfigAtom } from \"./config\"\n\nexport const tokenRatesAtom = atom(async (get) => {\n // runs a timer to keep tokenRates up to date\n get(tokenRatesFetcherAtomEffect)\n\n return (await get(tokenRatesDbAtom)).tokenRates\n})\n\n// TODO: Persist to storage\nconst tokenRates$ = new ReplaySubject<TokenRatesStorage>(1)\n\nconst tokenRatesDbAtom = atomWithObservable(() => {\n tryToDeleteOldTokenRatesDb()\n return tokenRates$.asObservable()\n})\n\nconst tokenRatesFetcherAtomEffect = atomEffect((get) => {\n // lets us tear down the existing timer when the effect is restarted\n const abort = new AbortController()\n\n // we have to get these synchronously so that jotai knows to restart our timer when they change\n const coinsApiConfig = get(coinsApiConfigAtom)\n const tokensPromise = get(tokensAtom)\n\n ;(async () => {\n const tokensById = keyBy(await tokensPromise, \"id\")\n\n const loopMs = 300_000 // 300_000ms = 300s = 5 minutes\n const retryTimeout = 5_000 // 5_000ms = 5 seconds\n\n const hydrate = async () => {\n try {\n if (abort.signal.aborted) return // don't fetch if aborted\n const tokenRates = await fetchTokenRates(tokensById, ALL_CURRENCY_IDS, coinsApiConfig)\n const putTokenRates: TokenRatesStorage = { tokenRates }\n\n if (abort.signal.aborted) return // don't insert into db if aborted\n tokenRates$.next(putTokenRates)\n\n if (abort.signal.aborted) return // don't schedule next loop if aborted\n setTimeout(hydrate, loopMs)\n } catch (error) {\n const retrying = !abort.signal.aborted\n const messageParts = [\n \"Failed to fetch tokenRates\",\n retrying && `retrying in ${Math.round(retryTimeout / 1000)} seconds`,\n !retrying && `giving up (timer no longer needed)`,\n ].filter(isTruthy)\n log.error(messageParts.join(\", \"), error)\n\n if (isAbortError(error)) return // don't schedule retry if aborted\n setTimeout(hydrate, retryTimeout)\n }\n }\n\n // launch the loop\n hydrate()\n })()\n\n return () => abort.abort(\"Unsubscribed\")\n})\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/balances-react\",\n \"version\": \"1.3.3\",\n \"author\": \"Talisman\",\n \"homepage\": \"https://talisman.xyz\",\n \"license\": \"GPL-3.0-or-later\",\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"directory\": \"packages/balances-react\",\n \"type\": \"git\",\n \"url\": \"https://github.com/TalismanSociety/talisman.git\"\n },\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.mjs\",\n \"files\": [\n \"dist\"\n ],\n \"engines\": {\n \"node\": \">=20\"\n },\n \"scripts\": {\n \"test\": \"vitest run\",\n \"clean\": \"rm -rf dist .turbo node_modules\",\n \"build\": \"tsup --silent\",\n \"typecheck\": \"tsc --noEmit\"\n },\n \"dependencies\": {\n \"@talismn/balances\": \"workspace:*\",\n \"@talismn/chain-connectors\": \"workspace:*\",\n \"@talismn/chaindata-provider\": \"workspace:*\",\n \"@talismn/connection-meta\": \"workspace:*\",\n \"@talismn/token-rates\": \"workspace:*\",\n \"@talismn/util\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"jotai\": \"~2\",\n \"jotai-effect\": \"~1\",\n \"lodash-es\": \"4.17.21\",\n \"rxjs\": \"^7.8.1\"\n },\n \"devDependencies\": {\n \"@talismn/tsconfig\": \"workspace:*\",\n \"@types/lodash-es\": \"4.17.12\",\n \"@types/react\": \"^18.3.12\",\n \"react\": \"^18.3.1\",\n \"typescript\": \"^5.6.3\"\n },\n \"peerDependencies\": {\n \"@polkadot/util-crypto\": \"*\",\n \"react\": \"*\",\n \"react-dom\": \"*\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.tsx\",\n \"import\": {\n \"types\": \"./dist/index.d.mts\",\n \"default\": \"./dist/index.mjs\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n }\n }\n }\n}\n","import { cryptoWaitReady } from \"@polkadot/util-crypto\"\nimport { atom } from \"jotai\"\n\nexport const cryptoWaitReadyAtom = atom(async () => await cryptoWaitReady())\n","import type { Balances } from \"@talismn/balances\"\nimport { useAtomValue, useSetAtom } from \"jotai\"\nimport { useEffect, useMemo } from \"react\"\n\nimport { allAddressesAtom } from \"../atoms/allAddresses\"\nimport { balancesAtom } from \"../atoms/balances\"\n\nexport const useSetBalancesAddresses = (addresses: string[]) => {\n const setAllAddresses = useSetAtom(allAddressesAtom)\n useEffect(() => {\n setAllAddresses((a) => (JSON.stringify(a) === JSON.stringify(addresses) ? a : addresses))\n }, [addresses, setAllAddresses])\n}\n\n/**\n * @name useBalances\n * @description Hook to get the current balances state.\n * @param persistBackend an optional BalancesPersistBackend backend to use for persisting the balances state. By default, indexedDB is used.\n * @returns a Balances object containing the current balances state.\n */\n\nexport const useBalances = () => {\n return useAtomValue(balancesAtom)\n}\n\n// TODO: Extract to shared definition between extension and @talismn/balances-react\nexport type BalancesStatus =\n | { status: \"live\" }\n | { status: \"fetching\" }\n | { status: \"stale\"; staleChains: string[] }\n\n/**\n * Given a collection of `Balances`, this hook returns a `BalancesStatus` summary for the collection.\n *\n * @param balances The collection of balances to get the status from.\n * @returns An instance of `BalancesStatus` which represents the status of the balances collection.\n\n */\nexport const useBalancesStatus = (balances: Balances) =>\n useMemo<BalancesStatus>(() => {\n // stale\n const staleChains = getStaleChains(balances)\n if (staleChains.length > 0) return { status: \"stale\", staleChains }\n\n // fetching\n const hasCachedBalances = balances.each.some((b) => b.status === \"cache\")\n if (hasCachedBalances) return { status: \"fetching\" }\n\n // live\n return { status: \"live\" }\n }, [balances])\n\nexport const getStaleChains = (balances: Balances): string[] => [\n ...new Set(\n balances.each\n .filter((b) => b.status === \"stale\")\n .map((b) => b.network?.name ?? b.networkId ?? \"Unknown\")\n ),\n]\n","import { useAtomValue } from \"jotai\"\n\nimport { chainConnectorsAtom } from \"../atoms/chainConnectors\"\n\nexport const useChainConnectors = () => useAtomValue(chainConnectorsAtom)\n","import type { NetworkId, TokenId } from \"@talismn/chaindata-provider\"\nimport { useAtomValue } from \"jotai\"\nimport { keyBy } from \"lodash-es\"\nimport { useMemo } from \"react\"\n\nimport { chaindataAtom } from \"../atoms/chaindata\"\nimport { chaindataProviderAtom } from \"../atoms/chaindataProvider\"\n\nexport const useChaindataProvider = () => useAtomValue(chaindataProviderAtom)\nexport const useChaindata = () => useAtomValue(chaindataAtom)\n\nexport const useNetworks = () => useChaindata().networks\nexport const useNetworksById = () => {\n const { networks } = useChaindata()\n return useMemo(() => keyBy(networks, (n) => n.id), [networks])\n}\nexport const useNetwork = (networkId?: NetworkId) => {\n const networksById = useNetworksById()\n return networksById[networkId ?? \"\"] ?? null\n}\n\nexport const useTokens = () => useChaindata().tokens\nexport const useTokensById = () => {\n const { tokens } = useChaindata()\n return useMemo(() => keyBy(tokens, (t) => t.id), [tokens])\n}\nexport const useToken = (tokenId?: TokenId) => {\n const tokensById = useTokensById()\n return tokensById[tokenId ?? \"\"] ?? null\n}\n","import type { TokenId } from \"@talismn/chaindata-provider\"\nimport { useAtomValue } from \"jotai\"\n\nimport { tokenRatesAtom } from \"../atoms/tokenRates\"\n\nexport const useTokenRates = () => useAtomValue(tokenRatesAtom)\nexport const useTokenRate = (tokenId?: TokenId) => useTokenRates()[tokenId ?? \"\"] ?? undefined\n"],"mappings":"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","names":["useSetAtom","useEffect","atom","atom","atomEffect","keyBy","atom","atom","atom","atom","atom","atom","atom","atom","atomWithObservable","atomEffect","keyBy","atom","atomWithObservable","atomEffect","keyBy","atom","atomEffect","keyBy","atom","useAtomValue","useAtomValue","useAtomValue","keyBy","useMemo","useAtomValue","useMemo","keyBy","useAtomValue","useAtomValue","BalancesProvider","useSetAtom","useEffect"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@talismn/balances-react",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.3",
|
|
4
4
|
"author": "Talisman",
|
|
5
5
|
"homepage": "https://talisman.xyz",
|
|
6
6
|
"license": "GPL-3.0-or-later",
|
|
@@ -26,12 +26,12 @@
|
|
|
26
26
|
"jotai-effect": "~1",
|
|
27
27
|
"lodash-es": "4.17.21",
|
|
28
28
|
"rxjs": "^7.8.1",
|
|
29
|
-
"@talismn/balances": "1.3.
|
|
30
|
-
"@talismn/chain-connectors": "0.0.
|
|
31
|
-
"@talismn/chaindata-provider": "1.3.
|
|
32
|
-
"@talismn/
|
|
33
|
-
"@talismn/util": "0.5.
|
|
34
|
-
"@talismn/
|
|
29
|
+
"@talismn/balances": "1.3.3",
|
|
30
|
+
"@talismn/chain-connectors": "0.0.15",
|
|
31
|
+
"@talismn/chaindata-provider": "1.3.6",
|
|
32
|
+
"@talismn/token-rates": "3.0.17",
|
|
33
|
+
"@talismn/util": "0.5.8",
|
|
34
|
+
"@talismn/connection-meta": "0.2.35"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@types/lodash-es": "4.17.12",
|