@talismn/balances 1.3.3 → 1.3.4

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.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/BalancesProvider.ts","../src/getMiniMetadatas/index.ts","../src/log.ts","../package.json","../src/modules/evm-erc20/config.ts","../src/modules/evm-erc20/fetchBalances.ts","../src/modules/abis/erc20BalancesAggregator.ts","../src/modules/abis/multicall.ts","../src/modules/abis/uniswapV2Pair.ts","../src/modules/shared/errors.ts","../src/modules/shared/types.ts","../src/modules/evm-erc20/fetchTokens.ts","../src/modules/evm-erc20/utils.ts","../src/modules/evm-erc20/getMiniMetadata.ts","../src/modules/evm-erc20/getTransferCallData.ts","../src/modules/evm-erc20/subscribeBalances.ts","../src/modules/evm-erc20/module.ts","../src/modules/evm-erc20/types.ts","../src/types/tokens.ts","../src/modules/evm-native/config.ts","../src/modules/evm-native/fetchBalances.ts","../src/modules/evm-native/fetchTokens.ts","../src/modules/evm-native/getMiniMetadata.ts","../src/modules/evm-native/getTransferCallData.ts","../src/modules/evm-native/subscribeBalances.ts","../src/modules/evm-native/module.ts","../src/modules/evm-native/types.ts","../src/modules/evm-uniswapv2/config.ts","../src/modules/evm-uniswapv2/fetchBalances.ts","../src/modules/evm-uniswapv2/fetchTokens.ts","../src/modules/evm-uniswapv2/utils.ts","../src/modules/evm-uniswapv2/getMiniMetadata.ts","../src/modules/evm-uniswapv2/getTransferCallData.ts","../src/modules/evm-uniswapv2/subscribeBalances.ts","../src/modules/evm-uniswapv2/module.ts","../src/modules/evm-uniswapv2/types.ts","../src/modules/sol-native/config.ts","../src/modules/sol-native/fetchBalances.ts","../src/modules/sol-native/fetchTokens.ts","../src/modules/sol-native/getMiniMetadata.ts","../src/modules/sol-native/getTransferCallData.ts","../src/modules/sol-native/subscribeBalances.ts","../src/modules/sol-native/module.ts","../src/modules/sol-native/types.ts","../src/modules/sol-spl/config.ts","../src/modules/sol-spl/fetchBalances.ts","../src/modules/shared/buildNetworkStorageCoders.ts","../src/modules/shared/fetchRuntimeCallResult.ts","../src/modules/shared/rpcQueryPack.ts","../src/modules/shared/utils.ts","../src/modules/shared/detectedTokens.ts","../src/modules/sol-spl/fetchTokens.ts","../src/modules/sol-spl/getMiniMetadata.ts","../src/modules/sol-spl/getTransferCallData.ts","../src/modules/sol-spl/subscribeBalances.ts","../src/modules/sol-spl/module.ts","../src/modules/sol-spl/types.ts","../src/modules/substrate-assets/config.ts","../src/modules/substrate-assets/buildQueries.ts","../src/modules/substrate-assets/fetchBalances.ts","../src/modules/substrate-assets/fetchTokens.ts","../src/modules/substrate-assets/getMiniMetadata.ts","../src/types/balances.ts","../src/modules/substrate-dtao/alphaPrice.ts","../src/modules/substrate-dtao/getDtaoTokenRates.ts","../src/modules/substrate-dtao/config.ts","../src/modules/substrate-dtao/fetchBalances.ts","../src/modules/substrate-dtao/calculatePendingRootClaimable.ts","../src/modules/substrate-dtao/fetchTokens.ts","../src/modules/substrate-dtao/getMiniMetadata.ts","../src/modules/substrate-dtao/getTransferCallData.ts","../src/modules/substrate-dtao/subscribeBalances.ts","../src/modules/substrate-dtao/module.ts","../src/modules/substrate-dtao/types.ts","../src/types/balancetypes.ts","../src/types/minimetadatas.ts","../src/modules/substrate-assets/getTransferCallData.ts","../src/modules/substrate-assets/subscribeBalances.ts","../src/modules/substrate-assets/module.ts","../src/modules/substrate-assets/types.ts","../src/modules/substrate-foreignassets/config.ts","../src/modules/substrate-foreignassets/buildQueries.ts","../src/modules/substrate-foreignassets/fetchBalances.ts","../src/modules/substrate-foreignassets/fetchTokens.ts","../src/modules/substrate-foreignassets/getMiniMetadata.ts","../src/modules/substrate-foreignassets/getTransferCallData.ts","../src/modules/substrate-foreignassets/subscribeBalances.ts","../src/modules/substrate-foreignassets/module.ts","../src/modules/substrate-foreignassets/types.ts","../src/modules/substrate-hydration/config.ts","../src/modules/substrate-hydration/fetchBalances.ts","../src/modules/substrate-hydration/fetchTokens.ts","../src/modules/substrate-hydration/getMiniMetadata.ts","../src/modules/substrate-hydration/getTransferCallData.ts","../src/modules/substrate-hydration/subscribeBalances.ts","../src/modules/substrate-hydration/module.ts","../src/modules/substrate-hydration/types.ts","../src/modules/substrate-native/config.ts","../src/modules/substrate-native/queries/buildBaseQueries.ts","../src/modules/substrate-native/util/lockTypes.ts","../src/modules/substrate-native/queries/buildNomPoolQueries.ts","../src/modules/substrate-native/util/nompoolAccountId.ts","../src/modules/substrate-native/fetchBalances.ts","../src/modules/substrate-native/fetchTokens.ts","../src/modules/substrate-native/getMiniMetadata.ts","../src/modules/substrate-native/getTransferCallData.ts","../src/modules/substrate-native/subscribeBalances.ts","../src/modules/substrate-native/module.ts","../src/modules/substrate-native/types.ts","../src/modules/substrate-psp22/config.ts","../src/modules/substrate-psp22/fetchBalances.ts","../src/modules/abis/psp22.json","../src/modules/substrate-psp22/util.ts","../src/modules/substrate-psp22/fetchTokens.ts","../src/modules/substrate-psp22/getMiniMetadata.ts","../src/modules/substrate-psp22/getTransferCallData.ts","../src/modules/substrate-psp22/subscribeBalances.ts","../src/modules/substrate-psp22/module.ts","../src/modules/substrate-psp22/types.ts","../src/modules/substrate-tokens/config.ts","../src/modules/substrate-tokens/buildQueries.ts","../src/modules/substrate-tokens/fetchBalances.ts","../src/modules/substrate-tokens/fetchTokens.ts","../src/modules/substrate-tokens/getMiniMetadata.ts","../src/modules/substrate-tokens/getTransferCallData.ts","../src/modules/substrate-tokens/subscribeBalances.ts","../src/modules/substrate-tokens/module.ts","../src/modules/substrate-tokens/types.ts","../src/modules/index.ts","../src/getMiniMetadatas/getMetadataRpc.ts","../src/getMiniMetadatas/getSpecVersion.ts","../src/version.ts"],"sourcesContent":["export * from \"./BalancesProvider\"\nexport * from \"./modules\"\nexport * from \"./types\"\nexport * from \"./version\"\n","import {\n type AnyMiniMetadata,\n type ChaindataProvider,\n type DotNetworkId,\n isNetworkDot,\n type Network,\n type NetworkId,\n parseTokenId,\n type Token,\n type TokenId,\n} from \"@talismn/chaindata-provider\"\nimport {\n type AccountPlatform,\n getAccountPlatformFromAddress,\n normalizeAddress,\n} from \"@talismn/crypto\"\nimport { getSharedObservable, isNotNil, isTruthy, keepAlive } from \"@talismn/util\"\nimport { assign, fromPairs, isEqual, keyBy, keys, toPairs, uniq, values } from \"lodash-es\"\nimport {\n BehaviorSubject,\n catchError,\n combineLatest,\n defer,\n distinctUntilChanged,\n EMPTY,\n filter,\n firstValueFrom,\n from,\n map,\n type Observable,\n of,\n shareReplay,\n startWith,\n switchMap,\n tap,\n timer,\n} from \"rxjs\"\nimport { withRetry } from \"viem\"\n\nimport { BALANCE_MODULES, Balance, type ChainConnectors } from \".\"\nimport { getMiniMetadatas, getSpecVersion } from \"./getMiniMetadatas\"\nimport log from \"./log\"\nimport { getDetectedTokensIds$ } from \"./modules/shared/detectedTokens\"\nimport {\n type Address,\n deriveMiniMetadataId,\n getBalanceId,\n type IBalance,\n type MiniMetadata,\n} from \"./types\"\nimport type { TokensWithAddresses } from \"./types/IBalanceModule\"\n\ntype BalancesStatus = \"initialising\" | \"live\"\n\nexport type BalancesResult = {\n status: BalancesStatus\n balances: IBalance[]\n failedBalanceIds: string[] // balance ids that failed to fetch\n}\n\nexport type BalancesStorage = {\n balances: IBalance[]\n miniMetadatas: MiniMetadata[]\n}\n\ntype ProviderBalancesStorage = {\n balances: Record<string, IBalance>\n miniMetadatas: Record<string, MiniMetadata>\n}\n\nconst DEFAULT_STORAGE: BalancesStorage = {\n balances: [],\n miniMetadatas: [],\n}\n\nexport class BalancesProvider {\n #chaindataProvider: ChaindataProvider\n #chainConnectors: ChainConnectors\n #storage: BehaviorSubject<ProviderBalancesStorage>\n\n constructor(\n chaindataProvider: ChaindataProvider,\n chainConnectors: ChainConnectors,\n storage: BalancesStorage = DEFAULT_STORAGE\n ) {\n this.#chaindataProvider = chaindataProvider\n this.#chainConnectors = chainConnectors\n this.#storage = new BehaviorSubject<ProviderBalancesStorage>({\n balances: keyBy(storage.balances.filter(isNotNil), (b) => getBalanceId(b)),\n miniMetadatas: keyBy(storage.miniMetadatas.filter(isNotNil), (m) => m.id),\n })\n }\n\n get storage$() {\n return this.#storage.pipe(\n map(\n ({ balances, miniMetadatas }): BalancesStorage => ({\n balances: values(balances).filter(isNotNil).sort(sortByBalanceId),\n miniMetadatas: values(miniMetadatas).filter(isNotNil).sort(sortByMiniMetadataId),\n }),\n shareReplay(1)\n )\n )\n }\n\n private get storedMiniMetadataMapById$() {\n return this.#storage.pipe(\n map((storage) => keyBy(storage.miniMetadatas, (m) => m.id)),\n distinctUntilChanged<Record<string, MiniMetadata>>(isEqual),\n shareReplay(1)\n )\n }\n\n // this is the only public method\n public getBalances$(addressesByTokenId: Record<TokenId, Address[]>): Observable<BalancesResult> {\n return this.cleanupAddressesByTokenId$(addressesByTokenId).pipe(\n map(\n // split by network\n (addressesByTokenId): Record<NetworkId, Record<TokenId, Address[]>> =>\n toPairs(addressesByTokenId).reduce(\n (acc, [tokenId, addresses]) => {\n const networkId = parseTokenId(tokenId).networkId\n if (!acc[networkId]) acc[networkId] = {}\n acc[networkId][tokenId] = addresses\n return acc\n },\n {} as Record<NetworkId, Record<TokenId, Address[]>>\n )\n ),\n switchMap((addressesByTokenIdByNetworkId) => {\n // after cleanup we might end up without entries to fetch, which would break the combineLatest below\n if (!keys(addressesByTokenIdByNetworkId).length) return of({ isStale: false, results: [] })\n\n // fetch balances and start a 30s timer to mark the whole subscription live after 30s\n return combineLatest({\n isStale: timer(30_000).pipe(\n map(() => true),\n startWith(false)\n ),\n results: combineLatest(\n toPairs(addressesByTokenIdByNetworkId).map(([networkId]) =>\n this.getNetworkBalances$(networkId, addressesByTokenIdByNetworkId[networkId])\n )\n ),\n })\n }),\n map(\n // combine\n ({ isStale, results }): BalancesResult => ({\n status:\n !isStale && results.some(({ status }) => status === \"initialising\")\n ? \"initialising\"\n : \"live\",\n balances: results\n .flatMap((result) =>\n result.balances.map(\n (b): IBalance => (isStale && b.status !== \"live\" ? { ...b, status: \"stale\" } : b)\n )\n )\n .sort(sortByBalanceId),\n failedBalanceIds: results.flatMap((result) => result.failedBalanceIds),\n })\n ),\n distinctUntilChanged<BalancesResult>(isEqual)\n )\n }\n\n public fetchBalances(addressesByTokenId: Record<TokenId, Address[]>): Promise<IBalance[]> {\n return firstValueFrom(\n this.getBalances$(addressesByTokenId).pipe(\n filter(({ status }) => status === \"live\"),\n map(({ balances }) => balances)\n )\n )\n }\n\n public getDetectedTokensId$(address: string): Observable<TokenId[]> {\n return getDetectedTokensIds$(address)\n }\n\n private getNetworkBalances$(\n networkId: string,\n addressesByTokenId: Record<TokenId, Address[]>\n ): Observable<BalancesResult> {\n const network$ = this.#chaindataProvider.getNetworkById$(networkId)\n const tokensMapById$ = this.#chaindataProvider.getTokensMapById$()\n\n return combineLatest([network$, tokensMapById$]).pipe(\n switchMap(([network, tokensMapById]) => {\n const tokensAndAddresses: TokensWithAddresses = toPairs(addressesByTokenId).map(\n ([tokenId, addresses]) => [tokensMapById[tokenId], addresses] as [Token, Address[]]\n )\n\n return combineLatest(\n BALANCE_MODULES.filter((mod) => mod.platform === network?.platform).map((mod) => {\n const tokensWithAddresses = tokensAndAddresses.filter(\n ([token]) => token.type === mod.type\n )\n\n switch (mod.platform) {\n case \"ethereum\": {\n return this.getEthereumNetworkModuleBalances$(networkId, tokensWithAddresses, mod)\n }\n case \"solana\": {\n return this.getSolanaNetworkModuleBalances$(networkId, tokensWithAddresses, mod)\n }\n case \"polkadot\": {\n return this.getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod)\n }\n default: {\n log.warn(\"[balances] Unsupported network platform for module\", { networkId, mod })\n return of<BalancesResult>({ status: \"live\", balances: [], failedBalanceIds: [] })\n }\n }\n })\n )\n }),\n map((results): BalancesResult => {\n // for each balance that could not be fetched, see if we have a stored balance and return it, marked as stale\n const errorBalanceIds = results.flatMap((result) => result.failedBalanceIds)\n const staleBalances = errorBalanceIds\n .map((balanceId) => this.#storage.value.balances[balanceId])\n .filter(isNotNil)\n .map((b): IBalance => ({ ...b, status: \"stale\" }))\n\n return {\n status: results.some(({ status }) => status === \"initialising\") ? \"initialising\" : \"live\",\n balances: results\n .flatMap((result) => result.balances)\n .concat(staleBalances)\n .sort(sortByBalanceId),\n failedBalanceIds: [],\n }\n }),\n distinctUntilChanged<BalancesResult>(isEqual)\n )\n }\n\n private getPolkadotNetworkModuleBalances$(\n networkId: DotNetworkId,\n tokensWithAddresses: TokensWithAddresses,\n mod: Extract<(typeof BALANCE_MODULES)[number], { platform: \"polkadot\" }>\n ): Observable<BalancesResult> {\n return getSharedObservable(\n `BalancesProvider.getPolkadotNetworkModuleBalances$`,\n { networkId, mod, tokensWithAddresses },\n () => {\n if (!tokensWithAddresses.length)\n return of<BalancesResult>({ status: \"live\", balances: [], failedBalanceIds: [] })\n\n const moduleAddressesByTokenId = fromPairs(\n tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])\n )\n\n // all balance ids expected in result set\n const balanceIds = toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) =>\n addresses.map((address) => getBalanceId({ tokenId, address }))\n )\n\n if (!this.#chainConnectors.substrate) {\n log.warn(\"[balances] no substrate connector or miniMetadata for module\", mod.type)\n return defer(() =>\n of<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n }\n\n const moduleBalances$ = this.getNetworkMiniMetadatas$(networkId).pipe(\n map((miniMetadatas) => miniMetadatas.find((m) => m.source === mod.type)),\n switchMap((miniMetadata) =>\n mod.subscribeBalances({\n networkId,\n tokensWithAddresses,\n connector: this.#chainConnectors.substrate!,\n miniMetadata: miniMetadata as AnyMiniMetadata,\n })\n ),\n catchError(() => EMPTY), // don't emit, let provider mark balances stale\n tap((results) => {\n if (results.dynamicTokens?.length) {\n // register missing tokens in the chaindata provider\n this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens)\n }\n }),\n map(\n (results): BalancesResult => ({\n status: \"live\",\n // exclude zero balances\n balances: results.success.filter((b) => new Balance(b).total.planck > 0n),\n failedBalanceIds: results.errors.map(({ tokenId, address }) =>\n getBalanceId({ tokenId, address })\n ),\n })\n ),\n tap((results) => {\n this.updateStorage$(balanceIds, results)\n }),\n // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change\n shareReplay({ refCount: true, bufferSize: 1 }),\n keepAlive(0)\n )\n\n // defer the startWith call to start with up to date balances each time the observable is re-subscribed to\n return defer(() =>\n moduleBalances$.pipe(\n startWith<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n )\n }\n )\n }\n\n private getEthereumNetworkModuleBalances$(\n networkId: DotNetworkId,\n tokensWithAddresses: TokensWithAddresses,\n mod: Extract<(typeof BALANCE_MODULES)[number], { platform: \"ethereum\" }>\n ): Observable<BalancesResult> {\n return getSharedObservable(\n `BalancesProvider.getEthereumNetworkModuleBalances$`,\n { networkId, mod, tokensWithAddresses },\n () => {\n if (!tokensWithAddresses.length)\n return of<BalancesResult>({ status: \"live\", balances: [], failedBalanceIds: [] })\n\n const moduleAddressesByTokenId = fromPairs(\n tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])\n )\n\n // all balance ids expected in result set\n const balanceIds = toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) =>\n addresses.map((address) => getBalanceId({ tokenId, address }))\n )\n\n if (!this.#chainConnectors.evm) {\n log.warn(\"[balances] no ethereum connector for module\", mod.type)\n return defer(() =>\n of<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n }\n\n const moduleBalances$ = mod\n .subscribeBalances({\n networkId,\n tokensWithAddresses,\n connector: this.#chainConnectors.evm,\n })\n .pipe(\n catchError(() => EMPTY), // don't emit, let provider mark balances stale\n map(\n (results): BalancesResult => ({\n status: \"live\",\n // exclude zero balances\n balances: results.success.filter((b) => new Balance(b).total.planck > 0n),\n failedBalanceIds: results.errors.map(({ tokenId, address }) =>\n getBalanceId({ tokenId, address })\n ),\n })\n ),\n tap((results) => {\n this.updateStorage$(balanceIds, results)\n }),\n // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change\n shareReplay({ refCount: true, bufferSize: 1 }),\n keepAlive(0)\n )\n\n // defer the startWith call to start with up to date balances each time the observable is re-subscribed to\n return defer(() =>\n moduleBalances$.pipe(\n startWith<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n )\n }\n )\n }\n\n private getSolanaNetworkModuleBalances$(\n networkId: DotNetworkId,\n tokensWithAddresses: TokensWithAddresses,\n mod: Extract<(typeof BALANCE_MODULES)[number], { platform: \"solana\" }>\n ): Observable<BalancesResult> {\n return getSharedObservable(\n `BalancesProvider.getSolanaNetworkModuleBalances$`,\n { networkId, mod, tokensWithAddresses },\n () => {\n if (!tokensWithAddresses.length)\n return of<BalancesResult>({ status: \"live\", balances: [], failedBalanceIds: [] })\n\n const moduleAddressesByTokenId = fromPairs(\n tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])\n )\n\n // all balance ids expected in result set\n const balanceIds = toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) =>\n addresses.map((address) => getBalanceId({ tokenId, address }))\n )\n\n if (!this.#chainConnectors.solana) {\n log.warn(\"[balances] no solana connector for module\", mod.type)\n return defer(() =>\n of<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n }\n\n const moduleBalances$ = mod\n .subscribeBalances({\n networkId,\n tokensWithAddresses,\n connector: this.#chainConnectors.solana,\n })\n .pipe(\n catchError(() => EMPTY), // don't emit, let provider mark balances stale\n map(\n (results): BalancesResult => ({\n status: \"live\",\n // exclude zero balances\n balances: results.success.filter((b) => new Balance(b).total.planck > 0n),\n failedBalanceIds: results.errors.map(({ tokenId, address }) =>\n getBalanceId({ tokenId, address })\n ),\n })\n ),\n tap((results) => {\n this.updateStorage$(balanceIds, results)\n }),\n // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change\n shareReplay({ refCount: true, bufferSize: 1 }),\n keepAlive(0)\n )\n\n // defer the startWith call to start with up to date balances each time the observable is re-subscribed to\n return defer(() =>\n moduleBalances$.pipe(\n startWith<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n )\n }\n )\n }\n\n private updateStorage$(balanceIds: string[], balancesResult: BalancesResult) {\n if (balancesResult.status !== \"live\") return\n\n const storage = this.#storage.getValue()\n const balances = assign(\n {},\n storage.balances,\n // delete all balances expected in the result set (except the ones that failed). because if they are not present it means they are empty.\n fromPairs(\n balanceIds\n .filter((bid) => !balancesResult.failedBalanceIds.includes(bid))\n .map((balanceId) => [balanceId, undefined])\n ),\n keyBy(\n // storage balances must have status \"cache\", because they are used as start value when initialising subsequent subscriptions\n balancesResult.balances.map((b) => ({ ...b, status: \"cache\" })),\n (b) => getBalanceId(b)\n )\n )\n\n // update status of stale balances\n for (const errorBalanceId of balancesResult.failedBalanceIds) {\n const balance = balances[errorBalanceId] as IBalance\n if (balance) balance.status = \"stale\"\n }\n\n this.#storage.next(assign({}, storage, { balances }))\n }\n\n private getNetworkMiniMetadatas$(networkId: NetworkId): Observable<MiniMetadata[]> {\n return getSharedObservable(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {\n return this.#chaindataProvider.getNetworkById$(networkId).pipe(\n switchMap((network) =>\n isNetworkDot(network)\n ? this.getNetworkSpecVersion$(networkId).pipe(\n switchMap((specVersion) =>\n specVersion === null ? of([]) : this.getMiniMetadatas$(networkId, specVersion)\n )\n )\n : of([])\n ),\n distinctUntilChanged<MiniMetadata[]>(isEqual)\n )\n })\n }\n\n private getNetworkSpecVersion$(networkId: NetworkId): Observable<number | null> {\n return from(\n withRetry(() => getSpecVersion(this.#chainConnectors.substrate!, networkId), {\n delay: 2_000,\n shouldRetry: (err) => {\n log.warn(\"Failed to fetch spec version for network, retrying...\", networkId, err)\n return true // don't give up mate!\n },\n })\n ).pipe(\n catchError(() => {\n log.warn(\"Failed to fetch spec version for network\", networkId)\n return of(null as number | null)\n })\n )\n }\n\n private getMiniMetadatas$(\n networkId: DotNetworkId,\n specVersion: number\n ): Observable<MiniMetadata[]> {\n const miniMetadataIds = BALANCE_MODULES.filter((mod) => mod.platform === \"polkadot\").map(\n (mod) =>\n deriveMiniMetadataId({\n chainId: networkId,\n specVersion,\n source: mod.type,\n })\n )\n\n return combineLatest({\n defaultMiniMetadatas: this.getDefaultMiniMetadatas$(miniMetadataIds),\n storedMiniMetadatas: this.getStoredMiniMetadatas$(miniMetadataIds),\n }).pipe(\n switchMap(({ storedMiniMetadatas, defaultMiniMetadatas }) => {\n if (defaultMiniMetadatas) return of(defaultMiniMetadatas)\n if (storedMiniMetadatas) return of(storedMiniMetadatas)\n if (!this.#chainConnectors.substrate) return of([])\n\n return from(\n withRetry(\n () =>\n // can fail if metadata cant be fetched\n getMiniMetadatas(\n this.#chainConnectors.substrate!,\n this.#chaindataProvider,\n networkId,\n specVersion\n ),\n {\n delay: 2_000,\n shouldRetry: (err) => {\n log.warn(\"Failed to fetch minimetadata for %s, retrying...\", networkId, err)\n return true // don't give up mate!\n },\n }\n )\n ).pipe(\n catchError(() => {\n log.warn(\"Failed to fetch metadata for network\", networkId)\n return of([])\n }),\n // and persist in storage for later reuse\n tap((newMiniMetadatas) => {\n if (!newMiniMetadatas.length) return\n const storage = this.#storage.getValue()\n const miniMetadatas = assign(\n // keep minimetadatas of other networks\n keyBy(\n values(storage.miniMetadatas).filter((m) => m.chainId !== networkId),\n (m) => m.id\n ),\n // add the ones for our network\n keyBy(newMiniMetadatas, (m) => m.id)\n )\n\n this.#storage.next(assign({}, storage, { miniMetadatas }))\n })\n )\n }),\n // emit only when mini metadata changes, as a change here would restart all subscriptions for the network\n distinctUntilChanged<MiniMetadata[]>(isEqual)\n )\n }\n\n private getStoredMiniMetadatas$(miniMetadataIds: string[]): Observable<MiniMetadata[] | null> {\n return this.storedMiniMetadataMapById$.pipe(\n map((mapById) => {\n const miniMetadatas = miniMetadataIds.map((id) => mapById[id])\n return miniMetadatas.length && miniMetadatas.every(isTruthy) ? miniMetadatas : null\n }),\n // source changes very often\n distinctUntilChanged<MiniMetadata[] | null>(isEqual)\n )\n }\n\n private getDefaultMiniMetadatas$(miniMetadataIds: string[]): Observable<MiniMetadata[] | null> {\n return this.#chaindataProvider.miniMetadatasMapById$.pipe(\n map((mapById) => {\n const miniMetadatas = miniMetadataIds.map((id) => mapById[id])\n return miniMetadatas.length && miniMetadatas.every(isTruthy) ? miniMetadatas : null\n })\n )\n }\n\n private getStoredBalances(addressesByToken: Record<TokenId, Address[]>) {\n const balanceDefs = toPairs(addressesByToken).flatMap(([tokenId, addresses]) =>\n addresses.map((address) => [tokenId, address] as [TokenId, Address])\n )\n\n return balanceDefs\n .map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })])\n .filter(isNotNil)\n .sort(sortByBalanceId) as IBalance[]\n }\n\n private cleanupAddressesByTokenId$(addressesByTokenId: Record<TokenId, Address[]>) {\n return this.#chaindataProvider.getNetworksMapById$().pipe(\n map((networksById): Record<TokenId, Address[]> => {\n return fromPairs(\n toPairs(addressesByTokenId)\n .map(([tokenId, addresses]) => {\n const networkId = parseTokenId(tokenId).networkId\n const network = networksById[networkId]\n return [\n tokenId,\n uniq(addresses.map(normalizeAddress)).filter(\n (address) => network && isAddressCompatibleWithNetwork(network, address)\n ),\n ] as [TokenId, Address[]]\n })\n .filter(([, addresses]) => addresses.length > 0)\n )\n })\n )\n }\n}\n\nconst isAccountPlatformCompatibleWithNetwork = (network: Network, platform: AccountPlatform) => {\n switch (network.platform) {\n case \"ethereum\":\n return platform === \"ethereum\"\n case \"solana\":\n return platform === \"solana\"\n case \"polkadot\": {\n switch (network.account) {\n case \"secp256k1\":\n return platform === \"ethereum\"\n case \"*25519\":\n return platform === \"polkadot\"\n default:\n throw new Error(`Unsupported polkadot network account type ${network.account}`)\n }\n }\n default:\n log.warn(\"Unsupported network platform\", network)\n throw new Error(\"Unsupported network platform\")\n }\n}\n\n/**\n * If this is the address of an account, use isAccountCompatibleWithChain instead.\n * Otherwise it could lead to a loss of funds\n * @param chain\n * @param address\n * @returns\n */\nconst isAddressCompatibleWithNetwork = (network: Network, address: string) => {\n // TODO try with return true to check if wallet filters correctly upfront\n const accountPlatform = getAccountPlatformFromAddress(address)\n return isAccountPlatformCompatibleWithNetwork(network, accountPlatform)\n}\n\nconst sortByBalanceId = (a: IBalance, b: IBalance) => getBalanceId(a).localeCompare(getBalanceId(b))\n\nconst sortByMiniMetadataId = (a: MiniMetadata, b: MiniMetadata) => a.id.localeCompare(b.id)\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport type { ChaindataProvider, DotNetworkId } from \"@talismn/chaindata-provider\"\nimport PQueue from \"p-queue\"\n\nimport log from \"../log\"\nimport { BALANCE_MODULES } from \"../modules\"\nimport type { MiniMetadata } from \"../types\"\nimport { getMetadataRpc } from \"./getMetadataRpc\"\nimport { getSpecVersion } from \"./getSpecVersion\"\n\nexport { getSpecVersion } from \"./getSpecVersion\"\n\nconst getCacheKey = (networkId: string, specVersion: number) => `${networkId}:${specVersion}`\n\nconst CACHE = new Map<string, Promise<MiniMetadata[]>>()\n\n// ensures we dont fetch miniMetadatas on more than 4 chains at once\nconst POOL = new PQueue({ concurrency: 4 })\n\nexport const getMiniMetadatas = async (\n chainConnector: IChainConnectorDot,\n chaindataProvider: ChaindataProvider,\n networkId: DotNetworkId,\n specVersion?: number\n) => {\n if (specVersion === undefined) specVersion = await getSpecVersion(chainConnector, networkId)\n\n const cacheKey = getCacheKey(networkId, specVersion)\n if (CACHE.has(cacheKey)) return CACHE.get(cacheKey)!\n\n const pResult = POOL.add(() =>\n fetchMiniMetadatas(chainConnector, chaindataProvider, networkId, specVersion)\n ) as Promise<MiniMetadata[]>\n\n // keep the results in cache (unless call fails) as observables call this function a lot of times\n CACHE.set(cacheKey, pResult)\n\n try {\n return await pResult\n } catch (cause) {\n CACHE.delete(cacheKey)\n throw new Error(`Failed to fetch metadataRpc for network ${networkId}`, { cause })\n }\n}\n\nconst fetchMiniMetadatas = async (\n chainConnector: IChainConnectorDot,\n chaindataProvider: ChaindataProvider,\n chainId: DotNetworkId,\n specVersion: number\n) => {\n const start = performance.now()\n log.info(\"[miniMetadata] fetching minimetadatas for %s\", chainId)\n\n try {\n const network = await chaindataProvider.getNetworkById(chainId, \"polkadot\")\n if (!network) throw new Error(`Network ${chainId} not found in chaindataProvider`)\n\n const metadataRpc = await getMetadataRpc(chainConnector, chainId)\n\n return Promise.all(\n BALANCE_MODULES.filter((m) => m.platform === \"polkadot\").map((mod) =>\n mod.getMiniMetadata({\n networkId: chainId,\n metadataRpc,\n specVersion,\n config: network.balancesConfig?.[mod.type],\n })\n )\n )\n } finally {\n log.debug(\n \"[miniMetadata] updated miniMetadatas for %s in %sms\",\n chainId,\n (performance.now() - start).toFixed(2)\n )\n }\n}\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/balances\",\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\",\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 \"@metaplex-foundation/mpl-token-metadata\": \"^3.4.0\",\n \"@metaplex-foundation/umi\": \"^1.2.0\",\n \"@polkadot-api/utils\": \"0.2.0\",\n \"@solana/spl-token\": \"^0.4.13\",\n \"@solana/web3.js\": \"^1.98.2\",\n \"@talismn/chain-connectors\": \"workspace:*\",\n \"@talismn/chaindata-provider\": \"workspace:*\",\n \"@talismn/crypto\": \"workspace:*\",\n \"@talismn/sapi\": \"workspace:*\",\n \"@talismn/scale\": \"workspace:*\",\n \"@talismn/token-rates\": \"workspace:*\",\n \"@talismn/util\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"bignumber.js\": \"^9.1.2\",\n \"lodash-es\": \"4.17.21\",\n \"p-queue\": \"8.1.0\",\n \"polkadot-api\": \"1.13.1\",\n \"rxjs\": \"^7.8.1\",\n \"scale-ts\": \"^1.6.1\",\n \"viem\": \"^2.27.3\",\n \"zod\": \"^3.25.76\"\n },\n \"devDependencies\": {\n \"@polkadot/api-contract\": \"16.1.2\",\n \"@polkadot/types\": \"16.1.2\",\n \"@polkadot/util\": \"13.5.3\",\n \"@talismn/tsconfig\": \"workspace:*\",\n \"@types/lodash-es\": \"4.17.12\",\n \"typescript\": \"^5.6.3\"\n },\n \"peerDependencies\": {\n \"@polkadot/api-contract\": \"*\",\n \"@polkadot/types\": \"*\",\n \"@polkadot/util\": \"*\",\n \"@polkadot/util-crypto\": \"*\",\n \"@substrate/txwrapper-core\": \"*\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.ts\",\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 { EvmErc20TokenSchema } from \"@talismn/chaindata-provider\"\n\nexport const MODULE_TYPE = EvmErc20TokenSchema.shape.type.value\nexport const PLATFORM = EvmErc20TokenSchema.shape.platform.value\n\nexport type { EvmErc20TokenConfig as TokenConfig } from \"./types\"\n","import { parseEvmErc20TokenId, parseTokenId } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport { type ChainContract, erc20Abi, type PublicClient } from \"viem\"\n\nimport type { IBalance } from \"../../types\"\nimport type {\n FetchBalanceErrors,\n FetchBalanceResults,\n IBalanceModule,\n} from \"../../types/IBalanceModule\"\nimport { erc20BalancesAggregatorAbi } from \"../abis\"\nimport { BalanceFetchError, BalanceFetchNetworkError } from \"../shared/errors\"\nimport { type BalanceDef, getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`)\n\n for (const [token, addresses] of tokensWithAddresses) {\n if (token.type !== MODULE_TYPE || token.networkId !== networkId)\n throw new Error(\n `Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`\n )\n\n for (const address of addresses)\n if (!isEthereumAddress(address))\n throw new Error(\n `Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`\n )\n }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (client.chain?.contracts?.erc20Aggregator && balanceDefs.length > 1) {\n const erc20Aggregator = client.chain.contracts.erc20Aggregator as ChainContract\n return fetchWithAggregator(client, balanceDefs, erc20Aggregator.address)\n }\n\n return fetchWithoutAggregator(client, balanceDefs)\n}\n\nconst fetchWithoutAggregator = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[]\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n const results = await Promise.allSettled(\n balanceDefs.map(async ({ token, address }) => {\n try {\n const result = await client.readContract({\n abi: erc20Abi,\n address: token.contractAddress,\n functionName: \"balanceOf\",\n args: [address],\n })\n\n const balance: IBalance = {\n address,\n tokenId: token.id,\n value: result.toString(),\n source: MODULE_TYPE,\n networkId: parseEvmErc20TokenId(token.id).networkId,\n status: \"live\",\n }\n\n return balance\n } catch (err) {\n throw new BalanceFetchError(\n `Failed to get balance for token ${token.id} and address ${address} on chain ${client.chain?.id}`,\n token.id,\n address,\n err as Error\n )\n }\n })\n )\n\n return results.reduce<FetchBalanceResults>(\n (acc, result) => {\n if (result.status === \"fulfilled\") acc.success.push(result.value as IBalance)\n else {\n const error = result.reason as BalanceFetchError\n acc.errors.push({\n tokenId: error.tokenId,\n address: error.address,\n error,\n })\n }\n return acc\n },\n { success: [], errors: [] }\n )\n}\n\nconst fetchWithAggregator = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n erc20BalancesAggregatorAddress: `0x${string}`\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n try {\n const erc20Balances = await client.readContract({\n abi: erc20BalancesAggregatorAbi,\n address: erc20BalancesAggregatorAddress,\n functionName: \"balances\",\n args: [\n balanceDefs.map((b) => ({\n account: b.address,\n token: b.token.contractAddress,\n })),\n ],\n })\n\n const success = balanceDefs.map(\n (balanceDef, index): IBalance => ({\n address: balanceDef.address,\n tokenId: balanceDef.token.id,\n value: erc20Balances[index].toString(),\n source: MODULE_TYPE,\n networkId: parseTokenId(balanceDef.token.id).networkId,\n status: \"live\",\n })\n )\n return { success, errors: [] }\n } catch (err) {\n const errors = balanceDefs.map((balanceDef): FetchBalanceErrors[number] => ({\n tokenId: balanceDef.token.id,\n address: balanceDef.address,\n error: new BalanceFetchNetworkError(\n `Failed to get balances for evm-erc20 tokens on chain ${client.chain?.id}`,\n String(client.chain?.id),\n err as Error\n ),\n }))\n return { success: [], errors }\n }\n}\n","import { parseAbi } from \"viem\"\n\nexport const erc20BalancesAggregatorAbi = parseAbi([\n \"struct AccountToken {address account; address token;}\",\n \"function balances(AccountToken[] memory accountTokens) public view returns (uint256[] memory)\",\n] as const)\n","import { parseAbi } from \"viem\"\n\nexport const abiMulticall = parseAbi([\n \"struct Call { address target; bytes callData; }\",\n \"struct Call3 { address target; bool allowFailure; bytes callData; }\",\n \"struct Call3Value { address target; bool allowFailure; uint256 value; bytes callData; }\",\n \"struct Result { bool success; bytes returnData; }\",\n \"function aggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes[] memory returnData)\",\n \"function aggregate3(Call3[] calldata calls) public payable returns (Result[] memory returnData)\",\n \"function aggregate3Value(Call3Value[] calldata calls) public payable returns (Result[] memory returnData)\",\n \"function blockAndAggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)\",\n \"function getBasefee() view returns (uint256 basefee)\",\n \"function getBlockHash(uint256 blockNumber) view returns (bytes32 blockHash)\",\n \"function getBlockNumber() view returns (uint256 blockNumber)\",\n \"function getChainId() view returns (uint256 chainid)\",\n \"function getCurrentBlockCoinbase() view returns (address coinbase)\",\n \"function getCurrentBlockDifficulty() view returns (uint256 difficulty)\",\n \"function getCurrentBlockGasLimit() view returns (uint256 gaslimit)\",\n \"function getCurrentBlockTimestamp() view returns (uint256 timestamp)\",\n \"function getEthBalance(address addr) view returns (uint256 balance)\",\n \"function getLastBlockHash() view returns (bytes32 blockHash)\",\n \"function tryAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (Result[] memory returnData)\",\n \"function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)\",\n] as const)\n","export const uniswapV2PairAbi = [\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount0\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount1\",\n type: \"uint256\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"Burn\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount0\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount1\",\n type: \"uint256\",\n },\n ],\n name: \"Mint\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount0In\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount1In\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount0Out\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount1Out\",\n type: \"uint256\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"Swap\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint112\",\n name: \"reserve0\",\n type: \"uint112\",\n },\n {\n indexed: false,\n internalType: \"uint112\",\n name: \"reserve1\",\n type: \"uint112\",\n },\n ],\n name: \"Sync\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n constant: true,\n inputs: [],\n name: \"DOMAIN_SEPARATOR\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"MINIMUM_LIQUIDITY\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"PERMIT_TYPEHASH\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"allowance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"burn\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"amount0\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"amount1\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"factory\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"getReserves\",\n outputs: [\n {\n internalType: \"uint112\",\n name: \"reserve0\",\n type: \"uint112\",\n },\n {\n internalType: \"uint112\",\n name: \"reserve1\",\n type: \"uint112\",\n },\n {\n internalType: \"uint32\",\n name: \"blockTimestampLast\",\n type: \"uint32\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n name: \"initialize\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"kLast\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"mint\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"liquidity\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n ],\n name: \"nonces\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"deadline\",\n type: \"uint256\",\n },\n {\n internalType: \"uint8\",\n name: \"v\",\n type: \"uint8\",\n },\n {\n internalType: \"bytes32\",\n name: \"r\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"s\",\n type: \"bytes32\",\n },\n ],\n name: \"permit\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"price0CumulativeLast\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"price1CumulativeLast\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"skim\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount0Out\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"amount1Out\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"bytes\",\n name: \"data\",\n type: \"bytes\",\n },\n ],\n name: \"swap\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [],\n name: \"sync\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"token0\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"token1\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"totalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"transfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const\n","import type { TokenId } from \"@talismn/chaindata-provider\"\n\nimport type { Address } from \"../../types\"\n\nexport class BalanceFetchError extends Error {\n tokenId: TokenId\n address: Address\n\n constructor(message: string, tokenId: TokenId, address: Address, cause?: Error) {\n super(message)\n this.name = \"BalanceFetchError\"\n this.tokenId = tokenId\n this.address = address\n if (cause) this.cause = cause\n }\n}\nexport class BalanceFetchNetworkError extends Error {\n evmNetworkId: string | undefined\n\n constructor(message: string, evmNetworkId?: string, cause?: Error) {\n super(message)\n this.name = \"BalanceFetchNetworkError\"\n this.evmNetworkId = evmNetworkId\n if (cause) this.cause = cause\n }\n}\n","import type { TokenOfType, TokenType } from \"@talismn/chaindata-provider\"\n\nimport type { TokenPlatform, TokensWithAddresses } from \"../../types/IBalanceModule\"\n\nexport type BalanceDef<T extends TokenType = TokenType> = {\n token: TokenOfType<T>\n address: TokenPlatform<T> extends \"ethereum\" ? `0x${string}` : string\n}\n\nexport const getBalanceDefs = <T extends TokenType = TokenType>(\n addressesByToken: TokensWithAddresses\n): BalanceDef<T>[] => {\n return addressesByToken.flatMap(([token, addresses]) =>\n addresses.map((address) => ({ token, address }))\n ) as BalanceDef<T>[]\n}\n\n// esponse of getStorageAt queries:\n// if there is at least one storage entry, the results will be an array with a single object\n// if the storage has no entries in it (ex: Assets on ewx or moonbeam), the response will be an empty array\nexport type QueryStorageChange = [stateKey: `0x${string}`, value: `0x${string}`]\nexport type QueryStorageResult = [{ block: `0x${string}`; changes: QueryStorageChange[] }] | []\n","import {\n type EvmErc20Token,\n EvmErc20TokenSchema,\n evmErc20TokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign, omit } from \"lodash-es\"\nimport type { BaseError } from \"viem\"\nimport z from \"zod/v4\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { getErc20ContractData } from \"./utils\"\n\nconst TokenCacheSchema = z.discriminatedUnion(\"isValid\", [\n z.strictObject({\n id: EvmErc20TokenSchema.shape.id,\n isValid: z.literal(true),\n ...EvmErc20TokenSchema.pick({ symbol: true, decimals: true, name: true }).shape,\n }),\n z.strictObject({\n id: EvmErc20TokenSchema.shape.id,\n isValid: z.literal(false),\n }),\n])\n\ntype CachedToken = z.infer<typeof TokenCacheSchema>\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n cache,\n}) => {\n const result: EvmErc20Token[] = []\n\n for (const tokenConfig of tokens) {\n const tokenId = evmErc20TokenId(networkId, tokenConfig.contractAddress)\n const cached = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (!cached) {\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) {\n log.warn(`No client found for network ${networkId} while fetching EVM ERC20 tokens`)\n continue\n }\n\n try {\n const { name, decimals, symbol } = await getErc20ContractData(\n client,\n tokenConfig.contractAddress\n )\n\n cache[tokenId] = TokenCacheSchema.parse({\n id: tokenId,\n symbol,\n decimals,\n name,\n isValid: true,\n })\n } catch (err) {\n const msg = (err as BaseError).shortMessage\n if (\n msg.includes(\"returned no data\") ||\n msg.includes(\"is out of bounds\") ||\n msg.includes(\"reverted\")\n )\n cache[tokenId] = { id: tokenId, isValid: false }\n else\n log.warn(\n `Failed to fetch ERC20 token data for ${networkId}:${tokenConfig.contractAddress}`,\n (err as BaseError).shortMessage\n )\n continue\n }\n }\n\n const base: Pick<EvmErc20Token, \"id\" | \"type\" | \"networkId\" | \"platform\"> = {\n id: tokenId,\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n }\n\n const cached2 = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (cached2?.isValid === false) continue\n\n const token = assign(\n base,\n cached2?.isValid ? omit(cached2, [\"isValid\"]) : {},\n tokenConfig\n ) as EvmErc20Token\n\n const parsed = EvmErc20TokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid EvmErc20TokenSchema\", {\n token,\n })\n continue\n }\n\n result.push(parsed.data)\n }\n\n return result\n}\n","import {\n type Abi,\n type Client,\n ContractFunctionExecutionError,\n erc20Abi,\n erc20Abi_bytes32,\n getContract,\n hexToString,\n} from \"viem\"\n\nexport const getErc20ContractData = async (\n client: Client,\n contractAddress: `0x${string}`\n): Promise<{ symbol: string; decimals: number; name: string }> => {\n try {\n const contract = getTypedContract(client, erc20Abi, contractAddress)\n\n // biome-ignore lint/correctness/noInnerDeclarations: legacy\n // biome-ignore lint/correctness/noUnusedVariables: legacy\n var [symbol, decimals, name] = await Promise.all([\n contract.read.symbol(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n } catch (e) {\n if (e instanceof ContractFunctionExecutionError) {\n // try to perform the contract read with bytes32 symbol\n const contract = getTypedContract(client, erc20Abi_bytes32, contractAddress)\n\n // biome-ignore lint/correctness/noInnerDeclarations: legacy\n // biome-ignore lint/suspicious/noRedeclare: legacy\n var [bytesSymbol, decimals, nameSymbol] = await Promise.all([\n contract.read.symbol(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n symbol = hexToString(bytesSymbol).replace(/\\0/g, \"\").trim() // remove NULL characters\n name = hexToString(nameSymbol).replace(/\\0/g, \"\").trim() // remove NULL characters\n } else throw e\n }\n\n return { symbol, decimals, name }\n}\n\nconst getTypedContract = <TAbi extends Abi>(\n client: Client,\n abi: TAbi,\n contractAddress: `0x${string}`\n) =>\n getContract({\n address: contractAddress,\n abi,\n client: { public: client },\n })\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for ethereum tokens\")\n}\n","import { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport { encodeFunctionData, erc20Abi } from \"viem\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n if (!isEthereumAddress(from)) throw new Error(\"Invalid from address\")\n if (!isEthereumAddress(to)) throw new Error(\"Invalid to address\")\n\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, BigInt(value)],\n })\n\n return { from, to: token.contractAddress, data }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const EvmErc20BalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { EvmErc20TokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const EvmErc20TokenConfigSchema = z.strictObject({\n contractAddress: EvmErc20TokenSchema.shape.contractAddress,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type EvmErc20TokenConfig = z.infer<typeof EvmErc20TokenConfigSchema>\n","import { TokenBaseSchema } from \"@talismn/chaindata-provider\"\n\nexport const TokenConfigBaseSchema = TokenBaseSchema.partial().omit({ id: true })\n","import { EvmNativeTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { EvmNativeTokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = EvmNativeTokenSchema.shape.type.value\nexport const PLATFORM = EvmNativeTokenSchema.shape.platform.value\n","import { parseTokenId } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport type { PublicClient } from \"viem\"\n\nimport type { IBalance } from \"../../types\"\nimport type {\n FetchBalanceErrors,\n FetchBalanceResults,\n IBalanceModule,\n} from \"../../types/IBalanceModule\"\nimport { abiMulticall } from \"../abis\"\nimport { BalanceFetchError, BalanceFetchNetworkError } from \"../shared/errors\"\nimport { type BalanceDef, getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`)\n\n for (const [token, addresses] of tokensWithAddresses) {\n if (token.type !== MODULE_TYPE || token.networkId !== networkId)\n throw new Error(\n `Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`\n )\n\n for (const address of addresses)\n if (!isEthereumAddress(address))\n throw new Error(\n `Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`\n )\n }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (client.chain?.contracts?.multicall3 && balanceDefs.length > 1) {\n const multicall3 = client.chain.contracts.multicall3\n return fetchWithMulticall(client, balanceDefs, multicall3.address)\n }\n\n return fetchWithoutMulticall(client, balanceDefs)\n}\n\nconst fetchWithoutMulticall = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[]\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n const results = await Promise.allSettled(\n balanceDefs.map(async ({ token, address }) => {\n try {\n const result = await client.getBalance({ address })\n\n const balance: IBalance = {\n address,\n tokenId: token.id,\n value: result.toString(),\n source: MODULE_TYPE,\n networkId: parseTokenId(token.id).networkId,\n status: \"live\",\n }\n\n return balance\n } catch (err) {\n throw new BalanceFetchError(\n `Failed to get balance for token ${token.id} and address ${address} on chain ${client.chain?.id}`,\n token.id,\n address,\n err as Error\n )\n }\n })\n )\n\n return results.reduce<FetchBalanceResults>(\n (acc, result) => {\n if (result.status === \"fulfilled\") acc.success.push(result.value as IBalance)\n else {\n const error = result.reason as BalanceFetchError\n acc.errors.push({\n tokenId: error.tokenId,\n address: error.address,\n error,\n })\n }\n return acc\n },\n { success: [], errors: [] }\n )\n}\n\nconst fetchWithMulticall = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n multicall3Address: `0x${string}`\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n try {\n const callResults = await client.multicall({\n contracts: balanceDefs.map(({ address }) => ({\n address: multicall3Address,\n abi: abiMulticall,\n functionName: \"getEthBalance\",\n args: [address],\n })),\n })\n\n return callResults.reduce<FetchBalanceResults>(\n (acc, result, index) => {\n if (result.status === \"success\") {\n acc.success.push({\n address: balanceDefs[index].address,\n tokenId: balanceDefs[index].token.id,\n value: result.result.toString(),\n source: MODULE_TYPE,\n networkId: parseTokenId(balanceDefs[index].token.id).networkId,\n status: \"live\",\n } as IBalance)\n }\n if (result.status === \"failure\") {\n acc.errors.push({\n tokenId: balanceDefs[index].token.id,\n address: balanceDefs[index].address,\n error: new BalanceFetchError(\n `Failed to get balance for token ${balanceDefs[index].token.id} and address ${balanceDefs[index].address} on chain ${client.chain?.id}`,\n balanceDefs[index].token.id,\n balanceDefs[index].address,\n result.error\n ),\n } as FetchBalanceErrors[number])\n }\n return acc\n },\n { success: [], errors: [] }\n )\n } catch (err) {\n const errors = balanceDefs.map((balanceDef): FetchBalanceErrors[number] => ({\n tokenId: balanceDef.token.id,\n address: balanceDef.address,\n error: new BalanceFetchNetworkError(\n `Failed to get balances for evm-erc20 tokens on chain ${client.chain?.id}`,\n String(client.chain?.id),\n err as Error\n ),\n }))\n return { success: [], errors }\n }\n}\n","import {\n type EvmNativeToken,\n EvmNativeTokenSchema,\n evmNativeTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n}) => {\n // assume there is one and only one token in the array\n if (tokens.length !== 1)\n throw new Error(\n \"EVM Native module expects the nativeCurrency to be passed as a single token in the array\"\n )\n\n const token = assign(\n {\n id: evmNativeTokenId(networkId),\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n isDefault: true,\n },\n tokens[0] as TokenConfig\n ) as EvmNativeToken\n\n const parsed = EvmNativeTokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid schema\", token)\n return []\n }\n\n return [parsed.data]\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for ethereum tokens\")\n}\n","import { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n if (!isEthereumAddress(from)) throw new Error(\"Invalid from address\")\n if (!isEthereumAddress(to)) throw new Error(\"Invalid to address\")\n\n return { from, to, value, data: \"0x\" as `0x${string}` }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const EvmNativeBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const EvmNativeTokenConfigSchema = z.strictObject({\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type EvmNativeTokenConfig = z.infer<typeof EvmNativeTokenConfigSchema>\n","import { EvmUniswapV2TokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { EvmUniswapV2TokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = EvmUniswapV2TokenSchema.shape.type.value\nexport const PLATFORM = EvmUniswapV2TokenSchema.shape.platform.value\n","import { parseTokenId } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport BigNumber from \"bignumber.js\"\nimport { keyBy, uniq } from \"lodash-es\"\nimport { getContract, type PublicClient } from \"viem\"\n\nimport type { ExtraAmount } from \"../../types\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { uniswapV2PairAbi } from \"../abis\"\nimport { BalanceFetchError, BalanceFetchNetworkError } from \"../shared/errors\"\nimport { type BalanceDef, getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`)\n\n for (const [token, addresses] of tokensWithAddresses) {\n if (token.type !== MODULE_TYPE || token.networkId !== networkId)\n throw new Error(\n `Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`\n )\n\n for (const address of addresses)\n if (!isEthereumAddress(address))\n throw new Error(\n `Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`\n )\n }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n return fetchPoolBalances(client, balanceDefs)\n}\n\nconst fetchPoolBalances = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[]\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n // fetch pool specific info separately to prevent querying same contract info for multiple account addresses\n const pools = uniq(balanceDefs.map((def) => def.token.contractAddress))\n\n const [poolResults, balanceResults] = await Promise.all([\n // pool supplies and reserves\n Promise.allSettled(\n pools.map(async (address) => {\n const contract = getContract({ address, abi: uniswapV2PairAbi, client })\n\n const [totalSupply, [reserve0, reserve1]] = await Promise.all([\n contract.read.totalSupply(),\n contract.read.getReserves(),\n ])\n return { address, totalSupply, reserve0, reserve1 }\n })\n ),\n // balances for each address\n Promise.allSettled(\n balanceDefs.map(async ({ token, address }) => {\n const balance = await client.readContract({\n address: token.contractAddress,\n abi: uniswapV2PairAbi,\n functionName: \"balanceOf\",\n args: [address],\n } as const)\n\n return { pool: token.contractAddress, address, balance }\n })\n ),\n ])\n\n const poolInfo = keyBy(\n poolResults.filter((r) => r.status === \"fulfilled\").map((r) => r.value),\n (p) => p.address\n )\n\n const results = balanceDefs.reduce<FetchBalanceResults>(\n (acc, { token, address }, i) => {\n const pool = poolInfo[token.contractAddress]\n if (!pool) {\n acc.errors.push({\n tokenId: token.id,\n address,\n error: new BalanceFetchNetworkError(\n `Pool data not found for token ${token.id} at address ${token.contractAddress}`,\n parseTokenId(token.id).networkId\n ),\n })\n return acc\n }\n\n const balanceResult = balanceResults[i]\n\n if (balanceResult.status !== \"fulfilled\") {\n acc.errors.push({\n tokenId: token.id,\n address,\n error: new BalanceFetchError(\n `Failed to fetch balance for token ${token.id} at address ${address}`,\n token.id,\n address,\n balanceResult.reason as Error\n ),\n })\n return acc\n }\n\n const { totalSupply, reserve0, reserve1 } = pool\n const { balance } = balanceResult.value\n\n const extraWithLabel = (label: string, amount: string): ExtraAmount<string> => ({\n type: \"extra\",\n label,\n amount,\n })\n\n const ratio = BigNumber(String(balance)).div(totalSupply === 0n ? \"1\" : String(totalSupply))\n\n acc.success.push({\n address,\n tokenId: token.id,\n source: MODULE_TYPE,\n networkId: parseTokenId(token.id).networkId,\n status: \"live\",\n values: [\n { type: \"free\", label: \"free\", amount: String(balance) },\n extraWithLabel(\"totalSupply\", String(totalSupply)),\n extraWithLabel(\"reserve0\", String(reserve0)),\n extraWithLabel(\"reserve1\", String(reserve1)),\n extraWithLabel(\"holding0\", ratio.times(String(reserve0)).toString(10)),\n extraWithLabel(\"holding1\", ratio.times(String(reserve1)).toString(10)),\n ],\n })\n\n return acc\n },\n { success: [], errors: [] }\n )\n\n return results\n}\n","import {\n type EvmUniswapV2Token,\n EvmUniswapV2TokenSchema,\n evmUniswapV2TokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign, omit } from \"lodash-es\"\nimport type { BaseError } from \"viem\"\nimport z from \"zod/v4\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { getErc20ContractData, getUniswapV2PairContractData } from \"./utils\"\n\nconst TokenCacheSchema = z.discriminatedUnion(\"isValid\", [\n z.strictObject({\n id: EvmUniswapV2TokenSchema.shape.id,\n isValid: z.literal(true),\n ...EvmUniswapV2TokenSchema.pick({\n symbol: true,\n decimals: true,\n name: true,\n tokenAddress0: true,\n tokenAddress1: true,\n decimals0: true,\n decimals1: true,\n symbol0: true,\n symbol1: true,\n }).shape,\n }),\n z.strictObject({\n id: EvmUniswapV2TokenSchema.shape.id,\n isValid: z.literal(false),\n }),\n])\n\ntype CachedToken = z.infer<typeof TokenCacheSchema>\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n cache,\n}) => {\n const result: EvmUniswapV2Token[] = []\n\n for (const tokenConfig of tokens) {\n const tokenId = evmUniswapV2TokenId(networkId, tokenConfig.contractAddress)\n const cached = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (!cached) {\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) {\n log.warn(`No client found for network ${networkId} while fetching EVM ERC20 tokens`)\n continue\n }\n\n try {\n const { token0, token1, name, decimals } = await getUniswapV2PairContractData(\n client,\n tokenConfig.contractAddress\n )\n\n const { symbol: symbol0, decimals: decimals0 } = await getErc20ContractData(client, token0)\n const { symbol: symbol1, decimals: decimals1 } = await getErc20ContractData(client, token1)\n\n cache[tokenId] = TokenCacheSchema.parse({\n id: tokenId,\n symbol: `${symbol0}/${symbol1}`,\n decimals,\n name,\n tokenAddress0: token0,\n tokenAddress1: token1,\n decimals0,\n decimals1,\n symbol0,\n symbol1,\n isValid: true,\n })\n } catch (err) {\n const msg = (err as BaseError).shortMessage\n if (\n msg.includes(\"returned no data\") ||\n msg.includes(\"is out of bounds\") ||\n msg.includes(\"reverted\")\n ) {\n cache[tokenId] = { id: tokenId, isValid: false }\n } else {\n log.warn(\n `Failed to fetch UniswapV2 token data for ${tokenConfig.contractAddress}`,\n (err as BaseError).shortMessage\n )\n }\n continue\n }\n }\n\n const base: Pick<EvmUniswapV2Token, \"id\" | \"type\" | \"networkId\" | \"platform\"> = {\n id: tokenId,\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n }\n\n const cached2 = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (cached2?.isValid === false) continue\n\n const token = assign(\n base,\n cached2?.isValid ? omit(cached2, [\"isValid\"]) : {},\n tokenConfig\n ) as EvmUniswapV2Token\n\n const parsed = EvmUniswapV2TokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid schema\", token)\n continue\n }\n\n result.push(parsed.data)\n }\n\n return result\n}\n","import {\n type Abi,\n type Client,\n ContractFunctionExecutionError,\n erc20Abi,\n erc20Abi_bytes32,\n getContract,\n hexToString,\n} from \"viem\"\n\nimport { uniswapV2PairAbi } from \"../abis\"\n\nexport const getErc20ContractData = async (\n client: Client,\n contractAddress: `0x${string}`\n): Promise<{ symbol: string; decimals: number; name: string }> => {\n try {\n const contract = getTypedContract(client, erc20Abi, contractAddress)\n\n // biome-ignore lint/correctness/noInnerDeclarations: legacy\n // biome-ignore lint/correctness/noUnusedVariables: legacy\n var [symbol, decimals, name] = await Promise.all([\n contract.read.symbol(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n } catch (e) {\n if (e instanceof ContractFunctionExecutionError) {\n // try to perform the contract read with bytes32 symbol\n const contract = getTypedContract(client, erc20Abi_bytes32, contractAddress)\n\n // biome-ignore lint/correctness/noInnerDeclarations: legacy\n // biome-ignore lint/suspicious/noRedeclare: legacy\n var [bytesSymbol, decimals, nameSymbol] = await Promise.all([\n contract.read.symbol(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n symbol = hexToString(bytesSymbol).replace(/\\0/g, \"\").trim() // remove NULL characters\n name = hexToString(nameSymbol).replace(/\\0/g, \"\").trim() // remove NULL characters\n } else throw e\n }\n\n return { symbol, decimals, name }\n}\n\nconst getTypedContract = <TAbi extends Abi>(\n client: Client,\n abi: TAbi,\n contractAddress: `0x${string}`\n) =>\n getContract({\n address: contractAddress,\n abi,\n client: { public: client },\n })\n\nexport const getUniswapV2PairContractData = async (\n client: Client,\n contractAddress: `0x${string}`\n) => {\n const contract = getTypedContract(client, uniswapV2PairAbi, contractAddress)\n\n var [token0, token1, decimals, name] = await Promise.all([\n contract.read.token0(),\n contract.read.token1(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n\n return { token0, token1, decimals, name }\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for ethereum tokens\")\n}\n","import { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport { encodeFunctionData, erc20Abi } from \"viem\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n if (!isEthereumAddress(from)) throw new Error(\"Invalid from address\")\n if (!isEthereumAddress(to)) throw new Error(\"Invalid to address\")\n\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, BigInt(value)],\n })\n\n return { from, to: token.contractAddress, data }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const EvmUniswapV2BalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { EvmUniswapV2TokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const EvmUniswapV2TokenConfigSchema = z.strictObject({\n contractAddress: EvmUniswapV2TokenSchema.shape.contractAddress,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type EvmUniswapV2TokenConfig = z.infer<typeof EvmUniswapV2TokenConfigSchema>\n","import { SolNativeTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { SolNativeTokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = SolNativeTokenSchema.shape.type.value\nexport const PLATFORM = SolNativeTokenSchema.shape.platform.value\n","import { PublicKey } from \"@solana/web3.js\"\nimport { isSolanaAddress } from \"@talismn/crypto\"\n\nimport type { IBalance } from \"../../types\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { BalanceFetchError } from \"../shared/errors\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const connection = await connector.getConnection(networkId)\n if (!connection) throw new Error(`Could not get rpc provider for sol network ${networkId}`)\n\n for (const [token, addresses] of tokensWithAddresses) {\n if (token.type !== MODULE_TYPE || token.networkId !== networkId)\n throw new Error(\n `Invalid token type or networkId for balance module: ${token.type} on ${token.networkId}`\n )\n\n for (const address of addresses)\n if (!isSolanaAddress(address))\n throw new Error(\n `Invalid solana address for balance module: ${address} for token ${token.id}`\n )\n }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const results = await Promise.allSettled(\n balanceDefs.map(async ({ token, address }): Promise<IBalance> => {\n try {\n const publicKey = new PublicKey(address)\n const lamports = await connection.getBalance(publicKey)\n\n return {\n address: address,\n tokenId: token.id,\n value: lamports.toString(),\n source: MODULE_TYPE,\n networkId: token.networkId,\n status: \"live\",\n }\n } catch (err) {\n throw new BalanceFetchError(\n `Failed to get balance for token ${token.id} and address ${address} on chain ${networkId}`,\n token.id,\n address,\n err as Error\n )\n }\n })\n )\n\n return results.reduce<FetchBalanceResults>(\n (acc, result) => {\n if (result.status === \"fulfilled\") acc.success.push(result.value as IBalance)\n else {\n const error = result.reason as BalanceFetchError\n acc.errors.push({\n tokenId: error.tokenId,\n address: error.address,\n error,\n })\n }\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","import {\n type SolNativeToken,\n SolNativeTokenSchema,\n solNativeTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n}) => {\n // assume there is one and only one token in the array\n if (tokens.length !== 1)\n throw new Error(\n \"EVM Native module expects the nativeCurrency to be passed as a single token in the array\"\n )\n\n const token = assign(\n {\n id: solNativeTokenId(networkId),\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n isDefault: true,\n },\n tokens[0] as TokenConfig\n ) as SolNativeToken\n\n const parsed = SolNativeTokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid schema\", token)\n return []\n }\n\n return [parsed.data]\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for sol-native tokens\")\n}\n","import { PublicKey, SystemProgram } from \"@solana/web3.js\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const fromPubkey = new PublicKey(from)\n\n const transferIx = SystemProgram.transfer({\n fromPubkey,\n toPubkey: new PublicKey(to),\n lamports: Number(value),\n })\n\n return [transferIx]\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SolNativeBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SolNativeTokenConfigSchema = z.strictObject({\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SolNativeTokenConfig = z.infer<typeof SolNativeTokenConfigSchema>\n","import { SolSplTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport const MODULE_TYPE = SolSplTokenSchema.shape.type.value\nexport const PLATFORM = SolSplTokenSchema.shape.platform.value\n\nexport type { SolSplTokenConfig as TokenConfig } from \"./types\"\n","import { PublicKey } from \"@solana/web3.js\"\nimport { solSplTokenId } from \"@talismn/chaindata-provider\"\nimport { isNotNil } from \"@talismn/util\"\nimport { keyBy, uniq } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalance } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { setDetectedTokenIds } from \"../shared/detectedTokens\"\nimport { MODULE_TYPE } from \"./config\"\n\nconst SPL_PROGRAM_ID = \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const connection = await connector.getConnection(networkId)\n if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`)\n\n const accountAddresses = uniq(tokensWithAddresses.flatMap(([, addresses]) => addresses))\n\n const balancesPerAddress = await Promise.all(\n accountAddresses.map(async (address) => {\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey(address), {\n programId: new PublicKey(SPL_PROGRAM_ID), // SPL Token Program ID\n })\n\n const balances = tokenAccounts.value\n .map((d): IBalance | null => {\n try {\n const mintAddress = d.account.data.parsed.info.mint\n const value = d.account.data.parsed.info.tokenAmount.amount ?? \"0\"\n return {\n tokenId: solSplTokenId(networkId, mintAddress),\n networkId,\n address,\n source: MODULE_TYPE,\n status: \"live\",\n value,\n }\n } catch {\n log.warn(\"Failed to parse token amount\", {\n address,\n d,\n })\n return null\n }\n })\n .filter(isNotNil)\n\n // allows the wallet to detect new tokens, and enable them automatically\n setDetectedTokenIds(\n address,\n MODULE_TYPE,\n balances.map((b) => b.tokenId)\n )\n\n return [address, balances] as const\n })\n )\n\n const allBalancesByKey = keyBy(\n balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),\n (b) => getBalanceKey(b.tokenId, b.address)\n )\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n // return a balance entry for all token/address pairs that were requested\n const success = balanceDefs.map((bd): IBalance => {\n const found = allBalancesByKey[getBalanceKey(bd.token.id, bd.address)]\n return (\n found ?? {\n tokenId: bd.token.id,\n networkId: bd.token.networkId,\n address: bd.address,\n source: MODULE_TYPE,\n status: \"live\",\n value: \"0\",\n }\n )\n })\n\n // return only the balances that match the tokens we are interested in\n return { success, errors: [] } // TODO output errors if any\n}\n\nconst getBalanceKey = (tokenId: string, address: string) => `${tokenId}:${address}`\n","import type { DotNetworkId } from \"@talismn/chaindata-provider\"\nimport {\n decAnyMetadata,\n getDynamicBuilder,\n getLookupFn,\n type ScaleStorageCoder,\n unifyMetadata,\n} from \"@talismn/scale\"\n\nimport log from \"../../log\"\nimport type { MiniMetadata } from \"../../types\"\n\ntype NetworkCoders = { [key: string]: [string, string] }\n\ntype NetworkStorageCoders<TCoders extends NetworkCoders> = {\n [Property in keyof TCoders]: ScaleStorageCoder | undefined\n}\n\nexport const buildNetworkStorageCoders = <TCoders extends { [key: string]: [string, string] }>(\n chainId: DotNetworkId,\n miniMetadata: MiniMetadata,\n coders: TCoders\n): NetworkStorageCoders<TCoders> | null => {\n if (!miniMetadata.data) return null\n\n const metadata = unifyMetadata(decAnyMetadata(miniMetadata.data))\n\n try {\n const scaleBuilder = getDynamicBuilder(getLookupFn(metadata))\n const builtCoders = Object.fromEntries(\n Object.entries(coders).flatMap(\n ([key, moduleMethodOrFn]: [\n keyof TCoders,\n [string, string] | ((params: { chainId: string }) => [string, string]),\n ]) => {\n const [module, method] =\n typeof moduleMethodOrFn === \"function\"\n ? moduleMethodOrFn({ chainId })\n : moduleMethodOrFn\n try {\n return [[key, scaleBuilder.buildStorage(module, method)] as const]\n } catch (cause) {\n log.trace(\n `Failed to build SCALE coder for chain ${chainId} (${module}::${method})`,\n cause\n )\n return []\n }\n }\n )\n ) as {\n [Property in keyof TCoders]: ReturnType<(typeof scaleBuilder)[\"buildStorage\"]> | undefined\n }\n\n return builtCoders\n } catch (cause) {\n log.error(\n `Failed to build SCALE coders for chain ${chainId} (${JSON.stringify(coders)})`,\n cause\n )\n }\n\n return null\n}\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport { parseMetadataRpc, toHex } from \"@talismn/scale\"\n\nexport const fetchRuntimeCallResult = async <T>(\n connector: IChainConnectorDot,\n networkId: string,\n metadataRpc: `0x${string}`,\n apiName: string,\n method: string,\n args: unknown[]\n): Promise<T> => {\n try {\n const { builder } = parseMetadataRpc(metadataRpc)\n const call = builder.buildRuntimeCall(apiName, method)\n\n const hex = await connector.send<string>(networkId, \"state_call\", [\n `${apiName}_${method}`,\n toHex(call.args.enc(args)),\n ])\n\n return call.value.dec(hex) as T\n } catch (cause) {\n throw new Error(`Error fetching runtime call on ${networkId} for ${apiName}.${method}`, {\n cause,\n })\n }\n}\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport type { DotNetworkId } from \"@talismn/chaindata-provider\"\nimport { isNotNil } from \"@talismn/util\"\nimport { toPairs } from \"lodash-es\"\nimport { Observable, of } from \"rxjs\"\n\nimport type { QueryStorageChange, QueryStorageResult } from \"./types\"\n\nexport type MaybeStateKey = `0x${string}` | null\n\nexport type RpcQueryPack<T> = {\n stateKeys: MaybeStateKey[]\n decodeResult: (changes: MaybeStateKey[]) => T\n}\n\ntype QueryStorageResultContent = QueryStorageResult[0]\n\nexport const fetchRpcQueryPack = async <T>(\n connector: IChainConnectorDot,\n networkId: DotNetworkId,\n queries: RpcQueryPack<T>[]\n) => {\n const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(isNotNil)\n\n // doing a query without keys would throw an error => return early\n if (!allStateKeys.length)\n return queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null)))\n\n const [result] = await connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [\n allStateKeys,\n ])\n\n return decodeRpcQueryPack(queries, result)\n}\n\nexport const getRpcQueryPack$ = <T>(\n connector: IChainConnectorDot,\n networkId: DotNetworkId,\n queries: RpcQueryPack<T>[],\n timeout: number | false = false\n): Observable<T[]> => {\n const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(isNotNil)\n\n // doing a query without keys would throw an error => return early\n if (!allStateKeys.length)\n return of(queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null))))\n\n return new Observable<T[]>((subscriber) => {\n // first subscription callback includes results for all state keys, but further callbacks will only include the ones that changed\n // => we need to keep all results in memory and update them after each callback, so we can emit the full result set each time\n const changesCache: Record<`0x${string}`, `0x${string}`> = {}\n\n const promUnsub = connector.subscribe(\n networkId,\n \"state_subscribeStorage\",\n \"state_storage\",\n [allStateKeys],\n (error, result: QueryStorageResultContent) => {\n if (error) subscriber.error(error)\n else if (result) {\n // update the cache\n for (const [stateKey, encodedResult] of result.changes)\n changesCache[stateKey] = encodedResult\n\n // regenerate the full changes array\n const changes = toPairs(changesCache) as QueryStorageChange[]\n\n // decode and emit results for all queries\n subscriber.next(decodeRpcQueryPack(queries, { block: result.block, changes }))\n }\n },\n timeout\n )\n\n return () => {\n promUnsub.then((unsub) => unsub(\"state_unsubscribeStorage\"))\n }\n })\n}\n\nconst decodeRpcQueryPack = <T>(\n queries: RpcQueryPack<T>[],\n result: QueryStorageResultContent\n): T[] => {\n return queries.reduce((acc, { stateKeys, decodeResult }) => {\n const changes = stateKeys.map((stateKey) => {\n if (!stateKey || !result) return null\n\n const change = result.changes.find(([key]) => key === stateKey)\n if (!change) return null\n\n return change[1]\n })\n\n acc.push(decodeResult(changes))\n\n return acc\n }, [] as T[])\n}\n","import { parseMetadataRpc, type UnifiedMetadata } from \"@talismn/scale\"\n\nexport const hasStorageItem = (\n metadata: UnifiedMetadata,\n palletName: string,\n itemName: string\n): boolean => {\n const pallet = metadata.pallets.find((p) => p.name === palletName)\n if (!pallet || !pallet.storage) return false\n return pallet.storage.items.some((item) => item.name === itemName)\n}\n\nexport const hasStorageItems = (\n metadata: UnifiedMetadata,\n palletName: string,\n itemNames: string[]\n): boolean => {\n const pallet = metadata.pallets.find((p) => p.name === palletName)\n if (!pallet || !pallet.storage) return false\n return itemNames.every((itemName) => pallet.storage?.items.some((item) => item.name === itemName))\n}\n\nexport const hasRuntimeApi = (\n metadata: UnifiedMetadata,\n apiName: string,\n method: string\n): boolean => {\n const api = metadata.apis.find((api) => api.name === apiName)\n if (!api || !api.methods) return false\n return api.methods.some((m) => m.name === method)\n}\n\nexport const getConstantValue = <T>(\n metadataRpc: `0x${string}`,\n pallet: string,\n constant: string\n) => {\n const { unifiedMetadata, builder } = parseMetadataRpc(metadataRpc)\n\n const codec = builder.buildConstant(pallet, constant)\n\n const encodedValue = unifiedMetadata.pallets\n .find(({ name }) => name === pallet)\n ?.constants.find(({ name }) => name === constant)?.value\n\n if (!encodedValue) throw new Error(`Constant ${pallet}.${constant} not found`)\n\n return codec.dec(encodedValue) as T\n}\n\nexport const tryGetConstantValue = <T>(\n metadataRpc: `0x${string}`,\n pallet: string,\n constant: string\n) => {\n const { unifiedMetadata, builder } = parseMetadataRpc(metadataRpc)\n\n const encodedValue = unifiedMetadata.pallets\n .find(({ name }) => name === pallet)\n ?.constants.find(({ name }) => name === constant)?.value\n\n if (!encodedValue) return null\n\n const codec = builder.buildConstant(pallet, constant)\n\n return codec.dec(encodedValue) as T\n}\n","import { parseTokenId, type TokenId, type TokenType } from \"@talismn/chaindata-provider\"\nimport { isEqual } from \"lodash-es\"\nimport { BehaviorSubject, distinctUntilChanged, map } from \"rxjs\"\n\nconst tokenIdsByAddress = new BehaviorSubject<Record<string, TokenId[]>>({})\n\nexport const setDetectedTokenIds = (address: string, type: TokenType, tokenIds: TokenId[]) => {\n // keep token ids from other token types (will be useful once we add token2022)\n const otherTokens =\n tokenIdsByAddress.value[address]?.filter((id) => parseTokenId(id).type !== type) ?? []\n\n tokenIdsByAddress.next({\n ...tokenIdsByAddress.value,\n [address]: otherTokens.concat(tokenIds).sort(),\n })\n}\n\nexport const getDetectedTokensIds$ = (address: string) =>\n tokenIdsByAddress.pipe(\n map((ownedTokens) => ownedTokens[address] ?? []),\n distinctUntilChanged<TokenId[]>(isEqual)\n )\n","import { deserializeMetadata } from \"@metaplex-foundation/mpl-token-metadata\"\nimport { publicKey, sol } from \"@metaplex-foundation/umi\"\nimport { MintLayout } from \"@solana/spl-token\"\nimport { PublicKey } from \"@solana/web3.js\"\nimport type { IChainConnectorSol } from \"@talismn/chain-connectors\"\nimport {\n parseSolSplTokenId,\n type SolSplToken,\n SolSplTokenSchema,\n solSplTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign, omit } from \"lodash-es\"\nimport z from \"zod/v4\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\nconst TokenCacheSchema = z.discriminatedUnion(\"isValid\", [\n z.strictObject({\n id: SolSplTokenSchema.shape.id,\n isValid: z.literal(true),\n ...SolSplTokenSchema.pick({ symbol: true, decimals: true, name: true, logo: true }).shape,\n }),\n z.strictObject({\n id: SolSplTokenSchema.shape.id,\n isValid: z.literal(false),\n }),\n])\n\ntype CachedToken = z.infer<typeof TokenCacheSchema>\n\nconst METAPLEX_PROGRAM_ID = new PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\")\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n cache,\n}) => {\n const result: SolSplToken[] = []\n\n for (const tokenConfig of tokens) {\n const tokenId = solSplTokenId(networkId, tokenConfig.mintAddress)\n let cached = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (!cached) {\n const tokenInfo = await fetchOnChainTokenData(connector, tokenId)\n if (tokenInfo) cache[tokenId] = tokenInfo\n }\n\n cached = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (cached?.isValid === false) continue\n\n const base: Pick<SolSplToken, \"id\" | \"type\" | \"networkId\" | \"platform\"> = {\n id: tokenId,\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n }\n\n const token = assign(\n base,\n cached?.isValid ? omit(cached, [\"isValid\"]) : {},\n tokenConfig\n ) as SolSplToken\n\n const parsed = SolSplTokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid SolSplTokenSchema\", {\n token,\n })\n continue\n }\n\n result.push(parsed.data)\n }\n\n return result\n}\n\nconst ERROR_NO_MINT = \"No mint info available\"\nconst ERROR_NO_METADATA = \"No metadata account found\"\nconst ERROR_INVALID_DATA = \"Invalid on-chain data\"\n\nconst fetchOnChainTokenData = async (connector: IChainConnectorSol, tokenId: string) => {\n try {\n const { networkId, mintAddress } = parseSolSplTokenId(tokenId)\n\n const connection = await connector.getConnection(networkId)\n if (!connection) {\n log.warn(`No connection found for network ${networkId}`)\n return null\n }\n\n const mintPubKey = new PublicKey(mintAddress)\n const mintInfo = await connection.getAccountInfo(mintPubKey)\n if (!mintInfo?.data) throw new Error(ERROR_NO_MINT)\n const mint = MintLayout.decode(mintInfo.data)\n\n const [metadataPDA] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"metadata\"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],\n METAPLEX_PROGRAM_ID\n )\n\n // 3. Fetch metadata account directly (traditional way)\n const metadataAccount = await connection.getAccountInfo(new PublicKey(metadataPDA))\n if (!metadataAccount) throw new Error(ERROR_NO_METADATA)\n\n const metadata = deserializeMetadata({\n publicKey: publicKey(metadataPDA),\n executable: metadataAccount.executable,\n owner: publicKey(metadataAccount.owner),\n lamports: sol(metadataAccount.lamports),\n data: metadataAccount.data,\n })\n\n const parsed = TokenCacheSchema.safeParse({\n id: tokenId,\n symbol: metadata.symbol.trim(),\n name: metadata.name.trim(),\n decimals: mint.decimals,\n isValid: true,\n })\n\n if (!parsed.success) throw new Error(ERROR_INVALID_DATA)\n\n return parsed.data\n } catch (err) {\n const msg = (err as Error).message\n\n if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))\n return TokenCacheSchema.parse({\n id: tokenId,\n isValid: false,\n })\n\n log.warn(\"Failed to fetch sol-spl token data for %s\", tokenId, { err })\n }\n\n return null\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for solana tokens\")\n}\n","import {\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n getAccount,\n getAssociatedTokenAddress,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\"\nimport { type Connection, PublicKey, type TransactionInstruction } from \"@solana/web3.js\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] =\n async ({ from, to, value, token, connector }) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const connection = await connector.getConnection(token.networkId)\n\n const instructions: TransactionInstruction[] = []\n\n const mint = new PublicKey(token.mintAddress)\n const fromWallet = new PublicKey(from)\n const toWallet = new PublicKey(to)\n\n // Get associated token accounts\n const fromTokenAccount = await getAssociatedTokenAddress(mint, fromWallet)\n const toTokenAccount = await getAssociatedTokenAddress(mint, toWallet)\n\n // Create the target token account if it doesn't exist\n if (!(await tokenAccountExists(connection, toTokenAccount))) {\n instructions.push(\n createAssociatedTokenAccountInstruction(\n fromWallet, // funder\n toTokenAccount,\n toWallet,\n mint\n )\n )\n }\n\n // Transfer the tokens\n instructions.push(\n createTransferInstruction(\n fromTokenAccount,\n toTokenAccount,\n fromWallet,\n BigInt(value),\n [],\n TOKEN_PROGRAM_ID\n )\n )\n\n return instructions\n }\n\nconst tokenAccountExists = async (connection: Connection, address: PublicKey) => {\n try {\n await getAccount(connection, address)\n return true\n } catch {\n return false\n }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SolSplBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SolSplTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SolSplTokenConfigSchema = z.strictObject({\n mintAddress: SolSplTokenSchema.shape.mintAddress,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SolSplTokenConfig = z.infer<typeof SolSplTokenConfigSchema>\n","import { SubAssetsTokenSchema } from \"@talismn/chaindata-provider\"\nimport type z from \"zod/v4\"\n\nimport type { SubAssetsTokenConfigSchema } from \"./types\"\n\nexport const MODULE_TYPE = SubAssetsTokenSchema.shape.type.value\nexport const PLATFORM = SubAssetsTokenSchema.shape.platform.value\n\nexport type TokenConfig = z.infer<typeof SubAssetsTokenConfigSchema>\n","import { decodeScale, type MetadataBuilder } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\n\nimport log from \"../../log\"\nimport type { AmountWithLabel, IBalance, MiniMetadata } from \"../../types\"\nimport { type BalanceDef, buildNetworkStorageCoders } from \"../shared\"\nimport type { MaybeStateKey, RpcQueryPack } from \"../shared/rpcQueryPack\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const buildQueries = (\n networkId: string,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n miniMetadata: MiniMetadata\n): Array<RpcQueryPack<IBalance>> => {\n const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {\n storage: [\"Assets\", \"Account\"],\n })\n\n return balanceDefs\n .map(({ token, address }): RpcQueryPack<IBalance> | null => {\n const scaleCoder = networkStorageCoders?.storage\n const stateKey =\n tryEncode(scaleCoder, Number(token.assetId), address) ?? // Asset Hub\n tryEncode(scaleCoder, BigInt(token.assetId), address) // Astar\n\n if (!stateKey) {\n log.warn(\n `Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`\n )\n return null\n }\n\n const decodeResult = (changes: MaybeStateKey[]) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n balance?: bigint\n\n // On other networks than Astar\n is_frozen?: boolean\n\n // Astar specific fields\n reason?: { type?: \"Sufficient\" }\n status?: { type?: \"Liquid\" } | { type?: \"Frozen\" }\n extra?: undefined\n }\n\n const decoded = decodeScale<DecodedType>(\n scaleCoder,\n changes[0],\n `Failed to decode substrate-assets balance on chain ${networkId}`\n ) ?? {\n balance: 0n,\n is_frozen: false,\n reason: { type: \"Sufficient\" },\n status: { type: \"Liquid\" },\n extra: undefined,\n }\n\n const isFrozen = decoded?.status?.type === \"Frozen\"\n const amount = (decoded?.balance ?? 0n).toString()\n\n // due to the following balance calculations, which are made in the `Balance` type:\n //\n // total balance = (free balance) + (reserved balance)\n // transferable balance = (free balance) - (frozen balance)\n //\n // when `isFrozen` is true we need to set **both** the `free` and `frozen` amounts\n // of this balance to the value we received from the RPC.\n //\n // if we only set the `frozen` amount, then the `total` calculation will be incorrect!\n const free = amount\n const frozen = token.isFrozen || isFrozen ? amount : \"0\"\n\n // include balance values even if zero, so that newly-zero values overwrite old values\n const balanceValues: Array<AmountWithLabel<string>> = [\n { type: \"free\", label: \"free\", amount: free.toString() },\n { type: \"locked\", label: \"frozen\", amount: frozen.toString() },\n ]\n\n const balance: IBalance = {\n source: \"substrate-assets\",\n status: \"live\",\n address,\n networkId,\n tokenId: token.id,\n values: balanceValues,\n }\n\n return balance\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n .filter(isNotNil)\n}\n\ntype ScaleStorageCoder = ReturnType<MetadataBuilder[\"buildStorage\"]>\n\nconst tryEncode = (scaleCoder: ScaleStorageCoder | undefined, ...args: unknown[]) => {\n try {\n return scaleCoder?.keys?.enc?.(...args) as MaybeStateKey\n } catch {\n return null\n }\n}\n","import log from \"../../log\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { buildQueries } from \"./buildQueries\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n const balances = await fetchRpcQueryPack(connector, networkId, queries)\n\n return balanceDefs.reduce<FetchBalanceResults>(\n (acc, def) => {\n const balance = balances.find(\n (b) => b?.address === def.address && b?.tokenId === def.token.id\n )\n if (balance) acc.success.push(balance)\n //if no entry consider empty balance\n else\n acc.success.push({\n address: def.address,\n networkId,\n tokenId: def.token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values: [\n { type: \"free\", label: \"free\", amount: \"0\" },\n { type: \"locked\", label: \"frozen\", amount: \"0\" },\n ],\n })\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","import {\n type AnyMiniMetadata,\n type SubAssetsToken,\n SubAssetsTokenSchema,\n subAssetTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { getStorageKeyPrefix, parseMetadataRpc } from \"@talismn/scale\"\nimport { assign, keyBy, keys } from \"lodash-es\"\nimport type { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { QueryStorageResult } from \"../shared\"\nimport { MODULE_TYPE, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n miniMetadata,\n}) => {\n const anyMiniMetadata = miniMetadata as AnyMiniMetadata\n if (!anyMiniMetadata?.data) return []\n\n const { builder } = parseMetadataRpc(anyMiniMetadata.data)\n const assetCodec = builder.buildStorage(\"Assets\", \"Asset\")\n const metadataCodec = builder.buildStorage(\"Assets\", \"Metadata\")\n\n const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([\n connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"Assets\", \"Asset\"),\n ]),\n connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"Assets\", \"Metadata\"),\n ]),\n ])\n\n const [assetStorageResults, metadataStorageResults] = await Promise.all([\n connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [allAssetStorageKeys]),\n connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [allMetadataStorageKeys]),\n ])\n\n const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : []\n const metadataStorageEntries = metadataStorageResults.length\n ? metadataStorageResults[0].changes\n : []\n\n const assetByAssetId = keyBy(\n assetStorageEntries.map(([key, value]) => {\n const [assetId] = assetCodec.keys.dec(key) as [number]\n const asset = assetCodec.value.dec(value) as {\n is_sufficient: boolean\n min_balance: bigint\n }\n return { assetId, existentialDeposit: asset.min_balance, isSufficient: asset.is_sufficient }\n }),\n (a) => a.assetId\n )\n\n const metadataByAssetId = keyBy(\n metadataStorageEntries.map(([key, value]) => {\n const [assetId] = metadataCodec.keys.dec(key) as [number]\n const metadata = metadataCodec.value.dec(value) as {\n decimals?: number\n deposit?: bigint\n is_frozen?: boolean\n name?: Binary\n symbol?: Binary\n }\n return {\n assetId,\n decimals: metadata.decimals,\n isFrozen: metadata.is_frozen,\n name: metadata.name?.asText(),\n symbol: metadata.symbol?.asText(),\n }\n }),\n (a) => a.assetId\n )\n\n const allTokens = keys(assetByAssetId).map((assetId) =>\n assign({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? undefined)\n )\n\n const configTokenByAssetId = keyBy(tokens, (t) => t.assetId)\n\n return (\n allTokens\n .map(\n (asset): SubAssetsToken => ({\n id: subAssetTokenId(networkId, String(asset.assetId)),\n type: MODULE_TYPE,\n platform: \"polkadot\",\n networkId,\n assetId: String(asset.assetId),\n isSufficient: asset.isSufficient,\n isFrozen: asset.isFrozen,\n name: asset.name,\n symbol: asset.symbol as string,\n decimals: asset.decimals ?? 0,\n existentialDeposit: String(asset.existentialDeposit),\n isDefault: true,\n })\n )\n // keep all tokens listed in the config + all tokens marked as sufficient\n .filter((token) => {\n const configToken = configTokenByAssetId[token.assetId]\n return configToken || token.isSufficient\n })\n // apply config overrides\n .map((token) => {\n const configToken = configTokenByAssetId[token.assetId]\n return configToken ? assign({}, token, configToken) : token\n })\n // validate results\n .filter((t) => {\n const parsed = SubAssetsTokenSchema.safeParse(t)\n // if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE}`, t)\n\n return parsed.success\n })\n )\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, hasStorageItems } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc),\n extra: null,\n } as AnyMiniMetadata\n}\n\nconst getData = (metadataRpc: `0x${string}`): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n // ensure the network has all the required bits\n if (!hasStorageItems(unifiedMetadata, \"Assets\", [\"Account\", \"Asset\", \"Metadata\"])) return null\n\n compactMetadata(metadata, [{ pallet: \"Assets\", items: [\"Account\", \"Asset\", \"Metadata\"] }])\n\n return encodeMetadata(metadata)\n}\n","import { evmErc20TokenId, type NetworkList, type TokenList } from \"@talismn/chaindata-provider\"\nimport {\n newTokenRates,\n type TokenRateCurrency,\n type TokenRates,\n type TokenRatesList,\n} from \"@talismn/token-rates\"\nimport {\n BigMath,\n isArrayOf,\n isBigInt,\n type NonFunctionProperties,\n planckToTokens,\n} from \"@talismn/util\"\nimport BigNumber from \"bignumber.js\"\n\nimport log from \"../log\"\nimport type { SubDTaoBalanceMeta } from \"../modules\"\nimport { getDTaoTokenRates } from \"../modules/substrate-dtao\"\nimport type {\n Amount,\n AmountWithLabel,\n BalanceJson,\n BalanceJsonList,\n BalanceStatusTypes,\n ExtraAmount,\n IBalance,\n LockedAmount,\n} from \"./balancetypes\"\n\ntype FormattedAmount<GenericAmount extends AmountWithLabel<TLabel>, TLabel extends string> = Omit<\n GenericAmount,\n \"amount\"\n> & {\n amount: BalanceFormatter\n}\n\nexport function excludeFromTransferableAmount(\n locks:\n | Amount\n | FormattedAmount<LockedAmount<string>, string>\n | Array<FormattedAmount<LockedAmount<string>, string>>\n): bigint {\n if (typeof locks === \"string\") return BigInt(locks)\n if (!Array.isArray(locks)) locks = [locks]\n\n return locks\n .filter((lock) => lock.includeInTransferable !== true)\n .map((lock) => lock.amount.planck)\n .reduce((max, lock) => BigMath.max(max, lock), 0n)\n}\n\nexport function excludeFromFeePayableLocks(\n locks: Amount | LockedAmount<string> | Array<LockedAmount<string>>\n): Array<LockedAmount<string>> {\n if (typeof locks === \"string\") return []\n if (!Array.isArray(locks)) locks = [locks]\n\n return locks.filter((lock) => lock.excludeFromFeePayable)\n}\n\nexport function includeInTotalExtraAmount(\n extra?:\n | FormattedAmount<ExtraAmount<string>, string>\n | Array<FormattedAmount<ExtraAmount<string>, string>>\n): bigint {\n if (!extra) return 0n\n if (!Array.isArray(extra)) extra = [extra]\n\n return extra\n .filter((extra) => extra.includeInTotal)\n .map((extra) => extra.amount.planck)\n .reduce((a, b) => a + b, 0n)\n}\n\n/** A utility type used to extract the underlying `BalanceType` of a specific source from a generalised `BalanceJson` */\nexport type NarrowBalanceType<S extends IBalance, P> = S extends { source: P } ? S : never\nexport type BalanceSource = BalanceJson[\"source\"]\n\n/** TODO: Remove this in favour of a frontend-friendly `ChaindataProvider` */\nexport type HydrateDb = Partial<{\n networks: NetworkList\n tokens: TokenList\n tokenRates: TokenRatesList\n}>\n\nexport type BalanceSearchQuery =\n | Partial<NonFunctionProperties<Balance>>\n | ((balance: Balance) => boolean)\n\n/**\n * A collection of balances.\n */\nexport class Balances {\n //\n // Properties\n //\n\n #balances: Array<Balance> = []\n\n //\n // Methods\n //\n\n constructor(\n balances: Balances | BalanceJsonList | Balance[] | IBalance[] | BalanceJson[] | Balance,\n hydrate?: HydrateDb\n ) {\n // handle Balances (convert to Balance[])\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n if (balances instanceof Balances) return new Balances(balances.each, hydrate)\n\n // handle Balance (convert to Balance[])\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n if (balances instanceof Balance) return new Balances([balances], hydrate)\n\n // handle BalanceJsonList (the only remaining non-array type of balances) (convert to BalanceJson[])\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n if (!Array.isArray(balances)) return new Balances(Object.values(balances), hydrate)\n\n // handle no balances\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n if (balances.length === 0) return this\n\n // handle BalanceJson[]\n if (!isArrayOf(balances, Balance))\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n return new Balances(\n balances.map((storage) => new Balance(storage)),\n hydrate\n )\n\n // handle Balance[]\n this.#balances = balances\n if (hydrate !== undefined) this.hydrate(hydrate)\n }\n\n /**\n * Calling toJSON on a collection of balances will return the underlying BalanceJsonList.\n */\n toJSON = (): BalanceJsonList =>\n Object.fromEntries(\n this.#balances\n .map((balance) => {\n try {\n return [balance.id, balance.toJSON()]\n } catch (error) {\n log.error(\"Failed to convert balance to JSON\", error, { id: balance.id, balance })\n return null\n }\n })\n .filter(Array.isArray)\n );\n\n /**\n * Allows the collection to be iterated over.\n *\n * @example\n * [...balances].forEach(balance => { // do something // })\n *\n * @example\n * for (const balance of balances) {\n * // do something\n * }\n */\n [Symbol.iterator] = () =>\n // Create an array of the balances in this collection and return the result of its iterator.\n this.#balances[Symbol.iterator]()\n\n /**\n * Hydrates all balances in this collection.\n *\n * @param sources - The sources to hydrate from.\n */\n hydrate = (sources: HydrateDb) => {\n this.#balances.map((balance) => balance.hydrate(sources))\n }\n\n /**\n * Retrieve a balance from this collection by id.\n *\n * @param id - The id of the balance to fetch.\n * @returns The balance if one exists, or none.\n */\n get = (id: string): Balance | null => this.#balances.find((balance) => balance.id === id) ?? null\n\n /**\n * Retrieve balances from this collection by search query.\n *\n * @param query - The search query.\n * @returns All balances which match the query.\n */\n find = (query: BalanceSearchQuery | BalanceSearchQuery[]): Balances => {\n // construct filter\n const queryArray: BalanceSearchQuery[] = Array.isArray(query) ? query : [query]\n const orQueries = queryArray.map((query) =>\n typeof query === \"function\" ? query : Object.entries(query)\n )\n\n // filter balances\n const filter = (balance: Balance) =>\n orQueries.some((query) =>\n typeof query === \"function\"\n ? query(balance)\n : query.every(([key, value]) => balance[key as keyof BalanceSearchQuery] === value)\n )\n\n // return filter matches\n return new Balances([...this].filter(filter))\n }\n\n /**\n * Filters this collection to exclude token balances where the token has a `mirrorOf` field\n * and another balance exists in this collection for the token specified by the `mirrorOf` field.\n */\n filterMirrorTokens = (): Balances => new Balances([...this].filter(filterMirrorTokens))\n\n /**\n * Filters this collection to only include balances which are not zero AND have a fiat conversion rate.\n */\n filterNonZeroFiat = (\n type:\n | \"total\"\n | \"free\"\n | \"reserved\"\n | \"locked\"\n | \"frozen\"\n | \"transferable\"\n | \"unavailable\"\n | \"feePayable\",\n currency: TokenRateCurrency\n ): Balances => {\n const filter = (balance: Balance) => (balance[type].fiat(currency) ?? 0) > 0\n return this.find(filter)\n }\n\n /**\n * Add some balances to this collection.\n * Added balances take priority over existing balances.\n * The aggregation of the two collections is returned.\n * The original collection is not mutated.\n *\n * @param balances - Either a balance or collection of balances to add.\n * @returns The new collection of balances.\n */\n add = (balances: Balances | Balance): Balances => {\n // handle single balance\n if (balances instanceof Balance) return this.add(new Balances(balances))\n\n // merge balances\n const mergedBalances = Object.fromEntries(\n this.#balances.map((balance) => [balance.id, balance])\n )\n // biome-ignore lint/suspicious/useIterableCallbackReturn: legacy\n // biome-ignore lint/suspicious/noAssignInExpressions: legacy\n balances.each.forEach((balance) => (mergedBalances[balance.id] = balance))\n\n // return new balances\n return new Balances(Object.values(mergedBalances))\n }\n\n /**\n * Remove balances from this collection by id.\n * A new collection without these balances is returned.\n * The original collection is not mutated.\n *\n * @param ids - The id(s) of the balances to remove.\n * @returns The new collection of balances.\n */\n remove = (ids: string[] | string): Balances => {\n // handle single id\n if (!Array.isArray(ids)) return this.remove([ids])\n\n // merge and return new balances\n return new Balances(this.#balances.filter((balance) => !ids.includes(balance.id)))\n }\n\n // TODO: Add some more useful aggregator methods\n\n get each() {\n return [...this]\n }\n\n /** @deprecated use each instead */\n get sorted() {\n return this.each\n }\n\n /**\n * Get the number of balances in this collection.\n *\n * @returns The number of balances in this collection.\n */\n get count() {\n return [...this].length\n }\n\n /**\n * Get the summed value of balances in this collection.\n * TODO: Sum up token amounts AND fiat amounts\n *\n * @example\n * // Get the sum of all transferable balances in usd.\n * balances.sum.fiat('usd').transferable\n */\n get sum() {\n return new SumBalancesFormatter(this)\n }\n}\n\nexport const getBalanceId = (balance: Pick<IBalance, \"address\" | \"tokenId\">) => {\n const { address, tokenId } = balance\n return [address, tokenId].join(\"::\")\n}\n\n/**\n * An individual balance.\n */\nexport class Balance {\n //\n // Properties\n //\n\n /** The underlying data for this balance */\n readonly #storage: BalanceJson\n readonly #valueGetter: BalanceValueGetter\n\n #db: HydrateDb | null = null\n\n //\n // Methods\n //\n\n constructor(storage: BalanceJson | IBalance, hydrate?: HydrateDb) {\n this.#storage = storage as BalanceJson\n this.#valueGetter = new BalanceValueGetter(this.#storage)\n if (hydrate !== undefined) this.hydrate(hydrate)\n }\n\n toJSON = (): BalanceJson => this.#storage\n\n isSource = (source: BalanceSource) => this.#storage.source === source\n // // TODO: Fix this method, the types don't work with our plugin architecture.\n // // Specifically, the `BalanceJson` type is compiled down to `IBalance` in the following way:\n // //\n // // toJSON: () => BalanceJson // works\n // // isSource: (source: BalanceSource) => boolean // works\n // // asSource: <P extends string>(source: P) => NarrowBalanceType<IBalance, P> | null // Doesn't work! IBalance should just be BalanceJson!\n // //\n // // `IBalance` won't match the type of `BalanceSource` after `PluginBalanceTypes` has been extended by balance plugins.\n // // As a result, typescript will think that the returned #storage is not a BalanceJson.\n // asSource = <P extends BalanceSource>(source: P): NarrowBalanceType<BalanceJson, P> | null => {\n // if (this.#storage.source === source) return this.#storage as NarrowBalanceType<BalanceJson, P>\n // return null\n // }\n\n hydrate = (hydrate?: HydrateDb) => {\n if (hydrate !== undefined) this.#db = hydrate\n }\n\n #format = (balance: bigint | string) =>\n new BalanceFormatter(\n isBigInt(balance) ? balance.toString() : balance,\n this.decimals || undefined,\n this.rates\n )\n\n //\n // Accessors\n //\n\n get id(): string {\n return getBalanceId(this.#storage)\n }\n\n get source() {\n return this.#storage.source\n }\n\n get status() {\n return this.#storage.status\n }\n\n get address() {\n return this.#storage.address\n }\n\n get networkId() {\n return this.#storage.networkId\n }\n\n get network() {\n return this.#db?.networks?.[this.networkId] || null\n }\n\n get tokenId() {\n return this.#storage.tokenId\n }\n get token() {\n return this.#db?.tokens?.[this.tokenId] || null\n }\n get decimals() {\n return this.token?.decimals || null\n }\n get rates(): TokenRates | null {\n // uniswap v2 lp tokens need the rates from the underlying pool assets\n //\n // To note: `@talismn/token-rates` knows to fetch the `coingeckoId0` and `coingeckoId1` rates for evm-uniswapv2 tokens.\n // They are then stored in `this.#db.tokenRates` using the `tokenId0` and `tokenId1` keys.\n //\n // This means that those rates are always available for calculating the uniswapv2 rates,\n // regardless of whether or not the underlying erc20s are actually in chaindata and enabled.\n if (this.isSource(\"evm-uniswapv2\") && this.token?.type === \"evm-uniswapv2\") {\n const tokenId0 = evmErc20TokenId(this.networkId, this.token.tokenAddress0)\n const tokenId1 = evmErc20TokenId(this.networkId, this.token.tokenAddress1)\n\n const decimals = this.token.decimals\n const decimals0 = this.token.decimals0\n const decimals1 = this.token.decimals1\n\n const rates0 = this.#db?.tokenRates?.[tokenId0]\n const rates1 = this.#db?.tokenRates?.[tokenId1]\n\n if (rates0 === undefined || rates1 === undefined) return null\n\n const extra = this.#valueGetter.get(\"extra\")\n const extras = Array.isArray(extra) ? extra : extra !== undefined ? [extra] : []\n const totalSupply = extras.find((extra) => extra.label === \"totalSupply\")?.amount ?? \"0\"\n const reserve0 = extras.find((extra) => extra.label === \"reserve0\")?.amount ?? \"0\"\n const reserve1 = extras.find((extra) => extra.label === \"reserve1\")?.amount ?? \"0\"\n\n const totalSupplyTokens = BigNumber(totalSupply).times(10 ** (-1 * decimals))\n const reserve0Tokens = BigNumber(reserve0).times(10 ** (-1 * decimals0))\n const reserve1Tokens = BigNumber(reserve1).times(10 ** (-1 * decimals1))\n\n const rates0Currencies = new Set(Object.keys(rates0) as TokenRateCurrency[])\n const rates1Currencies = new Set(Object.keys(rates1) as TokenRateCurrency[])\n // `Set.prototype.intersection` can eventually replace this\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/intersection\n const currencies = [...rates0Currencies].filter((c) => rates1Currencies.has(c))\n\n const totalValueLocked = currencies.map(\n (currency) =>\n [\n currency,\n // tvl (in a given currency) == reserve0*currencyRate0 + reserve1*currencyRate1\n BigNumber.sum(\n reserve0Tokens.times(rates0[currency]?.price ?? 0),\n reserve1Tokens.times(rates1[currency]?.price ?? 0)\n ),\n ] as const\n )\n\n const lpTokenRates = newTokenRates()\n totalValueLocked.forEach(([currency, tvl]) => {\n // divide `the value of all lp tokens` by `the number of lp tokens` to get `the value per token`\n if (!totalSupplyTokens.eq(0))\n lpTokenRates[currency] = { price: tvl.div(totalSupplyTokens).toNumber() }\n })\n\n return lpTokenRates\n }\n\n // dTAO balances need to be converted to the native token to compute their rate, unless we have a coingeckoId\n if (this.token?.type === \"substrate-dtao\" && !this.token.coingeckoId) {\n if (!this.#db?.tokenRates) return null\n\n const balances = this.#valueGetter.get(\"free\")\n if (!balances.length) return null\n const balanceMeta = balances[0].meta as SubDTaoBalanceMeta | undefined\n if (!balanceMeta?.scaledAlphaPrice) return null\n\n return getDTaoTokenRates(this.token, this.#db.tokenRates, balanceMeta.scaledAlphaPrice)\n }\n\n // other tokens can just pick from the tokenRates db using the tokenId\n return this.#db?.tokenRates?.[this.tokenId] || null\n }\n\n /**\n * A general method to get formatted values matching a certain type from this balance.\n * @param valueType - The type of value to get.\n * @returns An array of the values matching the type with formatted amounts.\n */\n private getValue(\n valueType: BalanceStatusTypes\n ): Array<FormattedAmount<AmountWithLabel<string>, string>> {\n return this.getRawValue(valueType).map((value) => ({\n ...value,\n amount: this.#format(value.amount),\n }))\n }\n\n /**\n * A general method to get values matching a certain type from this balance.\n * @param valueType - The type of value to get.\n * @returns An array of the values matching the type.\n */\n private getRawValue(valueType: BalanceStatusTypes): Array<AmountWithLabel<string>> {\n return this.#valueGetter.get(valueType)\n }\n\n /**\n * A general method to add a value to the array of values for this balance.\n * @param valueType - The type of value to add.\n * @returns A function which can be used to add a value to the array of values for this balance.\n */\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: legacy\n private addValue(valueType: BalanceStatusTypes) {\n return (value: Omit<AmountWithLabel<string>, \"type\">) => this.#valueGetter.add(valueType, value)\n }\n /**\n * The total balance of this token.\n * Includes the free and the reserved amount.\n * The balance will be reaped if this goes below the existential deposit.\n */\n get total() {\n const extra = this.getValue(\"extra\") as FormattedAmount<ExtraAmount<string>, string>[]\n\n // if there is a DelegatedStaking hold (new model: polkadot, kusama), nom pool staked amount is included in reserved\n // if not (old model: vara, avail, cere), staked amount is not in the account and it needs to be added to the total\n const nomPoolStakedPlancks = this.locks.some(\n (lock) => lock.source === \"substrate-native-holds\" && lock.label === \"DelegatedStaking\"\n )\n ? 0n\n : this.nompools.map(({ amount }) => amount.planck).reduce((a, b) => a + b, 0n)\n\n return this.#format(\n this.free.planck +\n this.reserved.planck +\n nomPoolStakedPlancks +\n includeInTotalExtraAmount(extra)\n )\n }\n /** The non-reserved balance of this token. Includes the frozen amount. Is included in the total. */\n get free() {\n // for simple balances\n if (\"value\" in this.#storage && this.#storage.value) return this.#format(this.#storage.value)\n\n // for complex balances\n const freeValues = this.getValue(\"free\")\n const totalFree = freeValues.map(({ amount }) => amount.planck).reduce((a, b) => a + b, 0n)\n return this.#format(totalFree)\n }\n /** The reserved balance of this token. Is included in the total. */\n get reserved() {\n const reservedValues = this.getValue(\"reserved\")\n if (reservedValues.length === 0) return this.#format(0n)\n\n return this.#format(\n reservedValues.map(({ amount }) => amount.planck).reduce((a, b) => a + b, 0n)\n )\n }\n get reserves() {\n return this.getValue(\"reserved\")\n }\n /** The frozen balance of this token. Is included in the free amount. */\n get locked() {\n return this.#format(\n this.locks.map(({ amount }) => amount.planck).reduce((a, b) => BigMath.max(a, b), 0n)\n )\n }\n\n get locks() {\n return this.getValue(\"locked\")\n }\n\n get nompools() {\n return this.getValue(\"nompool\")\n }\n\n /** The extra balance of this token */\n get extra() {\n const extra = this.getRawValue(\"extra\")\n if (extra.length > 0) return extra as ExtraAmount<string>[]\n return undefined\n }\n\n /** @deprecated Use balance.locked */\n get frozen() {\n return this.locked\n }\n /** The transferable balance of this token. Is generally the free amount - the miscFrozen amount. */\n get transferable() {\n /**\n * As you can see here, `locked` is subtracted from `free` in order to derive `transferable`.\n *\n * |--------------------------total--------------------------|\n * |-------------------free-------------------|---reserved---|\n * |----locked-----|-------transferable-------|\n */\n const oldTransferableCalculation = () => {\n // if no locks exist, transferable is equal to the free amount\n if (this.locks.length === 0) return this.free\n\n // find the largest lock (but ignore any locks which are marked as `includeInTransferable`)\n const excludeAmount = excludeFromTransferableAmount(this.locks)\n\n // subtract the lock from the free amount (but don't go below 0)\n return this.#format(BigMath.max(this.free.planck - excludeAmount, 0n))\n }\n\n /**\n * As you can see here, `locked` is subtracted from `free + reserved` in order to derive `transferable`.\n *\n * Alternatively, `reserved` is subtracted from `locked` in order to derive `untouchable`,\n * which is then subtracted from `free` in order to derive `transferable`.\n *\n * |--------------------------total--------------------------|\n * |---reserved---|-------------------free-------------------|\n * |--untouchable--|\n * |------------locked------------|-------transferable-------|\n */\n const newTransferableCalculation = () => {\n // if no locks exist, transferable is equal to the free amount\n if (this.locks.length === 0) return this.free\n\n // find the largest lock (but ignore any locks which are marked as `includeInTransferable`)\n // subtract the reserved amount, because locks now act upon the total balance - not just the free balance\n const untouchableAmount = BigMath.max(\n excludeFromTransferableAmount(this.locks) - this.reserved.planck,\n 0n\n )\n\n // subtract the untouchable amount from the free amount (but don't go below 0)\n return this.#format(BigMath.max(this.free.planck - untouchableAmount, 0n))\n }\n\n if (this.#storage.useLegacyTransferableCalculation) return oldTransferableCalculation()\n return newTransferableCalculation()\n }\n /**\n * The unavailable balance of this token.\n * Prior to the Fungible trait, this was the locked amount + the reserved amount, i.e. `locked + reserved`.\n * Now, it is the bigger of the locked amount and the reserved amounts, i.e. `max(locked, reserved)`.\n */\n get unavailable() {\n const oldCalculation = () => this.locked.planck + this.reserved.planck\n const newCalculation = () => BigMath.max(this.locked.planck, this.reserved.planck)\n const baseUnavailable = this.#storage.useLegacyTransferableCalculation\n ? oldCalculation()\n : newCalculation()\n\n // if there is a DelegatedStaking hold (new model: polkadot, kusama), nom pool staked amount is included in reserved\n // if not (old model: vara, avail, cere), staked amount is not in the account and it needs to be added to the total\n const nomPoolStakedPlancks = this.locks.some(\n (lock) => lock.source === \"substrate-native-holds\" && lock.label === \"DelegatedStaking\"\n )\n ? 0n\n : this.nompools.map(({ amount }) => amount.planck).reduce((a, b) => a + b, 0n)\n\n return this.#format(baseUnavailable + nomPoolStakedPlancks)\n }\n\n /** The feePayable balance of this token. Is generally the free amount - the feeFrozen amount. */\n get feePayable() {\n // if no locks exist, feePayable is equal to the free amount\n if (this.locks.length === 0) return this.free\n\n // find the largest lock which can't be used to pay tx fees\n const excludeAmount = excludeFromFeePayableLocks(this.locked.planck.toString())\n .map((lock) => BigInt(lock.amount))\n .reduce((max, lock) => BigMath.max(max, lock), 0n)\n\n // subtract the lock from the free amount (but don't go below 0)\n return this.#format(BigMath.max(this.free.planck - excludeAmount, 0n))\n }\n}\n\nexport class BalanceValueGetter {\n #storage: BalanceJson\n\n constructor(storage: BalanceJson) {\n this.#storage = storage\n }\n\n get(valueType: BalanceStatusTypes) {\n if (\"values\" in this.#storage && this.#storage.values)\n return this.#storage.values.filter(({ type }) => type === valueType)\n return []\n }\n\n add(valueType: BalanceStatusTypes, amount: Omit<AmountWithLabel<string>, \"type\">) {\n if (\"values\" in this.#storage && this.#storage.values)\n this.#storage.values.push({ type: valueType, ...amount })\n }\n}\n\nexport class BalanceFormatter {\n #planck: string\n #decimals: number\n #tokenRates: TokenRates | null\n\n constructor(\n planck: string | bigint | undefined,\n decimals?: number | undefined,\n fiatRatios?: TokenRates | null\n ) {\n this.#planck = isBigInt(planck) ? planck.toString() : (planck ?? \"0\")\n this.#decimals = decimals || 0\n this.#tokenRates = fiatRatios || null\n }\n\n toJSON = () => this.#planck\n\n get planck() {\n return BigInt(this.#planck)\n }\n\n get tokens() {\n return planckToTokens(this.#planck, this.#decimals)\n }\n\n fiat(currency: TokenRateCurrency) {\n if (!this.#tokenRates) return null\n\n const ratio = this.#tokenRates[currency]\n if (!ratio) return null\n\n return parseFloat(this.tokens) * ratio.price\n }\n}\n\nexport class PlanckSumBalancesFormatter {\n #balances: Balances\n\n constructor(balances: Balances) {\n this.#balances = balances\n }\n\n #sum = (\n balanceField: {\n [K in keyof Balance]: Balance[K] extends BalanceFormatter ? K : never\n }[keyof Balance]\n ) => {\n // a function to get a planck amount from a balance\n const planck = (balance: Balance) => balance[balanceField].planck ?? 0n\n\n return this.#balances.filterMirrorTokens().each.reduce(\n // add the total amount to the planck amount of each balance\n (total, balance) => total + planck(balance),\n // start with a total of 0\n 0n\n )\n }\n\n /**\n * The total balance of these tokens. Includes the free and the reserved amount.\n */\n get total() {\n return this.#sum(\"total\")\n }\n /** The non-reserved balance of these tokens. Includes the frozen amount. Is included in the total. */\n get free() {\n return this.#sum(\"free\")\n }\n /** The reserved balance of these tokens. Is included in the total. */\n get reserved() {\n return this.#sum(\"reserved\")\n }\n /** The frozen balance of these tokens. Is included in the free amount. */\n get locked() {\n return this.#sum(\"locked\")\n }\n /** @deprecated Use balances.locked */\n get frozen() {\n return this.locked\n }\n /** The transferable balance of these tokens. Is generally the free amount - the miscFrozen amount. */\n get transferable() {\n return this.#sum(\"transferable\")\n }\n /** The unavailable balance of these tokens. */\n get unavailable() {\n return this.#sum(\"unavailable\")\n }\n\n /** The feePayable balance of these tokens. Is generally the free amount - the feeFrozen amount. */\n get feePayable() {\n return this.#sum(\"feePayable\")\n }\n}\n\nexport class FiatSumBalancesFormatter {\n #balances: Balances\n #currency: TokenRateCurrency\n\n constructor(balances: Balances, currency: TokenRateCurrency) {\n this.#balances = balances\n this.#currency = currency\n }\n\n #sum = (\n balanceField: {\n [K in keyof Balance]: Balance[K] extends BalanceFormatter ? K : never\n }[keyof Balance]\n ) => {\n // a function to get a fiat amount from a balance\n const fiat = (balance: Balance) => balance[balanceField].fiat(this.#currency) ?? 0\n\n return this.#balances.filterMirrorTokens().each.reduce(\n // add the total amount to the fiat amount of each balance\n (total, balance) => total + fiat(balance),\n // start with a total of 0\n 0\n )\n }\n\n /**\n * The total balance of these tokens. Includes the free and the reserved amount.\n */\n get total() {\n return this.#sum(\"total\")\n }\n /** The non-reserved balance of these tokens. Includes the frozen amount. Is included in the total. */\n get free() {\n return this.#sum(\"free\")\n }\n /** The reserved balance of these tokens. Is included in the total. */\n get reserved() {\n return this.#sum(\"reserved\")\n }\n /** The frozen balance of these tokens. Is included in the free amount. */\n get locked() {\n return this.#sum(\"locked\")\n }\n /** @deprecated Use balances.locked */\n get frozen() {\n return this.locked\n }\n /** The transferable balance of these tokens. Is generally the free amount - the miscFrozen amount. */\n get transferable() {\n return this.#sum(\"transferable\")\n }\n /** The unavailable balance of these tokens. */\n get unavailable() {\n return this.#sum(\"unavailable\")\n }\n /** The feePayable balance of these tokens. Is generally the free amount - the feeFrozen amount. */\n get feePayable() {\n return this.#sum(\"feePayable\")\n }\n}\n\nexport class SumBalancesFormatter {\n #balances: Balances\n\n constructor(balances: Balances) {\n this.#balances = balances\n }\n\n get planck() {\n return new PlanckSumBalancesFormatter(this.#balances)\n }\n\n fiat(currency: TokenRateCurrency) {\n return new FiatSumBalancesFormatter(this.#balances, currency)\n }\n\n change24h(currency: TokenRateCurrency) {\n return new Change24hCurrencyFormatter(this.#balances, currency)\n }\n}\n\nexport class Change24hCurrencyFormatter {\n #balances: Balances\n #currency: TokenRateCurrency\n\n constructor(balances: Balances, currency: TokenRateCurrency) {\n this.#balances = balances\n this.#currency = currency\n }\n\n #change24h = (\n balanceField: {\n [K in keyof Balance]: Balance[K] extends BalanceFormatter ? K : never\n }[keyof Balance]\n ) => {\n const output = this.#balances.filterMirrorTokens().each.reduce(\n // add the total amount to the fiat amount of each balance\n (acc, balance) => {\n const change24h = balance.rates?.[this.#currency]?.change24h\n if (typeof change24h !== \"number\") return acc\n const fiat = balance[balanceField].fiat(this.#currency)\n if (!fiat) return acc\n\n return {\n totalFiatDiff: acc.totalFiatDiff + fiat * change24h,\n totalFiat: acc.totalFiat + fiat,\n }\n },\n // start with a total of 0\n { totalFiatDiff: 0, totalFiat: 0 }\n )\n\n return output.totalFiat === 0\n ? null\n : {\n diff: output.totalFiatDiff / 100,\n ratio: output.totalFiatDiff / output.totalFiat,\n }\n }\n\n get total() {\n return this.#change24h(\"total\")\n }\n get free() {\n return this.#change24h(\"free\")\n }\n get reserved() {\n return this.#change24h(\"reserved\")\n }\n get locked() {\n return this.#change24h(\"locked\")\n }\n get frozen() {\n return this.#change24h(\"frozen\")\n }\n get transferable() {\n return this.#change24h(\"transferable\")\n }\n get unavailable() {\n return this.#change24h(\"unavailable\")\n }\n get feePayable() {\n return this.#change24h(\"feePayable\")\n }\n}\n\nexport const filterMirrorTokens = (balance: Balance, _i: number, balances: Balance[]) => {\n const mirrorOf = balance.token?.mirrorOf\n return !mirrorOf || !balances.find((b) => b.tokenId === mirrorOf)\n}\n","export const TAO_DECIMALS = 9n\n\n// manipulating price as bigint requires using at least as many decimals as TAO itself\nexport const ALPHA_PRICE_SCALE = 10n ** TAO_DECIMALS\n\nexport const getScaledAlphaPrice = (alphaIn: bigint, taoIn: bigint): bigint => {\n if (!alphaIn || !taoIn) return 0n\n return (taoIn * ALPHA_PRICE_SCALE) / alphaIn\n}\n\nexport const alphaToTao = (alpha: bigint, scaledAlphaPrice: bigint): bigint => {\n if (!alpha || !scaledAlphaPrice) return 0n\n return (alpha * scaledAlphaPrice) / ALPHA_PRICE_SCALE\n}\n\nexport const taoToAlpha = (tao: bigint, scaledAlphaPrice: bigint): bigint => {\n if (!tao || !scaledAlphaPrice) return 0n\n return (tao * ALPHA_PRICE_SCALE) / scaledAlphaPrice\n}\n","import { type SubDTaoToken, subNativeTokenId } from \"@talismn/chaindata-provider\"\nimport {\n newTokenRates,\n type TokenRateCurrency,\n type TokenRateData,\n type TokenRatesList,\n} from \"@talismn/token-rates\"\n\nimport log from \"../../log\"\nimport { ALPHA_PRICE_SCALE, alphaToTao, TAO_DECIMALS } from \"./alphaPrice\"\n\nconst ONE_ALPHA = 10n ** TAO_DECIMALS\n\n/**\n * To be used for tokens that don't have a coingecko id\n *\n * @param token\n * @param tokenRates\n * @param scaledAlphaPrice\n * @returns\n */\nexport const getDTaoTokenRates = (\n token: SubDTaoToken,\n tokenRates: TokenRatesList,\n scaledAlphaPrice: string | bigint\n) => {\n try {\n const taoTokenId = subNativeTokenId(token.networkId)\n const taoTokenRates = tokenRates[taoTokenId]\n if (!taoTokenRates) return null\n\n // for root subnet, same rates as TAO\n if (token.netuid === 0) return structuredClone(taoTokenRates)\n\n const alphaRates = newTokenRates()\n for (const [currency, taoRate] of Object.entries(taoTokenRates) as [\n TokenRateCurrency,\n TokenRateData | null,\n ][]) {\n if (!taoRate) {\n alphaRates[currency] = null\n } else {\n const taoPrice = alphaToTao(ONE_ALPHA, BigInt(scaledAlphaPrice))\n const priceRatio = Number(taoPrice) / Number(ALPHA_PRICE_SCALE)\n alphaRates[currency] = {\n price: taoRate.price * priceRatio,\n marketCap: taoRate.marketCap ? taoRate.marketCap * priceRatio : undefined,\n change24h: undefined, // cannot be determined from TAO rates alone\n }\n }\n }\n\n return alphaRates\n } catch (err) {\n log.error(err)\n return null\n }\n}\n","import { SubDTaoTokenSchema } from \"@talismn/chaindata-provider\"\nimport type z from \"zod/v4\"\n\nimport type { SubDTaoTokenConfigSchema } from \"./types\"\n\nexport const MODULE_TYPE = SubDTaoTokenSchema.shape.type.value\nexport const PLATFORM = SubDTaoTokenSchema.shape.platform.value\n\nexport type TokenConfig = z.infer<typeof SubDTaoTokenConfigSchema>\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport {\n getCleanToken,\n type SubDTaoToken,\n subDTaoTokenId,\n TokenSchema,\n} from \"@talismn/chaindata-provider\"\nimport { decodeScale, parseMetadataRpc } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\nimport { keyBy, uniq } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { AmountWithLabel, IBalance } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRuntimeCallResult } from \"../shared\"\nimport { fetchRpcQueryPack, type MaybeStateKey, type RpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { getScaledAlphaPrice } from \"./alphaPrice\"\nimport { calculatePendingRootClaimable } from \"./calculatePendingRootClaimable\"\nimport { MODULE_TYPE } from \"./config\"\nimport type {\n GetDynamicInfosResult,\n GetStakeInfosResult,\n SubDTaoBalance,\n SubDTaoBalanceMeta,\n} from \"./types\"\n\nconst ROOT_NETUID = 0\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`, {\n tokensWithAddresses,\n })\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const addresses = uniq(balanceDefs.map((def) => def.address))\n\n try {\n const [stakeInfos, dynamicInfos] = await Promise.all([\n fetchRuntimeCallResult<GetStakeInfosResult>(\n connector,\n networkId,\n miniMetadata.data!,\n \"StakeInfoRuntimeApi\",\n \"get_stake_info_for_coldkeys\",\n [addresses]\n ),\n fetchRuntimeCallResult<GetDynamicInfosResult>(\n connector,\n networkId,\n miniMetadata.data!,\n \"SubnetInfoRuntimeApi\",\n \"get_all_dynamic_info\",\n []\n ),\n ])\n\n const rootHotkeys = uniq(\n stakeInfos.flatMap(([, stakes]) =>\n stakes.filter((stake) => stake.netuid === ROOT_NETUID).map((stake) => stake.hotkey)\n )\n )\n const rootClaimableRatesByHotkey =\n rootHotkeys.length && miniMetadata.data\n ? await fetchRootClaimableRates(connector, networkId, miniMetadata.data, rootHotkeys)\n : new Map<string, Map<number, bigint>>()\n\n // Collect all (address, hotkey, netuid) pairs for root stakes to fetch RootClaimed amounts\n const addressHotkeyNetuidPairs: Array<[address: string, hotkey: string, netuid: number]> = []\n for (const [address, stakes] of stakeInfos) {\n for (const stake of stakes) {\n if (stake.netuid === ROOT_NETUID) {\n const claimableRates = rootClaimableRatesByHotkey.get(stake.hotkey)\n if (claimableRates) {\n // For each netuid that has a claimable rate, we need to check RootClaimed\n for (const netuid of claimableRates.keys()) {\n addressHotkeyNetuidPairs.push([address, stake.hotkey, netuid])\n }\n }\n }\n }\n }\n\n const rootClaimedAmounts =\n addressHotkeyNetuidPairs.length && miniMetadata.data\n ? await fetchRootClaimedAmounts(\n connector,\n networkId,\n miniMetadata.data,\n addressHotkeyNetuidPairs\n )\n : new Map<string, Map<string, Map<number, bigint>>>()\n\n const dynamicInfoByNetuid = keyBy(dynamicInfos.filter(isNotNil), (info) => info.netuid)\n\n // Upserts a balance into the accumulator, merging stake values if the balance already exists.\n // Eg: Acc X has root staked with validator Y, but also staked on sn 45 with the same validator Y.\n // We merge the pending root claim of sn 45 and the sn 45 stake in the same balance.\n const upsertBalance = (\n acc: Record<string, SubDTaoBalance>,\n address: string,\n tokenId: string,\n balance: SubDTaoBalance\n ): void => {\n const key = `${address}:${tokenId}`\n const recordedBalance = acc[key]\n if (recordedBalance) {\n acc[key] = {\n ...recordedBalance,\n stake: recordedBalance.stake + balance.stake,\n // If the new balance has pendingRootClaim, use it (it's calculated from current state)\n ...(balance.pendingRootClaim !== undefined && {\n pendingRootClaim: balance.pendingRootClaim,\n }),\n }\n } else {\n acc[key] = balance\n }\n }\n\n const balancesRaw = stakeInfos.reduce<Record<string, SubDTaoBalance>>(\n (acc, [address, stakes]) => {\n for (const stake of stakes) {\n // Regular stake cases\n const dynamicInfo = dynamicInfoByNetuid[stake.netuid]\n const scaledAlphaPrice = dynamicInfo\n ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in)\n : 0n\n\n const balance: SubDTaoBalance = {\n address,\n tokenId: subDTaoTokenId(networkId, stake.netuid, stake.hotkey),\n baseTokenId: subDTaoTokenId(networkId, stake.netuid),\n stake: stake.stake,\n hotkey: stake.hotkey,\n netuid: stake.netuid,\n scaledAlphaPrice,\n }\n\n upsertBalance(acc, address, balance.tokenId, balance)\n\n // Root stake cases, we need to calculate the pending root claim and add to the balances\n if (stake.netuid === ROOT_NETUID) {\n const claimableRates = rootClaimableRatesByHotkey.get(stake.hotkey) ?? new Map()\n const alreadyClaimedMap =\n rootClaimedAmounts.get(address)?.get(stake.hotkey) ?? new Map<number, bigint>()\n\n const pendingRootClaimBalances = calculatePendingRootClaimable({\n stake: stake.stake,\n hotkey: stake.hotkey,\n address,\n networkId,\n validatorRootClaimableRate: claimableRates,\n dynamicInfoByNetuid,\n alreadyClaimedByNetuid: alreadyClaimedMap,\n })\n pendingRootClaimBalances.forEach((balance) => {\n upsertBalance(acc, address, balance.tokenId, balance)\n })\n }\n }\n return acc\n },\n {}\n )\n\n const balances = Object.values(balancesRaw)\n\n const tokensById = keyBy(\n tokensWithAddresses.map(([token]) => token),\n (t) => t.id\n )\n const dynamicTokens: SubDTaoToken[] = []\n\n // identify tokens that were not requested but have balances\n // BalanceProvider will be register them in ChaindataProvider at runtime, so they will be requested on next call\n for (const bal of balances) {\n if (!balanceDefs.some((def) => def.token.id === bal.tokenId)) {\n const baseToken = tokensById[bal.baseTokenId] as SubDTaoToken | undefined\n // define a token specific to this staking hotkey\n if (baseToken) {\n const cleanToken = getCleanToken(baseToken) as SubDTaoToken\n const newToken = TokenSchema.parse({\n ...cleanToken,\n id: bal.tokenId,\n hotkey: bal.hotkey,\n }) as SubDTaoToken\n dynamicTokens.push(newToken)\n }\n }\n }\n\n const success: IBalance[] = balanceDefs.map((def): IBalance => {\n const stake = balances.find((b) => b.address === def.address && b.tokenId === def.token.id)\n const meta: SubDTaoBalanceMeta = {\n scaledAlphaPrice: stake?.scaledAlphaPrice.toString() ?? \"0\",\n }\n\n const stakeAmount = BigInt(stake?.stake?.toString() ?? \"0\")\n const pendingRootClaimAmount = BigInt(stake?.pendingRootClaim?.toString() ?? \"0\")\n const hasZeroStake = stakeAmount === 0n\n const hasPendingRootClaim = pendingRootClaimAmount > 0n\n\n const balanceValue: AmountWithLabel<string> = {\n type: \"free\",\n label: stake?.netuid === 0 ? \"Root Staking\" : `Subnet Staking`,\n amount: stakeAmount.toString(),\n meta,\n }\n\n const pendingRootClaimValue: AmountWithLabel<string> = {\n type: \"locked\",\n label: \"Pending root claim\",\n amount: pendingRootClaimAmount.toString(),\n meta,\n }\n\n const values: Array<AmountWithLabel<string>> = [balanceValue, pendingRootClaimValue]\n\n // If stake is 0n but there's a pendingRootClaim, add it as an extra amount\n // with includeInTotal: true so it counts toward the total balance.\n // This ensures the balance isn't filtered out when stake is 0n.\n // The total.planck calculation is: free + reserved + extra (with includeInTotal: true)\n // So by adding pendingRootClaim as extra, it will be included in total.planck.\n if (hasZeroStake && hasPendingRootClaim) {\n values.push({\n type: \"extra\",\n label: \"Pending root claim\",\n amount: pendingRootClaimAmount.toString(),\n includeInTotal: true,\n meta,\n })\n }\n\n return {\n address: def.address,\n networkId,\n tokenId: def.token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values,\n }\n })\n\n return {\n success,\n errors: [],\n dynamicTokens,\n }\n } catch (err) {\n log.warn(\"Failed to fetch balances for substrate-dtao\", { err })\n\n const errors = balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Failed to fetch balance for ${def.address} on ${networkId}`),\n }))\n\n return {\n success: [],\n errors,\n }\n }\n}\n\nconst buildStorageCoder = (metadataRpc: `0x${string}`, pallet: string, entry: string) => {\n const { builder } = parseMetadataRpc(metadataRpc)\n return builder.buildStorage(pallet, entry)\n}\n\nconst buildRootClaimableStorageCoder = async (\n _connector: IChainConnectorDot,\n networkId: string,\n metadataRpc: `0x${string}` | null\n): Promise<ReturnType<ReturnType<typeof parseMetadataRpc>[\"builder\"][\"buildStorage\"]> | null> => {\n let storageCoder: ReturnType<typeof buildStorageCoder> | null = null\n\n if (metadataRpc) {\n try {\n storageCoder = buildStorageCoder(metadataRpc, \"SubtensorModule\", \"RootClaimable\")\n } catch (cause) {\n log.warn(\n `Failed to build storage coder for SubtensorModule.RootClaimable using provided metadata on ${networkId}`,\n { cause }\n )\n }\n }\n\n return storageCoder\n}\n\nconst buildRootClaimedStorageCoder = async (\n networkId: string,\n metadataRpc: `0x${string}` | null\n): Promise<ReturnType<ReturnType<typeof parseMetadataRpc>[\"builder\"][\"buildStorage\"]> | null> => {\n let storageCoder: ReturnType<typeof buildStorageCoder> | null = null\n\n if (metadataRpc) {\n try {\n storageCoder = buildStorageCoder(metadataRpc, \"SubtensorModule\", \"RootClaimed\")\n } catch (cause) {\n log.warn(\n `Failed to build storage coder for SubtensorModule.RootClaimed using provided metadata on ${networkId}`,\n { cause }\n )\n }\n }\n\n return storageCoder\n}\n\nconst buildRootClaimableQueries = (\n networkId: string,\n hotkeys: string[],\n storageCoder: ReturnType<ReturnType<typeof parseMetadataRpc>[\"builder\"][\"buildStorage\"]>\n): Array<RpcQueryPack<[string, Map<number, bigint>]>> => {\n return hotkeys.map((hotkey) => {\n let stateKey: MaybeStateKey = null\n try {\n stateKey = storageCoder.keys.enc(hotkey) as MaybeStateKey\n } catch (cause) {\n log.warn(`Failed to encode storage key for hotkey ${hotkey} on ${networkId}`, { cause })\n }\n\n const decodeResult = (changes: MaybeStateKey[]): [string, Map<number, bigint>] => {\n const hexValue = changes[0]\n if (!hexValue) {\n return [hotkey, new Map<number, bigint>()]\n }\n\n const decoded = decodeScale<[number, bigint][] | null>(\n storageCoder,\n hexValue,\n `Failed to decode RootClaimable for hotkey ${hotkey} on ${networkId}`\n )\n return [hotkey, decoded ? new Map(decoded) : new Map<number, bigint>()]\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n}\n\nconst fetchRootClaimableRates = async (\n connector: IChainConnectorDot,\n networkId: string,\n metadataRpc: `0x${string}`,\n hotkeys: string[]\n): Promise<Map<string, Map<number, bigint>>> => {\n if (!hotkeys.length) return new Map<string, Map<number, bigint>>()\n\n const storageCoder = await buildRootClaimableStorageCoder(connector, networkId, metadataRpc)\n if (!storageCoder) {\n // Fallback: return empty map for all hotkeys\n return new Map(hotkeys.map((hotkey) => [hotkey, new Map<number, bigint>()]))\n }\n\n const queries = buildRootClaimableQueries(networkId, hotkeys, storageCoder)\n\n try {\n const results = await fetchRpcQueryPack(connector, networkId, queries)\n return new Map(results)\n } catch (cause) {\n log.warn(`Failed to fetch RootClaimable for hotkeys on ${networkId}`, { cause })\n // Fallback: return empty map for all hotkeys\n return new Map(hotkeys.map((hotkey) => [hotkey, new Map<number, bigint>()]))\n }\n}\n\nconst buildRootClaimedQueries = (\n networkId: string,\n addressHotkeyNetuidPairs: Array<[address: string, hotkey: string, netuid: number]>,\n storageCoder: ReturnType<ReturnType<typeof parseMetadataRpc>[\"builder\"][\"buildStorage\"]>\n): Array<RpcQueryPack<[string, string, number, bigint]>> => {\n return addressHotkeyNetuidPairs.map(([address, hotkey, netuid]) => {\n let stateKey: MaybeStateKey = null\n try {\n // RootClaimed storage takes params: [netuid, hotkey, coldkey_ss58]\n stateKey = storageCoder.keys.enc(netuid, hotkey, address) as MaybeStateKey\n } catch (cause) {\n log.warn(\n `Failed to encode storage key for RootClaimed (netuid=${netuid}, hotkey=${hotkey}, address=${address}) on ${networkId}`,\n { cause }\n )\n }\n\n const decodeResult = (changes: MaybeStateKey[]): [string, string, number, bigint] => {\n const hexValue = changes[0]\n if (!hexValue) {\n return [address, hotkey, netuid, 0n]\n }\n\n const decoded = decodeScale<bigint | null>(\n storageCoder,\n hexValue,\n `Failed to decode RootClaimed for (netuid=${netuid}, hotkey=${hotkey}, address=${address}) on ${networkId}`\n )\n return [address, hotkey, netuid, decoded ?? 0n]\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n}\n\nconst fetchRootClaimedAmounts = async (\n connector: IChainConnectorDot,\n networkId: string,\n metadataRpc: `0x${string}`,\n addressHotkeyNetuidPairs: Array<[address: string, hotkey: string, netuid: number]>\n): Promise<Map<string, Map<string, Map<number, bigint>>>> => {\n if (!addressHotkeyNetuidPairs.length) {\n return new Map<string, Map<string, Map<number, bigint>>>()\n }\n\n const storageCoder = await buildRootClaimedStorageCoder(networkId, metadataRpc)\n if (!storageCoder) {\n // Fallback: return empty map for all pairs\n const result = new Map<string, Map<string, Map<number, bigint>>>()\n for (const [address, hotkey, netuid] of addressHotkeyNetuidPairs) {\n if (!result.has(address)) result.set(address, new Map())\n const addressMap = result.get(address)!\n if (!addressMap.has(hotkey)) addressMap.set(hotkey, new Map())\n addressMap.get(hotkey)!.set(netuid, 0n)\n }\n return result\n }\n\n const queries = buildRootClaimedQueries(networkId, addressHotkeyNetuidPairs, storageCoder)\n\n try {\n const results = await fetchRpcQueryPack(connector, networkId, queries)\n // Build a nested map: address -> hotkey -> netuid -> claimed amount\n const result = new Map<string, Map<string, Map<number, bigint>>>()\n for (const [address, hotkey, netuid, claimed] of results) {\n if (!result.has(address)) result.set(address, new Map())\n const addressMap = result.get(address)!\n if (!addressMap.has(hotkey)) addressMap.set(hotkey, new Map())\n addressMap.get(hotkey)!.set(netuid, claimed)\n }\n return result\n } catch (cause) {\n log.warn(`Failed to fetch RootClaimed for address-hotkey-netuid pairs on ${networkId}`, {\n cause,\n })\n // Fallback: return empty map for all pairs\n const result = new Map<string, Map<string, Map<number, bigint>>>()\n for (const [address, hotkey, netuid] of addressHotkeyNetuidPairs) {\n if (!result.has(address)) result.set(address, new Map())\n const addressMap = result.get(address)!\n if (!addressMap.has(hotkey)) addressMap.set(hotkey, new Map())\n addressMap.get(hotkey)!.set(netuid, 0n)\n }\n return result\n }\n}\n","import { subDTaoTokenId } from \"@talismn/chaindata-provider\"\n\nimport { getScaledAlphaPrice } from \"./alphaPrice\"\nimport type { GetDynamicInfosResult, SubDTaoBalance } from \"./types\"\n\ntype DynamicInfo = NonNullable<GetDynamicInfosResult[number]>\n\nexport const calculatePendingRootClaimable = ({\n stake,\n hotkey,\n address,\n networkId,\n validatorRootClaimableRate,\n dynamicInfoByNetuid,\n alreadyClaimedByNetuid,\n}: {\n stake: bigint\n hotkey: string\n address: string\n networkId: string\n validatorRootClaimableRate: Map<number, bigint>\n dynamicInfoByNetuid: Record<number, DynamicInfo | undefined>\n alreadyClaimedByNetuid: Map<number, bigint>\n}): SubDTaoBalance[] => {\n const pendingRootClaimBalances: SubDTaoBalance[] = []\n\n for (const [netuid, claimableRate] of validatorRootClaimableRate) {\n if (claimableRate === 0n) {\n continue\n }\n const dynamicInfo = dynamicInfoByNetuid[netuid]\n const scaledAlphaPrice = dynamicInfo\n ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in)\n : 0n\n // Calculate claimable = claimable_rate * root_stake\n // Note: claimableRate is a I96F32, a fixed-point number format\n\n // Multiply claimable_rate by root_stake\n // I96F32 multiplication: round((a * b) / 2^32)\n const totalClaimable = (stake * claimableRate + (1n << 31n)) >> 32n\n\n // Subtract already claimed amount to get net pending claimable\n const alreadyClaimed = alreadyClaimedByNetuid.get(netuid) ?? 0n\n const pendingRootClaim = totalClaimable > alreadyClaimed ? totalClaimable - alreadyClaimed : 0n\n\n pendingRootClaimBalances.push({\n address,\n tokenId: subDTaoTokenId(networkId, netuid, hotkey),\n baseTokenId: subDTaoTokenId(networkId, netuid),\n hotkey: hotkey,\n netuid: netuid,\n scaledAlphaPrice,\n pendingRootClaim,\n stake: 0n,\n })\n }\n\n return pendingRootClaimBalances\n}\n","import type { bittensor } from \"@polkadot-api/descriptors\"\nimport type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport {\n type AnyMiniMetadata,\n type DotNetworkId,\n type SubDTaoToken,\n SubDTaoTokenSchema,\n subDTaoTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { getStorageKeyPrefix, parseMetadataRpc } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\nimport { fromPairs } from \"lodash-es\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRuntimeCallResult, type QueryStorageResult } from \"../shared\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\ntype GetDynamicInfosResult =\n (typeof bittensor)[\"descriptors\"][\"apis\"][\"SubnetInfoRuntimeApi\"][\"get_all_dynamic_info\"][1]\n\n// hardcoded because we dont have access to native tokens from the balance module\nconst NATIVE_TOKEN_SYMBOLS: Record<string, string> = {\n \"bittensor\": \"TAO\",\n \"bittensor-testnet\": \"testTAO\",\n}\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n connector,\n tokens,\n miniMetadata,\n}) => {\n const anyMiniMetadata = miniMetadata as AnyMiniMetadata\n if (!anyMiniMetadata?.data) return []\n\n const [transferableTokensMap, dynamicInfos] = await Promise.all([\n fetchTransferableTokensMap(connector, anyMiniMetadata.data, networkId),\n fetchRuntimeCallResult<GetDynamicInfosResult>(\n connector,\n networkId,\n anyMiniMetadata.data,\n \"SubnetInfoRuntimeApi\",\n \"get_all_dynamic_info\",\n []\n ),\n ])\n\n return dynamicInfos\n .filter(isNotNil)\n .map((info): SubDTaoToken => {\n const config = tokens.find((t) => t.netuid === info.netuid)\n\n let symbol = new TextDecoder().decode(Uint8Array.from(info.token_symbol))\n const subnetName =\n info.subnet_identity?.subnet_name?.asText() ??\n (info.netuid === 0 ? \"Root\" : `Subnet ${info.netuid}`)\n const name = `SN${info.netuid} | ${subnetName} ${symbol}`\n\n // for root we want same symbol as native so they can be grouped together in portfolio\n if (info.netuid === 0 && NATIVE_TOKEN_SYMBOLS[networkId])\n symbol = NATIVE_TOKEN_SYMBOLS[networkId]\n\n // if not stage in storage, consider transferable\n const isTransferable = transferableTokensMap[info.netuid] ?? true\n\n const token: SubDTaoToken = {\n id: subDTaoTokenId(networkId, info.netuid),\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n netuid: info.netuid,\n isDefault: true,\n symbol,\n decimals: 9,\n name,\n subnetName,\n isTransferable,\n }\n\n return Object.assign({}, token, config)\n })\n\n .filter((t) => {\n const parsed = SubDTaoTokenSchema.safeParse(t)\n return parsed.success\n })\n}\n\nconst fetchTransferableTokensMap = async (\n connector: IChainConnectorDot,\n metadata: `0x${string}`,\n networkId: DotNetworkId\n) => {\n const { builder } = parseMetadataRpc(metadata)\n const transferToggleCodec = builder.buildStorage(\"SubtensorModule\", \"TransferToggle\")\n\n const transferToggleKeys = await connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"SubtensorModule\", \"TransferToggle\"),\n ])\n\n const transferToggleResults = await connector.send<QueryStorageResult>(\n networkId,\n \"state_queryStorageAt\",\n [transferToggleKeys]\n )\n\n const transferToggleEntries = transferToggleResults.length ? transferToggleResults[0].changes : []\n\n return fromPairs(\n transferToggleEntries.map(([key, value]) => {\n const [netuid] = transferToggleCodec.keys.dec(key) as [number]\n const isTransferable = transferToggleCodec.value.dec(value) as boolean\n return [netuid, isTransferable]\n })\n )\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc),\n extra: null,\n } as AnyMiniMetadata\n}\n\nconst getData = (metadataRpc: `0x${string}`): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n const isBittensor = unifiedMetadata.pallets.some(({ name }) => name === \"SubtensorModule\")\n if (!isBittensor) return null\n\n compactMetadata(\n metadata,\n [{ pallet: \"SubtensorModule\", items: [\"TransferToggle\", \"RootClaimable\", \"RootClaimed\"] }],\n [\n {\n runtimeApi: \"StakeInfoRuntimeApi\",\n methods: [\"get_stake_info_for_coldkeys\"],\n },\n {\n runtimeApi: \"SubnetInfoRuntimeApi\",\n methods: [\"get_all_dynamic_info\"],\n },\n ]\n )\n\n return encodeMetadata(metadata)\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType, parseSubDTaoTokenId } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { netuid: subnetId, hotkey } = parseSubDTaoTokenId(token.id)\n if (!hotkey) throw new Error(`Missing hotkey`)\n\n const { builder } = parseMetadataRpc(metadataRpc)\n const { codec, location } = builder.buildCall(\"SubtensorModule\", \"transfer_stake\")\n\n const args = codec.enc({\n origin_netuid: subnetId,\n hotkey,\n destination_coldkey: to,\n destination_netuid: subnetId,\n alpha_amount: value,\n })\n\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n // on hydration balances are fetched using a runtimeApi, which can't be subscribed to.\n // => poll values for each block\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n miniMetadata,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n miniMetadata,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubDTaoBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import type { bittensor } from \"@polkadot-api/descriptors\"\nimport { SubDTaoTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubDTaoTokenConfigSchema = z.strictObject({\n netuid: SubDTaoTokenSchema.shape.netuid,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubDTaoTokenConfig = z.infer<typeof SubDTaoTokenConfigSchema>\n\nexport type SubDTaoBalanceMeta = {\n scaledAlphaPrice: string\n}\n\nexport type SubDTaoBalance = {\n address: string\n tokenId: string\n baseTokenId: string\n stake: bigint\n pendingRootClaim?: bigint\n hotkey: string\n netuid: number\n scaledAlphaPrice: bigint\n}\n\nexport type GetDynamicInfosResult =\n (typeof bittensor)[\"descriptors\"][\"apis\"][\"SubnetInfoRuntimeApi\"][\"get_all_dynamic_info\"][1]\n\nexport type GetStakeInfosResult =\n (typeof bittensor)[\"descriptors\"][\"apis\"][\"StakeInfoRuntimeApi\"][\"get_stake_info_for_coldkeys\"][1]\n","import type { NetworkId, TokenId } from \"@talismn/chaindata-provider\"\n\nimport type { Address } from \"./addresses\"\n\nexport type BalanceStatus =\n // balance is subscribed to the on-chain value and up to date\n | \"live\"\n // balance was retrieved from the chain and the stored value is being displayed.\n // This balance is currently awaiting updates from the chain.\n | \"cache\"\n // balance was retrieved from the chain but we're unable to create a new subscription\n | \"stale\"\n\ntype IBalanceBase = {\n /** The module that this balance was retrieved by */\n source: string\n\n useLegacyTransferableCalculation?: boolean\n\n /** Has this balance never been fetched, or is it from a cache, or is it up to date? */\n status: BalanceStatus\n\n /** The address of the account which owns this balance */\n address: Address\n /** The token this balance is for */\n tokenId: TokenId\n\n networkId: NetworkId\n}\n\ntype IBalanceSimpleValues = {\n /** For balance types with a simple value, this is the value of the balance (eg, evm native token balance) */\n value: Amount\n values?: Array<AmountWithLabel<string>>\n}\n\ntype IBalanceComplexValues = {\n /** For balance types with multple possible states, these are the values of the balance (eg, substrate native token balance) */\n values: Array<AmountWithLabel<string>>\n value?: undefined\n}\n\n/** `IBalance` is a common interface which all balance types must implement. */\nexport type IBalance = IBalanceBase & (IBalanceSimpleValues | IBalanceComplexValues)\n\nexport type BalanceJson = IBalance\n\n/** A collection of `BalanceJson` objects */\nexport type BalanceJsonList = Record<string, BalanceJson>\n\n/** An unlabelled amount of a balance */\nexport type Amount = string\n\nexport type BalanceStatusTypes = \"free\" | \"reserved\" | \"locked\" | \"extra\" | \"nompool\"\n\n/** A labelled amount of a balance */\ntype BaseAmountWithLabel<TLabel extends string> = {\n type: BalanceStatusTypes\n /**\n * For modules which fetch balances via module sources, the source is equivalent to previous 'subSource' field\n * on the parent balance object\n * e.g. `staking`\n **/\n source?: string\n label: TLabel\n amount: Amount\n meta?: unknown // TODO type this with an object that has a discriminator property\n}\n\nexport const getValueId = (amount: AmountWithLabel<string>) => {\n const getMetaId = () => {\n const meta = amount.meta as { poolId?: number; paraId?: number } | undefined\n if (!meta) return \"\"\n if (amount.type === \"nompool\") return meta.poolId?.toString() ?? \"\"\n\n return \"\"\n }\n\n return [amount.label, amount.type, amount.source, getMetaId()].join(\"::\")\n}\n\n/** A labelled locked amount of a balance */\nexport type LockedAmount<TLabel extends string> = BaseAmountWithLabel<TLabel> & {\n /**\n * By default, the largest locked amount is subtrated from the transferable amount of this balance.\n * If this property is set to true, this particular lock will be skipped when making this calculation.\n * As such, this locked amount will be included in the calculated transferable amount.\n */\n includeInTransferable?: boolean\n\n /**\n * By default, tx fees can be deducted from locked amounts of balance.\n * As such, locked amounts are ignored when calculating if the user has enough funds to pay tx fees.\n * If this property is set to true, this particular lock will be subtracted from the available funds when making this calculation.\n * As such, this locked amount will not be included in the calculated available funds.\n */\n excludeFromFeePayable?: boolean\n}\n\nexport type AmountWithLabel<TLabel extends string> =\n | BaseAmountWithLabel<TLabel>\n | LockedAmount<TLabel>\n | ExtraAmount<TLabel>\n\n/** A labelled extra amount of a balance */\nexport type ExtraAmount<TLabel extends string> = BaseAmountWithLabel<TLabel> & {\n type: \"extra\"\n /** If set to true, this extra amount will be included in the calculation of the total amount of this balance. */\n includeInTotal?: boolean\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { Twox128, toHex } from \"@talismn/scale\"\n\n/** For fast db access, you can calculate the primary key for a miniMetadata using this method */\nexport const deriveMiniMetadataId = ({\n source,\n chainId,\n specVersion,\n}: Pick<AnyMiniMetadata, \"source\" | \"chainId\" | \"specVersion\">): string =>\n toHex(\n Twox128(new TextEncoder().encode(`${source}${chainId}${specVersion}${MINIMETADATA_VERSION}`))\n ).slice(-32)\n\nexport type MiniMetadata<Extra = unknown> = Omit<AnyMiniMetadata, \"extra\"> & { extra: Extra }\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary, type Codec, Enum } from \"polkadot-api\"\n\nimport type { BalanceTransferType, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n type,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { builder } = parseMetadataRpc(metadataRpc)\n const method = getTransferMethod(type)\n const { codec, location } = builder.buildCall(\"Assets\", method)\n const args = getEncodedArgs(method, token.assetId, to, value, codec)\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n\nconst getTransferMethod = (type: BalanceTransferType) => {\n // TODO handle the case where transfer_all does not exist\n switch (type) {\n case \"keep-alive\":\n return \"transfer_keep_alive\"\n case \"all\":\n return \"transfer_all\"\n case \"allow-death\":\n return \"transfer\"\n }\n}\n\nconst getEncodedArgs = (\n method: ReturnType<typeof getTransferMethod>,\n assetId: string,\n to: string,\n value: string,\n argsCodec: Codec<unknown>\n): Uint8Array => {\n try {\n switch (method) {\n case \"transfer_keep_alive\":\n case \"transfer\":\n return getTransferEncodedArgs(assetId, to, value, argsCodec)\n case \"transfer_all\":\n return getTransferAllEncodedArgs(assetId, to, argsCodec)\n }\n } catch {\n throw new Error(`Failed to encode arguments for method ${method}: ${assetId}, ${to}, ${value}`)\n }\n}\n\nconst getEncodedValue = (codec: Codec<unknown>, possibleValue: Array<() => unknown>) => {\n for (const getArgs of possibleValue) {\n try {\n return codec.enc(getArgs())\n } catch {\n // wrong inputs, ignore and try the next one\n }\n }\n\n throw new Error(\"Failed to encode\")\n}\n\n// same inputs for both KeepAlive and allowDeath\nconst getTransferEncodedArgs = (\n assetId: string,\n to: string,\n value: string,\n codec: Codec<unknown>\n) => {\n return getEncodedValue(codec, [\n () => ({\n id: Number(assetId), // for most networks\n target: Enum(\"Id\", to),\n amount: BigInt(value),\n }),\n () => ({\n id: BigInt(assetId), // for Astar\n target: Enum(\"Id\", to),\n amount: BigInt(value),\n }),\n () => ({\n id: BigInt(assetId), // for Neuroweb\n target: to,\n amount: BigInt(value),\n }),\n ])\n}\n\nconst getTransferAllEncodedArgs = (assetId: string, to: string, codec: Codec<unknown>) => {\n return getEncodedValue(codec, [\n () => ({\n id: Number(assetId), // for most networks\n dest: Enum(\"Id\", to),\n keep_alive: false,\n }),\n () => ({\n id: BigInt(assetId), // for Astar\n dest: Enum(\"Id\", to),\n keep_alive: false,\n }),\n () => ({\n id: BigInt(assetId), // for Neuroweb (although transfer_all does not exist)\n dest: to,\n keep_alive: false,\n }),\n ])\n}\n","import { map, of } from \"rxjs\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { getRpcQueryPack$ } from \"../shared/rpcQueryPack\"\nimport { buildQueries } from \"./buildQueries\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n return getRpcQueryPack$(connector, networkId, queries).pipe(\n map((balances) => ({\n success: balances,\n errors: [],\n }))\n )\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubAssetsBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubAssetsTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubAssetsTokenConfigSchema = z.strictObject({\n assetId: SubAssetsTokenSchema.shape.assetId,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubAssetsTokenConfig = z.infer<typeof SubAssetsTokenConfigSchema>\n","import { SubForeignAssetsTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { SubForeignAssetsTokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = SubForeignAssetsTokenSchema.shape.type.value\nexport const PLATFORM = SubForeignAssetsTokenSchema.shape.platform.value\n","import type { AnyMiniMetadata } from \"@talismn/chaindata-provider\"\nimport { decodeScale, papiParse } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\n\nimport log from \"../../log\"\nimport type { AmountWithLabel, IBalance } from \"../../types\"\nimport { buildNetworkStorageCoders } from \"../shared\"\nimport type { MaybeStateKey, RpcQueryPack } from \"../shared/rpcQueryPack\"\nimport type { BalanceDef } from \"../shared/types\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const buildQueries = (\n networkId: string,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n miniMetadata: AnyMiniMetadata\n): Array<RpcQueryPack<IBalance>> => {\n const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {\n storage: [\"ForeignAssets\", \"Account\"],\n })\n\n return balanceDefs\n .map(({ token, address }): RpcQueryPack<IBalance> | null => {\n const scaleCoder = networkStorageCoders?.storage\n\n const getStateKey = (onChainId: string) => {\n try {\n return scaleCoder?.keys?.enc?.(papiParse(onChainId), address) as MaybeStateKey\n } catch {\n return null\n }\n }\n\n const stateKey = getStateKey(token.onChainId)\n\n if (!stateKey) {\n log.warn(\n `Invalid assetId / address in ${networkId} storage query ${token.onChainId} / ${address}`\n )\n return null\n }\n\n const decodeResult = (changes: MaybeStateKey[]) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n balance?: bigint\n is_frozen?: boolean // most likely not used\n reason?: { type?: \"Sufficient\" }\n status?: { type?: \"Liquid\" } | { type?: \"Frozen\" }\n extra?: undefined\n }\n\n const decoded = decodeScale<DecodedType>(\n scaleCoder,\n changes[0],\n `Failed to decode substrate-assets balance on chain ${networkId}`\n ) ?? {\n balance: 0n,\n is_frozen: false,\n reason: { type: \"Sufficient\" },\n status: { type: \"Liquid\" },\n extra: undefined,\n }\n\n const isFrozen = decoded.is_frozen ?? decoded?.status?.type === \"Frozen\"\n const amount = (decoded?.balance ?? 0n).toString()\n\n // due to the following balance calculations, which are made in the `Balance` type:\n //\n // total balance = (free balance) + (reserved balance)\n // transferable balance = (free balance) - (frozen balance)\n //\n // when `isFrozen` is true we need to set **both** the `free` and `frozen` amounts\n // of this balance to the value we received from the RPC.\n //\n // if we only set the `frozen` amount, then the `total` calculation will be incorrect!\n const free = amount\n const frozen = token.isFrozen || isFrozen ? amount : \"0\"\n\n // include balance values even if zero, so that newly-zero values overwrite old values\n const balanceValues: Array<AmountWithLabel<string>> = [\n { type: \"free\", label: \"free\", amount: free.toString() },\n { type: \"locked\", label: \"frozen\", amount: frozen.toString() },\n ]\n\n const balance: IBalance = {\n source: \"substrate-assets\",\n status: \"live\",\n address,\n networkId,\n tokenId: token.id,\n values: balanceValues,\n }\n\n return balance\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n .filter(isNotNil)\n}\n","import log from \"../../log\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { buildQueries } from \"./buildQueries\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n const balances = await fetchRpcQueryPack(connector, networkId, queries)\n\n return balanceDefs.reduce<FetchBalanceResults>(\n (acc, def) => {\n const balance = balances.find(\n (b) => b?.address === def.address && b?.tokenId === def.token.id\n )\n if (balance) acc.success.push(balance)\n //if no entry consider empty balance\n else\n acc.success.push({\n address: def.address,\n networkId,\n tokenId: def.token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values: [\n { type: \"free\", label: \"free\", amount: \"0\" },\n { type: \"locked\", label: \"frozen\", amount: \"0\" },\n ],\n })\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","import {\n type AnyMiniMetadata,\n type SubForeignAssetsToken,\n SubForeignAssetsTokenSchema,\n subForeignAssetTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { getStorageKeyPrefix, papiStringify, parseMetadataRpc } from \"@talismn/scale\"\nimport { assign, keyBy, keys } from \"lodash-es\"\nimport type { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { QueryStorageResult } from \"../shared\"\nimport { MODULE_TYPE, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n miniMetadata,\n}) => {\n const anyMiniMetadata = miniMetadata as AnyMiniMetadata\n if (!anyMiniMetadata?.data) return []\n\n const { builder } = parseMetadataRpc(anyMiniMetadata.data)\n const assetCodec = builder.buildStorage(\"ForeignAssets\", \"Asset\")\n const metadataCodec = builder.buildStorage(\"ForeignAssets\", \"Metadata\")\n\n const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([\n connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"ForeignAssets\", \"Asset\"),\n ]),\n connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"ForeignAssets\", \"Metadata\"),\n ]),\n ])\n\n const [assetStorageResults, metadataStorageResults] = await Promise.all([\n connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [allAssetStorageKeys]),\n connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [allMetadataStorageKeys]),\n ])\n\n // if there is at least one storage entry, the results will be an array with a single object\n // some networks avec the pallet with no tokens in it, in which case the response will be an empty array\n const assetStorageEntries: [key: `0x${string}`, value: `0x${string}`][] =\n assetStorageResults[0]?.changes ?? []\n const metadataStorageEntries: [key: `0x${string}`, value: `0x${string}`][] =\n metadataStorageResults[0]?.changes ?? []\n\n const assetByOnChainId = keyBy(\n assetStorageEntries.map(([key, value]) => {\n const [decodedKey] = assetCodec.keys.dec(key) as [unknown]\n const onChainId = papiStringify(decodedKey)\n const asset = assetCodec.value.dec(value) as {\n is_sufficient: boolean\n min_balance: bigint\n }\n return { onChainId, existentialDeposit: asset.min_balance, isSufficient: asset.is_sufficient }\n }),\n (a) => a.onChainId\n )\n\n const metadataByOnChainId = keyBy(\n metadataStorageEntries.map(([key, value]) => {\n const [decodedKey] = metadataCodec.keys.dec(key) as [unknown]\n const onChainId = papiStringify(decodedKey)\n const metadata = metadataCodec.value.dec(value) as {\n decimals?: number\n deposit?: bigint\n is_frozen?: boolean\n name?: Binary\n symbol?: Binary\n }\n return {\n onChainId,\n decimals: metadata.decimals,\n isFrozen: metadata.is_frozen,\n name: metadata.name?.asText(),\n symbol: metadata.symbol?.asText(),\n }\n }),\n (a) => a.onChainId\n )\n\n const allTokens = keys(assetByOnChainId).map((onChainId) =>\n assign({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? undefined)\n )\n\n const configTokenByOnChainId = keyBy(tokens, (t) => t.onChainId)\n\n return (\n allTokens\n .map(\n (asset): SubForeignAssetsToken => ({\n id: subForeignAssetTokenId(networkId, asset.onChainId),\n type: MODULE_TYPE,\n platform: \"polkadot\",\n networkId,\n onChainId: String(asset.onChainId),\n isSufficient: asset.isSufficient,\n isFrozen: asset.isFrozen,\n name: asset.name,\n symbol: asset.symbol as string,\n decimals: asset.decimals ?? 0,\n existentialDeposit: String(asset.existentialDeposit),\n isDefault: true,\n })\n )\n // keep all tokens listed in the config + all tokens marked as sufficient\n .filter((token) => {\n const configToken = configTokenByOnChainId[token.onChainId]\n return configToken || token.isSufficient\n })\n // apply config overrides\n .map((token) => {\n const configToken = configTokenByOnChainId[token.onChainId]\n return configToken ? assign({}, token, configToken) : token\n })\n // validate results\n .filter((t) => {\n const parsed = SubForeignAssetsTokenSchema.safeParse(t)\n // if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE}`, t)\n\n return parsed.success\n })\n )\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, hasStorageItems } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc),\n extra: null,\n } as AnyMiniMetadata\n}\n\nconst getData = (metadataRpc: `0x${string}`): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n // ensure the network has all the required bits\n if (!hasStorageItems(unifiedMetadata, \"ForeignAssets\", [\"Account\", \"Asset\", \"Metadata\"]))\n return null\n\n compactMetadata(metadata, [{ pallet: \"ForeignAssets\", items: [\"Account\", \"Asset\", \"Metadata\"] }])\n\n return encodeMetadata(metadata)\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { papiParse, parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary, type Codec, Enum } from \"polkadot-api\"\n\nimport type { BalanceTransferType, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n type,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { builder } = parseMetadataRpc(metadataRpc)\n const method = getTransferMethod(type)\n const { codec, location } = builder.buildCall(\"ForeignAssets\", method)\n const args = getEncodedArgs(method, token.onChainId, to, value, codec)\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n\nconst getTransferMethod = (type: BalanceTransferType) => {\n switch (type) {\n case \"keep-alive\":\n return \"transfer_keep_alive\"\n case \"all\":\n return \"transfer_all\"\n case \"allow-death\":\n return \"transfer\"\n }\n}\n\nconst getEncodedArgs = (\n method: ReturnType<typeof getTransferMethod>,\n onChainId: string,\n to: string,\n value: string,\n argsCodec: Codec<unknown>\n): Uint8Array => {\n try {\n switch (method) {\n case \"transfer_keep_alive\":\n case \"transfer\":\n return getTransferEncodedArgs(onChainId, to, value, argsCodec)\n case \"transfer_all\":\n return getTransferAllEncodedArgs(onChainId, to, argsCodec)\n }\n } catch {\n throw new Error(\n `Failed to encode arguments for method ${method}: ${onChainId}, ${to}, ${value}`\n )\n }\n}\n\nconst getEncodedValue = (codec: Codec<unknown>, possibleValue: Array<() => unknown>) => {\n for (const getArgs of possibleValue) {\n try {\n return codec.enc(getArgs())\n } catch {\n // wrong inputs, ignore and try the next one\n }\n }\n\n throw new Error(\"Failed to encode\")\n}\n\n// same inputs for both KeepAlive and allowDeath\nconst getTransferEncodedArgs = (\n onChainId: string,\n to: string,\n value: string,\n codec: Codec<unknown>\n) => {\n return getEncodedValue(codec, [\n () => ({\n id: papiParse(onChainId), // for most networks\n target: Enum(\"Id\", to),\n amount: BigInt(value),\n }),\n () => ({\n id: papiParse(onChainId), // for Neuroweb\n target: to,\n amount: BigInt(value),\n }),\n ])\n}\n\nconst getTransferAllEncodedArgs = (onChainId: string, to: string, codec: Codec<unknown>) => {\n return getEncodedValue(codec, [\n () => ({\n id: papiParse(onChainId), // for most networks\n dest: Enum(\"Id\", to),\n keep_alive: false,\n }),\n () => ({\n id: papiParse(onChainId), // for Neuroweb\n dest: to,\n keep_alive: false,\n }),\n ])\n}\n","import { map, of } from \"rxjs\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { getRpcQueryPack$ } from \"../shared/rpcQueryPack\"\nimport { buildQueries } from \"./buildQueries\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n return getRpcQueryPack$(connector, networkId, queries).pipe(\n map((balances) => ({\n success: balances,\n errors: [],\n }))\n )\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubForeignAssetsBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubForeignAssetsTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubForeignAssetsTokenConfigSchema = z.strictObject({\n onChainId: SubForeignAssetsTokenSchema.shape.onChainId,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubForeignAssetsTokenConfig = z.infer<typeof SubForeignAssetsTokenConfigSchema>\n","import { SubHydrationTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { SubHydrationTokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = SubHydrationTokenSchema.shape.type.value\nexport const PLATFORM = SubHydrationTokenSchema.shape.platform.value\n","import { keyBy, uniq } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalance } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRuntimeCallResult } from \"../shared\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`, {\n tokensWithAddresses,\n })\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const addresses = uniq(balanceDefs.map((def) => def.address))\n\n try {\n const res = await Promise.all(\n addresses.map((address) =>\n fetchRuntimeCallResult<\n [onChainId: number, balance: { free: bigint; reserved: bigint; frozen: bigint }][]\n >(connector, networkId, miniMetadata.data!, \"CurrenciesApi\", \"accounts\", [address])\n )\n )\n\n const fetchedBalances = addresses.flatMap((address, index) => {\n return res[index]\n .map(([onChainId, balance]) => ({\n address,\n onChainId,\n free: balance.free.toString(),\n reserved: balance.reserved.toString(),\n frozen: balance.frozen.toString(),\n }))\n .filter((b) => b.onChainId !== undefined)\n })\n\n const balancesByKey = keyBy(fetchedBalances, (b) => `${b.address}:${b.onChainId}`)\n\n const success = tokensWithAddresses.reduce((acc, [token, addresses]) => {\n if (token.type === MODULE_TYPE)\n for (const address of addresses) {\n const rawBalance = balancesByKey[`${address}:${token.onChainId}`]\n\n // the endpoint only returns entries for which the address has a non-zero balance\n // => generate an zero balance object if not found\n const balance: IBalance = {\n address,\n networkId,\n tokenId: token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values: [\n {\n type: \"free\",\n label: \"free\",\n amount: rawBalance?.free.toString() ?? \"0\",\n },\n {\n type: \"reserved\",\n label: \"reserved\",\n amount: rawBalance?.reserved.toString() ?? \"0\",\n },\n {\n type: \"locked\",\n label: \"frozen\",\n amount: rawBalance?.frozen.toString() ?? \"0\",\n },\n ],\n }\n\n acc.push(balance)\n }\n\n return acc\n }, [] as IBalance[])\n\n return {\n success,\n errors: [],\n }\n } catch (err) {\n log.warn(\"Failed to fetch balances for substrate-hydration\", err)\n\n const errors = balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Failed to fetch balance for ${def.address} on ${networkId}`),\n }))\n\n return {\n success: [],\n errors,\n }\n }\n}\n","import {\n type AnyMiniMetadata,\n type SubHydrationToken,\n SubHydrationTokenSchema,\n subHydrationTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { getStorageKeyPrefix, parseMetadataRpc } from \"@talismn/scale\"\nimport { assign, keyBy } from \"lodash-es\"\nimport type { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { QueryStorageResult } from \"../shared\"\nimport { MODULE_TYPE, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n miniMetadata,\n}) => {\n const anyMiniMetadata = miniMetadata as AnyMiniMetadata\n if (!anyMiniMetadata?.data) return []\n\n const { builder } = parseMetadataRpc(anyMiniMetadata.data)\n const assetsCodec = builder.buildStorage(\"AssetRegistry\", \"Assets\")\n\n const allAssetStorageKeys = await connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"AssetRegistry\", \"Assets\"),\n ])\n\n const assetStorageResults = await connector.send<QueryStorageResult>(\n networkId,\n \"state_queryStorageAt\",\n [allAssetStorageKeys]\n )\n\n const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : []\n\n const configTokenByAssetId = keyBy(tokens, (t) => t.onChainId)\n\n return (\n assetStorageEntries\n .map(([key, value]) => {\n // parse results\n const [onChainId] = assetsCodec.keys.dec(key) as [number]\n const asset = assetsCodec.value.dec(value) as {\n name: Binary | undefined\n symbol: Binary | undefined\n decimals: number | undefined\n is_sufficient: boolean\n asset_type: { type: string }\n existential_deposit: bigint\n }\n\n return {\n onChainId,\n assetType: asset.asset_type.type,\n isSufficient: asset.is_sufficient,\n name: asset.name?.asText(),\n symbol: asset.symbol?.asText(),\n decimals: asset.decimals,\n existentialDeposit: asset.existential_deposit.toString(),\n }\n })\n // convert asset to a SubHydrationToken\n .map(\n (asset): SubHydrationToken => ({\n id: subHydrationTokenId(networkId, asset.onChainId),\n type: MODULE_TYPE,\n platform: \"polkadot\",\n networkId,\n onChainId: asset.onChainId,\n assetType: asset.assetType as SubHydrationToken[\"assetType\"], // Erc20 or Token,\n isSufficient: asset.isSufficient,\n name: asset.name,\n symbol: asset.symbol as string,\n decimals: asset.decimals ?? 0,\n existentialDeposit: asset.existentialDeposit,\n isDefault: true,\n })\n )\n // keep all tokens listed in the config + all tokens marked as sufficient\n .filter((token) => {\n const configToken = configTokenByAssetId[token.onChainId]\n return configToken || token.isSufficient\n })\n // apply config overrides\n .map((token) => {\n const configToken = configTokenByAssetId[token.onChainId]\n return configToken ? assign({}, token, configToken) : token\n })\n // validate results\n .filter((t) => {\n const parsed = SubHydrationTokenSchema.safeParse(t)\n // if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE}`, t)\n\n return parsed.success\n })\n )\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, hasRuntimeApi, hasStorageItem } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc),\n extra: null,\n } as AnyMiniMetadata\n}\n\nconst getData = (metadataRpc: `0x${string}`): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n // ensure the network has all the required bits\n if (\n !hasStorageItem(unifiedMetadata, \"AssetRegistry\", \"Assets\") ||\n !hasStorageItem(unifiedMetadata, \"Tokens\", \"Accounts\") ||\n !hasRuntimeApi(unifiedMetadata, \"CurrenciesApi\", \"accounts\")\n )\n return null\n\n compactMetadata(\n metadata,\n [\n { pallet: \"AssetRegistry\", items: [\"Assets\"] }, // token specs\n { pallet: \"Tokens\", items: [\"Accounts\"] }, // balances for tokens\n ],\n [\n {\n runtimeApi: \"CurrenciesApi\",\n methods: [\"accounts\"],\n },\n ]\n )\n\n return encodeMetadata(metadata)\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n // there is only one transfer method, no existential deposit handling.\n // => leave this to the frontend and dry runs\n const { builder } = parseMetadataRpc(metadataRpc)\n const { codec, location } = builder.buildCall(\"Currencies\", \"transfer\")\n const args = {\n dest: to,\n currency_id: token.onChainId,\n amount: BigInt(value),\n }\n\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), codec.enc(args)]))\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n // on hydration balances are fetched using a runtimeApi, which can't be subscribed to.\n // => poll values for each block\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n miniMetadata,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n miniMetadata,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubHydrationBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubHydrationTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubHydrationTokenConfigSchema = z.strictObject({\n onChainId: SubHydrationTokenSchema.shape.onChainId,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubHydrationTokenConfig = z.infer<typeof SubHydrationTokenConfigSchema>\n","import { SubNativeTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type {\n SubNativeMiniMetadataExtra as MiniMetadataExtra,\n SubNativeModuleConfig as ModuleConfig,\n SubNativeTokenConfig as TokenConfig,\n} from \"./types\"\n\nexport const MODULE_TYPE = SubNativeTokenSchema.shape.type.value\nexport const PLATFORM = SubNativeTokenSchema.shape.platform.value\n","import { decodeScale, type ScaleStorageCoder } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\nimport type { Binary, Enum } from \"polkadot-api\"\n\nimport type { AmountWithLabel, IBalance, MiniMetadata } from \"../../../types\"\nimport { type BalanceDef, buildNetworkStorageCoders } from \"../../shared\"\nimport type { MaybeStateKey, RpcQueryPack } from \"../../shared/rpcQueryPack\"\nimport type { MiniMetadataExtra } from \"../config\"\nimport { getLockedType } from \"../util/lockTypes\"\n\nexport type NomPoolMemberInfo = {\n points: string\n poolId: string\n unbondingEras: Array<{ era: string; amount: string }>\n}\n\nexport type BaseBalance = { balance: IBalance; nomPoolMemberInfo: NomPoolMemberInfo | null }\n\nexport const buildBaseQueries = (\n networkId: string,\n balanceDefs: BalanceDef<\"substrate-native\">[],\n miniMetadata: MiniMetadata<MiniMetadataExtra>\n): Array<RpcQueryPack<BaseBalance>> => {\n const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {\n account: [\"System\", \"Account\"],\n stakingLedger: [\"Staking\", \"Ledger\"],\n reserves: [\"Balances\", \"Reserves\"], // unused ??\n holds: [\"Balances\", \"Holds\"],\n locks: [\"Balances\", \"Locks\"],\n freezes: [\"Balances\", \"Freezes\"],\n poolMembers: [\"NominationPools\", \"PoolMembers\"],\n })\n\n if (!networkStorageCoders)\n throw new Error(`No network storage coders found for networkId: ${networkId}`)\n\n return balanceDefs\n .map(({ token, address }): RpcQueryPack<BaseBalance> | null => {\n const getStateKeys = () => {\n try {\n const accountStateKey = networkStorageCoders.account\n ? (networkStorageCoders.account.keys.enc(address) as `0x${string}`)\n : null\n\n const locksStateKey = networkStorageCoders.locks\n ? (networkStorageCoders.locks.keys.enc(address) as `0x${string}`)\n : null\n\n const freezesStateKey = networkStorageCoders.freezes\n ? (networkStorageCoders.freezes.keys.enc(address) as `0x${string}`)\n : null\n\n const holdsStateKey = networkStorageCoders.holds\n ? (networkStorageCoders.holds.keys.enc(address) as `0x${string}`)\n : null\n\n const stakingLedgerStateKey = networkStorageCoders.stakingLedger\n ? (networkStorageCoders.stakingLedger.keys.enc(address) as `0x${string}`)\n : null\n\n const poolMemberStateKey = networkStorageCoders.poolMembers\n ? (networkStorageCoders.poolMembers.keys.enc(address) as `0x${string}`)\n : null\n\n return [\n accountStateKey,\n locksStateKey,\n freezesStateKey,\n holdsStateKey,\n stakingLedgerStateKey,\n poolMemberStateKey,\n ]\n } catch {\n // most likely invalid address\n return []\n }\n }\n\n return {\n stateKeys: getStateKeys(),\n decodeResult: (changes: MaybeStateKey[]) => {\n const balance: IBalance = {\n source: \"substrate-native\",\n status: \"live\",\n address,\n networkId,\n tokenId: token.id,\n values: [],\n useLegacyTransferableCalculation: miniMetadata.extra.useLegacyTransferableCalculation,\n }\n\n let nomPoolMemberInfo: NomPoolMemberInfo | null = null\n\n const [\n accountChange,\n lockChange,\n freezesChange,\n holdsChange,\n stakingLedgerChange,\n nomPoolMemberChange,\n ] = changes\n\n if (networkStorageCoders.account) {\n // for account balance we decode even empty values\n const baseValues = decodeBaseResult(\n networkStorageCoders.account,\n accountChange,\n networkId\n )\n balance.values.push(...baseValues)\n }\n\n if (networkStorageCoders.locks && lockChange) {\n const lockValues = decodeLocksResult(networkStorageCoders.locks, lockChange, networkId)\n balance.values.push(...lockValues)\n }\n\n if (networkStorageCoders.freezes && freezesChange) {\n const freezesValues = decodeFreezesResult(\n networkStorageCoders.freezes,\n freezesChange,\n networkId\n )\n balance.values.push(...freezesValues)\n }\n\n if (networkStorageCoders.holds && holdsChange) {\n const holdsValues = decodeHoldsResult(\n networkStorageCoders.holds,\n holdsChange,\n networkId\n )\n balance.values.push(...holdsValues)\n }\n\n if (networkStorageCoders.stakingLedger && stakingLedgerChange) {\n const stakingLedgerValues = decodeStakingLedgerResult(\n networkStorageCoders.stakingLedger,\n stakingLedgerChange,\n networkId\n )\n balance.values.push(...stakingLedgerValues)\n }\n\n if (networkStorageCoders.poolMembers && nomPoolMemberChange) {\n const nomPoolMemberValue = decodePoolMemberResult(\n networkStorageCoders.poolMembers,\n nomPoolMemberChange,\n networkId\n )\n\n if (nomPoolMemberValue) nomPoolMemberInfo = nomPoolMemberValue\n }\n\n return { balance, nomPoolMemberInfo }\n },\n }\n })\n .filter(isNotNil)\n}\n\nconst decodeBaseResult = (\n coder: ScaleStorageCoder,\n value: string | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n data?: {\n flags?: bigint\n free?: bigint\n frozen?: bigint\n reserved?: bigint\n\n // deprecated fields (they only show up on old chains)\n feeFrozen?: bigint\n miscFrozen?: bigint\n }\n }\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode base native balance on chain ${networkId}`\n )\n\n const free = (decoded?.data?.free ?? 0n).toString()\n const reserved = (decoded?.data?.reserved ?? 0n).toString()\n const miscLock = (\n (decoded?.data?.miscFrozen ?? 0n) +\n // new chains don't split their `frozen` amount into `feeFrozen` and `miscFrozen`.\n // for these chains, we'll use the `frozen` amount as `miscFrozen`.\n ((decoded?.data as DecodedType[\"data\"])?.frozen ?? 0n)\n ).toString()\n const feesLock = (decoded?.data?.feeFrozen ?? 0n).toString()\n\n // even if these values are 0, we still need to add them to the balanceJson.values array\n // so that the balance pool can handle newly zeroed balances\n // const existingValues = Object.fromEntries(\n // balanceJson.values.map((v) => [getValueId(v), v]),\n // )\n const newValues: AmountWithLabel<string>[] = [\n { type: \"free\", label: \"free\", amount: free.toString() },\n { type: \"reserved\", label: \"reserved\", amount: reserved.toString() },\n { type: \"locked\", label: \"misc\", amount: miscLock.toString() },\n { type: \"locked\", label: \"fees\", amount: feesLock.toString() },\n ]\n\n return newValues\n}\n\nconst decodeLocksResult = (\n coder: ScaleStorageCoder,\n value: string | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = Array<{\n id?: Binary\n amount?: bigint\n }>\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode lock on chain ${networkId}`\n )\n\n const locksQueryLocks: Array<AmountWithLabel<string>> =\n decoded?.map?.((lock) => ({\n type: \"locked\",\n source: \"substrate-native-locks\",\n label: getLockedType(lock?.id?.asText?.()),\n meta: { id: lock?.id?.asText?.() },\n amount: (lock?.amount ?? 0n).toString(),\n })) ?? []\n\n return locksQueryLocks\n}\n\nconst decodeFreezesResult = (\n coder: ScaleStorageCoder,\n value: `0x${string}` | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = Array<{\n id?: { type?: string }\n amount?: bigint\n }>\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode freeze on chain ${networkId}`\n )\n\n const freezesValues: Array<AmountWithLabel<string>> =\n decoded?.map?.((lock) => ({\n type: \"locked\",\n source: \"substrate-native-freezes\",\n label: getLockedType(lock?.id?.type?.toLowerCase?.()),\n amount: lock?.amount?.toString?.() ?? \"0\",\n })) ?? []\n\n return freezesValues\n}\n\nconst decodeHoldsResult = (\n coder: ScaleStorageCoder,\n value: `0x${string}` | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = Array<{\n id?: Enum<{ DelegatedStaking: Enum<{ StakingDelegation: undefined }> }>\n amount?: bigint\n }>\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode holds on chain ${networkId}`\n )\n\n // at this time we re only interested in DelegatedStaking holds, to determine if nom pool staked amount is included in reserved or not\n const holdsValues: Array<AmountWithLabel<string>> =\n decoded\n ?.filter((hold) => hold.id?.type)\n .map((hold) => ({\n type: \"locked\",\n source: \"substrate-native-holds\",\n label: hold.id!.type,\n // anount needs to be 0 or a row could appear in the UI, this entry is just for information\n amount: \"0\",\n meta: { amount: (hold?.amount ?? 0n).toString() },\n })) ?? []\n\n return holdsValues\n}\n\nconst decodeStakingLedgerResult = (\n coder: ScaleStorageCoder,\n value: `0x${string}` | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n active: bigint\n legacy_claimed_rewards: number[]\n stash: string\n total: bigint\n unlocking: Array<{\n era: number\n value: bigint\n }>\n } | null\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode unbonding query on chain ${networkId}`\n )\n\n const totalUnlocking =\n decoded?.unlocking?.reduce?.((acc, unlocking) => acc + unlocking.value, 0n) ?? 0n\n\n const stakingLedgerResults: Array<AmountWithLabel<string>> =\n totalUnlocking <= 0n\n ? []\n : [\n {\n type: \"locked\",\n source: \"substrate-native-unbonding\",\n label: \"Unbonding\",\n amount: totalUnlocking.toString(),\n },\n ]\n\n return stakingLedgerResults\n}\n\nconst decodePoolMemberResult = (\n coder: ScaleStorageCoder,\n value: `0x${string}` | null,\n networkId: string\n): NomPoolMemberInfo | null => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n pool_id: number\n points: bigint\n last_recorded_reward_counter?: bigint\n /** Array of `[Era, Amount]` */\n unbonding_eras: Array<[number, bigint] | undefined>\n }\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode poolMembers on chain ${networkId}`\n )\n\n if (!decoded) return null\n\n const poolId: string = decoded.pool_id.toString()\n const points: string = decoded.points.toString()\n const unbondingEras: Array<{ era: string; amount: string }> = Array.from(\n decoded.unbonding_eras ?? []\n ).flatMap((entry) => {\n if (entry === undefined) return []\n const [key, value] = Array.from(entry)\n\n const era = key.toString()\n const amount = value.toString()\n if (typeof era !== \"string\" || typeof amount !== \"string\") return []\n\n return { era, amount }\n })\n\n return { poolId, points, unbondingEras }\n}\n","import upperFirst from \"lodash-es/upperFirst\"\n\nimport type { Balance, BalanceFormatter, LockedAmount } from \"../../../types\"\n\nexport type BalanceLockType =\n | \"reserved\"\n | \"democracy\"\n | \"crowdloan\"\n | \"staking\"\n | \"nompools-staking\"\n | \"nompools-unbonding\"\n | \"subtensor-staking\"\n | \"vesting\"\n | \"dapp-staking\"\n | `other-${string}`\n | \"other\"\n\nconst getOtherType: (input: string) => `other-${string}` = (input) =>\n `other-${input}` as `other-${string}`\n\n/**\n * For converting the value of `lock?.id?.toUtf8?.()` which is retrieved from\n * the Balances.Locks storage key into a useful classification for our UI\n */\nexport const getLockedType = (input?: string): BalanceLockType => {\n if (typeof input !== \"string\") return getOtherType(\"unknown\")\n\n if (input.includes(\"vesting\")) return \"vesting\"\n if (input.includes(\"calamvst\")) return \"vesting\" // vesting on manta network\n if (input.includes(\"ormlvest\")) return \"vesting\" // vesting ORML tokens\n if (input.includes(\"pyconvot\")) return \"democracy\"\n if (input.includes(\"democrac\")) return \"democracy\"\n if (input.includes(\"democracy\")) return \"democracy\"\n if (input.includes(\"phrelect\")) return \"democracy\" // specific to council\n if (input.includes(\"staking\")) return \"staking\"\n if (input.includes(\"stkngdel\")) return \"staking\" // staking delegator\n if (input.includes(\"stkngcol\")) return \"staking\" // staking collator\n if (input.includes(\"kiltpstk\")) return \"staking\" // Kilt specific staking\n if (input.includes(\"dapstake\")) return \"dapp-staking\" // Astar specific\n if (input.includes(\"appstake\")) return \"dapp-staking\" // Quartz (unique) specific\n if (input.includes(\"dappstaking\")) return \"dapp-staking\"\n\n // Joystream specifics https://github.com/Joystream/pioneer/blob/dev/packages/ui/src/accounts/model/lockTypes.ts\n if (input.includes(\"voting\")) return \"democracy\"\n if (input.includes(\"candidac\")) return \"democracy\" // Council Candidate\n if (input.includes(\"councilo\")) return \"democracy\" // Councilor\n if (input.includes(\"proposal\")) return \"democracy\"\n if (input.includes(\"boundsta\")) return \"staking\" // Bound Staking Account\n if (input.includes(\"invitemb\")) return getOtherType(input) // Invite member\n if (input.includes(\"bounty\")) return getOtherType(input)\n if (input.startsWith(\"wg-\")) return getOtherType(input)\n\n // ignore technical or undocumented lock types\n if (input.includes(\"pdexlock\")) return getOtherType(input)\n if (input.includes(\"phala/sp\")) return getOtherType(input)\n if (input.includes(\"aca/earn\")) return getOtherType(input)\n if (input.includes(\"stk_stks\")) return getOtherType(input)\n\n // biome-ignore lint/suspicious/noConsole: legacy\n console.warn(`unknown locked type: ${input}`)\n return getOtherType(input)\n}\n\nconst baseLockLabels = [\"fees\", \"misc\"]\nconst isBaseLock = (lock: Pick<LockedAmount<string>, \"label\">) =>\n baseLockLabels.includes(lock.label)\nconst isNonBaseLock = (lock: Pick<LockedAmount<string>, \"label\">) => !isBaseLock(lock)\nexport const filterBaseLocks = (\n locks: Array<Omit<LockedAmount<string>, \"amount\"> & { amount: BalanceFormatter }>\n) => {\n const hasNonBaseLocks = locks.some(isNonBaseLock)\n if (!hasNonBaseLocks) return locks\n\n return locks.filter(isNonBaseLock)\n}\n\n// TODO: Make these titles translatable\nexport const getLockTitle = (\n lock: Pick<LockedAmount<string>, \"label\" | \"meta\">,\n // biome-ignore lint/correctness/noUnusedFunctionParameters: legacy\n { balance }: { balance?: Balance } = {}\n) => {\n if (!lock.label) return lock.label\n\n if (lock.label === \"democracy\") return \"Governance\"\n if (lock.label === \"crowdloan\") return \"Crowdloan\"\n if (lock.label === \"nompools-staking\") return \"Pooled Staking\"\n if (lock.label === \"nompools-unbonding\") return \"Pooled Staking\"\n if (lock.label === \"subtensor-staking\") return \"Root Staking\"\n if (lock.label === \"dapp-staking\") return \"DApp Staking\"\n if (lock.label === \"fees\") return \"Locked (Fees)\"\n if (lock.label === \"misc\") return \"Locked\"\n if (lock.label.startsWith(\"other\")) return \"Locked\"\n\n return upperFirst(lock.label)\n}\n","import { decodeScale, type ScaleStorageCoder } from \"@talismn/scale\"\nimport type { Binary } from \"polkadot-api\"\n\nimport type { IBalance, MiniMetadata } from \"../../../types\"\nimport { buildNetworkStorageCoders } from \"../../shared\"\nimport type { RpcQueryPack } from \"../../shared/rpcQueryPack\"\nimport type { MiniMetadataExtra } from \"../config\"\nimport { nompoolStashAccountId } from \"../util/nompoolAccountId\"\nimport type { BaseBalance, NomPoolMemberInfo } from \"./buildBaseQueries\"\n\nexport const buildNomPoolQueries = (\n networkId: string,\n partialBalances: BaseBalance[],\n miniMetadata: MiniMetadata<MiniMetadataExtra>\n): Array<RpcQueryPack<IBalance>> => {\n const networkStorageCoders = getNomPoolCoders(networkId, miniMetadata)\n\n if (!networkStorageCoders)\n throw new Error(`No network storage coders found for networkId: ${networkId}`)\n\n return partialBalances.map(({ balance, nomPoolMemberInfo }) => {\n const stateKeys = getNomPoolStateKeys(\n networkStorageCoders,\n nomPoolMemberInfo,\n miniMetadata.extra\n )\n\n return {\n stateKeys,\n decodeResult: (changes: (`0x${string}` | null)[]) => {\n if (!nomPoolMemberInfo || !stateKeys.length || changes.includes(null)) return balance\n\n const accountPoints = nomPoolMemberInfo?.points ?? \"0\"\n\n const { poolPoints = \"0\" } = decodePoolPoints(\n networkStorageCoders.bondedPools!,\n changes[0]!,\n networkId\n )\n const { poolTotalActiveStake = \"0\" } = decodePoolStake(\n networkStorageCoders.ledger!,\n changes[1]!,\n networkId\n )\n const { metadata = \"0\" } = decodePoolMeta(\n networkStorageCoders.metadata!,\n changes[2]!,\n networkId\n )\n\n const amount =\n accountPoints === \"0\" || poolPoints === \"0\" || poolTotalActiveStake === \"0\"\n ? 0n\n : (BigInt(poolTotalActiveStake) * BigInt(accountPoints)) / BigInt(poolPoints)\n\n const unbondingAmount = nomPoolMemberInfo.unbondingEras.reduce(\n (total, { amount }) => total + BigInt(amount ?? \"0\"),\n 0n\n )\n\n return {\n ...balance,\n values: [\n ...(balance.values?.filter(({ source }) => source !== \"nompools-staking\") ?? []),\n {\n source: \"nompools-staking\",\n type: \"nompool\",\n label: \"nompools-staking\",\n amount: amount.toString(),\n meta: { type: \"nompool\", poolId: nomPoolMemberInfo.poolId, description: metadata },\n },\n {\n source: \"nompools-staking\",\n type: \"nompool\",\n label: \"nompools-unbonding\",\n amount: unbondingAmount.toString(),\n meta: {\n poolId: nomPoolMemberInfo.poolId,\n description: metadata ?? `Pool ${nomPoolMemberInfo.poolId}`,\n unbonding: true,\n },\n },\n ],\n }\n },\n }\n })\n}\n\nconst getNomPoolCoders = (networkId: string, miniMetadata: MiniMetadata<MiniMetadataExtra>) => {\n return buildNetworkStorageCoders(networkId, miniMetadata, {\n poolMembers: [\"NominationPools\", \"PoolMembers\"],\n bondedPools: [\"NominationPools\", \"BondedPools\"],\n ledger: [\"Staking\", \"Ledger\"],\n metadata: [\"NominationPools\", \"Metadata\"],\n })\n}\n\nconst decodePoolPoints = (coder: ScaleStorageCoder, value: string, networkId: string) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n commission?: unknown\n member_counter?: number\n points: bigint\n roles?: unknown\n state?: unknown\n }\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode bondedPools on chain ${networkId}`\n )\n\n return { poolPoints: decoded?.points.toString() }\n}\n\nconst decodePoolStake = (coder: ScaleStorageCoder, value: string, networkId: string) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n active: bigint\n legacy_claimed_rewards?: number[]\n stash?: string\n total?: bigint\n unlocking?: Array<{ value?: bigint; era?: number }>\n }\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode ledger on chain ${networkId}`\n )\n\n return { poolTotalActiveStake: decoded?.active.toString() }\n}\n\nconst decodePoolMeta = (coder: ScaleStorageCoder, value: string, networkId: string) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = Binary\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode metadata on chain ${networkId}`\n )\n\n const metadata = decoded?.asText()\n\n return { metadata }\n}\n\nconst getNomPoolStateKeys = (\n coders: ReturnType<typeof getNomPoolCoders>,\n nomPoolMemberInfo: NomPoolMemberInfo | null,\n extra: MiniMetadataExtra\n): `0x${string}`[] => {\n if (\n !nomPoolMemberInfo ||\n !extra.nominationPoolsPalletId ||\n !coders?.bondedPools ||\n !coders.ledger ||\n !coders.metadata\n )\n return []\n\n try {\n const poolId = nomPoolMemberInfo.poolId\n const stashAddress = nompoolStashAccountId(extra.nominationPoolsPalletId, poolId)\n\n const poolPointsStateKey = coders.bondedPools.keys.enc(poolId) as `0x${string}`\n const poolStakeStateKey = coders.ledger.keys.enc(stashAddress) as `0x${string}`\n const poolMetaStateKey = coders.metadata.keys.enc(poolId) as `0x${string}`\n\n return [poolPointsStateKey, poolStakeStateKey, poolMetaStateKey]\n } catch {\n return []\n }\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { AccountId, type SS58String } from \"polkadot-api\"\nimport { u32 } from \"scale-ts\"\n\n/**\n * Each nominationPool in the nominationPools pallet has access to some accountIds which have no\n * associated private key. Instead, they are derived from this function.\n */\nconst nompoolAccountId = (palletId: string, poolId: string | number, index: number): SS58String => {\n const utf8Encoder = new TextEncoder()\n const encModPrefix = utf8Encoder.encode(\"modl\")\n const encPalletId = utf8Encoder.encode(palletId)\n\n const encIndex = new Uint8Array([index])\n const encPoolId = u32.enc(typeof poolId === \"string\" ? parseInt(poolId, 10) : poolId)\n\n const length = encModPrefix.length + encPalletId.length + encIndex.length + encPoolId.length\n const remainingBytes = 32 - length\n const encEmptyH256 = new Uint8Array(remainingBytes)\n\n const bytes = mergeUint8([encModPrefix, encPalletId, encIndex, encPoolId, encEmptyH256])\n\n return AccountId().dec(bytes)\n}\n/** The stash account for the nomination pool */\nexport const nompoolStashAccountId = (palletId: string, poolId: string | number) =>\n nompoolAccountId(palletId, poolId, 0)\n/** The rewards account for the nomination pool */\nexport const nompoolRewardAccountId = (palletId: string, poolId: string | number) =>\n nompoolAccountId(palletId, poolId, 1)\n","import log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { type MiniMetadataExtra, MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\nimport { buildBaseQueries } from \"./queries/buildBaseQueries\"\nimport { buildNomPoolQueries } from \"./queries/buildNomPoolQueries\"\n\nexport const fetchBalances: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"fetchBalances\"] = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata)\n const partialBalances = await fetchRpcQueryPack(connector, networkId, baseQueries)\n\n // now for each balance that includes nomPoolStaking, we need to fetch the metadata for the pool\n const nomPoolQueries = buildNomPoolQueries(networkId, partialBalances, miniMetadata)\n const balances = await fetchRpcQueryPack(connector, networkId, nomPoolQueries)\n\n return { success: balances, errors: [] }\n}\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport {\n type SubNativeToken,\n SubNativeTokenSchema,\n subNativeTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign } from \"lodash-es\"\nimport z from \"zod/v4\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MiniMetadataExtra, MODULE_TYPE, ModuleConfig, TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"fetchTokens\"] = async ({ networkId, tokens, connector, miniMetadata }) => {\n if (miniMetadata.extra.disable) return []\n\n const { tokenSymbol: symbol, tokenDecimals: decimals } = await getChainProperties(\n connector,\n networkId\n )\n\n if (!miniMetadata.extra.existentialDeposit)\n log.warn(`Substrate native module: existentialDeposit is undefined for ${networkId}, using 0`)\n\n const tokenConfig: TokenConfig | undefined = tokens[0]\n\n const nativeToken: SubNativeToken = {\n id: subNativeTokenId(networkId),\n type: \"substrate-native\",\n platform: \"polkadot\",\n networkId,\n isDefault: true,\n symbol: symbol,\n name: symbol,\n decimals: decimals,\n existentialDeposit: miniMetadata.extra.existentialDeposit ?? \"0\",\n }\n\n const token = assign(nativeToken, tokenConfig)\n\n const parsed = SubNativeTokenSchema.safeParse(token)\n if (!parsed.success) {\n // log.warn(`Ignoring invalid token ${MODULE_TYPE}`, token, parsed.error)\n return []\n }\n\n return [parsed.data]\n}\n\nconst DotNetworkPropertiesSimple = z.object({\n tokenDecimals: z.number().optional().default(0),\n tokenSymbol: z.string().optional().default(\"Unit\"),\n})\n\nconst DotNetworkPropertiesArray = z.object({\n tokenDecimals: z.array(z.number()).nonempty(),\n tokenSymbol: z.array(z.string()).nonempty(),\n})\n\nconst DotNetworkPropertiesSchema = z\n .union([DotNetworkPropertiesSimple, DotNetworkPropertiesArray])\n .transform((val) => ({\n tokenDecimals: Array.isArray(val.tokenDecimals) ? val.tokenDecimals[0] : val.tokenDecimals,\n tokenSymbol: Array.isArray(val.tokenSymbol) ? val.tokenSymbol[0] : val.tokenSymbol,\n }))\n\nexport const getChainProperties = async (connector: IChainConnectorDot, networkId: string) => {\n const properties = await connector.send(networkId, \"system_properties\", [], true)\n return DotNetworkPropertiesSchema.parse(properties)\n}\n","import { MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\nimport type { Binary } from \"polkadot-api\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, tryGetConstantValue } from \"../shared\"\nimport { type MiniMetadataExtra, MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"getMiniMetadata\"] = ({ networkId, specVersion, metadataRpc, config }) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n if (config?.disable)\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: null,\n extra: { disable: true },\n }\n\n const existentialDeposit = tryGetConstantValue<bigint>(\n metadataRpc,\n \"Balances\",\n \"ExistentialDeposit\"\n )?.toString()\n const nominationPoolsPalletId = tryGetConstantValue<Binary>(\n metadataRpc,\n \"NominationPools\",\n \"PalletId\"\n )?.asText()\n\n const hasFreezesItem = Boolean(\n unifiedMetadata.pallets\n .find(({ name }) => name === \"Balances\")\n ?.storage?.items.find(({ name }) => name === \"Freezes\")\n )\n const useLegacyTransferableCalculation = !hasFreezesItem\n\n compactMetadata(metadata, [\n { pallet: \"System\", constants: [\"Version\", \"SS58Prefix\"], items: [\"Account\"] },\n { pallet: \"Balances\", items: [\"Reserves\", \"Holds\", \"Locks\", \"Freezes\"] },\n { pallet: \"NominationPools\", items: [\"PoolMembers\", \"BondedPools\", \"Metadata\"] },\n { pallet: \"Staking\", items: [\"Ledger\"] },\n ])\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: encodeMetadata(metadata),\n extra: {\n useLegacyTransferableCalculation,\n existentialDeposit,\n nominationPoolsPalletId,\n },\n }\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport {\n type Codec,\n type MetadataLookup,\n parseMetadataRpc,\n type UnifiedMetadata,\n} from \"@talismn/scale\"\nimport { Binary, Enum } from \"polkadot-api\"\n\nimport type { BalanceTransferType, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n type,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { unifiedMetadata, lookupFn, builder } = parseMetadataRpc(metadataRpc)\n const method = getTransferMethod(type, unifiedMetadata, lookupFn)\n\n const { codec, location } = builder.buildCall(\"Balances\", method)\n const args = getEncodedArgs(method, to, value, codec)\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n\nconst getTransferMethod = (\n type: BalanceTransferType,\n unifiedMetadata: UnifiedMetadata,\n lookupFn: MetadataLookup\n) => {\n switch (type) {\n case \"keep-alive\":\n return \"transfer_keep_alive\"\n case \"all\":\n return \"transfer_all\"\n case \"allow-death\": {\n const callType = unifiedMetadata.pallets.find((pallet) => pallet.name === \"Balances\")?.calls\n ?.type\n\n if (callType) {\n const palletCalls = lookupFn(callType)\n if (palletCalls.type === \"enum\" && palletCalls.value.transfer_allow_death)\n return \"transfer_allow_death\"\n }\n\n // legacy fallback\n return \"transfer\"\n }\n }\n}\n\nconst getEncodedArgs = (\n method: ReturnType<typeof getTransferMethod>,\n to: string,\n value: string,\n argsCodec: Codec<unknown>\n): Uint8Array => {\n try {\n switch (method) {\n case \"transfer_allow_death\":\n case \"transfer_keep_alive\":\n case \"transfer\":\n return getTransferEncodedArgs(to, value, argsCodec)\n case \"transfer_all\":\n return getTransferAllEncodedArgs(to, argsCodec)\n }\n } catch {\n throw new Error(`Failed to encode arguments for method ${method}, ${to}, ${value}`)\n }\n}\n\nconst getEncodedValue = (codec: Codec<unknown>, possibleValue: Array<() => unknown>) => {\n for (const getArgs of possibleValue) {\n try {\n return codec.enc(getArgs())\n } catch {\n // wrong inputs, ignore and try the next one\n }\n }\n\n throw new Error(\"Failed to encode\")\n}\n\n// same inputs for both KeepAlive and allowDeath\nconst getTransferEncodedArgs = (to: string, value: string, codec: Codec<unknown>) => {\n return getEncodedValue(codec, [\n () => ({\n dest: Enum(\"Id\", to),\n value: BigInt(value),\n }),\n () => ({\n dest: to, // ex: native MYTH on Mythos\n value: BigInt(value),\n }),\n ])\n}\n\nconst getTransferAllEncodedArgs = (to: string, codec: Codec<unknown>) => {\n return getEncodedValue(codec, [\n () => ({\n dest: Enum(\"Id\", to),\n keep_alive: false,\n }),\n () => ({\n dest: to,\n keep_alive: false,\n }),\n ])\n}\n","import { map, of, switchMap } from \"rxjs\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { getRpcQueryPack$ } from \"../shared/rpcQueryPack\"\nimport type { MiniMetadataExtra, MODULE_TYPE, ModuleConfig, TokenConfig } from \"./config\"\nimport { buildBaseQueries } from \"./queries/buildBaseQueries\"\nimport { buildNomPoolQueries } from \"./queries/buildNomPoolQueries\"\n\nexport const subscribeBalances: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"subscribeBalances\"] = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n // could be use as shared observable key if we decide to cache the sub\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata)\n\n return getRpcQueryPack$(connector, networkId, baseQueries).pipe(\n switchMap((partialBalances) => {\n // now for each balance that includes nomPoolStaking, we need to fetch the metadata for the pool\n const nomPoolQueries = buildNomPoolQueries(networkId, partialBalances, miniMetadata)\n return getRpcQueryPack$(connector, networkId, nomPoolQueries)\n }),\n map((balances) => ({\n success: balances,\n errors: [],\n }))\n )\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport {\n type MiniMetadataExtra,\n MODULE_TYPE,\n type ModuleConfig,\n PLATFORM,\n type TokenConfig,\n} from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubNativeBalanceModule: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubNativeTokenConfigSchema = z.strictObject({\n ...TokenConfigBaseSchema.shape,\n})\n\n// Do not use this type outside of this module\nexport type SubNativeTokenConfig = z.infer<typeof SubNativeTokenConfigSchema>\n\nexport const SubNativeModuleConfigSchema = z.strictObject({\n disable: z.boolean().optional(),\n})\n\n// Do not use this type outside of this module\nexport type SubNativeModuleConfig = z.infer<typeof SubNativeModuleConfigSchema>\n\nexport const SubNativeMiniMetadataExtraSchema = z.strictObject({\n disable: z.boolean().optional(),\n useLegacyTransferableCalculation: z.boolean().optional(),\n existentialDeposit: z.string().optional(),\n nominationPoolsPalletId: z.string().optional(),\n})\n\n// Do not use this type outside of this module\nexport type SubNativeMiniMetadataExtra = z.infer<typeof SubNativeMiniMetadataExtraSchema>\n","import { SubPsp22TokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { SubPsp22TokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = SubPsp22TokenSchema.shape.type.value\nexport const PLATFORM = SubPsp22TokenSchema.shape.platform.value\n","import { Abi } from \"@polkadot/api-contract\"\nimport { TypeRegistry } from \"@polkadot/types\"\n\nimport type { IBalance } from \"../../types\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport psp22Abi from \"../abis/psp22.json\"\nimport type { BalanceFetchError } from \"../shared\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport type { MODULE_TYPE } from \"./config\"\nimport { makeContractCaller } from \"./util\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!balanceDefs.length) return { success: [], errors: [] }\n\n const registry = new TypeRegistry()\n const Psp22Abi = new Abi(psp22Abi)\n\n const contractCall = makeContractCaller({\n chainConnector: connector,\n chainId: networkId,\n registry,\n })\n\n const results = await Promise.allSettled(\n balanceDefs.map(async ({ token, address }) => {\n const result = await contractCall(\n address,\n token.contractAddress,\n Psp22Abi.findMessage(\"PSP22::balance_of\").toU8a([address])\n )\n\n if (!result.result.isOk) throw new Error(\"Failed to fetch balance\")\n\n const value = registry.createType(\"Balance\", result.result.asOk.data).toString()\n\n const balance: IBalance = {\n source: \"substrate-psp22\",\n status: \"live\",\n address,\n networkId: token.networkId,\n tokenId: token.id,\n value,\n }\n\n return balance\n })\n )\n\n return results.reduce<FetchBalanceResults>(\n (acc, result) => {\n if (result.status === \"fulfilled\") acc.success.push(result.value as IBalance)\n else {\n const error = result.reason as BalanceFetchError\n acc.errors.push({\n tokenId: error.tokenId,\n address: error.address,\n error,\n })\n }\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","{\n \"source\": {\n \"hash\": \"0x9adaf0c0a3d26ea6dc77ef8cbf1a682100a7ab3f3cd0d3d6022ace606b7484a7\",\n \"language\": \"ink! 4.0.1\",\n \"compiler\": \"rustc 1.69.0-nightly\",\n \"build_info\": {\n \"build_mode\": \"Debug\",\n \"cargo_contract_version\": \"2.2.1\",\n \"rust_toolchain\": \"nightly-x86_64-unknown-linux-gnu\",\n \"wasm_opt_settings\": {\n \"keep_debug_symbols\": false,\n \"optimization_passes\": \"Z\"\n }\n }\n },\n \"contract\": {\n \"name\": \"psp22\",\n \"version\": \"1.0.0\",\n \"authors\": [\"OpenBrush\"]\n },\n \"spec\": {\n \"constructors\": [\n {\n \"args\": [\n {\n \"label\": \"initial_supply\",\n \"type\": {\n \"displayName\": [\"Balance\"],\n \"type\": 0\n }\n },\n {\n \"label\": \"name\",\n \"type\": {\n \"displayName\": [\"Option\"],\n \"type\": 4\n }\n },\n {\n \"label\": \"symbol\",\n \"type\": {\n \"displayName\": [\"Option\"],\n \"type\": 4\n }\n },\n {\n \"label\": \"decimal\",\n \"type\": {\n \"displayName\": [\"u8\"],\n \"type\": 3\n }\n }\n ],\n \"docs\": [],\n \"label\": \"new\",\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink_primitives\", \"ConstructorResult\"],\n \"type\": 5\n },\n \"selector\": \"0x9bae9d5e\"\n }\n ],\n \"docs\": [],\n \"events\": [],\n \"lang_error\": {\n \"displayName\": [\"ink\", \"LangError\"],\n \"type\": 6\n },\n \"messages\": [\n {\n \"args\": [\n {\n \"label\": \"owner\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"BalanceOfInput1\"],\n \"type\": 7\n }\n }\n ],\n \"docs\": [\n \" Returns the account Balance for the specified `owner`.\",\n \"\",\n \" Returns `0` if the account is non-existent.\"\n ],\n \"label\": \"PSP22::balance_of\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 9\n },\n \"selector\": \"0x6568382f\"\n },\n {\n \"args\": [\n {\n \"label\": \"spender\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"ApproveInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"ApproveInput2\"],\n \"type\": 0\n }\n }\n ],\n \"docs\": [\n \" Allows `spender` to withdraw from the caller's account multiple times, up to\",\n \" the `value` amount.\",\n \"\",\n \" If this function is called again it overwrites the current allowance with `value`.\",\n \"\",\n \" An `Approval` event is emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::approve\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0xb20f1bbd\"\n },\n {\n \"args\": [\n {\n \"label\": \"to\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferInput2\"],\n \"type\": 0\n }\n },\n {\n \"label\": \"data\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferInput3\"],\n \"type\": 2\n }\n }\n ],\n \"docs\": [\n \" Transfers `value` amount of tokens from the caller's account to account `to`\",\n \" with additional `data` in unspecified format.\",\n \"\",\n \" On success a `Transfer` event is emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `InsufficientBalance` error if there are not enough tokens on\",\n \" the caller's account Balance.\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::transfer\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0xdb20f9f5\"\n },\n {\n \"args\": [\n {\n \"label\": \"from\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferFromInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"to\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferFromInput2\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferFromInput3\"],\n \"type\": 0\n }\n },\n {\n \"label\": \"data\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferFromInput4\"],\n \"type\": 2\n }\n }\n ],\n \"docs\": [\n \" Transfers `value` tokens on the behalf of `from` to the account `to`\",\n \" with additional `data` in unspecified format.\",\n \"\",\n \" This can be used to allow a contract to transfer tokens on ones behalf and/or\",\n \" to charge fees in sub-currencies, for example.\",\n \"\",\n \" On success a `Transfer` and `Approval` events are emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `InsufficientAllowance` error if there are not enough tokens allowed\",\n \" for the caller to withdraw from `from`.\",\n \"\",\n \" Returns `InsufficientBalance` error if there are not enough tokens on\",\n \" the the account Balance of `from`.\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::transfer_from\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0x54b3c76e\"\n },\n {\n \"args\": [\n {\n \"label\": \"spender\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"IncreaseAllowanceInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"delta_value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"IncreaseAllowanceInput2\"],\n \"type\": 0\n }\n }\n ],\n \"docs\": [\n \" Atomically increases the allowance granted to `spender` by the caller.\",\n \"\",\n \" An `Approval` event is emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::increase_allowance\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0x96d6b57a\"\n },\n {\n \"args\": [],\n \"docs\": [\" Returns the total token supply.\"],\n \"label\": \"PSP22::total_supply\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 9\n },\n \"selector\": \"0x162df8c2\"\n },\n {\n \"args\": [\n {\n \"label\": \"spender\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"DecreaseAllowanceInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"delta_value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"DecreaseAllowanceInput2\"],\n \"type\": 0\n }\n }\n ],\n \"docs\": [\n \" Atomically decreases the allowance granted to `spender` by the caller.\",\n \"\",\n \" An `Approval` event is emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `InsufficientAllowance` error if there are not enough tokens allowed\",\n \" by owner for `spender`.\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::decrease_allowance\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0xfecb57d5\"\n },\n {\n \"args\": [\n {\n \"label\": \"owner\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"AllowanceInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"spender\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"AllowanceInput2\"],\n \"type\": 7\n }\n }\n ],\n \"docs\": [\n \" Returns the amount which `spender` is still allowed to withdraw from `owner`.\",\n \"\",\n \" Returns `0` if no allowance has been set `0`.\"\n ],\n \"label\": \"PSP22::allowance\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 9\n },\n \"selector\": \"0x4d47d921\"\n },\n {\n \"args\": [],\n \"docs\": [\" Returns the token symbol.\"],\n \"label\": \"PSP22Metadata::token_symbol\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 13\n },\n \"selector\": \"0x34205be5\"\n },\n {\n \"args\": [],\n \"docs\": [\" Returns the token name.\"],\n \"label\": \"PSP22Metadata::token_name\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 13\n },\n \"selector\": \"0x3d261bd4\"\n },\n {\n \"args\": [],\n \"docs\": [\" Returns the token decimals.\"],\n \"label\": \"PSP22Metadata::token_decimals\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 14\n },\n \"selector\": \"0x7271b782\"\n }\n ]\n },\n \"storage\": {\n \"root\": {\n \"layout\": {\n \"struct\": {\n \"fields\": [\n {\n \"layout\": {\n \"struct\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 0\n }\n },\n \"name\": \"supply\"\n },\n {\n \"layout\": {\n \"root\": {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x1d458d3b\",\n \"ty\": 0\n }\n },\n \"root_key\": \"0x1d458d3b\"\n }\n },\n \"name\": \"balances\"\n },\n {\n \"layout\": {\n \"root\": {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x0abd72fb\",\n \"ty\": 0\n }\n },\n \"root_key\": \"0x0abd72fb\"\n }\n },\n \"name\": \"allowances\"\n },\n {\n \"layout\": {\n \"enum\": {\n \"dispatchKey\": \"0x00000000\",\n \"name\": \"Option\",\n \"variants\": {\n \"0\": {\n \"fields\": [],\n \"name\": \"None\"\n },\n \"1\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 1\n }\n },\n \"name\": \"0\"\n }\n ],\n \"name\": \"Some\"\n }\n }\n }\n },\n \"name\": \"_reserved\"\n }\n ],\n \"name\": \"Data\"\n }\n },\n \"name\": \"psp22\"\n },\n {\n \"layout\": {\n \"struct\": {\n \"fields\": [\n {\n \"layout\": {\n \"enum\": {\n \"dispatchKey\": \"0x00000000\",\n \"name\": \"Option\",\n \"variants\": {\n \"0\": {\n \"fields\": [],\n \"name\": \"None\"\n },\n \"1\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 2\n }\n },\n \"name\": \"0\"\n }\n ],\n \"name\": \"Some\"\n }\n }\n }\n },\n \"name\": \"name\"\n },\n {\n \"layout\": {\n \"enum\": {\n \"dispatchKey\": \"0x00000000\",\n \"name\": \"Option\",\n \"variants\": {\n \"0\": {\n \"fields\": [],\n \"name\": \"None\"\n },\n \"1\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 2\n }\n },\n \"name\": \"0\"\n }\n ],\n \"name\": \"Some\"\n }\n }\n }\n },\n \"name\": \"symbol\"\n },\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 3\n }\n },\n \"name\": \"decimals\"\n },\n {\n \"layout\": {\n \"enum\": {\n \"dispatchKey\": \"0x00000000\",\n \"name\": \"Option\",\n \"variants\": {\n \"0\": {\n \"fields\": [],\n \"name\": \"None\"\n },\n \"1\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 1\n }\n },\n \"name\": \"0\"\n }\n ],\n \"name\": \"Some\"\n }\n }\n }\n },\n \"name\": \"_reserved\"\n }\n ],\n \"name\": \"Data\"\n }\n },\n \"name\": \"metadata\"\n }\n ],\n \"name\": \"MyToken\"\n }\n },\n \"root_key\": \"0x00000000\"\n }\n },\n \"types\": [\n {\n \"id\": 0,\n \"type\": {\n \"def\": {\n \"primitive\": \"u128\"\n }\n }\n },\n {\n \"id\": 1,\n \"type\": {\n \"def\": {\n \"tuple\": []\n }\n }\n },\n {\n \"id\": 2,\n \"type\": {\n \"def\": {\n \"sequence\": {\n \"type\": 3\n }\n }\n }\n },\n {\n \"id\": 3,\n \"type\": {\n \"def\": {\n \"primitive\": \"u8\"\n }\n }\n },\n {\n \"id\": 4,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"index\": 0,\n \"name\": \"None\"\n },\n {\n \"fields\": [\n {\n \"type\": 2\n }\n ],\n \"index\": 1,\n \"name\": \"Some\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 2\n }\n ],\n \"path\": [\"Option\"]\n }\n },\n {\n \"id\": 5,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 1\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 1\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 6,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"index\": 1,\n \"name\": \"CouldNotReadInput\"\n }\n ]\n }\n },\n \"path\": [\"ink_primitives\", \"LangError\"]\n }\n },\n {\n \"id\": 7,\n \"type\": {\n \"def\": {\n \"composite\": {\n \"fields\": [\n {\n \"type\": 8,\n \"typeName\": \"[u8; 32]\"\n }\n ]\n }\n },\n \"path\": [\"ink_primitives\", \"types\", \"AccountId\"]\n }\n },\n {\n \"id\": 8,\n \"type\": {\n \"def\": {\n \"array\": {\n \"len\": 32,\n \"type\": 3\n }\n }\n }\n },\n {\n \"id\": 9,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 0\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 0\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 10,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 11\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 11\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 11,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 1\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 12\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 1\n },\n {\n \"name\": \"E\",\n \"type\": 12\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 12,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 2,\n \"typeName\": \"String\"\n }\n ],\n \"index\": 0,\n \"name\": \"Custom\"\n },\n {\n \"index\": 1,\n \"name\": \"InsufficientBalance\"\n },\n {\n \"index\": 2,\n \"name\": \"InsufficientAllowance\"\n },\n {\n \"index\": 3,\n \"name\": \"ZeroRecipientAddress\"\n },\n {\n \"index\": 4,\n \"name\": \"ZeroSenderAddress\"\n },\n {\n \"fields\": [\n {\n \"type\": 2,\n \"typeName\": \"String\"\n }\n ],\n \"index\": 5,\n \"name\": \"SafeTransferCheckFailed\"\n }\n ]\n }\n },\n \"path\": [\"openbrush_contracts\", \"traits\", \"errors\", \"psp22\", \"PSP22Error\"]\n }\n },\n {\n \"id\": 13,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 4\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 4\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 14,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 3\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 3\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n }\n ],\n \"version\": \"4\"\n}\n","import type { TypeRegistry } from \"@polkadot/types\"\nimport type { ContractExecResult } from \"@polkadot/types/interfaces\"\nimport { u8aConcatStrict, u8aToHex } from \"@polkadot/util\"\nimport type { IChainConnectorDot } from \"@talismn/chain-connectors\"\n\nexport const makeContractCaller =\n ({\n chainConnector,\n chainId,\n registry,\n }: {\n chainConnector: IChainConnectorDot\n chainId: string\n registry: TypeRegistry\n }) =>\n async <T extends Uint8Array | { toU8a: () => Uint8Array }>(\n callFrom: string,\n contractAddress: string,\n inputData: T\n ) =>\n registry.createType(\n \"ContractExecResult\",\n await chainConnector.send(chainId, \"state_call\", [\n \"ContractsApi_call\",\n u8aToHex(\n u8aConcatStrict([\n // origin\n registry\n .createType(\"AccountId\", callFrom)\n .toU8a(),\n // dest\n registry\n .createType(\"AccountId\", contractAddress)\n .toU8a(),\n // value\n registry\n .createType(\"Balance\", 0)\n .toU8a(),\n // gasLimit\n registry\n .createType(\"Option<WeightV2>\")\n .toU8a(),\n // storageDepositLimit\n registry\n .createType(\"Option<Balance>\")\n .toU8a(),\n // inputData\n inputData instanceof Uint8Array ? inputData : inputData.toU8a(),\n ])\n ),\n ])\n ) as ContractExecResult\n","import { Abi } from \"@polkadot/api-contract\"\nimport { TypeRegistry } from \"@polkadot/types\"\nimport { hexToNumber, u8aToString } from \"@polkadot/util\"\nimport {\n type SubPsp22Token,\n SubPsp22TokenSchema,\n subPsp22TokenId,\n} from \"@talismn/chaindata-provider\"\nimport { values } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport psp22Abi from \"../abis/psp22.json\"\nimport type { MODULE_TYPE, TokenConfig } from \"./config\"\nimport { makeContractCaller } from \"./util\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n}) => {\n if (!tokens.length) return []\n\n const registry = new TypeRegistry()\n const Psp22Abi = new Abi(psp22Abi)\n\n // TODO: Use `decodeOutput` from `./util/decodeOutput`\n const contractCall = makeContractCaller({\n chainConnector: connector,\n chainId: networkId,\n registry,\n })\n\n const tokenList: Record<string, SubPsp22Token> = {}\n\n for (const tokenConfig of tokens ?? []) {\n try {\n let symbol = tokenConfig?.symbol ?? \"Unit\"\n let decimals = tokenConfig?.decimals ?? 0\n const contractAddress = tokenConfig?.contractAddress ?? undefined\n\n if (contractAddress === undefined) continue\n\n await (async () => {\n const [symbolResult, decimalsResult] = await Promise.all([\n contractCall(\n contractAddress,\n contractAddress,\n Psp22Abi.findMessage(\"PSP22Metadata::token_symbol\").toU8a([])\n ),\n contractCall(\n contractAddress,\n contractAddress,\n Psp22Abi.findMessage(\"PSP22Metadata::token_decimals\").toU8a([])\n ),\n ])\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n const symbolData = (symbolResult.toJSON()?.result as any)?.ok?.data\n symbol =\n typeof symbolData === \"string\" && symbolData.startsWith(\"0x\")\n ? u8aToString(\n registry.createType(\n \"Option<Vec<u8>>\",\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n (symbolResult.toJSON()?.result as any)?.ok?.data\n )?.value\n )?.replace(/\\p{C}/gu, \"\")\n : symbol\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n const decimalsData = (decimalsResult.toJSON()?.result as any)?.ok?.data\n decimals =\n typeof decimalsData === \"string\" && decimalsData.startsWith(\"0x\")\n ? hexToNumber(decimalsData)\n : decimals\n })()\n\n const id = subPsp22TokenId(networkId, contractAddress)\n const token: SubPsp22Token = {\n id,\n type: \"substrate-psp22\",\n platform: \"polkadot\",\n isDefault: tokenConfig.isDefault ?? true,\n symbol,\n decimals,\n name: tokenConfig?.name || symbol,\n logo: tokenConfig?.logo,\n contractAddress,\n networkId,\n }\n\n if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId\n if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf\n\n tokenList[token.id] = token\n } catch (error) {\n log.error(\n `Failed to build substrate-psp22 token ${tokenConfig.contractAddress} (${tokenConfig.symbol}) on ${networkId}`,\n (error as Error)?.message ?? error\n )\n }\n }\n\n return values(tokenList).filter((t) => {\n const parsed = SubPsp22TokenSchema.safeParse(t)\n // if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE}`, t)\n\n return parsed.success\n })\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: null,\n extra: null,\n } as AnyMiniMetadata\n}\n","import { Abi } from \"@polkadot/api-contract\"\nimport { TypeRegistry } from \"@polkadot/types\"\nimport { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType, parseTokenId } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary, Enum } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport psp22Abi from \"../abis/psp22.json\"\nimport { MODULE_TYPE } from \"./config\"\nimport { makeContractCaller } from \"./util\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] =\n async ({ from, to, value, token, metadataRpc, connector }) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const networkId = parseTokenId(token.id).networkId\n const { builder } = parseMetadataRpc(metadataRpc)\n const { codec, location } = builder.buildCall(\"Contracts\", \"call\")\n\n const Psp22Abi = new Abi(psp22Abi)\n const registry = new TypeRegistry()\n const contractCall = makeContractCaller({\n chainConnector: connector,\n chainId: networkId,\n registry,\n })\n\n // TODO use papi contract api\n const data = Psp22Abi.findMessage(\"PSP22::transfer\").toU8a([to, value, undefined])\n const hexData = registry.createType(\"Vec<u8>\", data).toHex()\n\n const dryRunResult = await contractCall(from, token.contractAddress, data)\n\n const args = codec.enc({\n dest: Enum(\"Id\", token.contractAddress),\n value: 0,\n gas_limit: {\n ref_time: dryRunResult.gasRequired.refTime.toBigInt(),\n proof_size: dryRunResult.gasRequired.proofSize.toBigInt(),\n },\n storage_deposit_limit: dryRunResult.storageDeposit.isCharge\n ? dryRunResult.storageDeposit.asCharge.toBigInt()\n : null,\n data: Binary.fromHex(hexData),\n })\n\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n }\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n // on hydration balances are fetched using a runtimeApi, which can't be subscribed to.\n // => poll values for each block\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n miniMetadata,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n miniMetadata,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubPsp22BalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubPsp22TokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubPsp22TokenConfigSchema = z.strictObject({\n contractAddress: SubPsp22TokenSchema.shape.contractAddress,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubPsp22TokenConfig = z.infer<typeof SubPsp22TokenConfigSchema>\n","import { SubTokensTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type {\n SubTokensMiniMetadataExtra as MiniMetadataExtra,\n SubTokensModuleConfig as ModuleConfig,\n SubTokensTokenConfig as TokenConfig,\n} from \"./types\"\n\nexport const MODULE_TYPE = SubTokensTokenSchema.shape.type.value\nexport const PLATFORM = SubTokensTokenSchema.shape.platform.value\n","import { decodeScale, papiParse } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\n\nimport log from \"../../log\"\nimport type { AmountWithLabel, IBalance, MiniMetadata } from \"../../types\"\nimport { buildNetworkStorageCoders } from \"../shared\"\nimport type { MaybeStateKey, RpcQueryPack } from \"../shared/rpcQueryPack\"\nimport type { BalanceDef } from \"../shared/types\"\nimport type { MiniMetadataExtra, MODULE_TYPE } from \"./config\"\n\nexport const buildQueries = (\n networkId: string,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n miniMetadata: MiniMetadata<MiniMetadataExtra>\n): Array<RpcQueryPack<IBalance>> => {\n const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {\n storage: [miniMetadata.extra.palletId, \"Accounts\"],\n })\n\n return balanceDefs\n .map(({ token, address }): RpcQueryPack<IBalance> | null => {\n const scaleCoder = networkStorageCoders?.storage\n\n const getStateKey = (onChainId: string | number) => {\n try {\n return scaleCoder!.keys.enc(address, papiParse(onChainId)) as MaybeStateKey\n } catch {\n return null\n }\n }\n\n const stateKey = getStateKey(token.onChainId)\n\n if (!stateKey) {\n log.warn(\n `Invalid assetId / address in ${networkId} storage query ${token.onChainId} / ${address}`\n )\n return null\n }\n\n const decodeResult = (changes: MaybeStateKey[]) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n free?: bigint\n reserved?: bigint\n frozen?: bigint\n }\n\n const decoded = decodeScale<DecodedType>(\n scaleCoder,\n changes[0],\n `Failed to decode substrate-tokens balance on chain ${networkId}`\n ) ?? { free: 0n, reserved: 0n, frozen: 0n }\n\n const free = (decoded?.free ?? 0n).toString()\n const reserved = (decoded?.reserved ?? 0n).toString()\n const frozen = (decoded?.frozen ?? 0n).toString()\n\n const balanceValues: Array<AmountWithLabel<string>> = [\n { type: \"free\", label: \"free\", amount: free.toString() },\n { type: \"reserved\", label: \"reserved\", amount: reserved.toString() },\n { type: \"locked\", label: \"frozen\", amount: frozen.toString() },\n ]\n\n return {\n source: \"substrate-tokens\",\n status: \"live\",\n address,\n networkId,\n tokenId: token.id,\n values: balanceValues,\n } as IBalance\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n .filter(isNotNil)\n}\n","import log from \"../../log\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { buildQueries } from \"./buildQueries\"\nimport { type MiniMetadataExtra, MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"fetchBalances\"] = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n const balances = await fetchRpcQueryPack(connector, networkId, queries)\n\n return balanceDefs.reduce<FetchBalanceResults>(\n (acc, def) => {\n const balance = balances.find(\n (b) => b?.address === def.address && b?.tokenId === def.token.id\n )\n if (balance) acc.success.push(balance)\n //if no entry consider empty balance\n else\n acc.success.push({\n address: def.address,\n networkId,\n tokenId: def.token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values: [\n { type: \"free\", label: \"free\", amount: \"0\" },\n { type: \"locked\", label: \"frozen\", amount: \"0\" },\n ],\n })\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","import { type SubTokensToken, subTokensTokenId } from \"@talismn/chaindata-provider\"\nimport { assign } from \"lodash-es\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n miniMetadata,\n}) => {\n if (!miniMetadata?.data) return []\n\n // in this module we do not fetch any token information from the chain\n // this is because there are basically as many pallet implementations as there are networks (Expect Chaos, they said)\n // we rely on the config to provide all the info we need\n return tokens.map(\n (tokenConfig): SubTokensToken =>\n assign(\n {\n id: subTokensTokenId(networkId, tokenConfig.onChainId),\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n onChainId: tokenConfig.onChainId,\n symbol: tokenConfig.symbol ?? \"Unit\",\n decimals: tokenConfig.decimals ?? 0,\n name: tokenConfig.name ?? tokenConfig.symbol ?? \"Unit\",\n existentialDeposit: tokenConfig.existentialDeposit ?? \"0\",\n isDefault: true,\n },\n tokenConfig\n )\n )\n}\n","import { MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, hasStorageItems } from \"../shared\"\nimport { type MiniMetadataExtra, MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"getMiniMetadata\"] = ({ networkId, specVersion, metadataRpc, config }) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n const extra: MiniMetadataExtra = { palletId: config?.palletId ?? \"Tokens\" }\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc, extra.palletId),\n extra,\n }\n}\n\nconst getData = (metadataRpc: `0x${string}`, pallet: string): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n // ensure the network has all the required bits\n if (!hasStorageItems(unifiedMetadata, pallet, [\"Accounts\"])) return null\n\n compactMetadata(metadata, [{ pallet, items: [\"Accounts\"] }])\n\n return encodeMetadata(metadata)\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType, type SubTokensToken } from \"@talismn/chaindata-provider\"\nimport { type MetadataBuilder, papiParse, parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary, Enum } from \"polkadot-api\"\n\nimport type { BalanceTransferType, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig\n>[\"getTransferCallData\"] = ({ from, to, value, token, type, metadataRpc, config }) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { builder } = parseMetadataRpc(metadataRpc)\n\n // each chain has its own way of encoding the transfer call data\n // let's try our luck until one works!\n const options = getCallDataOptions(to, token, value, type, config)\n const callData = getCallDataFromOptions(builder, options)\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n\nconst getTransferMethod = (type: BalanceTransferType) => {\n switch (type) {\n case \"keep-alive\":\n return \"transfer_keep_alive\"\n case \"all\":\n return \"transfer_all\"\n case \"allow-death\":\n return \"transfer\"\n }\n}\n\ntype CallDataOption = {\n pallet: string\n method: string\n getArgs: () => unknown\n}\n\nconst getCallDataFromOptions = (builder: MetadataBuilder, options: CallDataOption[]): Binary => {\n for (const { pallet, method, getArgs } of options) {\n try {\n return buildCallData(builder, pallet, method, getArgs())\n } catch {\n // wrong inputs, ignore and try the next one\n }\n }\n throw new Error(\"Failed to encode call data\")\n}\n\nconst buildCallData = (builder: MetadataBuilder, pallet: string, method: string, args: unknown) => {\n const { location, codec } = builder.buildCall(pallet, method)\n return Binary.fromBytes(mergeUint8([new Uint8Array(location), codec.enc(args)]))\n}\n\nconst getCallDataOptions = (\n to: string,\n token: SubTokensToken,\n value: string,\n type: BalanceTransferType,\n config: ModuleConfig | undefined\n): CallDataOption[] => {\n const onChainId = papiParse(token.onChainId)\n const method = getTransferMethod(type)\n\n return [\n {\n pallet: \"Currencies\",\n method: \"transfer\",\n getArgs: () => ({\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n amount: BigInt(value),\n }),\n },\n {\n pallet: \"Currencies\",\n method: \"transfer\",\n getArgs: () => ({\n dest: to,\n currency_id: onChainId,\n amount: BigInt(value),\n }),\n },\n {\n pallet: \"Tokens\",\n method,\n getArgs: () =>\n method === \"transfer_all\"\n ? {\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n keepAlive: false,\n }\n : {\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n amount: BigInt(value),\n },\n },\n {\n pallet: \"Tokens\",\n method,\n getArgs: () =>\n method === \"transfer_all\"\n ? {\n dest: to,\n currency_id: onChainId,\n keepAlive: false,\n }\n : {\n dest: to,\n currency_id: onChainId,\n amount: BigInt(value),\n },\n },\n ].concat(\n ...(config?.palletId\n ? [\n {\n pallet: config.palletId,\n method,\n getArgs: () =>\n method === \"transfer_all\"\n ? {\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n keepAlive: false,\n }\n : {\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n amount: BigInt(value),\n },\n },\n {\n pallet: config.palletId,\n method,\n getArgs: () =>\n method === \"transfer_all\"\n ? {\n dest: to,\n currency_id: onChainId,\n keepAlive: false,\n }\n : {\n dest: to,\n currency_id: onChainId,\n amount: BigInt(value),\n },\n },\n ]\n : [])\n )\n}\n","import { map, of } from \"rxjs\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { getRpcQueryPack$ } from \"../shared/rpcQueryPack\"\nimport { buildQueries } from \"./buildQueries\"\nimport type { MiniMetadataExtra, MODULE_TYPE, ModuleConfig, TokenConfig } from \"./config\"\n\nexport const subscribeBalances: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"subscribeBalances\"] = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n return getRpcQueryPack$(connector, networkId, queries).pipe(\n map((balances) => ({\n success: balances,\n errors: [],\n }))\n )\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport {\n type MiniMetadataExtra,\n MODULE_TYPE,\n type ModuleConfig,\n PLATFORM,\n type TokenConfig,\n} from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubTokensBalanceModule: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubTokensTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubTokensTokenConfigSchema = z.strictObject({\n onChainId: SubTokensTokenSchema.shape.onChainId,\n ...TokenConfigBaseSchema.shape,\n\n // force these 3 fields because in this module we wont pull anything from chain\n symbol: z.string().nonempty(),\n decimals: z.number(),\n existentialDeposit: z.string().nonempty(),\n})\n\n// Do not use this type outside of this module\nexport type SubTokensTokenConfig = z.infer<typeof SubTokensTokenConfigSchema>\n\nexport const SubTokensModuleConfigSchema = z.strictObject({\n palletId: z.string().optional(),\n})\n\n// Do not use this type outside of this module\nexport type SubTokensModuleConfig = z.infer<typeof SubTokensModuleConfigSchema>\n\nexport const SubTokensMiniMetadataExtraSchema = z.strictObject({\n palletId: z.string(),\n})\n\nexport type SubTokensMiniMetadataExtra = z.infer<typeof SubTokensMiniMetadataExtraSchema>\n","import { EvmErc20BalanceModule } from \"./evm-erc20\"\nimport { EvmNativeBalanceModule } from \"./evm-native\"\nimport { EvmUniswapV2BalanceModule } from \"./evm-uniswapv2\"\nimport { SolNativeBalanceModule } from \"./sol-native\"\nimport { SolSplBalanceModule } from \"./sol-spl\"\nimport { SubAssetsBalanceModule } from \"./substrate-assets\"\nimport { SubDTaoBalanceModule } from \"./substrate-dtao\"\nimport { SubForeignAssetsBalanceModule } from \"./substrate-foreignassets\"\nimport { SubHydrationBalanceModule } from \"./substrate-hydration\"\nimport { SubNativeBalanceModule } from \"./substrate-native\"\nimport { SubPsp22BalanceModule } from \"./substrate-psp22\"\nimport { SubTokensBalanceModule } from \"./substrate-tokens\"\n\nexport const BALANCE_MODULES = [\n SubNativeBalanceModule,\n SubAssetsBalanceModule,\n SubDTaoBalanceModule,\n SubHydrationBalanceModule,\n SubForeignAssetsBalanceModule,\n SubPsp22BalanceModule,\n SubTokensBalanceModule,\n EvmErc20BalanceModule,\n EvmUniswapV2BalanceModule,\n EvmNativeBalanceModule,\n SolNativeBalanceModule,\n SolSplBalanceModule,\n]\n\nexport type AnyBalanceModule = (typeof BALANCE_MODULES)[number] // TODO yeet ? should use IBalance\n\nexport * from \"../types/IBalanceModule\"\nexport * from \"./abis\"\nexport * from \"./evm-erc20\"\nexport * from \"./evm-native\"\nexport * from \"./evm-uniswapv2\"\nexport * from \"./sol-native\"\nexport * from \"./sol-spl\"\nexport * from \"./substrate-assets\"\nexport * from \"./substrate-dtao\"\nexport * from \"./substrate-foreignassets\"\nexport * from \"./substrate-hydration\"\nexport * from \"./substrate-native\"\nexport * from \"./substrate-psp22\"\nexport * from \"./substrate-tokens\"\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport type { DotNetworkId } from \"@talismn/chaindata-provider\"\nimport { fetchBestMetadata } from \"@talismn/sapi\"\nimport { isAbortError } from \"@talismn/util\"\n\n// share requests as all modules will call this at once\nconst CACHE = new Map<string, Promise<`0x${string}`>>()\n\nexport const getMetadataRpc = async (\n chainConnector: IChainConnectorDot,\n networkId: DotNetworkId\n) => {\n if (CACHE.has(networkId)) return CACHE.get(networkId)!\n\n const pResult = fetchBestMetadata(\n (method, params, isCacheable) =>\n chainConnector.send(networkId, method, params, isCacheable, { expectErrors: true }),\n // do not allow fallback to v14 unless unavailable.\n // substrate-native and substrate-hydration need v15 metadata for runtime api calls\n false\n )\n\n CACHE.set(networkId, pResult)\n\n try {\n return await pResult\n } catch (cause) {\n if (isAbortError(cause)) throw cause\n throw new Error(`Failed to fetch metadataRpc for network ${networkId}`, { cause })\n } finally {\n CACHE.delete(networkId)\n }\n}\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport type { DotNetworkId } from \"@talismn/chaindata-provider\"\n\n// cache the promise so it can be shared across multiple calls\nconst CACHE_GET_SPEC_VERSION = new Map<string, Promise<number>>()\n\nconst fetchSpecVersion = async (chainConnector: IChainConnectorDot, networkId: DotNetworkId) => {\n const { specVersion } = await chainConnector.send<{ specVersion: number }>(\n networkId,\n \"state_getRuntimeVersion\",\n [],\n true\n )\n return specVersion\n}\n\n/**\n * fetches the spec version of a network. current request is cached in case of multiple calls (all balance modules will kick in at once)\n */\nexport const getSpecVersion = async (\n chainConnector: IChainConnectorDot,\n networkId: DotNetworkId\n) => {\n if (CACHE_GET_SPEC_VERSION.has(networkId)) return CACHE_GET_SPEC_VERSION.get(networkId)!\n\n const pResult = fetchSpecVersion(chainConnector, networkId)\n\n CACHE_GET_SPEC_VERSION.set(networkId, pResult)\n\n try {\n return await pResult\n } catch (cause) {\n throw new Error(`Failed to fetch specVersion for network ${networkId}`, { cause })\n } finally {\n CACHE_GET_SPEC_VERSION.delete(networkId)\n }\n}\n","// used as the version field of mini metadata objects\n// increase this each time the minimetadata content (data or extra) changes, to invalidate old versions\nexport { MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;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;;;ACAA,IAAAA,8BAUO;AACP,IAAAC,iBAIO;AACP,IAAAC,gBAAmE;AACnE,IAAAC,qBAA+E;AAC/E,IAAAC,gBAkBO;AACP,IAAAC,eAA0B;;;ACnC1B,qBAAmB;;;ACFnB,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,2CAA2C;AAAA,IAC3C,4BAA4B;AAAA,IAC5B,uBAAuB;AAAA,IACvB,qBAAqB;AAAA,IACrB,mBAAmB;AAAA,IACnB,6BAA6B;AAAA,IAC7B,+BAA+B;AAAA,IAC/B,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,wBAAwB;AAAA,IACxB,iBAAiB;AAAA,IACjB,WAAa;AAAA,IACb,gBAAgB;AAAA,IAChB,aAAa;AAAA,IACb,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,MAAQ;AAAA,IACR,YAAY;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,EACT;AAAA,EACA,iBAAmB;AAAA,IACjB,0BAA0B;AAAA,IAC1B,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,YAAc;AAAA,EAChB;AAAA,EACA,kBAAoB;AAAA,IAClB,0BAA0B;AAAA,IAC1B,mBAAmB;AAAA,IACnB,kBAAkB;AAAA,IAClB,yBAAyB;AAAA,IACzB,6BAA6B;AAAA,EAC/B;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;;;AD5EA,IAAO,kBAAQ,iBAAAC,SAAU,gBAAY,IAAI;;;AEJzC,gCAAoC;AAE7B,IAAM,cAAc,8CAAoB,MAAM,KAAK;AACnD,IAAM,WAAW,8CAAoB,MAAM,SAAS;;;ACH3D,IAAAC,6BAAmD;AACnD,oBAAkC;AAClC,IAAAC,eAAgE;;;ACFhE,kBAAyB;AAElB,IAAM,iCAA6B,sBAAS;AAAA,EACjD;AAAA,EACA;AACF,CAAU;;;ACLV,IAAAC,eAAyB;AAElB,IAAM,mBAAe,uBAAS;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAU;;;ACvBH,IAAM,mBAAmB;AAAA,EAC9B;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,WAAW;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,SAAS;AAAA,QACT,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS,CAAC;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS,CAAC;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS,CAAC;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS,CAAC;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS,CAAC;AAAA,IACV,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ,CAAC;AAAA,IACT,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AAAA,EACA;AAAA,IACE,UAAU;AAAA,IACV,QAAQ;AAAA,MACN;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,MAAM;AAAA,IACN,SAAS;AAAA,MACP;AAAA,QACE,cAAc;AAAA,QACd,MAAM;AAAA,QACN,MAAM;AAAA,MACR;AAAA,IACF;AAAA,IACA,SAAS;AAAA,IACT,iBAAiB;AAAA,IACjB,MAAM;AAAA,EACR;AACF;;;AC9rBO,IAAM,oBAAN,cAAgC,MAAM;AAAA,EAC3C;AAAA,EACA;AAAA,EAEA,YAAY,SAAiB,SAAkB,SAAkB,OAAe;AAC9E,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,UAAU;AACf,QAAI,MAAO,MAAK,QAAQ;AAAA,EAC1B;AACF;AACO,IAAM,2BAAN,cAAuC,MAAM;AAAA,EAClD;AAAA,EAEA,YAAY,SAAiB,cAAuB,OAAe;AACjE,UAAM,OAAO;AACb,SAAK,OAAO;AACZ,SAAK,eAAe;AACpB,QAAI,MAAO,MAAK,QAAQ;AAAA,EAC1B;AACF;;;AChBO,IAAM,iBAAiB,CAC5B,qBACoB;AACpB,SAAO,iBAAiB;AAAA,IAAQ,CAAC,CAAC,OAAO,SAAS,MAChD,UAAU,IAAI,CAAC,aAAa,EAAE,OAAO,QAAQ,EAAE;AAAA,EACjD;AACF;;;ALAO,IAAM,gBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,SAAS,MAAM,UAAU,6BAA6B,SAAS;AACrE,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,8CAA8C,SAAS,EAAE;AAEtF,aAAW,CAAC,OAAO,SAAS,KAAK,qBAAqB;AACpD,QAAI,MAAM,SAAS,eAAe,MAAM,cAAc;AACpD,YAAM,IAAI;AAAA,QACR,iEAAiE,MAAM,IAAI,OAAO,MAAM,SAAS;AAAA,MACnG;AAEF,eAAW,WAAW;AACpB,UAAI,KAAC,iCAAkB,OAAO;AAC5B,cAAM,IAAI;AAAA,UACR,0DAA0D,OAAO,cAAc,MAAM,EAAE;AAAA,QACzF;AAAA,EACN;AAEA,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,MAAI,OAAO,OAAO,WAAW,mBAAmB,YAAY,SAAS,GAAG;AACtE,UAAM,kBAAkB,OAAO,MAAM,UAAU;AAC/C,WAAO,oBAAoB,QAAQ,aAAa,gBAAgB,OAAO;AAAA,EACzE;AAEA,SAAO,uBAAuB,QAAQ,WAAW;AACnD;AAEA,IAAM,yBAAyB,OAC7B,QACA,gBACiC;AACjC,MAAI,YAAY,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE/D,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,YAAY,IAAI,OAAO,EAAE,OAAO,QAAQ,MAAM;AAC5C,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,aAAa;AAAA,UACvC,KAAK;AAAA,UACL,SAAS,MAAM;AAAA,UACf,cAAc;AAAA,UACd,MAAM,CAAC,OAAO;AAAA,QAChB,CAAC;AAED,cAAM,UAAoB;AAAA,UACxB;AAAA,UACA,SAAS,MAAM;AAAA,UACf,OAAO,OAAO,SAAS;AAAA,UACvB,QAAQ;AAAA,UACR,eAAW,iDAAqB,MAAM,EAAE,EAAE;AAAA,UAC1C,QAAQ;AAAA,QACV;AAEA,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,IAAI;AAAA,UACR,mCAAmC,MAAM,EAAE,gBAAgB,OAAO,aAAa,OAAO,OAAO,EAAE;AAAA,UAC/F,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ;AAAA,IACb,CAAC,KAAK,WAAW;AACf,UAAI,OAAO,WAAW,YAAa,KAAI,QAAQ,KAAK,OAAO,KAAiB;AAAA,WACvE;AACH,cAAM,QAAQ,OAAO;AACrB,YAAI,OAAO,KAAK;AAAA,UACd,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC5B;AACF;AAEA,IAAM,sBAAsB,OAC1B,QACA,aACA,mCACiC;AACjC,MAAI,YAAY,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE/D,MAAI;AACF,UAAM,gBAAgB,MAAM,OAAO,aAAa;AAAA,MAC9C,KAAK;AAAA,MACL,SAAS;AAAA,MACT,cAAc;AAAA,MACd,MAAM;AAAA,QACJ,YAAY,IAAI,CAAC,OAAO;AAAA,UACtB,SAAS,EAAE;AAAA,UACX,OAAO,EAAE,MAAM;AAAA,QACjB,EAAE;AAAA,MACJ;AAAA,IACF,CAAC;AAED,UAAM,UAAU,YAAY;AAAA,MAC1B,CAAC,YAAY,WAAqB;AAAA,QAChC,SAAS,WAAW;AAAA,QACpB,SAAS,WAAW,MAAM;AAAA,QAC1B,OAAO,cAAc,KAAK,EAAE,SAAS;AAAA,QACrC,QAAQ;AAAA,QACR,eAAW,yCAAa,WAAW,MAAM,EAAE,EAAE;AAAA,QAC7C,QAAQ;AAAA,MACV;AAAA,IACF;AACA,WAAO,EAAE,SAAS,QAAQ,CAAC,EAAE;AAAA,EAC/B,SAAS,KAAK;AACZ,UAAM,SAAS,YAAY,IAAI,CAAC,gBAA4C;AAAA,MAC1E,SAAS,WAAW,MAAM;AAAA,MAC1B,SAAS,WAAW;AAAA,MACpB,OAAO,IAAI;AAAA,QACT,wDAAwD,OAAO,OAAO,EAAE;AAAA,QACxE,OAAO,OAAO,OAAO,EAAE;AAAA,QACvB;AAAA,MACF;AAAA,IACF,EAAE;AACF,WAAO,EAAE,SAAS,CAAC,GAAG,OAAO;AAAA,EAC/B;AACF;;;AMjJA,IAAAC,6BAIO;AACP,uBAA6B;AAE7B,gBAAc;;;ACPd,IAAAC,eAQO;AAEA,IAAM,uBAAuB,OAClC,QACA,oBACgE;AAChE,MAAI;AACF,UAAM,WAAW,iBAAiB,QAAQ,uBAAU,eAAe;AAInE,QAAI,CAAC,QAAQ,UAAU,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/C,SAAS,KAAK,OAAO;AAAA,MACrB,SAAS,KAAK,SAAS;AAAA,MACvB,SAAS,KAAK,KAAK;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,GAAG;AACV,QAAI,aAAa,6CAAgC;AAE/C,YAAM,WAAW,iBAAiB,QAAQ,+BAAkB,eAAe;AAI3E,UAAI,CAAC,aAAa,UAAU,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC1D,SAAS,KAAK,OAAO;AAAA,QACrB,SAAS,KAAK,SAAS;AAAA,QACvB,SAAS,KAAK,KAAK;AAAA,MACrB,CAAC;AACD,mBAAS,0BAAY,WAAW,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK;AAC1D,iBAAO,0BAAY,UAAU,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK;AAAA,IACzD,MAAO,OAAM;AAAA,EACf;AAEA,SAAO,EAAE,QAAQ,UAAU,KAAK;AAClC;AAEA,IAAM,mBAAmB,CACvB,QACA,KACA,wBAEA,0BAAY;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EACA,QAAQ,EAAE,QAAQ,OAAO;AAC3B,CAAC;;;ADvCH,IAAM,mBAAmB,UAAAC,QAAE,mBAAmB,WAAW;AAAA,EACvD,UAAAA,QAAE,aAAa;AAAA,IACb,IAAI,+CAAoB,MAAM;AAAA,IAC9B,SAAS,UAAAA,QAAE,QAAQ,IAAI;AAAA,IACvB,GAAG,+CAAoB,KAAK,EAAE,QAAQ,MAAM,UAAU,MAAM,MAAM,KAAK,CAAC,EAAE;AAAA,EAC5E,CAAC;AAAA,EACD,UAAAA,QAAE,aAAa;AAAA,IACb,IAAI,+CAAoB,MAAM;AAAA,IAC9B,SAAS,UAAAA,QAAE,QAAQ,KAAK;AAAA,EAC1B,CAAC;AACH,CAAC;AAIM,IAAM,cAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAA0B,CAAC;AAEjC,aAAW,eAAe,QAAQ;AAChC,UAAM,cAAU,4CAAgB,WAAW,YAAY,eAAe;AACtE,UAAM,SAAU,MAAM,OAAO,KAAK,iBAAiB,UAAU,MAAM,OAAO,CAAC,EAAE;AAI7E,QAAI,CAAC,QAAQ;AACX,YAAM,SAAS,MAAM,UAAU,6BAA6B,SAAS;AACrE,UAAI,CAAC,QAAQ;AACX,oBAAI,KAAK,+BAA+B,SAAS,kCAAkC;AACnF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,EAAE,MAAM,UAAU,OAAO,IAAI,MAAM;AAAA,UACvC;AAAA,UACA,YAAY;AAAA,QACd;AAEA,cAAM,OAAO,IAAI,iBAAiB,MAAM;AAAA,UACtC,IAAI;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,cAAM,MAAO,IAAkB;AAC/B,YACE,IAAI,SAAS,kBAAkB,KAC/B,IAAI,SAAS,kBAAkB,KAC/B,IAAI,SAAS,UAAU;AAEvB,gBAAM,OAAO,IAAI,EAAE,IAAI,SAAS,SAAS,MAAM;AAAA;AAE/C,sBAAI;AAAA,YACF,wCAAwC,SAAS,IAAI,YAAY,eAAe;AAAA,YAC/E,IAAkB;AAAA,UACrB;AACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAsE;AAAA,MAC1E,IAAI;AAAA,MACJ,MAAM;AAAA,MACN,UAAU;AAAA,MACV;AAAA,IACF;AAEA,UAAM,UAAW,MAAM,OAAO,KAAK,iBAAiB,UAAU,MAAM,OAAO,CAAC,EAAE;AAI9E,QAAI,SAAS,YAAY,MAAO;AAEhC,UAAM,YAAQ;AAAA,MACZ;AAAA,MACA,SAAS,cAAU,uBAAK,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,SAAS,+CAAoB,UAAU,KAAK;AAClD,QAAI,CAAC,OAAO,SAAS;AACnB,kBAAI,KAAK,mDAAmD;AAAA,QAC1D;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAEA,SAAO;AACT;;;AE3GO,IAAM,kBAAyE,MAAM;AAC1F,QAAM,IAAI,MAAM,mDAAmD;AACrE;;;ACLA,IAAAC,6BAA8B;AAC9B,IAAAC,iBAAkC;AAClC,IAAAC,eAA6C;AAKtC,IAAM,sBAAiF,CAAC;AAAA,EAC7F,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,KAAC,0CAAc,OAAO,WAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAW,WAAW,GAAG;AACnE,MAAI,KAAC,kCAAkBA,KAAI,EAAG,OAAM,IAAI,MAAM,sBAAsB;AACpE,MAAI,KAAC,kCAAkB,EAAE,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAEhE,QAAM,WAAO,iCAAmB;AAAA,IAC9B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC;AAAA,EAC1B,CAAC;AAED,SAAO,EAAE,MAAAA,OAAM,IAAI,MAAM,iBAAiB,KAAK;AACjD;;;ACzBA,IAAAC,oBAAwB;AACxB,kBAAqD;AAOrD,IAAM,wBAAwB;AAEvB,IAAM,oBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,gBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,SAAO,IAAI,uBAAW,CAAC,eAAe;AACpC,UAAM,kBAAkB,IAAI,gBAAgB;AAE5C,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,YAAI,gBAAgB,OAAO,QAAS;AAEpC,cAAM,WAAW,MAAM,cAAc;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,gBAAgB,OAAO,QAAS;AAEpC,mBAAW,KAAK,QAAQ;AAExB,mBAAW,MAAM,qBAAqB;AAAA,MACxC,SAAS,OAAO;AACd,oBAAI,MAAM,SAAS;AAAA,UACjB,QAAQ;AAAA,UACR;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,QACF,CAAC;AACD,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,SAAK;AAEL,WAAO,MAAM;AACX,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC,EAAE,SAAK,kCAAqB,yBAAO,CAAC;AACvC;;;AC5CO,IAAM,wBAAyE;AAAA,EACpF,MAAM;AAAA,EACN,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;AChBA,IAAAC,6BAAoC;AACpC,IAAAC,aAAc;;;ACDd,IAAAC,6BAAgC;AAEzB,IAAM,wBAAwB,2CAAgB,QAAQ,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC;;;ADIzE,IAAM,4BAA4B,WAAAC,QAAE,aAAa;AAAA,EACtD,iBAAiB,+CAAoB,MAAM;AAAA,EAC3C,GAAG,sBAAsB;AAC3B,CAAC;;;AETD,IAAAC,6BAAqC;AAI9B,IAAMC,eAAc,gDAAqB,MAAM,KAAK;AACpD,IAAMC,YAAW,gDAAqB,MAAM,SAAS;;;ACL5D,IAAAC,6BAA6B;AAC7B,IAAAC,iBAAkC;AAc3B,IAAMC,iBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,SAAS,MAAM,UAAU,6BAA6B,SAAS;AACrE,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,8CAA8C,SAAS,EAAE;AAEtF,aAAW,CAAC,OAAO,SAAS,KAAK,qBAAqB;AACpD,QAAI,MAAM,SAASC,gBAAe,MAAM,cAAc;AACpD,YAAM,IAAI;AAAA,QACR,iEAAiE,MAAM,IAAI,OAAO,MAAM,SAAS;AAAA,MACnG;AAEF,eAAW,WAAW;AACpB,UAAI,KAAC,kCAAkB,OAAO;AAC5B,cAAM,IAAI;AAAA,UACR,0DAA0D,OAAO,cAAc,MAAM,EAAE;AAAA,QACzF;AAAA,EACN;AAEA,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,MAAI,OAAO,OAAO,WAAW,cAAc,YAAY,SAAS,GAAG;AACjE,UAAM,aAAa,OAAO,MAAM,UAAU;AAC1C,WAAO,mBAAmB,QAAQ,aAAa,WAAW,OAAO;AAAA,EACnE;AAEA,SAAO,sBAAsB,QAAQ,WAAW;AAClD;AAEA,IAAM,wBAAwB,OAC5B,QACA,gBACiC;AACjC,MAAI,YAAY,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE/D,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,YAAY,IAAI,OAAO,EAAE,OAAO,QAAQ,MAAM;AAC5C,UAAI;AACF,cAAM,SAAS,MAAM,OAAO,WAAW,EAAE,QAAQ,CAAC;AAElD,cAAM,UAAoB;AAAA,UACxB;AAAA,UACA,SAAS,MAAM;AAAA,UACf,OAAO,OAAO,SAAS;AAAA,UACvB,QAAQA;AAAA,UACR,eAAW,yCAAa,MAAM,EAAE,EAAE;AAAA,UAClC,QAAQ;AAAA,QACV;AAEA,eAAO;AAAA,MACT,SAAS,KAAK;AACZ,cAAM,IAAI;AAAA,UACR,mCAAmC,MAAM,EAAE,gBAAgB,OAAO,aAAa,OAAO,OAAO,EAAE;AAAA,UAC/F,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ;AAAA,IACb,CAAC,KAAK,WAAW;AACf,UAAI,OAAO,WAAW,YAAa,KAAI,QAAQ,KAAK,OAAO,KAAiB;AAAA,WACvE;AACH,cAAM,QAAQ,OAAO;AACrB,YAAI,OAAO,KAAK;AAAA,UACd,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC5B;AACF;AAEA,IAAM,qBAAqB,OACzB,QACA,aACA,sBACiC;AACjC,MAAI,YAAY,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE/D,MAAI;AACF,UAAM,cAAc,MAAM,OAAO,UAAU;AAAA,MACzC,WAAW,YAAY,IAAI,CAAC,EAAE,QAAQ,OAAO;AAAA,QAC3C,SAAS;AAAA,QACT,KAAK;AAAA,QACL,cAAc;AAAA,QACd,MAAM,CAAC,OAAO;AAAA,MAChB,EAAE;AAAA,IACJ,CAAC;AAED,WAAO,YAAY;AAAA,MACjB,CAAC,KAAK,QAAQ,UAAU;AACtB,YAAI,OAAO,WAAW,WAAW;AAC/B,cAAI,QAAQ,KAAK;AAAA,YACf,SAAS,YAAY,KAAK,EAAE;AAAA,YAC5B,SAAS,YAAY,KAAK,EAAE,MAAM;AAAA,YAClC,OAAO,OAAO,OAAO,SAAS;AAAA,YAC9B,QAAQA;AAAA,YACR,eAAW,yCAAa,YAAY,KAAK,EAAE,MAAM,EAAE,EAAE;AAAA,YACrD,QAAQ;AAAA,UACV,CAAa;AAAA,QACf;AACA,YAAI,OAAO,WAAW,WAAW;AAC/B,cAAI,OAAO,KAAK;AAAA,YACd,SAAS,YAAY,KAAK,EAAE,MAAM;AAAA,YAClC,SAAS,YAAY,KAAK,EAAE;AAAA,YAC5B,OAAO,IAAI;AAAA,cACT,mCAAmC,YAAY,KAAK,EAAE,MAAM,EAAE,gBAAgB,YAAY,KAAK,EAAE,OAAO,aAAa,OAAO,OAAO,EAAE;AAAA,cACrI,YAAY,KAAK,EAAE,MAAM;AAAA,cACzB,YAAY,KAAK,EAAE;AAAA,cACnB,OAAO;AAAA,YACT;AAAA,UACF,CAA+B;AAAA,QACjC;AACA,eAAO;AAAA,MACT;AAAA,MACA,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,IAC5B;AAAA,EACF,SAAS,KAAK;AACZ,UAAM,SAAS,YAAY,IAAI,CAAC,gBAA4C;AAAA,MAC1E,SAAS,WAAW,MAAM;AAAA,MAC1B,SAAS,WAAW;AAAA,MACpB,OAAO,IAAI;AAAA,QACT,wDAAwD,OAAO,OAAO,EAAE;AAAA,QACxE,OAAO,OAAO,OAAO,EAAE;AAAA,QACvB;AAAA,MACF;AAAA,IACF,EAAE;AACF,WAAO,EAAE,SAAS,CAAC,GAAG,OAAO;AAAA,EAC/B;AACF;;;AC1JA,IAAAC,6BAIO;AACP,IAAAC,oBAAuB;AAMhB,IAAMC,eAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AACF,MAAM;AAEJ,MAAI,OAAO,WAAW;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAEF,QAAM,YAAQ;AAAA,IACZ;AAAA,MACE,QAAI,6CAAiB,SAAS;AAAA,MAC9B,MAAMC;AAAA,MACN,UAAUC;AAAA,MACV;AAAA,MACA,WAAW;AAAA,IACb;AAAA,IACA,OAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,gDAAqB,UAAU,KAAK;AACnD,MAAI,CAAC,OAAO,SAAS;AACnB,gBAAI,KAAK,sCAAsC,KAAK;AACpD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC,OAAO,IAAI;AACrB;;;ACpCO,IAAMC,mBAAyE,MAAM;AAC1F,QAAM,IAAI,MAAM,mDAAmD;AACrE;;;ACLA,IAAAC,8BAA8B;AAC9B,IAAAC,iBAAkC;AAK3B,IAAMC,uBAAiF,CAAC;AAAA,EAC7F,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,KAAC,2CAAc,OAAOC,YAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,YAAW,GAAG;AACnE,MAAI,KAAC,kCAAkBD,KAAI,EAAG,OAAM,IAAI,MAAM,sBAAsB;AACpE,MAAI,KAAC,kCAAkB,EAAE,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAEhE,SAAO,EAAE,MAAAA,OAAM,IAAI,OAAO,MAAM,KAAsB;AACxD;;;AClBA,IAAAE,oBAAwB;AACxB,IAAAC,eAAqD;AAOrD,IAAMC,yBAAwB;AAEvB,IAAMC,qBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,iBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,SAAO,IAAI,wBAAW,CAAC,eAAe;AACpC,UAAM,kBAAkB,IAAI,gBAAgB;AAE5C,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,YAAI,gBAAgB,OAAO,QAAS;AAEpC,cAAM,WAAW,MAAMC,eAAc;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,gBAAgB,OAAO,QAAS;AAEpC,mBAAW,KAAK,QAAQ;AAExB,mBAAW,MAAMF,sBAAqB;AAAA,MACxC,SAAS,OAAO;AACd,oBAAI,MAAM,SAAS;AAAA,UACjB,QAAQG;AAAA,UACR;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,QACF,CAAC;AACD,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,SAAK;AAEL,WAAO,MAAM;AACX,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC,EAAE,SAAK,mCAAqB,yBAAO,CAAC;AACvC;;;AC5CO,IAAM,yBAA0E;AAAA,EACrF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AChBA,IAAAC,aAAc;AAKP,IAAM,6BAA6B,WAAAC,QAAE,aAAa;AAAA,EACvD,GAAG,sBAAsB;AAC3B,CAAC;;;ACPD,IAAAC,8BAAwC;AAIjC,IAAMC,eAAc,oDAAwB,MAAM,KAAK;AACvD,IAAMC,YAAW,oDAAwB,MAAM,SAAS;;;ACL/D,IAAAC,8BAA6B;AAC7B,IAAAC,iBAAkC;AAClC,uBAAsB;AACtB,IAAAC,oBAA4B;AAC5B,IAAAC,eAA+C;AASxC,IAAMC,iBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,SAAS,MAAM,UAAU,6BAA6B,SAAS;AACrE,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,8CAA8C,SAAS,EAAE;AAEtF,aAAW,CAAC,OAAO,SAAS,KAAK,qBAAqB;AACpD,QAAI,MAAM,SAASC,gBAAe,MAAM,cAAc;AACpD,YAAM,IAAI;AAAA,QACR,iEAAiE,MAAM,IAAI,OAAO,MAAM,SAAS;AAAA,MACnG;AAEF,eAAW,WAAW;AACpB,UAAI,KAAC,kCAAkB,OAAO;AAC5B,cAAM,IAAI;AAAA,UACR,0DAA0D,OAAO,cAAc,MAAM,EAAE;AAAA,QACzF;AAAA,EACN;AAEA,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,SAAO,kBAAkB,QAAQ,WAAW;AAC9C;AAEA,IAAM,oBAAoB,OACxB,QACA,gBACiC;AACjC,MAAI,YAAY,WAAW,EAAG,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAG/D,QAAM,YAAQ,wBAAK,YAAY,IAAI,CAAC,QAAQ,IAAI,MAAM,eAAe,CAAC;AAEtE,QAAM,CAAC,aAAa,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA;AAAA,IAEtD,QAAQ;AAAA,MACN,MAAM,IAAI,OAAO,YAAY;AAC3B,cAAM,eAAW,0BAAY,EAAE,SAAS,KAAK,kBAAkB,OAAO,CAAC;AAEvE,cAAM,CAAC,aAAa,CAAC,UAAU,QAAQ,CAAC,IAAI,MAAM,QAAQ,IAAI;AAAA,UAC5D,SAAS,KAAK,YAAY;AAAA,UAC1B,SAAS,KAAK,YAAY;AAAA,QAC5B,CAAC;AACD,eAAO,EAAE,SAAS,aAAa,UAAU,SAAS;AAAA,MACpD,CAAC;AAAA,IACH;AAAA;AAAA,IAEA,QAAQ;AAAA,MACN,YAAY,IAAI,OAAO,EAAE,OAAO,QAAQ,MAAM;AAC5C,cAAM,UAAU,MAAM,OAAO,aAAa;AAAA,UACxC,SAAS,MAAM;AAAA,UACf,KAAK;AAAA,UACL,cAAc;AAAA,UACd,MAAM,CAAC,OAAO;AAAA,QAChB,CAAU;AAEV,eAAO,EAAE,MAAM,MAAM,iBAAiB,SAAS,QAAQ;AAAA,MACzD,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,QAAM,eAAW;AAAA,IACf,YAAY,OAAO,CAAC,MAAM,EAAE,WAAW,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE,KAAK;AAAA,IACtE,CAAC,MAAM,EAAE;AAAA,EACX;AAEA,QAAM,UAAU,YAAY;AAAA,IAC1B,CAAC,KAAK,EAAE,OAAO,QAAQ,GAAG,MAAM;AAC9B,YAAM,OAAO,SAAS,MAAM,eAAe;AAC3C,UAAI,CAAC,MAAM;AACT,YAAI,OAAO,KAAK;AAAA,UACd,SAAS,MAAM;AAAA,UACf;AAAA,UACA,OAAO,IAAI;AAAA,YACT,iCAAiC,MAAM,EAAE,eAAe,MAAM,eAAe;AAAA,gBAC7E,0CAAa,MAAM,EAAE,EAAE;AAAA,UACzB;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAEA,YAAM,gBAAgB,eAAe,CAAC;AAEtC,UAAI,cAAc,WAAW,aAAa;AACxC,YAAI,OAAO,KAAK;AAAA,UACd,SAAS,MAAM;AAAA,UACf;AAAA,UACA,OAAO,IAAI;AAAA,YACT,qCAAqC,MAAM,EAAE,eAAe,OAAO;AAAA,YACnE,MAAM;AAAA,YACN;AAAA,YACA,cAAc;AAAA,UAChB;AAAA,QACF,CAAC;AACD,eAAO;AAAA,MACT;AAEA,YAAM,EAAE,aAAa,UAAU,SAAS,IAAI;AAC5C,YAAM,EAAE,QAAQ,IAAI,cAAc;AAElC,YAAM,iBAAiB,CAAC,OAAe,YAAyC;AAAA,QAC9E,MAAM;AAAA,QACN;AAAA,QACA;AAAA,MACF;AAEA,YAAM,YAAQ,iBAAAC,SAAU,OAAO,OAAO,CAAC,EAAE,IAAI,gBAAgB,KAAK,MAAM,OAAO,WAAW,CAAC;AAE3F,UAAI,QAAQ,KAAK;AAAA,QACf;AAAA,QACA,SAAS,MAAM;AAAA,QACf,QAAQD;AAAA,QACR,eAAW,0CAAa,MAAM,EAAE,EAAE;AAAA,QAClC,QAAQ;AAAA,QACR,QAAQ;AAAA,UACN,EAAE,MAAM,QAAQ,OAAO,QAAQ,QAAQ,OAAO,OAAO,EAAE;AAAA,UACvD,eAAe,eAAe,OAAO,WAAW,CAAC;AAAA,UACjD,eAAe,YAAY,OAAO,QAAQ,CAAC;AAAA,UAC3C,eAAe,YAAY,OAAO,QAAQ,CAAC;AAAA,UAC3C,eAAe,YAAY,MAAM,MAAM,OAAO,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;AAAA,UACrE,eAAe,YAAY,MAAM,MAAM,OAAO,QAAQ,CAAC,EAAE,SAAS,EAAE,CAAC;AAAA,QACvE;AAAA,MACF,CAAC;AAED,aAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC5B;AAEA,SAAO;AACT;;;ACnJA,IAAAE,8BAIO;AACP,IAAAC,oBAA6B;AAE7B,IAAAC,aAAc;;;ACPd,IAAAC,eAQO;AAIA,IAAMC,wBAAuB,OAClC,QACA,oBACgE;AAChE,MAAI;AACF,UAAM,WAAWC,kBAAiB,QAAQ,uBAAU,eAAe;AAInE,QAAI,CAAC,QAAQ,UAAU,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC/C,SAAS,KAAK,OAAO;AAAA,MACrB,SAAS,KAAK,SAAS;AAAA,MACvB,SAAS,KAAK,KAAK;AAAA,IACrB,CAAC;AAAA,EACH,SAAS,GAAG;AACV,QAAI,aAAa,6CAAgC;AAE/C,YAAM,WAAWA,kBAAiB,QAAQ,+BAAkB,eAAe;AAI3E,UAAI,CAAC,aAAa,UAAU,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,QAC1D,SAAS,KAAK,OAAO;AAAA,QACrB,SAAS,KAAK,SAAS;AAAA,QACvB,SAAS,KAAK,KAAK;AAAA,MACrB,CAAC;AACD,mBAAS,0BAAY,WAAW,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK;AAC1D,iBAAO,0BAAY,UAAU,EAAE,QAAQ,OAAO,EAAE,EAAE,KAAK;AAAA,IACzD,MAAO,OAAM;AAAA,EACf;AAEA,SAAO,EAAE,QAAQ,UAAU,KAAK;AAClC;AAEA,IAAMA,oBAAmB,CACvB,QACA,KACA,wBAEA,0BAAY;AAAA,EACV,SAAS;AAAA,EACT;AAAA,EACA,QAAQ,EAAE,QAAQ,OAAO;AAC3B,CAAC;AAEI,IAAM,+BAA+B,OAC1C,QACA,oBACG;AACH,QAAM,WAAWA,kBAAiB,QAAQ,kBAAkB,eAAe;AAE3E,MAAI,CAAC,QAAQ,QAAQ,UAAU,IAAI,IAAI,MAAM,QAAQ,IAAI;AAAA,IACvD,SAAS,KAAK,OAAO;AAAA,IACrB,SAAS,KAAK,OAAO;AAAA,IACrB,SAAS,KAAK,SAAS;AAAA,IACvB,SAAS,KAAK,KAAK;AAAA,EACrB,CAAC;AAED,SAAO,EAAE,QAAQ,QAAQ,UAAU,KAAK;AAC1C;;;ADzDA,IAAMC,oBAAmB,WAAAC,QAAE,mBAAmB,WAAW;AAAA,EACvD,WAAAA,QAAE,aAAa;AAAA,IACb,IAAI,oDAAwB,MAAM;AAAA,IAClC,SAAS,WAAAA,QAAE,QAAQ,IAAI;AAAA,IACvB,GAAG,oDAAwB,KAAK;AAAA,MAC9B,QAAQ;AAAA,MACR,UAAU;AAAA,MACV,MAAM;AAAA,MACN,eAAe;AAAA,MACf,eAAe;AAAA,MACf,WAAW;AAAA,MACX,WAAW;AAAA,MACX,SAAS;AAAA,MACT,SAAS;AAAA,IACX,CAAC,EAAE;AAAA,EACL,CAAC;AAAA,EACD,WAAAA,QAAE,aAAa;AAAA,IACb,IAAI,oDAAwB,MAAM;AAAA,IAClC,SAAS,WAAAA,QAAE,QAAQ,KAAK;AAAA,EAC1B,CAAC;AACH,CAAC;AAIM,IAAMC,eAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAA8B,CAAC;AAErC,aAAW,eAAe,QAAQ;AAChC,UAAM,cAAU,iDAAoB,WAAW,YAAY,eAAe;AAC1E,UAAM,SAAU,MAAM,OAAO,KAAKF,kBAAiB,UAAU,MAAM,OAAO,CAAC,EAAE;AAI7E,QAAI,CAAC,QAAQ;AACX,YAAM,SAAS,MAAM,UAAU,6BAA6B,SAAS;AACrE,UAAI,CAAC,QAAQ;AACX,oBAAI,KAAK,+BAA+B,SAAS,kCAAkC;AACnF;AAAA,MACF;AAEA,UAAI;AACF,cAAM,EAAE,QAAQ,QAAQ,MAAM,SAAS,IAAI,MAAM;AAAA,UAC/C;AAAA,UACA,YAAY;AAAA,QACd;AAEA,cAAM,EAAE,QAAQ,SAAS,UAAU,UAAU,IAAI,MAAMG,sBAAqB,QAAQ,MAAM;AAC1F,cAAM,EAAE,QAAQ,SAAS,UAAU,UAAU,IAAI,MAAMA,sBAAqB,QAAQ,MAAM;AAE1F,cAAM,OAAO,IAAIH,kBAAiB,MAAM;AAAA,UACtC,IAAI;AAAA,UACJ,QAAQ,GAAG,OAAO,IAAI,OAAO;AAAA,UAC7B;AAAA,UACA;AAAA,UACA,eAAe;AAAA,UACf,eAAe;AAAA,UACf;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA,SAAS;AAAA,QACX,CAAC;AAAA,MACH,SAAS,KAAK;AACZ,cAAM,MAAO,IAAkB;AAC/B,YACE,IAAI,SAAS,kBAAkB,KAC/B,IAAI,SAAS,kBAAkB,KAC/B,IAAI,SAAS,UAAU,GACvB;AACA,gBAAM,OAAO,IAAI,EAAE,IAAI,SAAS,SAAS,MAAM;AAAA,QACjD,OAAO;AACL,sBAAI;AAAA,YACF,4CAA4C,YAAY,eAAe;AAAA,YACtE,IAAkB;AAAA,UACrB;AAAA,QACF;AACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAA0E;AAAA,MAC9E,IAAI;AAAA,MACJ,MAAMI;AAAA,MACN,UAAUC;AAAA,MACV;AAAA,IACF;AAEA,UAAM,UAAW,MAAM,OAAO,KAAKL,kBAAiB,UAAU,MAAM,OAAO,CAAC,EAAE;AAI9E,QAAI,SAAS,YAAY,MAAO;AAEhC,UAAM,YAAQ;AAAA,MACZ;AAAA,MACA,SAAS,cAAU,wBAAK,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,MACjD;AAAA,IACF;AAEA,UAAM,SAAS,oDAAwB,UAAU,KAAK;AACtD,QAAI,CAAC,OAAO,SAAS;AACnB,kBAAI,KAAK,sCAAsC,KAAK;AACpD;AAAA,IACF;AAEA,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAEA,SAAO;AACT;;;AE7HO,IAAMM,mBAAyE,MAAM;AAC1F,QAAM,IAAI,MAAM,mDAAmD;AACrE;;;ACLA,IAAAC,8BAA8B;AAC9B,IAAAC,iBAAkC;AAClC,IAAAC,eAA6C;AAKtC,IAAMC,uBAAiF,CAAC;AAAA,EAC7F,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,KAAC,2CAAc,OAAOC,YAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,YAAW,GAAG;AACnE,MAAI,KAAC,kCAAkBD,KAAI,EAAG,OAAM,IAAI,MAAM,sBAAsB;AACpE,MAAI,KAAC,kCAAkB,EAAE,EAAG,OAAM,IAAI,MAAM,oBAAoB;AAEhE,QAAM,WAAO,iCAAmB;AAAA,IAC9B,KAAK;AAAA,IACL,cAAc;AAAA,IACd,MAAM,CAAC,IAAI,OAAO,KAAK,CAAC;AAAA,EAC1B,CAAC;AAED,SAAO,EAAE,MAAAA,OAAM,IAAI,MAAM,iBAAiB,KAAK;AACjD;;;ACzBA,IAAAE,oBAAwB;AACxB,IAAAC,eAAqD;AAOrD,IAAMC,yBAAwB;AAEvB,IAAMC,qBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,iBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,SAAO,IAAI,wBAAW,CAAC,eAAe;AACpC,UAAM,kBAAkB,IAAI,gBAAgB;AAE5C,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,YAAI,gBAAgB,OAAO,QAAS;AAEpC,cAAM,WAAW,MAAMC,eAAc;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,gBAAgB,OAAO,QAAS;AAEpC,mBAAW,KAAK,QAAQ;AAExB,mBAAW,MAAMF,sBAAqB;AAAA,MACxC,SAAS,OAAO;AACd,oBAAI,MAAM,SAAS;AAAA,UACjB,QAAQG;AAAA,UACR;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,QACF,CAAC;AACD,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,SAAK;AAEL,WAAO,MAAM;AACX,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC,EAAE,SAAK,mCAAqB,yBAAO,CAAC;AACvC;;;AC5CO,IAAM,4BAA6E;AAAA,EACxF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AChBA,IAAAC,8BAAwC;AACxC,IAAAC,aAAc;AAKP,IAAM,gCAAgC,WAAAC,QAAE,aAAa;AAAA,EAC1D,iBAAiB,oDAAwB,MAAM;AAAA,EAC/C,GAAG,sBAAsB;AAC3B,CAAC;;;ACTD,IAAAC,8BAAqC;AAI9B,IAAMC,eAAc,iDAAqB,MAAM,KAAK;AACpD,IAAMC,YAAW,iDAAqB,MAAM,SAAS;;;ACL5D,kBAA0B;AAC1B,IAAAC,iBAAgC;AAQzB,IAAMC,iBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,aAAa,MAAM,UAAU,cAAc,SAAS;AAC1D,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,8CAA8C,SAAS,EAAE;AAE1F,aAAW,CAAC,OAAO,SAAS,KAAK,qBAAqB;AACpD,QAAI,MAAM,SAASC,gBAAe,MAAM,cAAc;AACpD,YAAM,IAAI;AAAA,QACR,uDAAuD,MAAM,IAAI,OAAO,MAAM,SAAS;AAAA,MACzF;AAEF,eAAW,WAAW;AACpB,UAAI,KAAC,gCAAgB,OAAO;AAC1B,cAAM,IAAI;AAAA,UACR,8CAA8C,OAAO,cAAc,MAAM,EAAE;AAAA,QAC7E;AAAA,EACN;AAEA,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,YAAY,IAAI,OAAO,EAAE,OAAO,QAAQ,MAAyB;AAC/D,UAAI;AACF,cAAMC,aAAY,IAAI,sBAAU,OAAO;AACvC,cAAM,WAAW,MAAM,WAAW,WAAWA,UAAS;AAEtD,eAAO;AAAA,UACL;AAAA,UACA,SAAS,MAAM;AAAA,UACf,OAAO,SAAS,SAAS;AAAA,UACzB,QAAQD;AAAA,UACR,WAAW,MAAM;AAAA,UACjB,QAAQ;AAAA,QACV;AAAA,MACF,SAAS,KAAK;AACZ,cAAM,IAAI;AAAA,UACR,mCAAmC,MAAM,EAAE,gBAAgB,OAAO,aAAa,SAAS;AAAA,UACxF,MAAM;AAAA,UACN;AAAA,UACA;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ;AAAA,IACb,CAAC,KAAK,WAAW;AACf,UAAI,OAAO,WAAW,YAAa,KAAI,QAAQ,KAAK,OAAO,KAAiB;AAAA,WACvE;AACH,cAAM,QAAQ,OAAO;AACrB,YAAI,OAAO,KAAK;AAAA,UACd,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC5B;AACF;;;AC1EA,IAAAE,8BAIO;AACP,IAAAC,oBAAuB;AAMhB,IAAMC,eAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AACF,MAAM;AAEJ,MAAI,OAAO,WAAW;AACpB,UAAM,IAAI;AAAA,MACR;AAAA,IACF;AAEF,QAAM,YAAQ;AAAA,IACZ;AAAA,MACE,QAAI,8CAAiB,SAAS;AAAA,MAC9B,MAAMC;AAAA,MACN,UAAUC;AAAA,MACV;AAAA,MACA,WAAW;AAAA,IACb;AAAA,IACA,OAAO,CAAC;AAAA,EACV;AAEA,QAAM,SAAS,iDAAqB,UAAU,KAAK;AACnD,MAAI,CAAC,OAAO,SAAS;AACnB,gBAAI,KAAK,sCAAsC,KAAK;AACpD,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC,OAAO,IAAI;AACrB;;;ACpCO,IAAMC,mBAAyE,MAAM;AAC1F,QAAM,IAAI,MAAM,qDAAqD;AACvE;;;ACLA,IAAAC,eAAyC;AACzC,IAAAC,8BAA8B;AAKvB,IAAMC,uBAAiF,CAAC;AAAA,EAC7F,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,KAAC,2CAAc,OAAOC,YAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,YAAW,GAAG;AAEnE,QAAM,aAAa,IAAI,uBAAUD,KAAI;AAErC,QAAM,aAAa,2BAAc,SAAS;AAAA,IACxC;AAAA,IACA,UAAU,IAAI,uBAAU,EAAE;AAAA,IAC1B,UAAU,OAAO,KAAK;AAAA,EACxB,CAAC;AAED,SAAO,CAAC,UAAU;AACpB;;;ACxBA,IAAAE,oBAAwB;AACxB,IAAAC,eAAqD;AAOrD,IAAMC,yBAAwB;AAEvB,IAAMC,qBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,iBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,SAAO,IAAI,wBAAW,CAAC,eAAe;AACpC,UAAM,kBAAkB,IAAI,gBAAgB;AAE5C,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,YAAI,gBAAgB,OAAO,QAAS;AAEpC,cAAM,WAAW,MAAMC,eAAc;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,gBAAgB,OAAO,QAAS;AAEpC,mBAAW,KAAK,QAAQ;AAExB,mBAAW,MAAMF,sBAAqB;AAAA,MACxC,SAAS,OAAO;AACd,oBAAI,MAAM,SAAS;AAAA,UACjB,QAAQG;AAAA,UACR;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AACD,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,SAAK;AAEL,WAAO,MAAM;AACX,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC,EAAE,SAAK,mCAAqB,yBAAO,CAAC;AACvC;;;AC5CO,IAAM,yBAA0E;AAAA,EACrF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AChBA,IAAAC,aAAc;AAKP,IAAM,6BAA6B,WAAAC,QAAE,aAAa;AAAA,EACvD,GAAG,sBAAsB;AAC3B,CAAC;;;ACPD,IAAAC,8BAAkC;AAE3B,IAAMC,eAAc,8CAAkB,MAAM,KAAK;AACjD,IAAMC,YAAW,8CAAkB,MAAM,SAAS;;;ACHzD,IAAAC,eAA0B;AAC1B,IAAAC,8BAA8B;AAC9B,IAAAC,eAAyB;AACzB,IAAAC,qBAA4B;;;ACF5B,mBAMO;AAWA,IAAM,4BAA4B,CACvC,SACA,cACA,WACyC;AACzC,MAAI,CAAC,aAAa,KAAM,QAAO;AAE/B,QAAM,eAAW,gCAAc,6BAAe,aAAa,IAAI,CAAC;AAEhE,MAAI;AACF,UAAM,mBAAe,oCAAkB,0BAAY,QAAQ,CAAC;AAC5D,UAAM,cAAc,OAAO;AAAA,MACzB,OAAO,QAAQ,MAAM,EAAE;AAAA,QACrB,CAAC,CAAC,KAAK,gBAAgB,MAGjB;AACJ,gBAAM,CAACC,SAAQ,MAAM,IACnB,OAAO,qBAAqB,aACxB,iBAAiB,EAAE,QAAQ,CAAC,IAC5B;AACN,cAAI;AACF,mBAAO,CAAC,CAAC,KAAK,aAAa,aAAaA,SAAQ,MAAM,CAAC,CAAU;AAAA,UACnE,SAAS,OAAO;AACd,wBAAI;AAAA,cACF,yCAAyC,OAAO,KAAKA,OAAM,KAAK,MAAM;AAAA,cACtE;AAAA,YACF;AACA,mBAAO,CAAC;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAIA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,gBAAI;AAAA,MACF,0CAA0C,OAAO,KAAK,KAAK,UAAU,MAAM,CAAC;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;;;AC9DA,IAAAC,gBAAwC;AAEjC,IAAM,yBAAyB,OACpC,WACA,WACA,aACA,SACA,QACA,SACe;AACf,MAAI;AACF,UAAM,EAAE,QAAQ,QAAI,gCAAiB,WAAW;AAChD,UAAM,OAAO,QAAQ,iBAAiB,SAAS,MAAM;AAErD,UAAM,MAAM,MAAM,UAAU,KAAa,WAAW,cAAc;AAAA,MAChE,GAAG,OAAO,IAAI,MAAM;AAAA,UACpB,qBAAM,KAAK,KAAK,IAAI,IAAI,CAAC;AAAA,IAC3B,CAAC;AAED,WAAO,KAAK,MAAM,IAAI,GAAG;AAAA,EAC3B,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,kCAAkC,SAAS,QAAQ,OAAO,IAAI,MAAM,IAAI;AAAA,MACtF;AAAA,IACF,CAAC;AAAA,EACH;AACF;;;ACxBA,kBAAyB;AACzB,IAAAC,qBAAwB;AACxB,IAAAC,eAA+B;AAaxB,IAAM,oBAAoB,OAC/B,WACA,WACA,YACG;AACH,QAAM,eAAe,QAAQ,QAAQ,CAAC,EAAE,UAAU,MAAM,SAAS,EAAE,OAAO,oBAAQ;AAGlF,MAAI,CAAC,aAAa;AAChB,WAAO,QAAQ,IAAI,CAAC,EAAE,WAAW,aAAa,MAAM,aAAa,UAAU,IAAI,MAAM,IAAI,CAAC,CAAC;AAE7F,QAAM,CAAC,MAAM,IAAI,MAAM,UAAU,KAAyB,WAAW,wBAAwB;AAAA,IAC3F;AAAA,EACF,CAAC;AAED,SAAO,mBAAmB,SAAS,MAAM;AAC3C;AAEO,IAAM,mBAAmB,CAC9B,WACA,WACA,SACA,UAA0B,UACN;AACpB,QAAM,eAAe,QAAQ,QAAQ,CAAC,EAAE,UAAU,MAAM,SAAS,EAAE,OAAO,oBAAQ;AAGlF,MAAI,CAAC,aAAa;AAChB,eAAO,iBAAG,QAAQ,IAAI,CAAC,EAAE,WAAW,aAAa,MAAM,aAAa,UAAU,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC;AAEjG,SAAO,IAAI,wBAAgB,CAAC,eAAe;AAGzC,UAAM,eAAqD,CAAC;AAE5D,UAAM,YAAY,UAAU;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,MACA,CAAC,YAAY;AAAA,MACb,CAAC,OAAO,WAAsC;AAC5C,YAAI,MAAO,YAAW,MAAM,KAAK;AAAA,iBACxB,QAAQ;AAEf,qBAAW,CAAC,UAAU,aAAa,KAAK,OAAO;AAC7C,yBAAa,QAAQ,IAAI;AAG3B,gBAAM,cAAU,4BAAQ,YAAY;AAGpC,qBAAW,KAAK,mBAAmB,SAAS,EAAE,OAAO,OAAO,OAAO,QAAQ,CAAC,CAAC;AAAA,QAC/E;AAAA,MACF;AAAA,MACA;AAAA,IACF;AAEA,WAAO,MAAM;AACX,gBAAU,KAAK,CAAC,UAAU,MAAM,0BAA0B,CAAC;AAAA,IAC7D;AAAA,EACF,CAAC;AACH;AAEA,IAAM,qBAAqB,CACzB,SACA,WACQ;AACR,SAAO,QAAQ,OAAO,CAAC,KAAK,EAAE,WAAW,aAAa,MAAM;AAC1D,UAAM,UAAU,UAAU,IAAI,CAAC,aAAa;AAC1C,UAAI,CAAC,YAAY,CAAC,OAAQ,QAAO;AAEjC,YAAM,SAAS,OAAO,QAAQ,KAAK,CAAC,CAAC,GAAG,MAAM,QAAQ,QAAQ;AAC9D,UAAI,CAAC,OAAQ,QAAO;AAEpB,aAAO,OAAO,CAAC;AAAA,IACjB,CAAC;AAED,QAAI,KAAK,aAAa,OAAO,CAAC;AAE9B,WAAO;AAAA,EACT,GAAG,CAAC,CAAQ;AACd;;;AClGA,IAAAC,gBAAuD;AAEhD,IAAM,iBAAiB,CAC5B,UACA,YACA,aACY;AACZ,QAAM,SAAS,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AACjE,MAAI,CAAC,UAAU,CAAC,OAAO,QAAS,QAAO;AACvC,SAAO,OAAO,QAAQ,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ;AACnE;AAEO,IAAM,kBAAkB,CAC7B,UACA,YACA,cACY;AACZ,QAAM,SAAS,SAAS,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,UAAU;AACjE,MAAI,CAAC,UAAU,CAAC,OAAO,QAAS,QAAO;AACvC,SAAO,UAAU,MAAM,CAAC,aAAa,OAAO,SAAS,MAAM,KAAK,CAAC,SAAS,KAAK,SAAS,QAAQ,CAAC;AACnG;AAEO,IAAM,gBAAgB,CAC3B,UACA,SACA,WACY;AACZ,QAAM,MAAM,SAAS,KAAK,KAAK,CAACC,SAAQA,KAAI,SAAS,OAAO;AAC5D,MAAI,CAAC,OAAO,CAAC,IAAI,QAAS,QAAO;AACjC,SAAO,IAAI,QAAQ,KAAK,CAAC,MAAM,EAAE,SAAS,MAAM;AAClD;AAEO,IAAM,mBAAmB,CAC9B,aACA,QACA,aACG;AACH,QAAM,EAAE,iBAAiB,QAAQ,QAAI,gCAAiB,WAAW;AAEjE,QAAM,QAAQ,QAAQ,cAAc,QAAQ,QAAQ;AAEpD,QAAM,eAAe,gBAAgB,QAClC,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,MAAM,GACjC,UAAU,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,QAAQ,GAAG;AAErD,MAAI,CAAC,aAAc,OAAM,IAAI,MAAM,YAAY,MAAM,IAAI,QAAQ,YAAY;AAE7E,SAAO,MAAM,IAAI,YAAY;AAC/B;AAEO,IAAM,sBAAsB,CACjC,aACA,QACA,aACG;AACH,QAAM,EAAE,iBAAiB,QAAQ,QAAI,gCAAiB,WAAW;AAEjE,QAAM,eAAe,gBAAgB,QAClC,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,MAAM,GACjC,UAAU,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,QAAQ,GAAG;AAErD,MAAI,CAAC,aAAc,QAAO;AAE1B,QAAM,QAAQ,QAAQ,cAAc,QAAQ,QAAQ;AAEpD,SAAO,MAAM,IAAI,YAAY;AAC/B;;;AClEA,IAAAC,8BAA2D;AAC3D,IAAAC,qBAAwB;AACxB,IAAAC,eAA2D;AAE3D,IAAM,oBAAoB,IAAI,6BAA2C,CAAC,CAAC;AAEpE,IAAM,sBAAsB,CAAC,SAAiB,MAAiB,aAAwB;AAE5F,QAAM,cACJ,kBAAkB,MAAM,OAAO,GAAG,OAAO,CAAC,WAAO,0CAAa,EAAE,EAAE,SAAS,IAAI,KAAK,CAAC;AAEvF,oBAAkB,KAAK;AAAA,IACrB,GAAG,kBAAkB;AAAA,IACrB,CAAC,OAAO,GAAG,YAAY,OAAO,QAAQ,EAAE,KAAK;AAAA,EAC/C,CAAC;AACH;AAEO,IAAM,wBAAwB,CAAC,YACpC,kBAAkB;AAAA,MAChB,kBAAI,CAAC,gBAAgB,YAAY,OAAO,KAAK,CAAC,CAAC;AAAA,MAC/C,mCAAgC,0BAAO;AACzC;;;ALTF,IAAM,iBAAiB;AAEhB,IAAMC,iBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,aAAa,MAAM,UAAU,cAAc,SAAS;AAC1D,MAAI,CAAC,WAAY,OAAM,IAAI,MAAM,+CAA+C,SAAS,EAAE;AAE3F,QAAM,uBAAmB,yBAAK,oBAAoB,QAAQ,CAAC,CAAC,EAAE,SAAS,MAAM,SAAS,CAAC;AAEvF,QAAM,qBAAqB,MAAM,QAAQ;AAAA,IACvC,iBAAiB,IAAI,OAAO,YAAY;AACtC,YAAM,gBAAgB,MAAM,WAAW,8BAA8B,IAAI,uBAAU,OAAO,GAAG;AAAA,QAC3F,WAAW,IAAI,uBAAU,cAAc;AAAA;AAAA,MACzC,CAAC;AAED,YAAM,WAAW,cAAc,MAC5B,IAAI,CAAC,MAAuB;AAC3B,YAAI;AACF,gBAAM,cAAc,EAAE,QAAQ,KAAK,OAAO,KAAK;AAC/C,gBAAM,QAAQ,EAAE,QAAQ,KAAK,OAAO,KAAK,YAAY,UAAU;AAC/D,iBAAO;AAAA,YACL,aAAS,2CAAc,WAAW,WAAW;AAAA,YAC7C;AAAA,YACA;AAAA,YACA,QAAQC;AAAA,YACR,QAAQ;AAAA,YACR;AAAA,UACF;AAAA,QACF,QAAQ;AACN,sBAAI,KAAK,gCAAgC;AAAA,YACvC;AAAA,YACA;AAAA,UACF,CAAC;AACD,iBAAO;AAAA,QACT;AAAA,MACF,CAAC,EACA,OAAO,qBAAQ;AAGlB;AAAA,QACE;AAAA,QACAA;AAAA,QACA,SAAS,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,MAC/B;AAEA,aAAO,CAAC,SAAS,QAAQ;AAAA,IAC3B,CAAC;AAAA,EACH;AAEA,QAAM,uBAAmB;AAAA,IACvB,mBAAmB,QAAQ,CAAC,CAAC,EAAE,eAAe,MAAM,eAAe;AAAA,IACnE,CAAC,MAAM,cAAc,EAAE,SAAS,EAAE,OAAO;AAAA,EAC3C;AAEA,QAAM,cAAc,eAAmC,mBAAmB;AAG1E,QAAM,UAAU,YAAY,IAAI,CAAC,OAAiB;AAChD,UAAM,QAAQ,iBAAiB,cAAc,GAAG,MAAM,IAAI,GAAG,OAAO,CAAC;AACrE,WACE,SAAS;AAAA,MACP,SAAS,GAAG,MAAM;AAAA,MAClB,WAAW,GAAG,MAAM;AAAA,MACpB,SAAS,GAAG;AAAA,MACZ,QAAQA;AAAA,MACR,QAAQ;AAAA,MACR,OAAO;AAAA,IACT;AAAA,EAEJ,CAAC;AAGD,SAAO,EAAE,SAAS,QAAQ,CAAC,EAAE;AAC/B;AAEA,IAAM,gBAAgB,CAAC,SAAiB,YAAoB,GAAG,OAAO,IAAI,OAAO;;;AM5FjF,gCAAoC;AACpC,iBAA+B;AAC/B,uBAA2B;AAC3B,IAAAC,eAA0B;AAE1B,IAAAC,8BAKO;AACP,IAAAC,qBAA6B;AAC7B,IAAAC,aAAc;AAMd,IAAMC,oBAAmB,WAAAC,QAAE,mBAAmB,WAAW;AAAA,EACvD,WAAAA,QAAE,aAAa;AAAA,IACb,IAAI,8CAAkB,MAAM;AAAA,IAC5B,SAAS,WAAAA,QAAE,QAAQ,IAAI;AAAA,IACvB,GAAG,8CAAkB,KAAK,EAAE,QAAQ,MAAM,UAAU,MAAM,MAAM,MAAM,MAAM,KAAK,CAAC,EAAE;AAAA,EACtF,CAAC;AAAA,EACD,WAAAA,QAAE,aAAa;AAAA,IACb,IAAI,8CAAkB,MAAM;AAAA,IAC5B,SAAS,WAAAA,QAAE,QAAQ,KAAK;AAAA,EAC1B,CAAC;AACH,CAAC;AAID,IAAM,sBAAsB,IAAI,uBAAU,6CAA6C;AAEhF,IAAMC,eAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAAwB,CAAC;AAE/B,aAAW,eAAe,QAAQ;AAChC,UAAM,cAAU,2CAAc,WAAW,YAAY,WAAW;AAChE,QAAI,SAAU,MAAM,OAAO,KAAKF,kBAAiB,UAAU,MAAM,OAAO,CAAC,EAAE;AAI3E,QAAI,CAAC,QAAQ;AACX,YAAM,YAAY,MAAM,sBAAsB,WAAW,OAAO;AAChE,UAAI,UAAW,OAAM,OAAO,IAAI;AAAA,IAClC;AAEA,aAAU,MAAM,OAAO,KAAKA,kBAAiB,UAAU,MAAM,OAAO,CAAC,EAAE;AAIvE,QAAI,QAAQ,YAAY,MAAO;AAE/B,UAAM,OAAoE;AAAA,MACxE,IAAI;AAAA,MACJ,MAAMG;AAAA,MACN,UAAUC;AAAA,MACV;AAAA,IACF;AAEA,UAAM,YAAQ;AAAA,MACZ;AAAA,MACA,QAAQ,cAAU,yBAAK,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC;AAAA,MAC/C;AAAA,IACF;AAEA,UAAM,SAAS,8CAAkB,UAAU,KAAK;AAChD,QAAI,CAAC,OAAO,SAAS;AACnB,kBAAI,KAAK,iDAAiD;AAAA,QACxD;AAAA,MACF,CAAC;AACD;AAAA,IACF;AAEA,WAAO,KAAK,OAAO,IAAI;AAAA,EACzB;AAEA,SAAO;AACT;AAEA,IAAM,gBAAgB;AACtB,IAAM,oBAAoB;AAC1B,IAAM,qBAAqB;AAE3B,IAAM,wBAAwB,OAAO,WAA+B,YAAoB;AACtF,MAAI;AACF,UAAM,EAAE,WAAW,YAAY,QAAI,gDAAmB,OAAO;AAE7D,UAAM,aAAa,MAAM,UAAU,cAAc,SAAS;AAC1D,QAAI,CAAC,YAAY;AACf,kBAAI,KAAK,mCAAmC,SAAS,EAAE;AACvD,aAAO;AAAA,IACT;AAEA,UAAM,aAAa,IAAI,uBAAU,WAAW;AAC5C,UAAM,WAAW,MAAM,WAAW,eAAe,UAAU;AAC3D,QAAI,CAAC,UAAU,KAAM,OAAM,IAAI,MAAM,aAAa;AAClD,UAAM,OAAO,4BAAW,OAAO,SAAS,IAAI;AAE5C,UAAM,CAAC,WAAW,IAAI,uBAAU;AAAA,MAC9B,CAAC,OAAO,KAAK,UAAU,GAAG,oBAAoB,SAAS,GAAG,WAAW,SAAS,CAAC;AAAA,MAC/E;AAAA,IACF;AAGA,UAAM,kBAAkB,MAAM,WAAW,eAAe,IAAI,uBAAU,WAAW,CAAC;AAClF,QAAI,CAAC,gBAAiB,OAAM,IAAI,MAAM,iBAAiB;AAEvD,UAAM,eAAW,+CAAoB;AAAA,MACnC,eAAW,sBAAU,WAAW;AAAA,MAChC,YAAY,gBAAgB;AAAA,MAC5B,WAAO,sBAAU,gBAAgB,KAAK;AAAA,MACtC,cAAU,gBAAI,gBAAgB,QAAQ;AAAA,MACtC,MAAM,gBAAgB;AAAA,IACxB,CAAC;AAED,UAAM,SAASJ,kBAAiB,UAAU;AAAA,MACxC,IAAI;AAAA,MACJ,QAAQ,SAAS,OAAO,KAAK;AAAA,MAC7B,MAAM,SAAS,KAAK,KAAK;AAAA,MACzB,UAAU,KAAK;AAAA,MACf,SAAS;AAAA,IACX,CAAC;AAED,QAAI,CAAC,OAAO,QAAS,OAAM,IAAI,MAAM,kBAAkB;AAEvD,WAAO,OAAO;AAAA,EAChB,SAAS,KAAK;AACZ,UAAM,MAAO,IAAc;AAE3B,QAAI,CAAC,eAAe,mBAAmB,kBAAkB,EAAE,SAAS,GAAG;AACrE,aAAOA,kBAAiB,MAAM;AAAA,QAC5B,IAAI;AAAA,QACJ,SAAS;AAAA,MACX,CAAC;AAEH,gBAAI,KAAK,6CAA6C,SAAS,EAAE,IAAI,CAAC;AAAA,EACxE;AAEA,SAAO;AACT;;;AC/IO,IAAMK,mBAAyE,MAAM;AAC1F,QAAM,IAAI,MAAM,iDAAiD;AACnE;;;ACLA,IAAAC,oBAMO;AACP,IAAAC,eAAwE;AACxE,IAAAC,8BAA8B;AAKvB,IAAMC,uBACX,OAAO,EAAE,MAAAC,OAAM,IAAI,OAAO,OAAO,UAAU,MAAM;AAC/C,MAAI,KAAC,2CAAc,OAAOC,YAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,YAAW,GAAG;AAEnE,QAAM,aAAa,MAAM,UAAU,cAAc,MAAM,SAAS;AAEhE,QAAM,eAAyC,CAAC;AAEhD,QAAM,OAAO,IAAI,uBAAU,MAAM,WAAW;AAC5C,QAAM,aAAa,IAAI,uBAAUD,KAAI;AACrC,QAAM,WAAW,IAAI,uBAAU,EAAE;AAGjC,QAAM,mBAAmB,UAAM,6CAA0B,MAAM,UAAU;AACzE,QAAM,iBAAiB,UAAM,6CAA0B,MAAM,QAAQ;AAGrE,MAAI,CAAE,MAAM,mBAAmB,YAAY,cAAc,GAAI;AAC3D,iBAAa;AAAA,UACX;AAAA,QACE;AAAA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,eAAa;AAAA,QACX;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO,KAAK;AAAA,MACZ,CAAC;AAAA,MACD;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEF,IAAM,qBAAqB,OAAO,YAAwB,YAAuB;AAC/E,MAAI;AACF,cAAM,8BAAW,YAAY,OAAO;AACpC,WAAO;AAAA,EACT,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;AChEA,IAAAE,qBAAwB;AACxB,IAAAC,eAAqD;AAOrD,IAAMC,yBAAwB;AAEvB,IAAMC,qBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,iBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,SAAO,IAAI,wBAAW,CAAC,eAAe;AACpC,UAAM,kBAAkB,IAAI,gBAAgB;AAE5C,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,YAAI,gBAAgB,OAAO,QAAS;AAEpC,cAAM,WAAW,MAAMC,eAAc;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,gBAAgB,OAAO,QAAS;AAEpC,mBAAW,KAAK,QAAQ;AAExB,mBAAW,MAAMF,sBAAqB;AAAA,MACxC,SAAS,OAAO;AACd,oBAAI,MAAM,SAAS;AAAA,UACjB,QAAQG;AAAA,UACR;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,QACF,CAAC;AACD,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,SAAK;AAEL,WAAO,MAAM;AACX,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC,EAAE,SAAK,mCAAqB,0BAAO,CAAC;AACvC;;;AC5CO,IAAM,sBAAuE;AAAA,EAClF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AChBA,IAAAC,8BAAkC;AAClC,IAAAC,aAAc;AAKP,IAAM,0BAA0B,WAAAC,QAAE,aAAa;AAAA,EACpD,aAAa,8CAAkB,MAAM;AAAA,EACrC,GAAG,sBAAsB;AAC3B,CAAC;;;ACTD,IAAAC,8BAAqC;AAK9B,IAAMC,eAAc,iDAAqB,MAAM,KAAK;AACpD,IAAMC,YAAW,iDAAqB,MAAM,SAAS;;;ACN5D,IAAAC,gBAAkD;AAClD,IAAAC,eAAyB;AAQlB,IAAM,eAAe,CAC1B,WACA,aACA,iBACkC;AAClC,QAAM,uBAAuB,0BAA0B,WAAW,cAAc;AAAA,IAC9E,SAAS,CAAC,UAAU,SAAS;AAAA,EAC/B,CAAC;AAED,SAAO,YACJ,IAAI,CAAC,EAAE,OAAO,QAAQ,MAAqC;AAC1D,UAAM,aAAa,sBAAsB;AACzC,UAAM,WACJ,UAAU,YAAY,OAAO,MAAM,OAAO,GAAG,OAAO;AAAA,IACpD,UAAU,YAAY,OAAO,MAAM,OAAO,GAAG,OAAO;AAEtD,QAAI,CAAC,UAAU;AACb,kBAAI;AAAA,QACF,gCAAgC,SAAS,kBAAkB,MAAM,OAAO,MAAM,OAAO;AAAA,MACvF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,CAAC,YAA6B;AAcjD,YAAM,cAAU;AAAA,QACd;AAAA,QACA,QAAQ,CAAC;AAAA,QACT,sDAAsD,SAAS;AAAA,MACjE,KAAK;AAAA,QACH,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ,EAAE,MAAM,aAAa;AAAA,QAC7B,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,OAAO;AAAA,MACT;AAEA,YAAM,WAAW,SAAS,QAAQ,SAAS;AAC3C,YAAM,UAAU,SAAS,WAAW,IAAI,SAAS;AAWjD,YAAM,OAAO;AACb,YAAM,SAAS,MAAM,YAAY,WAAW,SAAS;AAGrD,YAAM,gBAAgD;AAAA,QACpD,EAAE,MAAM,QAAQ,OAAO,QAAQ,QAAQ,KAAK,SAAS,EAAE;AAAA,QACvD,EAAE,MAAM,UAAU,OAAO,UAAU,QAAQ,OAAO,SAAS,EAAE;AAAA,MAC/D;AAEA,YAAM,UAAoB;AAAA,QACxB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AAAA,QACf,QAAQ;AAAA,MACV;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,WAAW,CAAC,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,qBAAQ;AACpB;AAIA,IAAM,YAAY,CAAC,eAA8C,SAAoB;AACnF,MAAI;AACF,WAAO,YAAY,MAAM,MAAM,GAAG,IAAI;AAAA,EACxC,QAAQ;AACN,WAAO;AAAA,EACT;AACF;;;ACpGO,IAAMC,iBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,MAAI,CAAC,cAAc,MAAM;AACvB,gBAAI,KAAK,yCAAyCC,YAAW,gBAAgB,SAAS,GAAG;AACzF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,gDAAgD;AAAA,MACnE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,WAAWA,cAAa;AACvC,gBAAI,KAAK,qCAAqC,aAAa,MAAM,OAAOA,YAAW,GAAG;AACtF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,+CAA+CA,YAAW,EAAE;AAAA,MAC/E,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,YAAY,WAAW;AACtC,gBAAI;AAAA,MACF,sCAAsC,aAAa,OAAO,OAAOA,YAAW,yBAAyB,SAAS;AAAA,IAChH;AACA,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,wCAAwC,SAAS,EAAE;AAAA,MACtE,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,UAAU,aAAa,WAAW,aAAa,YAAY;AAEjE,QAAM,WAAW,MAAM,kBAAkB,WAAW,WAAW,OAAO;AAEtE,SAAO,YAAY;AAAA,IACjB,CAAC,KAAK,QAAQ;AACZ,YAAM,UAAU,SAAS;AAAA,QACvB,CAAC,MAAM,GAAG,YAAY,IAAI,WAAW,GAAG,YAAY,IAAI,MAAM;AAAA,MAChE;AACA,UAAI,QAAS,KAAI,QAAQ,KAAK,OAAO;AAAA;AAGnC,YAAI,QAAQ,KAAK;AAAA,UACf,SAAS,IAAI;AAAA,UACb;AAAA,UACA,SAAS,IAAI,MAAM;AAAA,UACnB,QAAQA;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,EAAE,MAAM,QAAQ,OAAO,QAAQ,QAAQ,IAAI;AAAA,YAC3C,EAAE,MAAM,UAAU,OAAO,UAAU,QAAQ,IAAI;AAAA,UACjD;AAAA,QACF,CAAC;AACH,aAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC5B;AACF;;;AChFA,IAAAC,8BAKO;AACP,IAAAC,gBAAsD;AACtD,IAAAC,qBAAoC;AAO7B,IAAMC,eAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,kBAAkB;AACxB,MAAI,CAAC,iBAAiB,KAAM,QAAO,CAAC;AAEpC,QAAM,EAAE,QAAQ,QAAI,gCAAiB,gBAAgB,IAAI;AACzD,QAAM,aAAa,QAAQ,aAAa,UAAU,OAAO;AACzD,QAAM,gBAAgB,QAAQ,aAAa,UAAU,UAAU;AAE/D,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtE,UAAU,KAAsB,WAAW,iBAAiB;AAAA,UAC1D,mCAAoB,UAAU,OAAO;AAAA,IACvC,CAAC;AAAA,IACD,UAAU,KAAsB,WAAW,iBAAiB;AAAA,UAC1D,mCAAoB,UAAU,UAAU;AAAA,IAC1C,CAAC;AAAA,EACH,CAAC;AAED,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtE,UAAU,KAAyB,WAAW,wBAAwB,CAAC,mBAAmB,CAAC;AAAA,IAC3F,UAAU,KAAyB,WAAW,wBAAwB,CAAC,sBAAsB,CAAC;AAAA,EAChG,CAAC;AAED,QAAM,sBAAsB,oBAAoB,SAAS,oBAAoB,CAAC,EAAE,UAAU,CAAC;AAC3F,QAAM,yBAAyB,uBAAuB,SAClD,uBAAuB,CAAC,EAAE,UAC1B,CAAC;AAEL,QAAM,qBAAiB;AAAA,IACrB,oBAAoB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACxC,YAAM,CAAC,OAAO,IAAI,WAAW,KAAK,IAAI,GAAG;AACzC,YAAM,QAAQ,WAAW,MAAM,IAAI,KAAK;AAIxC,aAAO,EAAE,SAAS,oBAAoB,MAAM,aAAa,cAAc,MAAM,cAAc;AAAA,IAC7F,CAAC;AAAA,IACD,CAAC,MAAM,EAAE;AAAA,EACX;AAEA,QAAM,wBAAoB;AAAA,IACxB,uBAAuB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC3C,YAAM,CAAC,OAAO,IAAI,cAAc,KAAK,IAAI,GAAG;AAC5C,YAAM,WAAW,cAAc,MAAM,IAAI,KAAK;AAO9C,aAAO;AAAA,QACL;AAAA,QACA,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS;AAAA,QACnB,MAAM,SAAS,MAAM,OAAO;AAAA,QAC5B,QAAQ,SAAS,QAAQ,OAAO;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,IACD,CAAC,MAAM,EAAE;AAAA,EACX;AAEA,QAAM,gBAAY,yBAAK,cAAc,EAAE;AAAA,IAAI,CAAC,gBAC1C,2BAAO,CAAC,GAAG,eAAe,OAAO,GAAG,kBAAkB,OAAO,KAAK,MAAS;AAAA,EAC7E;AAEA,QAAM,2BAAuB,0BAAM,QAAQ,CAAC,MAAM,EAAE,OAAO;AAE3D,SACE,UACG;AAAA,IACC,CAAC,WAA2B;AAAA,MAC1B,QAAI,6CAAgB,WAAW,OAAO,MAAM,OAAO,CAAC;AAAA,MACpD,MAAMC;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,SAAS,OAAO,MAAM,OAAO;AAAA,MAC7B,cAAc,MAAM;AAAA,MACpB,UAAU,MAAM;AAAA,MAChB,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM,YAAY;AAAA,MAC5B,oBAAoB,OAAO,MAAM,kBAAkB;AAAA,MACnD,WAAW;AAAA,IACb;AAAA,EACF,EAEC,OAAO,CAAC,UAAU;AACjB,UAAM,cAAc,qBAAqB,MAAM,OAAO;AACtD,WAAO,eAAe,MAAM;AAAA,EAC9B,CAAC,EAEA,IAAI,CAAC,UAAU;AACd,UAAM,cAAc,qBAAqB,MAAM,OAAO;AACtD,WAAO,kBAAc,2BAAO,CAAC,GAAG,OAAO,WAAW,IAAI;AAAA,EACxD,CAAC,EAEA,OAAO,CAAC,MAAM;AACb,UAAM,SAAS,iDAAqB,UAAU,CAAC;AAG/C,WAAO,OAAO;AAAA,EAChB,CAAC;AAEP;;;ACzHA,IAAAC,8BAA2D;AAC3D,IAAAC,iBAAkE;;;ACDlE,IAAAC,8BAAkE;AAClE,IAAAC,sBAKO;AACP,IAAAC,eAMO;AACP,IAAAC,oBAAsB;;;ACdf,IAAM,eAAe;AAGrB,IAAM,oBAAoB,OAAO;AAEjC,IAAM,sBAAsB,CAAC,SAAiB,UAA0B;AAC7E,MAAI,CAAC,WAAW,CAAC,MAAO,QAAO;AAC/B,SAAQ,QAAQ,oBAAqB;AACvC;AAEO,IAAM,aAAa,CAAC,OAAe,qBAAqC;AAC7E,MAAI,CAAC,SAAS,CAAC,iBAAkB,QAAO;AACxC,SAAQ,QAAQ,mBAAoB;AACtC;AAEO,IAAM,aAAa,CAAC,KAAa,qBAAqC;AAC3E,MAAI,CAAC,OAAO,CAAC,iBAAkB,QAAO;AACtC,SAAQ,MAAM,oBAAqB;AACrC;;;AClBA,IAAAC,8BAAoD;AACpD,yBAKO;AAKP,IAAM,YAAY,OAAO;AAUlB,IAAM,oBAAoB,CAC/B,OACA,YACA,qBACG;AACH,MAAI;AACF,UAAM,iBAAa,8CAAiB,MAAM,SAAS;AACnD,UAAM,gBAAgB,WAAW,UAAU;AAC3C,QAAI,CAAC,cAAe,QAAO;AAG3B,QAAI,MAAM,WAAW,EAAG,QAAO,gBAAgB,aAAa;AAE5D,UAAM,iBAAa,kCAAc;AACjC,eAAW,CAAC,UAAU,OAAO,KAAK,OAAO,QAAQ,aAAa,GAGzD;AACH,UAAI,CAAC,SAAS;AACZ,mBAAW,QAAQ,IAAI;AAAA,MACzB,OAAO;AACL,cAAM,WAAW,WAAW,WAAW,OAAO,gBAAgB,CAAC;AAC/D,cAAM,aAAa,OAAO,QAAQ,IAAI,OAAO,iBAAiB;AAC9D,mBAAW,QAAQ,IAAI;AAAA,UACrB,OAAO,QAAQ,QAAQ;AAAA,UACvB,WAAW,QAAQ,YAAY,QAAQ,YAAY,aAAa;AAAA,UAChE,WAAW;AAAA;AAAA,QACb;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,EACT,SAAS,KAAK;AACZ,gBAAI,MAAM,GAAG;AACb,WAAO;AAAA,EACT;AACF;;;ACzDA,IAAAC,8BAAmC;AAK5B,IAAMC,eAAc,+CAAmB,MAAM,KAAK;AAClD,IAAMC,YAAW,+CAAmB,MAAM,SAAS;;;ACL1D,IAAAC,8BAKO;AACP,IAAAC,gBAA8C;AAC9C,IAAAC,eAAyB;AACzB,IAAAC,qBAA4B;;;ACT5B,IAAAC,8BAA+B;AAOxB,IAAM,gCAAgC,CAAC;AAAA,EAC5C;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAQwB;AACtB,QAAM,2BAA6C,CAAC;AAEpD,aAAW,CAAC,QAAQ,aAAa,KAAK,4BAA4B;AAChE,QAAI,kBAAkB,IAAI;AACxB;AAAA,IACF;AACA,UAAM,cAAc,oBAAoB,MAAM;AAC9C,UAAM,mBAAmB,cACrB,oBAAoB,YAAY,UAAU,YAAY,MAAM,IAC5D;AAMJ,UAAM,iBAAkB,QAAQ,iBAAiB,MAAM,QAAS;AAGhE,UAAM,iBAAiB,uBAAuB,IAAI,MAAM,KAAK;AAC7D,UAAM,mBAAmB,iBAAiB,iBAAiB,iBAAiB,iBAAiB;AAE7F,6BAAyB,KAAK;AAAA,MAC5B;AAAA,MACA,aAAS,4CAAe,WAAW,QAAQ,MAAM;AAAA,MACjD,iBAAa,4CAAe,WAAW,MAAM;AAAA,MAC7C;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO;AACT;;;AD/BA,IAAM,cAAc;AAEb,IAAMC,iBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,MAAI,CAAC,cAAc,MAAM;AACvB,gBAAI,KAAK,yCAAyCC,YAAW,gBAAgB,SAAS,KAAK;AAAA,MACzF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,gDAAgD;AAAA,MACnE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,WAAWA,cAAa;AACvC,gBAAI,KAAK,qCAAqC,aAAa,MAAM,OAAOA,YAAW,GAAG;AACtF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,+CAA+CA,YAAW,EAAE;AAAA,MAC/E,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,YAAY,WAAW;AACtC,gBAAI;AAAA,MACF,sCAAsC,aAAa,OAAO,OAAOA,YAAW,yBAAyB,SAAS;AAAA,IAChH;AACA,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,wCAAwC,SAAS,EAAE;AAAA,MACtE,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gBAAY,yBAAK,YAAY,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;AAE5D,MAAI;AACF,UAAM,CAAC,YAAY,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,MACnD;AAAA,QACE;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA,CAAC,SAAS;AAAA,MACZ;AAAA,MACA;AAAA,QACE;AAAA,QACA;AAAA,QACA,aAAa;AAAA,QACb;AAAA,QACA;AAAA,QACA,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAED,UAAM,kBAAc;AAAA,MAClB,WAAW;AAAA,QAAQ,CAAC,CAAC,EAAE,MAAM,MAC3B,OAAO,OAAO,CAAC,UAAU,MAAM,WAAW,WAAW,EAAE,IAAI,CAAC,UAAU,MAAM,MAAM;AAAA,MACpF;AAAA,IACF;AACA,UAAM,6BACJ,YAAY,UAAU,aAAa,OAC/B,MAAM,wBAAwB,WAAW,WAAW,aAAa,MAAM,WAAW,IAClF,oBAAI,IAAiC;AAG3C,UAAM,2BAAqF,CAAC;AAC5F,eAAW,CAAC,SAAS,MAAM,KAAK,YAAY;AAC1C,iBAAW,SAAS,QAAQ;AAC1B,YAAI,MAAM,WAAW,aAAa;AAChC,gBAAM,iBAAiB,2BAA2B,IAAI,MAAM,MAAM;AAClE,cAAI,gBAAgB;AAElB,uBAAW,UAAU,eAAe,KAAK,GAAG;AAC1C,uCAAyB,KAAK,CAAC,SAAS,MAAM,QAAQ,MAAM,CAAC;AAAA,YAC/D;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,UAAM,qBACJ,yBAAyB,UAAU,aAAa,OAC5C,MAAM;AAAA,MACJ;AAAA,MACA;AAAA,MACA,aAAa;AAAA,MACb;AAAA,IACF,IACA,oBAAI,IAA8C;AAExD,UAAM,0BAAsB,0BAAM,aAAa,OAAO,qBAAQ,GAAG,CAAC,SAAS,KAAK,MAAM;AAKtF,UAAM,gBAAgB,CACpB,KACA,SACA,SACA,YACS;AACT,YAAM,MAAM,GAAG,OAAO,IAAI,OAAO;AACjC,YAAM,kBAAkB,IAAI,GAAG;AAC/B,UAAI,iBAAiB;AACnB,YAAI,GAAG,IAAI;AAAA,UACT,GAAG;AAAA,UACH,OAAO,gBAAgB,QAAQ,QAAQ;AAAA;AAAA,UAEvC,GAAI,QAAQ,qBAAqB,UAAa;AAAA,YAC5C,kBAAkB,QAAQ;AAAA,UAC5B;AAAA,QACF;AAAA,MACF,OAAO;AACL,YAAI,GAAG,IAAI;AAAA,MACb;AAAA,IACF;AAEA,UAAM,cAAc,WAAW;AAAA,MAC7B,CAAC,KAAK,CAAC,SAAS,MAAM,MAAM;AAC1B,mBAAW,SAAS,QAAQ;AAE1B,gBAAM,cAAc,oBAAoB,MAAM,MAAM;AACpD,gBAAM,mBAAmB,cACrB,oBAAoB,YAAY,UAAU,YAAY,MAAM,IAC5D;AAEJ,gBAAM,UAA0B;AAAA,YAC9B;AAAA,YACA,aAAS,4CAAe,WAAW,MAAM,QAAQ,MAAM,MAAM;AAAA,YAC7D,iBAAa,4CAAe,WAAW,MAAM,MAAM;AAAA,YACnD,OAAO,MAAM;AAAA,YACb,QAAQ,MAAM;AAAA,YACd,QAAQ,MAAM;AAAA,YACd;AAAA,UACF;AAEA,wBAAc,KAAK,SAAS,QAAQ,SAAS,OAAO;AAGpD,cAAI,MAAM,WAAW,aAAa;AAChC,kBAAM,iBAAiB,2BAA2B,IAAI,MAAM,MAAM,KAAK,oBAAI,IAAI;AAC/E,kBAAM,oBACJ,mBAAmB,IAAI,OAAO,GAAG,IAAI,MAAM,MAAM,KAAK,oBAAI,IAAoB;AAEhF,kBAAM,2BAA2B,8BAA8B;AAAA,cAC7D,OAAO,MAAM;AAAA,cACb,QAAQ,MAAM;AAAA,cACd;AAAA,cACA;AAAA,cACA,4BAA4B;AAAA,cAC5B;AAAA,cACA,wBAAwB;AAAA,YAC1B,CAAC;AACD,qCAAyB,QAAQ,CAACC,aAAY;AAC5C,4BAAc,KAAK,SAASA,SAAQ,SAASA,QAAO;AAAA,YACtD,CAAC;AAAA,UACH;AAAA,QACF;AACA,eAAO;AAAA,MACT;AAAA,MACA,CAAC;AAAA,IACH;AAEA,UAAM,WAAW,OAAO,OAAO,WAAW;AAE1C,UAAM,iBAAa;AAAA,MACjB,oBAAoB,IAAI,CAAC,CAAC,KAAK,MAAM,KAAK;AAAA,MAC1C,CAAC,MAAM,EAAE;AAAA,IACX;AACA,UAAM,gBAAgC,CAAC;AAIvC,eAAW,OAAO,UAAU;AAC1B,UAAI,CAAC,YAAY,KAAK,CAAC,QAAQ,IAAI,MAAM,OAAO,IAAI,OAAO,GAAG;AAC5D,cAAM,YAAY,WAAW,IAAI,WAAW;AAE5C,YAAI,WAAW;AACb,gBAAM,iBAAa,2CAAc,SAAS;AAC1C,gBAAM,WAAW,wCAAY,MAAM;AAAA,YACjC,GAAG;AAAA,YACH,IAAI,IAAI;AAAA,YACR,QAAQ,IAAI;AAAA,UACd,CAAC;AACD,wBAAc,KAAK,QAAQ;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAsB,YAAY,IAAI,CAAC,QAAkB;AAC7D,YAAM,QAAQ,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,IAAI,WAAW,EAAE,YAAY,IAAI,MAAM,EAAE;AAC1F,YAAM,OAA2B;AAAA,QAC/B,kBAAkB,OAAO,iBAAiB,SAAS,KAAK;AAAA,MAC1D;AAEA,YAAM,cAAc,OAAO,OAAO,OAAO,SAAS,KAAK,GAAG;AAC1D,YAAM,yBAAyB,OAAO,OAAO,kBAAkB,SAAS,KAAK,GAAG;AAChF,YAAM,eAAe,gBAAgB;AACrC,YAAM,sBAAsB,yBAAyB;AAErD,YAAM,eAAwC;AAAA,QAC5C,MAAM;AAAA,QACN,OAAO,OAAO,WAAW,IAAI,iBAAiB;AAAA,QAC9C,QAAQ,YAAY,SAAS;AAAA,QAC7B;AAAA,MACF;AAEA,YAAM,wBAAiD;AAAA,QACrD,MAAM;AAAA,QACN,OAAO;AAAA,QACP,QAAQ,uBAAuB,SAAS;AAAA,QACxC;AAAA,MACF;AAEA,YAAMC,UAAyC,CAAC,cAAc,qBAAqB;AAOnF,UAAI,gBAAgB,qBAAqB;AACvC,QAAAA,QAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,OAAO;AAAA,UACP,QAAQ,uBAAuB,SAAS;AAAA,UACxC,gBAAgB;AAAA,UAChB;AAAA,QACF,CAAC;AAAA,MACH;AAEA,aAAO;AAAA,QACL,SAAS,IAAI;AAAA,QACb;AAAA,QACA,SAAS,IAAI,MAAM;AAAA,QACnB,QAAQF;AAAA,QACR,QAAQ;AAAA,QACR,QAAAE;AAAA,MACF;AAAA,IACF,CAAC;AAED,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC;AAAA,MACT;AAAA,IACF;AAAA,EACF,SAAS,KAAK;AACZ,gBAAI,KAAK,+CAA+C,EAAE,IAAI,CAAC;AAE/D,UAAM,SAAS,YAAY,IAAI,CAAC,SAAS;AAAA,MACvC,SAAS,IAAI,MAAM;AAAA,MACnB,SAAS,IAAI;AAAA,MACb,OAAO,IAAI,MAAM,+BAA+B,IAAI,OAAO,OAAO,SAAS,EAAE;AAAA,IAC/E,EAAE;AAEF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;AAEA,IAAM,oBAAoB,CAAC,aAA4B,QAAgB,UAAkB;AACvF,QAAM,EAAE,QAAQ,QAAI,gCAAiB,WAAW;AAChD,SAAO,QAAQ,aAAa,QAAQ,KAAK;AAC3C;AAEA,IAAM,iCAAiC,OACrC,YACA,WACA,gBAC+F;AAC/F,MAAI,eAA4D;AAEhE,MAAI,aAAa;AACf,QAAI;AACF,qBAAe,kBAAkB,aAAa,mBAAmB,eAAe;AAAA,IAClF,SAAS,OAAO;AACd,kBAAI;AAAA,QACF,8FAA8F,SAAS;AAAA,QACvG,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,+BAA+B,OACnC,WACA,gBAC+F;AAC/F,MAAI,eAA4D;AAEhE,MAAI,aAAa;AACf,QAAI;AACF,qBAAe,kBAAkB,aAAa,mBAAmB,aAAa;AAAA,IAChF,SAAS,OAAO;AACd,kBAAI;AAAA,QACF,4FAA4F,SAAS;AAAA,QACrG,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,IAAM,4BAA4B,CAChC,WACA,SACA,iBACuD;AACvD,SAAO,QAAQ,IAAI,CAAC,WAAW;AAC7B,QAAI,WAA0B;AAC9B,QAAI;AACF,iBAAW,aAAa,KAAK,IAAI,MAAM;AAAA,IACzC,SAAS,OAAO;AACd,kBAAI,KAAK,2CAA2C,MAAM,OAAO,SAAS,IAAI,EAAE,MAAM,CAAC;AAAA,IACzF;AAEA,UAAM,eAAe,CAAC,YAA4D;AAChF,YAAM,WAAW,QAAQ,CAAC;AAC1B,UAAI,CAAC,UAAU;AACb,eAAO,CAAC,QAAQ,oBAAI,IAAoB,CAAC;AAAA,MAC3C;AAEA,YAAM,cAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA,6CAA6C,MAAM,OAAO,SAAS;AAAA,MACrE;AACA,aAAO,CAAC,QAAQ,UAAU,IAAI,IAAI,OAAO,IAAI,oBAAI,IAAoB,CAAC;AAAA,IACxE;AAEA,WAAO;AAAA,MACL,WAAW,CAAC,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,IAAM,0BAA0B,OAC9B,WACA,WACA,aACA,YAC8C;AAC9C,MAAI,CAAC,QAAQ,OAAQ,QAAO,oBAAI,IAAiC;AAEjE,QAAM,eAAe,MAAM,+BAA+B,WAAW,WAAW,WAAW;AAC3F,MAAI,CAAC,cAAc;AAEjB,WAAO,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,oBAAI,IAAoB,CAAC,CAAC,CAAC;AAAA,EAC7E;AAEA,QAAM,UAAU,0BAA0B,WAAW,SAAS,YAAY;AAE1E,MAAI;AACF,UAAM,UAAU,MAAM,kBAAkB,WAAW,WAAW,OAAO;AACrE,WAAO,IAAI,IAAI,OAAO;AAAA,EACxB,SAAS,OAAO;AACd,gBAAI,KAAK,gDAAgD,SAAS,IAAI,EAAE,MAAM,CAAC;AAE/E,WAAO,IAAI,IAAI,QAAQ,IAAI,CAAC,WAAW,CAAC,QAAQ,oBAAI,IAAoB,CAAC,CAAC,CAAC;AAAA,EAC7E;AACF;AAEA,IAAM,0BAA0B,CAC9B,WACA,0BACA,iBAC0D;AAC1D,SAAO,yBAAyB,IAAI,CAAC,CAAC,SAAS,QAAQ,MAAM,MAAM;AACjE,QAAI,WAA0B;AAC9B,QAAI;AAEF,iBAAW,aAAa,KAAK,IAAI,QAAQ,QAAQ,OAAO;AAAA,IAC1D,SAAS,OAAO;AACd,kBAAI;AAAA,QACF,wDAAwD,MAAM,YAAY,MAAM,aAAa,OAAO,QAAQ,SAAS;AAAA,QACrH,EAAE,MAAM;AAAA,MACV;AAAA,IACF;AAEA,UAAM,eAAe,CAAC,YAA+D;AACnF,YAAM,WAAW,QAAQ,CAAC;AAC1B,UAAI,CAAC,UAAU;AACb,eAAO,CAAC,SAAS,QAAQ,QAAQ,EAAE;AAAA,MACrC;AAEA,YAAM,cAAU;AAAA,QACd;AAAA,QACA;AAAA,QACA,4CAA4C,MAAM,YAAY,MAAM,aAAa,OAAO,QAAQ,SAAS;AAAA,MAC3G;AACA,aAAO,CAAC,SAAS,QAAQ,QAAQ,WAAW,EAAE;AAAA,IAChD;AAEA,WAAO;AAAA,MACL,WAAW,CAAC,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,IAAM,0BAA0B,OAC9B,WACA,WACA,aACA,6BAC2D;AAC3D,MAAI,CAAC,yBAAyB,QAAQ;AACpC,WAAO,oBAAI,IAA8C;AAAA,EAC3D;AAEA,QAAM,eAAe,MAAM,6BAA6B,WAAW,WAAW;AAC9E,MAAI,CAAC,cAAc;AAEjB,UAAM,SAAS,oBAAI,IAA8C;AACjE,eAAW,CAAC,SAAS,QAAQ,MAAM,KAAK,0BAA0B;AAChE,UAAI,CAAC,OAAO,IAAI,OAAO,EAAG,QAAO,IAAI,SAAS,oBAAI,IAAI,CAAC;AACvD,YAAM,aAAa,OAAO,IAAI,OAAO;AACrC,UAAI,CAAC,WAAW,IAAI,MAAM,EAAG,YAAW,IAAI,QAAQ,oBAAI,IAAI,CAAC;AAC7D,iBAAW,IAAI,MAAM,EAAG,IAAI,QAAQ,EAAE;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AAEA,QAAM,UAAU,wBAAwB,WAAW,0BAA0B,YAAY;AAEzF,MAAI;AACF,UAAM,UAAU,MAAM,kBAAkB,WAAW,WAAW,OAAO;AAErE,UAAM,SAAS,oBAAI,IAA8C;AACjE,eAAW,CAAC,SAAS,QAAQ,QAAQ,OAAO,KAAK,SAAS;AACxD,UAAI,CAAC,OAAO,IAAI,OAAO,EAAG,QAAO,IAAI,SAAS,oBAAI,IAAI,CAAC;AACvD,YAAM,aAAa,OAAO,IAAI,OAAO;AACrC,UAAI,CAAC,WAAW,IAAI,MAAM,EAAG,YAAW,IAAI,QAAQ,oBAAI,IAAI,CAAC;AAC7D,iBAAW,IAAI,MAAM,EAAG,IAAI,QAAQ,OAAO;AAAA,IAC7C;AACA,WAAO;AAAA,EACT,SAAS,OAAO;AACd,gBAAI,KAAK,kEAAkE,SAAS,IAAI;AAAA,MACtF;AAAA,IACF,CAAC;AAED,UAAM,SAAS,oBAAI,IAA8C;AACjE,eAAW,CAAC,SAAS,QAAQ,MAAM,KAAK,0BAA0B;AAChE,UAAI,CAAC,OAAO,IAAI,OAAO,EAAG,QAAO,IAAI,SAAS,oBAAI,IAAI,CAAC;AACvD,YAAM,aAAa,OAAO,IAAI,OAAO;AACrC,UAAI,CAAC,WAAW,IAAI,MAAM,EAAG,YAAW,IAAI,QAAQ,oBAAI,IAAI,CAAC;AAC7D,iBAAW,IAAI,MAAM,EAAG,IAAI,QAAQ,EAAE;AAAA,IACxC;AACA,WAAO;AAAA,EACT;AACF;;;AEnfA,IAAAC,8BAMO;AACP,IAAAC,gBAAsD;AACtD,IAAAC,eAAyB;AACzB,IAAAC,qBAA0B;AAU1B,IAAM,uBAA+C;AAAA,EACnD,aAAa;AAAA,EACb,qBAAqB;AACvB;AAEO,IAAMC,eAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,kBAAkB;AACxB,MAAI,CAAC,iBAAiB,KAAM,QAAO,CAAC;AAEpC,QAAM,CAAC,uBAAuB,YAAY,IAAI,MAAM,QAAQ,IAAI;AAAA,IAC9D,2BAA2B,WAAW,gBAAgB,MAAM,SAAS;AAAA,IACrE;AAAA,MACE;AAAA,MACA;AAAA,MACA,gBAAgB;AAAA,MAChB;AAAA,MACA;AAAA,MACA,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AAED,SAAO,aACJ,OAAO,qBAAQ,EACf,IAAI,CAAC,SAAuB;AAC3B,UAAM,SAAS,OAAO,KAAK,CAAC,MAAM,EAAE,WAAW,KAAK,MAAM;AAE1D,QAAI,SAAS,IAAI,YAAY,EAAE,OAAO,WAAW,KAAK,KAAK,YAAY,CAAC;AACxE,UAAM,aACJ,KAAK,iBAAiB,aAAa,OAAO,MACzC,KAAK,WAAW,IAAI,SAAS,UAAU,KAAK,MAAM;AACrD,UAAM,OAAO,KAAK,KAAK,MAAM,MAAM,UAAU,IAAI,MAAM;AAGvD,QAAI,KAAK,WAAW,KAAK,qBAAqB,SAAS;AACrD,eAAS,qBAAqB,SAAS;AAGzC,UAAM,iBAAiB,sBAAsB,KAAK,MAAM,KAAK;AAE7D,UAAM,QAAsB;AAAA,MAC1B,QAAI,4CAAe,WAAW,KAAK,MAAM;AAAA,MACzC,MAAMC;AAAA,MACN,UAAUC;AAAA,MACV;AAAA,MACA,QAAQ,KAAK;AAAA,MACb,WAAW;AAAA,MACX;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,WAAO,OAAO,OAAO,CAAC,GAAG,OAAO,MAAM;AAAA,EACxC,CAAC,EAEA,OAAO,CAAC,MAAM;AACb,UAAM,SAAS,+CAAmB,UAAU,CAAC;AAC7C,WAAO,OAAO;AAAA,EAChB,CAAC;AACL;AAEA,IAAM,6BAA6B,OACjC,WACA,UACA,cACG;AACH,QAAM,EAAE,QAAQ,QAAI,gCAAiB,QAAQ;AAC7C,QAAM,sBAAsB,QAAQ,aAAa,mBAAmB,gBAAgB;AAEpF,QAAM,qBAAqB,MAAM,UAAU,KAAsB,WAAW,iBAAiB;AAAA,QAC3F,mCAAoB,mBAAmB,gBAAgB;AAAA,EACzD,CAAC;AAED,QAAM,wBAAwB,MAAM,UAAU;AAAA,IAC5C;AAAA,IACA;AAAA,IACA,CAAC,kBAAkB;AAAA,EACrB;AAEA,QAAM,wBAAwB,sBAAsB,SAAS,sBAAsB,CAAC,EAAE,UAAU,CAAC;AAEjG,aAAO;AAAA,IACL,sBAAsB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC1C,YAAM,CAAC,MAAM,IAAI,oBAAoB,KAAK,IAAI,GAAG;AACjD,YAAM,iBAAiB,oBAAoB,MAAM,IAAI,KAAK;AAC1D,aAAO,CAAC,QAAQ,cAAc;AAAA,IAChC,CAAC;AAAA,EACH;AACF;;;ACnHA,IAAAC,8BAA2D;AAC3D,IAAAC,gBAAkE;AAO3D,IAAMC,mBAAyE,CAAC;AAAA,EACrF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAASC;AACf,QAAM,UAAU;AAEhB,QAAM,gBAAgB,iBAA2C,aAAa,UAAU,SAAS;AACjG,MAAI,gBAAgB,cAAc;AAChC,UAAM,IAAI;AAAA,MACR,kCAAkC,WAAW,kBAAkB,cAAc,YAAY;AAAA,IAC3F;AAEF,QAAM,KAAK,qBAAqB,EAAE,QAAQ,SAAS,YAAY,CAAC;AAEhE,QAAM,EAAE,gBAAgB,QAAI,gCAAiB,WAAW;AAExD,MAAI,gBAAgB,UAAU;AAC5B,UAAM,IAAI;AAAA,MACR,iCAAiC,gBAAgB,OAAO;AAAA,IAC1D;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,MAAM,QAAQ,WAAW;AAAA,IACzB,OAAO;AAAA,EACT;AACF;AAEA,IAAM,UAAU,CAAC,gBAAqD;AACpE,QAAM,EAAE,UAAU,gBAAgB,QAAI,gCAAiB,WAAW;AAElE,QAAM,cAAc,gBAAgB,QAAQ,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,iBAAiB;AACzF,MAAI,CAAC,YAAa,QAAO;AAEzB;AAAA,IACE;AAAA,IACA,CAAC,EAAE,QAAQ,mBAAmB,OAAO,CAAC,kBAAkB,iBAAiB,aAAa,EAAE,CAAC;AAAA,IACzF;AAAA,MACE;AAAA,QACE,YAAY;AAAA,QACZ,SAAS,CAAC,6BAA6B;AAAA,MACzC;AAAA,MACA;AAAA,QACE,YAAY;AAAA,QACZ,SAAS,CAAC,sBAAsB;AAAA,MAClC;AAAA,IACF;AAAA,EACF;AAEA,aAAO,8BAAe,QAAQ;AAChC;;;AChEA,IAAAC,gBAA2B;AAC3B,IAAAC,8BAAmD;AACnD,IAAAC,gBAAiC;AACjC,0BAAuB;AAKhB,IAAMC,uBAAiF,CAAC;AAAA,EAC7F,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,KAAC,2CAAc,OAAOC,YAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,YAAW,GAAG;AAEnE,QAAM,EAAE,QAAQ,UAAU,OAAO,QAAI,iDAAoB,MAAM,EAAE;AACjE,MAAI,CAAC,OAAQ,OAAM,IAAI,MAAM,gBAAgB;AAE7C,QAAM,EAAE,QAAQ,QAAI,gCAAiB,WAAW;AAChD,QAAM,EAAE,OAAO,SAAS,IAAI,QAAQ,UAAU,mBAAmB,gBAAgB;AAEjF,QAAM,OAAO,MAAM,IAAI;AAAA,IACrB,eAAe;AAAA,IACf;AAAA,IACA,qBAAqB;AAAA,IACrB,oBAAoB;AAAA,IACpB,cAAc;AAAA,EAChB,CAAC;AAED,QAAM,WAAW,2BAAO,cAAU,0BAAW,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE9E,SAAO;AAAA,IACL,SAASD;AAAA,IACT,QAAQ,SAAS,MAAM;AAAA,EACzB;AACF;;;ACtCA,IAAAE,qBAAwB;AACxB,IAAAC,eAAqD;AAOrD,IAAMC,yBAAwB;AAEvB,IAAMC,qBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,iBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,SAAO,IAAI,wBAAW,CAAC,eAAe;AACpC,UAAM,kBAAkB,IAAI,gBAAgB;AAI5C,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,YAAI,gBAAgB,OAAO,QAAS;AAEpC,cAAM,WAAW,MAAMC,eAAc;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,gBAAgB,OAAO,QAAS;AAEpC,mBAAW,KAAK,QAAQ;AAExB,mBAAW,MAAMF,sBAAqB;AAAA,MACxC,SAAS,OAAO;AACd,oBAAI,MAAM,SAAS;AAAA,UACjB,QAAQG;AAAA,UACR;AAAA,UACA;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,QACF,CAAC;AACD,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,SAAK;AAEL,WAAO,MAAM;AACX,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC,EAAE,SAAK,mCAAqB,0BAAO,CAAC;AACvC;;;ACjDO,IAAM,uBAAwE;AAAA,EACnF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;ACfA,IAAAC,8BAAmC;AACnC,IAAAC,aAAc;AAKP,IAAM,2BAA2B,WAAAC,QAAE,aAAa;AAAA,EACrD,QAAQ,+CAAmB,MAAM;AAAA,EACjC,GAAG,sBAAsB;AAC3B,CAAC;;;AX2BM,SAAS,8BACd,OAIQ;AACR,MAAI,OAAO,UAAU,SAAU,QAAO,OAAO,KAAK;AAClD,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,SAAQ,CAAC,KAAK;AAEzC,SAAO,MACJ,OAAO,CAAC,SAAS,KAAK,0BAA0B,IAAI,EACpD,IAAI,CAAC,SAAS,KAAK,OAAO,MAAM,EAChC,OAAO,CAAC,KAAK,SAAS,qBAAQ,IAAI,KAAK,IAAI,GAAG,EAAE;AACrD;AAEO,SAAS,2BACd,OAC6B;AAC7B,MAAI,OAAO,UAAU,SAAU,QAAO,CAAC;AACvC,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,SAAQ,CAAC,KAAK;AAEzC,SAAO,MAAM,OAAO,CAAC,SAAS,KAAK,qBAAqB;AAC1D;AAEO,SAAS,0BACd,OAGQ;AACR,MAAI,CAAC,MAAO,QAAO;AACnB,MAAI,CAAC,MAAM,QAAQ,KAAK,EAAG,SAAQ,CAAC,KAAK;AAEzC,SAAO,MACJ,OAAO,CAACC,WAAUA,OAAM,cAAc,EACtC,IAAI,CAACA,WAAUA,OAAM,OAAO,MAAM,EAClC,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE;AAC/B;AAoBO,IAAM,WAAN,MAAM,UAAS;AAAA;AAAA;AAAA;AAAA,EAKpB,YAA4B,CAAC;AAAA;AAAA;AAAA;AAAA,EAM7B,YACE,UACA,SACA;AAGA,QAAI,oBAAoB,UAAU,QAAO,IAAI,UAAS,SAAS,MAAM,OAAO;AAI5E,QAAI,oBAAoB,QAAS,QAAO,IAAI,UAAS,CAAC,QAAQ,GAAG,OAAO;AAIxE,QAAI,CAAC,MAAM,QAAQ,QAAQ,EAAG,QAAO,IAAI,UAAS,OAAO,OAAO,QAAQ,GAAG,OAAO;AAIlF,QAAI,SAAS,WAAW,EAAG,QAAO;AAGlC,QAAI,KAAC,wBAAU,UAAU,OAAO;AAE9B,aAAO,IAAI;AAAA,QACT,SAAS,IAAI,CAAC,YAAY,IAAI,QAAQ,OAAO,CAAC;AAAA,QAC9C;AAAA,MACF;AAGF,SAAK,YAAY;AACjB,QAAI,YAAY,OAAW,MAAK,QAAQ,OAAO;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,MACP,OAAO;AAAA,IACL,KAAK,UACF,IAAI,CAAC,YAAY;AAChB,UAAI;AACF,eAAO,CAAC,QAAQ,IAAI,QAAQ,OAAO,CAAC;AAAA,MACtC,SAAS,OAAO;AACd,oBAAI,MAAM,qCAAqC,OAAO,EAAE,IAAI,QAAQ,IAAI,QAAQ,CAAC;AACjF,eAAO;AAAA,MACT;AAAA,IACF,CAAC,EACA,OAAO,MAAM,OAAO;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaF,CAAC,OAAO,QAAQ,IAAI;AAAA;AAAA,IAElB,KAAK,UAAU,OAAO,QAAQ,EAAE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOlC,UAAU,CAAC,YAAuB;AAChC,SAAK,UAAU,IAAI,CAAC,YAAY,QAAQ,QAAQ,OAAO,CAAC;AAAA,EAC1D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,CAAC,OAA+B,KAAK,UAAU,KAAK,CAAC,YAAY,QAAQ,OAAO,EAAE,KAAK;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQ7F,OAAO,CAAC,UAA+D;AAErE,UAAM,aAAmC,MAAM,QAAQ,KAAK,IAAI,QAAQ,CAAC,KAAK;AAC9E,UAAM,YAAY,WAAW;AAAA,MAAI,CAACC,WAChC,OAAOA,WAAU,aAAaA,SAAQ,OAAO,QAAQA,MAAK;AAAA,IAC5D;AAGA,UAAMC,UAAS,CAAC,YACd,UAAU;AAAA,MAAK,CAACD,WACd,OAAOA,WAAU,aACbA,OAAM,OAAO,IACbA,OAAM,MAAM,CAAC,CAAC,KAAK,KAAK,MAAM,QAAQ,GAA+B,MAAM,KAAK;AAAA,IACtF;AAGF,WAAO,IAAI,UAAS,CAAC,GAAG,IAAI,EAAE,OAAOC,OAAM,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,qBAAqB,MAAgB,IAAI,UAAS,CAAC,GAAG,IAAI,EAAE,OAAO,kBAAkB,CAAC;AAAA;AAAA;AAAA;AAAA,EAKtF,oBAAoB,CAClB,MASA,aACa;AACb,UAAMA,UAAS,CAAC,aAAsB,QAAQ,IAAI,EAAE,KAAK,QAAQ,KAAK,KAAK;AAC3E,WAAO,KAAK,KAAKA,OAAM;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,MAAM,CAAC,aAA2C;AAEhD,QAAI,oBAAoB,QAAS,QAAO,KAAK,IAAI,IAAI,UAAS,QAAQ,CAAC;AAGvE,UAAM,iBAAiB,OAAO;AAAA,MAC5B,KAAK,UAAU,IAAI,CAAC,YAAY,CAAC,QAAQ,IAAI,OAAO,CAAC;AAAA,IACvD;AAGA,aAAS,KAAK,QAAQ,CAAC,YAAa,eAAe,QAAQ,EAAE,IAAI,OAAQ;AAGzE,WAAO,IAAI,UAAS,OAAO,OAAO,cAAc,CAAC;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,SAAS,CAAC,QAAqC;AAE7C,QAAI,CAAC,MAAM,QAAQ,GAAG,EAAG,QAAO,KAAK,OAAO,CAAC,GAAG,CAAC;AAGjD,WAAO,IAAI,UAAS,KAAK,UAAU,OAAO,CAAC,YAAY,CAAC,IAAI,SAAS,QAAQ,EAAE,CAAC,CAAC;AAAA,EACnF;AAAA;AAAA,EAIA,IAAI,OAAO;AACT,WAAO,CAAC,GAAG,IAAI;AAAA,EACjB;AAAA;AAAA,EAGA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,QAAQ;AACV,WAAO,CAAC,GAAG,IAAI,EAAE;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,IAAI,MAAM;AACR,WAAO,IAAI,qBAAqB,IAAI;AAAA,EACtC;AACF;AAEO,IAAM,eAAe,CAAC,YAAmD;AAC9E,QAAM,EAAE,SAAS,QAAQ,IAAI;AAC7B,SAAO,CAAC,SAAS,OAAO,EAAE,KAAK,IAAI;AACrC;AAKO,IAAM,UAAN,MAAc;AAAA;AAAA;AAAA;AAAA;AAAA,EAMV;AAAA,EACA;AAAA,EAET,MAAwB;AAAA;AAAA;AAAA;AAAA,EAMxB,YAAY,SAAiC,SAAqB;AAChE,SAAK,WAAW;AAChB,SAAK,eAAe,IAAI,mBAAmB,KAAK,QAAQ;AACxD,QAAI,YAAY,OAAW,MAAK,QAAQ,OAAO;AAAA,EACjD;AAAA,EAEA,SAAS,MAAmB,KAAK;AAAA,EAEjC,WAAW,CAAC,WAA0B,KAAK,SAAS,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAe/D,UAAU,CAAC,YAAwB;AACjC,QAAI,YAAY,OAAW,MAAK,MAAM;AAAA,EACxC;AAAA,EAEA,UAAU,CAAC,YACT,IAAI;AAAA,QACF,uBAAS,OAAO,IAAI,QAAQ,SAAS,IAAI;AAAA,IACzC,KAAK,YAAY;AAAA,IACjB,KAAK;AAAA,EACP;AAAA;AAAA;AAAA;AAAA,EAMF,IAAI,KAAa;AACf,WAAO,aAAa,KAAK,QAAQ;AAAA,EACnC;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,YAAY;AACd,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,KAAK,WAAW,KAAK,SAAS,KAAK;AAAA,EACjD;AAAA,EAEA,IAAI,UAAU;AACZ,WAAO,KAAK,SAAS;AAAA,EACvB;AAAA,EACA,IAAI,QAAQ;AACV,WAAO,KAAK,KAAK,SAAS,KAAK,OAAO,KAAK;AAAA,EAC7C;AAAA,EACA,IAAI,WAAW;AACb,WAAO,KAAK,OAAO,YAAY;AAAA,EACjC;AAAA,EACA,IAAI,QAA2B;AAQ7B,QAAI,KAAK,SAAS,eAAe,KAAK,KAAK,OAAO,SAAS,iBAAiB;AAC1E,YAAM,eAAW,6CAAgB,KAAK,WAAW,KAAK,MAAM,aAAa;AACzE,YAAM,eAAW,6CAAgB,KAAK,WAAW,KAAK,MAAM,aAAa;AAEzE,YAAM,WAAW,KAAK,MAAM;AAC5B,YAAM,YAAY,KAAK,MAAM;AAC7B,YAAM,YAAY,KAAK,MAAM;AAE7B,YAAM,SAAS,KAAK,KAAK,aAAa,QAAQ;AAC9C,YAAM,SAAS,KAAK,KAAK,aAAa,QAAQ;AAE9C,UAAI,WAAW,UAAa,WAAW,OAAW,QAAO;AAEzD,YAAM,QAAQ,KAAK,aAAa,IAAI,OAAO;AAC3C,YAAM,SAAS,MAAM,QAAQ,KAAK,IAAI,QAAQ,UAAU,SAAY,CAAC,KAAK,IAAI,CAAC;AAC/E,YAAM,cAAc,OAAO,KAAK,CAACF,WAAUA,OAAM,UAAU,aAAa,GAAG,UAAU;AACrF,YAAM,WAAW,OAAO,KAAK,CAACA,WAAUA,OAAM,UAAU,UAAU,GAAG,UAAU;AAC/E,YAAM,WAAW,OAAO,KAAK,CAACA,WAAUA,OAAM,UAAU,UAAU,GAAG,UAAU;AAE/E,YAAM,wBAAoB,kBAAAG,SAAU,WAAW,EAAE,MAAM,OAAO,KAAK,SAAS;AAC5E,YAAM,qBAAiB,kBAAAA,SAAU,QAAQ,EAAE,MAAM,OAAO,KAAK,UAAU;AACvE,YAAM,qBAAiB,kBAAAA,SAAU,QAAQ,EAAE,MAAM,OAAO,KAAK,UAAU;AAEvE,YAAM,mBAAmB,IAAI,IAAI,OAAO,KAAK,MAAM,CAAwB;AAC3E,YAAM,mBAAmB,IAAI,IAAI,OAAO,KAAK,MAAM,CAAwB;AAG3E,YAAM,aAAa,CAAC,GAAG,gBAAgB,EAAE,OAAO,CAAC,MAAM,iBAAiB,IAAI,CAAC,CAAC;AAE9E,YAAM,mBAAmB,WAAW;AAAA,QAClC,CAAC,aACC;AAAA,UACE;AAAA;AAAA,UAEA,kBAAAA,QAAU;AAAA,YACR,eAAe,MAAM,OAAO,QAAQ,GAAG,SAAS,CAAC;AAAA,YACjD,eAAe,MAAM,OAAO,QAAQ,GAAG,SAAS,CAAC;AAAA,UACnD;AAAA,QACF;AAAA,MACJ;AAEA,YAAM,mBAAe,mCAAc;AACnC,uBAAiB,QAAQ,CAAC,CAAC,UAAU,GAAG,MAAM;AAE5C,YAAI,CAAC,kBAAkB,GAAG,CAAC;AACzB,uBAAa,QAAQ,IAAI,EAAE,OAAO,IAAI,IAAI,iBAAiB,EAAE,SAAS,EAAE;AAAA,MAC5E,CAAC;AAED,aAAO;AAAA,IACT;AAGA,QAAI,KAAK,OAAO,SAAS,oBAAoB,CAAC,KAAK,MAAM,aAAa;AACpE,UAAI,CAAC,KAAK,KAAK,WAAY,QAAO;AAElC,YAAM,WAAW,KAAK,aAAa,IAAI,MAAM;AAC7C,UAAI,CAAC,SAAS,OAAQ,QAAO;AAC7B,YAAM,cAAc,SAAS,CAAC,EAAE;AAChC,UAAI,CAAC,aAAa,iBAAkB,QAAO;AAE3C,aAAO,kBAAkB,KAAK,OAAO,KAAK,IAAI,YAAY,YAAY,gBAAgB;AAAA,IACxF;AAGA,WAAO,KAAK,KAAK,aAAa,KAAK,OAAO,KAAK;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,SACN,WACyD;AACzD,WAAO,KAAK,YAAY,SAAS,EAAE,IAAI,CAAC,WAAW;AAAA,MACjD,GAAG;AAAA,MACH,QAAQ,KAAK,QAAQ,MAAM,MAAM;AAAA,IACnC,EAAE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOQ,YAAY,WAA+D;AACjF,WAAO,KAAK,aAAa,IAAI,SAAS;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,SAAS,WAA+B;AAC9C,WAAO,CAAC,UAAiD,KAAK,aAAa,IAAI,WAAW,KAAK;AAAA,EACjG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,QAAQ;AACV,UAAM,QAAQ,KAAK,SAAS,OAAO;AAInC,UAAM,uBAAuB,KAAK,MAAM;AAAA,MACtC,CAAC,SAAS,KAAK,WAAW,4BAA4B,KAAK,UAAU;AAAA,IACvE,IACI,KACA,KAAK,SAAS,IAAI,CAAC,EAAE,OAAO,MAAM,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE;AAE/E,WAAO,KAAK;AAAA,MACV,KAAK,KAAK,SACR,KAAK,SAAS,SACd,uBACA,0BAA0B,KAAK;AAAA,IACnC;AAAA,EACF;AAAA;AAAA,EAEA,IAAI,OAAO;AAET,QAAI,WAAW,KAAK,YAAY,KAAK,SAAS,MAAO,QAAO,KAAK,QAAQ,KAAK,SAAS,KAAK;AAG5F,UAAM,aAAa,KAAK,SAAS,MAAM;AACvC,UAAM,YAAY,WAAW,IAAI,CAAC,EAAE,OAAO,MAAM,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE;AAC1F,WAAO,KAAK,QAAQ,SAAS;AAAA,EAC/B;AAAA;AAAA,EAEA,IAAI,WAAW;AACb,UAAM,iBAAiB,KAAK,SAAS,UAAU;AAC/C,QAAI,eAAe,WAAW,EAAG,QAAO,KAAK,QAAQ,EAAE;AAEvD,WAAO,KAAK;AAAA,MACV,eAAe,IAAI,CAAC,EAAE,OAAO,MAAM,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE;AAAA,IAC9E;AAAA,EACF;AAAA,EACA,IAAI,WAAW;AACb,WAAO,KAAK,SAAS,UAAU;AAAA,EACjC;AAAA;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,MACV,KAAK,MAAM,IAAI,CAAC,EAAE,OAAO,MAAM,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,qBAAQ,IAAI,GAAG,CAAC,GAAG,EAAE;AAAA,IACtF;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,SAAS,QAAQ;AAAA,EAC/B;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,SAAS,SAAS;AAAA,EAChC;AAAA;AAAA,EAGA,IAAI,QAAQ;AACV,UAAM,QAAQ,KAAK,YAAY,OAAO;AACtC,QAAI,MAAM,SAAS,EAAG,QAAO;AAC7B,WAAO;AAAA,EACT;AAAA;AAAA,EAGA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAEA,IAAI,eAAe;AAQjB,UAAM,6BAA6B,MAAM;AAEvC,UAAI,KAAK,MAAM,WAAW,EAAG,QAAO,KAAK;AAGzC,YAAM,gBAAgB,8BAA8B,KAAK,KAAK;AAG9D,aAAO,KAAK,QAAQ,qBAAQ,IAAI,KAAK,KAAK,SAAS,eAAe,EAAE,CAAC;AAAA,IACvE;AAaA,UAAM,6BAA6B,MAAM;AAEvC,UAAI,KAAK,MAAM,WAAW,EAAG,QAAO,KAAK;AAIzC,YAAM,oBAAoB,qBAAQ;AAAA,QAChC,8BAA8B,KAAK,KAAK,IAAI,KAAK,SAAS;AAAA,QAC1D;AAAA,MACF;AAGA,aAAO,KAAK,QAAQ,qBAAQ,IAAI,KAAK,KAAK,SAAS,mBAAmB,EAAE,CAAC;AAAA,IAC3E;AAEA,QAAI,KAAK,SAAS,iCAAkC,QAAO,2BAA2B;AACtF,WAAO,2BAA2B;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMA,IAAI,cAAc;AAChB,UAAM,iBAAiB,MAAM,KAAK,OAAO,SAAS,KAAK,SAAS;AAChE,UAAM,iBAAiB,MAAM,qBAAQ,IAAI,KAAK,OAAO,QAAQ,KAAK,SAAS,MAAM;AACjF,UAAM,kBAAkB,KAAK,SAAS,mCAClC,eAAe,IACf,eAAe;AAInB,UAAM,uBAAuB,KAAK,MAAM;AAAA,MACtC,CAAC,SAAS,KAAK,WAAW,4BAA4B,KAAK,UAAU;AAAA,IACvE,IACI,KACA,KAAK,SAAS,IAAI,CAAC,EAAE,OAAO,MAAM,OAAO,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE;AAE/E,WAAO,KAAK,QAAQ,kBAAkB,oBAAoB;AAAA,EAC5D;AAAA;AAAA,EAGA,IAAI,aAAa;AAEf,QAAI,KAAK,MAAM,WAAW,EAAG,QAAO,KAAK;AAGzC,UAAM,gBAAgB,2BAA2B,KAAK,OAAO,OAAO,SAAS,CAAC,EAC3E,IAAI,CAAC,SAAS,OAAO,KAAK,MAAM,CAAC,EACjC,OAAO,CAAC,KAAK,SAAS,qBAAQ,IAAI,KAAK,IAAI,GAAG,EAAE;AAGnD,WAAO,KAAK,QAAQ,qBAAQ,IAAI,KAAK,KAAK,SAAS,eAAe,EAAE,CAAC;AAAA,EACvE;AACF;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAC9B;AAAA,EAEA,YAAY,SAAsB;AAChC,SAAK,WAAW;AAAA,EAClB;AAAA,EAEA,IAAI,WAA+B;AACjC,QAAI,YAAY,KAAK,YAAY,KAAK,SAAS;AAC7C,aAAO,KAAK,SAAS,OAAO,OAAO,CAAC,EAAE,KAAK,MAAM,SAAS,SAAS;AACrE,WAAO,CAAC;AAAA,EACV;AAAA,EAEA,IAAI,WAA+B,QAA+C;AAChF,QAAI,YAAY,KAAK,YAAY,KAAK,SAAS;AAC7C,WAAK,SAAS,OAAO,KAAK,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC;AAAA,EAC5D;AACF;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE,QACA,UACA,YACA;AACA,SAAK,cAAU,uBAAS,MAAM,IAAI,OAAO,SAAS,IAAK,UAAU;AACjE,SAAK,YAAY,YAAY;AAC7B,SAAK,cAAc,cAAc;AAAA,EACnC;AAAA,EAEA,SAAS,MAAM,KAAK;AAAA,EAEpB,IAAI,SAAS;AACX,WAAO,OAAO,KAAK,OAAO;AAAA,EAC5B;AAAA,EAEA,IAAI,SAAS;AACX,eAAO,6BAAe,KAAK,SAAS,KAAK,SAAS;AAAA,EACpD;AAAA,EAEA,KAAK,UAA6B;AAChC,QAAI,CAAC,KAAK,YAAa,QAAO;AAE9B,UAAM,QAAQ,KAAK,YAAY,QAAQ;AACvC,QAAI,CAAC,MAAO,QAAO;AAEnB,WAAO,WAAW,KAAK,MAAM,IAAI,MAAM;AAAA,EACzC;AACF;AAEO,IAAM,6BAAN,MAAiC;AAAA,EACtC;AAAA,EAEA,YAAY,UAAoB;AAC9B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,OAAO,CACL,iBAGG;AAEH,UAAM,SAAS,CAAC,YAAqB,QAAQ,YAAY,EAAE,UAAU;AAErE,WAAO,KAAK,UAAU,mBAAmB,EAAE,KAAK;AAAA;AAAA,MAE9C,CAAC,OAAO,YAAY,QAAQ,OAAO,OAAO;AAAA;AAAA,MAE1C;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACV,WAAO,KAAK,KAAK,OAAO;AAAA,EAC1B;AAAA;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,KAAK,UAAU;AAAA,EAC7B;AAAA;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,KAAK,QAAQ;AAAA,EAC3B;AAAA;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,KAAK,cAAc;AAAA,EACjC;AAAA;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,KAAK,aAAa;AAAA,EAChC;AAAA;AAAA,EAGA,IAAI,aAAa;AACf,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AACF;AAEO,IAAM,2BAAN,MAA+B;AAAA,EACpC;AAAA,EACA;AAAA,EAEA,YAAY,UAAoB,UAA6B;AAC3D,SAAK,YAAY;AACjB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,OAAO,CACL,iBAGG;AAEH,UAAM,OAAO,CAAC,YAAqB,QAAQ,YAAY,EAAE,KAAK,KAAK,SAAS,KAAK;AAEjF,WAAO,KAAK,UAAU,mBAAmB,EAAE,KAAK;AAAA;AAAA,MAE9C,CAAC,OAAO,YAAY,QAAQ,KAAK,OAAO;AAAA;AAAA,MAExC;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACV,WAAO,KAAK,KAAK,OAAO;AAAA,EAC1B;AAAA;AAAA,EAEA,IAAI,OAAO;AACT,WAAO,KAAK,KAAK,MAAM;AAAA,EACzB;AAAA;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,KAAK,UAAU;AAAA,EAC7B;AAAA;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK,KAAK,QAAQ;AAAA,EAC3B;AAAA;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAEA,IAAI,eAAe;AACjB,WAAO,KAAK,KAAK,cAAc;AAAA,EACjC;AAAA;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,KAAK,aAAa;AAAA,EAChC;AAAA;AAAA,EAEA,IAAI,aAAa;AACf,WAAO,KAAK,KAAK,YAAY;AAAA,EAC/B;AACF;AAEO,IAAM,uBAAN,MAA2B;AAAA,EAChC;AAAA,EAEA,YAAY,UAAoB;AAC9B,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,IAAI,SAAS;AACX,WAAO,IAAI,2BAA2B,KAAK,SAAS;AAAA,EACtD;AAAA,EAEA,KAAK,UAA6B;AAChC,WAAO,IAAI,yBAAyB,KAAK,WAAW,QAAQ;AAAA,EAC9D;AAAA,EAEA,UAAU,UAA6B;AACrC,WAAO,IAAI,2BAA2B,KAAK,WAAW,QAAQ;AAAA,EAChE;AACF;AAEO,IAAM,6BAAN,MAAiC;AAAA,EACtC;AAAA,EACA;AAAA,EAEA,YAAY,UAAoB,UAA6B;AAC3D,SAAK,YAAY;AACjB,SAAK,YAAY;AAAA,EACnB;AAAA,EAEA,aAAa,CACX,iBAGG;AACH,UAAM,SAAS,KAAK,UAAU,mBAAmB,EAAE,KAAK;AAAA;AAAA,MAEtD,CAAC,KAAK,YAAY;AAChB,cAAM,YAAY,QAAQ,QAAQ,KAAK,SAAS,GAAG;AACnD,YAAI,OAAO,cAAc,SAAU,QAAO;AAC1C,cAAM,OAAO,QAAQ,YAAY,EAAE,KAAK,KAAK,SAAS;AACtD,YAAI,CAAC,KAAM,QAAO;AAElB,eAAO;AAAA,UACL,eAAe,IAAI,gBAAgB,OAAO;AAAA,UAC1C,WAAW,IAAI,YAAY;AAAA,QAC7B;AAAA,MACF;AAAA;AAAA,MAEA,EAAE,eAAe,GAAG,WAAW,EAAE;AAAA,IACnC;AAEA,WAAO,OAAO,cAAc,IACxB,OACA;AAAA,MACE,MAAM,OAAO,gBAAgB;AAAA,MAC7B,OAAO,OAAO,gBAAgB,OAAO;AAAA,IACvC;AAAA,EACN;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO,KAAK,WAAW,OAAO;AAAA,EAChC;AAAA,EACA,IAAI,OAAO;AACT,WAAO,KAAK,WAAW,MAAM;AAAA,EAC/B;AAAA,EACA,IAAI,WAAW;AACb,WAAO,KAAK,WAAW,UAAU;AAAA,EACnC;AAAA,EACA,IAAI,SAAS;AACX,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EACA,IAAI,SAAS;AACX,WAAO,KAAK,WAAW,QAAQ;AAAA,EACjC;AAAA,EACA,IAAI,eAAe;AACjB,WAAO,KAAK,WAAW,cAAc;AAAA,EACvC;AAAA,EACA,IAAI,cAAc;AAChB,WAAO,KAAK,WAAW,aAAa;AAAA,EACtC;AAAA,EACA,IAAI,aAAa;AACf,WAAO,KAAK,WAAW,YAAY;AAAA,EACrC;AACF;AAEO,IAAM,qBAAqB,CAAC,SAAkB,IAAY,aAAwB;AACvF,QAAM,WAAW,QAAQ,OAAO;AAChC,SAAO,CAAC,YAAY,CAAC,SAAS,KAAK,CAAC,MAAM,EAAE,YAAY,QAAQ;AAClE;;;AYh2BO,IAAM,aAAa,CAAC,WAAoC;AAC7D,QAAM,YAAY,MAAM;AACtB,UAAM,OAAO,OAAO;AACpB,QAAI,CAAC,KAAM,QAAO;AAClB,QAAI,OAAO,SAAS,UAAW,QAAO,KAAK,QAAQ,SAAS,KAAK;AAEjE,WAAO;AAAA,EACT;AAEA,SAAO,CAAC,OAAO,OAAO,OAAO,MAAM,OAAO,QAAQ,UAAU,CAAC,EAAE,KAAK,IAAI;AAC1E;;;AC/EA,IAAAC,8BAA2D;AAC3D,IAAAC,iBAA+B;AAGxB,IAAM,uBAAuB,CAAC;AAAA,EACnC;AAAA,EACA;AAAA,EACA;AACF,UACE;AAAA,MACE,wBAAQ,IAAI,YAAY,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,WAAW,GAAG,gDAAoB,EAAE,CAAC;AAC9F,EAAE,MAAM,GAAG;;;AdHN,IAAMC,mBAAyE,CAAC;AAAA,EACrF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAASC;AACf,QAAM,UAAU;AAEhB,QAAM,gBAAgB,iBAA2C,aAAa,UAAU,SAAS;AACjG,MAAI,gBAAgB,cAAc;AAChC,UAAM,IAAI;AAAA,MACR,kCAAkC,WAAW,kBAAkB,cAAc,YAAY;AAAA,IAC3F;AAEF,QAAM,KAAK,qBAAqB,EAAE,QAAQ,SAAS,YAAY,CAAC;AAEhE,QAAM,EAAE,gBAAgB,QAAI,iCAAiB,WAAW;AAExD,MAAI,gBAAgB,UAAU;AAC5B,UAAM,IAAI;AAAA,MACR,iCAAiC,gBAAgB,OAAO;AAAA,IAC1D;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,MAAMC,SAAQ,WAAW;AAAA,IACzB,OAAO;AAAA,EACT;AACF;AAEA,IAAMA,WAAU,CAAC,gBAAqD;AACpE,QAAM,EAAE,UAAU,gBAAgB,QAAI,iCAAiB,WAAW;AAGlE,MAAI,CAAC,gBAAgB,iBAAiB,UAAU,CAAC,WAAW,SAAS,UAAU,CAAC,EAAG,QAAO;AAE1F,sCAAgB,UAAU,CAAC,EAAE,QAAQ,UAAU,OAAO,CAAC,WAAW,SAAS,UAAU,EAAE,CAAC,CAAC;AAEzF,aAAO,+BAAe,QAAQ;AAChC;;;AenDA,IAAAC,gBAA2B;AAC3B,IAAAC,8BAA8B;AAC9B,IAAAC,iBAAiC;AACjC,IAAAC,uBAAyC;AAKlC,IAAMC,uBAAiF,CAAC;AAAA,EAC7F,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,KAAC,2CAAc,OAAOC,YAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,YAAW,GAAG;AAEnE,QAAM,EAAE,QAAQ,QAAI,iCAAiB,WAAW;AAChD,QAAM,SAAS,kBAAkB,IAAI;AACrC,QAAM,EAAE,OAAO,SAAS,IAAI,QAAQ,UAAU,UAAU,MAAM;AAC9D,QAAM,OAAO,eAAe,QAAQ,MAAM,SAAS,IAAI,OAAO,KAAK;AACnE,QAAM,WAAW,4BAAO,cAAU,0BAAW,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE9E,SAAO;AAAA,IACL,SAASD;AAAA,IACT,QAAQ,SAAS,MAAM;AAAA,EACzB;AACF;AAEA,IAAM,oBAAoB,CAAC,SAA8B;AAEvD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,IAAM,iBAAiB,CACrB,QACA,SACA,IACA,OACA,cACe;AACf,MAAI;AACF,YAAQ,QAAQ;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AACH,eAAO,uBAAuB,SAAS,IAAI,OAAO,SAAS;AAAA,MAC7D,KAAK;AACH,eAAO,0BAA0B,SAAS,IAAI,SAAS;AAAA,IAC3D;AAAA,EACF,QAAQ;AACN,UAAM,IAAI,MAAM,yCAAyC,MAAM,KAAK,OAAO,KAAK,EAAE,KAAK,KAAK,EAAE;AAAA,EAChG;AACF;AAEA,IAAM,kBAAkB,CAAC,OAAuB,kBAAwC;AACtF,aAAW,WAAW,eAAe;AACnC,QAAI;AACF,aAAO,MAAM,IAAI,QAAQ,CAAC;AAAA,IAC5B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,kBAAkB;AACpC;AAGA,IAAM,yBAAyB,CAC7B,SACA,IACA,OACA,UACG;AACH,SAAO,gBAAgB,OAAO;AAAA,IAC5B,OAAO;AAAA,MACL,IAAI,OAAO,OAAO;AAAA;AAAA,MAClB,YAAQ,2BAAK,MAAM,EAAE;AAAA,MACrB,QAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,IACA,OAAO;AAAA,MACL,IAAI,OAAO,OAAO;AAAA;AAAA,MAClB,YAAQ,2BAAK,MAAM,EAAE;AAAA,MACrB,QAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,IACA,OAAO;AAAA,MACL,IAAI,OAAO,OAAO;AAAA;AAAA,MAClB,QAAQ;AAAA,MACR,QAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,EACF,CAAC;AACH;AAEA,IAAM,4BAA4B,CAAC,SAAiB,IAAY,UAA0B;AACxF,SAAO,gBAAgB,OAAO;AAAA,IAC5B,OAAO;AAAA,MACL,IAAI,OAAO,OAAO;AAAA;AAAA,MAClB,UAAM,2BAAK,MAAM,EAAE;AAAA,MACnB,YAAY;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACL,IAAI,OAAO,OAAO;AAAA;AAAA,MAClB,UAAM,2BAAK,MAAM,EAAE;AAAA,MACnB,YAAY;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACL,IAAI,OAAO,OAAO;AAAA;AAAA,MAClB,MAAM;AAAA,MACN,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACH;;;ACvHA,IAAAE,eAAwB;AAQjB,IAAMC,qBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,iBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,QAAM,UAAU,aAAa,WAAW,aAAa,YAAY;AAEjE,SAAO,iBAAiB,WAAW,WAAW,OAAO,EAAE;AAAA,QACrD,kBAAI,CAAC,cAAc;AAAA,MACjB,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,IACX,EAAE;AAAA,EACJ;AACF;;;AClBO,IAAM,yBAA0E;AAAA,EACrF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AChBA,IAAAC,8BAAqC;AACrC,IAAAC,cAAc;AAKP,IAAM,6BAA6B,YAAAC,QAAE,aAAa;AAAA,EACvD,SAAS,iDAAqB,MAAM;AAAA,EACpC,GAAG,sBAAsB;AAC3B,CAAC;;;ACTD,IAAAC,8BAA4C;AAIrC,IAAMC,eAAc,wDAA4B,MAAM,KAAK;AAC3D,IAAMC,YAAW,wDAA4B,MAAM,SAAS;;;ACJnE,IAAAC,iBAAuC;AACvC,IAAAC,eAAyB;AASlB,IAAMC,gBAAe,CAC1B,WACA,aACA,iBACkC;AAClC,QAAM,uBAAuB,0BAA0B,WAAW,cAAc;AAAA,IAC9E,SAAS,CAAC,iBAAiB,SAAS;AAAA,EACtC,CAAC;AAED,SAAO,YACJ,IAAI,CAAC,EAAE,OAAO,QAAQ,MAAqC;AAC1D,UAAM,aAAa,sBAAsB;AAEzC,UAAM,cAAc,CAAC,cAAsB;AACzC,UAAI;AACF,eAAO,YAAY,MAAM,UAAM,0BAAU,SAAS,GAAG,OAAO;AAAA,MAC9D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,WAAW,YAAY,MAAM,SAAS;AAE5C,QAAI,CAAC,UAAU;AACb,kBAAI;AAAA,QACF,gCAAgC,SAAS,kBAAkB,MAAM,SAAS,MAAM,OAAO;AAAA,MACzF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,CAAC,YAA6B;AAUjD,YAAM,cAAU;AAAA,QACd;AAAA,QACA,QAAQ,CAAC;AAAA,QACT,sDAAsD,SAAS;AAAA,MACjE,KAAK;AAAA,QACH,SAAS;AAAA,QACT,WAAW;AAAA,QACX,QAAQ,EAAE,MAAM,aAAa;AAAA,QAC7B,QAAQ,EAAE,MAAM,SAAS;AAAA,QACzB,OAAO;AAAA,MACT;AAEA,YAAM,WAAW,QAAQ,aAAa,SAAS,QAAQ,SAAS;AAChE,YAAM,UAAU,SAAS,WAAW,IAAI,SAAS;AAWjD,YAAM,OAAO;AACb,YAAM,SAAS,MAAM,YAAY,WAAW,SAAS;AAGrD,YAAM,gBAAgD;AAAA,QACpD,EAAE,MAAM,QAAQ,OAAO,QAAQ,QAAQ,KAAK,SAAS,EAAE;AAAA,QACvD,EAAE,MAAM,UAAU,OAAO,UAAU,QAAQ,OAAO,SAAS,EAAE;AAAA,MAC/D;AAEA,YAAM,UAAoB;AAAA,QACxB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AAAA,QACf,QAAQ;AAAA,MACV;AAEA,aAAO;AAAA,IACT;AAEA,WAAO;AAAA,MACL,WAAW,CAAC,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,qBAAQ;AACpB;;;AC/FO,IAAMC,iBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,MAAI,CAAC,cAAc,MAAM;AACvB,gBAAI,KAAK,yCAAyCC,YAAW,gBAAgB,SAAS,GAAG;AACzF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,gDAAgD;AAAA,MACnE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,WAAWA,cAAa;AACvC,gBAAI,KAAK,qCAAqC,aAAa,MAAM,OAAOA,YAAW,GAAG;AACtF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,+CAA+CA,YAAW,EAAE;AAAA,MAC/E,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,YAAY,WAAW;AACtC,gBAAI;AAAA,MACF,sCAAsC,aAAa,OAAO,OAAOA,YAAW,yBAAyB,SAAS;AAAA,IAChH;AACA,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,wCAAwC,SAAS,EAAE;AAAA,MACtE,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,UAAUC,cAAa,WAAW,aAAa,YAAY;AAEjE,QAAM,WAAW,MAAM,kBAAkB,WAAW,WAAW,OAAO;AAEtE,SAAO,YAAY;AAAA,IACjB,CAAC,KAAK,QAAQ;AACZ,YAAM,UAAU,SAAS;AAAA,QACvB,CAAC,MAAM,GAAG,YAAY,IAAI,WAAW,GAAG,YAAY,IAAI,MAAM;AAAA,MAChE;AACA,UAAI,QAAS,KAAI,QAAQ,KAAK,OAAO;AAAA;AAGnC,YAAI,QAAQ,KAAK;AAAA,UACf,SAAS,IAAI;AAAA,UACb;AAAA,UACA,SAAS,IAAI,MAAM;AAAA,UACnB,QAAQD;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,EAAE,MAAM,QAAQ,OAAO,QAAQ,QAAQ,IAAI;AAAA,YAC3C,EAAE,MAAM,UAAU,OAAO,UAAU,QAAQ,IAAI;AAAA,UACjD;AAAA,QACF,CAAC;AACH,aAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC5B;AACF;;;AChFA,IAAAE,8BAKO;AACP,IAAAC,iBAAqE;AACrE,IAAAC,qBAAoC;AAO7B,IAAMC,eAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,kBAAkB;AACxB,MAAI,CAAC,iBAAiB,KAAM,QAAO,CAAC;AAEpC,QAAM,EAAE,QAAQ,QAAI,iCAAiB,gBAAgB,IAAI;AACzD,QAAM,aAAa,QAAQ,aAAa,iBAAiB,OAAO;AAChE,QAAM,gBAAgB,QAAQ,aAAa,iBAAiB,UAAU;AAEtE,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtE,UAAU,KAAsB,WAAW,iBAAiB;AAAA,UAC1D,oCAAoB,iBAAiB,OAAO;AAAA,IAC9C,CAAC;AAAA,IACD,UAAU,KAAsB,WAAW,iBAAiB;AAAA,UAC1D,oCAAoB,iBAAiB,UAAU;AAAA,IACjD,CAAC;AAAA,EACH,CAAC;AAED,QAAM,CAAC,qBAAqB,sBAAsB,IAAI,MAAM,QAAQ,IAAI;AAAA,IACtE,UAAU,KAAyB,WAAW,wBAAwB,CAAC,mBAAmB,CAAC;AAAA,IAC3F,UAAU,KAAyB,WAAW,wBAAwB,CAAC,sBAAsB,CAAC;AAAA,EAChG,CAAC;AAID,QAAM,sBACJ,oBAAoB,CAAC,GAAG,WAAW,CAAC;AACtC,QAAM,yBACJ,uBAAuB,CAAC,GAAG,WAAW,CAAC;AAEzC,QAAM,uBAAmB;AAAA,IACvB,oBAAoB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AACxC,YAAM,CAAC,UAAU,IAAI,WAAW,KAAK,IAAI,GAAG;AAC5C,YAAM,gBAAY,8BAAc,UAAU;AAC1C,YAAM,QAAQ,WAAW,MAAM,IAAI,KAAK;AAIxC,aAAO,EAAE,WAAW,oBAAoB,MAAM,aAAa,cAAc,MAAM,cAAc;AAAA,IAC/F,CAAC;AAAA,IACD,CAAC,MAAM,EAAE;AAAA,EACX;AAEA,QAAM,0BAAsB;AAAA,IAC1B,uBAAuB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAC3C,YAAM,CAAC,UAAU,IAAI,cAAc,KAAK,IAAI,GAAG;AAC/C,YAAM,gBAAY,8BAAc,UAAU;AAC1C,YAAM,WAAW,cAAc,MAAM,IAAI,KAAK;AAO9C,aAAO;AAAA,QACL;AAAA,QACA,UAAU,SAAS;AAAA,QACnB,UAAU,SAAS;AAAA,QACnB,MAAM,SAAS,MAAM,OAAO;AAAA,QAC5B,QAAQ,SAAS,QAAQ,OAAO;AAAA,MAClC;AAAA,IACF,CAAC;AAAA,IACD,CAAC,MAAM,EAAE;AAAA,EACX;AAEA,QAAM,gBAAY,yBAAK,gBAAgB,EAAE;AAAA,IAAI,CAAC,kBAC5C,2BAAO,CAAC,GAAG,iBAAiB,SAAS,GAAG,oBAAoB,SAAS,KAAK,MAAS;AAAA,EACrF;AAEA,QAAM,6BAAyB,0BAAM,QAAQ,CAAC,MAAM,EAAE,SAAS;AAE/D,SACE,UACG;AAAA,IACC,CAAC,WAAkC;AAAA,MACjC,QAAI,oDAAuB,WAAW,MAAM,SAAS;AAAA,MACrD,MAAMC;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,WAAW,OAAO,MAAM,SAAS;AAAA,MACjC,cAAc,MAAM;AAAA,MACpB,UAAU,MAAM;AAAA,MAChB,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM,YAAY;AAAA,MAC5B,oBAAoB,OAAO,MAAM,kBAAkB;AAAA,MACnD,WAAW;AAAA,IACb;AAAA,EACF,EAEC,OAAO,CAAC,UAAU;AACjB,UAAM,cAAc,uBAAuB,MAAM,SAAS;AAC1D,WAAO,eAAe,MAAM;AAAA,EAC9B,CAAC,EAEA,IAAI,CAAC,UAAU;AACd,UAAM,cAAc,uBAAuB,MAAM,SAAS;AAC1D,WAAO,kBAAc,2BAAO,CAAC,GAAG,OAAO,WAAW,IAAI;AAAA,EACxD,CAAC,EAEA,OAAO,CAAC,MAAM;AACb,UAAM,SAAS,wDAA4B,UAAU,CAAC;AAGtD,WAAO,OAAO;AAAA,EAChB,CAAC;AAEP;;;AC7HA,IAAAC,8BAA2D;AAC3D,IAAAC,iBAAkE;AAO3D,IAAMC,mBAAyE,CAAC;AAAA,EACrF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAASC;AACf,QAAM,UAAU;AAEhB,QAAM,gBAAgB,iBAA2C,aAAa,UAAU,SAAS;AACjG,MAAI,gBAAgB,cAAc;AAChC,UAAM,IAAI;AAAA,MACR,kCAAkC,WAAW,kBAAkB,cAAc,YAAY;AAAA,IAC3F;AAEF,QAAM,KAAK,qBAAqB,EAAE,QAAQ,SAAS,YAAY,CAAC;AAEhE,QAAM,EAAE,gBAAgB,QAAI,iCAAiB,WAAW;AAExD,MAAI,gBAAgB,UAAU;AAC5B,UAAM,IAAI;AAAA,MACR,iCAAiC,gBAAgB,OAAO;AAAA,IAC1D;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,MAAMC,SAAQ,WAAW;AAAA,IACzB,OAAO;AAAA,EACT;AACF;AAEA,IAAMA,WAAU,CAAC,gBAAqD;AACpE,QAAM,EAAE,UAAU,gBAAgB,QAAI,iCAAiB,WAAW;AAGlE,MAAI,CAAC,gBAAgB,iBAAiB,iBAAiB,CAAC,WAAW,SAAS,UAAU,CAAC;AACrF,WAAO;AAET,sCAAgB,UAAU,CAAC,EAAE,QAAQ,iBAAiB,OAAO,CAAC,WAAW,SAAS,UAAU,EAAE,CAAC,CAAC;AAEhG,aAAO,+BAAe,QAAQ;AAChC;;;ACpDA,IAAAC,gBAA2B;AAC3B,IAAAC,8BAA8B;AAC9B,IAAAC,iBAA4C;AAC5C,IAAAC,uBAAyC;AAKlC,IAAMC,uBAAiF,CAAC;AAAA,EAC7F,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,KAAC,2CAAc,OAAOC,YAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,YAAW,GAAG;AAEnE,QAAM,EAAE,QAAQ,QAAI,iCAAiB,WAAW;AAChD,QAAM,SAASC,mBAAkB,IAAI;AACrC,QAAM,EAAE,OAAO,SAAS,IAAI,QAAQ,UAAU,iBAAiB,MAAM;AACrE,QAAM,OAAOC,gBAAe,QAAQ,MAAM,WAAW,IAAI,OAAO,KAAK;AACrE,QAAM,WAAW,4BAAO,cAAU,0BAAW,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE9E,SAAO;AAAA,IACL,SAASH;AAAA,IACT,QAAQ,SAAS,MAAM;AAAA,EACzB;AACF;AAEA,IAAME,qBAAoB,CAAC,SAA8B;AACvD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAEA,IAAMC,kBAAiB,CACrB,QACA,WACA,IACA,OACA,cACe;AACf,MAAI;AACF,YAAQ,QAAQ;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AACH,eAAOC,wBAAuB,WAAW,IAAI,OAAO,SAAS;AAAA,MAC/D,KAAK;AACH,eAAOC,2BAA0B,WAAW,IAAI,SAAS;AAAA,IAC7D;AAAA,EACF,QAAQ;AACN,UAAM,IAAI;AAAA,MACR,yCAAyC,MAAM,KAAK,SAAS,KAAK,EAAE,KAAK,KAAK;AAAA,IAChF;AAAA,EACF;AACF;AAEA,IAAMC,mBAAkB,CAAC,OAAuB,kBAAwC;AACtF,aAAW,WAAW,eAAe;AACnC,QAAI;AACF,aAAO,MAAM,IAAI,QAAQ,CAAC;AAAA,IAC5B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,kBAAkB;AACpC;AAGA,IAAMF,0BAAyB,CAC7B,WACA,IACA,OACA,UACG;AACH,SAAOE,iBAAgB,OAAO;AAAA,IAC5B,OAAO;AAAA,MACL,QAAI,0BAAU,SAAS;AAAA;AAAA,MACvB,YAAQ,2BAAK,MAAM,EAAE;AAAA,MACrB,QAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,IACA,OAAO;AAAA,MACL,QAAI,0BAAU,SAAS;AAAA;AAAA,MACvB,QAAQ;AAAA,MACR,QAAQ,OAAO,KAAK;AAAA,IACtB;AAAA,EACF,CAAC;AACH;AAEA,IAAMD,6BAA4B,CAAC,WAAmB,IAAY,UAA0B;AAC1F,SAAOC,iBAAgB,OAAO;AAAA,IAC5B,OAAO;AAAA,MACL,QAAI,0BAAU,SAAS;AAAA;AAAA,MACvB,UAAM,2BAAK,MAAM,EAAE;AAAA,MACnB,YAAY;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACL,QAAI,0BAAU,SAAS;AAAA;AAAA,MACvB,MAAM;AAAA,MACN,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACH;;;AC9GA,IAAAC,gBAAwB;AAQjB,IAAMC,qBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,kBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,QAAM,UAAUC,cAAa,WAAW,aAAa,YAAY;AAEjE,SAAO,iBAAiB,WAAW,WAAW,OAAO,EAAE;AAAA,QACrD,mBAAI,CAAC,cAAc;AAAA,MACjB,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,IACX,EAAE;AAAA,EACJ;AACF;;;AClBO,IAAM,gCAAiF;AAAA,EAC5F,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AChBA,IAAAC,8BAA4C;AAC5C,IAAAC,cAAc;AAKP,IAAM,oCAAoC,YAAAC,QAAE,aAAa;AAAA,EAC9D,WAAW,wDAA4B,MAAM;AAAA,EAC7C,GAAG,sBAAsB;AAC3B,CAAC;;;ACTD,IAAAC,8BAAwC;AAIjC,IAAMC,eAAc,oDAAwB,MAAM,KAAK;AACvD,IAAMC,YAAW,oDAAwB,MAAM,SAAS;;;ACL/D,IAAAC,qBAA4B;AASrB,IAAMC,iBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,MAAI,CAAC,cAAc,MAAM;AACvB,gBAAI,KAAK,yCAAyCC,YAAW,gBAAgB,SAAS,KAAK;AAAA,MACzF;AAAA,IACF,CAAC;AACD,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,gDAAgD;AAAA,MACnE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,WAAWA,cAAa;AACvC,gBAAI,KAAK,qCAAqC,aAAa,MAAM,OAAOA,YAAW,GAAG;AACtF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,+CAA+CA,YAAW,EAAE;AAAA,MAC/E,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,YAAY,WAAW;AACtC,gBAAI;AAAA,MACF,sCAAsC,aAAa,OAAO,OAAOA,YAAW,yBAAyB,SAAS;AAAA,IAChH;AACA,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,wCAAwC,SAAS,EAAE;AAAA,MACtE,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,gBAAY,yBAAK,YAAY,IAAI,CAAC,QAAQ,IAAI,OAAO,CAAC;AAE5D,MAAI;AACF,UAAM,MAAM,MAAM,QAAQ;AAAA,MACxB,UAAU;AAAA,QAAI,CAAC,YACb,uBAEE,WAAW,WAAW,aAAa,MAAO,iBAAiB,YAAY,CAAC,OAAO,CAAC;AAAA,MACpF;AAAA,IACF;AAEA,UAAM,kBAAkB,UAAU,QAAQ,CAAC,SAAS,UAAU;AAC5D,aAAO,IAAI,KAAK,EACb,IAAI,CAAC,CAAC,WAAW,OAAO,OAAO;AAAA,QAC9B;AAAA,QACA;AAAA,QACA,MAAM,QAAQ,KAAK,SAAS;AAAA,QAC5B,UAAU,QAAQ,SAAS,SAAS;AAAA,QACpC,QAAQ,QAAQ,OAAO,SAAS;AAAA,MAClC,EAAE,EACD,OAAO,CAAC,MAAM,EAAE,cAAc,MAAS;AAAA,IAC5C,CAAC;AAED,UAAM,oBAAgB,0BAAM,iBAAiB,CAAC,MAAM,GAAG,EAAE,OAAO,IAAI,EAAE,SAAS,EAAE;AAEjF,UAAM,UAAU,oBAAoB,OAAO,CAAC,KAAK,CAAC,OAAOC,UAAS,MAAM;AACtE,UAAI,MAAM,SAASD;AACjB,mBAAW,WAAWC,YAAW;AAC/B,gBAAM,aAAa,cAAc,GAAG,OAAO,IAAI,MAAM,SAAS,EAAE;AAIhE,gBAAM,UAAoB;AAAA,YACxB;AAAA,YACA;AAAA,YACA,SAAS,MAAM;AAAA,YACf,QAAQD;AAAA,YACR,QAAQ;AAAA,YACR,QAAQ;AAAA,cACN;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQ,YAAY,KAAK,SAAS,KAAK;AAAA,cACzC;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQ,YAAY,SAAS,SAAS,KAAK;AAAA,cAC7C;AAAA,cACA;AAAA,gBACE,MAAM;AAAA,gBACN,OAAO;AAAA,gBACP,QAAQ,YAAY,OAAO,SAAS,KAAK;AAAA,cAC3C;AAAA,YACF;AAAA,UACF;AAEA,cAAI,KAAK,OAAO;AAAA,QAClB;AAEF,aAAO;AAAA,IACT,GAAG,CAAC,CAAe;AAEnB,WAAO;AAAA,MACL;AAAA,MACA,QAAQ,CAAC;AAAA,IACX;AAAA,EACF,SAAS,KAAK;AACZ,gBAAI,KAAK,oDAAoD,GAAG;AAEhE,UAAM,SAAS,YAAY,IAAI,CAAC,SAAS;AAAA,MACvC,SAAS,IAAI,MAAM;AAAA,MACnB,SAAS,IAAI;AAAA,MACb,OAAO,IAAI,MAAM,+BAA+B,IAAI,OAAO,OAAO,SAAS,EAAE;AAAA,IAC/E,EAAE;AAEF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACF;;;AC1IA,IAAAE,8BAKO;AACP,IAAAC,iBAAsD;AACtD,IAAAC,qBAA8B;AAOvB,IAAMC,eAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,kBAAkB;AACxB,MAAI,CAAC,iBAAiB,KAAM,QAAO,CAAC;AAEpC,QAAM,EAAE,QAAQ,QAAI,iCAAiB,gBAAgB,IAAI;AACzD,QAAM,cAAc,QAAQ,aAAa,iBAAiB,QAAQ;AAElE,QAAM,sBAAsB,MAAM,UAAU,KAAsB,WAAW,iBAAiB;AAAA,QAC5F,oCAAoB,iBAAiB,QAAQ;AAAA,EAC/C,CAAC;AAED,QAAM,sBAAsB,MAAM,UAAU;AAAA,IAC1C;AAAA,IACA;AAAA,IACA,CAAC,mBAAmB;AAAA,EACtB;AAEA,QAAM,sBAAsB,oBAAoB,SAAS,oBAAoB,CAAC,EAAE,UAAU,CAAC;AAE3F,QAAM,2BAAuB,0BAAM,QAAQ,CAAC,MAAM,EAAE,SAAS;AAE7D,SACE,oBACG,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAErB,UAAM,CAAC,SAAS,IAAI,YAAY,KAAK,IAAI,GAAG;AAC5C,UAAM,QAAQ,YAAY,MAAM,IAAI,KAAK;AASzC,WAAO;AAAA,MACL;AAAA,MACA,WAAW,MAAM,WAAW;AAAA,MAC5B,cAAc,MAAM;AAAA,MACpB,MAAM,MAAM,MAAM,OAAO;AAAA,MACzB,QAAQ,MAAM,QAAQ,OAAO;AAAA,MAC7B,UAAU,MAAM;AAAA,MAChB,oBAAoB,MAAM,oBAAoB,SAAS;AAAA,IACzD;AAAA,EACF,CAAC,EAEA;AAAA,IACC,CAAC,WAA8B;AAAA,MAC7B,QAAI,iDAAoB,WAAW,MAAM,SAAS;AAAA,MAClD,MAAMC;AAAA,MACN,UAAU;AAAA,MACV;AAAA,MACA,WAAW,MAAM;AAAA,MACjB,WAAW,MAAM;AAAA;AAAA,MACjB,cAAc,MAAM;AAAA,MACpB,MAAM,MAAM;AAAA,MACZ,QAAQ,MAAM;AAAA,MACd,UAAU,MAAM,YAAY;AAAA,MAC5B,oBAAoB,MAAM;AAAA,MAC1B,WAAW;AAAA,IACb;AAAA,EACF,EAEC,OAAO,CAAC,UAAU;AACjB,UAAM,cAAc,qBAAqB,MAAM,SAAS;AACxD,WAAO,eAAe,MAAM;AAAA,EAC9B,CAAC,EAEA,IAAI,CAAC,UAAU;AACd,UAAM,cAAc,qBAAqB,MAAM,SAAS;AACxD,WAAO,kBAAc,2BAAO,CAAC,GAAG,OAAO,WAAW,IAAI;AAAA,EACxD,CAAC,EAEA,OAAO,CAAC,MAAM;AACb,UAAM,SAAS,oDAAwB,UAAU,CAAC;AAGlD,WAAO,OAAO;AAAA,EAChB,CAAC;AAEP;;;ACnGA,IAAAC,8BAA2D;AAC3D,IAAAC,iBAAkE;AAO3D,IAAMC,mBAAyE,CAAC;AAAA,EACrF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAASC;AACf,QAAM,UAAU;AAEhB,QAAM,gBAAgB,iBAA2C,aAAa,UAAU,SAAS;AACjG,MAAI,gBAAgB,cAAc;AAChC,UAAM,IAAI;AAAA,MACR,kCAAkC,WAAW,kBAAkB,cAAc,YAAY;AAAA,IAC3F;AAEF,QAAM,KAAK,qBAAqB,EAAE,QAAQ,SAAS,YAAY,CAAC;AAEhE,QAAM,EAAE,gBAAgB,QAAI,iCAAiB,WAAW;AAExD,MAAI,gBAAgB,UAAU;AAC5B,UAAM,IAAI;AAAA,MACR,iCAAiC,gBAAgB,OAAO;AAAA,IAC1D;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,MAAMC,SAAQ,WAAW;AAAA,IACzB,OAAO;AAAA,EACT;AACF;AAEA,IAAMA,WAAU,CAAC,gBAAqD;AACpE,QAAM,EAAE,UAAU,gBAAgB,QAAI,iCAAiB,WAAW;AAGlE,MACE,CAAC,eAAe,iBAAiB,iBAAiB,QAAQ,KAC1D,CAAC,eAAe,iBAAiB,UAAU,UAAU,KACrD,CAAC,cAAc,iBAAiB,iBAAiB,UAAU;AAE3D,WAAO;AAET;AAAA,IACE;AAAA,IACA;AAAA,MACE,EAAE,QAAQ,iBAAiB,OAAO,CAAC,QAAQ,EAAE;AAAA;AAAA,MAC7C,EAAE,QAAQ,UAAU,OAAO,CAAC,UAAU,EAAE;AAAA;AAAA,IAC1C;AAAA,IACA;AAAA,MACE;AAAA,QACE,YAAY;AAAA,QACZ,SAAS,CAAC,UAAU;AAAA,MACtB;AAAA,IACF;AAAA,EACF;AAEA,aAAO,+BAAe,QAAQ;AAChC;;;ACpEA,IAAAC,gBAA2B;AAC3B,IAAAC,8BAA8B;AAC9B,IAAAC,iBAAiC;AACjC,IAAAC,uBAAuB;AAKhB,IAAMC,uBAAiF,CAAC;AAAA,EAC7F,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,KAAC,2CAAc,OAAOC,YAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,YAAW,GAAG;AAInE,QAAM,EAAE,QAAQ,QAAI,iCAAiB,WAAW;AAChD,QAAM,EAAE,OAAO,SAAS,IAAI,QAAQ,UAAU,cAAc,UAAU;AACtE,QAAM,OAAO;AAAA,IACX,MAAM;AAAA,IACN,aAAa,MAAM;AAAA,IACnB,QAAQ,OAAO,KAAK;AAAA,EACtB;AAEA,QAAM,WAAW,4BAAO,cAAU,0BAAW,CAAC,IAAI,WAAW,QAAQ,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;AACzF,SAAO;AAAA,IACL,SAASD;AAAA,IACT,QAAQ,SAAS,MAAM;AAAA,EACzB;AACF;;;ACjCA,IAAAE,qBAAwB;AACxB,IAAAC,gBAAqD;AAOrD,IAAMC,yBAAwB;AAEvB,IAAMC,qBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,kBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,SAAO,IAAI,yBAAW,CAAC,eAAe;AACpC,UAAM,kBAAkB,IAAI,gBAAgB;AAI5C,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,YAAI,gBAAgB,OAAO,QAAS;AAEpC,cAAM,WAAW,MAAMC,eAAc;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,gBAAgB,OAAO,QAAS;AAEpC,mBAAW,KAAK,QAAQ;AAExB,mBAAW,MAAMF,sBAAqB;AAAA,MACxC,SAAS,OAAO;AACd,oBAAI,MAAM,SAAS;AAAA,UACjB,QAAQG;AAAA,UACR;AAAA,UACA;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,QACF,CAAC;AACD,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,SAAK;AAEL,WAAO,MAAM;AACX,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC,EAAE,SAAK,oCAAqB,0BAAO,CAAC;AACvC;;;ACjDO,IAAM,4BAA6E;AAAA,EACxF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AChBA,IAAAC,8BAAwC;AACxC,IAAAC,cAAc;AAKP,IAAM,gCAAgC,YAAAC,QAAE,aAAa;AAAA,EAC1D,WAAW,oDAAwB,MAAM;AAAA,EACzC,GAAG,sBAAsB;AAC3B,CAAC;;;ACTD,IAAAC,8BAAqC;AAQ9B,IAAMC,gBAAc,iDAAqB,MAAM,KAAK;AACpD,IAAMC,aAAW,iDAAqB,MAAM,SAAS;;;ACT5D,IAAAC,iBAAoD;AACpD,IAAAC,eAAyB;;;ACDzB,wBAAuB;AAiBvB,IAAM,eAAqD,CAAC,UAC1D,SAAS,KAAK;AAMT,IAAM,gBAAgB,CAAC,UAAoC;AAChE,MAAI,OAAO,UAAU,SAAU,QAAO,aAAa,SAAS;AAE5D,MAAI,MAAM,SAAS,SAAS,EAAG,QAAO;AACtC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,WAAW,EAAG,QAAO;AACxC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,SAAS,EAAG,QAAO;AACtC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,aAAa,EAAG,QAAO;AAG1C,MAAI,MAAM,SAAS,QAAQ,EAAG,QAAO;AACrC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO;AACvC,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO,aAAa,KAAK;AACzD,MAAI,MAAM,SAAS,QAAQ,EAAG,QAAO,aAAa,KAAK;AACvD,MAAI,MAAM,WAAW,KAAK,EAAG,QAAO,aAAa,KAAK;AAGtD,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO,aAAa,KAAK;AACzD,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO,aAAa,KAAK;AACzD,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO,aAAa,KAAK;AACzD,MAAI,MAAM,SAAS,UAAU,EAAG,QAAO,aAAa,KAAK;AAGzD,UAAQ,KAAK,wBAAwB,KAAK,EAAE;AAC5C,SAAO,aAAa,KAAK;AAC3B;AAEA,IAAM,iBAAiB,CAAC,QAAQ,MAAM;AACtC,IAAM,aAAa,CAAC,SAClB,eAAe,SAAS,KAAK,KAAK;AACpC,IAAM,gBAAgB,CAAC,SAA8C,CAAC,WAAW,IAAI;AAC9E,IAAM,kBAAkB,CAC7B,UACG;AACH,QAAM,kBAAkB,MAAM,KAAK,aAAa;AAChD,MAAI,CAAC,gBAAiB,QAAO;AAE7B,SAAO,MAAM,OAAO,aAAa;AACnC;AAGO,IAAM,eAAe,CAC1B,MAEA,EAAE,QAAQ,IAA2B,CAAC,MACnC;AACH,MAAI,CAAC,KAAK,MAAO,QAAO,KAAK;AAE7B,MAAI,KAAK,UAAU,YAAa,QAAO;AACvC,MAAI,KAAK,UAAU,YAAa,QAAO;AACvC,MAAI,KAAK,UAAU,mBAAoB,QAAO;AAC9C,MAAI,KAAK,UAAU,qBAAsB,QAAO;AAChD,MAAI,KAAK,UAAU,oBAAqB,QAAO;AAC/C,MAAI,KAAK,UAAU,eAAgB,QAAO;AAC1C,MAAI,KAAK,UAAU,OAAQ,QAAO;AAClC,MAAI,KAAK,UAAU,OAAQ,QAAO;AAClC,MAAI,KAAK,MAAM,WAAW,OAAO,EAAG,QAAO;AAE3C,aAAO,kBAAAC,SAAW,KAAK,KAAK;AAC9B;;;AD7EO,IAAM,mBAAmB,CAC9B,WACA,aACA,iBACqC;AACrC,QAAM,uBAAuB,0BAA0B,WAAW,cAAc;AAAA,IAC9E,SAAS,CAAC,UAAU,SAAS;AAAA,IAC7B,eAAe,CAAC,WAAW,QAAQ;AAAA,IACnC,UAAU,CAAC,YAAY,UAAU;AAAA;AAAA,IACjC,OAAO,CAAC,YAAY,OAAO;AAAA,IAC3B,OAAO,CAAC,YAAY,OAAO;AAAA,IAC3B,SAAS,CAAC,YAAY,SAAS;AAAA,IAC/B,aAAa,CAAC,mBAAmB,aAAa;AAAA,EAChD,CAAC;AAED,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,kDAAkD,SAAS,EAAE;AAE/E,SAAO,YACJ,IAAI,CAAC,EAAE,OAAO,QAAQ,MAAwC;AAC7D,UAAM,eAAe,MAAM;AACzB,UAAI;AACF,cAAM,kBAAkB,qBAAqB,UACxC,qBAAqB,QAAQ,KAAK,IAAI,OAAO,IAC9C;AAEJ,cAAM,gBAAgB,qBAAqB,QACtC,qBAAqB,MAAM,KAAK,IAAI,OAAO,IAC5C;AAEJ,cAAM,kBAAkB,qBAAqB,UACxC,qBAAqB,QAAQ,KAAK,IAAI,OAAO,IAC9C;AAEJ,cAAM,gBAAgB,qBAAqB,QACtC,qBAAqB,MAAM,KAAK,IAAI,OAAO,IAC5C;AAEJ,cAAM,wBAAwB,qBAAqB,gBAC9C,qBAAqB,cAAc,KAAK,IAAI,OAAO,IACpD;AAEJ,cAAM,qBAAqB,qBAAqB,cAC3C,qBAAqB,YAAY,KAAK,IAAI,OAAO,IAClD;AAEJ,eAAO;AAAA,UACL;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,MACF,QAAQ;AAEN,eAAO,CAAC;AAAA,MACV;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,aAAa;AAAA,MACxB,cAAc,CAAC,YAA6B;AAC1C,cAAM,UAAoB;AAAA,UACxB,QAAQ;AAAA,UACR,QAAQ;AAAA,UACR;AAAA,UACA;AAAA,UACA,SAAS,MAAM;AAAA,UACf,QAAQ,CAAC;AAAA,UACT,kCAAkC,aAAa,MAAM;AAAA,QACvD;AAEA,YAAI,oBAA8C;AAElD,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,IAAI;AAEJ,YAAI,qBAAqB,SAAS;AAEhC,gBAAM,aAAa;AAAA,YACjB,qBAAqB;AAAA,YACrB;AAAA,YACA;AAAA,UACF;AACA,kBAAQ,OAAO,KAAK,GAAG,UAAU;AAAA,QACnC;AAEA,YAAI,qBAAqB,SAAS,YAAY;AAC5C,gBAAM,aAAa,kBAAkB,qBAAqB,OAAO,YAAY,SAAS;AACtF,kBAAQ,OAAO,KAAK,GAAG,UAAU;AAAA,QACnC;AAEA,YAAI,qBAAqB,WAAW,eAAe;AACjD,gBAAM,gBAAgB;AAAA,YACpB,qBAAqB;AAAA,YACrB;AAAA,YACA;AAAA,UACF;AACA,kBAAQ,OAAO,KAAK,GAAG,aAAa;AAAA,QACtC;AAEA,YAAI,qBAAqB,SAAS,aAAa;AAC7C,gBAAM,cAAc;AAAA,YAClB,qBAAqB;AAAA,YACrB;AAAA,YACA;AAAA,UACF;AACA,kBAAQ,OAAO,KAAK,GAAG,WAAW;AAAA,QACpC;AAEA,YAAI,qBAAqB,iBAAiB,qBAAqB;AAC7D,gBAAM,sBAAsB;AAAA,YAC1B,qBAAqB;AAAA,YACrB;AAAA,YACA;AAAA,UACF;AACA,kBAAQ,OAAO,KAAK,GAAG,mBAAmB;AAAA,QAC5C;AAEA,YAAI,qBAAqB,eAAe,qBAAqB;AAC3D,gBAAM,qBAAqB;AAAA,YACzB,qBAAqB;AAAA,YACrB;AAAA,YACA;AAAA,UACF;AAEA,cAAI,mBAAoB,qBAAoB;AAAA,QAC9C;AAEA,eAAO,EAAE,SAAS,kBAAkB;AAAA,MACtC;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,qBAAQ;AACpB;AAEA,IAAM,mBAAmB,CACvB,OACA,OACA,cACmC;AAcnC,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,iDAAiD,SAAS;AAAA,EAC5D;AAEA,QAAM,QAAQ,SAAS,MAAM,QAAQ,IAAI,SAAS;AAClD,QAAM,YAAY,SAAS,MAAM,YAAY,IAAI,SAAS;AAC1D,QAAM,aACH,SAAS,MAAM,cAAc;AAAA;AAAA,GAG5B,SAAS,MAA8B,UAAU,KACnD,SAAS;AACX,QAAM,YAAY,SAAS,MAAM,aAAa,IAAI,SAAS;AAO3D,QAAM,YAAuC;AAAA,IAC3C,EAAE,MAAM,QAAQ,OAAO,QAAQ,QAAQ,KAAK,SAAS,EAAE;AAAA,IACvD,EAAE,MAAM,YAAY,OAAO,YAAY,QAAQ,SAAS,SAAS,EAAE;AAAA,IACnE,EAAE,MAAM,UAAU,OAAO,QAAQ,QAAQ,SAAS,SAAS,EAAE;AAAA,IAC7D,EAAE,MAAM,UAAU,OAAO,QAAQ,QAAQ,SAAS,SAAS,EAAE;AAAA,EAC/D;AAEA,SAAO;AACT;AAEA,IAAM,oBAAoB,CACxB,OACA,OACA,cACmC;AAOnC,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,kCAAkC,SAAS;AAAA,EAC7C;AAEA,QAAM,kBACJ,SAAS,MAAM,CAAC,UAAU;AAAA,IACxB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO,cAAc,MAAM,IAAI,SAAS,CAAC;AAAA,IACzC,MAAM,EAAE,IAAI,MAAM,IAAI,SAAS,EAAE;AAAA,IACjC,SAAS,MAAM,UAAU,IAAI,SAAS;AAAA,EACxC,EAAE,KAAK,CAAC;AAEV,SAAO;AACT;AAEA,IAAM,sBAAsB,CAC1B,OACA,OACA,cACmC;AAOnC,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,oCAAoC,SAAS;AAAA,EAC/C;AAEA,QAAM,gBACJ,SAAS,MAAM,CAAC,UAAU;AAAA,IACxB,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO,cAAc,MAAM,IAAI,MAAM,cAAc,CAAC;AAAA,IACpD,QAAQ,MAAM,QAAQ,WAAW,KAAK;AAAA,EACxC,EAAE,KAAK,CAAC;AAEV,SAAO;AACT;AAEA,IAAM,oBAAoB,CACxB,OACA,OACA,cACmC;AAOnC,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,mCAAmC,SAAS;AAAA,EAC9C;AAGA,QAAM,cACJ,SACI,OAAO,CAAC,SAAS,KAAK,IAAI,IAAI,EAC/B,IAAI,CAAC,UAAU;AAAA,IACd,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,OAAO,KAAK,GAAI;AAAA;AAAA,IAEhB,QAAQ;AAAA,IACR,MAAM,EAAE,SAAS,MAAM,UAAU,IAAI,SAAS,EAAE;AAAA,EAClD,EAAE,KAAK,CAAC;AAEZ,SAAO;AACT;AAEA,IAAM,4BAA4B,CAChC,OACA,OACA,cACmC;AAanC,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,6CAA6C,SAAS;AAAA,EACxD;AAEA,QAAM,iBACJ,SAAS,WAAW,SAAS,CAAC,KAAK,cAAc,MAAM,UAAU,OAAO,EAAE,KAAK;AAEjF,QAAM,uBACJ,kBAAkB,KACd,CAAC,IACD;AAAA,IACE;AAAA,MACE,MAAM;AAAA,MACN,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,QAAQ,eAAe,SAAS;AAAA,IAClC;AAAA,EACF;AAEN,SAAO;AACT;AAEA,IAAM,yBAAyB,CAC7B,OACA,OACA,cAC6B;AAU7B,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,yCAAyC,SAAS;AAAA,EACpD;AAEA,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,SAAiB,QAAQ,QAAQ,SAAS;AAChD,QAAM,SAAiB,QAAQ,OAAO,SAAS;AAC/C,QAAM,gBAAwD,MAAM;AAAA,IAClE,QAAQ,kBAAkB,CAAC;AAAA,EAC7B,EAAE,QAAQ,CAAC,UAAU;AACnB,QAAI,UAAU,OAAW,QAAO,CAAC;AACjC,UAAM,CAAC,KAAKC,MAAK,IAAI,MAAM,KAAK,KAAK;AAErC,UAAM,MAAM,IAAI,SAAS;AACzB,UAAM,SAASA,OAAM,SAAS;AAC9B,QAAI,OAAO,QAAQ,YAAY,OAAO,WAAW,SAAU,QAAO,CAAC;AAEnE,WAAO,EAAE,KAAK,OAAO;AAAA,EACvB,CAAC;AAED,SAAO,EAAE,QAAQ,QAAQ,cAAc;AACzC;;;AE3XA,IAAAC,iBAAoD;;;ACApD,IAAAC,gBAA2B;AAC3B,IAAAC,uBAA2C;AAC3C,sBAAoB;AAMpB,IAAM,mBAAmB,CAAC,UAAkB,QAAyB,UAA8B;AACjG,QAAM,cAAc,IAAI,YAAY;AACpC,QAAM,eAAe,YAAY,OAAO,MAAM;AAC9C,QAAM,cAAc,YAAY,OAAO,QAAQ;AAE/C,QAAM,WAAW,IAAI,WAAW,CAAC,KAAK,CAAC;AACvC,QAAM,YAAY,oBAAI,IAAI,OAAO,WAAW,WAAW,SAAS,QAAQ,EAAE,IAAI,MAAM;AAEpF,QAAM,SAAS,aAAa,SAAS,YAAY,SAAS,SAAS,SAAS,UAAU;AACtF,QAAM,iBAAiB,KAAK;AAC5B,QAAM,eAAe,IAAI,WAAW,cAAc;AAElD,QAAM,YAAQ,0BAAW,CAAC,cAAc,aAAa,UAAU,WAAW,YAAY,CAAC;AAEvF,aAAO,gCAAU,EAAE,IAAI,KAAK;AAC9B;AAEO,IAAM,wBAAwB,CAAC,UAAkB,WACtD,iBAAiB,UAAU,QAAQ,CAAC;;;ADhB/B,IAAM,sBAAsB,CACjC,WACA,iBACA,iBACkC;AAClC,QAAM,uBAAuB,iBAAiB,WAAW,YAAY;AAErE,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,kDAAkD,SAAS,EAAE;AAE/E,SAAO,gBAAgB,IAAI,CAAC,EAAE,SAAS,kBAAkB,MAAM;AAC7D,UAAM,YAAY;AAAA,MAChB;AAAA,MACA;AAAA,MACA,aAAa;AAAA,IACf;AAEA,WAAO;AAAA,MACL;AAAA,MACA,cAAc,CAAC,YAAsC;AACnD,YAAI,CAAC,qBAAqB,CAAC,UAAU,UAAU,QAAQ,SAAS,IAAI,EAAG,QAAO;AAE9E,cAAM,gBAAgB,mBAAmB,UAAU;AAEnD,cAAM,EAAE,aAAa,IAAI,IAAI;AAAA,UAC3B,qBAAqB;AAAA,UACrB,QAAQ,CAAC;AAAA,UACT;AAAA,QACF;AACA,cAAM,EAAE,uBAAuB,IAAI,IAAI;AAAA,UACrC,qBAAqB;AAAA,UACrB,QAAQ,CAAC;AAAA,UACT;AAAA,QACF;AACA,cAAM,EAAE,WAAW,IAAI,IAAI;AAAA,UACzB,qBAAqB;AAAA,UACrB,QAAQ,CAAC;AAAA,UACT;AAAA,QACF;AAEA,cAAM,SACJ,kBAAkB,OAAO,eAAe,OAAO,yBAAyB,MACpE,KACC,OAAO,oBAAoB,IAAI,OAAO,aAAa,IAAK,OAAO,UAAU;AAEhF,cAAM,kBAAkB,kBAAkB,cAAc;AAAA,UACtD,CAAC,OAAO,EAAE,QAAAC,QAAO,MAAM,QAAQ,OAAOA,WAAU,GAAG;AAAA,UACnD;AAAA,QACF;AAEA,eAAO;AAAA,UACL,GAAG;AAAA,UACH,QAAQ;AAAA,YACN,GAAI,QAAQ,QAAQ,OAAO,CAAC,EAAE,OAAO,MAAM,WAAW,kBAAkB,KAAK,CAAC;AAAA,YAC9E;AAAA,cACE,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ,OAAO,SAAS;AAAA,cACxB,MAAM,EAAE,MAAM,WAAW,QAAQ,kBAAkB,QAAQ,aAAa,SAAS;AAAA,YACnF;AAAA,YACA;AAAA,cACE,QAAQ;AAAA,cACR,MAAM;AAAA,cACN,OAAO;AAAA,cACP,QAAQ,gBAAgB,SAAS;AAAA,cACjC,MAAM;AAAA,gBACJ,QAAQ,kBAAkB;AAAA,gBAC1B,aAAa,YAAY,QAAQ,kBAAkB,MAAM;AAAA,gBACzD,WAAW;AAAA,cACb;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH;AAEA,IAAM,mBAAmB,CAAC,WAAmB,iBAAkD;AAC7F,SAAO,0BAA0B,WAAW,cAAc;AAAA,IACxD,aAAa,CAAC,mBAAmB,aAAa;AAAA,IAC9C,aAAa,CAAC,mBAAmB,aAAa;AAAA,IAC9C,QAAQ,CAAC,WAAW,QAAQ;AAAA,IAC5B,UAAU,CAAC,mBAAmB,UAAU;AAAA,EAC1C,CAAC;AACH;AAEA,IAAM,mBAAmB,CAAC,OAA0B,OAAe,cAAsB;AAUvF,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,yCAAyC,SAAS;AAAA,EACpD;AAEA,SAAO,EAAE,YAAY,SAAS,OAAO,SAAS,EAAE;AAClD;AAEA,IAAM,kBAAkB,CAAC,OAA0B,OAAe,cAAsB;AAUtF,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,oCAAoC,SAAS;AAAA,EAC/C;AAEA,SAAO,EAAE,sBAAsB,SAAS,OAAO,SAAS,EAAE;AAC5D;AAEA,IAAM,iBAAiB,CAAC,OAA0B,OAAe,cAAsB;AAIrF,QAAM,cAAU;AAAA,IACd;AAAA,IACA;AAAA,IACA,sCAAsC,SAAS;AAAA,EACjD;AAEA,QAAM,WAAW,SAAS,OAAO;AAEjC,SAAO,EAAE,SAAS;AACpB;AAEA,IAAM,sBAAsB,CAC1B,QACA,mBACA,UACoB;AACpB,MACE,CAAC,qBACD,CAAC,MAAM,2BACP,CAAC,QAAQ,eACT,CAAC,OAAO,UACR,CAAC,OAAO;AAER,WAAO,CAAC;AAEV,MAAI;AACF,UAAM,SAAS,kBAAkB;AACjC,UAAM,eAAe,sBAAsB,MAAM,yBAAyB,MAAM;AAEhF,UAAM,qBAAqB,OAAO,YAAY,KAAK,IAAI,MAAM;AAC7D,UAAM,oBAAoB,OAAO,OAAO,KAAK,IAAI,YAAY;AAC7D,UAAM,mBAAmB,OAAO,SAAS,KAAK,IAAI,MAAM;AAExD,WAAO,CAAC,oBAAoB,mBAAmB,gBAAgB;AAAA,EACjE,QAAQ;AACN,WAAO,CAAC;AAAA,EACV;AACF;;;AEzKO,IAAMC,kBAKQ,OAAO,EAAE,WAAW,qBAAqB,WAAW,aAAa,MAAM;AAC1F,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,MAAI,CAAC,cAAc,MAAM;AACvB,gBAAI,KAAK,yCAAyCC,aAAW,gBAAgB,SAAS,GAAG;AACzF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,gDAAgD;AAAA,MACnE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,WAAWA,eAAa;AACvC,gBAAI,KAAK,qCAAqC,aAAa,MAAM,OAAOA,aAAW,GAAG;AACtF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,+CAA+CA,aAAW,EAAE;AAAA,MAC/E,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,YAAY,WAAW;AACtC,gBAAI;AAAA,MACF,sCAAsC,aAAa,OAAO,OAAOA,aAAW,yBAAyB,SAAS;AAAA,IAChH;AACA,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,wCAAwC,SAAS,EAAE;AAAA,MACtE,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,cAAc,iBAAiB,WAAW,aAAa,YAAY;AACzE,QAAM,kBAAkB,MAAM,kBAAkB,WAAW,WAAW,WAAW;AAGjF,QAAM,iBAAiB,oBAAoB,WAAW,iBAAiB,YAAY;AACnF,QAAM,WAAW,MAAM,kBAAkB,WAAW,WAAW,cAAc;AAE7E,SAAO,EAAE,SAAS,UAAU,QAAQ,CAAC,EAAE;AACzC;;;AC7DA,IAAAC,8BAIO;AACP,IAAAC,qBAAuB;AACvB,IAAAC,cAAc;AAMP,IAAMC,gBAKM,OAAO,EAAE,WAAW,QAAQ,WAAW,aAAa,MAAM;AAC3E,MAAI,aAAa,MAAM,QAAS,QAAO,CAAC;AAExC,QAAM,EAAE,aAAa,QAAQ,eAAe,SAAS,IAAI,MAAM;AAAA,IAC7D;AAAA,IACA;AAAA,EACF;AAEA,MAAI,CAAC,aAAa,MAAM;AACtB,gBAAI,KAAK,gEAAgE,SAAS,WAAW;AAE/F,QAAM,cAAuC,OAAO,CAAC;AAErD,QAAM,cAA8B;AAAA,IAClC,QAAI,8CAAiB,SAAS;AAAA,IAC9B,MAAM;AAAA,IACN,UAAU;AAAA,IACV;AAAA,IACA,WAAW;AAAA,IACX;AAAA,IACA,MAAM;AAAA,IACN;AAAA,IACA,oBAAoB,aAAa,MAAM,sBAAsB;AAAA,EAC/D;AAEA,QAAM,YAAQ,2BAAO,aAAa,WAAW;AAE7C,QAAM,SAAS,iDAAqB,UAAU,KAAK;AACnD,MAAI,CAAC,OAAO,SAAS;AAEnB,WAAO,CAAC;AAAA,EACV;AAEA,SAAO,CAAC,OAAO,IAAI;AACrB;AAEA,IAAM,6BAA6B,YAAAC,QAAE,OAAO;AAAA,EAC1C,eAAe,YAAAA,QAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EAC9C,aAAa,YAAAA,QAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,MAAM;AACnD,CAAC;AAED,IAAM,4BAA4B,YAAAA,QAAE,OAAO;AAAA,EACzC,eAAe,YAAAA,QAAE,MAAM,YAAAA,QAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC5C,aAAa,YAAAA,QAAE,MAAM,YAAAA,QAAE,OAAO,CAAC,EAAE,SAAS;AAC5C,CAAC;AAED,IAAM,6BAA6B,YAAAA,QAChC,MAAM,CAAC,4BAA4B,yBAAyB,CAAC,EAC7D,UAAU,CAAC,SAAS;AAAA,EACnB,eAAe,MAAM,QAAQ,IAAI,aAAa,IAAI,IAAI,cAAc,CAAC,IAAI,IAAI;AAAA,EAC7E,aAAa,MAAM,QAAQ,IAAI,WAAW,IAAI,IAAI,YAAY,CAAC,IAAI,IAAI;AACzE,EAAE;AAEG,IAAM,qBAAqB,OAAO,WAA+B,cAAsB;AAC5F,QAAM,aAAa,MAAM,UAAU,KAAK,WAAW,qBAAqB,CAAC,GAAG,IAAI;AAChF,SAAO,2BAA2B,MAAM,UAAU;AACpD;;;AC1EA,IAAAC,8BAAqC;AACrC,IAAAC,iBAAkE;AAQ3D,IAAMC,oBAKU,CAAC,EAAE,WAAW,aAAa,aAAa,OAAO,MAAM;AAC1E,QAAM,SAASC;AACf,QAAM,UAAU;AAEhB,QAAM,gBAAgB,iBAA2C,aAAa,UAAU,SAAS;AACjG,MAAI,gBAAgB,cAAc;AAChC,UAAM,IAAI;AAAA,MACR,kCAAkC,WAAW,kBAAkB,cAAc,YAAY;AAAA,IAC3F;AAEF,QAAM,KAAK,qBAAqB,EAAE,QAAQ,SAAS,YAAY,CAAC;AAEhE,QAAM,EAAE,UAAU,gBAAgB,QAAI,iCAAiB,WAAW;AAElE,MAAI,gBAAgB,UAAU;AAC5B,UAAM,IAAI;AAAA,MACR,iCAAiC,gBAAgB,OAAO;AAAA,IAC1D;AAEF,MAAI,QAAQ;AACV,WAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,SAAS;AAAA,MACT,MAAM;AAAA,MACN,OAAO,EAAE,SAAS,KAAK;AAAA,IACzB;AAEF,QAAM,qBAAqB;AAAA,IACzB;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG,SAAS;AACZ,QAAM,0BAA0B;AAAA,IAC9B;AAAA,IACA;AAAA,IACA;AAAA,EACF,GAAG,OAAO;AAEV,QAAM,iBAAiB;AAAA,IACrB,gBAAgB,QACb,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,UAAU,GACrC,SAAS,MAAM,KAAK,CAAC,EAAE,KAAK,MAAM,SAAS,SAAS;AAAA,EAC1D;AACA,QAAM,mCAAmC,CAAC;AAE1C,sCAAgB,UAAU;AAAA,IACxB,EAAE,QAAQ,UAAU,WAAW,CAAC,WAAW,YAAY,GAAG,OAAO,CAAC,SAAS,EAAE;AAAA,IAC7E,EAAE,QAAQ,YAAY,OAAO,CAAC,YAAY,SAAS,SAAS,SAAS,EAAE;AAAA,IACvE,EAAE,QAAQ,mBAAmB,OAAO,CAAC,eAAe,eAAe,UAAU,EAAE;AAAA,IAC/E,EAAE,QAAQ,WAAW,OAAO,CAAC,QAAQ,EAAE;AAAA,EACzC,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,UAAM,+BAAe,QAAQ;AAAA,IAC7B,OAAO;AAAA,MACL;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AClFA,IAAAC,gBAA2B;AAC3B,IAAAC,8BAA8B;AAC9B,IAAAC,iBAKO;AACP,IAAAC,uBAA6B;AAKtB,IAAMC,wBAAiF,CAAC;AAAA,EAC7F,MAAAC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,KAAC,2CAAc,OAAOC,aAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,aAAW,GAAG;AAEnE,QAAM,EAAE,iBAAiB,UAAU,QAAQ,QAAI,iCAAiB,WAAW;AAC3E,QAAM,SAASC,mBAAkB,MAAM,iBAAiB,QAAQ;AAEhE,QAAM,EAAE,OAAO,SAAS,IAAI,QAAQ,UAAU,YAAY,MAAM;AAChE,QAAM,OAAOC,gBAAe,QAAQ,IAAI,OAAO,KAAK;AACpD,QAAM,WAAW,4BAAO,cAAU,0BAAW,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE9E,SAAO;AAAA,IACL,SAASH;AAAA,IACT,QAAQ,SAAS,MAAM;AAAA,EACzB;AACF;AAEA,IAAME,qBAAoB,CACxB,MACA,iBACA,aACG;AACH,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK,eAAe;AAClB,YAAM,WAAW,gBAAgB,QAAQ,KAAK,CAAC,WAAW,OAAO,SAAS,UAAU,GAAG,OACnF;AAEJ,UAAI,UAAU;AACZ,cAAM,cAAc,SAAS,QAAQ;AACrC,YAAI,YAAY,SAAS,UAAU,YAAY,MAAM;AACnD,iBAAO;AAAA,MACX;AAGA,aAAO;AAAA,IACT;AAAA,EACF;AACF;AAEA,IAAMC,kBAAiB,CACrB,QACA,IACA,OACA,cACe;AACf,MAAI;AACF,YAAQ,QAAQ;AAAA,MACd,KAAK;AAAA,MACL,KAAK;AAAA,MACL,KAAK;AACH,eAAOC,wBAAuB,IAAI,OAAO,SAAS;AAAA,MACpD,KAAK;AACH,eAAOC,2BAA0B,IAAI,SAAS;AAAA,IAClD;AAAA,EACF,QAAQ;AACN,UAAM,IAAI,MAAM,yCAAyC,MAAM,KAAK,EAAE,KAAK,KAAK,EAAE;AAAA,EACpF;AACF;AAEA,IAAMC,mBAAkB,CAAC,OAAuB,kBAAwC;AACtF,aAAW,WAAW,eAAe;AACnC,QAAI;AACF,aAAO,MAAM,IAAI,QAAQ,CAAC;AAAA,IAC5B,QAAQ;AAAA,IAER;AAAA,EACF;AAEA,QAAM,IAAI,MAAM,kBAAkB;AACpC;AAGA,IAAMF,0BAAyB,CAAC,IAAY,OAAe,UAA0B;AACnF,SAAOE,iBAAgB,OAAO;AAAA,IAC5B,OAAO;AAAA,MACL,UAAM,2BAAK,MAAM,EAAE;AAAA,MACnB,OAAO,OAAO,KAAK;AAAA,IACrB;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA;AAAA,MACN,OAAO,OAAO,KAAK;AAAA,IACrB;AAAA,EACF,CAAC;AACH;AAEA,IAAMD,6BAA4B,CAAC,IAAY,UAA0B;AACvE,SAAOC,iBAAgB,OAAO;AAAA,IAC5B,OAAO;AAAA,MACL,UAAM,2BAAK,MAAM,EAAE;AAAA,MACnB,YAAY;AAAA,IACd;AAAA,IACA,OAAO;AAAA,MACL,MAAM;AAAA,MACN,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AACH;;;ACxHA,IAAAC,gBAAmC;AAS5B,IAAMC,sBAKY,CAAC,EAAE,WAAW,qBAAqB,WAAW,aAAa,MAAM;AACxF,MAAI,CAAC,oBAAoB,OAAQ,YAAO,kBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAGtE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,QAAM,cAAc,iBAAiB,WAAW,aAAa,YAAY;AAEzE,SAAO,iBAAiB,WAAW,WAAW,WAAW,EAAE;AAAA,QACzD,yBAAU,CAAC,oBAAoB;AAE7B,YAAM,iBAAiB,oBAAoB,WAAW,iBAAiB,YAAY;AACnF,aAAO,iBAAiB,WAAW,WAAW,cAAc;AAAA,IAC9D,CAAC;AAAA,QACD,mBAAI,CAAC,cAAc;AAAA,MACjB,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,IACX,EAAE;AAAA,EACJ;AACF;;;ACnBO,IAAM,yBAKT;AAAA,EACF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AC3BA,IAAAC,cAAc;AAKP,IAAM,6BAA6B,YAAAC,QAAE,aAAa;AAAA,EACvD,GAAG,sBAAsB;AAC3B,CAAC;AAKM,IAAM,8BAA8B,YAAAA,QAAE,aAAa;AAAA,EACxD,SAAS,YAAAA,QAAE,QAAQ,EAAE,SAAS;AAChC,CAAC;AAKM,IAAM,mCAAmC,YAAAA,QAAE,aAAa;AAAA,EAC7D,SAAS,YAAAA,QAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,kCAAkC,YAAAA,QAAE,QAAQ,EAAE,SAAS;AAAA,EACvD,oBAAoB,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EACxC,yBAAyB,YAAAA,QAAE,OAAO,EAAE,SAAS;AAC/C,CAAC;;;ACxBD,IAAAC,8BAAoC;AAI7B,IAAMC,gBAAc,gDAAoB,MAAM,KAAK;AACnD,IAAMC,aAAW,gDAAoB,MAAM,SAAS;;;ACL3D,0BAAoB;AACpB,IAAAC,iBAA6B;;;ACD7B;AAAA,EACE,QAAU;AAAA,IACR,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,UAAY;AAAA,IACZ,YAAc;AAAA,MACZ,YAAc;AAAA,MACd,wBAA0B;AAAA,MAC1B,gBAAkB;AAAA,MAClB,mBAAqB;AAAA,QACnB,oBAAsB;AAAA,QACtB,qBAAuB;AAAA,MACzB;AAAA,IACF;AAAA,EACF;AAAA,EACA,UAAY;AAAA,IACV,MAAQ;AAAA,IACR,SAAW;AAAA,IACX,SAAW,CAAC,WAAW;AAAA,EACzB;AAAA,EACA,MAAQ;AAAA,IACN,cAAgB;AAAA,MACd;AAAA,QACE,MAAQ;AAAA,UACN;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,SAAS;AAAA,cACzB,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,QAAQ;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,QAAQ;AAAA,cACxB,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,IAAI;AAAA,cACpB,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ,CAAC;AAAA,QACT,OAAS;AAAA,QACT,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,kBAAkB,mBAAmB;AAAA,UACrD,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,IACA,MAAQ,CAAC;AAAA,IACT,QAAU,CAAC;AAAA,IACX,YAAc;AAAA,MACZ,aAAe,CAAC,OAAO,WAAW;AAAA,MAClC,MAAQ;AAAA,IACV;AAAA,IACA,UAAY;AAAA,MACV;AAAA,QACE,MAAQ;AAAA,UACN;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,iBAAiB;AAAA,cACnD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,UACN;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,eAAe;AAAA,cACjD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,eAAe;AAAA,cACjD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,UACN;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,gBAAgB;AAAA,cAClD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,gBAAgB;AAAA,cAClD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,gBAAgB;AAAA,cAClD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,UACN;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,oBAAoB;AAAA,cACtD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,oBAAoB;AAAA,cACtD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,oBAAoB;AAAA,cACtD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,oBAAoB;AAAA,cACtD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,UACN;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,yBAAyB;AAAA,cAC3D,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,yBAAyB;AAAA,cAC3D,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ,CAAC;AAAA,QACT,MAAQ,CAAC,kCAAkC;AAAA,QAC3C,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,UACN;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,yBAAyB;AAAA,cAC3D,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,yBAAyB;AAAA,cAC3D,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ;AAAA,UACN;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,iBAAiB;AAAA,cACnD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA;AAAA,YACE,OAAS;AAAA,YACT,MAAQ;AAAA,cACN,aAAe,CAAC,kBAAkB,iBAAiB;AAAA,cACnD,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ;AAAA,UACN;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAAA,QACA,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ,CAAC;AAAA,QACT,MAAQ,CAAC,4BAA4B;AAAA,QACrC,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ,CAAC;AAAA,QACT,MAAQ,CAAC,0BAA0B;AAAA,QACnC,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,MACA;AAAA,QACE,MAAQ,CAAC;AAAA,QACT,MAAQ,CAAC,8BAA8B;AAAA,QACvC,OAAS;AAAA,QACT,SAAW;AAAA,QACX,SAAW;AAAA,QACX,YAAc;AAAA,UACZ,aAAe,CAAC,OAAO,eAAe;AAAA,UACtC,MAAQ;AAAA,QACV;AAAA,QACA,UAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,MAAQ;AAAA,MACN,QAAU;AAAA,QACR,QAAU;AAAA,UACR,QAAU;AAAA,YACR;AAAA,cACE,QAAU;AAAA,gBACR,QAAU;AAAA,kBACR,QAAU;AAAA,oBACR;AAAA,sBACE,QAAU;AAAA,wBACR,MAAQ;AAAA,0BACN,KAAO;AAAA,0BACP,IAAM;AAAA,wBACR;AAAA,sBACF;AAAA,sBACA,MAAQ;AAAA,oBACV;AAAA,oBACA;AAAA,sBACE,QAAU;AAAA,wBACR,MAAQ;AAAA,0BACN,QAAU;AAAA,4BACR,MAAQ;AAAA,8BACN,KAAO;AAAA,8BACP,IAAM;AAAA,4BACR;AAAA,0BACF;AAAA,0BACA,UAAY;AAAA,wBACd;AAAA,sBACF;AAAA,sBACA,MAAQ;AAAA,oBACV;AAAA,oBACA;AAAA,sBACE,QAAU;AAAA,wBACR,MAAQ;AAAA,0BACN,QAAU;AAAA,4BACR,MAAQ;AAAA,8BACN,KAAO;AAAA,8BACP,IAAM;AAAA,4BACR;AAAA,0BACF;AAAA,0BACA,UAAY;AAAA,wBACd;AAAA,sBACF;AAAA,sBACA,MAAQ;AAAA,oBACV;AAAA,oBACA;AAAA,sBACE,QAAU;AAAA,wBACR,MAAQ;AAAA,0BACN,aAAe;AAAA,0BACf,MAAQ;AAAA,0BACR,UAAY;AAAA,4BACV,KAAK;AAAA,8BACH,QAAU,CAAC;AAAA,8BACX,MAAQ;AAAA,4BACV;AAAA,4BACA,KAAK;AAAA,8BACH,QAAU;AAAA,gCACR;AAAA,kCACE,QAAU;AAAA,oCACR,MAAQ;AAAA,sCACN,KAAO;AAAA,sCACP,IAAM;AAAA,oCACR;AAAA,kCACF;AAAA,kCACA,MAAQ;AAAA,gCACV;AAAA,8BACF;AAAA,8BACA,MAAQ;AAAA,4BACV;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,sBACA,MAAQ;AAAA,oBACV;AAAA,kBACF;AAAA,kBACA,MAAQ;AAAA,gBACV;AAAA,cACF;AAAA,cACA,MAAQ;AAAA,YACV;AAAA,YACA;AAAA,cACE,QAAU;AAAA,gBACR,QAAU;AAAA,kBACR,QAAU;AAAA,oBACR;AAAA,sBACE,QAAU;AAAA,wBACR,MAAQ;AAAA,0BACN,aAAe;AAAA,0BACf,MAAQ;AAAA,0BACR,UAAY;AAAA,4BACV,KAAK;AAAA,8BACH,QAAU,CAAC;AAAA,8BACX,MAAQ;AAAA,4BACV;AAAA,4BACA,KAAK;AAAA,8BACH,QAAU;AAAA,gCACR;AAAA,kCACE,QAAU;AAAA,oCACR,MAAQ;AAAA,sCACN,KAAO;AAAA,sCACP,IAAM;AAAA,oCACR;AAAA,kCACF;AAAA,kCACA,MAAQ;AAAA,gCACV;AAAA,8BACF;AAAA,8BACA,MAAQ;AAAA,4BACV;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,sBACA,MAAQ;AAAA,oBACV;AAAA,oBACA;AAAA,sBACE,QAAU;AAAA,wBACR,MAAQ;AAAA,0BACN,aAAe;AAAA,0BACf,MAAQ;AAAA,0BACR,UAAY;AAAA,4BACV,KAAK;AAAA,8BACH,QAAU,CAAC;AAAA,8BACX,MAAQ;AAAA,4BACV;AAAA,4BACA,KAAK;AAAA,8BACH,QAAU;AAAA,gCACR;AAAA,kCACE,QAAU;AAAA,oCACR,MAAQ;AAAA,sCACN,KAAO;AAAA,sCACP,IAAM;AAAA,oCACR;AAAA,kCACF;AAAA,kCACA,MAAQ;AAAA,gCACV;AAAA,8BACF;AAAA,8BACA,MAAQ;AAAA,4BACV;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,sBACA,MAAQ;AAAA,oBACV;AAAA,oBACA;AAAA,sBACE,QAAU;AAAA,wBACR,MAAQ;AAAA,0BACN,KAAO;AAAA,0BACP,IAAM;AAAA,wBACR;AAAA,sBACF;AAAA,sBACA,MAAQ;AAAA,oBACV;AAAA,oBACA;AAAA,sBACE,QAAU;AAAA,wBACR,MAAQ;AAAA,0BACN,aAAe;AAAA,0BACf,MAAQ;AAAA,0BACR,UAAY;AAAA,4BACV,KAAK;AAAA,8BACH,QAAU,CAAC;AAAA,8BACX,MAAQ;AAAA,4BACV;AAAA,4BACA,KAAK;AAAA,8BACH,QAAU;AAAA,gCACR;AAAA,kCACE,QAAU;AAAA,oCACR,MAAQ;AAAA,sCACN,KAAO;AAAA,sCACP,IAAM;AAAA,oCACR;AAAA,kCACF;AAAA,kCACA,MAAQ;AAAA,gCACV;AAAA,8BACF;AAAA,8BACA,MAAQ;AAAA,4BACV;AAAA,0BACF;AAAA,wBACF;AAAA,sBACF;AAAA,sBACA,MAAQ;AAAA,oBACV;AAAA,kBACF;AAAA,kBACA,MAAQ;AAAA,gBACV;AAAA,cACF;AAAA,cACA,MAAQ;AAAA,YACV;AAAA,UACF;AAAA,UACA,MAAQ;AAAA,QACV;AAAA,MACF;AAAA,MACA,UAAY;AAAA,IACd;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,WAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,OAAS,CAAC;AAAA,QACZ;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,UAAY;AAAA,YACV,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,WAAa;AAAA,QACf;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,SAAW;AAAA,YACT,UAAY;AAAA,cACV;AAAA,gBACE,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,SAAW;AAAA,YACT,UAAY;AAAA,cACV;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,SAAW;AAAA,YACT,UAAY;AAAA,cACV;AAAA,gBACE,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,kBAAkB,WAAW;AAAA,MACxC;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,WAAa;AAAA,YACX,QAAU;AAAA,cACR;AAAA,gBACE,MAAQ;AAAA,gBACR,UAAY;AAAA,cACd;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,kBAAkB,SAAS,WAAW;AAAA,MACjD;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,OAAS;AAAA,YACP,KAAO;AAAA,YACP,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,SAAW;AAAA,YACT,UAAY;AAAA,cACV;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,SAAW;AAAA,YACT,UAAY;AAAA,cACV;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,SAAW;AAAA,YACT,UAAY;AAAA,cACV;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,SAAW;AAAA,YACT,UAAY;AAAA,cACV;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,oBACR,UAAY;AAAA,kBACd;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,oBACR,UAAY;AAAA,kBACd;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,uBAAuB,UAAU,UAAU,SAAS,YAAY;AAAA,MAC3E;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,SAAW;AAAA,YACT,UAAY;AAAA,cACV;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,IACA;AAAA,MACE,IAAM;AAAA,MACN,MAAQ;AAAA,QACN,KAAO;AAAA,UACL,SAAW;AAAA,YACT,UAAY;AAAA,cACV;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,cACA;AAAA,gBACE,QAAU;AAAA,kBACR;AAAA,oBACE,MAAQ;AAAA,kBACV;AAAA,gBACF;AAAA,gBACA,OAAS;AAAA,gBACT,MAAQ;AAAA,cACV;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,QACA,QAAU;AAAA,UACR;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,UACA;AAAA,YACE,MAAQ;AAAA,YACR,MAAQ;AAAA,UACV;AAAA,QACF;AAAA,QACA,MAAQ,CAAC,QAAQ;AAAA,MACnB;AAAA,IACF;AAAA,EACF;AAAA,EACA,SAAW;AACb;;;ACh+BA,IAAAC,eAA0C;AAGnC,IAAM,qBACX,CAAC;AAAA,EACC;AAAA,EACA;AAAA,EACA;AACF,MAKA,OACE,UACA,iBACA,cAEA,SAAS;AAAA,EACP;AAAA,EACA,MAAM,eAAe,KAAK,SAAS,cAAc;AAAA,IAC/C;AAAA,QACA;AAAA,UACE,8BAAgB;AAAA;AAAA,QAEd,SACG,WAAW,aAAa,QAAQ,EAChC,MAAM;AAAA;AAAA,QAET,SACG,WAAW,aAAa,eAAe,EACvC,MAAM;AAAA;AAAA,QAET,SACG,WAAW,WAAW,CAAC,EACvB,MAAM;AAAA;AAAA,QAET,SACG,WAAW,kBAAkB,EAC7B,MAAM;AAAA;AAAA,QAET,SACG,WAAW,iBAAiB,EAC5B,MAAM;AAAA;AAAA,QAET,qBAAqB,aAAa,YAAY,UAAU,MAAM;AAAA,MAChE,CAAC;AAAA,IACH;AAAA,EACF,CAAC;AACH;;;AFxCG,IAAMC,kBAAqE,OAAO;AAAA,EACvF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,MAAI,CAAC,YAAY,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAE1D,QAAM,WAAW,IAAI,4BAAa;AAClC,QAAM,WAAW,IAAI,wBAAI,aAAQ;AAEjC,QAAM,eAAe,mBAAmB;AAAA,IACtC,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,UAAU,MAAM,QAAQ;AAAA,IAC5B,YAAY,IAAI,OAAO,EAAE,OAAO,QAAQ,MAAM;AAC5C,YAAM,SAAS,MAAM;AAAA,QACnB;AAAA,QACA,MAAM;AAAA,QACN,SAAS,YAAY,mBAAmB,EAAE,MAAM,CAAC,OAAO,CAAC;AAAA,MAC3D;AAEA,UAAI,CAAC,OAAO,OAAO,KAAM,OAAM,IAAI,MAAM,yBAAyB;AAElE,YAAM,QAAQ,SAAS,WAAW,WAAW,OAAO,OAAO,KAAK,IAAI,EAAE,SAAS;AAE/E,YAAM,UAAoB;AAAA,QACxB,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,SAAS,MAAM;AAAA,QACf;AAAA,MACF;AAEA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,SAAO,QAAQ;AAAA,IACb,CAAC,KAAK,WAAW;AACf,UAAI,OAAO,WAAW,YAAa,KAAI,QAAQ,KAAK,OAAO,KAAiB;AAAA,WACvE;AACH,cAAM,QAAQ,OAAO;AACrB,YAAI,OAAO,KAAK;AAAA,UACd,SAAS,MAAM;AAAA,UACf,SAAS,MAAM;AAAA,UACf;AAAA,QACF,CAAC;AAAA,MACH;AACA,aAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC5B;AACF;;;AGvEA,IAAAC,uBAAoB;AACpB,IAAAC,iBAA6B;AAC7B,IAAAC,gBAAyC;AACzC,IAAAC,8BAIO;AACP,IAAAC,qBAAuB;AAQhB,IAAMC,gBAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,OAAO,OAAQ,QAAO,CAAC;AAE5B,QAAM,WAAW,IAAI,4BAAa;AAClC,QAAM,WAAW,IAAI,yBAAI,aAAQ;AAGjC,QAAM,eAAe,mBAAmB;AAAA,IACtC,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,YAA2C,CAAC;AAElD,aAAW,eAAe,UAAU,CAAC,GAAG;AACtC,QAAI;AACF,UAAI,SAAS,aAAa,UAAU;AACpC,UAAI,WAAW,aAAa,YAAY;AACxC,YAAM,kBAAkB,aAAa,mBAAmB;AAExD,UAAI,oBAAoB,OAAW;AAEnC,aAAO,YAAY;AACjB,cAAM,CAAC,cAAc,cAAc,IAAI,MAAM,QAAQ,IAAI;AAAA,UACvD;AAAA,YACE;AAAA,YACA;AAAA,YACA,SAAS,YAAY,6BAA6B,EAAE,MAAM,CAAC,CAAC;AAAA,UAC9D;AAAA,UACA;AAAA,YACE;AAAA,YACA;AAAA,YACA,SAAS,YAAY,+BAA+B,EAAE,MAAM,CAAC,CAAC;AAAA,UAChE;AAAA,QACF,CAAC;AAGD,cAAM,aAAc,aAAa,OAAO,GAAG,QAAgB,IAAI;AAC/D,iBACE,OAAO,eAAe,YAAY,WAAW,WAAW,IAAI,QACxD;AAAA,UACE,SAAS;AAAA,YACP;AAAA;AAAA,YAEC,aAAa,OAAO,GAAG,QAAgB,IAAI;AAAA,UAC9C,GAAG;AAAA,QACL,GAAG,QAAQ,WAAW,EAAE,IACxB;AAGN,cAAM,eAAgB,eAAe,OAAO,GAAG,QAAgB,IAAI;AACnE,mBACE,OAAO,iBAAiB,YAAY,aAAa,WAAW,IAAI,QAC5D,2BAAY,YAAY,IACxB;AAAA,MACR,GAAG;AAEH,YAAM,SAAK,6CAAgB,WAAW,eAAe;AACrD,YAAM,QAAuB;AAAA,QAC3B;AAAA,QACA,MAAM;AAAA,QACN,UAAU;AAAA,QACV,WAAW,YAAY,aAAa;AAAA,QACpC;AAAA,QACA;AAAA,QACA,MAAM,aAAa,QAAQ;AAAA,QAC3B,MAAM,aAAa;AAAA,QACnB;AAAA,QACA;AAAA,MACF;AAEA,UAAI,aAAa,YAAa,OAAM,cAAc,aAAa;AAC/D,UAAI,aAAa,SAAU,OAAM,WAAW,aAAa;AAEzD,gBAAU,MAAM,EAAE,IAAI;AAAA,IACxB,SAAS,OAAO;AACd,kBAAI;AAAA,QACF,yCAAyC,YAAY,eAAe,KAAK,YAAY,MAAM,QAAQ,SAAS;AAAA,QAC3G,OAAiB,WAAW;AAAA,MAC/B;AAAA,IACF;AAAA,EACF;AAEA,aAAO,2BAAO,SAAS,EAAE,OAAO,CAAC,MAAM;AACrC,UAAM,SAAS,gDAAoB,UAAU,CAAC;AAG9C,WAAO,OAAO;AAAA,EAChB,CAAC;AACH;;;AC9GA,IAAAC,8BAA2D;AAC3D,IAAAC,iBAAiC;AAO1B,IAAMC,oBAAyE,CAAC;AAAA,EACrF;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,SAASC;AACf,QAAM,UAAU;AAEhB,QAAM,gBAAgB,iBAA2C,aAAa,UAAU,SAAS;AACjG,MAAI,gBAAgB,cAAc;AAChC,UAAM,IAAI;AAAA,MACR,kCAAkC,WAAW,kBAAkB,cAAc,YAAY;AAAA,IAC3F;AACF,QAAM,KAAK,qBAAqB,EAAE,QAAQ,SAAS,YAAY,CAAC;AAEhE,QAAM,EAAE,gBAAgB,QAAI,iCAAiB,WAAW;AAExD,MAAI,gBAAgB,UAAU;AAC5B,UAAM,IAAI;AAAA,MACR,iCAAiC,gBAAgB,OAAO;AAAA,IAC1D;AAEF,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,MAAM;AAAA,IACN,OAAO;AAAA,EACT;AACF;;;ACvCA,IAAAC,uBAAoB;AACpB,IAAAC,iBAA6B;AAC7B,IAAAC,gBAA2B;AAC3B,IAAAC,8BAA4C;AAC5C,IAAAC,iBAAiC;AACjC,IAAAC,uBAA6B;AAOtB,IAAMC,wBACX,OAAO,EAAE,MAAAC,OAAM,IAAI,OAAO,OAAO,aAAa,UAAU,MAAM;AAC5D,MAAI,KAAC,2CAAc,OAAOC,aAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,aAAW,GAAG;AAEnE,QAAM,gBAAY,0CAAa,MAAM,EAAE,EAAE;AACzC,QAAM,EAAE,QAAQ,QAAI,iCAAiB,WAAW;AAChD,QAAM,EAAE,OAAO,SAAS,IAAI,QAAQ,UAAU,aAAa,MAAM;AAEjE,QAAM,WAAW,IAAI,yBAAI,aAAQ;AACjC,QAAM,WAAW,IAAI,4BAAa;AAClC,QAAM,eAAe,mBAAmB;AAAA,IACtC,gBAAgB;AAAA,IAChB,SAAS;AAAA,IACT;AAAA,EACF,CAAC;AAGD,QAAM,OAAO,SAAS,YAAY,iBAAiB,EAAE,MAAM,CAAC,IAAI,OAAO,MAAS,CAAC;AACjF,QAAM,UAAU,SAAS,WAAW,WAAW,IAAI,EAAE,MAAM;AAE3D,QAAM,eAAe,MAAM,aAAaD,OAAM,MAAM,iBAAiB,IAAI;AAEzE,QAAM,OAAO,MAAM,IAAI;AAAA,IACrB,UAAM,2BAAK,MAAM,MAAM,eAAe;AAAA,IACtC,OAAO;AAAA,IACP,WAAW;AAAA,MACT,UAAU,aAAa,YAAY,QAAQ,SAAS;AAAA,MACpD,YAAY,aAAa,YAAY,UAAU,SAAS;AAAA,IAC1D;AAAA,IACA,uBAAuB,aAAa,eAAe,WAC/C,aAAa,eAAe,SAAS,SAAS,IAC9C;AAAA,IACJ,MAAM,4BAAO,QAAQ,OAAO;AAAA,EAC9B,CAAC;AAED,QAAM,WAAW,4BAAO,cAAU,0BAAW,CAAC,IAAI,WAAW,QAAQ,GAAG,IAAI,CAAC,CAAC;AAE9E,SAAO;AAAA,IACL,SAASA;AAAA,IACT,QAAQ,SAAS,MAAM;AAAA,EACzB;AACF;;;ACtDF,IAAAE,qBAAwB;AACxB,IAAAC,gBAAqD;AAOrD,IAAMC,yBAAwB;AAEvB,IAAMC,sBAA6E,CAAC;AAAA,EACzF;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,oBAAoB,OAAQ,YAAO,kBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,SAAO,IAAI,yBAAW,CAAC,eAAe;AACpC,UAAM,kBAAkB,IAAI,gBAAgB;AAI5C,UAAM,OAAO,YAAY;AACvB,UAAI;AACF,YAAI,gBAAgB,OAAO,QAAS;AAEpC,cAAM,WAAW,MAAMC,gBAAc;AAAA,UACnC;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF,CAAC;AAED,YAAI,gBAAgB,OAAO,QAAS;AAEpC,mBAAW,KAAK,QAAQ;AAExB,mBAAW,MAAMF,sBAAqB;AAAA,MACxC,SAAS,OAAO;AACd,oBAAI,MAAM,SAAS;AAAA,UACjB,QAAQG;AAAA,UACR;AAAA,UACA;AAAA,UACA,kBAAkB;AAAA,UAClB;AAAA,QACF,CAAC;AACD,mBAAW,MAAM,KAAK;AAAA,MACxB;AAAA,IACF;AAEA,SAAK;AAEL,WAAO,MAAM;AACX,sBAAgB,MAAM;AAAA,IACxB;AAAA,EACF,CAAC,EAAE,SAAK,oCAAqB,0BAAO,CAAC;AACvC;;;ACjDO,IAAM,wBAAyE;AAAA,EACpF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AChBA,IAAAC,8BAAoC;AACpC,IAAAC,cAAc;AAKP,IAAM,4BAA4B,YAAAC,QAAE,aAAa;AAAA,EACtD,iBAAiB,gDAAoB,MAAM;AAAA,EAC3C,GAAG,sBAAsB;AAC3B,CAAC;;;ACTD,IAAAC,8BAAqC;AAQ9B,IAAMC,gBAAc,iDAAqB,MAAM,KAAK;AACpD,IAAMC,aAAW,iDAAqB,MAAM,SAAS;;;ACT5D,IAAAC,iBAAuC;AACvC,IAAAC,gBAAyB;AASlB,IAAMC,gBAAe,CAC1B,WACA,aACA,iBACkC;AAClC,QAAM,uBAAuB,0BAA0B,WAAW,cAAc;AAAA,IAC9E,SAAS,CAAC,aAAa,MAAM,UAAU,UAAU;AAAA,EACnD,CAAC;AAED,SAAO,YACJ,IAAI,CAAC,EAAE,OAAO,QAAQ,MAAqC;AAC1D,UAAM,aAAa,sBAAsB;AAEzC,UAAM,cAAc,CAAC,cAA+B;AAClD,UAAI;AACF,eAAO,WAAY,KAAK,IAAI,aAAS,0BAAU,SAAS,CAAC;AAAA,MAC3D,QAAQ;AACN,eAAO;AAAA,MACT;AAAA,IACF;AAEA,UAAM,WAAW,YAAY,MAAM,SAAS;AAE5C,QAAI,CAAC,UAAU;AACb,kBAAI;AAAA,QACF,gCAAgC,SAAS,kBAAkB,MAAM,SAAS,MAAM,OAAO;AAAA,MACzF;AACA,aAAO;AAAA,IACT;AAEA,UAAM,eAAe,CAAC,YAA6B;AAQjD,YAAM,cAAU;AAAA,QACd;AAAA,QACA,QAAQ,CAAC;AAAA,QACT,sDAAsD,SAAS;AAAA,MACjE,KAAK,EAAE,MAAM,IAAI,UAAU,IAAI,QAAQ,GAAG;AAE1C,YAAM,QAAQ,SAAS,QAAQ,IAAI,SAAS;AAC5C,YAAM,YAAY,SAAS,YAAY,IAAI,SAAS;AACpD,YAAM,UAAU,SAAS,UAAU,IAAI,SAAS;AAEhD,YAAM,gBAAgD;AAAA,QACpD,EAAE,MAAM,QAAQ,OAAO,QAAQ,QAAQ,KAAK,SAAS,EAAE;AAAA,QACvD,EAAE,MAAM,YAAY,OAAO,YAAY,QAAQ,SAAS,SAAS,EAAE;AAAA,QACnE,EAAE,MAAM,UAAU,OAAO,UAAU,QAAQ,OAAO,SAAS,EAAE;AAAA,MAC/D;AAEA,aAAO;AAAA,QACL,QAAQ;AAAA,QACR,QAAQ;AAAA,QACR;AAAA,QACA;AAAA,QACA,SAAS,MAAM;AAAA,QACf,QAAQ;AAAA,MACV;AAAA,IACF;AAEA,WAAO;AAAA,MACL,WAAW,CAAC,QAAQ;AAAA,MACpB;AAAA,IACF;AAAA,EACF,CAAC,EACA,OAAO,sBAAQ;AACpB;;;ACzEO,IAAMC,kBAKQ,OAAO,EAAE,WAAW,qBAAqB,WAAW,aAAa,MAAM;AAC1F,MAAI,CAAC,oBAAoB,OAAQ,QAAO,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAElE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,MAAI,CAAC,cAAc,MAAM;AACvB,gBAAI,KAAK,yCAAyCC,aAAW,gBAAgB,SAAS,GAAG;AACzF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,gDAAgD;AAAA,MACnE,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,WAAWA,eAAa;AACvC,gBAAI,KAAK,qCAAqC,aAAa,MAAM,OAAOA,aAAW,GAAG;AACtF,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,+CAA+CA,aAAW,EAAE;AAAA,MAC/E,EAAE;AAAA,IACJ;AAAA,EACF;AACA,MAAI,aAAa,YAAY,WAAW;AACtC,gBAAI;AAAA,MACF,sCAAsC,aAAa,OAAO,OAAOA,aAAW,yBAAyB,SAAS;AAAA,IAChH;AACA,WAAO;AAAA,MACL,SAAS,CAAC;AAAA,MACV,QAAQ,YAAY,IAAI,CAAC,SAAS;AAAA,QAChC,SAAS,IAAI,MAAM;AAAA,QACnB,SAAS,IAAI;AAAA,QACb,OAAO,IAAI,MAAM,wCAAwC,SAAS,EAAE;AAAA,MACtE,EAAE;AAAA,IACJ;AAAA,EACF;AAEA,QAAM,UAAUC,cAAa,WAAW,aAAa,YAAY;AAEjE,QAAM,WAAW,MAAM,kBAAkB,WAAW,WAAW,OAAO;AAEtE,SAAO,YAAY;AAAA,IACjB,CAAC,KAAK,QAAQ;AACZ,YAAM,UAAU,SAAS;AAAA,QACvB,CAAC,MAAM,GAAG,YAAY,IAAI,WAAW,GAAG,YAAY,IAAI,MAAM;AAAA,MAChE;AACA,UAAI,QAAS,KAAI,QAAQ,KAAK,OAAO;AAAA;AAGnC,YAAI,QAAQ,KAAK;AAAA,UACf,SAAS,IAAI;AAAA,UACb;AAAA,UACA,SAAS,IAAI,MAAM;AAAA,UACnB,QAAQD;AAAA,UACR,QAAQ;AAAA,UACR,QAAQ;AAAA,YACN,EAAE,MAAM,QAAQ,OAAO,QAAQ,QAAQ,IAAI;AAAA,YAC3C,EAAE,MAAM,UAAU,OAAO,UAAU,QAAQ,IAAI;AAAA,UACjD;AAAA,QACF,CAAC;AACH,aAAO;AAAA,IACT;AAAA,IACA,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE;AAAA,EAC5B;AACF;;;AChFA,IAAAE,8BAAsD;AACtD,IAAAC,qBAAuB;AAKhB,IAAMC,gBAA8E,OAAO;AAAA,EAChG;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,MAAI,CAAC,cAAc,KAAM,QAAO,CAAC;AAKjC,SAAO,OAAO;AAAA,IACZ,CAAC,oBACC;AAAA,MACE;AAAA,QACE,QAAI,8CAAiB,WAAW,YAAY,SAAS;AAAA,QACrD,MAAMC;AAAA,QACN,UAAUC;AAAA,QACV;AAAA,QACA,WAAW,YAAY;AAAA,QACvB,QAAQ,YAAY,UAAU;AAAA,QAC9B,UAAU,YAAY,YAAY;AAAA,QAClC,MAAM,YAAY,QAAQ,YAAY,UAAU;AAAA,QAChD,oBAAoB,YAAY,sBAAsB;AAAA,QACtD,WAAW;AAAA,MACb;AAAA,MACA;AAAA,IACF;AAAA,EACJ;AACF;;;AClCA,IAAAC,8BAAqC;AACrC,IAAAC,iBAAkE;AAO3D,IAAMC,oBAKU,CAAC,EAAE,WAAW,aAAa,aAAa,OAAO,MAAM;AAC1E,QAAM,SAASC;AACf,QAAM,UAAU;AAEhB,QAAM,gBAAgB,iBAA2C,aAAa,UAAU,SAAS;AACjG,MAAI,gBAAgB,cAAc;AAChC,UAAM,IAAI;AAAA,MACR,kCAAkC,WAAW,kBAAkB,cAAc,YAAY;AAAA,IAC3F;AAEF,QAAM,KAAK,qBAAqB,EAAE,QAAQ,SAAS,YAAY,CAAC;AAEhE,QAAM,EAAE,gBAAgB,QAAI,iCAAiB,WAAW;AAExD,MAAI,gBAAgB,UAAU;AAC5B,UAAM,IAAI;AAAA,MACR,iCAAiC,gBAAgB,OAAO;AAAA,IAC1D;AAEF,QAAM,QAA2B,EAAE,UAAU,QAAQ,YAAY,SAAS;AAE1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,SAAS;AAAA,IACT,MAAMC,SAAQ,aAAa,MAAM,QAAQ;AAAA,IACzC;AAAA,EACF;AACF;AAEA,IAAMA,WAAU,CAAC,aAA4B,WAAyC;AACpF,QAAM,EAAE,UAAU,gBAAgB,QAAI,iCAAiB,WAAW;AAGlE,MAAI,CAAC,gBAAgB,iBAAiB,QAAQ,CAAC,UAAU,CAAC,EAAG,QAAO;AAEpE,sCAAgB,UAAU,CAAC,EAAE,QAAQ,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AAE3D,aAAO,+BAAe,QAAQ;AAChC;;;ACtDA,IAAAC,iBAA2B;AAC3B,IAAAC,8BAAmD;AACnD,IAAAC,iBAAkE;AAClE,IAAAC,uBAA6B;AAKtB,IAAMC,wBAIc,CAAC,EAAE,MAAAC,OAAM,IAAI,OAAO,OAAO,MAAM,aAAa,OAAO,MAAM;AACpF,MAAI,KAAC,2CAAc,OAAOC,aAAW;AACnC,UAAM,IAAI,MAAM,cAAc,MAAM,IAAI,WAAWA,aAAW,GAAG;AAEnE,QAAM,EAAE,QAAQ,QAAI,iCAAiB,WAAW;AAIhD,QAAM,UAAU,mBAAmB,IAAI,OAAO,OAAO,MAAM,MAAM;AACjE,QAAM,WAAW,uBAAuB,SAAS,OAAO;AAExD,SAAO;AAAA,IACL,SAASD;AAAA,IACT,QAAQ,SAAS,MAAM;AAAA,EACzB;AACF;AAEA,IAAME,qBAAoB,CAAC,SAA8B;AACvD,UAAQ,MAAM;AAAA,IACZ,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,IACT,KAAK;AACH,aAAO;AAAA,EACX;AACF;AAQA,IAAM,yBAAyB,CAAC,SAA0B,YAAsC;AAC9F,aAAW,EAAE,QAAQ,QAAQ,QAAQ,KAAK,SAAS;AACjD,QAAI;AACF,aAAO,cAAc,SAAS,QAAQ,QAAQ,QAAQ,CAAC;AAAA,IACzD,QAAQ;AAAA,IAER;AAAA,EACF;AACA,QAAM,IAAI,MAAM,4BAA4B;AAC9C;AAEA,IAAM,gBAAgB,CAAC,SAA0B,QAAgB,QAAgB,SAAkB;AACjG,QAAM,EAAE,UAAU,MAAM,IAAI,QAAQ,UAAU,QAAQ,MAAM;AAC5D,SAAO,4BAAO,cAAU,2BAAW,CAAC,IAAI,WAAW,QAAQ,GAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC;AACjF;AAEA,IAAM,qBAAqB,CACzB,IACA,OACA,OACA,MACA,WACqB;AACrB,QAAM,gBAAY,0BAAU,MAAM,SAAS;AAC3C,QAAM,SAASA,mBAAkB,IAAI;AAErC,SAAO;AAAA,IACL;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,QACd,UAAM,2BAAK,MAAM,EAAE;AAAA,QACnB,aAAa;AAAA,QACb,QAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,SAAS,OAAO;AAAA,QACd,MAAM;AAAA,QACN,aAAa;AAAA,QACb,QAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACF;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,MACP,WAAW,iBACP;AAAA,QACE,UAAM,2BAAK,MAAM,EAAE;AAAA,QACnB,aAAa;AAAA,QACb,WAAW;AAAA,MACb,IACA;AAAA,QACE,UAAM,2BAAK,MAAM,EAAE;AAAA,QACnB,aAAa;AAAA,QACb,QAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACR;AAAA,IACA;AAAA,MACE,QAAQ;AAAA,MACR;AAAA,MACA,SAAS,MACP,WAAW,iBACP;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,WAAW;AAAA,MACb,IACA;AAAA,QACE,MAAM;AAAA,QACN,aAAa;AAAA,QACb,QAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,IACR;AAAA,EACF,EAAE;AAAA,IACA,GAAI,QAAQ,WACR;AAAA,MACE;AAAA,QACE,QAAQ,OAAO;AAAA,QACf;AAAA,QACA,SAAS,MACP,WAAW,iBACP;AAAA,UACE,UAAM,2BAAK,MAAM,EAAE;AAAA,UACnB,aAAa;AAAA,UACb,WAAW;AAAA,QACb,IACA;AAAA,UACE,UAAM,2BAAK,MAAM,EAAE;AAAA,UACnB,aAAa;AAAA,UACb,QAAQ,OAAO,KAAK;AAAA,QACtB;AAAA,MACR;AAAA,MACA;AAAA,QACE,QAAQ,OAAO;AAAA,QACf;AAAA,QACA,SAAS,MACP,WAAW,iBACP;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,WAAW;AAAA,QACb,IACA;AAAA,UACE,MAAM;AAAA,UACN,aAAa;AAAA,UACb,QAAQ,OAAO,KAAK;AAAA,QACtB;AAAA,MACR;AAAA,IACF,IACA,CAAC;AAAA,EACP;AACF;;;ACjKA,IAAAC,gBAAwB;AAQjB,IAAMC,sBAKY,CAAC,EAAE,WAAW,qBAAqB,WAAW,aAAa,MAAM;AACxF,MAAI,CAAC,oBAAoB,OAAQ,YAAO,kBAAG,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC;AAEtE,QAAM,cAAc,eAAmC,mBAAmB;AAE1E,QAAM,UAAUC,cAAa,WAAW,aAAa,YAAY;AAEjE,SAAO,iBAAiB,WAAW,WAAW,OAAO,EAAE;AAAA,QACrD,mBAAI,CAAC,cAAc;AAAA,MACjB,SAAS;AAAA,MACT,QAAQ,CAAC;AAAA,IACX,EAAE;AAAA,EACJ;AACF;;;ACZO,IAAM,yBAKT;AAAA,EACF,MAAMC;AAAA,EACN,UAAUC;AAAA,EACV,iBAAAC;AAAA,EACA,aAAAC;AAAA,EACA,eAAAC;AAAA,EACA,mBAAAC;AAAA,EACA,qBAAAC;AACF;;;AC3BA,IAAAC,8BAAqC;AACrC,IAAAC,cAAc;AAKP,IAAM,6BAA6B,YAAAC,QAAE,aAAa;AAAA,EACvD,WAAW,iDAAqB,MAAM;AAAA,EACtC,GAAG,sBAAsB;AAAA;AAAA,EAGzB,QAAQ,YAAAA,QAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,UAAU,YAAAA,QAAE,OAAO;AAAA,EACnB,oBAAoB,YAAAA,QAAE,OAAO,EAAE,SAAS;AAC1C,CAAC;AAKM,IAAM,8BAA8B,YAAAA,QAAE,aAAa;AAAA,EACxD,UAAU,YAAAA,QAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAKM,IAAM,mCAAmC,YAAAA,QAAE,aAAa;AAAA,EAC7D,UAAU,YAAAA,QAAE,OAAO;AACrB,CAAC;;;ACfM,IAAM,kBAAkB;AAAA,EAC7B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACxBA,kBAAkC;AAClC,IAAAC,gBAA6B;AAG7B,IAAM,QAAQ,oBAAI,IAAoC;AAE/C,IAAM,iBAAiB,OAC5B,gBACA,cACG;AACH,MAAI,MAAM,IAAI,SAAS,EAAG,QAAO,MAAM,IAAI,SAAS;AAEpD,QAAM,cAAU;AAAA,IACd,CAAC,QAAQ,QAAQ,gBACf,eAAe,KAAK,WAAW,QAAQ,QAAQ,aAAa,EAAE,cAAc,KAAK,CAAC;AAAA;AAAA;AAAA,IAGpF;AAAA,EACF;AAEA,QAAM,IAAI,WAAW,OAAO;AAE5B,MAAI;AACF,WAAO,MAAM;AAAA,EACf,SAAS,OAAO;AACd,YAAI,4BAAa,KAAK,EAAG,OAAM;AAC/B,UAAM,IAAI,MAAM,2CAA2C,SAAS,IAAI,EAAE,MAAM,CAAC;AAAA,EACnF,UAAE;AACA,UAAM,OAAO,SAAS;AAAA,EACxB;AACF;;;AC5BA,IAAM,yBAAyB,oBAAI,IAA6B;AAEhE,IAAM,mBAAmB,OAAO,gBAAoC,cAA4B;AAC9F,QAAM,EAAE,YAAY,IAAI,MAAM,eAAe;AAAA,IAC3C;AAAA,IACA;AAAA,IACA,CAAC;AAAA,IACD;AAAA,EACF;AACA,SAAO;AACT;AAKO,IAAM,iBAAiB,OAC5B,gBACA,cACG;AACH,MAAI,uBAAuB,IAAI,SAAS,EAAG,QAAO,uBAAuB,IAAI,SAAS;AAEtF,QAAM,UAAU,iBAAiB,gBAAgB,SAAS;AAE1D,yBAAuB,IAAI,WAAW,OAAO;AAE7C,MAAI;AACF,WAAO,MAAM;AAAA,EACf,SAAS,OAAO;AACd,UAAM,IAAI,MAAM,2CAA2C,SAAS,IAAI,EAAE,MAAM,CAAC;AAAA,EACnF,UAAE;AACA,2BAAuB,OAAO,SAAS;AAAA,EACzC;AACF;;;AjIxBA,IAAM,cAAc,CAAC,WAAmB,gBAAwB,GAAG,SAAS,IAAI,WAAW;AAE3F,IAAMC,SAAQ,oBAAI,IAAqC;AAGvD,IAAM,OAAO,IAAI,eAAAC,QAAO,EAAE,aAAa,EAAE,CAAC;AAEnC,IAAM,mBAAmB,OAC9B,gBACA,mBACA,WACA,gBACG;AACH,MAAI,gBAAgB,OAAW,eAAc,MAAM,eAAe,gBAAgB,SAAS;AAE3F,QAAM,WAAW,YAAY,WAAW,WAAW;AACnD,MAAID,OAAM,IAAI,QAAQ,EAAG,QAAOA,OAAM,IAAI,QAAQ;AAElD,QAAM,UAAU,KAAK;AAAA,IAAI,MACvB,mBAAmB,gBAAgB,mBAAmB,WAAW,WAAW;AAAA,EAC9E;AAGA,EAAAA,OAAM,IAAI,UAAU,OAAO;AAE3B,MAAI;AACF,WAAO,MAAM;AAAA,EACf,SAAS,OAAO;AACd,IAAAA,OAAM,OAAO,QAAQ;AACrB,UAAM,IAAI,MAAM,2CAA2C,SAAS,IAAI,EAAE,MAAM,CAAC;AAAA,EACnF;AACF;AAEA,IAAM,qBAAqB,OACzB,gBACA,mBACA,SACA,gBACG;AACH,QAAM,QAAQ,YAAY,IAAI;AAC9B,cAAI,KAAK,gDAAgD,OAAO;AAEhE,MAAI;AACF,UAAM,UAAU,MAAM,kBAAkB,eAAe,SAAS,UAAU;AAC1E,QAAI,CAAC,QAAS,OAAM,IAAI,MAAM,WAAW,OAAO,iCAAiC;AAEjF,UAAM,cAAc,MAAM,eAAe,gBAAgB,OAAO;AAEhE,WAAO,QAAQ;AAAA,MACb,gBAAgB,OAAO,CAAC,MAAM,EAAE,aAAa,UAAU,EAAE;AAAA,QAAI,CAAC,QAC5D,IAAI,gBAAgB;AAAA,UAClB,WAAW;AAAA,UACX;AAAA,UACA;AAAA,UACA,QAAQ,QAAQ,iBAAiB,IAAI,IAAI;AAAA,QAC3C,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF,UAAE;AACA,gBAAI;AAAA,MACF;AAAA,MACA;AAAA,OACC,YAAY,IAAI,IAAI,OAAO,QAAQ,CAAC;AAAA,IACvC;AAAA,EACF;AACF;;;ADPA,IAAM,kBAAmC;AAAA,EACvC,UAAU,CAAC;AAAA,EACX,eAAe,CAAC;AAClB;AAEO,IAAM,mBAAN,MAAuB;AAAA,EAC5B;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE,mBACA,iBACA,UAA2B,iBAC3B;AACA,SAAK,qBAAqB;AAC1B,SAAK,mBAAmB;AACxB,SAAK,WAAW,IAAI,8BAAyC;AAAA,MAC3D,cAAU,0BAAM,QAAQ,SAAS,OAAO,sBAAQ,GAAG,CAAC,MAAM,aAAa,CAAC,CAAC;AAAA,MACzE,mBAAe,0BAAM,QAAQ,cAAc,OAAO,sBAAQ,GAAG,CAAC,MAAM,EAAE,EAAE;AAAA,IAC1E,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,WAAW;AACb,WAAO,KAAK,SAAS;AAAA,UACnB;AAAA,QACE,CAAC,EAAE,UAAU,cAAc,OAAwB;AAAA,UACjD,cAAU,2BAAO,QAAQ,EAAE,OAAO,sBAAQ,EAAE,KAAK,eAAe;AAAA,UAChE,mBAAe,2BAAO,aAAa,EAAE,OAAO,sBAAQ,EAAE,KAAK,oBAAoB;AAAA,QACjF;AAAA,YACA,2BAAY,CAAC;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAAA,EAEA,IAAY,6BAA6B;AACvC,WAAO,KAAK,SAAS;AAAA,UACnB,mBAAI,CAAC,gBAAY,0BAAM,QAAQ,eAAe,CAAC,MAAM,EAAE,EAAE,CAAC;AAAA,UAC1D,oCAAmD,0BAAO;AAAA,UAC1D,2BAAY,CAAC;AAAA,IACf;AAAA,EACF;AAAA;AAAA,EAGO,aAAa,oBAA4E;AAC9F,WAAO,KAAK,2BAA2B,kBAAkB,EAAE;AAAA,UACzD;AAAA;AAAA,QAEE,CAACE,4BACC,4BAAQA,mBAAkB,EAAE;AAAA,UAC1B,CAAC,KAAK,CAAC,SAAS,SAAS,MAAM;AAC7B,kBAAM,gBAAY,0CAAa,OAAO,EAAE;AACxC,gBAAI,CAAC,IAAI,SAAS,EAAG,KAAI,SAAS,IAAI,CAAC;AACvC,gBAAI,SAAS,EAAE,OAAO,IAAI;AAC1B,mBAAO;AAAA,UACT;AAAA,UACA,CAAC;AAAA,QACH;AAAA,MACJ;AAAA,UACA,yBAAU,CAAC,kCAAkC;AAE3C,YAAI,KAAC,yBAAK,6BAA6B,EAAE,OAAQ,YAAO,kBAAG,EAAE,SAAS,OAAO,SAAS,CAAC,EAAE,CAAC;AAG1F,mBAAO,6BAAc;AAAA,UACnB,aAAS,qBAAM,GAAM,EAAE;AAAA,gBACrB,mBAAI,MAAM,IAAI;AAAA,gBACd,yBAAU,KAAK;AAAA,UACjB;AAAA,UACA,aAAS;AAAA,gBACP,4BAAQ,6BAA6B,EAAE;AAAA,cAAI,CAAC,CAAC,SAAS,MACpD,KAAK,oBAAoB,WAAW,8BAA8B,SAAS,CAAC;AAAA,YAC9E;AAAA,UACF;AAAA,QACF,CAAC;AAAA,MACH,CAAC;AAAA,UACD;AAAA;AAAA,QAEE,CAAC,EAAE,SAAS,QAAQ,OAAuB;AAAA,UACzC,QACE,CAAC,WAAW,QAAQ,KAAK,CAAC,EAAE,OAAO,MAAM,WAAW,cAAc,IAC9D,iBACA;AAAA,UACN,UAAU,QACP;AAAA,YAAQ,CAAC,WACR,OAAO,SAAS;AAAA,cACd,CAAC,MAAiB,WAAW,EAAE,WAAW,SAAS,EAAE,GAAG,GAAG,QAAQ,QAAQ,IAAI;AAAA,YACjF;AAAA,UACF,EACC,KAAK,eAAe;AAAA,UACvB,kBAAkB,QAAQ,QAAQ,CAAC,WAAW,OAAO,gBAAgB;AAAA,QACvE;AAAA,MACF;AAAA,UACA,oCAAqC,0BAAO;AAAA,IAC9C;AAAA,EACF;AAAA,EAEO,cAAc,oBAAqE;AACxF,eAAO;AAAA,MACL,KAAK,aAAa,kBAAkB,EAAE;AAAA,YACpC,sBAAO,CAAC,EAAE,OAAO,MAAM,WAAW,MAAM;AAAA,YACxC,mBAAI,CAAC,EAAE,SAAS,MAAM,QAAQ;AAAA,MAChC;AAAA,IACF;AAAA,EACF;AAAA,EAEO,qBAAqB,SAAwC;AAClE,WAAO,sBAAsB,OAAO;AAAA,EACtC;AAAA,EAEQ,oBACN,WACA,oBAC4B;AAC5B,UAAM,WAAW,KAAK,mBAAmB,gBAAgB,SAAS;AAClE,UAAM,iBAAiB,KAAK,mBAAmB,kBAAkB;AAEjE,eAAO,6BAAc,CAAC,UAAU,cAAc,CAAC,EAAE;AAAA,UAC/C,yBAAU,CAAC,CAAC,SAAS,aAAa,MAAM;AACtC,cAAM,yBAA0C,4BAAQ,kBAAkB,EAAE;AAAA,UAC1E,CAAC,CAAC,SAAS,SAAS,MAAM,CAAC,cAAc,OAAO,GAAG,SAAS;AAAA,QAC9D;AAEA,mBAAO;AAAA,UACL,gBAAgB,OAAO,CAAC,QAAQ,IAAI,aAAa,SAAS,QAAQ,EAAE,IAAI,CAAC,QAAQ;AAC/E,kBAAM,sBAAsB,mBAAmB;AAAA,cAC7C,CAAC,CAAC,KAAK,MAAM,MAAM,SAAS,IAAI;AAAA,YAClC;AAEA,oBAAQ,IAAI,UAAU;AAAA,cACpB,KAAK,YAAY;AACf,uBAAO,KAAK,kCAAkC,WAAW,qBAAqB,GAAG;AAAA,cACnF;AAAA,cACA,KAAK,UAAU;AACb,uBAAO,KAAK,gCAAgC,WAAW,qBAAqB,GAAG;AAAA,cACjF;AAAA,cACA,KAAK,YAAY;AACf,uBAAO,KAAK,kCAAkC,WAAW,qBAAqB,GAAG;AAAA,cACnF;AAAA,cACA,SAAS;AACP,4BAAI,KAAK,sDAAsD,EAAE,WAAW,IAAI,CAAC;AACjF,2BAAO,kBAAmB,EAAE,QAAQ,QAAQ,UAAU,CAAC,GAAG,kBAAkB,CAAC,EAAE,CAAC;AAAA,cAClF;AAAA,YACF;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA,UACD,mBAAI,CAAC,YAA4B;AAE/B,cAAM,kBAAkB,QAAQ,QAAQ,CAAC,WAAW,OAAO,gBAAgB;AAC3E,cAAM,gBAAgB,gBACnB,IAAI,CAAC,cAAc,KAAK,SAAS,MAAM,SAAS,SAAS,CAAC,EAC1D,OAAO,sBAAQ,EACf,IAAI,CAAC,OAAiB,EAAE,GAAG,GAAG,QAAQ,QAAQ,EAAE;AAEnD,eAAO;AAAA,UACL,QAAQ,QAAQ,KAAK,CAAC,EAAE,OAAO,MAAM,WAAW,cAAc,IAAI,iBAAiB;AAAA,UACnF,UAAU,QACP,QAAQ,CAAC,WAAW,OAAO,QAAQ,EACnC,OAAO,aAAa,EACpB,KAAK,eAAe;AAAA,UACvB,kBAAkB,CAAC;AAAA,QACrB;AAAA,MACF,CAAC;AAAA,UACD,oCAAqC,0BAAO;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,kCACN,WACA,qBACA,KAC4B;AAC5B,eAAO;AAAA,MACL;AAAA,MACA,EAAE,WAAW,KAAK,oBAAoB;AAAA,MACtC,MAAM;AACJ,YAAI,CAAC,oBAAoB;AACvB,qBAAO,kBAAmB,EAAE,QAAQ,QAAQ,UAAU,CAAC,GAAG,kBAAkB,CAAC,EAAE,CAAC;AAElF,cAAM,+BAA2B;AAAA,UAC/B,oBAAoB,IAAI,CAAC,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC;AAAA,QACvE;AAGA,cAAM,iBAAa,4BAAQ,wBAAwB,EAAE;AAAA,UAAQ,CAAC,CAAC,SAAS,SAAS,MAC/E,UAAU,IAAI,CAAC,YAAY,aAAa,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,QAC/D;AAEA,YAAI,CAAC,KAAK,iBAAiB,WAAW;AACpC,sBAAI,KAAK,gEAAgE,IAAI,IAAI;AACjF,qBAAO;AAAA,YAAM,UACX,kBAAmB;AAAA,cACjB,QAAQ;AAAA,cACR,UAAU,KAAK,kBAAkB,wBAAwB;AAAA,cACzD,kBAAkB,CAAC;AAAA,YACrB,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,kBAAkB,KAAK,yBAAyB,SAAS,EAAE;AAAA,cAC/D,mBAAI,CAAC,kBAAkB,cAAc,KAAK,CAAC,MAAM,EAAE,WAAW,IAAI,IAAI,CAAC;AAAA,cACvE;AAAA,YAAU,CAAC,iBACT,IAAI,kBAAkB;AAAA,cACpB;AAAA,cACA;AAAA,cACA,WAAW,KAAK,iBAAiB;AAAA,cACjC;AAAA,YACF,CAAC;AAAA,UACH;AAAA,cACA,0BAAW,MAAM,mBAAK;AAAA;AAAA,cACtB,mBAAI,CAAC,YAAY;AACf,gBAAI,QAAQ,eAAe,QAAQ;AAEjC,mBAAK,mBAAmB,sBAAsB,QAAQ,aAAa;AAAA,YACrE;AAAA,UACF,CAAC;AAAA,cACD;AAAA,YACE,CAAC,aAA6B;AAAA,cAC5B,QAAQ;AAAA;AAAA,cAER,UAAU,QAAQ,QAAQ,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE,MAAM,SAAS,EAAE;AAAA,cACxE,kBAAkB,QAAQ,OAAO;AAAA,gBAAI,CAAC,EAAE,SAAS,QAAQ,MACvD,aAAa,EAAE,SAAS,QAAQ,CAAC;AAAA,cACnC;AAAA,YACF;AAAA,UACF;AAAA,cACA,mBAAI,CAAC,YAAY;AACf,iBAAK,eAAe,YAAY,OAAO;AAAA,UACzC,CAAC;AAAA;AAAA,cAED,2BAAY,EAAE,UAAU,MAAM,YAAY,EAAE,CAAC;AAAA,cAC7C,yBAAU,CAAC;AAAA,QACb;AAGA,mBAAO;AAAA,UAAM,MACX,gBAAgB;AAAA,gBACd,yBAA0B;AAAA,cACxB,QAAQ;AAAA,cACR,UAAU,KAAK,kBAAkB,wBAAwB;AAAA,cACzD,kBAAkB,CAAC;AAAA,YACrB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,kCACN,WACA,qBACA,KAC4B;AAC5B,eAAO;AAAA,MACL;AAAA,MACA,EAAE,WAAW,KAAK,oBAAoB;AAAA,MACtC,MAAM;AACJ,YAAI,CAAC,oBAAoB;AACvB,qBAAO,kBAAmB,EAAE,QAAQ,QAAQ,UAAU,CAAC,GAAG,kBAAkB,CAAC,EAAE,CAAC;AAElF,cAAM,+BAA2B;AAAA,UAC/B,oBAAoB,IAAI,CAAC,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC;AAAA,QACvE;AAGA,cAAM,iBAAa,4BAAQ,wBAAwB,EAAE;AAAA,UAAQ,CAAC,CAAC,SAAS,SAAS,MAC/E,UAAU,IAAI,CAAC,YAAY,aAAa,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,QAC/D;AAEA,YAAI,CAAC,KAAK,iBAAiB,KAAK;AAC9B,sBAAI,KAAK,+CAA+C,IAAI,IAAI;AAChE,qBAAO;AAAA,YAAM,UACX,kBAAmB;AAAA,cACjB,QAAQ;AAAA,cACR,UAAU,KAAK,kBAAkB,wBAAwB;AAAA,cACzD,kBAAkB,CAAC;AAAA,YACrB,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,kBAAkB,IACrB,kBAAkB;AAAA,UACjB;AAAA,UACA;AAAA,UACA,WAAW,KAAK,iBAAiB;AAAA,QACnC,CAAC,EACA;AAAA,cACC,0BAAW,MAAM,mBAAK;AAAA;AAAA,cACtB;AAAA,YACE,CAAC,aAA6B;AAAA,cAC5B,QAAQ;AAAA;AAAA,cAER,UAAU,QAAQ,QAAQ,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE,MAAM,SAAS,EAAE;AAAA,cACxE,kBAAkB,QAAQ,OAAO;AAAA,gBAAI,CAAC,EAAE,SAAS,QAAQ,MACvD,aAAa,EAAE,SAAS,QAAQ,CAAC;AAAA,cACnC;AAAA,YACF;AAAA,UACF;AAAA,cACA,mBAAI,CAAC,YAAY;AACf,iBAAK,eAAe,YAAY,OAAO;AAAA,UACzC,CAAC;AAAA;AAAA,cAED,2BAAY,EAAE,UAAU,MAAM,YAAY,EAAE,CAAC;AAAA,cAC7C,yBAAU,CAAC;AAAA,QACb;AAGF,mBAAO;AAAA,UAAM,MACX,gBAAgB;AAAA,gBACd,yBAA0B;AAAA,cACxB,QAAQ;AAAA,cACR,UAAU,KAAK,kBAAkB,wBAAwB;AAAA,cACzD,kBAAkB,CAAC;AAAA,YACrB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,gCACN,WACA,qBACA,KAC4B;AAC5B,eAAO;AAAA,MACL;AAAA,MACA,EAAE,WAAW,KAAK,oBAAoB;AAAA,MACtC,MAAM;AACJ,YAAI,CAAC,oBAAoB;AACvB,qBAAO,kBAAmB,EAAE,QAAQ,QAAQ,UAAU,CAAC,GAAG,kBAAkB,CAAC,EAAE,CAAC;AAElF,cAAM,+BAA2B;AAAA,UAC/B,oBAAoB,IAAI,CAAC,CAAC,OAAO,SAAS,MAAM,CAAC,MAAM,IAAI,SAAS,CAAC;AAAA,QACvE;AAGA,cAAM,iBAAa,4BAAQ,wBAAwB,EAAE;AAAA,UAAQ,CAAC,CAAC,SAAS,SAAS,MAC/E,UAAU,IAAI,CAAC,YAAY,aAAa,EAAE,SAAS,QAAQ,CAAC,CAAC;AAAA,QAC/D;AAEA,YAAI,CAAC,KAAK,iBAAiB,QAAQ;AACjC,sBAAI,KAAK,6CAA6C,IAAI,IAAI;AAC9D,qBAAO;AAAA,YAAM,UACX,kBAAmB;AAAA,cACjB,QAAQ;AAAA,cACR,UAAU,KAAK,kBAAkB,wBAAwB;AAAA,cACzD,kBAAkB,CAAC;AAAA,YACrB,CAAC;AAAA,UACH;AAAA,QACF;AAEA,cAAM,kBAAkB,IACrB,kBAAkB;AAAA,UACjB;AAAA,UACA;AAAA,UACA,WAAW,KAAK,iBAAiB;AAAA,QACnC,CAAC,EACA;AAAA,cACC,0BAAW,MAAM,mBAAK;AAAA;AAAA,cACtB;AAAA,YACE,CAAC,aAA6B;AAAA,cAC5B,QAAQ;AAAA;AAAA,cAER,UAAU,QAAQ,QAAQ,OAAO,CAAC,MAAM,IAAI,QAAQ,CAAC,EAAE,MAAM,SAAS,EAAE;AAAA,cACxE,kBAAkB,QAAQ,OAAO;AAAA,gBAAI,CAAC,EAAE,SAAS,QAAQ,MACvD,aAAa,EAAE,SAAS,QAAQ,CAAC;AAAA,cACnC;AAAA,YACF;AAAA,UACF;AAAA,cACA,mBAAI,CAAC,YAAY;AACf,iBAAK,eAAe,YAAY,OAAO;AAAA,UACzC,CAAC;AAAA;AAAA,cAED,2BAAY,EAAE,UAAU,MAAM,YAAY,EAAE,CAAC;AAAA,cAC7C,yBAAU,CAAC;AAAA,QACb;AAGF,mBAAO;AAAA,UAAM,MACX,gBAAgB;AAAA,gBACd,yBAA0B;AAAA,cACxB,QAAQ;AAAA,cACR,UAAU,KAAK,kBAAkB,wBAAwB;AAAA,cACzD,kBAAkB,CAAC;AAAA,YACrB,CAAC;AAAA,UACH;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,eAAe,YAAsB,gBAAgC;AAC3E,QAAI,eAAe,WAAW,OAAQ;AAEtC,UAAM,UAAU,KAAK,SAAS,SAAS;AACvC,UAAM,eAAW;AAAA,MACf,CAAC;AAAA,MACD,QAAQ;AAAA;AAAA,UAER;AAAA,QACE,WACG,OAAO,CAAC,QAAQ,CAAC,eAAe,iBAAiB,SAAS,GAAG,CAAC,EAC9D,IAAI,CAAC,cAAc,CAAC,WAAW,MAAS,CAAC;AAAA,MAC9C;AAAA,UACA;AAAA;AAAA,QAEE,eAAe,SAAS,IAAI,CAAC,OAAO,EAAE,GAAG,GAAG,QAAQ,QAAQ,EAAE;AAAA,QAC9D,CAAC,MAAM,aAAa,CAAC;AAAA,MACvB;AAAA,IACF;AAGA,eAAW,kBAAkB,eAAe,kBAAkB;AAC5D,YAAM,UAAU,SAAS,cAAc;AACvC,UAAI,QAAS,SAAQ,SAAS;AAAA,IAChC;AAEA,SAAK,SAAS,SAAK,2BAAO,CAAC,GAAG,SAAS,EAAE,SAAS,CAAC,CAAC;AAAA,EACtD;AAAA,EAEQ,yBAAyB,WAAkD;AACjF,eAAO,mCAAoB,6CAA6C,EAAE,UAAU,GAAG,MAAM;AAC3F,aAAO,KAAK,mBAAmB,gBAAgB,SAAS,EAAE;AAAA,YACxD;AAAA,UAAU,CAAC,gBACT,0CAAa,OAAO,IAChB,KAAK,uBAAuB,SAAS,EAAE;AAAA,gBACrC;AAAA,cAAU,CAAC,gBACT,gBAAgB,WAAO,kBAAG,CAAC,CAAC,IAAI,KAAK,kBAAkB,WAAW,WAAW;AAAA,YAC/E;AAAA,UACF,QACA,kBAAG,CAAC,CAAC;AAAA,QACX;AAAA,YACA,oCAAqC,0BAAO;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,uBAAuB,WAAiD;AAC9E,eAAO;AAAA,UACL,wBAAU,MAAM,eAAe,KAAK,iBAAiB,WAAY,SAAS,GAAG;AAAA,QAC3E,OAAO;AAAA,QACP,aAAa,CAAC,QAAQ;AACpB,sBAAI,KAAK,yDAAyD,WAAW,GAAG;AAChF,iBAAO;AAAA,QACT;AAAA,MACF,CAAC;AAAA,IACH,EAAE;AAAA,UACA,0BAAW,MAAM;AACf,oBAAI,KAAK,4CAA4C,SAAS;AAC9D,mBAAO,kBAAG,IAAqB;AAAA,MACjC,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,kBACN,WACA,aAC4B;AAC5B,UAAM,kBAAkB,gBAAgB,OAAO,CAAC,QAAQ,IAAI,aAAa,UAAU,EAAE;AAAA,MACnF,CAAC,QACC,qBAAqB;AAAA,QACnB,SAAS;AAAA,QACT;AAAA,QACA,QAAQ,IAAI;AAAA,MACd,CAAC;AAAA,IACL;AAEA,eAAO,6BAAc;AAAA,MACnB,sBAAsB,KAAK,yBAAyB,eAAe;AAAA,MACnE,qBAAqB,KAAK,wBAAwB,eAAe;AAAA,IACnE,CAAC,EAAE;AAAA,UACD,yBAAU,CAAC,EAAE,qBAAqB,qBAAqB,MAAM;AAC3D,YAAI,qBAAsB,YAAO,kBAAG,oBAAoB;AACxD,YAAI,oBAAqB,YAAO,kBAAG,mBAAmB;AACtD,YAAI,CAAC,KAAK,iBAAiB,UAAW,YAAO,kBAAG,CAAC,CAAC;AAElD,mBAAO;AAAA,cACL;AAAA,YACE;AAAA;AAAA,cAEE;AAAA,gBACE,KAAK,iBAAiB;AAAA,gBACtB,KAAK;AAAA,gBACL;AAAA,gBACA;AAAA,cACF;AAAA;AAAA,YACF;AAAA,cACE,OAAO;AAAA,cACP,aAAa,CAAC,QAAQ;AACpB,4BAAI,KAAK,oDAAoD,WAAW,GAAG;AAC3E,uBAAO;AAAA,cACT;AAAA,YACF;AAAA,UACF;AAAA,QACF,EAAE;AAAA,cACA,0BAAW,MAAM;AACf,wBAAI,KAAK,wCAAwC,SAAS;AAC1D,uBAAO,kBAAG,CAAC,CAAC;AAAA,UACd,CAAC;AAAA;AAAA,cAED,mBAAI,CAAC,qBAAqB;AACxB,gBAAI,CAAC,iBAAiB,OAAQ;AAC9B,kBAAM,UAAU,KAAK,SAAS,SAAS;AACvC,kBAAM,oBAAgB;AAAA;AAAA,kBAEpB;AAAA,oBACE,2BAAO,QAAQ,aAAa,EAAE,OAAO,CAAC,MAAM,EAAE,YAAY,SAAS;AAAA,gBACnE,CAAC,MAAM,EAAE;AAAA,cACX;AAAA;AAAA,kBAEA,0BAAM,kBAAkB,CAAC,MAAM,EAAE,EAAE;AAAA,YACrC;AAEA,iBAAK,SAAS,SAAK,2BAAO,CAAC,GAAG,SAAS,EAAE,cAAc,CAAC,CAAC;AAAA,UAC3D,CAAC;AAAA,QACH;AAAA,MACF,CAAC;AAAA;AAAA,UAED,oCAAqC,0BAAO;AAAA,IAC9C;AAAA,EACF;AAAA,EAEQ,wBAAwB,iBAA8D;AAC5F,WAAO,KAAK,2BAA2B;AAAA,UACrC,mBAAI,CAAC,YAAY;AACf,cAAM,gBAAgB,gBAAgB,IAAI,CAAC,OAAO,QAAQ,EAAE,CAAC;AAC7D,eAAO,cAAc,UAAU,cAAc,MAAM,sBAAQ,IAAI,gBAAgB;AAAA,MACjF,CAAC;AAAA;AAAA,UAED,oCAA4C,0BAAO;AAAA,IACrD;AAAA,EACF;AAAA,EAEQ,yBAAyB,iBAA8D;AAC7F,WAAO,KAAK,mBAAmB,sBAAsB;AAAA,UACnD,mBAAI,CAAC,YAAY;AACf,cAAM,gBAAgB,gBAAgB,IAAI,CAAC,OAAO,QAAQ,EAAE,CAAC;AAC7D,eAAO,cAAc,UAAU,cAAc,MAAM,sBAAQ,IAAI,gBAAgB;AAAA,MACjF,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,kBAAkB,kBAA8C;AACtE,UAAM,kBAAc,4BAAQ,gBAAgB,EAAE;AAAA,MAAQ,CAAC,CAAC,SAAS,SAAS,MACxE,UAAU,IAAI,CAAC,YAAY,CAAC,SAAS,OAAO,CAAuB;AAAA,IACrE;AAEA,WAAO,YACJ,IAAI,CAAC,CAAC,SAAS,OAAO,MAAM,KAAK,SAAS,MAAM,SAAS,aAAa,EAAE,SAAS,QAAQ,CAAC,CAAC,CAAC,EAC5F,OAAO,sBAAQ,EACf,KAAK,eAAe;AAAA,EACzB;AAAA,EAEQ,2BAA2B,oBAAgD;AACjF,WAAO,KAAK,mBAAmB,oBAAoB,EAAE;AAAA,UACnD,mBAAI,CAAC,iBAA6C;AAChD,mBAAO;AAAA,cACL,4BAAQ,kBAAkB,EACvB,IAAI,CAAC,CAAC,SAAS,SAAS,MAAM;AAC7B,kBAAM,gBAAY,0CAAa,OAAO,EAAE;AACxC,kBAAM,UAAU,aAAa,SAAS;AACtC,mBAAO;AAAA,cACL;AAAA,kBACA,yBAAK,UAAU,IAAI,+BAAgB,CAAC,EAAE;AAAA,gBACpC,CAAC,YAAY,WAAW,+BAA+B,SAAS,OAAO;AAAA,cACzE;AAAA,YACF;AAAA,UACF,CAAC,EACA,OAAO,CAAC,CAAC,EAAE,SAAS,MAAM,UAAU,SAAS,CAAC;AAAA,QACnD;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAM,yCAAyC,CAAC,SAAkB,aAA8B;AAC9F,UAAQ,QAAQ,UAAU;AAAA,IACxB,KAAK;AACH,aAAO,aAAa;AAAA,IACtB,KAAK;AACH,aAAO,aAAa;AAAA,IACtB,KAAK,YAAY;AACf,cAAQ,QAAQ,SAAS;AAAA,QACvB,KAAK;AACH,iBAAO,aAAa;AAAA,QACtB,KAAK;AACH,iBAAO,aAAa;AAAA,QACtB;AACE,gBAAM,IAAI,MAAM,6CAA6C,QAAQ,OAAO,EAAE;AAAA,MAClF;AAAA,IACF;AAAA,IACA;AACE,kBAAI,KAAK,gCAAgC,OAAO;AAChD,YAAM,IAAI,MAAM,8BAA8B;AAAA,EAClD;AACF;AASA,IAAM,iCAAiC,CAAC,SAAkB,YAAoB;AAE5E,QAAM,sBAAkB,8CAA8B,OAAO;AAC7D,SAAO,uCAAuC,SAAS,eAAe;AACxE;AAEA,IAAM,kBAAkB,CAAC,GAAa,MAAgB,aAAa,CAAC,EAAE,cAAc,aAAa,CAAC,CAAC;AAEnG,IAAM,uBAAuB,CAAC,GAAiB,MAAoB,EAAE,GAAG,cAAc,EAAE,EAAE;;;AmI1qB1F,IAAAC,8BAAqC;","names":["import_chaindata_provider","import_crypto","import_util","import_lodash_es","import_rxjs","import_viem","anylogger","import_chaindata_provider","import_viem","import_viem","import_chaindata_provider","import_viem","z","import_chaindata_provider","import_crypto","import_viem","from","import_lodash_es","import_chaindata_provider","import_v4","import_chaindata_provider","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_crypto","fetchBalances","MODULE_TYPE","import_chaindata_provider","import_lodash_es","fetchTokens","MODULE_TYPE","PLATFORM","getMiniMetadata","import_chaindata_provider","import_crypto","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_crypto","import_lodash_es","import_viem","fetchBalances","MODULE_TYPE","BigNumber","import_chaindata_provider","import_lodash_es","import_v4","import_viem","getErc20ContractData","getTypedContract","TokenCacheSchema","z","fetchTokens","getErc20ContractData","MODULE_TYPE","PLATFORM","getMiniMetadata","import_chaindata_provider","import_crypto","import_viem","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_crypto","fetchBalances","MODULE_TYPE","publicKey","import_chaindata_provider","import_lodash_es","fetchTokens","MODULE_TYPE","PLATFORM","getMiniMetadata","import_web3","import_chaindata_provider","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_web3","import_chaindata_provider","import_util","import_lodash_es","module","import_scale","import_lodash_es","import_rxjs","import_scale","api","import_chaindata_provider","import_lodash_es","import_rxjs","fetchBalances","MODULE_TYPE","import_web3","import_chaindata_provider","import_lodash_es","import_v4","TokenCacheSchema","z","fetchTokens","MODULE_TYPE","PLATFORM","getMiniMetadata","import_spl_token","import_web3","import_chaindata_provider","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_scale","import_util","fetchBalances","MODULE_TYPE","import_chaindata_provider","import_scale","import_lodash_es","fetchTokens","MODULE_TYPE","import_chaindata_provider","import_scale","import_chaindata_provider","import_token_rates","import_util","import_bignumber","import_chaindata_provider","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_scale","import_util","import_lodash_es","import_chaindata_provider","fetchBalances","MODULE_TYPE","balance","values","import_chaindata_provider","import_scale","import_util","import_lodash_es","fetchTokens","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","import_utils","import_chaindata_provider","import_scale","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","extra","query","filter","BigNumber","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","getData","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","import_rxjs","subscribeBalances","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_scale","import_util","buildQueries","fetchBalances","MODULE_TYPE","buildQueries","import_chaindata_provider","import_scale","import_lodash_es","fetchTokens","MODULE_TYPE","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","getData","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","getTransferMethod","getEncodedArgs","getTransferEncodedArgs","getTransferAllEncodedArgs","getEncodedValue","import_rxjs","subscribeBalances","buildQueries","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_lodash_es","fetchBalances","MODULE_TYPE","addresses","import_chaindata_provider","import_scale","import_lodash_es","fetchTokens","MODULE_TYPE","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","getData","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_scale","import_util","upperFirst","value","import_scale","import_utils","import_polkadot_api","amount","fetchBalances","MODULE_TYPE","import_chaindata_provider","import_lodash_es","import_v4","fetchTokens","z","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","getTransferMethod","getEncodedArgs","getTransferEncodedArgs","getTransferAllEncodedArgs","getEncodedValue","import_rxjs","subscribeBalances","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_types","import_util","fetchBalances","import_api_contract","import_types","import_util","import_chaindata_provider","import_lodash_es","fetchTokens","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","import_api_contract","import_types","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_scale","import_util","buildQueries","fetchBalances","MODULE_TYPE","buildQueries","import_chaindata_provider","import_lodash_es","fetchTokens","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","getData","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","getTransferMethod","import_rxjs","subscribeBalances","buildQueries","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_util","CACHE","PQueue","addressesByTokenId","import_chaindata_provider"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/BalancesProvider.ts","../src/getMiniMetadatas/index.ts","../src/log.ts","../package.json","../src/modules/evm-erc20/config.ts","../src/modules/evm-erc20/fetchBalances.ts","../src/modules/abis/erc20BalancesAggregator.ts","../src/modules/abis/multicall.ts","../src/modules/abis/uniswapV2Pair.ts","../src/modules/shared/errors.ts","../src/modules/shared/types.ts","../src/modules/evm-erc20/fetchTokens.ts","../src/modules/evm-erc20/utils.ts","../src/modules/evm-erc20/getMiniMetadata.ts","../src/modules/evm-erc20/getTransferCallData.ts","../src/modules/evm-erc20/subscribeBalances.ts","../src/modules/evm-erc20/module.ts","../src/modules/evm-erc20/types.ts","../src/types/tokens.ts","../src/modules/evm-native/config.ts","../src/modules/evm-native/fetchBalances.ts","../src/modules/evm-native/fetchTokens.ts","../src/modules/evm-native/getMiniMetadata.ts","../src/modules/evm-native/getTransferCallData.ts","../src/modules/evm-native/subscribeBalances.ts","../src/modules/evm-native/module.ts","../src/modules/evm-native/types.ts","../src/modules/evm-uniswapv2/config.ts","../src/modules/evm-uniswapv2/fetchBalances.ts","../src/modules/evm-uniswapv2/fetchTokens.ts","../src/modules/evm-uniswapv2/utils.ts","../src/modules/evm-uniswapv2/getMiniMetadata.ts","../src/modules/evm-uniswapv2/getTransferCallData.ts","../src/modules/evm-uniswapv2/subscribeBalances.ts","../src/modules/evm-uniswapv2/module.ts","../src/modules/evm-uniswapv2/types.ts","../src/modules/sol-native/config.ts","../src/modules/sol-native/fetchBalances.ts","../src/modules/sol-native/fetchTokens.ts","../src/modules/sol-native/getMiniMetadata.ts","../src/modules/sol-native/getTransferCallData.ts","../src/modules/sol-native/subscribeBalances.ts","../src/modules/sol-native/module.ts","../src/modules/sol-native/types.ts","../src/modules/sol-spl/config.ts","../src/modules/sol-spl/fetchBalances.ts","../src/modules/shared/buildNetworkStorageCoders.ts","../src/modules/shared/fetchRuntimeCallResult.ts","../src/modules/shared/rpcQueryPack.ts","../src/modules/shared/utils.ts","../src/modules/shared/detectedTokens.ts","../src/modules/sol-spl/fetchTokens.ts","../src/modules/sol-spl/getMiniMetadata.ts","../src/modules/sol-spl/getTransferCallData.ts","../src/modules/sol-spl/subscribeBalances.ts","../src/modules/sol-spl/module.ts","../src/modules/sol-spl/types.ts","../src/modules/substrate-assets/config.ts","../src/modules/substrate-assets/buildQueries.ts","../src/modules/substrate-assets/fetchBalances.ts","../src/modules/substrate-assets/fetchTokens.ts","../src/modules/substrate-assets/getMiniMetadata.ts","../src/types/balances.ts","../src/modules/substrate-dtao/alphaPrice.ts","../src/modules/substrate-dtao/getDtaoTokenRates.ts","../src/modules/substrate-dtao/config.ts","../src/modules/substrate-dtao/fetchBalances.ts","../src/modules/substrate-dtao/calculatePendingRootClaimable.ts","../src/modules/substrate-dtao/fetchTokens.ts","../src/modules/substrate-dtao/getMiniMetadata.ts","../src/modules/substrate-dtao/getTransferCallData.ts","../src/modules/substrate-dtao/subscribeBalances.ts","../src/modules/substrate-dtao/module.ts","../src/modules/substrate-dtao/types.ts","../src/types/balancetypes.ts","../src/types/minimetadatas.ts","../src/modules/substrate-assets/getTransferCallData.ts","../src/modules/substrate-assets/subscribeBalances.ts","../src/modules/substrate-assets/module.ts","../src/modules/substrate-assets/types.ts","../src/modules/substrate-foreignassets/config.ts","../src/modules/substrate-foreignassets/buildQueries.ts","../src/modules/substrate-foreignassets/fetchBalances.ts","../src/modules/substrate-foreignassets/fetchTokens.ts","../src/modules/substrate-foreignassets/getMiniMetadata.ts","../src/modules/substrate-foreignassets/getTransferCallData.ts","../src/modules/substrate-foreignassets/subscribeBalances.ts","../src/modules/substrate-foreignassets/module.ts","../src/modules/substrate-foreignassets/types.ts","../src/modules/substrate-hydration/config.ts","../src/modules/substrate-hydration/fetchBalances.ts","../src/modules/substrate-hydration/fetchTokens.ts","../src/modules/substrate-hydration/getMiniMetadata.ts","../src/modules/substrate-hydration/getTransferCallData.ts","../src/modules/substrate-hydration/subscribeBalances.ts","../src/modules/substrate-hydration/module.ts","../src/modules/substrate-hydration/types.ts","../src/modules/substrate-native/config.ts","../src/modules/substrate-native/queries/buildBaseQueries.ts","../src/modules/substrate-native/util/lockTypes.ts","../src/modules/substrate-native/queries/buildNomPoolQueries.ts","../src/modules/substrate-native/util/nompoolAccountId.ts","../src/modules/substrate-native/fetchBalances.ts","../src/modules/substrate-native/fetchTokens.ts","../src/modules/substrate-native/getMiniMetadata.ts","../src/modules/substrate-native/getTransferCallData.ts","../src/modules/substrate-native/subscribeBalances.ts","../src/modules/substrate-native/module.ts","../src/modules/substrate-native/types.ts","../src/modules/substrate-psp22/config.ts","../src/modules/substrate-psp22/fetchBalances.ts","../src/modules/abis/psp22.json","../src/modules/substrate-psp22/util.ts","../src/modules/substrate-psp22/fetchTokens.ts","../src/modules/substrate-psp22/getMiniMetadata.ts","../src/modules/substrate-psp22/getTransferCallData.ts","../src/modules/substrate-psp22/subscribeBalances.ts","../src/modules/substrate-psp22/module.ts","../src/modules/substrate-psp22/types.ts","../src/modules/substrate-tokens/config.ts","../src/modules/substrate-tokens/buildQueries.ts","../src/modules/substrate-tokens/fetchBalances.ts","../src/modules/substrate-tokens/fetchTokens.ts","../src/modules/substrate-tokens/getMiniMetadata.ts","../src/modules/substrate-tokens/getTransferCallData.ts","../src/modules/substrate-tokens/subscribeBalances.ts","../src/modules/substrate-tokens/module.ts","../src/modules/substrate-tokens/types.ts","../src/modules/index.ts","../src/getMiniMetadatas/getMetadataRpc.ts","../src/getMiniMetadatas/getSpecVersion.ts","../src/version.ts"],"sourcesContent":["export * from \"./BalancesProvider\"\nexport * from \"./modules\"\nexport * from \"./types\"\nexport * from \"./version\"\n","import {\n type AnyMiniMetadata,\n type ChaindataProvider,\n type DotNetworkId,\n isNetworkDot,\n type Network,\n type NetworkId,\n parseTokenId,\n type Token,\n type TokenId,\n} from \"@talismn/chaindata-provider\"\nimport {\n type AccountPlatform,\n getAccountPlatformFromAddress,\n normalizeAddress,\n} from \"@talismn/crypto\"\nimport { getSharedObservable, isNotNil, isTruthy, keepAlive } from \"@talismn/util\"\nimport { assign, fromPairs, isEqual, keyBy, keys, toPairs, uniq, values } from \"lodash-es\"\nimport {\n BehaviorSubject,\n catchError,\n combineLatest,\n defer,\n distinctUntilChanged,\n EMPTY,\n filter,\n firstValueFrom,\n from,\n map,\n type Observable,\n of,\n shareReplay,\n startWith,\n switchMap,\n tap,\n timer,\n} from \"rxjs\"\nimport { withRetry } from \"viem\"\n\nimport { BALANCE_MODULES, Balance, type ChainConnectors } from \".\"\nimport { getMiniMetadatas, getSpecVersion } from \"./getMiniMetadatas\"\nimport log from \"./log\"\nimport { getDetectedTokensIds$ } from \"./modules/shared/detectedTokens\"\nimport {\n type Address,\n deriveMiniMetadataId,\n getBalanceId,\n type IBalance,\n type MiniMetadata,\n} from \"./types\"\nimport type { TokensWithAddresses } from \"./types/IBalanceModule\"\n\ntype BalancesStatus = \"initialising\" | \"live\"\n\nexport type BalancesResult = {\n status: BalancesStatus\n balances: IBalance[]\n failedBalanceIds: string[] // balance ids that failed to fetch\n}\n\nexport type BalancesStorage = {\n balances: IBalance[]\n miniMetadatas: MiniMetadata[]\n}\n\ntype ProviderBalancesStorage = {\n balances: Record<string, IBalance>\n miniMetadatas: Record<string, MiniMetadata>\n}\n\nconst DEFAULT_STORAGE: BalancesStorage = {\n balances: [],\n miniMetadatas: [],\n}\n\nexport class BalancesProvider {\n #chaindataProvider: ChaindataProvider\n #chainConnectors: ChainConnectors\n #storage: BehaviorSubject<ProviderBalancesStorage>\n\n constructor(\n chaindataProvider: ChaindataProvider,\n chainConnectors: ChainConnectors,\n storage: BalancesStorage = DEFAULT_STORAGE\n ) {\n this.#chaindataProvider = chaindataProvider\n this.#chainConnectors = chainConnectors\n this.#storage = new BehaviorSubject<ProviderBalancesStorage>({\n balances: keyBy(storage.balances.filter(isNotNil), (b) => getBalanceId(b)),\n miniMetadatas: keyBy(storage.miniMetadatas.filter(isNotNil), (m) => m.id),\n })\n }\n\n get storage$() {\n return this.#storage.pipe(\n map(\n ({ balances, miniMetadatas }): BalancesStorage => ({\n balances: values(balances).filter(isNotNil).sort(sortByBalanceId),\n miniMetadatas: values(miniMetadatas).filter(isNotNil).sort(sortByMiniMetadataId),\n }),\n shareReplay(1)\n )\n )\n }\n\n private get storedMiniMetadataMapById$() {\n return this.#storage.pipe(\n map((storage) => keyBy(storage.miniMetadatas, (m) => m.id)),\n distinctUntilChanged<Record<string, MiniMetadata>>(isEqual),\n shareReplay(1)\n )\n }\n\n // this is the only public method\n public getBalances$(addressesByTokenId: Record<TokenId, Address[]>): Observable<BalancesResult> {\n return this.cleanupAddressesByTokenId$(addressesByTokenId).pipe(\n map(\n // split by network\n (addressesByTokenId): Record<NetworkId, Record<TokenId, Address[]>> =>\n toPairs(addressesByTokenId).reduce(\n (acc, [tokenId, addresses]) => {\n const networkId = parseTokenId(tokenId).networkId\n if (!acc[networkId]) acc[networkId] = {}\n acc[networkId][tokenId] = addresses\n return acc\n },\n {} as Record<NetworkId, Record<TokenId, Address[]>>\n )\n ),\n switchMap((addressesByTokenIdByNetworkId) => {\n // after cleanup we might end up without entries to fetch, which would break the combineLatest below\n if (!keys(addressesByTokenIdByNetworkId).length) return of({ isStale: false, results: [] })\n\n // fetch balances and start a 30s timer to mark the whole subscription live after 30s\n return combineLatest({\n isStale: timer(30_000).pipe(\n map(() => true),\n startWith(false)\n ),\n results: combineLatest(\n toPairs(addressesByTokenIdByNetworkId).map(([networkId]) =>\n this.getNetworkBalances$(networkId, addressesByTokenIdByNetworkId[networkId])\n )\n ),\n })\n }),\n map(\n // combine\n ({ isStale, results }): BalancesResult => ({\n status:\n !isStale && results.some(({ status }) => status === \"initialising\")\n ? \"initialising\"\n : \"live\",\n balances: results\n .flatMap((result) =>\n result.balances.map(\n (b): IBalance => (isStale && b.status !== \"live\" ? { ...b, status: \"stale\" } : b)\n )\n )\n .sort(sortByBalanceId),\n failedBalanceIds: results.flatMap((result) => result.failedBalanceIds),\n })\n ),\n distinctUntilChanged<BalancesResult>(isEqual)\n )\n }\n\n public fetchBalances(addressesByTokenId: Record<TokenId, Address[]>): Promise<IBalance[]> {\n return firstValueFrom(\n this.getBalances$(addressesByTokenId).pipe(\n filter(({ status }) => status === \"live\"),\n map(({ balances }) => balances)\n )\n )\n }\n\n public getDetectedTokensId$(address: string): Observable<TokenId[]> {\n return getDetectedTokensIds$(address)\n }\n\n private getNetworkBalances$(\n networkId: string,\n addressesByTokenId: Record<TokenId, Address[]>\n ): Observable<BalancesResult> {\n const network$ = this.#chaindataProvider.getNetworkById$(networkId)\n const tokensMapById$ = this.#chaindataProvider.getTokensMapById$()\n\n return combineLatest([network$, tokensMapById$]).pipe(\n switchMap(([network, tokensMapById]) => {\n const tokensAndAddresses: TokensWithAddresses = toPairs(addressesByTokenId).map(\n ([tokenId, addresses]) => [tokensMapById[tokenId], addresses] as [Token, Address[]]\n )\n\n return combineLatest(\n BALANCE_MODULES.filter((mod) => mod.platform === network?.platform).map((mod) => {\n const tokensWithAddresses = tokensAndAddresses.filter(\n ([token]) => token.type === mod.type\n )\n\n switch (mod.platform) {\n case \"ethereum\": {\n return this.getEthereumNetworkModuleBalances$(networkId, tokensWithAddresses, mod)\n }\n case \"solana\": {\n return this.getSolanaNetworkModuleBalances$(networkId, tokensWithAddresses, mod)\n }\n case \"polkadot\": {\n return this.getPolkadotNetworkModuleBalances$(networkId, tokensWithAddresses, mod)\n }\n default: {\n log.warn(\"[balances] Unsupported network platform for module\", { networkId, mod })\n return of<BalancesResult>({ status: \"live\", balances: [], failedBalanceIds: [] })\n }\n }\n })\n )\n }),\n map((results): BalancesResult => {\n // for each balance that could not be fetched, see if we have a stored balance and return it, marked as stale\n const errorBalanceIds = results.flatMap((result) => result.failedBalanceIds)\n const staleBalances = errorBalanceIds\n .map((balanceId) => this.#storage.value.balances[balanceId])\n .filter(isNotNil)\n .map((b): IBalance => ({ ...b, status: \"stale\" }))\n\n return {\n status: results.some(({ status }) => status === \"initialising\") ? \"initialising\" : \"live\",\n balances: results\n .flatMap((result) => result.balances)\n .concat(staleBalances)\n .sort(sortByBalanceId),\n failedBalanceIds: [],\n }\n }),\n distinctUntilChanged<BalancesResult>(isEqual)\n )\n }\n\n private getPolkadotNetworkModuleBalances$(\n networkId: DotNetworkId,\n tokensWithAddresses: TokensWithAddresses,\n mod: Extract<(typeof BALANCE_MODULES)[number], { platform: \"polkadot\" }>\n ): Observable<BalancesResult> {\n return getSharedObservable(\n `BalancesProvider.getPolkadotNetworkModuleBalances$`,\n { networkId, mod, tokensWithAddresses },\n () => {\n if (!tokensWithAddresses.length)\n return of<BalancesResult>({ status: \"live\", balances: [], failedBalanceIds: [] })\n\n const moduleAddressesByTokenId = fromPairs(\n tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])\n )\n\n // all balance ids expected in result set\n const balanceIds = toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) =>\n addresses.map((address) => getBalanceId({ tokenId, address }))\n )\n\n if (!this.#chainConnectors.substrate) {\n log.warn(\"[balances] no substrate connector or miniMetadata for module\", mod.type)\n return defer(() =>\n of<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n }\n\n const moduleBalances$ = this.getNetworkMiniMetadatas$(networkId).pipe(\n map((miniMetadatas) => miniMetadatas.find((m) => m.source === mod.type)),\n switchMap((miniMetadata) =>\n mod.subscribeBalances({\n networkId,\n tokensWithAddresses,\n connector: this.#chainConnectors.substrate!,\n miniMetadata: miniMetadata as AnyMiniMetadata,\n })\n ),\n catchError(() => EMPTY), // don't emit, let provider mark balances stale\n tap((results) => {\n if (results.dynamicTokens?.length) {\n // register missing tokens in the chaindata provider\n this.#chaindataProvider.registerDynamicTokens(results.dynamicTokens)\n }\n }),\n map(\n (results): BalancesResult => ({\n status: \"live\",\n // exclude zero balances\n balances: results.success.filter((b) => new Balance(b).total.planck > 0n),\n failedBalanceIds: results.errors.map(({ tokenId, address }) =>\n getBalanceId({ tokenId, address })\n ),\n })\n ),\n tap((results) => {\n this.updateStorage$(balanceIds, results)\n }),\n // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change\n shareReplay({ refCount: true, bufferSize: 1 }),\n keepAlive(0)\n )\n\n // defer the startWith call to start with up to date balances each time the observable is re-subscribed to\n return defer(() =>\n moduleBalances$.pipe(\n startWith<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n )\n }\n )\n }\n\n private getEthereumNetworkModuleBalances$(\n networkId: DotNetworkId,\n tokensWithAddresses: TokensWithAddresses,\n mod: Extract<(typeof BALANCE_MODULES)[number], { platform: \"ethereum\" }>\n ): Observable<BalancesResult> {\n return getSharedObservable(\n `BalancesProvider.getEthereumNetworkModuleBalances$`,\n { networkId, mod, tokensWithAddresses },\n () => {\n if (!tokensWithAddresses.length)\n return of<BalancesResult>({ status: \"live\", balances: [], failedBalanceIds: [] })\n\n const moduleAddressesByTokenId = fromPairs(\n tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])\n )\n\n // all balance ids expected in result set\n const balanceIds = toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) =>\n addresses.map((address) => getBalanceId({ tokenId, address }))\n )\n\n if (!this.#chainConnectors.evm) {\n log.warn(\"[balances] no ethereum connector for module\", mod.type)\n return defer(() =>\n of<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n }\n\n const moduleBalances$ = mod\n .subscribeBalances({\n networkId,\n tokensWithAddresses,\n connector: this.#chainConnectors.evm,\n })\n .pipe(\n catchError(() => EMPTY), // don't emit, let provider mark balances stale\n map(\n (results): BalancesResult => ({\n status: \"live\",\n // exclude zero balances\n balances: results.success.filter((b) => new Balance(b).total.planck > 0n),\n failedBalanceIds: results.errors.map(({ tokenId, address }) =>\n getBalanceId({ tokenId, address })\n ),\n })\n ),\n tap((results) => {\n this.updateStorage$(balanceIds, results)\n }),\n // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change\n shareReplay({ refCount: true, bufferSize: 1 }),\n keepAlive(0)\n )\n\n // defer the startWith call to start with up to date balances each time the observable is re-subscribed to\n return defer(() =>\n moduleBalances$.pipe(\n startWith<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n )\n }\n )\n }\n\n private getSolanaNetworkModuleBalances$(\n networkId: DotNetworkId,\n tokensWithAddresses: TokensWithAddresses,\n mod: Extract<(typeof BALANCE_MODULES)[number], { platform: \"solana\" }>\n ): Observable<BalancesResult> {\n return getSharedObservable(\n `BalancesProvider.getSolanaNetworkModuleBalances$`,\n { networkId, mod, tokensWithAddresses },\n () => {\n if (!tokensWithAddresses.length)\n return of<BalancesResult>({ status: \"live\", balances: [], failedBalanceIds: [] })\n\n const moduleAddressesByTokenId = fromPairs(\n tokensWithAddresses.map(([token, addresses]) => [token.id, addresses])\n )\n\n // all balance ids expected in result set\n const balanceIds = toPairs(moduleAddressesByTokenId).flatMap(([tokenId, addresses]) =>\n addresses.map((address) => getBalanceId({ tokenId, address }))\n )\n\n if (!this.#chainConnectors.solana) {\n log.warn(\"[balances] no solana connector for module\", mod.type)\n return defer(() =>\n of<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n }\n\n const moduleBalances$ = mod\n .subscribeBalances({\n networkId,\n tokensWithAddresses,\n connector: this.#chainConnectors.solana,\n })\n .pipe(\n catchError(() => EMPTY), // don't emit, let provider mark balances stale\n map(\n (results): BalancesResult => ({\n status: \"live\",\n // exclude zero balances\n balances: results.success.filter((b) => new Balance(b).total.planck > 0n),\n failedBalanceIds: results.errors.map(({ tokenId, address }) =>\n getBalanceId({ tokenId, address })\n ),\n })\n ),\n tap((results) => {\n this.updateStorage$(balanceIds, results)\n }),\n // shareReplay + keepAlive(0) keep the subscription alive while root observable is being unsubscribed+resubscribed, in case any input change\n shareReplay({ refCount: true, bufferSize: 1 }),\n keepAlive(0)\n )\n\n // defer the startWith call to start with up to date balances each time the observable is re-subscribed to\n return defer(() =>\n moduleBalances$.pipe(\n startWith<BalancesResult>({\n status: \"initialising\",\n balances: this.getStoredBalances(moduleAddressesByTokenId),\n failedBalanceIds: [],\n })\n )\n )\n }\n )\n }\n\n private updateStorage$(balanceIds: string[], balancesResult: BalancesResult) {\n if (balancesResult.status !== \"live\") return\n\n const storage = this.#storage.getValue()\n const failedIds = new Set(balancesResult.failedBalanceIds)\n const balances = assign(\n {},\n storage.balances,\n // delete all balances expected in the result set (except the ones that failed). because if they are not present it means they are empty.\n fromPairs(\n balanceIds.filter((bid) => !failedIds.has(bid)).map((balanceId) => [balanceId, undefined])\n ),\n keyBy(\n // storage balances must have status \"cache\", because they are used as start value when initialising subsequent subscriptions\n balancesResult.balances.map((b) => ({ ...b, status: \"cache\" })),\n (b) => getBalanceId(b)\n )\n )\n\n // update status of stale balances\n for (const errorBalanceId of balancesResult.failedBalanceIds) {\n const balance = balances[errorBalanceId] as IBalance\n if (balance) balance.status = \"stale\"\n }\n\n this.#storage.next(assign({}, storage, { balances }))\n }\n\n private getNetworkMiniMetadatas$(networkId: NetworkId): Observable<MiniMetadata[]> {\n return getSharedObservable(`BalancesProvider.getNetworkMiniMetadatas$`, { networkId }, () => {\n return this.#chaindataProvider.getNetworkById$(networkId).pipe(\n switchMap((network) =>\n isNetworkDot(network)\n ? this.getNetworkSpecVersion$(networkId).pipe(\n switchMap((specVersion) =>\n specVersion === null ? of([]) : this.getMiniMetadatas$(networkId, specVersion)\n )\n )\n : of([])\n ),\n distinctUntilChanged<MiniMetadata[]>(isEqual)\n )\n })\n }\n\n private getNetworkSpecVersion$(networkId: NetworkId): Observable<number | null> {\n return from(\n withRetry(() => getSpecVersion(this.#chainConnectors.substrate!, networkId), {\n delay: 2_000,\n shouldRetry: (err) => {\n log.warn(\"Failed to fetch spec version for network, retrying...\", networkId, err)\n return true // don't give up mate!\n },\n })\n ).pipe(\n catchError(() => {\n log.warn(\"Failed to fetch spec version for network\", networkId)\n return of(null as number | null)\n })\n )\n }\n\n private getMiniMetadatas$(\n networkId: DotNetworkId,\n specVersion: number\n ): Observable<MiniMetadata[]> {\n const miniMetadataIds = BALANCE_MODULES.filter((mod) => mod.platform === \"polkadot\").map(\n (mod) =>\n deriveMiniMetadataId({\n chainId: networkId,\n specVersion,\n source: mod.type,\n })\n )\n\n return combineLatest({\n defaultMiniMetadatas: this.getDefaultMiniMetadatas$(miniMetadataIds),\n storedMiniMetadatas: this.getStoredMiniMetadatas$(miniMetadataIds),\n }).pipe(\n switchMap(({ storedMiniMetadatas, defaultMiniMetadatas }) => {\n if (defaultMiniMetadatas) return of(defaultMiniMetadatas)\n if (storedMiniMetadatas) return of(storedMiniMetadatas)\n if (!this.#chainConnectors.substrate) return of([])\n\n return from(\n withRetry(\n () =>\n // can fail if metadata cant be fetched\n getMiniMetadatas(\n this.#chainConnectors.substrate!,\n this.#chaindataProvider,\n networkId,\n specVersion\n ),\n {\n delay: 2_000,\n shouldRetry: (err) => {\n log.warn(\"Failed to fetch minimetadata for %s, retrying...\", networkId, err)\n return true // don't give up mate!\n },\n }\n )\n ).pipe(\n catchError(() => {\n log.warn(\"Failed to fetch metadata for network\", networkId)\n return of([])\n }),\n // and persist in storage for later reuse\n tap((newMiniMetadatas) => {\n if (!newMiniMetadatas.length) return\n const storage = this.#storage.getValue()\n const miniMetadatas = assign(\n // keep minimetadatas of other networks\n keyBy(\n values(storage.miniMetadatas).filter((m) => m.chainId !== networkId),\n (m) => m.id\n ),\n // add the ones for our network\n keyBy(newMiniMetadatas, (m) => m.id)\n )\n\n this.#storage.next(assign({}, storage, { miniMetadatas }))\n })\n )\n }),\n // emit only when mini metadata changes, as a change here would restart all subscriptions for the network\n distinctUntilChanged<MiniMetadata[]>(isEqual)\n )\n }\n\n private getStoredMiniMetadatas$(miniMetadataIds: string[]): Observable<MiniMetadata[] | null> {\n return this.storedMiniMetadataMapById$.pipe(\n map((mapById) => {\n const miniMetadatas = miniMetadataIds.map((id) => mapById[id])\n return miniMetadatas.length && miniMetadatas.every(isTruthy) ? miniMetadatas : null\n }),\n // source changes very often\n distinctUntilChanged<MiniMetadata[] | null>(isEqual)\n )\n }\n\n private getDefaultMiniMetadatas$(miniMetadataIds: string[]): Observable<MiniMetadata[] | null> {\n return this.#chaindataProvider.miniMetadatasMapById$.pipe(\n map((mapById) => {\n const miniMetadatas = miniMetadataIds.map((id) => mapById[id])\n return miniMetadatas.length && miniMetadatas.every(isTruthy) ? miniMetadatas : null\n })\n )\n }\n\n private getStoredBalances(addressesByToken: Record<TokenId, Address[]>) {\n const balanceDefs = toPairs(addressesByToken).flatMap(([tokenId, addresses]) =>\n addresses.map((address) => [tokenId, address] as [TokenId, Address])\n )\n\n return balanceDefs\n .map(([tokenId, address]) => this.#storage.value.balances[getBalanceId({ address, tokenId })])\n .filter(isNotNil)\n .sort(sortByBalanceId) as IBalance[]\n }\n\n private cleanupAddressesByTokenId$(addressesByTokenId: Record<TokenId, Address[]>) {\n return this.#chaindataProvider.getNetworksMapById$().pipe(\n map((networksById): Record<TokenId, Address[]> => {\n return fromPairs(\n toPairs(addressesByTokenId)\n .map(([tokenId, addresses]) => {\n const networkId = parseTokenId(tokenId).networkId\n const network = networksById[networkId]\n return [\n tokenId,\n uniq(addresses.map(normalizeAddress)).filter(\n (address) => network && isAddressCompatibleWithNetwork(network, address)\n ),\n ] as [TokenId, Address[]]\n })\n .filter(([, addresses]) => addresses.length > 0)\n )\n })\n )\n }\n}\n\nconst isAccountPlatformCompatibleWithNetwork = (network: Network, platform: AccountPlatform) => {\n switch (network.platform) {\n case \"ethereum\":\n return platform === \"ethereum\"\n case \"solana\":\n return platform === \"solana\"\n case \"polkadot\": {\n switch (network.account) {\n case \"secp256k1\":\n return platform === \"ethereum\"\n case \"*25519\":\n return platform === \"polkadot\"\n default:\n throw new Error(`Unsupported polkadot network account type ${network.account}`)\n }\n }\n default:\n log.warn(\"Unsupported network platform\", network)\n throw new Error(\"Unsupported network platform\")\n }\n}\n\n/**\n * If this is the address of an account, use isAccountCompatibleWithChain instead.\n * Otherwise it could lead to a loss of funds\n * @param chain\n * @param address\n * @returns\n */\nconst isAddressCompatibleWithNetwork = (network: Network, address: string) => {\n // TODO try with return true to check if wallet filters correctly upfront\n const accountPlatform = getAccountPlatformFromAddress(address)\n return isAccountPlatformCompatibleWithNetwork(network, accountPlatform)\n}\n\nconst sortByBalanceId = (a: IBalance, b: IBalance) => getBalanceId(a).localeCompare(getBalanceId(b))\n\nconst sortByMiniMetadataId = (a: MiniMetadata, b: MiniMetadata) => a.id.localeCompare(b.id)\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport type { ChaindataProvider, DotNetworkId } from \"@talismn/chaindata-provider\"\nimport PQueue from \"p-queue\"\n\nimport log from \"../log\"\nimport { BALANCE_MODULES } from \"../modules\"\nimport type { MiniMetadata } from \"../types\"\nimport { getMetadataRpc } from \"./getMetadataRpc\"\nimport { getSpecVersion } from \"./getSpecVersion\"\n\nexport { getSpecVersion } from \"./getSpecVersion\"\n\nconst getCacheKey = (networkId: string, specVersion: number) => `${networkId}:${specVersion}`\n\nconst CACHE = new Map<string, Promise<MiniMetadata[]>>()\n\n// ensures we dont fetch miniMetadatas on more than 4 chains at once\nconst POOL = new PQueue({ concurrency: 4 })\n\nexport const getMiniMetadatas = async (\n chainConnector: IChainConnectorDot,\n chaindataProvider: ChaindataProvider,\n networkId: DotNetworkId,\n specVersion?: number\n) => {\n if (specVersion === undefined) specVersion = await getSpecVersion(chainConnector, networkId)\n\n const cacheKey = getCacheKey(networkId, specVersion)\n if (CACHE.has(cacheKey)) return CACHE.get(cacheKey)!\n\n const pResult = POOL.add(() =>\n fetchMiniMetadatas(chainConnector, chaindataProvider, networkId, specVersion)\n ) as Promise<MiniMetadata[]>\n\n // keep the results in cache (unless call fails) as observables call this function a lot of times\n CACHE.set(cacheKey, pResult)\n\n try {\n return await pResult\n } catch (cause) {\n CACHE.delete(cacheKey)\n throw new Error(`Failed to fetch metadataRpc for network ${networkId}`, { cause })\n }\n}\n\nconst fetchMiniMetadatas = async (\n chainConnector: IChainConnectorDot,\n chaindataProvider: ChaindataProvider,\n chainId: DotNetworkId,\n specVersion: number\n) => {\n const start = performance.now()\n log.info(\"[miniMetadata] fetching minimetadatas for %s\", chainId)\n\n try {\n const network = await chaindataProvider.getNetworkById(chainId, \"polkadot\")\n if (!network) throw new Error(`Network ${chainId} not found in chaindataProvider`)\n\n const metadataRpc = await getMetadataRpc(chainConnector, chainId)\n\n return Promise.all(\n BALANCE_MODULES.filter((m) => m.platform === \"polkadot\").map((mod) =>\n mod.getMiniMetadata({\n networkId: chainId,\n metadataRpc,\n specVersion,\n config: network.balancesConfig?.[mod.type],\n })\n )\n )\n } finally {\n log.debug(\n \"[miniMetadata] updated miniMetadatas for %s in %sms\",\n chainId,\n (performance.now() - start).toFixed(2)\n )\n }\n}\n","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","{\n \"name\": \"@talismn/balances\",\n \"version\": \"1.3.4\",\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\",\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 \"@metaplex-foundation/mpl-token-metadata\": \"^3.4.0\",\n \"@metaplex-foundation/umi\": \"^1.2.0\",\n \"@polkadot-api/utils\": \"0.2.0\",\n \"@solana/spl-token\": \"^0.4.13\",\n \"@solana/web3.js\": \"^1.98.2\",\n \"@talismn/chain-connectors\": \"workspace:*\",\n \"@talismn/chaindata-provider\": \"workspace:*\",\n \"@talismn/crypto\": \"workspace:*\",\n \"@talismn/sapi\": \"workspace:*\",\n \"@talismn/scale\": \"workspace:*\",\n \"@talismn/token-rates\": \"workspace:*\",\n \"@talismn/util\": \"workspace:*\",\n \"anylogger\": \"^1.0.11\",\n \"bignumber.js\": \"^9.1.2\",\n \"lodash-es\": \"4.17.21\",\n \"p-queue\": \"8.1.0\",\n \"polkadot-api\": \"1.23.3\",\n \"rxjs\": \"^7.8.1\",\n \"scale-ts\": \"^1.6.1\",\n \"viem\": \"^2.27.3\",\n \"zod\": \"^3.25.76\"\n },\n \"devDependencies\": {\n \"@polkadot/api-contract\": \"16.1.2\",\n \"@polkadot/types\": \"16.1.2\",\n \"@polkadot/util\": \"13.5.3\",\n \"@talismn/tsconfig\": \"workspace:*\",\n \"@types/lodash-es\": \"4.17.12\",\n \"typescript\": \"^5.6.3\"\n },\n \"peerDependencies\": {\n \"@polkadot/api-contract\": \"*\",\n \"@polkadot/types\": \"*\",\n \"@polkadot/util\": \"*\",\n \"@polkadot/util-crypto\": \"*\",\n \"@substrate/txwrapper-core\": \"*\"\n },\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"@talismn/source\": \"./src/index.ts\",\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 { EvmErc20TokenSchema } from \"@talismn/chaindata-provider\"\n\nexport const MODULE_TYPE = EvmErc20TokenSchema.shape.type.value\nexport const PLATFORM = EvmErc20TokenSchema.shape.platform.value\n\nexport type { EvmErc20TokenConfig as TokenConfig } from \"./types\"\n","import { parseEvmErc20TokenId, parseTokenId } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport { type ChainContract, erc20Abi, type PublicClient } from \"viem\"\n\nimport type { IBalance } from \"../../types\"\nimport type {\n FetchBalanceErrors,\n FetchBalanceResults,\n IBalanceModule,\n} from \"../../types/IBalanceModule\"\nimport { erc20BalancesAggregatorAbi } from \"../abis\"\nimport { BalanceFetchError, BalanceFetchNetworkError } from \"../shared/errors\"\nimport { type BalanceDef, getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`)\n\n for (const [token, addresses] of tokensWithAddresses) {\n if (token.type !== MODULE_TYPE || token.networkId !== networkId)\n throw new Error(\n `Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`\n )\n\n for (const address of addresses)\n if (!isEthereumAddress(address))\n throw new Error(\n `Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`\n )\n }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (client.chain?.contracts?.erc20Aggregator && balanceDefs.length > 1) {\n const erc20Aggregator = client.chain.contracts.erc20Aggregator as ChainContract\n return fetchWithAggregator(client, balanceDefs, erc20Aggregator.address)\n }\n\n return fetchWithoutAggregator(client, balanceDefs)\n}\n\nconst fetchWithoutAggregator = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[]\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n const results = await Promise.allSettled(\n balanceDefs.map(async ({ token, address }) => {\n try {\n const result = await client.readContract({\n abi: erc20Abi,\n address: token.contractAddress,\n functionName: \"balanceOf\",\n args: [address],\n })\n\n const balance: IBalance = {\n address,\n tokenId: token.id,\n value: result.toString(),\n source: MODULE_TYPE,\n networkId: parseEvmErc20TokenId(token.id).networkId,\n status: \"live\",\n }\n\n return balance\n } catch (err) {\n throw new BalanceFetchError(\n `Failed to get balance for token ${token.id} and address ${address} on chain ${client.chain?.id}`,\n token.id,\n address,\n err as Error\n )\n }\n })\n )\n\n return results.reduce<FetchBalanceResults>(\n (acc, result) => {\n if (result.status === \"fulfilled\") acc.success.push(result.value as IBalance)\n else {\n const error = result.reason as BalanceFetchError\n acc.errors.push({\n tokenId: error.tokenId,\n address: error.address,\n error,\n })\n }\n return acc\n },\n { success: [], errors: [] }\n )\n}\n\nconst fetchWithAggregator = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n erc20BalancesAggregatorAddress: `0x${string}`\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n try {\n const erc20Balances = await client.readContract({\n abi: erc20BalancesAggregatorAbi,\n address: erc20BalancesAggregatorAddress,\n functionName: \"balances\",\n args: [\n balanceDefs.map((b) => ({\n account: b.address,\n token: b.token.contractAddress,\n })),\n ],\n })\n\n const success = balanceDefs.map(\n (balanceDef, index): IBalance => ({\n address: balanceDef.address,\n tokenId: balanceDef.token.id,\n value: erc20Balances[index].toString(),\n source: MODULE_TYPE,\n networkId: parseTokenId(balanceDef.token.id).networkId,\n status: \"live\",\n })\n )\n return { success, errors: [] }\n } catch (err) {\n const errors = balanceDefs.map((balanceDef): FetchBalanceErrors[number] => ({\n tokenId: balanceDef.token.id,\n address: balanceDef.address,\n error: new BalanceFetchNetworkError(\n `Failed to get balances for evm-erc20 tokens on chain ${client.chain?.id}`,\n String(client.chain?.id),\n err as Error\n ),\n }))\n return { success: [], errors }\n }\n}\n","import { parseAbi } from \"viem\"\n\nexport const erc20BalancesAggregatorAbi = parseAbi([\n \"struct AccountToken {address account; address token;}\",\n \"function balances(AccountToken[] memory accountTokens) public view returns (uint256[] memory)\",\n] as const)\n","import { parseAbi } from \"viem\"\n\nexport const abiMulticall = parseAbi([\n \"struct Call { address target; bytes callData; }\",\n \"struct Call3 { address target; bool allowFailure; bytes callData; }\",\n \"struct Call3Value { address target; bool allowFailure; uint256 value; bytes callData; }\",\n \"struct Result { bool success; bytes returnData; }\",\n \"function aggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes[] memory returnData)\",\n \"function aggregate3(Call3[] calldata calls) public payable returns (Result[] memory returnData)\",\n \"function aggregate3Value(Call3Value[] calldata calls) public payable returns (Result[] memory returnData)\",\n \"function blockAndAggregate(Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)\",\n \"function getBasefee() view returns (uint256 basefee)\",\n \"function getBlockHash(uint256 blockNumber) view returns (bytes32 blockHash)\",\n \"function getBlockNumber() view returns (uint256 blockNumber)\",\n \"function getChainId() view returns (uint256 chainid)\",\n \"function getCurrentBlockCoinbase() view returns (address coinbase)\",\n \"function getCurrentBlockDifficulty() view returns (uint256 difficulty)\",\n \"function getCurrentBlockGasLimit() view returns (uint256 gaslimit)\",\n \"function getCurrentBlockTimestamp() view returns (uint256 timestamp)\",\n \"function getEthBalance(address addr) view returns (uint256 balance)\",\n \"function getLastBlockHash() view returns (bytes32 blockHash)\",\n \"function tryAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (Result[] memory returnData)\",\n \"function tryBlockAndAggregate(bool requireSuccess, Call[] calldata calls) public payable returns (uint256 blockNumber, bytes32 blockHash, Result[] memory returnData)\",\n] as const)\n","export const uniswapV2PairAbi = [\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Approval\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount0\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount1\",\n type: \"uint256\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"Burn\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount0\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount1\",\n type: \"uint256\",\n },\n ],\n name: \"Mint\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"sender\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount0In\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount1In\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount0Out\",\n type: \"uint256\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"amount1Out\",\n type: \"uint256\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"Swap\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: false,\n internalType: \"uint112\",\n name: \"reserve0\",\n type: \"uint112\",\n },\n {\n indexed: false,\n internalType: \"uint112\",\n name: \"reserve1\",\n type: \"uint112\",\n },\n ],\n name: \"Sync\",\n type: \"event\",\n },\n {\n anonymous: false,\n inputs: [\n {\n indexed: true,\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n indexed: true,\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n indexed: false,\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"Transfer\",\n type: \"event\",\n },\n {\n constant: true,\n inputs: [],\n name: \"DOMAIN_SEPARATOR\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"MINIMUM_LIQUIDITY\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"PERMIT_TYPEHASH\",\n outputs: [\n {\n internalType: \"bytes32\",\n name: \"\",\n type: \"bytes32\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n ],\n name: \"allowance\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"approve\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n ],\n name: \"balanceOf\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"burn\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"amount0\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"amount1\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"decimals\",\n outputs: [\n {\n internalType: \"uint8\",\n name: \"\",\n type: \"uint8\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"factory\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"getReserves\",\n outputs: [\n {\n internalType: \"uint112\",\n name: \"reserve0\",\n type: \"uint112\",\n },\n {\n internalType: \"uint112\",\n name: \"reserve1\",\n type: \"uint112\",\n },\n {\n internalType: \"uint32\",\n name: \"blockTimestampLast\",\n type: \"uint32\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n name: \"initialize\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"kLast\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"mint\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"liquidity\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"name\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n ],\n name: \"nonces\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"owner\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"spender\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"deadline\",\n type: \"uint256\",\n },\n {\n internalType: \"uint8\",\n name: \"v\",\n type: \"uint8\",\n },\n {\n internalType: \"bytes32\",\n name: \"r\",\n type: \"bytes32\",\n },\n {\n internalType: \"bytes32\",\n name: \"s\",\n type: \"bytes32\",\n },\n ],\n name: \"permit\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"price0CumulativeLast\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"price1CumulativeLast\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n ],\n name: \"skim\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"uint256\",\n name: \"amount0Out\",\n type: \"uint256\",\n },\n {\n internalType: \"uint256\",\n name: \"amount1Out\",\n type: \"uint256\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"bytes\",\n name: \"data\",\n type: \"bytes\",\n },\n ],\n name: \"swap\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"symbol\",\n outputs: [\n {\n internalType: \"string\",\n name: \"\",\n type: \"string\",\n },\n ],\n payable: false,\n stateMutability: \"pure\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [],\n name: \"sync\",\n outputs: [],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"token0\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"token1\",\n outputs: [\n {\n internalType: \"address\",\n name: \"\",\n type: \"address\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: true,\n inputs: [],\n name: \"totalSupply\",\n outputs: [\n {\n internalType: \"uint256\",\n name: \"\",\n type: \"uint256\",\n },\n ],\n payable: false,\n stateMutability: \"view\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"transfer\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n {\n constant: false,\n inputs: [\n {\n internalType: \"address\",\n name: \"from\",\n type: \"address\",\n },\n {\n internalType: \"address\",\n name: \"to\",\n type: \"address\",\n },\n {\n internalType: \"uint256\",\n name: \"value\",\n type: \"uint256\",\n },\n ],\n name: \"transferFrom\",\n outputs: [\n {\n internalType: \"bool\",\n name: \"\",\n type: \"bool\",\n },\n ],\n payable: false,\n stateMutability: \"nonpayable\",\n type: \"function\",\n },\n] as const\n","import type { TokenId } from \"@talismn/chaindata-provider\"\n\nimport type { Address } from \"../../types\"\n\nexport class BalanceFetchError extends Error {\n tokenId: TokenId\n address: Address\n\n constructor(message: string, tokenId: TokenId, address: Address, cause?: Error) {\n super(message)\n this.name = \"BalanceFetchError\"\n this.tokenId = tokenId\n this.address = address\n if (cause) this.cause = cause\n }\n}\nexport class BalanceFetchNetworkError extends Error {\n evmNetworkId: string | undefined\n\n constructor(message: string, evmNetworkId?: string, cause?: Error) {\n super(message)\n this.name = \"BalanceFetchNetworkError\"\n this.evmNetworkId = evmNetworkId\n if (cause) this.cause = cause\n }\n}\n","import type { TokenOfType, TokenType } from \"@talismn/chaindata-provider\"\n\nimport type { TokenPlatform, TokensWithAddresses } from \"../../types/IBalanceModule\"\n\nexport type BalanceDef<T extends TokenType = TokenType> = {\n token: TokenOfType<T>\n address: TokenPlatform<T> extends \"ethereum\" ? `0x${string}` : string\n}\n\nexport const getBalanceDefs = <T extends TokenType = TokenType>(\n addressesByToken: TokensWithAddresses\n): BalanceDef<T>[] => {\n return addressesByToken.flatMap(([token, addresses]) =>\n addresses.map((address) => ({ token, address }))\n ) as BalanceDef<T>[]\n}\n\n// esponse of getStorageAt queries:\n// if there is at least one storage entry, the results will be an array with a single object\n// if the storage has no entries in it (ex: Assets on ewx or moonbeam), the response will be an empty array\nexport type QueryStorageChange = [stateKey: `0x${string}`, value: `0x${string}`]\nexport type QueryStorageResult = [{ block: `0x${string}`; changes: QueryStorageChange[] }] | []\n","import {\n type EvmErc20Token,\n EvmErc20TokenSchema,\n evmErc20TokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign, omit } from \"lodash-es\"\nimport type { BaseError } from \"viem\"\nimport z from \"zod/v4\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { getErc20ContractData } from \"./utils\"\n\nconst TokenCacheSchema = z.discriminatedUnion(\"isValid\", [\n z.strictObject({\n id: EvmErc20TokenSchema.shape.id,\n isValid: z.literal(true),\n ...EvmErc20TokenSchema.pick({ symbol: true, decimals: true, name: true }).shape,\n }),\n z.strictObject({\n id: EvmErc20TokenSchema.shape.id,\n isValid: z.literal(false),\n }),\n])\n\ntype CachedToken = z.infer<typeof TokenCacheSchema>\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n cache,\n}) => {\n const result: EvmErc20Token[] = []\n\n for (const tokenConfig of tokens) {\n const tokenId = evmErc20TokenId(networkId, tokenConfig.contractAddress)\n const cached = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (!cached) {\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) {\n log.warn(`No client found for network ${networkId} while fetching EVM ERC20 tokens`)\n continue\n }\n\n try {\n const { name, decimals, symbol } = await getErc20ContractData(\n client,\n tokenConfig.contractAddress\n )\n\n cache[tokenId] = TokenCacheSchema.parse({\n id: tokenId,\n symbol,\n decimals,\n name,\n isValid: true,\n })\n } catch (err) {\n const msg = (err as BaseError).shortMessage\n if (\n msg.includes(\"returned no data\") ||\n msg.includes(\"is out of bounds\") ||\n msg.includes(\"reverted\")\n )\n cache[tokenId] = { id: tokenId, isValid: false }\n else\n log.warn(\n `Failed to fetch ERC20 token data for ${networkId}:${tokenConfig.contractAddress}`,\n (err as BaseError).shortMessage\n )\n continue\n }\n }\n\n const base: Pick<EvmErc20Token, \"id\" | \"type\" | \"networkId\" | \"platform\"> = {\n id: tokenId,\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n }\n\n const cached2 = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (cached2?.isValid === false) continue\n\n const token = assign(\n base,\n cached2?.isValid ? omit(cached2, [\"isValid\"]) : {},\n tokenConfig\n ) as EvmErc20Token\n\n const parsed = EvmErc20TokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid EvmErc20TokenSchema\", {\n token,\n })\n continue\n }\n\n result.push(parsed.data)\n }\n\n return result\n}\n","import {\n type Abi,\n type Client,\n ContractFunctionExecutionError,\n erc20Abi,\n erc20Abi_bytes32,\n getContract,\n hexToString,\n} from \"viem\"\n\nexport const getErc20ContractData = async (\n client: Client,\n contractAddress: `0x${string}`\n): Promise<{ symbol: string; decimals: number; name: string }> => {\n try {\n const contract = getTypedContract(client, erc20Abi, contractAddress)\n\n // biome-ignore lint/correctness/noInnerDeclarations: legacy\n // biome-ignore lint/correctness/noUnusedVariables: legacy\n var [symbol, decimals, name] = await Promise.all([\n contract.read.symbol(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n } catch (e) {\n if (e instanceof ContractFunctionExecutionError) {\n // try to perform the contract read with bytes32 symbol\n const contract = getTypedContract(client, erc20Abi_bytes32, contractAddress)\n\n // biome-ignore lint/correctness/noInnerDeclarations: legacy\n // biome-ignore lint/suspicious/noRedeclare: legacy\n var [bytesSymbol, decimals, nameSymbol] = await Promise.all([\n contract.read.symbol(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n symbol = hexToString(bytesSymbol).replace(/\\0/g, \"\").trim() // remove NULL characters\n name = hexToString(nameSymbol).replace(/\\0/g, \"\").trim() // remove NULL characters\n } else throw e\n }\n\n return { symbol, decimals, name }\n}\n\nconst getTypedContract = <TAbi extends Abi>(\n client: Client,\n abi: TAbi,\n contractAddress: `0x${string}`\n) =>\n getContract({\n address: contractAddress,\n abi,\n client: { public: client },\n })\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for ethereum tokens\")\n}\n","import { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport { encodeFunctionData, erc20Abi } from \"viem\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n if (!isEthereumAddress(from)) throw new Error(\"Invalid from address\")\n if (!isEthereumAddress(to)) throw new Error(\"Invalid to address\")\n\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, BigInt(value)],\n })\n\n return { from, to: token.contractAddress, data }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const EvmErc20BalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { EvmErc20TokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const EvmErc20TokenConfigSchema = z.strictObject({\n contractAddress: EvmErc20TokenSchema.shape.contractAddress,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type EvmErc20TokenConfig = z.infer<typeof EvmErc20TokenConfigSchema>\n","import { TokenBaseSchema } from \"@talismn/chaindata-provider\"\n\nexport const TokenConfigBaseSchema = TokenBaseSchema.partial().omit({ id: true })\n","import { EvmNativeTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { EvmNativeTokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = EvmNativeTokenSchema.shape.type.value\nexport const PLATFORM = EvmNativeTokenSchema.shape.platform.value\n","import { parseTokenId } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport type { PublicClient } from \"viem\"\n\nimport type { IBalance } from \"../../types\"\nimport type {\n FetchBalanceErrors,\n FetchBalanceResults,\n IBalanceModule,\n} from \"../../types/IBalanceModule\"\nimport { abiMulticall } from \"../abis\"\nimport { BalanceFetchError, BalanceFetchNetworkError } from \"../shared/errors\"\nimport { type BalanceDef, getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`)\n\n for (const [token, addresses] of tokensWithAddresses) {\n if (token.type !== MODULE_TYPE || token.networkId !== networkId)\n throw new Error(\n `Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`\n )\n\n for (const address of addresses)\n if (!isEthereumAddress(address))\n throw new Error(\n `Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`\n )\n }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (client.chain?.contracts?.multicall3 && balanceDefs.length > 1) {\n const multicall3 = client.chain.contracts.multicall3\n return fetchWithMulticall(client, balanceDefs, multicall3.address)\n }\n\n return fetchWithoutMulticall(client, balanceDefs)\n}\n\nconst fetchWithoutMulticall = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[]\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n const results = await Promise.allSettled(\n balanceDefs.map(async ({ token, address }) => {\n try {\n const result = await client.getBalance({ address })\n\n const balance: IBalance = {\n address,\n tokenId: token.id,\n value: result.toString(),\n source: MODULE_TYPE,\n networkId: parseTokenId(token.id).networkId,\n status: \"live\",\n }\n\n return balance\n } catch (err) {\n throw new BalanceFetchError(\n `Failed to get balance for token ${token.id} and address ${address} on chain ${client.chain?.id}`,\n token.id,\n address,\n err as Error\n )\n }\n })\n )\n\n return results.reduce<FetchBalanceResults>(\n (acc, result) => {\n if (result.status === \"fulfilled\") acc.success.push(result.value as IBalance)\n else {\n const error = result.reason as BalanceFetchError\n acc.errors.push({\n tokenId: error.tokenId,\n address: error.address,\n error,\n })\n }\n return acc\n },\n { success: [], errors: [] }\n )\n}\n\nconst fetchWithMulticall = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n multicall3Address: `0x${string}`\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n try {\n const callResults = await client.multicall({\n contracts: balanceDefs.map(({ address }) => ({\n address: multicall3Address,\n abi: abiMulticall,\n functionName: \"getEthBalance\",\n args: [address],\n })),\n })\n\n return callResults.reduce<FetchBalanceResults>(\n (acc, result, index) => {\n if (result.status === \"success\") {\n acc.success.push({\n address: balanceDefs[index].address,\n tokenId: balanceDefs[index].token.id,\n value: result.result.toString(),\n source: MODULE_TYPE,\n networkId: parseTokenId(balanceDefs[index].token.id).networkId,\n status: \"live\",\n } as IBalance)\n }\n if (result.status === \"failure\") {\n acc.errors.push({\n tokenId: balanceDefs[index].token.id,\n address: balanceDefs[index].address,\n error: new BalanceFetchError(\n `Failed to get balance for token ${balanceDefs[index].token.id} and address ${balanceDefs[index].address} on chain ${client.chain?.id}`,\n balanceDefs[index].token.id,\n balanceDefs[index].address,\n result.error\n ),\n } as FetchBalanceErrors[number])\n }\n return acc\n },\n { success: [], errors: [] }\n )\n } catch (err) {\n const errors = balanceDefs.map((balanceDef): FetchBalanceErrors[number] => ({\n tokenId: balanceDef.token.id,\n address: balanceDef.address,\n error: new BalanceFetchNetworkError(\n `Failed to get balances for evm-erc20 tokens on chain ${client.chain?.id}`,\n String(client.chain?.id),\n err as Error\n ),\n }))\n return { success: [], errors }\n }\n}\n","import {\n type EvmNativeToken,\n EvmNativeTokenSchema,\n evmNativeTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n}) => {\n // assume there is one and only one token in the array\n if (tokens.length !== 1)\n throw new Error(\n \"EVM Native module expects the nativeCurrency to be passed as a single token in the array\"\n )\n\n const token = assign(\n {\n id: evmNativeTokenId(networkId),\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n isDefault: true,\n },\n tokens[0] as TokenConfig\n ) as EvmNativeToken\n\n const parsed = EvmNativeTokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid schema\", token)\n return []\n }\n\n return [parsed.data]\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for ethereum tokens\")\n}\n","import { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n if (!isEthereumAddress(from)) throw new Error(\"Invalid from address\")\n if (!isEthereumAddress(to)) throw new Error(\"Invalid to address\")\n\n return { from, to, value, data: \"0x\" as `0x${string}` }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const EvmNativeBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const EvmNativeTokenConfigSchema = z.strictObject({\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type EvmNativeTokenConfig = z.infer<typeof EvmNativeTokenConfigSchema>\n","import { EvmUniswapV2TokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { EvmUniswapV2TokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = EvmUniswapV2TokenSchema.shape.type.value\nexport const PLATFORM = EvmUniswapV2TokenSchema.shape.platform.value\n","import { parseTokenId } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport BigNumber from \"bignumber.js\"\nimport { keyBy, uniq } from \"lodash-es\"\nimport { getContract, type PublicClient } from \"viem\"\n\nimport type { ExtraAmount } from \"../../types\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { uniswapV2PairAbi } from \"../abis\"\nimport { BalanceFetchError, BalanceFetchNetworkError } from \"../shared/errors\"\nimport { type BalanceDef, getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) throw new Error(`Could not get rpc provider for evm network ${networkId}`)\n\n for (const [token, addresses] of tokensWithAddresses) {\n if (token.type !== MODULE_TYPE || token.networkId !== networkId)\n throw new Error(\n `Invalid token type or networkId for EVM ERC20 balance module: ${token.type} on ${token.networkId}`\n )\n\n for (const address of addresses)\n if (!isEthereumAddress(address))\n throw new Error(\n `Invalid ethereum address for EVM ERC20 balance module: ${address} for token ${token.id}`\n )\n }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n return fetchPoolBalances(client, balanceDefs)\n}\n\nconst fetchPoolBalances = async (\n client: PublicClient,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[]\n): Promise<FetchBalanceResults> => {\n if (balanceDefs.length === 0) return { success: [], errors: [] }\n\n // fetch pool specific info separately to prevent querying same contract info for multiple account addresses\n const pools = uniq(balanceDefs.map((def) => def.token.contractAddress))\n\n const [poolResults, balanceResults] = await Promise.all([\n // pool supplies and reserves\n Promise.allSettled(\n pools.map(async (address) => {\n const contract = getContract({ address, abi: uniswapV2PairAbi, client })\n\n const [totalSupply, [reserve0, reserve1]] = await Promise.all([\n contract.read.totalSupply(),\n contract.read.getReserves(),\n ])\n return { address, totalSupply, reserve0, reserve1 }\n })\n ),\n // balances for each address\n Promise.allSettled(\n balanceDefs.map(async ({ token, address }) => {\n const balance = await client.readContract({\n address: token.contractAddress,\n abi: uniswapV2PairAbi,\n functionName: \"balanceOf\",\n args: [address],\n } as const)\n\n return { pool: token.contractAddress, address, balance }\n })\n ),\n ])\n\n const poolInfo = keyBy(\n poolResults.filter((r) => r.status === \"fulfilled\").map((r) => r.value),\n (p) => p.address\n )\n\n const results = balanceDefs.reduce<FetchBalanceResults>(\n (acc, { token, address }, i) => {\n const pool = poolInfo[token.contractAddress]\n if (!pool) {\n acc.errors.push({\n tokenId: token.id,\n address,\n error: new BalanceFetchNetworkError(\n `Pool data not found for token ${token.id} at address ${token.contractAddress}`,\n parseTokenId(token.id).networkId\n ),\n })\n return acc\n }\n\n const balanceResult = balanceResults[i]\n\n if (balanceResult.status !== \"fulfilled\") {\n acc.errors.push({\n tokenId: token.id,\n address,\n error: new BalanceFetchError(\n `Failed to fetch balance for token ${token.id} at address ${address}`,\n token.id,\n address,\n balanceResult.reason as Error\n ),\n })\n return acc\n }\n\n const { totalSupply, reserve0, reserve1 } = pool\n const { balance } = balanceResult.value\n\n const extraWithLabel = (label: string, amount: string): ExtraAmount<string> => ({\n type: \"extra\",\n label,\n amount,\n })\n\n const ratio = BigNumber(String(balance)).div(totalSupply === 0n ? \"1\" : String(totalSupply))\n\n acc.success.push({\n address,\n tokenId: token.id,\n source: MODULE_TYPE,\n networkId: parseTokenId(token.id).networkId,\n status: \"live\",\n values: [\n { type: \"free\", label: \"free\", amount: String(balance) },\n extraWithLabel(\"totalSupply\", String(totalSupply)),\n extraWithLabel(\"reserve0\", String(reserve0)),\n extraWithLabel(\"reserve1\", String(reserve1)),\n extraWithLabel(\"holding0\", ratio.times(String(reserve0)).toString(10)),\n extraWithLabel(\"holding1\", ratio.times(String(reserve1)).toString(10)),\n ],\n })\n\n return acc\n },\n { success: [], errors: [] }\n )\n\n return results\n}\n","import {\n type EvmUniswapV2Token,\n EvmUniswapV2TokenSchema,\n evmUniswapV2TokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign, omit } from \"lodash-es\"\nimport type { BaseError } from \"viem\"\nimport z from \"zod/v4\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { getErc20ContractData, getUniswapV2PairContractData } from \"./utils\"\n\nconst TokenCacheSchema = z.discriminatedUnion(\"isValid\", [\n z.strictObject({\n id: EvmUniswapV2TokenSchema.shape.id,\n isValid: z.literal(true),\n ...EvmUniswapV2TokenSchema.pick({\n symbol: true,\n decimals: true,\n name: true,\n tokenAddress0: true,\n tokenAddress1: true,\n decimals0: true,\n decimals1: true,\n symbol0: true,\n symbol1: true,\n }).shape,\n }),\n z.strictObject({\n id: EvmUniswapV2TokenSchema.shape.id,\n isValid: z.literal(false),\n }),\n])\n\ntype CachedToken = z.infer<typeof TokenCacheSchema>\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n cache,\n}) => {\n const result: EvmUniswapV2Token[] = []\n\n for (const tokenConfig of tokens) {\n const tokenId = evmUniswapV2TokenId(networkId, tokenConfig.contractAddress)\n const cached = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (!cached) {\n const client = await connector.getPublicClientForEvmNetwork(networkId)\n if (!client) {\n log.warn(`No client found for network ${networkId} while fetching EVM ERC20 tokens`)\n continue\n }\n\n try {\n const { token0, token1, name, decimals } = await getUniswapV2PairContractData(\n client,\n tokenConfig.contractAddress\n )\n\n const { symbol: symbol0, decimals: decimals0 } = await getErc20ContractData(client, token0)\n const { symbol: symbol1, decimals: decimals1 } = await getErc20ContractData(client, token1)\n\n cache[tokenId] = TokenCacheSchema.parse({\n id: tokenId,\n symbol: `${symbol0}/${symbol1}`,\n decimals,\n name,\n tokenAddress0: token0,\n tokenAddress1: token1,\n decimals0,\n decimals1,\n symbol0,\n symbol1,\n isValid: true,\n })\n } catch (err) {\n const msg = (err as BaseError).shortMessage\n if (\n msg.includes(\"returned no data\") ||\n msg.includes(\"is out of bounds\") ||\n msg.includes(\"reverted\")\n ) {\n cache[tokenId] = { id: tokenId, isValid: false }\n } else {\n log.warn(\n `Failed to fetch UniswapV2 token data for ${tokenConfig.contractAddress}`,\n (err as BaseError).shortMessage\n )\n }\n continue\n }\n }\n\n const base: Pick<EvmUniswapV2Token, \"id\" | \"type\" | \"networkId\" | \"platform\"> = {\n id: tokenId,\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n }\n\n const cached2 = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (cached2?.isValid === false) continue\n\n const token = assign(\n base,\n cached2?.isValid ? omit(cached2, [\"isValid\"]) : {},\n tokenConfig\n ) as EvmUniswapV2Token\n\n const parsed = EvmUniswapV2TokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid schema\", token)\n continue\n }\n\n result.push(parsed.data)\n }\n\n return result\n}\n","import {\n type Abi,\n type Client,\n ContractFunctionExecutionError,\n erc20Abi,\n erc20Abi_bytes32,\n getContract,\n hexToString,\n} from \"viem\"\n\nimport { uniswapV2PairAbi } from \"../abis\"\n\nexport const getErc20ContractData = async (\n client: Client,\n contractAddress: `0x${string}`\n): Promise<{ symbol: string; decimals: number; name: string }> => {\n try {\n const contract = getTypedContract(client, erc20Abi, contractAddress)\n\n // biome-ignore lint/correctness/noInnerDeclarations: legacy\n // biome-ignore lint/correctness/noUnusedVariables: legacy\n var [symbol, decimals, name] = await Promise.all([\n contract.read.symbol(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n } catch (e) {\n if (e instanceof ContractFunctionExecutionError) {\n // try to perform the contract read with bytes32 symbol\n const contract = getTypedContract(client, erc20Abi_bytes32, contractAddress)\n\n // biome-ignore lint/correctness/noInnerDeclarations: legacy\n // biome-ignore lint/suspicious/noRedeclare: legacy\n var [bytesSymbol, decimals, nameSymbol] = await Promise.all([\n contract.read.symbol(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n symbol = hexToString(bytesSymbol).replace(/\\0/g, \"\").trim() // remove NULL characters\n name = hexToString(nameSymbol).replace(/\\0/g, \"\").trim() // remove NULL characters\n } else throw e\n }\n\n return { symbol, decimals, name }\n}\n\nconst getTypedContract = <TAbi extends Abi>(\n client: Client,\n abi: TAbi,\n contractAddress: `0x${string}`\n) =>\n getContract({\n address: contractAddress,\n abi,\n client: { public: client },\n })\n\nexport const getUniswapV2PairContractData = async (\n client: Client,\n contractAddress: `0x${string}`\n) => {\n const contract = getTypedContract(client, uniswapV2PairAbi, contractAddress)\n\n var [token0, token1, decimals, name] = await Promise.all([\n contract.read.token0(),\n contract.read.token1(),\n contract.read.decimals(),\n contract.read.name(),\n ])\n\n return { token0, token1, decimals, name }\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for ethereum tokens\")\n}\n","import { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { isEthereumAddress } from \"@talismn/crypto\"\nimport { encodeFunctionData, erc20Abi } from \"viem\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n if (!isEthereumAddress(from)) throw new Error(\"Invalid from address\")\n if (!isEthereumAddress(to)) throw new Error(\"Invalid to address\")\n\n const data = encodeFunctionData({\n abi: erc20Abi,\n functionName: \"transfer\",\n args: [to, BigInt(value)],\n })\n\n return { from, to: token.contractAddress, data }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const EvmUniswapV2BalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { EvmUniswapV2TokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const EvmUniswapV2TokenConfigSchema = z.strictObject({\n contractAddress: EvmUniswapV2TokenSchema.shape.contractAddress,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type EvmUniswapV2TokenConfig = z.infer<typeof EvmUniswapV2TokenConfigSchema>\n","import { SolNativeTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { SolNativeTokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = SolNativeTokenSchema.shape.type.value\nexport const PLATFORM = SolNativeTokenSchema.shape.platform.value\n","import { PublicKey } from \"@solana/web3.js\"\nimport { isSolanaAddress } from \"@talismn/crypto\"\n\nimport type { IBalance } from \"../../types\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { BalanceFetchError } from \"../shared/errors\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const connection = await connector.getConnection(networkId)\n if (!connection) throw new Error(`Could not get rpc provider for sol network ${networkId}`)\n\n for (const [token, addresses] of tokensWithAddresses) {\n if (token.type !== MODULE_TYPE || token.networkId !== networkId)\n throw new Error(\n `Invalid token type or networkId for balance module: ${token.type} on ${token.networkId}`\n )\n\n for (const address of addresses)\n if (!isSolanaAddress(address))\n throw new Error(\n `Invalid solana address for balance module: ${address} for token ${token.id}`\n )\n }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const results = await Promise.allSettled(\n balanceDefs.map(async ({ token, address }): Promise<IBalance> => {\n try {\n const publicKey = new PublicKey(address)\n const lamports = await connection.getBalance(publicKey)\n\n return {\n address: address,\n tokenId: token.id,\n value: lamports.toString(),\n source: MODULE_TYPE,\n networkId: token.networkId,\n status: \"live\",\n }\n } catch (err) {\n throw new BalanceFetchError(\n `Failed to get balance for token ${token.id} and address ${address} on chain ${networkId}`,\n token.id,\n address,\n err as Error\n )\n }\n })\n )\n\n return results.reduce<FetchBalanceResults>(\n (acc, result) => {\n if (result.status === \"fulfilled\") acc.success.push(result.value as IBalance)\n else {\n const error = result.reason as BalanceFetchError\n acc.errors.push({\n tokenId: error.tokenId,\n address: error.address,\n error,\n })\n }\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","import {\n type SolNativeToken,\n SolNativeTokenSchema,\n solNativeTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n}) => {\n // assume there is one and only one token in the array\n if (tokens.length !== 1)\n throw new Error(\n \"EVM Native module expects the nativeCurrency to be passed as a single token in the array\"\n )\n\n const token = assign(\n {\n id: solNativeTokenId(networkId),\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n isDefault: true,\n },\n tokens[0] as TokenConfig\n ) as SolNativeToken\n\n const parsed = SolNativeTokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid schema\", token)\n return []\n }\n\n return [parsed.data]\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for sol-native tokens\")\n}\n","import { PublicKey, SystemProgram } from \"@solana/web3.js\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const fromPubkey = new PublicKey(from)\n\n const transferIx = SystemProgram.transfer({\n fromPubkey,\n toPubkey: new PublicKey(to),\n lamports: Number(value),\n })\n\n return [transferIx]\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SolNativeBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SolNativeTokenConfigSchema = z.strictObject({\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SolNativeTokenConfig = z.infer<typeof SolNativeTokenConfigSchema>\n","import { SolSplTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport const MODULE_TYPE = SolSplTokenSchema.shape.type.value\nexport const PLATFORM = SolSplTokenSchema.shape.platform.value\n\nexport type { SolSplTokenConfig as TokenConfig } from \"./types\"\n","import { PublicKey } from \"@solana/web3.js\"\nimport { solSplTokenId } from \"@talismn/chaindata-provider\"\nimport { isNotNil } from \"@talismn/util\"\nimport { keyBy, uniq } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalance } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { setDetectedTokenIds } from \"../shared/detectedTokens\"\nimport { MODULE_TYPE } from \"./config\"\n\nconst SPL_PROGRAM_ID = \"TokenkegQfeZyiNwAJbNbGKPFXCWuBvf9Ss623VQ5DA\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const connection = await connector.getConnection(networkId)\n if (!connection) throw new Error(`Could not get connection for Solana network ${networkId}`)\n\n const accountAddresses = uniq(tokensWithAddresses.flatMap(([, addresses]) => addresses))\n\n const balancesPerAddress = await Promise.all(\n accountAddresses.map(async (address) => {\n const tokenAccounts = await connection.getParsedTokenAccountsByOwner(new PublicKey(address), {\n programId: new PublicKey(SPL_PROGRAM_ID), // SPL Token Program ID\n })\n\n const balances = tokenAccounts.value\n .map((d): IBalance | null => {\n try {\n const mintAddress = d.account.data.parsed.info.mint\n const value = d.account.data.parsed.info.tokenAmount.amount ?? \"0\"\n return {\n tokenId: solSplTokenId(networkId, mintAddress),\n networkId,\n address,\n source: MODULE_TYPE,\n status: \"live\",\n value,\n }\n } catch {\n log.warn(\"Failed to parse token amount\", {\n address,\n d,\n })\n return null\n }\n })\n .filter(isNotNil)\n\n // allows the wallet to detect new tokens, and enable them automatically\n setDetectedTokenIds(\n address,\n MODULE_TYPE,\n balances.map((b) => b.tokenId)\n )\n\n return [address, balances] as const\n })\n )\n\n const allBalancesByKey = keyBy(\n balancesPerAddress.flatMap(([, addressBalances]) => addressBalances),\n (b) => getBalanceKey(b.tokenId, b.address)\n )\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n // return a balance entry for all token/address pairs that were requested\n const success = balanceDefs.map((bd): IBalance => {\n const found = allBalancesByKey[getBalanceKey(bd.token.id, bd.address)]\n return (\n found ?? {\n tokenId: bd.token.id,\n networkId: bd.token.networkId,\n address: bd.address,\n source: MODULE_TYPE,\n status: \"live\",\n value: \"0\",\n }\n )\n })\n\n // return only the balances that match the tokens we are interested in\n return { success, errors: [] } // TODO output errors if any\n}\n\nconst getBalanceKey = (tokenId: string, address: string) => `${tokenId}:${address}`\n","import type { DotNetworkId } from \"@talismn/chaindata-provider\"\nimport {\n decAnyMetadata,\n getDynamicBuilder,\n getLookupFn,\n type ScaleStorageCoder,\n unifyMetadata,\n} from \"@talismn/scale\"\n\nimport log from \"../../log\"\nimport type { MiniMetadata } from \"../../types\"\n\ntype NetworkCoders = { [key: string]: [string, string] }\n\ntype NetworkStorageCoders<TCoders extends NetworkCoders> = {\n [Property in keyof TCoders]: ScaleStorageCoder | undefined\n}\n\nexport const buildNetworkStorageCoders = <TCoders extends { [key: string]: [string, string] }>(\n chainId: DotNetworkId,\n miniMetadata: MiniMetadata,\n coders: TCoders\n): NetworkStorageCoders<TCoders> | null => {\n if (!miniMetadata.data) return null\n\n const metadata = unifyMetadata(decAnyMetadata(miniMetadata.data))\n\n try {\n const scaleBuilder = getDynamicBuilder(getLookupFn(metadata))\n const builtCoders = Object.fromEntries(\n Object.entries(coders).flatMap(\n ([key, moduleMethodOrFn]: [\n keyof TCoders,\n [string, string] | ((params: { chainId: string }) => [string, string]),\n ]) => {\n const [module, method] =\n typeof moduleMethodOrFn === \"function\"\n ? moduleMethodOrFn({ chainId })\n : moduleMethodOrFn\n try {\n return [[key, scaleBuilder.buildStorage(module, method)] as const]\n } catch (cause) {\n log.trace(\n `Failed to build SCALE coder for chain ${chainId} (${module}::${method})`,\n cause\n )\n return []\n }\n }\n )\n ) as {\n [Property in keyof TCoders]: ReturnType<(typeof scaleBuilder)[\"buildStorage\"]> | undefined\n }\n\n return builtCoders\n } catch (cause) {\n log.error(\n `Failed to build SCALE coders for chain ${chainId} (${JSON.stringify(coders)})`,\n cause\n )\n }\n\n return null\n}\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport { parseMetadataRpc, toHex } from \"@talismn/scale\"\n\nexport const fetchRuntimeCallResult = async <T>(\n connector: IChainConnectorDot,\n networkId: string,\n metadataRpc: `0x${string}`,\n apiName: string,\n method: string,\n args: unknown[]\n): Promise<T> => {\n try {\n const { builder } = parseMetadataRpc(metadataRpc)\n const call = builder.buildRuntimeCall(apiName, method)\n\n const hex = await connector.send<string>(networkId, \"state_call\", [\n `${apiName}_${method}`,\n toHex(call.args.enc(args)),\n ])\n\n return call.value.dec(hex) as T\n } catch (cause) {\n throw new Error(`Error fetching runtime call on ${networkId} for ${apiName}.${method}`, {\n cause,\n })\n }\n}\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport type { DotNetworkId } from \"@talismn/chaindata-provider\"\nimport { isNotNil } from \"@talismn/util\"\nimport { toPairs } from \"lodash-es\"\nimport { Observable, of } from \"rxjs\"\n\nimport type { QueryStorageChange, QueryStorageResult } from \"./types\"\n\nexport type MaybeStateKey = `0x${string}` | null\n\nexport type RpcQueryPack<T> = {\n stateKeys: MaybeStateKey[]\n decodeResult: (changes: MaybeStateKey[]) => T\n}\n\ntype QueryStorageResultContent = QueryStorageResult[0]\n\nexport const fetchRpcQueryPack = async <T>(\n connector: IChainConnectorDot,\n networkId: DotNetworkId,\n queries: RpcQueryPack<T>[]\n) => {\n const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(isNotNil)\n\n // doing a query without keys would throw an error => return early\n if (!allStateKeys.length)\n return queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null)))\n\n const [result] = await connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [\n allStateKeys,\n ])\n\n return decodeRpcQueryPack(queries, result)\n}\n\nexport const getRpcQueryPack$ = <T>(\n connector: IChainConnectorDot,\n networkId: DotNetworkId,\n queries: RpcQueryPack<T>[],\n timeout: number | false = false\n): Observable<T[]> => {\n const allStateKeys = queries.flatMap(({ stateKeys }) => stateKeys).filter(isNotNil)\n\n // doing a query without keys would throw an error => return early\n if (!allStateKeys.length)\n return of(queries.map(({ stateKeys, decodeResult }) => decodeResult(stateKeys.map(() => null))))\n\n return new Observable<T[]>((subscriber) => {\n // first subscription callback includes results for all state keys, but further callbacks will only include the ones that changed\n // => we need to keep all results in memory and update them after each callback, so we can emit the full result set each time\n const changesCache: Record<`0x${string}`, `0x${string}`> = {}\n\n const promUnsub = connector.subscribe(\n networkId,\n \"state_subscribeStorage\",\n \"state_storage\",\n [allStateKeys],\n (error, result: QueryStorageResultContent) => {\n if (error) subscriber.error(error)\n else if (result) {\n // update the cache\n for (const [stateKey, encodedResult] of result.changes)\n changesCache[stateKey] = encodedResult\n\n // regenerate the full changes array\n const changes = toPairs(changesCache) as QueryStorageChange[]\n\n // decode and emit results for all queries\n subscriber.next(decodeRpcQueryPack(queries, { block: result.block, changes }))\n }\n },\n timeout\n )\n\n return () => {\n promUnsub.then((unsub) => unsub(\"state_unsubscribeStorage\"))\n }\n })\n}\n\nconst decodeRpcQueryPack = <T>(\n queries: RpcQueryPack<T>[],\n result: QueryStorageResultContent\n): T[] => {\n return queries.reduce((acc, { stateKeys, decodeResult }) => {\n const changes = stateKeys.map((stateKey) => {\n if (!stateKey || !result) return null\n\n const change = result.changes.find(([key]) => key === stateKey)\n if (!change) return null\n\n return change[1]\n })\n\n acc.push(decodeResult(changes))\n\n return acc\n }, [] as T[])\n}\n","import { parseMetadataRpc, type UnifiedMetadata } from \"@talismn/scale\"\n\nexport const hasStorageItem = (\n metadata: UnifiedMetadata,\n palletName: string,\n itemName: string\n): boolean => {\n const pallet = metadata.pallets.find((p) => p.name === palletName)\n if (!pallet || !pallet.storage) return false\n return pallet.storage.items.some((item) => item.name === itemName)\n}\n\nexport const hasStorageItems = (\n metadata: UnifiedMetadata,\n palletName: string,\n itemNames: string[]\n): boolean => {\n const pallet = metadata.pallets.find((p) => p.name === palletName)\n if (!pallet || !pallet.storage) return false\n return itemNames.every((itemName) => pallet.storage?.items.some((item) => item.name === itemName))\n}\n\nexport const hasRuntimeApi = (\n metadata: UnifiedMetadata,\n apiName: string,\n method: string\n): boolean => {\n const api = metadata.apis.find((api) => api.name === apiName)\n if (!api || !api.methods) return false\n return api.methods.some((m) => m.name === method)\n}\n\nexport const getConstantValue = <T>(\n metadataRpc: `0x${string}`,\n pallet: string,\n constant: string\n) => {\n const { unifiedMetadata, builder } = parseMetadataRpc(metadataRpc)\n\n const codec = builder.buildConstant(pallet, constant)\n\n const encodedValue = unifiedMetadata.pallets\n .find(({ name }) => name === pallet)\n ?.constants.find(({ name }) => name === constant)?.value\n\n if (!encodedValue) throw new Error(`Constant ${pallet}.${constant} not found`)\n\n return codec.dec(encodedValue) as T\n}\n\nexport const tryGetConstantValue = <T>(\n metadataRpc: `0x${string}`,\n pallet: string,\n constant: string\n) => {\n const { unifiedMetadata, builder } = parseMetadataRpc(metadataRpc)\n\n const encodedValue = unifiedMetadata.pallets\n .find(({ name }) => name === pallet)\n ?.constants.find(({ name }) => name === constant)?.value\n\n if (!encodedValue) return null\n\n const codec = builder.buildConstant(pallet, constant)\n\n return codec.dec(encodedValue) as T\n}\n","import { parseTokenId, type TokenId, type TokenType } from \"@talismn/chaindata-provider\"\nimport { isEqual } from \"lodash-es\"\nimport { BehaviorSubject, distinctUntilChanged, map } from \"rxjs\"\n\nconst tokenIdsByAddress = new BehaviorSubject<Record<string, TokenId[]>>({})\n\nexport const setDetectedTokenIds = (address: string, type: TokenType, tokenIds: TokenId[]) => {\n // keep token ids from other token types (will be useful once we add token2022)\n const otherTokens =\n tokenIdsByAddress.value[address]?.filter((id) => parseTokenId(id).type !== type) ?? []\n\n tokenIdsByAddress.next({\n ...tokenIdsByAddress.value,\n [address]: otherTokens.concat(tokenIds).sort(),\n })\n}\n\nexport const getDetectedTokensIds$ = (address: string) =>\n tokenIdsByAddress.pipe(\n map((ownedTokens) => ownedTokens[address] ?? []),\n distinctUntilChanged<TokenId[]>(isEqual)\n )\n","import { deserializeMetadata } from \"@metaplex-foundation/mpl-token-metadata\"\nimport { publicKey, sol } from \"@metaplex-foundation/umi\"\nimport { MintLayout } from \"@solana/spl-token\"\nimport { PublicKey } from \"@solana/web3.js\"\nimport type { IChainConnectorSol } from \"@talismn/chain-connectors\"\nimport {\n parseSolSplTokenId,\n type SolSplToken,\n SolSplTokenSchema,\n solSplTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign, omit } from \"lodash-es\"\nimport z from \"zod/v4\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\nconst TokenCacheSchema = z.discriminatedUnion(\"isValid\", [\n z.strictObject({\n id: SolSplTokenSchema.shape.id,\n isValid: z.literal(true),\n ...SolSplTokenSchema.pick({ symbol: true, decimals: true, name: true, logo: true }).shape,\n }),\n z.strictObject({\n id: SolSplTokenSchema.shape.id,\n isValid: z.literal(false),\n }),\n])\n\ntype CachedToken = z.infer<typeof TokenCacheSchema>\n\nconst METAPLEX_PROGRAM_ID = new PublicKey(\"metaqbxxUerdq28cj1RbAWkYQm3ybzjb6a8bt518x1s\")\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n cache,\n}) => {\n const result: SolSplToken[] = []\n\n for (const tokenConfig of tokens) {\n const tokenId = solSplTokenId(networkId, tokenConfig.mintAddress)\n let cached = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (!cached) {\n const tokenInfo = await fetchOnChainTokenData(connector, tokenId)\n if (tokenInfo) cache[tokenId] = tokenInfo\n }\n\n cached = (cache[tokenId] && TokenCacheSchema.safeParse(cache[tokenId]).data) as\n | CachedToken\n | undefined\n\n if (cached?.isValid === false) continue\n\n const base: Pick<SolSplToken, \"id\" | \"type\" | \"networkId\" | \"platform\"> = {\n id: tokenId,\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n }\n\n const token = assign(\n base,\n cached?.isValid ? omit(cached, [\"isValid\"]) : {},\n tokenConfig\n ) as SolSplToken\n\n const parsed = SolSplTokenSchema.safeParse(token)\n if (!parsed.success) {\n log.warn(\"Ignoring token with invalid SolSplTokenSchema\", {\n token,\n })\n continue\n }\n\n result.push(parsed.data)\n }\n\n return result\n}\n\nconst ERROR_NO_MINT = \"No mint info available\"\nconst ERROR_NO_METADATA = \"No metadata account found\"\nconst ERROR_INVALID_DATA = \"Invalid on-chain data\"\n\nconst fetchOnChainTokenData = async (connector: IChainConnectorSol, tokenId: string) => {\n try {\n const { networkId, mintAddress } = parseSolSplTokenId(tokenId)\n\n const connection = await connector.getConnection(networkId)\n if (!connection) {\n log.warn(`No connection found for network ${networkId}`)\n return null\n }\n\n const mintPubKey = new PublicKey(mintAddress)\n const mintInfo = await connection.getAccountInfo(mintPubKey)\n if (!mintInfo?.data) throw new Error(ERROR_NO_MINT)\n const mint = MintLayout.decode(mintInfo.data)\n\n const [metadataPDA] = PublicKey.findProgramAddressSync(\n [Buffer.from(\"metadata\"), METAPLEX_PROGRAM_ID.toBuffer(), mintPubKey.toBuffer()],\n METAPLEX_PROGRAM_ID\n )\n\n // 3. Fetch metadata account directly (traditional way)\n const metadataAccount = await connection.getAccountInfo(new PublicKey(metadataPDA))\n if (!metadataAccount) throw new Error(ERROR_NO_METADATA)\n\n const metadata = deserializeMetadata({\n publicKey: publicKey(metadataPDA),\n executable: metadataAccount.executable,\n owner: publicKey(metadataAccount.owner),\n lamports: sol(metadataAccount.lamports),\n data: metadataAccount.data,\n })\n\n const parsed = TokenCacheSchema.safeParse({\n id: tokenId,\n symbol: metadata.symbol.trim(),\n name: metadata.name.trim(),\n decimals: mint.decimals,\n isValid: true,\n })\n\n if (!parsed.success) throw new Error(ERROR_INVALID_DATA)\n\n return parsed.data\n } catch (err) {\n const msg = (err as Error).message\n\n if ([ERROR_NO_MINT, ERROR_NO_METADATA, ERROR_INVALID_DATA].includes(msg))\n return TokenCacheSchema.parse({\n id: tokenId,\n isValid: false,\n })\n\n log.warn(\"Failed to fetch sol-spl token data for %s\", tokenId, { err })\n }\n\n return null\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = () => {\n throw new Error(\"MiniMetadata is not supported for solana tokens\")\n}\n","import {\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n getAccount,\n getAssociatedTokenAddress,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\"\nimport { type Connection, PublicKey, type TransactionInstruction } from \"@solana/web3.js\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] =\n async ({ from, to, value, token, connector }) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const connection = await connector.getConnection(token.networkId)\n\n const instructions: TransactionInstruction[] = []\n\n const mint = new PublicKey(token.mintAddress)\n const fromWallet = new PublicKey(from)\n const toWallet = new PublicKey(to)\n\n // Get associated token accounts\n const fromTokenAccount = await getAssociatedTokenAddress(mint, fromWallet)\n const toTokenAccount = await getAssociatedTokenAddress(mint, toWallet)\n\n // Create the target token account if it doesn't exist\n if (!(await tokenAccountExists(connection, toTokenAccount))) {\n instructions.push(\n createAssociatedTokenAccountInstruction(\n fromWallet, // funder\n toTokenAccount,\n toWallet,\n mint\n )\n )\n }\n\n // Transfer the tokens\n instructions.push(\n createTransferInstruction(\n fromTokenAccount,\n toTokenAccount,\n fromWallet,\n BigInt(value),\n [],\n TOKEN_PROGRAM_ID\n )\n )\n\n return instructions\n }\n\nconst tokenAccountExists = async (connection: Connection, address: PublicKey) => {\n try {\n await getAccount(connection, address)\n return true\n } catch {\n return false\n }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SolSplBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SolSplTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SolSplTokenConfigSchema = z.strictObject({\n mintAddress: SolSplTokenSchema.shape.mintAddress,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SolSplTokenConfig = z.infer<typeof SolSplTokenConfigSchema>\n","import { SubAssetsTokenSchema } from \"@talismn/chaindata-provider\"\nimport type z from \"zod/v4\"\n\nimport type { SubAssetsTokenConfigSchema } from \"./types\"\n\nexport const MODULE_TYPE = SubAssetsTokenSchema.shape.type.value\nexport const PLATFORM = SubAssetsTokenSchema.shape.platform.value\n\nexport type TokenConfig = z.infer<typeof SubAssetsTokenConfigSchema>\n","import { decodeScale, type MetadataBuilder } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\n\nimport log from \"../../log\"\nimport type { AmountWithLabel, IBalance, MiniMetadata } from \"../../types\"\nimport { type BalanceDef, buildNetworkStorageCoders } from \"../shared\"\nimport type { MaybeStateKey, RpcQueryPack } from \"../shared/rpcQueryPack\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const buildQueries = (\n networkId: string,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n miniMetadata: MiniMetadata\n): Array<RpcQueryPack<IBalance>> => {\n const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {\n storage: [\"Assets\", \"Account\"],\n })\n\n return balanceDefs\n .map(({ token, address }): RpcQueryPack<IBalance> | null => {\n const scaleCoder = networkStorageCoders?.storage\n const stateKey =\n tryEncode(scaleCoder, Number(token.assetId), address) ?? // Asset Hub\n tryEncode(scaleCoder, BigInt(token.assetId), address) // Astar\n\n if (!stateKey) {\n log.warn(\n `Invalid assetId / address in ${networkId} storage query ${token.assetId} / ${address}`\n )\n return null\n }\n\n const decodeResult = (changes: MaybeStateKey[]) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n balance?: bigint\n\n // On other networks than Astar\n is_frozen?: boolean\n\n // Astar specific fields\n reason?: { type?: \"Sufficient\" }\n status?: { type?: \"Liquid\" } | { type?: \"Frozen\" }\n extra?: undefined\n }\n\n const decoded = decodeScale<DecodedType>(\n scaleCoder,\n changes[0],\n `Failed to decode substrate-assets balance on chain ${networkId}`\n ) ?? {\n balance: 0n,\n is_frozen: false,\n reason: { type: \"Sufficient\" },\n status: { type: \"Liquid\" },\n extra: undefined,\n }\n\n const isFrozen = decoded?.status?.type === \"Frozen\"\n const amount = (decoded?.balance ?? 0n).toString()\n\n // due to the following balance calculations, which are made in the `Balance` type:\n //\n // total balance = (free balance) + (reserved balance)\n // transferable balance = (free balance) - (frozen balance)\n //\n // when `isFrozen` is true we need to set **both** the `free` and `frozen` amounts\n // of this balance to the value we received from the RPC.\n //\n // if we only set the `frozen` amount, then the `total` calculation will be incorrect!\n const free = amount\n const frozen = token.isFrozen || isFrozen ? amount : \"0\"\n\n // include balance values even if zero, so that newly-zero values overwrite old values\n const balanceValues: Array<AmountWithLabel<string>> = [\n { type: \"free\", label: \"free\", amount: free.toString() },\n { type: \"locked\", label: \"frozen\", amount: frozen.toString() },\n ]\n\n const balance: IBalance = {\n source: \"substrate-assets\",\n status: \"live\",\n address,\n networkId,\n tokenId: token.id,\n values: balanceValues,\n }\n\n return balance\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n .filter(isNotNil)\n}\n\ntype ScaleStorageCoder = ReturnType<MetadataBuilder[\"buildStorage\"]>\n\nconst tryEncode = (scaleCoder: ScaleStorageCoder | undefined, ...args: unknown[]) => {\n try {\n return scaleCoder?.keys?.enc?.(...args) as MaybeStateKey\n } catch {\n return null\n }\n}\n","import log from \"../../log\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { buildQueries } from \"./buildQueries\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n const balances = await fetchRpcQueryPack(connector, networkId, queries)\n\n return balanceDefs.reduce<FetchBalanceResults>(\n (acc, def) => {\n const balance = balances.find(\n (b) => b?.address === def.address && b?.tokenId === def.token.id\n )\n if (balance) acc.success.push(balance)\n //if no entry consider empty balance\n else\n acc.success.push({\n address: def.address,\n networkId,\n tokenId: def.token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values: [\n { type: \"free\", label: \"free\", amount: \"0\" },\n { type: \"locked\", label: \"frozen\", amount: \"0\" },\n ],\n })\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","import {\n type AnyMiniMetadata,\n type SubAssetsToken,\n SubAssetsTokenSchema,\n subAssetTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { getStorageKeyPrefix, parseMetadataRpc } from \"@talismn/scale\"\nimport { assign, keyBy, keys } from \"lodash-es\"\nimport type { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { QueryStorageResult } from \"../shared\"\nimport { MODULE_TYPE, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n miniMetadata,\n}) => {\n const anyMiniMetadata = miniMetadata as AnyMiniMetadata\n if (!anyMiniMetadata?.data) return []\n\n const { builder } = parseMetadataRpc(anyMiniMetadata.data)\n const assetCodec = builder.buildStorage(\"Assets\", \"Asset\")\n const metadataCodec = builder.buildStorage(\"Assets\", \"Metadata\")\n\n const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([\n connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"Assets\", \"Asset\"),\n ]),\n connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"Assets\", \"Metadata\"),\n ]),\n ])\n\n const [assetStorageResults, metadataStorageResults] = await Promise.all([\n connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [allAssetStorageKeys]),\n connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [allMetadataStorageKeys]),\n ])\n\n const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : []\n const metadataStorageEntries = metadataStorageResults.length\n ? metadataStorageResults[0].changes\n : []\n\n const assetByAssetId = keyBy(\n assetStorageEntries.map(([key, value]) => {\n const [assetId] = assetCodec.keys.dec(key) as [number]\n const asset = assetCodec.value.dec(value) as {\n is_sufficient: boolean\n min_balance: bigint\n }\n return { assetId, existentialDeposit: asset.min_balance, isSufficient: asset.is_sufficient }\n }),\n (a) => a.assetId\n )\n\n const metadataByAssetId = keyBy(\n metadataStorageEntries.map(([key, value]) => {\n const [assetId] = metadataCodec.keys.dec(key) as [number]\n const metadata = metadataCodec.value.dec(value) as {\n decimals?: number\n deposit?: bigint\n is_frozen?: boolean\n name?: Binary\n symbol?: Binary\n }\n return {\n assetId,\n decimals: metadata.decimals,\n isFrozen: metadata.is_frozen,\n name: metadata.name?.asText(),\n symbol: metadata.symbol?.asText(),\n }\n }),\n (a) => a.assetId\n )\n\n const allTokens = keys(assetByAssetId).map((assetId) =>\n assign({}, assetByAssetId[assetId], metadataByAssetId[assetId] ?? undefined)\n )\n\n const configTokenByAssetId = keyBy(tokens, (t) => t.assetId)\n\n return (\n allTokens\n .map(\n (asset): SubAssetsToken => ({\n id: subAssetTokenId(networkId, String(asset.assetId)),\n type: MODULE_TYPE,\n platform: \"polkadot\",\n networkId,\n assetId: String(asset.assetId),\n isSufficient: asset.isSufficient,\n isFrozen: asset.isFrozen,\n name: asset.name,\n symbol: asset.symbol as string,\n decimals: asset.decimals ?? 0,\n existentialDeposit: String(asset.existentialDeposit),\n isDefault: true,\n })\n )\n // keep all tokens listed in the config + all tokens marked as sufficient\n .filter((token) => {\n const configToken = configTokenByAssetId[token.assetId]\n return configToken || token.isSufficient\n })\n // apply config overrides\n .map((token) => {\n const configToken = configTokenByAssetId[token.assetId]\n return configToken ? assign({}, token, configToken) : token\n })\n // validate results\n .filter((t) => {\n const parsed = SubAssetsTokenSchema.safeParse(t)\n // if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE}`, t)\n\n return parsed.success\n })\n )\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, hasStorageItems } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc),\n extra: null,\n } as AnyMiniMetadata\n}\n\nconst getData = (metadataRpc: `0x${string}`): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n // ensure the network has all the required bits\n if (!hasStorageItems(unifiedMetadata, \"Assets\", [\"Account\", \"Asset\", \"Metadata\"])) return null\n\n compactMetadata(metadata, [{ pallet: \"Assets\", items: [\"Account\", \"Asset\", \"Metadata\"] }])\n\n return encodeMetadata(metadata)\n}\n","import { evmErc20TokenId, type NetworkList, type TokenList } from \"@talismn/chaindata-provider\"\nimport {\n newTokenRates,\n type TokenRateCurrency,\n type TokenRates,\n type TokenRatesList,\n} from \"@talismn/token-rates\"\nimport {\n BigMath,\n isArrayOf,\n isBigInt,\n type NonFunctionProperties,\n planckToTokens,\n} from \"@talismn/util\"\nimport BigNumber from \"bignumber.js\"\n\nimport log from \"../log\"\nimport type { SubDTaoBalanceMeta } from \"../modules\"\nimport { getDTaoTokenRates } from \"../modules/substrate-dtao\"\nimport type {\n Amount,\n AmountWithLabel,\n BalanceJson,\n BalanceJsonList,\n BalanceStatusTypes,\n ExtraAmount,\n IBalance,\n LockedAmount,\n} from \"./balancetypes\"\n\ntype FormattedAmount<GenericAmount extends AmountWithLabel<TLabel>, TLabel extends string> = Omit<\n GenericAmount,\n \"amount\"\n> & {\n amount: BalanceFormatter\n}\n\nexport function excludeFromTransferableAmount(\n locks:\n | Amount\n | FormattedAmount<LockedAmount<string>, string>\n | Array<FormattedAmount<LockedAmount<string>, string>>\n): bigint {\n if (typeof locks === \"string\") return BigInt(locks)\n if (!Array.isArray(locks)) locks = [locks]\n\n return locks\n .filter((lock) => lock.includeInTransferable !== true)\n .map((lock) => lock.amount.planck)\n .reduce((max, lock) => BigMath.max(max, lock), 0n)\n}\n\nexport function excludeFromFeePayableLocks(\n locks: Amount | LockedAmount<string> | Array<LockedAmount<string>>\n): Array<LockedAmount<string>> {\n if (typeof locks === \"string\") return []\n if (!Array.isArray(locks)) locks = [locks]\n\n return locks.filter((lock) => lock.excludeFromFeePayable)\n}\n\nexport function includeInTotalExtraAmount(\n extra?:\n | FormattedAmount<ExtraAmount<string>, string>\n | Array<FormattedAmount<ExtraAmount<string>, string>>\n): bigint {\n if (!extra) return 0n\n if (!Array.isArray(extra)) extra = [extra]\n\n return extra\n .filter((extra) => extra.includeInTotal)\n .map((extra) => extra.amount.planck)\n .reduce((a, b) => a + b, 0n)\n}\n\n/** A utility type used to extract the underlying `BalanceType` of a specific source from a generalised `BalanceJson` */\nexport type NarrowBalanceType<S extends IBalance, P> = S extends { source: P } ? S : never\nexport type BalanceSource = BalanceJson[\"source\"]\n\n/** TODO: Remove this in favour of a frontend-friendly `ChaindataProvider` */\nexport type HydrateDb = Partial<{\n networks: NetworkList\n tokens: TokenList\n tokenRates: TokenRatesList\n}>\n\nexport type BalanceSearchQuery =\n | Partial<NonFunctionProperties<Balance>>\n | ((balance: Balance) => boolean)\n\n/**\n * A collection of balances.\n */\nexport class Balances {\n //\n // Properties\n //\n\n #balancesMap: Map<string, Balance> = new Map()\n #cachedArray: Balance[] | null = null\n #cachedFilteredMirrorTokens: Balances | null = null\n #cachedSumFormatter: SumBalancesFormatter | null = null\n\n //\n // Methods\n //\n\n constructor(\n balances: Balances | BalanceJsonList | Balance[] | IBalance[] | BalanceJson[] | Balance,\n hydrate?: HydrateDb\n ) {\n // handle Balances (convert to Balance[])\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n if (balances instanceof Balances) return new Balances([...balances], hydrate)\n\n // handle Balance (convert to Balance[])\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n if (balances instanceof Balance) return new Balances([balances], hydrate)\n\n // handle BalanceJsonList (the only remaining non-array type of balances) (convert to BalanceJson[])\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n if (!Array.isArray(balances)) return new Balances(Object.values(balances), hydrate)\n\n // handle no balances\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n if (balances.length === 0) return this\n\n // handle BalanceJson[]\n if (!isArrayOf(balances, Balance))\n // biome-ignore lint/correctness/noConstructorReturn: legacy\n return new Balances(\n balances.map((storage) => new Balance(storage)),\n hydrate\n )\n\n // handle Balance[]\n this.#balancesMap = new Map(balances.map((b) => [b.id, b]))\n if (hydrate !== undefined) this.hydrate(hydrate)\n }\n\n /**\n * Calling toJSON on a collection of balances will return the underlying BalanceJsonList.\n */\n toJSON = (): BalanceJsonList =>\n Object.fromEntries(\n [...this.#balancesMap.values()]\n .map((balance) => {\n try {\n return [balance.id, balance.toJSON()]\n } catch (error) {\n log.error(\"Failed to convert balance to JSON\", error, { id: balance.id, balance })\n return null\n }\n })\n .filter(Array.isArray)\n );\n\n /**\n * Allows the collection to be iterated over.\n *\n * @example\n * [...balances].forEach(balance => { // do something // })\n *\n * @example\n * for (const balance of balances) {\n * // do something\n * }\n */\n [Symbol.iterator] = () => this.#balancesMap.values()[Symbol.iterator]()\n\n /**\n * Hydrates all balances in this collection.\n *\n * @param sources - The sources to hydrate from.\n */\n hydrate = (sources: HydrateDb) => {\n // Invalidate caches — hydrate mutates Balance objects, so derived caches become stale\n this.#cachedArray = null\n this.#cachedFilteredMirrorTokens = null\n this.#cachedSumFormatter = null\n for (const balance of this.#balancesMap.values()) balance.hydrate(sources)\n }\n\n /**\n * Retrieve a balance from this collection by id.\n *\n * @param id - The id of the balance to fetch.\n * @returns The balance if one exists, or none.\n */\n get = (id: string): Balance | null => this.#balancesMap.get(id) ?? null\n\n /**\n * Retrieve balances from this collection by search query.\n *\n * @param query - The search query.\n * @returns All balances which match the query.\n */\n find = (query: BalanceSearchQuery | BalanceSearchQuery[]): Balances => {\n // construct filter\n const queryArray: BalanceSearchQuery[] = Array.isArray(query) ? query : [query]\n const orQueries = queryArray.map((query) =>\n typeof query === \"function\" ? query : Object.entries(query)\n )\n\n // filter balances\n const filter = (balance: Balance) =>\n orQueries.some((query) =>\n typeof query === \"function\"\n ? query(balance)\n : query.every(([key, value]) => balance[key as keyof BalanceSearchQuery] === value)\n )\n\n // return filter matches\n return new Balances(this.#toArray().filter(filter))\n }\n\n /**\n * Filters this collection to exclude token balances where the token has a `mirrorOf` field\n * and another balance exists in this collection for the token specified by the `mirrorOf` field.\n */\n filterMirrorTokens = (): Balances => {\n if (!this.#cachedFilteredMirrorTokens) {\n const balances = this.#toArray()\n const tokenIds = new Set<string>()\n for (const b of balances) {\n if (b.tokenId) tokenIds.add(b.tokenId)\n }\n this.#cachedFilteredMirrorTokens = new Balances(\n balances.filter((balance) => {\n const mirrorOf = balance.token?.mirrorOf\n return !mirrorOf || !tokenIds.has(mirrorOf)\n })\n )\n }\n return this.#cachedFilteredMirrorTokens\n }\n\n /**\n * Filters this collection to only include balances which are not zero AND have a fiat conversion rate.\n */\n filterNonZeroFiat = (\n type:\n | \"total\"\n | \"free\"\n | \"reserved\"\n | \"locked\"\n | \"frozen\"\n | \"transferable\"\n | \"unavailable\"\n | \"feePayable\",\n currency: TokenRateCurrency\n ): Balances => {\n const filter = (balance: Balance) => (balance[type].fiat(currency) ?? 0) > 0\n return this.find(filter)\n }\n\n /**\n * Add some balances to this collection.\n * Added balances take priority over existing balances.\n * The aggregation of the two collections is returned.\n * The original collection is not mutated.\n *\n * @param balances - Either a balance or collection of balances to add.\n * @returns The new collection of balances.\n */\n add = (balances: Balances | Balance): Balances => {\n if (balances instanceof Balance) return this.add(new Balances(balances))\n const mergedMap = new Map(this.#balancesMap)\n for (const balance of balances) mergedMap.set(balance.id, balance)\n return new Balances([...mergedMap.values()])\n }\n\n /**\n * Remove balances from this collection by id.\n * A new collection without these balances is returned.\n * The original collection is not mutated.\n *\n * @param ids - The id(s) of the balances to remove.\n * @returns The new collection of balances.\n */\n remove = (ids: string[] | string): Balances => {\n if (!Array.isArray(ids)) return this.remove([ids])\n const idSet = new Set(ids)\n return new Balances(this.#toArray().filter((balance) => !idSet.has(balance.id)))\n }\n\n // TODO: Add some more useful aggregator methods\n\n #toArray = (): Balance[] => {\n if (!this.#cachedArray) this.#cachedArray = [...this.#balancesMap.values()]\n return this.#cachedArray\n }\n\n get each() {\n return this.#toArray()\n }\n\n /** @deprecated use each instead */\n get sorted() {\n return this.each\n }\n\n /**\n * Get the number of balances in this collection.\n *\n * @returns The number of balances in this collection.\n */\n get count() {\n return this.#balancesMap.size\n }\n\n /**\n * Get the summed value of balances in this collection.\n * TODO: Sum up token amounts AND fiat amounts\n *\n * @example\n * // Get the sum of all transferable balances in usd.\n * balances.sum.fiat('usd').transferable\n */\n get sum() {\n if (!this.#cachedSumFormatter) this.#cachedSumFormatter = new SumBalancesFormatter(this)\n return this.#cachedSumFormatter\n }\n}\n\nexport const getBalanceId = (balance: Pick<IBalance, \"address\" | \"tokenId\">) => {\n const { address, tokenId } = balance\n return [address, tokenId].join(\"::\")\n}\n\n/**\n * An individual balance.\n */\nexport class Balance {\n //\n // Properties\n //\n\n /** The underlying data for this balance */\n readonly #storage: BalanceJson\n readonly #valueGetter: BalanceValueGetter\n\n #db: HydrateDb | null = null\n\n //\n // Methods\n //\n\n constructor(storage: BalanceJson | IBalance, hydrate?: HydrateDb) {\n this.#storage = storage as BalanceJson\n this.#valueGetter = new BalanceValueGetter(this.#storage)\n if (hydrate !== undefined) this.hydrate(hydrate)\n }\n\n toJSON = (): BalanceJson => this.#storage\n\n isSource = (source: BalanceSource) => this.#storage.source === source\n // // TODO: Fix this method, the types don't work with our plugin architecture.\n // // Specifically, the `BalanceJson` type is compiled down to `IBalance` in the following way:\n // //\n // // toJSON: () => BalanceJson // works\n // // isSource: (source: BalanceSource) => boolean // works\n // // asSource: <P extends string>(source: P) => NarrowBalanceType<IBalance, P> | null // Doesn't work! IBalance should just be BalanceJson!\n // //\n // // `IBalance` won't match the type of `BalanceSource` after `PluginBalanceTypes` has been extended by balance plugins.\n // // As a result, typescript will think that the returned #storage is not a BalanceJson.\n // asSource = <P extends BalanceSource>(source: P): NarrowBalanceType<BalanceJson, P> | null => {\n // if (this.#storage.source === source) return this.#storage as NarrowBalanceType<BalanceJson, P>\n // return null\n // }\n\n hydrate = (hydrate?: HydrateDb) => {\n if (hydrate !== undefined) this.#db = hydrate\n }\n\n #format = (balance: bigint | string) =>\n new BalanceFormatter(\n isBigInt(balance) ? balance.toString() : balance,\n this.decimals || undefined,\n this.rates\n )\n\n //\n // Accessors\n //\n\n get id(): string {\n return getBalanceId(this.#storage)\n }\n\n get source() {\n return this.#storage.source\n }\n\n get status() {\n return this.#storage.status\n }\n\n get address() {\n return this.#storage.address\n }\n\n get networkId() {\n return this.#storage.networkId\n }\n\n get network() {\n return this.#db?.networks?.[this.networkId] || null\n }\n\n get tokenId() {\n return this.#storage.tokenId\n }\n get token() {\n return this.#db?.tokens?.[this.tokenId] || null\n }\n get decimals() {\n return this.token?.decimals || null\n }\n get rates(): TokenRates | null {\n // uniswap v2 lp tokens need the rates from the underlying pool assets\n //\n // To note: `@talismn/token-rates` knows to fetch the `coingeckoId0` and `coingeckoId1` rates for evm-uniswapv2 tokens.\n // They are then stored in `this.#db.tokenRates` using the `tokenId0` and `tokenId1` keys.\n //\n // This means that those rates are always available for calculating the uniswapv2 rates,\n // regardless of whether or not the underlying erc20s are actually in chaindata and enabled.\n if (this.isSource(\"evm-uniswapv2\") && this.token?.type === \"evm-uniswapv2\") {\n const tokenId0 = evmErc20TokenId(this.networkId, this.token.tokenAddress0)\n const tokenId1 = evmErc20TokenId(this.networkId, this.token.tokenAddress1)\n\n const decimals = this.token.decimals\n const decimals0 = this.token.decimals0\n const decimals1 = this.token.decimals1\n\n const rates0 = this.#db?.tokenRates?.[tokenId0]\n const rates1 = this.#db?.tokenRates?.[tokenId1]\n\n if (rates0 === undefined || rates1 === undefined) return null\n\n const extra = this.#valueGetter.get(\"extra\")\n const extras = Array.isArray(extra) ? extra : extra !== undefined ? [extra] : []\n const totalSupply = extras.find((extra) => extra.label === \"totalSupply\")?.amount ?? \"0\"\n const reserve0 = extras.find((extra) => extra.label === \"reserve0\")?.amount ?? \"0\"\n const reserve1 = extras.find((extra) => extra.label === \"reserve1\")?.amount ?? \"0\"\n\n const totalSupplyTokens = BigNumber(totalSupply).times(10 ** (-1 * decimals))\n const reserve0Tokens = BigNumber(reserve0).times(10 ** (-1 * decimals0))\n const reserve1Tokens = BigNumber(reserve1).times(10 ** (-1 * decimals1))\n\n const rates0Currencies = new Set(Object.keys(rates0) as TokenRateCurrency[])\n const rates1Currencies = new Set(Object.keys(rates1) as TokenRateCurrency[])\n // `Set.prototype.intersection` can eventually replace this\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Set/intersection\n const currencies = [...rates0Currencies].filter((c) => rates1Currencies.has(c))\n\n const totalValueLocked = currencies.map(\n (currency) =>\n [\n currency,\n // tvl (in a given currency) == reserve0*currencyRate0 + reserve1*currencyRate1\n BigNumber.sum(\n reserve0Tokens.times(rates0[currency]?.price ?? 0),\n reserve1Tokens.times(rates1[currency]?.price ?? 0)\n ),\n ] as const\n )\n\n const lpTokenRates = newTokenRates()\n totalValueLocked.forEach(([currency, tvl]) => {\n // divide `the value of all lp tokens` by `the number of lp tokens` to get `the value per token`\n if (!totalSupplyTokens.eq(0))\n lpTokenRates[currency] = { price: tvl.div(totalSupplyTokens).toNumber() }\n })\n\n return lpTokenRates\n }\n\n // dTAO balances need to be converted to the native token to compute their rate, unless we have a coingeckoId\n if (this.token?.type === \"substrate-dtao\" && !this.token.coingeckoId) {\n if (!this.#db?.tokenRates) return null\n\n const balances = this.#valueGetter.get(\"free\")\n if (!balances.length) return null\n const balanceMeta = balances[0].meta as SubDTaoBalanceMeta | undefined\n if (!balanceMeta?.scaledAlphaPrice) return null\n\n return getDTaoTokenRates(this.token, this.#db.tokenRates, balanceMeta.scaledAlphaPrice)\n }\n\n // other tokens can just pick from the tokenRates db using the tokenId\n return this.#db?.tokenRates?.[this.tokenId] || null\n }\n\n /**\n * A general method to get formatted values matching a certain type from this balance.\n * @param valueType - The type of value to get.\n * @returns An array of the values matching the type with formatted amounts.\n */\n private getValue(\n valueType: BalanceStatusTypes\n ): Array<FormattedAmount<AmountWithLabel<string>, string>> {\n return this.getRawValue(valueType).map((value) => ({\n ...value,\n amount: this.#format(value.amount),\n }))\n }\n\n /**\n * A general method to get values matching a certain type from this balance.\n * @param valueType - The type of value to get.\n * @returns An array of the values matching the type.\n */\n private getRawValue(valueType: BalanceStatusTypes): Array<AmountWithLabel<string>> {\n return this.#valueGetter.get(valueType)\n }\n\n /**\n * A general method to add a value to the array of values for this balance.\n * @param valueType - The type of value to add.\n * @returns A function which can be used to add a value to the array of values for this balance.\n */\n\n // biome-ignore lint/correctness/noUnusedPrivateClassMembers: legacy\n private addValue(valueType: BalanceStatusTypes) {\n return (value: Omit<AmountWithLabel<string>, \"type\">) => this.#valueGetter.add(valueType, value)\n }\n /**\n * The total balance of this token.\n * Includes the free and the reserved amount.\n * The balance will be reaped if this goes below the existential deposit.\n */\n get total() {\n const extra = this.getValue(\"extra\") as FormattedAmount<ExtraAmount<string>, string>[]\n\n // if there is a DelegatedStaking hold (new model: polkadot, kusama), nom pool staked amount is included in reserved\n // if not (old model: vara, avail, cere), staked amount is not in the account and it needs to be added to the total\n const nomPoolStakedPlancks = this.locks.some(\n (lock) => lock.source === \"substrate-native-holds\" && lock.label === \"DelegatedStaking\"\n )\n ? 0n\n : this.nompools.map(({ amount }) => amount.planck).reduce((a, b) => a + b, 0n)\n\n return this.#format(\n this.free.planck +\n this.reserved.planck +\n nomPoolStakedPlancks +\n includeInTotalExtraAmount(extra)\n )\n }\n /** The non-reserved balance of this token. Includes the frozen amount. Is included in the total. */\n get free() {\n // for simple balances\n if (\"value\" in this.#storage && this.#storage.value) return this.#format(this.#storage.value)\n\n // for complex balances\n const freeValues = this.getValue(\"free\")\n const totalFree = freeValues.map(({ amount }) => amount.planck).reduce((a, b) => a + b, 0n)\n return this.#format(totalFree)\n }\n /** The reserved balance of this token. Is included in the total. */\n get reserved() {\n const reservedValues = this.getValue(\"reserved\")\n if (reservedValues.length === 0) return this.#format(0n)\n\n return this.#format(\n reservedValues.map(({ amount }) => amount.planck).reduce((a, b) => a + b, 0n)\n )\n }\n get reserves() {\n return this.getValue(\"reserved\")\n }\n /** The frozen balance of this token. Is included in the free amount. */\n get locked() {\n return this.#format(\n this.locks.map(({ amount }) => amount.planck).reduce((a, b) => BigMath.max(a, b), 0n)\n )\n }\n\n get locks() {\n return this.getValue(\"locked\")\n }\n\n get nompools() {\n return this.getValue(\"nompool\")\n }\n\n /** The extra balance of this token */\n get extra() {\n const extra = this.getRawValue(\"extra\")\n if (extra.length > 0) return extra as ExtraAmount<string>[]\n return undefined\n }\n\n /** @deprecated Use balance.locked */\n get frozen() {\n return this.locked\n }\n /** The transferable balance of this token. Is generally the free amount - the miscFrozen amount. */\n get transferable() {\n /**\n * As you can see here, `locked` is subtracted from `free` in order to derive `transferable`.\n *\n * |--------------------------total--------------------------|\n * |-------------------free-------------------|---reserved---|\n * |----locked-----|-------transferable-------|\n */\n const oldTransferableCalculation = () => {\n // if no locks exist, transferable is equal to the free amount\n if (this.locks.length === 0) return this.free\n\n // find the largest lock (but ignore any locks which are marked as `includeInTransferable`)\n const excludeAmount = excludeFromTransferableAmount(this.locks)\n\n // subtract the lock from the free amount (but don't go below 0)\n return this.#format(BigMath.max(this.free.planck - excludeAmount, 0n))\n }\n\n /**\n * As you can see here, `locked` is subtracted from `free + reserved` in order to derive `transferable`.\n *\n * Alternatively, `reserved` is subtracted from `locked` in order to derive `untouchable`,\n * which is then subtracted from `free` in order to derive `transferable`.\n *\n * |--------------------------total--------------------------|\n * |---reserved---|-------------------free-------------------|\n * |--untouchable--|\n * |------------locked------------|-------transferable-------|\n */\n const newTransferableCalculation = () => {\n // if no locks exist, transferable is equal to the free amount\n if (this.locks.length === 0) return this.free\n\n // find the largest lock (but ignore any locks which are marked as `includeInTransferable`)\n // subtract the reserved amount, because locks now act upon the total balance - not just the free balance\n const untouchableAmount = BigMath.max(\n excludeFromTransferableAmount(this.locks) - this.reserved.planck,\n 0n\n )\n\n // subtract the untouchable amount from the free amount (but don't go below 0)\n return this.#format(BigMath.max(this.free.planck - untouchableAmount, 0n))\n }\n\n if (this.#storage.useLegacyTransferableCalculation) return oldTransferableCalculation()\n return newTransferableCalculation()\n }\n /**\n * The unavailable balance of this token.\n * Prior to the Fungible trait, this was the locked amount + the reserved amount, i.e. `locked + reserved`.\n * Now, it is the bigger of the locked amount and the reserved amounts, i.e. `max(locked, reserved)`.\n */\n get unavailable() {\n const oldCalculation = () => this.locked.planck + this.reserved.planck\n const newCalculation = () => BigMath.max(this.locked.planck, this.reserved.planck)\n const baseUnavailable = this.#storage.useLegacyTransferableCalculation\n ? oldCalculation()\n : newCalculation()\n\n // if there is a DelegatedStaking hold (new model: polkadot, kusama), nom pool staked amount is included in reserved\n // if not (old model: vara, avail, cere), staked amount is not in the account and it needs to be added to the total\n const nomPoolStakedPlancks = this.locks.some(\n (lock) => lock.source === \"substrate-native-holds\" && lock.label === \"DelegatedStaking\"\n )\n ? 0n\n : this.nompools.map(({ amount }) => amount.planck).reduce((a, b) => a + b, 0n)\n\n return this.#format(baseUnavailable + nomPoolStakedPlancks)\n }\n\n /** The feePayable balance of this token. Is generally the free amount - the feeFrozen amount. */\n get feePayable() {\n // if no locks exist, feePayable is equal to the free amount\n if (this.locks.length === 0) return this.free\n\n // find the largest lock which can't be used to pay tx fees\n const excludeAmount = excludeFromFeePayableLocks(this.locked.planck.toString())\n .map((lock) => BigInt(lock.amount))\n .reduce((max, lock) => BigMath.max(max, lock), 0n)\n\n // subtract the lock from the free amount (but don't go below 0)\n return this.#format(BigMath.max(this.free.planck - excludeAmount, 0n))\n }\n}\n\nexport class BalanceValueGetter {\n #storage: BalanceJson\n\n constructor(storage: BalanceJson) {\n this.#storage = storage\n }\n\n get(valueType: BalanceStatusTypes) {\n if (\"values\" in this.#storage && this.#storage.values)\n return this.#storage.values.filter(({ type }) => type === valueType)\n return []\n }\n\n add(valueType: BalanceStatusTypes, amount: Omit<AmountWithLabel<string>, \"type\">) {\n if (\"values\" in this.#storage && this.#storage.values)\n this.#storage.values.push({ type: valueType, ...amount })\n }\n}\n\nexport class BalanceFormatter {\n #planck: string\n #decimals: number\n #tokenRates: TokenRates | null\n\n constructor(\n planck: string | bigint | undefined,\n decimals?: number | undefined,\n fiatRatios?: TokenRates | null\n ) {\n this.#planck = isBigInt(planck) ? planck.toString() : (planck ?? \"0\")\n this.#decimals = decimals || 0\n this.#tokenRates = fiatRatios || null\n }\n\n toJSON = () => this.#planck\n\n get planck() {\n return BigInt(this.#planck)\n }\n\n get tokens() {\n return planckToTokens(this.#planck, this.#decimals)\n }\n\n fiat(currency: TokenRateCurrency) {\n if (!this.#tokenRates) return null\n\n const ratio = this.#tokenRates[currency]\n if (!ratio) return null\n\n return parseFloat(this.tokens) * ratio.price\n }\n}\n\nexport class PlanckSumBalancesFormatter {\n #balances: Balances\n\n constructor(balances: Balances) {\n this.#balances = balances\n }\n\n #sum = (\n balanceField: {\n [K in keyof Balance]: Balance[K] extends BalanceFormatter ? K : never\n }[keyof Balance]\n ) => {\n // a function to get a planck amount from a balance\n const planck = (balance: Balance) => balance[balanceField].planck ?? 0n\n\n return this.#balances.filterMirrorTokens().each.reduce(\n // add the total amount to the planck amount of each balance\n (total, balance) => total + planck(balance),\n // start with a total of 0\n 0n\n )\n }\n\n /**\n * The total balance of these tokens. Includes the free and the reserved amount.\n */\n get total() {\n return this.#sum(\"total\")\n }\n /** The non-reserved balance of these tokens. Includes the frozen amount. Is included in the total. */\n get free() {\n return this.#sum(\"free\")\n }\n /** The reserved balance of these tokens. Is included in the total. */\n get reserved() {\n return this.#sum(\"reserved\")\n }\n /** The frozen balance of these tokens. Is included in the free amount. */\n get locked() {\n return this.#sum(\"locked\")\n }\n /** @deprecated Use balances.locked */\n get frozen() {\n return this.locked\n }\n /** The transferable balance of these tokens. Is generally the free amount - the miscFrozen amount. */\n get transferable() {\n return this.#sum(\"transferable\")\n }\n /** The unavailable balance of these tokens. */\n get unavailable() {\n return this.#sum(\"unavailable\")\n }\n\n /** The feePayable balance of these tokens. Is generally the free amount - the feeFrozen amount. */\n get feePayable() {\n return this.#sum(\"feePayable\")\n }\n}\n\nexport class FiatSumBalancesFormatter {\n #balances: Balances\n #currency: TokenRateCurrency\n\n constructor(balances: Balances, currency: TokenRateCurrency) {\n this.#balances = balances\n this.#currency = currency\n }\n\n #sum = (\n balanceField: {\n [K in keyof Balance]: Balance[K] extends BalanceFormatter ? K : never\n }[keyof Balance]\n ) => {\n // a function to get a fiat amount from a balance\n const fiat = (balance: Balance) => balance[balanceField].fiat(this.#currency) ?? 0\n\n return this.#balances.filterMirrorTokens().each.reduce(\n // add the total amount to the fiat amount of each balance\n (total, balance) => total + fiat(balance),\n // start with a total of 0\n 0\n )\n }\n\n /**\n * The total balance of these tokens. Includes the free and the reserved amount.\n */\n get total() {\n return this.#sum(\"total\")\n }\n /** The non-reserved balance of these tokens. Includes the frozen amount. Is included in the total. */\n get free() {\n return this.#sum(\"free\")\n }\n /** The reserved balance of these tokens. Is included in the total. */\n get reserved() {\n return this.#sum(\"reserved\")\n }\n /** The frozen balance of these tokens. Is included in the free amount. */\n get locked() {\n return this.#sum(\"locked\")\n }\n /** @deprecated Use balances.locked */\n get frozen() {\n return this.locked\n }\n /** The transferable balance of these tokens. Is generally the free amount - the miscFrozen amount. */\n get transferable() {\n return this.#sum(\"transferable\")\n }\n /** The unavailable balance of these tokens. */\n get unavailable() {\n return this.#sum(\"unavailable\")\n }\n /** The feePayable balance of these tokens. Is generally the free amount - the feeFrozen amount. */\n get feePayable() {\n return this.#sum(\"feePayable\")\n }\n}\n\nexport class SumBalancesFormatter {\n #balances: Balances\n\n constructor(balances: Balances) {\n this.#balances = balances\n }\n\n get planck() {\n return new PlanckSumBalancesFormatter(this.#balances)\n }\n\n fiat(currency: TokenRateCurrency) {\n return new FiatSumBalancesFormatter(this.#balances, currency)\n }\n\n change24h(currency: TokenRateCurrency) {\n return new Change24hCurrencyFormatter(this.#balances, currency)\n }\n}\n\nexport class Change24hCurrencyFormatter {\n #balances: Balances\n #currency: TokenRateCurrency\n\n constructor(balances: Balances, currency: TokenRateCurrency) {\n this.#balances = balances\n this.#currency = currency\n }\n\n #change24h = (\n balanceField: {\n [K in keyof Balance]: Balance[K] extends BalanceFormatter ? K : never\n }[keyof Balance]\n ) => {\n const output = this.#balances.filterMirrorTokens().each.reduce(\n // add the total amount to the fiat amount of each balance\n (acc, balance) => {\n const change24h = balance.rates?.[this.#currency]?.change24h\n if (typeof change24h !== \"number\") return acc\n const fiat = balance[balanceField].fiat(this.#currency)\n if (!fiat) return acc\n\n return {\n totalFiatDiff: acc.totalFiatDiff + fiat * change24h,\n totalFiat: acc.totalFiat + fiat,\n }\n },\n // start with a total of 0\n { totalFiatDiff: 0, totalFiat: 0 }\n )\n\n return output.totalFiat === 0\n ? null\n : {\n diff: output.totalFiatDiff / 100,\n ratio: output.totalFiatDiff / output.totalFiat,\n }\n }\n\n get total() {\n return this.#change24h(\"total\")\n }\n get free() {\n return this.#change24h(\"free\")\n }\n get reserved() {\n return this.#change24h(\"reserved\")\n }\n get locked() {\n return this.#change24h(\"locked\")\n }\n get frozen() {\n return this.#change24h(\"frozen\")\n }\n get transferable() {\n return this.#change24h(\"transferable\")\n }\n get unavailable() {\n return this.#change24h(\"unavailable\")\n }\n get feePayable() {\n return this.#change24h(\"feePayable\")\n }\n}\n\nexport const filterMirrorTokens = (balance: Balance, _i: number, balances: Balance[]) => {\n const mirrorOf = balance.token?.mirrorOf\n return !mirrorOf || !balances.find((b) => b.tokenId === mirrorOf)\n}\n","export const TAO_DECIMALS = 9n\n\n// manipulating price as bigint requires using at least as many decimals as TAO itself\nexport const ALPHA_PRICE_SCALE = 10n ** TAO_DECIMALS\n\nexport const getScaledAlphaPrice = (alphaIn: bigint, taoIn: bigint): bigint => {\n if (!alphaIn || !taoIn) return 0n\n return (taoIn * ALPHA_PRICE_SCALE) / alphaIn\n}\n\nexport const alphaToTao = (alpha: bigint, scaledAlphaPrice: bigint): bigint => {\n if (!alpha || !scaledAlphaPrice) return 0n\n return (alpha * scaledAlphaPrice) / ALPHA_PRICE_SCALE\n}\n\nexport const taoToAlpha = (tao: bigint, scaledAlphaPrice: bigint): bigint => {\n if (!tao || !scaledAlphaPrice) return 0n\n return (tao * ALPHA_PRICE_SCALE) / scaledAlphaPrice\n}\n","import { type SubDTaoToken, subNativeTokenId } from \"@talismn/chaindata-provider\"\nimport {\n newTokenRates,\n type TokenRateCurrency,\n type TokenRateData,\n type TokenRatesList,\n} from \"@talismn/token-rates\"\n\nimport log from \"../../log\"\nimport { ALPHA_PRICE_SCALE, alphaToTao, TAO_DECIMALS } from \"./alphaPrice\"\n\nconst ONE_ALPHA = 10n ** TAO_DECIMALS\n\n/**\n * To be used for tokens that don't have a coingecko id\n *\n * @param token\n * @param tokenRates\n * @param scaledAlphaPrice\n * @returns\n */\nexport const getDTaoTokenRates = (\n token: SubDTaoToken,\n tokenRates: TokenRatesList,\n scaledAlphaPrice: string | bigint\n) => {\n try {\n const taoTokenId = subNativeTokenId(token.networkId)\n const taoTokenRates = tokenRates[taoTokenId]\n if (!taoTokenRates) return null\n\n // for root subnet, same rates as TAO\n if (token.netuid === 0) return structuredClone(taoTokenRates)\n\n const alphaRates = newTokenRates()\n for (const [currency, taoRate] of Object.entries(taoTokenRates) as [\n TokenRateCurrency,\n TokenRateData | null,\n ][]) {\n if (!taoRate) {\n alphaRates[currency] = null\n } else {\n const taoPrice = alphaToTao(ONE_ALPHA, BigInt(scaledAlphaPrice))\n const priceRatio = Number(taoPrice) / Number(ALPHA_PRICE_SCALE)\n alphaRates[currency] = {\n price: taoRate.price * priceRatio,\n marketCap: taoRate.marketCap ? taoRate.marketCap * priceRatio : undefined,\n change24h: undefined, // cannot be determined from TAO rates alone\n }\n }\n }\n\n return alphaRates\n } catch (err) {\n log.error(err)\n return null\n }\n}\n","import { SubDTaoTokenSchema } from \"@talismn/chaindata-provider\"\nimport type z from \"zod/v4\"\n\nimport type { SubDTaoTokenConfigSchema } from \"./types\"\n\nexport const MODULE_TYPE = SubDTaoTokenSchema.shape.type.value\nexport const PLATFORM = SubDTaoTokenSchema.shape.platform.value\n\nexport type TokenConfig = z.infer<typeof SubDTaoTokenConfigSchema>\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport {\n getCleanToken,\n type SubDTaoToken,\n subDTaoTokenId,\n TokenSchema,\n} from \"@talismn/chaindata-provider\"\nimport { decodeScale, parseMetadataRpc } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\nimport { keyBy, uniq } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { AmountWithLabel, IBalance } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRuntimeCallResult } from \"../shared\"\nimport { fetchRpcQueryPack, type MaybeStateKey, type RpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { getScaledAlphaPrice } from \"./alphaPrice\"\nimport { calculatePendingRootClaimable } from \"./calculatePendingRootClaimable\"\nimport { MODULE_TYPE } from \"./config\"\nimport type {\n GetDynamicInfosResult,\n GetStakeInfosResult,\n SubDTaoBalance,\n SubDTaoBalanceMeta,\n} from \"./types\"\n\nconst ROOT_NETUID = 0\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`, {\n tokensWithAddresses,\n })\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const addresses = uniq(balanceDefs.map((def) => def.address))\n\n try {\n const [stakeInfos, dynamicInfos] = await Promise.all([\n fetchRuntimeCallResult<GetStakeInfosResult>(\n connector,\n networkId,\n miniMetadata.data!,\n \"StakeInfoRuntimeApi\",\n \"get_stake_info_for_coldkeys\",\n [addresses]\n ),\n fetchRuntimeCallResult<GetDynamicInfosResult>(\n connector,\n networkId,\n miniMetadata.data!,\n \"SubnetInfoRuntimeApi\",\n \"get_all_dynamic_info\",\n []\n ),\n ])\n\n const rootHotkeys = uniq(\n stakeInfos.flatMap(([, stakes]) =>\n stakes.filter((stake) => stake.netuid === ROOT_NETUID).map((stake) => stake.hotkey)\n )\n )\n const rootClaimableRatesByHotkey =\n rootHotkeys.length && miniMetadata.data\n ? await fetchRootClaimableRates(connector, networkId, miniMetadata.data, rootHotkeys)\n : new Map<string, Map<number, bigint>>()\n\n // Collect all (address, hotkey, netuid) pairs for root stakes to fetch RootClaimed amounts\n const addressHotkeyNetuidPairs: Array<[address: string, hotkey: string, netuid: number]> = []\n for (const [address, stakes] of stakeInfos) {\n for (const stake of stakes) {\n if (stake.netuid === ROOT_NETUID) {\n const claimableRates = rootClaimableRatesByHotkey.get(stake.hotkey)\n if (claimableRates) {\n // For each netuid that has a claimable rate, we need to check RootClaimed\n for (const netuid of claimableRates.keys()) {\n addressHotkeyNetuidPairs.push([address, stake.hotkey, netuid])\n }\n }\n }\n }\n }\n\n const rootClaimedAmounts =\n addressHotkeyNetuidPairs.length && miniMetadata.data\n ? await fetchRootClaimedAmounts(\n connector,\n networkId,\n miniMetadata.data,\n addressHotkeyNetuidPairs\n )\n : new Map<string, Map<string, Map<number, bigint>>>()\n\n const dynamicInfoByNetuid = keyBy(dynamicInfos.filter(isNotNil), (info) => info.netuid)\n\n // Upserts a balance into the accumulator, merging stake values if the balance already exists.\n // Eg: Acc X has root staked with validator Y, but also staked on sn 45 with the same validator Y.\n // We merge the pending root claim of sn 45 and the sn 45 stake in the same balance.\n const upsertBalance = (\n acc: Record<string, SubDTaoBalance>,\n address: string,\n tokenId: string,\n balance: SubDTaoBalance\n ): void => {\n const key = `${address}:${tokenId}`\n const recordedBalance = acc[key]\n if (recordedBalance) {\n acc[key] = {\n ...recordedBalance,\n stake: recordedBalance.stake + balance.stake,\n // If the new balance has pendingRootClaim, use it (it's calculated from current state)\n ...(balance.pendingRootClaim !== undefined && {\n pendingRootClaim: balance.pendingRootClaim,\n }),\n }\n } else {\n acc[key] = balance\n }\n }\n\n const balancesRaw = stakeInfos.reduce<Record<string, SubDTaoBalance>>(\n (acc, [address, stakes]) => {\n for (const stake of stakes) {\n // Regular stake cases\n const dynamicInfo = dynamicInfoByNetuid[stake.netuid]\n const scaledAlphaPrice = dynamicInfo\n ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in)\n : 0n\n\n const balance: SubDTaoBalance = {\n address,\n tokenId: subDTaoTokenId(networkId, stake.netuid, stake.hotkey),\n baseTokenId: subDTaoTokenId(networkId, stake.netuid),\n stake: stake.stake,\n hotkey: stake.hotkey,\n netuid: stake.netuid,\n scaledAlphaPrice,\n }\n\n upsertBalance(acc, address, balance.tokenId, balance)\n\n // Root stake cases, we need to calculate the pending root claim and add to the balances\n if (stake.netuid === ROOT_NETUID) {\n const claimableRates = rootClaimableRatesByHotkey.get(stake.hotkey) ?? new Map()\n const alreadyClaimedMap =\n rootClaimedAmounts.get(address)?.get(stake.hotkey) ?? new Map<number, bigint>()\n\n const pendingRootClaimBalances = calculatePendingRootClaimable({\n stake: stake.stake,\n hotkey: stake.hotkey,\n address,\n networkId,\n validatorRootClaimableRate: claimableRates,\n dynamicInfoByNetuid,\n alreadyClaimedByNetuid: alreadyClaimedMap,\n })\n pendingRootClaimBalances.forEach((balance) => {\n upsertBalance(acc, address, balance.tokenId, balance)\n })\n }\n }\n return acc\n },\n {}\n )\n\n const balances = Object.values(balancesRaw)\n\n const tokensById = keyBy(\n tokensWithAddresses.map(([token]) => token),\n (t) => t.id\n )\n const dynamicTokens: SubDTaoToken[] = []\n\n // identify tokens that were not requested but have balances\n // BalanceProvider will be register them in ChaindataProvider at runtime, so they will be requested on next call\n for (const bal of balances) {\n if (!balanceDefs.some((def) => def.token.id === bal.tokenId)) {\n const baseToken = tokensById[bal.baseTokenId] as SubDTaoToken | undefined\n // define a token specific to this staking hotkey\n if (baseToken) {\n const cleanToken = getCleanToken(baseToken) as SubDTaoToken\n const newToken = TokenSchema.parse({\n ...cleanToken,\n id: bal.tokenId,\n hotkey: bal.hotkey,\n }) as SubDTaoToken\n dynamicTokens.push(newToken)\n }\n }\n }\n\n const success: IBalance[] = balanceDefs.map((def): IBalance => {\n const stake = balances.find((b) => b.address === def.address && b.tokenId === def.token.id)\n const meta: SubDTaoBalanceMeta = {\n scaledAlphaPrice: stake?.scaledAlphaPrice.toString() ?? \"0\",\n }\n\n const stakeAmount = BigInt(stake?.stake?.toString() ?? \"0\")\n const pendingRootClaimAmount = BigInt(stake?.pendingRootClaim?.toString() ?? \"0\")\n const hasZeroStake = stakeAmount === 0n\n const hasPendingRootClaim = pendingRootClaimAmount > 0n\n\n const balanceValue: AmountWithLabel<string> = {\n type: \"free\",\n label: stake?.netuid === 0 ? \"Root Staking\" : `Subnet Staking`,\n amount: stakeAmount.toString(),\n meta,\n }\n\n const pendingRootClaimValue: AmountWithLabel<string> = {\n type: \"locked\",\n label: \"Pending root claim\",\n amount: pendingRootClaimAmount.toString(),\n meta,\n }\n\n const values: Array<AmountWithLabel<string>> = [balanceValue, pendingRootClaimValue]\n\n // If stake is 0n but there's a pendingRootClaim, add it as an extra amount\n // with includeInTotal: true so it counts toward the total balance.\n // This ensures the balance isn't filtered out when stake is 0n.\n // The total.planck calculation is: free + reserved + extra (with includeInTotal: true)\n // So by adding pendingRootClaim as extra, it will be included in total.planck.\n if (hasZeroStake && hasPendingRootClaim) {\n values.push({\n type: \"extra\",\n label: \"Pending root claim\",\n amount: pendingRootClaimAmount.toString(),\n includeInTotal: true,\n meta,\n })\n }\n\n return {\n address: def.address,\n networkId,\n tokenId: def.token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values,\n }\n })\n\n return {\n success,\n errors: [],\n dynamicTokens,\n }\n } catch (err) {\n log.warn(\"Failed to fetch balances for substrate-dtao\", { err })\n\n const errors = balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Failed to fetch balance for ${def.address} on ${networkId}`),\n }))\n\n return {\n success: [],\n errors,\n }\n }\n}\n\nconst buildStorageCoder = (metadataRpc: `0x${string}`, pallet: string, entry: string) => {\n const { builder } = parseMetadataRpc(metadataRpc)\n return builder.buildStorage(pallet, entry)\n}\n\nconst buildRootClaimableStorageCoder = async (\n _connector: IChainConnectorDot,\n networkId: string,\n metadataRpc: `0x${string}` | null\n): Promise<ReturnType<ReturnType<typeof parseMetadataRpc>[\"builder\"][\"buildStorage\"]> | null> => {\n let storageCoder: ReturnType<typeof buildStorageCoder> | null = null\n\n if (metadataRpc) {\n try {\n storageCoder = buildStorageCoder(metadataRpc, \"SubtensorModule\", \"RootClaimable\")\n } catch (cause) {\n log.warn(\n `Failed to build storage coder for SubtensorModule.RootClaimable using provided metadata on ${networkId}`,\n { cause }\n )\n }\n }\n\n return storageCoder\n}\n\nconst buildRootClaimedStorageCoder = async (\n networkId: string,\n metadataRpc: `0x${string}` | null\n): Promise<ReturnType<ReturnType<typeof parseMetadataRpc>[\"builder\"][\"buildStorage\"]> | null> => {\n let storageCoder: ReturnType<typeof buildStorageCoder> | null = null\n\n if (metadataRpc) {\n try {\n storageCoder = buildStorageCoder(metadataRpc, \"SubtensorModule\", \"RootClaimed\")\n } catch (cause) {\n log.warn(\n `Failed to build storage coder for SubtensorModule.RootClaimed using provided metadata on ${networkId}`,\n { cause }\n )\n }\n }\n\n return storageCoder\n}\n\nconst buildRootClaimableQueries = (\n networkId: string,\n hotkeys: string[],\n storageCoder: ReturnType<ReturnType<typeof parseMetadataRpc>[\"builder\"][\"buildStorage\"]>\n): Array<RpcQueryPack<[string, Map<number, bigint>]>> => {\n return hotkeys.map((hotkey) => {\n let stateKey: MaybeStateKey = null\n try {\n stateKey = storageCoder.keys.enc(hotkey) as MaybeStateKey\n } catch (cause) {\n log.warn(`Failed to encode storage key for hotkey ${hotkey} on ${networkId}`, { cause })\n }\n\n const decodeResult = (changes: MaybeStateKey[]): [string, Map<number, bigint>] => {\n const hexValue = changes[0]\n if (!hexValue) {\n return [hotkey, new Map<number, bigint>()]\n }\n\n const decoded = decodeScale<[number, bigint][] | null>(\n storageCoder,\n hexValue,\n `Failed to decode RootClaimable for hotkey ${hotkey} on ${networkId}`\n )\n return [hotkey, decoded ? new Map(decoded) : new Map<number, bigint>()]\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n}\n\nconst fetchRootClaimableRates = async (\n connector: IChainConnectorDot,\n networkId: string,\n metadataRpc: `0x${string}`,\n hotkeys: string[]\n): Promise<Map<string, Map<number, bigint>>> => {\n if (!hotkeys.length) return new Map<string, Map<number, bigint>>()\n\n const storageCoder = await buildRootClaimableStorageCoder(connector, networkId, metadataRpc)\n if (!storageCoder) {\n // Fallback: return empty map for all hotkeys\n return new Map(hotkeys.map((hotkey) => [hotkey, new Map<number, bigint>()]))\n }\n\n const queries = buildRootClaimableQueries(networkId, hotkeys, storageCoder)\n\n try {\n const results = await fetchRpcQueryPack(connector, networkId, queries)\n return new Map(results)\n } catch (cause) {\n log.warn(`Failed to fetch RootClaimable for hotkeys on ${networkId}`, { cause })\n // Fallback: return empty map for all hotkeys\n return new Map(hotkeys.map((hotkey) => [hotkey, new Map<number, bigint>()]))\n }\n}\n\nconst buildRootClaimedQueries = (\n networkId: string,\n addressHotkeyNetuidPairs: Array<[address: string, hotkey: string, netuid: number]>,\n storageCoder: ReturnType<ReturnType<typeof parseMetadataRpc>[\"builder\"][\"buildStorage\"]>\n): Array<RpcQueryPack<[string, string, number, bigint]>> => {\n return addressHotkeyNetuidPairs.map(([address, hotkey, netuid]) => {\n let stateKey: MaybeStateKey = null\n try {\n // RootClaimed storage takes params: [netuid, hotkey, coldkey_ss58]\n stateKey = storageCoder.keys.enc(netuid, hotkey, address) as MaybeStateKey\n } catch (cause) {\n log.warn(\n `Failed to encode storage key for RootClaimed (netuid=${netuid}, hotkey=${hotkey}, address=${address}) on ${networkId}`,\n { cause }\n )\n }\n\n const decodeResult = (changes: MaybeStateKey[]): [string, string, number, bigint] => {\n const hexValue = changes[0]\n if (!hexValue) {\n return [address, hotkey, netuid, 0n]\n }\n\n const decoded = decodeScale<bigint | null>(\n storageCoder,\n hexValue,\n `Failed to decode RootClaimed for (netuid=${netuid}, hotkey=${hotkey}, address=${address}) on ${networkId}`\n )\n return [address, hotkey, netuid, decoded ?? 0n]\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n}\n\nconst fetchRootClaimedAmounts = async (\n connector: IChainConnectorDot,\n networkId: string,\n metadataRpc: `0x${string}`,\n addressHotkeyNetuidPairs: Array<[address: string, hotkey: string, netuid: number]>\n): Promise<Map<string, Map<string, Map<number, bigint>>>> => {\n if (!addressHotkeyNetuidPairs.length) {\n return new Map<string, Map<string, Map<number, bigint>>>()\n }\n\n const storageCoder = await buildRootClaimedStorageCoder(networkId, metadataRpc)\n if (!storageCoder) {\n // Fallback: return empty map for all pairs\n const result = new Map<string, Map<string, Map<number, bigint>>>()\n for (const [address, hotkey, netuid] of addressHotkeyNetuidPairs) {\n if (!result.has(address)) result.set(address, new Map())\n const addressMap = result.get(address)!\n if (!addressMap.has(hotkey)) addressMap.set(hotkey, new Map())\n addressMap.get(hotkey)!.set(netuid, 0n)\n }\n return result\n }\n\n const queries = buildRootClaimedQueries(networkId, addressHotkeyNetuidPairs, storageCoder)\n\n try {\n const results = await fetchRpcQueryPack(connector, networkId, queries)\n // Build a nested map: address -> hotkey -> netuid -> claimed amount\n const result = new Map<string, Map<string, Map<number, bigint>>>()\n for (const [address, hotkey, netuid, claimed] of results) {\n if (!result.has(address)) result.set(address, new Map())\n const addressMap = result.get(address)!\n if (!addressMap.has(hotkey)) addressMap.set(hotkey, new Map())\n addressMap.get(hotkey)!.set(netuid, claimed)\n }\n return result\n } catch (cause) {\n log.warn(`Failed to fetch RootClaimed for address-hotkey-netuid pairs on ${networkId}`, {\n cause,\n })\n // Fallback: return empty map for all pairs\n const result = new Map<string, Map<string, Map<number, bigint>>>()\n for (const [address, hotkey, netuid] of addressHotkeyNetuidPairs) {\n if (!result.has(address)) result.set(address, new Map())\n const addressMap = result.get(address)!\n if (!addressMap.has(hotkey)) addressMap.set(hotkey, new Map())\n addressMap.get(hotkey)!.set(netuid, 0n)\n }\n return result\n }\n}\n","import { subDTaoTokenId } from \"@talismn/chaindata-provider\"\n\nimport { getScaledAlphaPrice } from \"./alphaPrice\"\nimport type { GetDynamicInfosResult, SubDTaoBalance } from \"./types\"\n\ntype DynamicInfo = NonNullable<GetDynamicInfosResult[number]>\n\nexport const calculatePendingRootClaimable = ({\n stake,\n hotkey,\n address,\n networkId,\n validatorRootClaimableRate,\n dynamicInfoByNetuid,\n alreadyClaimedByNetuid,\n}: {\n stake: bigint\n hotkey: string\n address: string\n networkId: string\n validatorRootClaimableRate: Map<number, bigint>\n dynamicInfoByNetuid: Record<number, DynamicInfo | undefined>\n alreadyClaimedByNetuid: Map<number, bigint>\n}): SubDTaoBalance[] => {\n const pendingRootClaimBalances: SubDTaoBalance[] = []\n\n for (const [netuid, claimableRate] of validatorRootClaimableRate) {\n if (claimableRate === 0n) {\n continue\n }\n const dynamicInfo = dynamicInfoByNetuid[netuid]\n const scaledAlphaPrice = dynamicInfo\n ? getScaledAlphaPrice(dynamicInfo.alpha_in, dynamicInfo.tao_in)\n : 0n\n // Calculate claimable = claimable_rate * root_stake\n // Note: claimableRate is a I96F32, a fixed-point number format\n\n // Multiply claimable_rate by root_stake\n // I96F32 multiplication: round((a * b) / 2^32)\n const totalClaimable = (stake * claimableRate + (1n << 31n)) >> 32n\n\n // Subtract already claimed amount to get net pending claimable\n const alreadyClaimed = alreadyClaimedByNetuid.get(netuid) ?? 0n\n const pendingRootClaim = totalClaimable > alreadyClaimed ? totalClaimable - alreadyClaimed : 0n\n\n pendingRootClaimBalances.push({\n address,\n tokenId: subDTaoTokenId(networkId, netuid, hotkey),\n baseTokenId: subDTaoTokenId(networkId, netuid),\n hotkey: hotkey,\n netuid: netuid,\n scaledAlphaPrice,\n pendingRootClaim,\n stake: 0n,\n })\n }\n\n return pendingRootClaimBalances\n}\n","import type { bittensor } from \"@polkadot-api/descriptors\"\nimport type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport {\n type AnyMiniMetadata,\n type DotNetworkId,\n type SubDTaoToken,\n SubDTaoTokenSchema,\n subDTaoTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { getStorageKeyPrefix, parseMetadataRpc } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\nimport { fromPairs } from \"lodash-es\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRuntimeCallResult, type QueryStorageResult } from \"../shared\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\ntype GetDynamicInfosResult =\n (typeof bittensor)[\"descriptors\"][\"apis\"][\"SubnetInfoRuntimeApi\"][\"get_all_dynamic_info\"][1]\n\n// hardcoded because we dont have access to native tokens from the balance module\nconst NATIVE_TOKEN_SYMBOLS: Record<string, string> = {\n \"bittensor\": \"TAO\",\n \"bittensor-testnet\": \"testTAO\",\n}\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n connector,\n tokens,\n miniMetadata,\n}) => {\n const anyMiniMetadata = miniMetadata as AnyMiniMetadata\n if (!anyMiniMetadata?.data) return []\n\n const [transferableTokensMap, dynamicInfos] = await Promise.all([\n fetchTransferableTokensMap(connector, anyMiniMetadata.data, networkId),\n fetchRuntimeCallResult<GetDynamicInfosResult>(\n connector,\n networkId,\n anyMiniMetadata.data,\n \"SubnetInfoRuntimeApi\",\n \"get_all_dynamic_info\",\n []\n ),\n ])\n\n return dynamicInfos\n .filter(isNotNil)\n .map((info): SubDTaoToken => {\n const config = tokens.find((t) => t.netuid === info.netuid)\n\n let symbol = new TextDecoder().decode(Uint8Array.from(info.token_symbol))\n const subnetName =\n info.subnet_identity?.subnet_name?.asText() ??\n (info.netuid === 0 ? \"Root\" : `Subnet ${info.netuid}`)\n const name = `SN${info.netuid} | ${subnetName} ${symbol}`\n\n // for root we want same symbol as native so they can be grouped together in portfolio\n if (info.netuid === 0 && NATIVE_TOKEN_SYMBOLS[networkId])\n symbol = NATIVE_TOKEN_SYMBOLS[networkId]\n\n // if not stage in storage, consider transferable\n const isTransferable = transferableTokensMap[info.netuid] ?? true\n\n const token: SubDTaoToken = {\n id: subDTaoTokenId(networkId, info.netuid),\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n netuid: info.netuid,\n isDefault: true,\n symbol,\n decimals: 9,\n name,\n subnetName,\n isTransferable,\n }\n\n return Object.assign({}, token, config)\n })\n\n .filter((t) => {\n const parsed = SubDTaoTokenSchema.safeParse(t)\n return parsed.success\n })\n}\n\nconst fetchTransferableTokensMap = async (\n connector: IChainConnectorDot,\n metadata: `0x${string}`,\n networkId: DotNetworkId\n) => {\n const { builder } = parseMetadataRpc(metadata)\n const transferToggleCodec = builder.buildStorage(\"SubtensorModule\", \"TransferToggle\")\n\n const transferToggleKeys = await connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"SubtensorModule\", \"TransferToggle\"),\n ])\n\n const transferToggleResults = await connector.send<QueryStorageResult>(\n networkId,\n \"state_queryStorageAt\",\n [transferToggleKeys]\n )\n\n const transferToggleEntries = transferToggleResults.length ? transferToggleResults[0].changes : []\n\n return fromPairs(\n transferToggleEntries.map(([key, value]) => {\n const [netuid] = transferToggleCodec.keys.dec(key) as [number]\n const isTransferable = transferToggleCodec.value.dec(value) as boolean\n return [netuid, isTransferable]\n })\n )\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc),\n extra: null,\n } as AnyMiniMetadata\n}\n\nconst getData = (metadataRpc: `0x${string}`): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n const isBittensor = unifiedMetadata.pallets.some(({ name }) => name === \"SubtensorModule\")\n if (!isBittensor) return null\n\n compactMetadata(\n metadata,\n [{ pallet: \"SubtensorModule\", items: [\"TransferToggle\", \"RootClaimable\", \"RootClaimed\"] }],\n [\n {\n runtimeApi: \"StakeInfoRuntimeApi\",\n methods: [\"get_stake_info_for_coldkeys\"],\n },\n {\n runtimeApi: \"SubnetInfoRuntimeApi\",\n methods: [\"get_all_dynamic_info\"],\n },\n ]\n )\n\n return encodeMetadata(metadata)\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType, parseSubDTaoTokenId } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { netuid: subnetId, hotkey } = parseSubDTaoTokenId(token.id)\n if (!hotkey) throw new Error(`Missing hotkey`)\n\n const { builder } = parseMetadataRpc(metadataRpc)\n const { codec, location } = builder.buildCall(\"SubtensorModule\", \"transfer_stake\")\n\n const args = codec.enc({\n origin_netuid: subnetId,\n hotkey,\n destination_coldkey: to,\n destination_netuid: subnetId,\n alpha_amount: value,\n })\n\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n // on hydration balances are fetched using a runtimeApi, which can't be subscribed to.\n // => poll values for each block\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n miniMetadata,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n miniMetadata,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubDTaoBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import type { bittensor } from \"@polkadot-api/descriptors\"\nimport { SubDTaoTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubDTaoTokenConfigSchema = z.strictObject({\n netuid: SubDTaoTokenSchema.shape.netuid,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubDTaoTokenConfig = z.infer<typeof SubDTaoTokenConfigSchema>\n\nexport type SubDTaoBalanceMeta = {\n scaledAlphaPrice: string\n}\n\nexport type SubDTaoBalance = {\n address: string\n tokenId: string\n baseTokenId: string\n stake: bigint\n pendingRootClaim?: bigint\n hotkey: string\n netuid: number\n scaledAlphaPrice: bigint\n}\n\nexport type GetDynamicInfosResult =\n (typeof bittensor)[\"descriptors\"][\"apis\"][\"SubnetInfoRuntimeApi\"][\"get_all_dynamic_info\"][1]\n\nexport type GetStakeInfosResult =\n (typeof bittensor)[\"descriptors\"][\"apis\"][\"StakeInfoRuntimeApi\"][\"get_stake_info_for_coldkeys\"][1]\n","import type { NetworkId, TokenId } from \"@talismn/chaindata-provider\"\n\nimport type { Address } from \"./addresses\"\n\nexport type BalanceStatus =\n // balance is subscribed to the on-chain value and up to date\n | \"live\"\n // balance was retrieved from the chain and the stored value is being displayed.\n // This balance is currently awaiting updates from the chain.\n | \"cache\"\n // balance was retrieved from the chain but we're unable to create a new subscription\n | \"stale\"\n\ntype IBalanceBase = {\n /** The module that this balance was retrieved by */\n source: string\n\n useLegacyTransferableCalculation?: boolean\n\n /** Has this balance never been fetched, or is it from a cache, or is it up to date? */\n status: BalanceStatus\n\n /** The address of the account which owns this balance */\n address: Address\n /** The token this balance is for */\n tokenId: TokenId\n\n networkId: NetworkId\n}\n\ntype IBalanceSimpleValues = {\n /** For balance types with a simple value, this is the value of the balance (eg, evm native token balance) */\n value: Amount\n values?: Array<AmountWithLabel<string>>\n}\n\ntype IBalanceComplexValues = {\n /** For balance types with multple possible states, these are the values of the balance (eg, substrate native token balance) */\n values: Array<AmountWithLabel<string>>\n value?: undefined\n}\n\n/** `IBalance` is a common interface which all balance types must implement. */\nexport type IBalance = IBalanceBase & (IBalanceSimpleValues | IBalanceComplexValues)\n\nexport type BalanceJson = IBalance\n\n/** A collection of `BalanceJson` objects */\nexport type BalanceJsonList = Record<string, BalanceJson>\n\n/** An unlabelled amount of a balance */\nexport type Amount = string\n\nexport type BalanceStatusTypes = \"free\" | \"reserved\" | \"locked\" | \"extra\" | \"nompool\"\n\n/** A labelled amount of a balance */\ntype BaseAmountWithLabel<TLabel extends string> = {\n type: BalanceStatusTypes\n /**\n * For modules which fetch balances via module sources, the source is equivalent to previous 'subSource' field\n * on the parent balance object\n * e.g. `staking`\n **/\n source?: string\n label: TLabel\n amount: Amount\n meta?: unknown // TODO type this with an object that has a discriminator property\n}\n\nexport const getValueId = (amount: AmountWithLabel<string>) => {\n const getMetaId = () => {\n const meta = amount.meta as { poolId?: number; paraId?: number } | undefined\n if (!meta) return \"\"\n if (amount.type === \"nompool\") return meta.poolId?.toString() ?? \"\"\n\n return \"\"\n }\n\n return [amount.label, amount.type, amount.source, getMetaId()].join(\"::\")\n}\n\n/** A labelled locked amount of a balance */\nexport type LockedAmount<TLabel extends string> = BaseAmountWithLabel<TLabel> & {\n /**\n * By default, the largest locked amount is subtrated from the transferable amount of this balance.\n * If this property is set to true, this particular lock will be skipped when making this calculation.\n * As such, this locked amount will be included in the calculated transferable amount.\n */\n includeInTransferable?: boolean\n\n /**\n * By default, tx fees can be deducted from locked amounts of balance.\n * As such, locked amounts are ignored when calculating if the user has enough funds to pay tx fees.\n * If this property is set to true, this particular lock will be subtracted from the available funds when making this calculation.\n * As such, this locked amount will not be included in the calculated available funds.\n */\n excludeFromFeePayable?: boolean\n}\n\nexport type AmountWithLabel<TLabel extends string> =\n | BaseAmountWithLabel<TLabel>\n | LockedAmount<TLabel>\n | ExtraAmount<TLabel>\n\n/** A labelled extra amount of a balance */\nexport type ExtraAmount<TLabel extends string> = BaseAmountWithLabel<TLabel> & {\n type: \"extra\"\n /** If set to true, this extra amount will be included in the calculation of the total amount of this balance. */\n includeInTotal?: boolean\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { Twox128, toHex } from \"@talismn/scale\"\n\n/** For fast db access, you can calculate the primary key for a miniMetadata using this method */\nexport const deriveMiniMetadataId = ({\n source,\n chainId,\n specVersion,\n}: Pick<AnyMiniMetadata, \"source\" | \"chainId\" | \"specVersion\">): string =>\n toHex(\n Twox128(new TextEncoder().encode(`${source}${chainId}${specVersion}${MINIMETADATA_VERSION}`))\n ).slice(-32)\n\nexport type MiniMetadata<Extra = unknown> = Omit<AnyMiniMetadata, \"extra\"> & { extra: Extra }\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary, type Codec, Enum } from \"polkadot-api\"\n\nimport type { BalanceTransferType, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n type,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { builder } = parseMetadataRpc(metadataRpc)\n const method = getTransferMethod(type)\n const { codec, location } = builder.buildCall(\"Assets\", method)\n const args = getEncodedArgs(method, token.assetId, to, value, codec)\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n\nconst getTransferMethod = (type: BalanceTransferType) => {\n // TODO handle the case where transfer_all does not exist\n switch (type) {\n case \"keep-alive\":\n return \"transfer_keep_alive\"\n case \"all\":\n return \"transfer_all\"\n case \"allow-death\":\n return \"transfer\"\n }\n}\n\nconst getEncodedArgs = (\n method: ReturnType<typeof getTransferMethod>,\n assetId: string,\n to: string,\n value: string,\n argsCodec: Codec<unknown>\n): Uint8Array => {\n try {\n switch (method) {\n case \"transfer_keep_alive\":\n case \"transfer\":\n return getTransferEncodedArgs(assetId, to, value, argsCodec)\n case \"transfer_all\":\n return getTransferAllEncodedArgs(assetId, to, argsCodec)\n }\n } catch {\n throw new Error(`Failed to encode arguments for method ${method}: ${assetId}, ${to}, ${value}`)\n }\n}\n\nconst getEncodedValue = (codec: Codec<unknown>, possibleValue: Array<() => unknown>) => {\n for (const getArgs of possibleValue) {\n try {\n return codec.enc(getArgs())\n } catch {\n // wrong inputs, ignore and try the next one\n }\n }\n\n throw new Error(\"Failed to encode\")\n}\n\n// same inputs for both KeepAlive and allowDeath\nconst getTransferEncodedArgs = (\n assetId: string,\n to: string,\n value: string,\n codec: Codec<unknown>\n) => {\n return getEncodedValue(codec, [\n () => ({\n id: Number(assetId), // for most networks\n target: Enum(\"Id\", to),\n amount: BigInt(value),\n }),\n () => ({\n id: BigInt(assetId), // for Astar\n target: Enum(\"Id\", to),\n amount: BigInt(value),\n }),\n () => ({\n id: BigInt(assetId), // for Neuroweb\n target: to,\n amount: BigInt(value),\n }),\n ])\n}\n\nconst getTransferAllEncodedArgs = (assetId: string, to: string, codec: Codec<unknown>) => {\n return getEncodedValue(codec, [\n () => ({\n id: Number(assetId), // for most networks\n dest: Enum(\"Id\", to),\n keep_alive: false,\n }),\n () => ({\n id: BigInt(assetId), // for Astar\n dest: Enum(\"Id\", to),\n keep_alive: false,\n }),\n () => ({\n id: BigInt(assetId), // for Neuroweb (although transfer_all does not exist)\n dest: to,\n keep_alive: false,\n }),\n ])\n}\n","import { map, of } from \"rxjs\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { getRpcQueryPack$ } from \"../shared/rpcQueryPack\"\nimport { buildQueries } from \"./buildQueries\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n return getRpcQueryPack$(connector, networkId, queries).pipe(\n map((balances) => ({\n success: balances,\n errors: [],\n }))\n )\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubAssetsBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubAssetsTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubAssetsTokenConfigSchema = z.strictObject({\n assetId: SubAssetsTokenSchema.shape.assetId,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubAssetsTokenConfig = z.infer<typeof SubAssetsTokenConfigSchema>\n","import { SubForeignAssetsTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { SubForeignAssetsTokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = SubForeignAssetsTokenSchema.shape.type.value\nexport const PLATFORM = SubForeignAssetsTokenSchema.shape.platform.value\n","import type { AnyMiniMetadata } from \"@talismn/chaindata-provider\"\nimport { decodeScale, papiParse } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\n\nimport log from \"../../log\"\nimport type { AmountWithLabel, IBalance } from \"../../types\"\nimport { buildNetworkStorageCoders } from \"../shared\"\nimport type { MaybeStateKey, RpcQueryPack } from \"../shared/rpcQueryPack\"\nimport type { BalanceDef } from \"../shared/types\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const buildQueries = (\n networkId: string,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n miniMetadata: AnyMiniMetadata\n): Array<RpcQueryPack<IBalance>> => {\n const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {\n storage: [\"ForeignAssets\", \"Account\"],\n })\n\n return balanceDefs\n .map(({ token, address }): RpcQueryPack<IBalance> | null => {\n const scaleCoder = networkStorageCoders?.storage\n\n const getStateKey = (onChainId: string) => {\n try {\n return scaleCoder?.keys?.enc?.(papiParse(onChainId), address) as MaybeStateKey\n } catch {\n return null\n }\n }\n\n const stateKey = getStateKey(token.onChainId)\n\n if (!stateKey) {\n log.warn(\n `Invalid assetId / address in ${networkId} storage query ${token.onChainId} / ${address}`\n )\n return null\n }\n\n const decodeResult = (changes: MaybeStateKey[]) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n balance?: bigint\n is_frozen?: boolean // most likely not used\n reason?: { type?: \"Sufficient\" }\n status?: { type?: \"Liquid\" } | { type?: \"Frozen\" }\n extra?: undefined\n }\n\n const decoded = decodeScale<DecodedType>(\n scaleCoder,\n changes[0],\n `Failed to decode substrate-assets balance on chain ${networkId}`\n ) ?? {\n balance: 0n,\n is_frozen: false,\n reason: { type: \"Sufficient\" },\n status: { type: \"Liquid\" },\n extra: undefined,\n }\n\n const isFrozen = decoded.is_frozen ?? decoded?.status?.type === \"Frozen\"\n const amount = (decoded?.balance ?? 0n).toString()\n\n // due to the following balance calculations, which are made in the `Balance` type:\n //\n // total balance = (free balance) + (reserved balance)\n // transferable balance = (free balance) - (frozen balance)\n //\n // when `isFrozen` is true we need to set **both** the `free` and `frozen` amounts\n // of this balance to the value we received from the RPC.\n //\n // if we only set the `frozen` amount, then the `total` calculation will be incorrect!\n const free = amount\n const frozen = token.isFrozen || isFrozen ? amount : \"0\"\n\n // include balance values even if zero, so that newly-zero values overwrite old values\n const balanceValues: Array<AmountWithLabel<string>> = [\n { type: \"free\", label: \"free\", amount: free.toString() },\n { type: \"locked\", label: \"frozen\", amount: frozen.toString() },\n ]\n\n const balance: IBalance = {\n source: \"substrate-assets\",\n status: \"live\",\n address,\n networkId,\n tokenId: token.id,\n values: balanceValues,\n }\n\n return balance\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n .filter(isNotNil)\n}\n","import log from \"../../log\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { buildQueries } from \"./buildQueries\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n const balances = await fetchRpcQueryPack(connector, networkId, queries)\n\n return balanceDefs.reduce<FetchBalanceResults>(\n (acc, def) => {\n const balance = balances.find(\n (b) => b?.address === def.address && b?.tokenId === def.token.id\n )\n if (balance) acc.success.push(balance)\n //if no entry consider empty balance\n else\n acc.success.push({\n address: def.address,\n networkId,\n tokenId: def.token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values: [\n { type: \"free\", label: \"free\", amount: \"0\" },\n { type: \"locked\", label: \"frozen\", amount: \"0\" },\n ],\n })\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","import {\n type AnyMiniMetadata,\n type SubForeignAssetsToken,\n SubForeignAssetsTokenSchema,\n subForeignAssetTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { getStorageKeyPrefix, papiStringify, parseMetadataRpc } from \"@talismn/scale\"\nimport { assign, keyBy, keys } from \"lodash-es\"\nimport type { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { QueryStorageResult } from \"../shared\"\nimport { MODULE_TYPE, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n miniMetadata,\n}) => {\n const anyMiniMetadata = miniMetadata as AnyMiniMetadata\n if (!anyMiniMetadata?.data) return []\n\n const { builder } = parseMetadataRpc(anyMiniMetadata.data)\n const assetCodec = builder.buildStorage(\"ForeignAssets\", \"Asset\")\n const metadataCodec = builder.buildStorage(\"ForeignAssets\", \"Metadata\")\n\n const [allAssetStorageKeys, allMetadataStorageKeys] = await Promise.all([\n connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"ForeignAssets\", \"Asset\"),\n ]),\n connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"ForeignAssets\", \"Metadata\"),\n ]),\n ])\n\n const [assetStorageResults, metadataStorageResults] = await Promise.all([\n connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [allAssetStorageKeys]),\n connector.send<QueryStorageResult>(networkId, \"state_queryStorageAt\", [allMetadataStorageKeys]),\n ])\n\n // if there is at least one storage entry, the results will be an array with a single object\n // some networks avec the pallet with no tokens in it, in which case the response will be an empty array\n const assetStorageEntries: [key: `0x${string}`, value: `0x${string}`][] =\n assetStorageResults[0]?.changes ?? []\n const metadataStorageEntries: [key: `0x${string}`, value: `0x${string}`][] =\n metadataStorageResults[0]?.changes ?? []\n\n const assetByOnChainId = keyBy(\n assetStorageEntries.map(([key, value]) => {\n const [decodedKey] = assetCodec.keys.dec(key) as [unknown]\n const onChainId = papiStringify(decodedKey)\n const asset = assetCodec.value.dec(value) as {\n is_sufficient: boolean\n min_balance: bigint\n }\n return { onChainId, existentialDeposit: asset.min_balance, isSufficient: asset.is_sufficient }\n }),\n (a) => a.onChainId\n )\n\n const metadataByOnChainId = keyBy(\n metadataStorageEntries.map(([key, value]) => {\n const [decodedKey] = metadataCodec.keys.dec(key) as [unknown]\n const onChainId = papiStringify(decodedKey)\n const metadata = metadataCodec.value.dec(value) as {\n decimals?: number\n deposit?: bigint\n is_frozen?: boolean\n name?: Binary\n symbol?: Binary\n }\n return {\n onChainId,\n decimals: metadata.decimals,\n isFrozen: metadata.is_frozen,\n name: metadata.name?.asText(),\n symbol: metadata.symbol?.asText(),\n }\n }),\n (a) => a.onChainId\n )\n\n const allTokens = keys(assetByOnChainId).map((onChainId) =>\n assign({}, assetByOnChainId[onChainId], metadataByOnChainId[onChainId] ?? undefined)\n )\n\n const configTokenByOnChainId = keyBy(tokens, (t) => t.onChainId)\n\n return (\n allTokens\n .map(\n (asset): SubForeignAssetsToken => ({\n id: subForeignAssetTokenId(networkId, asset.onChainId),\n type: MODULE_TYPE,\n platform: \"polkadot\",\n networkId,\n onChainId: String(asset.onChainId),\n isSufficient: asset.isSufficient,\n isFrozen: asset.isFrozen,\n name: asset.name,\n symbol: asset.symbol as string,\n decimals: asset.decimals ?? 0,\n existentialDeposit: String(asset.existentialDeposit),\n isDefault: true,\n })\n )\n // keep all tokens listed in the config + all tokens marked as sufficient\n .filter((token) => {\n const configToken = configTokenByOnChainId[token.onChainId]\n return configToken || token.isSufficient\n })\n // apply config overrides\n .map((token) => {\n const configToken = configTokenByOnChainId[token.onChainId]\n return configToken ? assign({}, token, configToken) : token\n })\n // validate results\n .filter((t) => {\n const parsed = SubForeignAssetsTokenSchema.safeParse(t)\n // if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE}`, t)\n\n return parsed.success\n })\n )\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, hasStorageItems } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc),\n extra: null,\n } as AnyMiniMetadata\n}\n\nconst getData = (metadataRpc: `0x${string}`): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n // ensure the network has all the required bits\n if (!hasStorageItems(unifiedMetadata, \"ForeignAssets\", [\"Account\", \"Asset\", \"Metadata\"]))\n return null\n\n compactMetadata(metadata, [{ pallet: \"ForeignAssets\", items: [\"Account\", \"Asset\", \"Metadata\"] }])\n\n return encodeMetadata(metadata)\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { papiParse, parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary, type Codec, Enum } from \"polkadot-api\"\n\nimport type { BalanceTransferType, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n type,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { builder } = parseMetadataRpc(metadataRpc)\n const method = getTransferMethod(type)\n const { codec, location } = builder.buildCall(\"ForeignAssets\", method)\n const args = getEncodedArgs(method, token.onChainId, to, value, codec)\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n\nconst getTransferMethod = (type: BalanceTransferType) => {\n switch (type) {\n case \"keep-alive\":\n return \"transfer_keep_alive\"\n case \"all\":\n return \"transfer_all\"\n case \"allow-death\":\n return \"transfer\"\n }\n}\n\nconst getEncodedArgs = (\n method: ReturnType<typeof getTransferMethod>,\n onChainId: string,\n to: string,\n value: string,\n argsCodec: Codec<unknown>\n): Uint8Array => {\n try {\n switch (method) {\n case \"transfer_keep_alive\":\n case \"transfer\":\n return getTransferEncodedArgs(onChainId, to, value, argsCodec)\n case \"transfer_all\":\n return getTransferAllEncodedArgs(onChainId, to, argsCodec)\n }\n } catch {\n throw new Error(\n `Failed to encode arguments for method ${method}: ${onChainId}, ${to}, ${value}`\n )\n }\n}\n\nconst getEncodedValue = (codec: Codec<unknown>, possibleValue: Array<() => unknown>) => {\n for (const getArgs of possibleValue) {\n try {\n return codec.enc(getArgs())\n } catch {\n // wrong inputs, ignore and try the next one\n }\n }\n\n throw new Error(\"Failed to encode\")\n}\n\n// same inputs for both KeepAlive and allowDeath\nconst getTransferEncodedArgs = (\n onChainId: string,\n to: string,\n value: string,\n codec: Codec<unknown>\n) => {\n return getEncodedValue(codec, [\n () => ({\n id: papiParse(onChainId), // for most networks\n target: Enum(\"Id\", to),\n amount: BigInt(value),\n }),\n () => ({\n id: papiParse(onChainId), // for Neuroweb\n target: to,\n amount: BigInt(value),\n }),\n ])\n}\n\nconst getTransferAllEncodedArgs = (onChainId: string, to: string, codec: Codec<unknown>) => {\n return getEncodedValue(codec, [\n () => ({\n id: papiParse(onChainId), // for most networks\n dest: Enum(\"Id\", to),\n keep_alive: false,\n }),\n () => ({\n id: papiParse(onChainId), // for Neuroweb\n dest: to,\n keep_alive: false,\n }),\n ])\n}\n","import { map, of } from \"rxjs\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { getRpcQueryPack$ } from \"../shared/rpcQueryPack\"\nimport { buildQueries } from \"./buildQueries\"\nimport type { MODULE_TYPE } from \"./config\"\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n return getRpcQueryPack$(connector, networkId, queries).pipe(\n map((balances) => ({\n success: balances,\n errors: [],\n }))\n )\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubForeignAssetsBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubForeignAssetsTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubForeignAssetsTokenConfigSchema = z.strictObject({\n onChainId: SubForeignAssetsTokenSchema.shape.onChainId,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubForeignAssetsTokenConfig = z.infer<typeof SubForeignAssetsTokenConfigSchema>\n","import { SubHydrationTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { SubHydrationTokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = SubHydrationTokenSchema.shape.type.value\nexport const PLATFORM = SubHydrationTokenSchema.shape.platform.value\n","import { keyBy, uniq } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalance } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRuntimeCallResult } from \"../shared\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`, {\n tokensWithAddresses,\n })\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const addresses = uniq(balanceDefs.map((def) => def.address))\n\n try {\n const res = await Promise.all(\n addresses.map((address) =>\n fetchRuntimeCallResult<\n [onChainId: number, balance: { free: bigint; reserved: bigint; frozen: bigint }][]\n >(connector, networkId, miniMetadata.data!, \"CurrenciesApi\", \"accounts\", [address])\n )\n )\n\n const fetchedBalances = addresses.flatMap((address, index) => {\n return res[index]\n .map(([onChainId, balance]) => ({\n address,\n onChainId,\n free: balance.free.toString(),\n reserved: balance.reserved.toString(),\n frozen: balance.frozen.toString(),\n }))\n .filter((b) => b.onChainId !== undefined)\n })\n\n const balancesByKey = keyBy(fetchedBalances, (b) => `${b.address}:${b.onChainId}`)\n\n const success = tokensWithAddresses.reduce((acc, [token, addresses]) => {\n if (token.type === MODULE_TYPE)\n for (const address of addresses) {\n const rawBalance = balancesByKey[`${address}:${token.onChainId}`]\n\n // the endpoint only returns entries for which the address has a non-zero balance\n // => generate an zero balance object if not found\n const balance: IBalance = {\n address,\n networkId,\n tokenId: token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values: [\n {\n type: \"free\",\n label: \"free\",\n amount: rawBalance?.free.toString() ?? \"0\",\n },\n {\n type: \"reserved\",\n label: \"reserved\",\n amount: rawBalance?.reserved.toString() ?? \"0\",\n },\n {\n type: \"locked\",\n label: \"frozen\",\n amount: rawBalance?.frozen.toString() ?? \"0\",\n },\n ],\n }\n\n acc.push(balance)\n }\n\n return acc\n }, [] as IBalance[])\n\n return {\n success,\n errors: [],\n }\n } catch (err) {\n log.warn(\"Failed to fetch balances for substrate-hydration\", err)\n\n const errors = balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Failed to fetch balance for ${def.address} on ${networkId}`),\n }))\n\n return {\n success: [],\n errors,\n }\n }\n}\n","import {\n type AnyMiniMetadata,\n type SubHydrationToken,\n SubHydrationTokenSchema,\n subHydrationTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { getStorageKeyPrefix, parseMetadataRpc } from \"@talismn/scale\"\nimport { assign, keyBy } from \"lodash-es\"\nimport type { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { QueryStorageResult } from \"../shared\"\nimport { MODULE_TYPE, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n miniMetadata,\n}) => {\n const anyMiniMetadata = miniMetadata as AnyMiniMetadata\n if (!anyMiniMetadata?.data) return []\n\n const { builder } = parseMetadataRpc(anyMiniMetadata.data)\n const assetsCodec = builder.buildStorage(\"AssetRegistry\", \"Assets\")\n\n const allAssetStorageKeys = await connector.send<`0x${string}`[]>(networkId, \"state_getKeys\", [\n getStorageKeyPrefix(\"AssetRegistry\", \"Assets\"),\n ])\n\n const assetStorageResults = await connector.send<QueryStorageResult>(\n networkId,\n \"state_queryStorageAt\",\n [allAssetStorageKeys]\n )\n\n const assetStorageEntries = assetStorageResults.length ? assetStorageResults[0].changes : []\n\n const configTokenByAssetId = keyBy(tokens, (t) => t.onChainId)\n\n return (\n assetStorageEntries\n .map(([key, value]) => {\n // parse results\n const [onChainId] = assetsCodec.keys.dec(key) as [number]\n const asset = assetsCodec.value.dec(value) as {\n name: Binary | undefined\n symbol: Binary | undefined\n decimals: number | undefined\n is_sufficient: boolean\n asset_type: { type: string }\n existential_deposit: bigint\n }\n\n return {\n onChainId,\n assetType: asset.asset_type.type,\n isSufficient: asset.is_sufficient,\n name: asset.name?.asText(),\n symbol: asset.symbol?.asText(),\n decimals: asset.decimals,\n existentialDeposit: asset.existential_deposit.toString(),\n }\n })\n // convert asset to a SubHydrationToken\n .map(\n (asset): SubHydrationToken => ({\n id: subHydrationTokenId(networkId, asset.onChainId),\n type: MODULE_TYPE,\n platform: \"polkadot\",\n networkId,\n onChainId: asset.onChainId,\n assetType: asset.assetType as SubHydrationToken[\"assetType\"], // Erc20 or Token,\n isSufficient: asset.isSufficient,\n name: asset.name,\n symbol: asset.symbol as string,\n decimals: asset.decimals ?? 0,\n existentialDeposit: asset.existentialDeposit,\n isDefault: true,\n })\n )\n // keep all tokens listed in the config + all tokens marked as sufficient\n .filter((token) => {\n const configToken = configTokenByAssetId[token.onChainId]\n return configToken || token.isSufficient\n })\n // apply config overrides\n .map((token) => {\n const configToken = configTokenByAssetId[token.onChainId]\n return configToken ? assign({}, token, configToken) : token\n })\n // validate results\n .filter((t) => {\n const parsed = SubHydrationTokenSchema.safeParse(t)\n // if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE}`, t)\n\n return parsed.success\n })\n )\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, hasRuntimeApi, hasStorageItem } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc),\n extra: null,\n } as AnyMiniMetadata\n}\n\nconst getData = (metadataRpc: `0x${string}`): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n // ensure the network has all the required bits\n if (\n !hasStorageItem(unifiedMetadata, \"AssetRegistry\", \"Assets\") ||\n !hasStorageItem(unifiedMetadata, \"Tokens\", \"Accounts\") ||\n !hasRuntimeApi(unifiedMetadata, \"CurrenciesApi\", \"accounts\")\n )\n return null\n\n compactMetadata(\n metadata,\n [\n { pallet: \"AssetRegistry\", items: [\"Assets\"] }, // token specs\n { pallet: \"Tokens\", items: [\"Accounts\"] }, // balances for tokens\n ],\n [\n {\n runtimeApi: \"CurrenciesApi\",\n methods: [\"accounts\"],\n },\n ]\n )\n\n return encodeMetadata(metadata)\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n // there is only one transfer method, no existential deposit handling.\n // => leave this to the frontend and dry runs\n const { builder } = parseMetadataRpc(metadataRpc)\n const { codec, location } = builder.buildCall(\"Currencies\", \"transfer\")\n const args = {\n dest: to,\n currency_id: token.onChainId,\n amount: BigInt(value),\n }\n\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), codec.enc(args)]))\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n // on hydration balances are fetched using a runtimeApi, which can't be subscribed to.\n // => poll values for each block\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n miniMetadata,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n miniMetadata,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubHydrationBalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubHydrationTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubHydrationTokenConfigSchema = z.strictObject({\n onChainId: SubHydrationTokenSchema.shape.onChainId,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubHydrationTokenConfig = z.infer<typeof SubHydrationTokenConfigSchema>\n","import { SubNativeTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type {\n SubNativeMiniMetadataExtra as MiniMetadataExtra,\n SubNativeModuleConfig as ModuleConfig,\n SubNativeTokenConfig as TokenConfig,\n} from \"./types\"\n\nexport const MODULE_TYPE = SubNativeTokenSchema.shape.type.value\nexport const PLATFORM = SubNativeTokenSchema.shape.platform.value\n","import { decodeScale, type ScaleStorageCoder } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\nimport type { Binary, Enum } from \"polkadot-api\"\n\nimport type { AmountWithLabel, IBalance, MiniMetadata } from \"../../../types\"\nimport { type BalanceDef, buildNetworkStorageCoders } from \"../../shared\"\nimport type { MaybeStateKey, RpcQueryPack } from \"../../shared/rpcQueryPack\"\nimport type { MiniMetadataExtra } from \"../config\"\nimport { getLockedType } from \"../util/lockTypes\"\n\nexport type NomPoolMemberInfo = {\n points: string\n poolId: string\n unbondingEras: Array<{ era: string; amount: string }>\n}\n\nexport type BaseBalance = { balance: IBalance; nomPoolMemberInfo: NomPoolMemberInfo | null }\n\nexport const buildBaseQueries = (\n networkId: string,\n balanceDefs: BalanceDef<\"substrate-native\">[],\n miniMetadata: MiniMetadata<MiniMetadataExtra>\n): Array<RpcQueryPack<BaseBalance>> => {\n const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {\n account: [\"System\", \"Account\"],\n stakingLedger: [\"Staking\", \"Ledger\"],\n reserves: [\"Balances\", \"Reserves\"], // unused ??\n holds: [\"Balances\", \"Holds\"],\n locks: [\"Balances\", \"Locks\"],\n freezes: [\"Balances\", \"Freezes\"],\n poolMembers: [\"NominationPools\", \"PoolMembers\"],\n })\n\n if (!networkStorageCoders)\n throw new Error(`No network storage coders found for networkId: ${networkId}`)\n\n return balanceDefs\n .map(({ token, address }): RpcQueryPack<BaseBalance> | null => {\n const getStateKeys = () => {\n try {\n const accountStateKey = networkStorageCoders.account\n ? (networkStorageCoders.account.keys.enc(address) as `0x${string}`)\n : null\n\n const locksStateKey = networkStorageCoders.locks\n ? (networkStorageCoders.locks.keys.enc(address) as `0x${string}`)\n : null\n\n const freezesStateKey = networkStorageCoders.freezes\n ? (networkStorageCoders.freezes.keys.enc(address) as `0x${string}`)\n : null\n\n const holdsStateKey = networkStorageCoders.holds\n ? (networkStorageCoders.holds.keys.enc(address) as `0x${string}`)\n : null\n\n const stakingLedgerStateKey = networkStorageCoders.stakingLedger\n ? (networkStorageCoders.stakingLedger.keys.enc(address) as `0x${string}`)\n : null\n\n const poolMemberStateKey = networkStorageCoders.poolMembers\n ? (networkStorageCoders.poolMembers.keys.enc(address) as `0x${string}`)\n : null\n\n return [\n accountStateKey,\n locksStateKey,\n freezesStateKey,\n holdsStateKey,\n stakingLedgerStateKey,\n poolMemberStateKey,\n ]\n } catch {\n // most likely invalid address\n return []\n }\n }\n\n return {\n stateKeys: getStateKeys(),\n decodeResult: (changes: MaybeStateKey[]) => {\n const balance: IBalance = {\n source: \"substrate-native\",\n status: \"live\",\n address,\n networkId,\n tokenId: token.id,\n values: [],\n useLegacyTransferableCalculation: miniMetadata.extra.useLegacyTransferableCalculation,\n }\n\n let nomPoolMemberInfo: NomPoolMemberInfo | null = null\n\n const [\n accountChange,\n lockChange,\n freezesChange,\n holdsChange,\n stakingLedgerChange,\n nomPoolMemberChange,\n ] = changes\n\n if (networkStorageCoders.account) {\n // for account balance we decode even empty values\n const baseValues = decodeBaseResult(\n networkStorageCoders.account,\n accountChange,\n networkId\n )\n balance.values.push(...baseValues)\n }\n\n if (networkStorageCoders.locks && lockChange) {\n const lockValues = decodeLocksResult(networkStorageCoders.locks, lockChange, networkId)\n balance.values.push(...lockValues)\n }\n\n if (networkStorageCoders.freezes && freezesChange) {\n const freezesValues = decodeFreezesResult(\n networkStorageCoders.freezes,\n freezesChange,\n networkId\n )\n balance.values.push(...freezesValues)\n }\n\n if (networkStorageCoders.holds && holdsChange) {\n const holdsValues = decodeHoldsResult(\n networkStorageCoders.holds,\n holdsChange,\n networkId\n )\n balance.values.push(...holdsValues)\n }\n\n if (networkStorageCoders.stakingLedger && stakingLedgerChange) {\n const stakingLedgerValues = decodeStakingLedgerResult(\n networkStorageCoders.stakingLedger,\n stakingLedgerChange,\n networkId\n )\n balance.values.push(...stakingLedgerValues)\n }\n\n if (networkStorageCoders.poolMembers && nomPoolMemberChange) {\n const nomPoolMemberValue = decodePoolMemberResult(\n networkStorageCoders.poolMembers,\n nomPoolMemberChange,\n networkId\n )\n\n if (nomPoolMemberValue) nomPoolMemberInfo = nomPoolMemberValue\n }\n\n return { balance, nomPoolMemberInfo }\n },\n }\n })\n .filter(isNotNil)\n}\n\nconst decodeBaseResult = (\n coder: ScaleStorageCoder,\n value: string | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n data?: {\n flags?: bigint\n free?: bigint\n frozen?: bigint\n reserved?: bigint\n\n // deprecated fields (they only show up on old chains)\n feeFrozen?: bigint\n miscFrozen?: bigint\n }\n }\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode base native balance on chain ${networkId}`\n )\n\n const free = (decoded?.data?.free ?? 0n).toString()\n const reserved = (decoded?.data?.reserved ?? 0n).toString()\n const miscLock = (\n (decoded?.data?.miscFrozen ?? 0n) +\n // new chains don't split their `frozen` amount into `feeFrozen` and `miscFrozen`.\n // for these chains, we'll use the `frozen` amount as `miscFrozen`.\n ((decoded?.data as DecodedType[\"data\"])?.frozen ?? 0n)\n ).toString()\n const feesLock = (decoded?.data?.feeFrozen ?? 0n).toString()\n\n // even if these values are 0, we still need to add them to the balanceJson.values array\n // so that the balance pool can handle newly zeroed balances\n // const existingValues = Object.fromEntries(\n // balanceJson.values.map((v) => [getValueId(v), v]),\n // )\n const newValues: AmountWithLabel<string>[] = [\n { type: \"free\", label: \"free\", amount: free.toString() },\n { type: \"reserved\", label: \"reserved\", amount: reserved.toString() },\n { type: \"locked\", label: \"misc\", amount: miscLock.toString() },\n { type: \"locked\", label: \"fees\", amount: feesLock.toString() },\n ]\n\n return newValues\n}\n\nconst decodeLocksResult = (\n coder: ScaleStorageCoder,\n value: string | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = Array<{\n id?: Binary\n amount?: bigint\n }>\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode lock on chain ${networkId}`\n )\n\n const locksQueryLocks: Array<AmountWithLabel<string>> =\n decoded?.map?.((lock) => ({\n type: \"locked\",\n source: \"substrate-native-locks\",\n label: getLockedType(lock?.id?.asText?.()),\n meta: { id: lock?.id?.asText?.() },\n amount: (lock?.amount ?? 0n).toString(),\n })) ?? []\n\n return locksQueryLocks\n}\n\nconst decodeFreezesResult = (\n coder: ScaleStorageCoder,\n value: `0x${string}` | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = Array<{\n id?: { type?: string }\n amount?: bigint\n }>\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode freeze on chain ${networkId}`\n )\n\n const freezesValues: Array<AmountWithLabel<string>> =\n decoded?.map?.((lock) => ({\n type: \"locked\",\n source: \"substrate-native-freezes\",\n label: getLockedType(lock?.id?.type?.toLowerCase?.()),\n amount: lock?.amount?.toString?.() ?? \"0\",\n })) ?? []\n\n return freezesValues\n}\n\nconst decodeHoldsResult = (\n coder: ScaleStorageCoder,\n value: `0x${string}` | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = Array<{\n id?: Enum<{ DelegatedStaking: Enum<{ StakingDelegation: undefined }> }>\n amount?: bigint\n }>\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode holds on chain ${networkId}`\n )\n\n // at this time we re only interested in DelegatedStaking holds, to determine if nom pool staked amount is included in reserved or not\n const holdsValues: Array<AmountWithLabel<string>> =\n decoded\n ?.filter((hold) => hold.id?.type)\n .map((hold) => ({\n type: \"locked\",\n source: \"substrate-native-holds\",\n label: hold.id!.type,\n // anount needs to be 0 or a row could appear in the UI, this entry is just for information\n amount: \"0\",\n meta: { amount: (hold?.amount ?? 0n).toString() },\n })) ?? []\n\n return holdsValues\n}\n\nconst decodeStakingLedgerResult = (\n coder: ScaleStorageCoder,\n value: `0x${string}` | null,\n networkId: string\n): Array<AmountWithLabel<string>> => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n active: bigint\n legacy_claimed_rewards: number[]\n stash: string\n total: bigint\n unlocking: Array<{\n era: number\n value: bigint\n }>\n } | null\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode unbonding query on chain ${networkId}`\n )\n\n const totalUnlocking =\n decoded?.unlocking?.reduce?.((acc, unlocking) => acc + unlocking.value, 0n) ?? 0n\n\n const stakingLedgerResults: Array<AmountWithLabel<string>> =\n totalUnlocking <= 0n\n ? []\n : [\n {\n type: \"locked\",\n source: \"substrate-native-unbonding\",\n label: \"Unbonding\",\n amount: totalUnlocking.toString(),\n },\n ]\n\n return stakingLedgerResults\n}\n\nconst decodePoolMemberResult = (\n coder: ScaleStorageCoder,\n value: `0x${string}` | null,\n networkId: string\n): NomPoolMemberInfo | null => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n pool_id: number\n points: bigint\n last_recorded_reward_counter?: bigint\n /** Array of `[Era, Amount]` */\n unbonding_eras: Array<[number, bigint] | undefined>\n }\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode poolMembers on chain ${networkId}`\n )\n\n if (!decoded) return null\n\n const poolId: string = decoded.pool_id.toString()\n const points: string = decoded.points.toString()\n const unbondingEras: Array<{ era: string; amount: string }> = Array.from(\n decoded.unbonding_eras ?? []\n ).flatMap((entry) => {\n if (entry === undefined) return []\n const [key, value] = Array.from(entry)\n\n const era = key.toString()\n const amount = value.toString()\n if (typeof era !== \"string\" || typeof amount !== \"string\") return []\n\n return { era, amount }\n })\n\n return { poolId, points, unbondingEras }\n}\n","import upperFirst from \"lodash-es/upperFirst\"\n\nimport type { Balance, BalanceFormatter, LockedAmount } from \"../../../types\"\n\nexport type BalanceLockType =\n | \"reserved\"\n | \"democracy\"\n | \"crowdloan\"\n | \"staking\"\n | \"nompools-staking\"\n | \"nompools-unbonding\"\n | \"subtensor-staking\"\n | \"vesting\"\n | \"dapp-staking\"\n | `other-${string}`\n | \"other\"\n\nconst getOtherType: (input: string) => `other-${string}` = (input) =>\n `other-${input}` as `other-${string}`\n\n/**\n * For converting the value of `lock?.id?.toUtf8?.()` which is retrieved from\n * the Balances.Locks storage key into a useful classification for our UI\n */\nexport const getLockedType = (input?: string): BalanceLockType => {\n if (typeof input !== \"string\") return getOtherType(\"unknown\")\n\n if (input.includes(\"vesting\")) return \"vesting\"\n if (input.includes(\"calamvst\")) return \"vesting\" // vesting on manta network\n if (input.includes(\"ormlvest\")) return \"vesting\" // vesting ORML tokens\n if (input.includes(\"pyconvot\")) return \"democracy\"\n if (input.includes(\"democrac\")) return \"democracy\"\n if (input.includes(\"democracy\")) return \"democracy\"\n if (input.includes(\"phrelect\")) return \"democracy\" // specific to council\n if (input.includes(\"staking\")) return \"staking\"\n if (input.includes(\"stkngdel\")) return \"staking\" // staking delegator\n if (input.includes(\"stkngcol\")) return \"staking\" // staking collator\n if (input.includes(\"kiltpstk\")) return \"staking\" // Kilt specific staking\n if (input.includes(\"dapstake\")) return \"dapp-staking\" // Astar specific\n if (input.includes(\"appstake\")) return \"dapp-staking\" // Quartz (unique) specific\n if (input.includes(\"dappstaking\")) return \"dapp-staking\"\n\n // Joystream specifics https://github.com/Joystream/pioneer/blob/dev/packages/ui/src/accounts/model/lockTypes.ts\n if (input.includes(\"voting\")) return \"democracy\"\n if (input.includes(\"candidac\")) return \"democracy\" // Council Candidate\n if (input.includes(\"councilo\")) return \"democracy\" // Councilor\n if (input.includes(\"proposal\")) return \"democracy\"\n if (input.includes(\"boundsta\")) return \"staking\" // Bound Staking Account\n if (input.includes(\"invitemb\")) return getOtherType(input) // Invite member\n if (input.includes(\"bounty\")) return getOtherType(input)\n if (input.startsWith(\"wg-\")) return getOtherType(input)\n\n // ignore technical or undocumented lock types\n if (input.includes(\"pdexlock\")) return getOtherType(input)\n if (input.includes(\"phala/sp\")) return getOtherType(input)\n if (input.includes(\"aca/earn\")) return getOtherType(input)\n if (input.includes(\"stk_stks\")) return getOtherType(input)\n\n // biome-ignore lint/suspicious/noConsole: legacy\n console.warn(`unknown locked type: ${input}`)\n return getOtherType(input)\n}\n\nconst baseLockLabels = [\"fees\", \"misc\"]\nconst isBaseLock = (lock: Pick<LockedAmount<string>, \"label\">) =>\n baseLockLabels.includes(lock.label)\nconst isNonBaseLock = (lock: Pick<LockedAmount<string>, \"label\">) => !isBaseLock(lock)\nexport const filterBaseLocks = (\n locks: Array<Omit<LockedAmount<string>, \"amount\"> & { amount: BalanceFormatter }>\n) => {\n const hasNonBaseLocks = locks.some(isNonBaseLock)\n if (!hasNonBaseLocks) return locks\n\n return locks.filter(isNonBaseLock)\n}\n\n// TODO: Make these titles translatable\nexport const getLockTitle = (\n lock: Pick<LockedAmount<string>, \"label\" | \"meta\">,\n // biome-ignore lint/correctness/noUnusedFunctionParameters: legacy\n { balance }: { balance?: Balance } = {}\n) => {\n if (!lock.label) return lock.label\n\n if (lock.label === \"democracy\") return \"Governance\"\n if (lock.label === \"crowdloan\") return \"Crowdloan\"\n if (lock.label === \"nompools-staking\") return \"Pooled Staking\"\n if (lock.label === \"nompools-unbonding\") return \"Pooled Staking\"\n if (lock.label === \"subtensor-staking\") return \"Root Staking\"\n if (lock.label === \"dapp-staking\") return \"DApp Staking\"\n if (lock.label === \"fees\") return \"Locked (Fees)\"\n if (lock.label === \"misc\") return \"Locked\"\n if (lock.label.startsWith(\"other\")) return \"Locked\"\n\n return upperFirst(lock.label)\n}\n","import { decodeScale, type ScaleStorageCoder } from \"@talismn/scale\"\nimport type { Binary } from \"polkadot-api\"\n\nimport type { IBalance, MiniMetadata } from \"../../../types\"\nimport { buildNetworkStorageCoders } from \"../../shared\"\nimport type { RpcQueryPack } from \"../../shared/rpcQueryPack\"\nimport type { MiniMetadataExtra } from \"../config\"\nimport { nompoolStashAccountId } from \"../util/nompoolAccountId\"\nimport type { BaseBalance, NomPoolMemberInfo } from \"./buildBaseQueries\"\n\nexport const buildNomPoolQueries = (\n networkId: string,\n partialBalances: BaseBalance[],\n miniMetadata: MiniMetadata<MiniMetadataExtra>\n): Array<RpcQueryPack<IBalance>> => {\n const networkStorageCoders = getNomPoolCoders(networkId, miniMetadata)\n\n if (!networkStorageCoders)\n throw new Error(`No network storage coders found for networkId: ${networkId}`)\n\n return partialBalances.map(({ balance, nomPoolMemberInfo }) => {\n const stateKeys = getNomPoolStateKeys(\n networkStorageCoders,\n nomPoolMemberInfo,\n miniMetadata.extra\n )\n\n return {\n stateKeys,\n decodeResult: (changes: (`0x${string}` | null)[]) => {\n if (!nomPoolMemberInfo || !stateKeys.length || changes.includes(null)) return balance\n\n const accountPoints = nomPoolMemberInfo?.points ?? \"0\"\n\n const { poolPoints = \"0\" } = decodePoolPoints(\n networkStorageCoders.bondedPools!,\n changes[0]!,\n networkId\n )\n const { poolTotalActiveStake = \"0\" } = decodePoolStake(\n networkStorageCoders.ledger!,\n changes[1]!,\n networkId\n )\n const { metadata = \"0\" } = decodePoolMeta(\n networkStorageCoders.metadata!,\n changes[2]!,\n networkId\n )\n\n const amount =\n accountPoints === \"0\" || poolPoints === \"0\" || poolTotalActiveStake === \"0\"\n ? 0n\n : (BigInt(poolTotalActiveStake) * BigInt(accountPoints)) / BigInt(poolPoints)\n\n const unbondingAmount = nomPoolMemberInfo.unbondingEras.reduce(\n (total, { amount }) => total + BigInt(amount ?? \"0\"),\n 0n\n )\n\n return {\n ...balance,\n values: [\n ...(balance.values?.filter(({ source }) => source !== \"nompools-staking\") ?? []),\n {\n source: \"nompools-staking\",\n type: \"nompool\",\n label: \"nompools-staking\",\n amount: amount.toString(),\n meta: { type: \"nompool\", poolId: nomPoolMemberInfo.poolId, description: metadata },\n },\n {\n source: \"nompools-staking\",\n type: \"nompool\",\n label: \"nompools-unbonding\",\n amount: unbondingAmount.toString(),\n meta: {\n poolId: nomPoolMemberInfo.poolId,\n description: metadata ?? `Pool ${nomPoolMemberInfo.poolId}`,\n unbonding: true,\n },\n },\n ],\n }\n },\n }\n })\n}\n\nconst getNomPoolCoders = (networkId: string, miniMetadata: MiniMetadata<MiniMetadataExtra>) => {\n return buildNetworkStorageCoders(networkId, miniMetadata, {\n poolMembers: [\"NominationPools\", \"PoolMembers\"],\n bondedPools: [\"NominationPools\", \"BondedPools\"],\n ledger: [\"Staking\", \"Ledger\"],\n metadata: [\"NominationPools\", \"Metadata\"],\n })\n}\n\nconst decodePoolPoints = (coder: ScaleStorageCoder, value: string, networkId: string) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n commission?: unknown\n member_counter?: number\n points: bigint\n roles?: unknown\n state?: unknown\n }\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode bondedPools on chain ${networkId}`\n )\n\n return { poolPoints: decoded?.points.toString() }\n}\n\nconst decodePoolStake = (coder: ScaleStorageCoder, value: string, networkId: string) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n active: bigint\n legacy_claimed_rewards?: number[]\n stash?: string\n total?: bigint\n unlocking?: Array<{ value?: bigint; era?: number }>\n }\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode ledger on chain ${networkId}`\n )\n\n return { poolTotalActiveStake: decoded?.active.toString() }\n}\n\nconst decodePoolMeta = (coder: ScaleStorageCoder, value: string, networkId: string) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = Binary\n\n const decoded = decodeScale<DecodedType>(\n coder,\n value,\n `Failed to decode metadata on chain ${networkId}`\n )\n\n const metadata = decoded?.asText()\n\n return { metadata }\n}\n\nconst getNomPoolStateKeys = (\n coders: ReturnType<typeof getNomPoolCoders>,\n nomPoolMemberInfo: NomPoolMemberInfo | null,\n extra: MiniMetadataExtra\n): `0x${string}`[] => {\n if (\n !nomPoolMemberInfo ||\n !extra.nominationPoolsPalletId ||\n !coders?.bondedPools ||\n !coders.ledger ||\n !coders.metadata\n )\n return []\n\n try {\n const poolId = nomPoolMemberInfo.poolId\n const stashAddress = nompoolStashAccountId(extra.nominationPoolsPalletId, poolId)\n\n const poolPointsStateKey = coders.bondedPools.keys.enc(poolId) as `0x${string}`\n const poolStakeStateKey = coders.ledger.keys.enc(stashAddress) as `0x${string}`\n const poolMetaStateKey = coders.metadata.keys.enc(poolId) as `0x${string}`\n\n return [poolPointsStateKey, poolStakeStateKey, poolMetaStateKey]\n } catch {\n return []\n }\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { AccountId, type SS58String } from \"polkadot-api\"\nimport { u32 } from \"scale-ts\"\n\n/**\n * Each nominationPool in the nominationPools pallet has access to some accountIds which have no\n * associated private key. Instead, they are derived from this function.\n */\nconst nompoolAccountId = (palletId: string, poolId: string | number, index: number): SS58String => {\n const utf8Encoder = new TextEncoder()\n const encModPrefix = utf8Encoder.encode(\"modl\")\n const encPalletId = utf8Encoder.encode(palletId)\n\n const encIndex = new Uint8Array([index])\n const encPoolId = u32.enc(typeof poolId === \"string\" ? parseInt(poolId, 10) : poolId)\n\n const length = encModPrefix.length + encPalletId.length + encIndex.length + encPoolId.length\n const remainingBytes = 32 - length\n const encEmptyH256 = new Uint8Array(remainingBytes)\n\n const bytes = mergeUint8([encModPrefix, encPalletId, encIndex, encPoolId, encEmptyH256])\n\n return AccountId().dec(bytes)\n}\n/** The stash account for the nomination pool */\nexport const nompoolStashAccountId = (palletId: string, poolId: string | number) =>\n nompoolAccountId(palletId, poolId, 0)\n/** The rewards account for the nomination pool */\nconst _nompoolRewardAccountId = (palletId: string, poolId: string | number) =>\n nompoolAccountId(palletId, poolId, 1)\n","import log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { type MiniMetadataExtra, MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\nimport { buildBaseQueries } from \"./queries/buildBaseQueries\"\nimport { buildNomPoolQueries } from \"./queries/buildNomPoolQueries\"\n\nexport const fetchBalances: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"fetchBalances\"] = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata)\n const partialBalances = await fetchRpcQueryPack(connector, networkId, baseQueries)\n\n // now for each balance that includes nomPoolStaking, we need to fetch the metadata for the pool\n const nomPoolQueries = buildNomPoolQueries(networkId, partialBalances, miniMetadata)\n const balances = await fetchRpcQueryPack(connector, networkId, nomPoolQueries)\n\n return { success: balances, errors: [] }\n}\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport {\n type SubNativeToken,\n SubNativeTokenSchema,\n subNativeTokenId,\n} from \"@talismn/chaindata-provider\"\nimport { assign } from \"lodash-es\"\nimport z from \"zod/v4\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport type { MiniMetadataExtra, MODULE_TYPE, ModuleConfig, TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"fetchTokens\"] = async ({ networkId, tokens, connector, miniMetadata }) => {\n if (miniMetadata.extra.disable) return []\n\n const { tokenSymbol: symbol, tokenDecimals: decimals } = await getChainProperties(\n connector,\n networkId\n )\n\n if (!miniMetadata.extra.existentialDeposit)\n log.warn(`Substrate native module: existentialDeposit is undefined for ${networkId}, using 0`)\n\n const tokenConfig: TokenConfig | undefined = tokens[0]\n\n const nativeToken: SubNativeToken = {\n id: subNativeTokenId(networkId),\n type: \"substrate-native\",\n platform: \"polkadot\",\n networkId,\n isDefault: true,\n symbol: symbol,\n name: symbol,\n decimals: decimals,\n existentialDeposit: miniMetadata.extra.existentialDeposit ?? \"0\",\n }\n\n const token = assign(nativeToken, tokenConfig)\n\n const parsed = SubNativeTokenSchema.safeParse(token)\n if (!parsed.success) {\n // log.warn(`Ignoring invalid token ${MODULE_TYPE}`, token, parsed.error)\n return []\n }\n\n return [parsed.data]\n}\n\nconst DotNetworkPropertiesSimple = z.object({\n tokenDecimals: z.number().optional().default(0),\n tokenSymbol: z.string().optional().default(\"Unit\"),\n})\n\nconst DotNetworkPropertiesArray = z.object({\n tokenDecimals: z.array(z.number()).nonempty(),\n tokenSymbol: z.array(z.string()).nonempty(),\n})\n\nconst DotNetworkPropertiesSchema = z\n .union([DotNetworkPropertiesSimple, DotNetworkPropertiesArray])\n .transform((val) => ({\n tokenDecimals: Array.isArray(val.tokenDecimals) ? val.tokenDecimals[0] : val.tokenDecimals,\n tokenSymbol: Array.isArray(val.tokenSymbol) ? val.tokenSymbol[0] : val.tokenSymbol,\n }))\n\nconst getChainProperties = async (connector: IChainConnectorDot, networkId: string) => {\n const properties = await connector.send(networkId, \"system_properties\", [], true)\n return DotNetworkPropertiesSchema.parse(properties)\n}\n","import { MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\nimport type { Binary } from \"polkadot-api\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, tryGetConstantValue } from \"../shared\"\nimport { type MiniMetadataExtra, MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"getMiniMetadata\"] = ({ networkId, specVersion, metadataRpc, config }) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n if (config?.disable)\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: null,\n extra: { disable: true },\n }\n\n const existentialDeposit = tryGetConstantValue<bigint>(\n metadataRpc,\n \"Balances\",\n \"ExistentialDeposit\"\n )?.toString()\n const nominationPoolsPalletId = tryGetConstantValue<Binary>(\n metadataRpc,\n \"NominationPools\",\n \"PalletId\"\n )?.asText()\n\n const hasFreezesItem = Boolean(\n unifiedMetadata.pallets\n .find(({ name }) => name === \"Balances\")\n ?.storage?.items.find(({ name }) => name === \"Freezes\")\n )\n const useLegacyTransferableCalculation = !hasFreezesItem\n\n compactMetadata(metadata, [\n { pallet: \"System\", constants: [\"Version\", \"SS58Prefix\"], items: [\"Account\"] },\n { pallet: \"Balances\", items: [\"Reserves\", \"Holds\", \"Locks\", \"Freezes\"] },\n { pallet: \"NominationPools\", items: [\"PoolMembers\", \"BondedPools\", \"Metadata\"] },\n { pallet: \"Staking\", items: [\"Ledger\"] },\n ])\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: encodeMetadata(metadata),\n extra: {\n useLegacyTransferableCalculation,\n existentialDeposit,\n nominationPoolsPalletId,\n },\n }\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType } from \"@talismn/chaindata-provider\"\nimport {\n type Codec,\n type MetadataLookup,\n parseMetadataRpc,\n type UnifiedMetadata,\n} from \"@talismn/scale\"\nimport { Binary, Enum } from \"polkadot-api\"\n\nimport type { BalanceTransferType, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] = ({\n from,\n to,\n value,\n token,\n type,\n metadataRpc,\n}) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { unifiedMetadata, lookupFn, builder } = parseMetadataRpc(metadataRpc)\n const method = getTransferMethod(type, unifiedMetadata, lookupFn)\n\n const { codec, location } = builder.buildCall(\"Balances\", method)\n const args = getEncodedArgs(method, to, value, codec)\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n\nconst getTransferMethod = (\n type: BalanceTransferType,\n unifiedMetadata: UnifiedMetadata,\n lookupFn: MetadataLookup\n) => {\n switch (type) {\n case \"keep-alive\":\n return \"transfer_keep_alive\"\n case \"all\":\n return \"transfer_all\"\n case \"allow-death\": {\n const callType = unifiedMetadata.pallets.find((pallet) => pallet.name === \"Balances\")?.calls\n ?.type\n\n if (callType) {\n const palletCalls = lookupFn(callType)\n if (palletCalls.type === \"enum\" && palletCalls.value.transfer_allow_death)\n return \"transfer_allow_death\"\n }\n\n // legacy fallback\n return \"transfer\"\n }\n }\n}\n\nconst getEncodedArgs = (\n method: ReturnType<typeof getTransferMethod>,\n to: string,\n value: string,\n argsCodec: Codec<unknown>\n): Uint8Array => {\n try {\n switch (method) {\n case \"transfer_allow_death\":\n case \"transfer_keep_alive\":\n case \"transfer\":\n return getTransferEncodedArgs(to, value, argsCodec)\n case \"transfer_all\":\n return getTransferAllEncodedArgs(to, argsCodec)\n }\n } catch {\n throw new Error(`Failed to encode arguments for method ${method}, ${to}, ${value}`)\n }\n}\n\nconst getEncodedValue = (codec: Codec<unknown>, possibleValue: Array<() => unknown>) => {\n for (const getArgs of possibleValue) {\n try {\n return codec.enc(getArgs())\n } catch {\n // wrong inputs, ignore and try the next one\n }\n }\n\n throw new Error(\"Failed to encode\")\n}\n\n// same inputs for both KeepAlive and allowDeath\nconst getTransferEncodedArgs = (to: string, value: string, codec: Codec<unknown>) => {\n return getEncodedValue(codec, [\n () => ({\n dest: Enum(\"Id\", to),\n value: BigInt(value),\n }),\n () => ({\n dest: to, // ex: native MYTH on Mythos\n value: BigInt(value),\n }),\n ])\n}\n\nconst getTransferAllEncodedArgs = (to: string, codec: Codec<unknown>) => {\n return getEncodedValue(codec, [\n () => ({\n dest: Enum(\"Id\", to),\n keep_alive: false,\n }),\n () => ({\n dest: to,\n keep_alive: false,\n }),\n ])\n}\n","import { map, of, switchMap } from \"rxjs\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { getRpcQueryPack$ } from \"../shared/rpcQueryPack\"\nimport type { MiniMetadataExtra, MODULE_TYPE, ModuleConfig, TokenConfig } from \"./config\"\nimport { buildBaseQueries } from \"./queries/buildBaseQueries\"\nimport { buildNomPoolQueries } from \"./queries/buildNomPoolQueries\"\n\nexport const subscribeBalances: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"subscribeBalances\"] = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n // could be use as shared observable key if we decide to cache the sub\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const baseQueries = buildBaseQueries(networkId, balanceDefs, miniMetadata)\n\n return getRpcQueryPack$(connector, networkId, baseQueries).pipe(\n switchMap((partialBalances) => {\n // now for each balance that includes nomPoolStaking, we need to fetch the metadata for the pool\n const nomPoolQueries = buildNomPoolQueries(networkId, partialBalances, miniMetadata)\n return getRpcQueryPack$(connector, networkId, nomPoolQueries)\n }),\n map((balances) => ({\n success: balances,\n errors: [],\n }))\n )\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport {\n type MiniMetadataExtra,\n MODULE_TYPE,\n type ModuleConfig,\n PLATFORM,\n type TokenConfig,\n} from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubNativeBalanceModule: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubNativeTokenConfigSchema = z.strictObject({\n ...TokenConfigBaseSchema.shape,\n})\n\n// Do not use this type outside of this module\nexport type SubNativeTokenConfig = z.infer<typeof SubNativeTokenConfigSchema>\n\nexport const SubNativeModuleConfigSchema = z.strictObject({\n disable: z.boolean().optional(),\n})\n\n// Do not use this type outside of this module\nexport type SubNativeModuleConfig = z.infer<typeof SubNativeModuleConfigSchema>\n\nexport const SubNativeMiniMetadataExtraSchema = z.strictObject({\n disable: z.boolean().optional(),\n useLegacyTransferableCalculation: z.boolean().optional(),\n existentialDeposit: z.string().optional(),\n nominationPoolsPalletId: z.string().optional(),\n})\n\n// Do not use this type outside of this module\nexport type SubNativeMiniMetadataExtra = z.infer<typeof SubNativeMiniMetadataExtraSchema>\n","import { SubPsp22TokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type { SubPsp22TokenConfig as TokenConfig } from \"./types\"\n\nexport const MODULE_TYPE = SubPsp22TokenSchema.shape.type.value\nexport const PLATFORM = SubPsp22TokenSchema.shape.platform.value\n","import { Abi } from \"@polkadot/api-contract\"\nimport { TypeRegistry } from \"@polkadot/types\"\n\nimport type { IBalance } from \"../../types\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport psp22Abi from \"../abis/psp22.json\"\nimport type { BalanceFetchError } from \"../shared\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport type { MODULE_TYPE } from \"./config\"\nimport { makeContractCaller } from \"./util\"\n\nexport const fetchBalances: IBalanceModule<typeof MODULE_TYPE>[\"fetchBalances\"] = async ({\n networkId,\n tokensWithAddresses,\n connector,\n}) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!balanceDefs.length) return { success: [], errors: [] }\n\n const registry = new TypeRegistry()\n const Psp22Abi = new Abi(psp22Abi)\n\n const contractCall = makeContractCaller({\n chainConnector: connector,\n chainId: networkId,\n registry,\n })\n\n const results = await Promise.allSettled(\n balanceDefs.map(async ({ token, address }) => {\n const result = await contractCall(\n address,\n token.contractAddress,\n Psp22Abi.findMessage(\"PSP22::balance_of\").toU8a([address])\n )\n\n if (!result.result.isOk) throw new Error(\"Failed to fetch balance\")\n\n const value = registry.createType(\"Balance\", result.result.asOk.data).toString()\n\n const balance: IBalance = {\n source: \"substrate-psp22\",\n status: \"live\",\n address,\n networkId: token.networkId,\n tokenId: token.id,\n value,\n }\n\n return balance\n })\n )\n\n return results.reduce<FetchBalanceResults>(\n (acc, result) => {\n if (result.status === \"fulfilled\") acc.success.push(result.value as IBalance)\n else {\n const error = result.reason as BalanceFetchError\n acc.errors.push({\n tokenId: error.tokenId,\n address: error.address,\n error,\n })\n }\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","{\n \"source\": {\n \"hash\": \"0x9adaf0c0a3d26ea6dc77ef8cbf1a682100a7ab3f3cd0d3d6022ace606b7484a7\",\n \"language\": \"ink! 4.0.1\",\n \"compiler\": \"rustc 1.69.0-nightly\",\n \"build_info\": {\n \"build_mode\": \"Debug\",\n \"cargo_contract_version\": \"2.2.1\",\n \"rust_toolchain\": \"nightly-x86_64-unknown-linux-gnu\",\n \"wasm_opt_settings\": {\n \"keep_debug_symbols\": false,\n \"optimization_passes\": \"Z\"\n }\n }\n },\n \"contract\": {\n \"name\": \"psp22\",\n \"version\": \"1.0.0\",\n \"authors\": [\"OpenBrush\"]\n },\n \"spec\": {\n \"constructors\": [\n {\n \"args\": [\n {\n \"label\": \"initial_supply\",\n \"type\": {\n \"displayName\": [\"Balance\"],\n \"type\": 0\n }\n },\n {\n \"label\": \"name\",\n \"type\": {\n \"displayName\": [\"Option\"],\n \"type\": 4\n }\n },\n {\n \"label\": \"symbol\",\n \"type\": {\n \"displayName\": [\"Option\"],\n \"type\": 4\n }\n },\n {\n \"label\": \"decimal\",\n \"type\": {\n \"displayName\": [\"u8\"],\n \"type\": 3\n }\n }\n ],\n \"docs\": [],\n \"label\": \"new\",\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink_primitives\", \"ConstructorResult\"],\n \"type\": 5\n },\n \"selector\": \"0x9bae9d5e\"\n }\n ],\n \"docs\": [],\n \"events\": [],\n \"lang_error\": {\n \"displayName\": [\"ink\", \"LangError\"],\n \"type\": 6\n },\n \"messages\": [\n {\n \"args\": [\n {\n \"label\": \"owner\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"BalanceOfInput1\"],\n \"type\": 7\n }\n }\n ],\n \"docs\": [\n \" Returns the account Balance for the specified `owner`.\",\n \"\",\n \" Returns `0` if the account is non-existent.\"\n ],\n \"label\": \"PSP22::balance_of\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 9\n },\n \"selector\": \"0x6568382f\"\n },\n {\n \"args\": [\n {\n \"label\": \"spender\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"ApproveInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"ApproveInput2\"],\n \"type\": 0\n }\n }\n ],\n \"docs\": [\n \" Allows `spender` to withdraw from the caller's account multiple times, up to\",\n \" the `value` amount.\",\n \"\",\n \" If this function is called again it overwrites the current allowance with `value`.\",\n \"\",\n \" An `Approval` event is emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::approve\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0xb20f1bbd\"\n },\n {\n \"args\": [\n {\n \"label\": \"to\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferInput2\"],\n \"type\": 0\n }\n },\n {\n \"label\": \"data\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferInput3\"],\n \"type\": 2\n }\n }\n ],\n \"docs\": [\n \" Transfers `value` amount of tokens from the caller's account to account `to`\",\n \" with additional `data` in unspecified format.\",\n \"\",\n \" On success a `Transfer` event is emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `InsufficientBalance` error if there are not enough tokens on\",\n \" the caller's account Balance.\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::transfer\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0xdb20f9f5\"\n },\n {\n \"args\": [\n {\n \"label\": \"from\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferFromInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"to\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferFromInput2\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferFromInput3\"],\n \"type\": 0\n }\n },\n {\n \"label\": \"data\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"TransferFromInput4\"],\n \"type\": 2\n }\n }\n ],\n \"docs\": [\n \" Transfers `value` tokens on the behalf of `from` to the account `to`\",\n \" with additional `data` in unspecified format.\",\n \"\",\n \" This can be used to allow a contract to transfer tokens on ones behalf and/or\",\n \" to charge fees in sub-currencies, for example.\",\n \"\",\n \" On success a `Transfer` and `Approval` events are emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `InsufficientAllowance` error if there are not enough tokens allowed\",\n \" for the caller to withdraw from `from`.\",\n \"\",\n \" Returns `InsufficientBalance` error if there are not enough tokens on\",\n \" the the account Balance of `from`.\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::transfer_from\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0x54b3c76e\"\n },\n {\n \"args\": [\n {\n \"label\": \"spender\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"IncreaseAllowanceInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"delta_value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"IncreaseAllowanceInput2\"],\n \"type\": 0\n }\n }\n ],\n \"docs\": [\n \" Atomically increases the allowance granted to `spender` by the caller.\",\n \"\",\n \" An `Approval` event is emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::increase_allowance\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0x96d6b57a\"\n },\n {\n \"args\": [],\n \"docs\": [\" Returns the total token supply.\"],\n \"label\": \"PSP22::total_supply\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 9\n },\n \"selector\": \"0x162df8c2\"\n },\n {\n \"args\": [\n {\n \"label\": \"spender\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"DecreaseAllowanceInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"delta_value\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"DecreaseAllowanceInput2\"],\n \"type\": 0\n }\n }\n ],\n \"docs\": [\n \" Atomically decreases the allowance granted to `spender` by the caller.\",\n \"\",\n \" An `Approval` event is emitted.\",\n \"\",\n \" # Errors\",\n \"\",\n \" Returns `InsufficientAllowance` error if there are not enough tokens allowed\",\n \" by owner for `spender`.\",\n \"\",\n \" Returns `ZeroSenderAddress` error if sender's address is zero.\",\n \"\",\n \" Returns `ZeroRecipientAddress` error if recipient's address is zero.\"\n ],\n \"label\": \"PSP22::decrease_allowance\",\n \"mutates\": true,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 10\n },\n \"selector\": \"0xfecb57d5\"\n },\n {\n \"args\": [\n {\n \"label\": \"owner\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"AllowanceInput1\"],\n \"type\": 7\n }\n },\n {\n \"label\": \"spender\",\n \"type\": {\n \"displayName\": [\"psp22_external\", \"AllowanceInput2\"],\n \"type\": 7\n }\n }\n ],\n \"docs\": [\n \" Returns the amount which `spender` is still allowed to withdraw from `owner`.\",\n \"\",\n \" Returns `0` if no allowance has been set `0`.\"\n ],\n \"label\": \"PSP22::allowance\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 9\n },\n \"selector\": \"0x4d47d921\"\n },\n {\n \"args\": [],\n \"docs\": [\" Returns the token symbol.\"],\n \"label\": \"PSP22Metadata::token_symbol\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 13\n },\n \"selector\": \"0x34205be5\"\n },\n {\n \"args\": [],\n \"docs\": [\" Returns the token name.\"],\n \"label\": \"PSP22Metadata::token_name\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 13\n },\n \"selector\": \"0x3d261bd4\"\n },\n {\n \"args\": [],\n \"docs\": [\" Returns the token decimals.\"],\n \"label\": \"PSP22Metadata::token_decimals\",\n \"mutates\": false,\n \"payable\": false,\n \"returnType\": {\n \"displayName\": [\"ink\", \"MessageResult\"],\n \"type\": 14\n },\n \"selector\": \"0x7271b782\"\n }\n ]\n },\n \"storage\": {\n \"root\": {\n \"layout\": {\n \"struct\": {\n \"fields\": [\n {\n \"layout\": {\n \"struct\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 0\n }\n },\n \"name\": \"supply\"\n },\n {\n \"layout\": {\n \"root\": {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x1d458d3b\",\n \"ty\": 0\n }\n },\n \"root_key\": \"0x1d458d3b\"\n }\n },\n \"name\": \"balances\"\n },\n {\n \"layout\": {\n \"root\": {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x0abd72fb\",\n \"ty\": 0\n }\n },\n \"root_key\": \"0x0abd72fb\"\n }\n },\n \"name\": \"allowances\"\n },\n {\n \"layout\": {\n \"enum\": {\n \"dispatchKey\": \"0x00000000\",\n \"name\": \"Option\",\n \"variants\": {\n \"0\": {\n \"fields\": [],\n \"name\": \"None\"\n },\n \"1\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 1\n }\n },\n \"name\": \"0\"\n }\n ],\n \"name\": \"Some\"\n }\n }\n }\n },\n \"name\": \"_reserved\"\n }\n ],\n \"name\": \"Data\"\n }\n },\n \"name\": \"psp22\"\n },\n {\n \"layout\": {\n \"struct\": {\n \"fields\": [\n {\n \"layout\": {\n \"enum\": {\n \"dispatchKey\": \"0x00000000\",\n \"name\": \"Option\",\n \"variants\": {\n \"0\": {\n \"fields\": [],\n \"name\": \"None\"\n },\n \"1\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 2\n }\n },\n \"name\": \"0\"\n }\n ],\n \"name\": \"Some\"\n }\n }\n }\n },\n \"name\": \"name\"\n },\n {\n \"layout\": {\n \"enum\": {\n \"dispatchKey\": \"0x00000000\",\n \"name\": \"Option\",\n \"variants\": {\n \"0\": {\n \"fields\": [],\n \"name\": \"None\"\n },\n \"1\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 2\n }\n },\n \"name\": \"0\"\n }\n ],\n \"name\": \"Some\"\n }\n }\n }\n },\n \"name\": \"symbol\"\n },\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 3\n }\n },\n \"name\": \"decimals\"\n },\n {\n \"layout\": {\n \"enum\": {\n \"dispatchKey\": \"0x00000000\",\n \"name\": \"Option\",\n \"variants\": {\n \"0\": {\n \"fields\": [],\n \"name\": \"None\"\n },\n \"1\": {\n \"fields\": [\n {\n \"layout\": {\n \"leaf\": {\n \"key\": \"0x00000000\",\n \"ty\": 1\n }\n },\n \"name\": \"0\"\n }\n ],\n \"name\": \"Some\"\n }\n }\n }\n },\n \"name\": \"_reserved\"\n }\n ],\n \"name\": \"Data\"\n }\n },\n \"name\": \"metadata\"\n }\n ],\n \"name\": \"MyToken\"\n }\n },\n \"root_key\": \"0x00000000\"\n }\n },\n \"types\": [\n {\n \"id\": 0,\n \"type\": {\n \"def\": {\n \"primitive\": \"u128\"\n }\n }\n },\n {\n \"id\": 1,\n \"type\": {\n \"def\": {\n \"tuple\": []\n }\n }\n },\n {\n \"id\": 2,\n \"type\": {\n \"def\": {\n \"sequence\": {\n \"type\": 3\n }\n }\n }\n },\n {\n \"id\": 3,\n \"type\": {\n \"def\": {\n \"primitive\": \"u8\"\n }\n }\n },\n {\n \"id\": 4,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"index\": 0,\n \"name\": \"None\"\n },\n {\n \"fields\": [\n {\n \"type\": 2\n }\n ],\n \"index\": 1,\n \"name\": \"Some\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 2\n }\n ],\n \"path\": [\"Option\"]\n }\n },\n {\n \"id\": 5,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 1\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 1\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 6,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"index\": 1,\n \"name\": \"CouldNotReadInput\"\n }\n ]\n }\n },\n \"path\": [\"ink_primitives\", \"LangError\"]\n }\n },\n {\n \"id\": 7,\n \"type\": {\n \"def\": {\n \"composite\": {\n \"fields\": [\n {\n \"type\": 8,\n \"typeName\": \"[u8; 32]\"\n }\n ]\n }\n },\n \"path\": [\"ink_primitives\", \"types\", \"AccountId\"]\n }\n },\n {\n \"id\": 8,\n \"type\": {\n \"def\": {\n \"array\": {\n \"len\": 32,\n \"type\": 3\n }\n }\n }\n },\n {\n \"id\": 9,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 0\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 0\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 10,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 11\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 11\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 11,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 1\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 12\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 1\n },\n {\n \"name\": \"E\",\n \"type\": 12\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 12,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 2,\n \"typeName\": \"String\"\n }\n ],\n \"index\": 0,\n \"name\": \"Custom\"\n },\n {\n \"index\": 1,\n \"name\": \"InsufficientBalance\"\n },\n {\n \"index\": 2,\n \"name\": \"InsufficientAllowance\"\n },\n {\n \"index\": 3,\n \"name\": \"ZeroRecipientAddress\"\n },\n {\n \"index\": 4,\n \"name\": \"ZeroSenderAddress\"\n },\n {\n \"fields\": [\n {\n \"type\": 2,\n \"typeName\": \"String\"\n }\n ],\n \"index\": 5,\n \"name\": \"SafeTransferCheckFailed\"\n }\n ]\n }\n },\n \"path\": [\"openbrush_contracts\", \"traits\", \"errors\", \"psp22\", \"PSP22Error\"]\n }\n },\n {\n \"id\": 13,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 4\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 4\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n },\n {\n \"id\": 14,\n \"type\": {\n \"def\": {\n \"variant\": {\n \"variants\": [\n {\n \"fields\": [\n {\n \"type\": 3\n }\n ],\n \"index\": 0,\n \"name\": \"Ok\"\n },\n {\n \"fields\": [\n {\n \"type\": 6\n }\n ],\n \"index\": 1,\n \"name\": \"Err\"\n }\n ]\n }\n },\n \"params\": [\n {\n \"name\": \"T\",\n \"type\": 3\n },\n {\n \"name\": \"E\",\n \"type\": 6\n }\n ],\n \"path\": [\"Result\"]\n }\n }\n ],\n \"version\": \"4\"\n}\n","import type { TypeRegistry } from \"@polkadot/types\"\nimport type { ContractExecResult } from \"@polkadot/types/interfaces\"\nimport { u8aConcatStrict, u8aToHex } from \"@polkadot/util\"\nimport type { IChainConnectorDot } from \"@talismn/chain-connectors\"\n\nexport const makeContractCaller =\n ({\n chainConnector,\n chainId,\n registry,\n }: {\n chainConnector: IChainConnectorDot\n chainId: string\n registry: TypeRegistry\n }) =>\n async <T extends Uint8Array | { toU8a: () => Uint8Array }>(\n callFrom: string,\n contractAddress: string,\n inputData: T\n ) =>\n registry.createType(\n \"ContractExecResult\",\n await chainConnector.send(chainId, \"state_call\", [\n \"ContractsApi_call\",\n u8aToHex(\n u8aConcatStrict([\n // origin\n registry\n .createType(\"AccountId\", callFrom)\n .toU8a(),\n // dest\n registry\n .createType(\"AccountId\", contractAddress)\n .toU8a(),\n // value\n registry\n .createType(\"Balance\", 0)\n .toU8a(),\n // gasLimit\n registry\n .createType(\"Option<WeightV2>\")\n .toU8a(),\n // storageDepositLimit\n registry\n .createType(\"Option<Balance>\")\n .toU8a(),\n // inputData\n inputData instanceof Uint8Array ? inputData : inputData.toU8a(),\n ])\n ),\n ])\n ) as ContractExecResult\n","import { Abi } from \"@polkadot/api-contract\"\nimport { TypeRegistry } from \"@polkadot/types\"\nimport { hexToNumber, u8aToString } from \"@polkadot/util\"\nimport {\n type SubPsp22Token,\n SubPsp22TokenSchema,\n subPsp22TokenId,\n} from \"@talismn/chaindata-provider\"\nimport { values } from \"lodash-es\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport psp22Abi from \"../abis/psp22.json\"\nimport type { MODULE_TYPE, TokenConfig } from \"./config\"\nimport { makeContractCaller } from \"./util\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n connector,\n}) => {\n if (!tokens.length) return []\n\n const registry = new TypeRegistry()\n const Psp22Abi = new Abi(psp22Abi)\n\n // TODO: Use `decodeOutput` from `./util/decodeOutput`\n const contractCall = makeContractCaller({\n chainConnector: connector,\n chainId: networkId,\n registry,\n })\n\n const tokenList: Record<string, SubPsp22Token> = {}\n\n for (const tokenConfig of tokens ?? []) {\n try {\n let symbol = tokenConfig?.symbol ?? \"Unit\"\n let decimals = tokenConfig?.decimals ?? 0\n const contractAddress = tokenConfig?.contractAddress ?? undefined\n\n if (contractAddress === undefined) continue\n\n await (async () => {\n const [symbolResult, decimalsResult] = await Promise.all([\n contractCall(\n contractAddress,\n contractAddress,\n Psp22Abi.findMessage(\"PSP22Metadata::token_symbol\").toU8a([])\n ),\n contractCall(\n contractAddress,\n contractAddress,\n Psp22Abi.findMessage(\"PSP22Metadata::token_decimals\").toU8a([])\n ),\n ])\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n const symbolData = (symbolResult.toJSON()?.result as any)?.ok?.data\n symbol =\n typeof symbolData === \"string\" && symbolData.startsWith(\"0x\")\n ? u8aToString(\n registry.createType(\n \"Option<Vec<u8>>\",\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n (symbolResult.toJSON()?.result as any)?.ok?.data\n )?.value\n )?.replace(/\\p{C}/gu, \"\")\n : symbol\n\n // biome-ignore lint/suspicious/noExplicitAny: legacy\n const decimalsData = (decimalsResult.toJSON()?.result as any)?.ok?.data\n decimals =\n typeof decimalsData === \"string\" && decimalsData.startsWith(\"0x\")\n ? hexToNumber(decimalsData)\n : decimals\n })()\n\n const id = subPsp22TokenId(networkId, contractAddress)\n const token: SubPsp22Token = {\n id,\n type: \"substrate-psp22\",\n platform: \"polkadot\",\n isDefault: tokenConfig.isDefault ?? true,\n symbol,\n decimals,\n name: tokenConfig?.name || symbol,\n logo: tokenConfig?.logo,\n contractAddress,\n networkId,\n }\n\n if (tokenConfig?.coingeckoId) token.coingeckoId = tokenConfig?.coingeckoId\n if (tokenConfig?.mirrorOf) token.mirrorOf = tokenConfig?.mirrorOf\n\n tokenList[token.id] = token\n } catch (error) {\n log.error(\n `Failed to build substrate-psp22 token ${tokenConfig.contractAddress} (${tokenConfig.symbol}) on ${networkId}`,\n (error as Error)?.message ?? error\n )\n }\n }\n\n return values(tokenList).filter((t) => {\n const parsed = SubPsp22TokenSchema.safeParse(t)\n // if (!parsed.success) log.warn(`Ignoring invalid token ${MODULE_TYPE}`, t)\n\n return parsed.success\n })\n}\n","import { type AnyMiniMetadata, MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue } from \"../shared\"\nimport { MODULE_TYPE } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<typeof MODULE_TYPE>[\"getMiniMetadata\"] = ({\n networkId,\n specVersion,\n metadataRpc,\n}) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: null,\n extra: null,\n } as AnyMiniMetadata\n}\n","import { Abi } from \"@polkadot/api-contract\"\nimport { TypeRegistry } from \"@polkadot/types\"\nimport { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType, parseTokenId } from \"@talismn/chaindata-provider\"\nimport { parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary, Enum } from \"polkadot-api\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport psp22Abi from \"../abis/psp22.json\"\nimport { MODULE_TYPE } from \"./config\"\nimport { makeContractCaller } from \"./util\"\n\nexport const getTransferCallData: IBalanceModule<typeof MODULE_TYPE>[\"getTransferCallData\"] =\n async ({ from, to, value, token, metadataRpc, connector }) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const networkId = parseTokenId(token.id).networkId\n const { builder } = parseMetadataRpc(metadataRpc)\n const { codec, location } = builder.buildCall(\"Contracts\", \"call\")\n\n const Psp22Abi = new Abi(psp22Abi)\n const registry = new TypeRegistry()\n const contractCall = makeContractCaller({\n chainConnector: connector,\n chainId: networkId,\n registry,\n })\n\n // TODO use papi contract api\n const data = Psp22Abi.findMessage(\"PSP22::transfer\").toU8a([to, value, undefined])\n const hexData = registry.createType(\"Vec<u8>\", data).toHex()\n\n const dryRunResult = await contractCall(from, token.contractAddress, data)\n\n const args = codec.enc({\n dest: Enum(\"Id\", token.contractAddress),\n value: 0,\n gas_limit: {\n ref_time: dryRunResult.gasRequired.refTime.toBigInt(),\n proof_size: dryRunResult.gasRequired.proofSize.toBigInt(),\n },\n storage_deposit_limit: dryRunResult.storageDeposit.isCharge\n ? dryRunResult.storageDeposit.asCharge.toBigInt()\n : null,\n data: Binary.fromHex(hexData),\n })\n\n const callData = Binary.fromBytes(mergeUint8([new Uint8Array(location), args]))\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n }\n","import { isEqual } from \"lodash-es\"\nimport { distinctUntilChanged, Observable, of } from \"rxjs\"\n\nimport log from \"../../log\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\n\nconst SUBSCRIPTION_INTERVAL = 6_000\n\nexport const subscribeBalances: IBalanceModule<typeof MODULE_TYPE>[\"subscribeBalances\"] = ({\n networkId,\n tokensWithAddresses,\n connector,\n miniMetadata,\n}) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n return new Observable((subscriber) => {\n const abortController = new AbortController()\n\n // on hydration balances are fetched using a runtimeApi, which can't be subscribed to.\n // => poll values for each block\n const poll = async () => {\n try {\n if (abortController.signal.aborted) return\n\n const balances = await fetchBalances({\n networkId,\n tokensWithAddresses: tokensWithAddresses,\n connector,\n miniMetadata,\n })\n\n if (abortController.signal.aborted) return\n\n subscriber.next(balances)\n\n setTimeout(poll, SUBSCRIPTION_INTERVAL)\n } catch (error) {\n log.error(\"Error\", {\n module: MODULE_TYPE,\n networkId,\n miniMetadata,\n addressesByToken: tokensWithAddresses,\n error,\n })\n subscriber.error(error)\n }\n }\n\n poll()\n\n return () => {\n abortController.abort()\n }\n }).pipe(distinctUntilChanged(isEqual))\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubPsp22BalanceModule: IBalanceModule<typeof MODULE_TYPE, TokenConfig> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubPsp22TokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubPsp22TokenConfigSchema = z.strictObject({\n contractAddress: SubPsp22TokenSchema.shape.contractAddress,\n ...TokenConfigBaseSchema.shape,\n})\n\nexport type SubPsp22TokenConfig = z.infer<typeof SubPsp22TokenConfigSchema>\n","import { SubTokensTokenSchema } from \"@talismn/chaindata-provider\"\n\nexport type {\n SubTokensMiniMetadataExtra as MiniMetadataExtra,\n SubTokensModuleConfig as ModuleConfig,\n SubTokensTokenConfig as TokenConfig,\n} from \"./types\"\n\nexport const MODULE_TYPE = SubTokensTokenSchema.shape.type.value\nexport const PLATFORM = SubTokensTokenSchema.shape.platform.value\n","import { decodeScale, papiParse } from \"@talismn/scale\"\nimport { isNotNil } from \"@talismn/util\"\n\nimport log from \"../../log\"\nimport type { AmountWithLabel, IBalance, MiniMetadata } from \"../../types\"\nimport { buildNetworkStorageCoders } from \"../shared\"\nimport type { MaybeStateKey, RpcQueryPack } from \"../shared/rpcQueryPack\"\nimport type { BalanceDef } from \"../shared/types\"\nimport type { MiniMetadataExtra, MODULE_TYPE } from \"./config\"\n\nexport const buildQueries = (\n networkId: string,\n balanceDefs: BalanceDef<typeof MODULE_TYPE>[],\n miniMetadata: MiniMetadata<MiniMetadataExtra>\n): Array<RpcQueryPack<IBalance>> => {\n const networkStorageCoders = buildNetworkStorageCoders(networkId, miniMetadata, {\n storage: [miniMetadata.extra.palletId, \"Accounts\"],\n })\n\n return balanceDefs\n .map(({ token, address }): RpcQueryPack<IBalance> | null => {\n const scaleCoder = networkStorageCoders?.storage\n\n const getStateKey = (onChainId: string | number) => {\n try {\n return scaleCoder!.keys.enc(address, papiParse(onChainId)) as MaybeStateKey\n } catch {\n return null\n }\n }\n\n const stateKey = getStateKey(token.onChainId)\n\n if (!stateKey) {\n log.warn(\n `Invalid assetId / address in ${networkId} storage query ${token.onChainId} / ${address}`\n )\n return null\n }\n\n const decodeResult = (changes: MaybeStateKey[]) => {\n /** NOTE: This type is only a hint for typescript, the chain can actually return whatever it wants to */\n type DecodedType = {\n free?: bigint\n reserved?: bigint\n frozen?: bigint\n }\n\n const decoded = decodeScale<DecodedType>(\n scaleCoder,\n changes[0],\n `Failed to decode substrate-tokens balance on chain ${networkId}`\n ) ?? { free: 0n, reserved: 0n, frozen: 0n }\n\n const free = (decoded?.free ?? 0n).toString()\n const reserved = (decoded?.reserved ?? 0n).toString()\n const frozen = (decoded?.frozen ?? 0n).toString()\n\n const balanceValues: Array<AmountWithLabel<string>> = [\n { type: \"free\", label: \"free\", amount: free.toString() },\n { type: \"reserved\", label: \"reserved\", amount: reserved.toString() },\n { type: \"locked\", label: \"frozen\", amount: frozen.toString() },\n ]\n\n return {\n source: \"substrate-tokens\",\n status: \"live\",\n address,\n networkId,\n tokenId: token.id,\n values: balanceValues,\n } as IBalance\n }\n\n return {\n stateKeys: [stateKey],\n decodeResult,\n }\n })\n .filter(isNotNil)\n}\n","import log from \"../../log\"\nimport type { FetchBalanceResults, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { fetchRpcQueryPack } from \"../shared/rpcQueryPack\"\nimport { getBalanceDefs } from \"../shared/types\"\nimport { buildQueries } from \"./buildQueries\"\nimport { type MiniMetadataExtra, MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\n\nexport const fetchBalances: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"fetchBalances\"] = async ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {\n if (!tokensWithAddresses.length) return { success: [], errors: [] }\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n if (!miniMetadata?.data) {\n log.warn(`MiniMetadata is required for fetching ${MODULE_TYPE} balances on ${networkId}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(\"Minimetadata is required for fetching balances\"),\n })),\n }\n }\n if (miniMetadata.source !== MODULE_TYPE) {\n log.warn(`Ignoring miniMetadata with source ${miniMetadata.source} in ${MODULE_TYPE}.`)\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: miniMetadata source is not ${MODULE_TYPE}`),\n })),\n }\n }\n if (miniMetadata.chainId !== networkId) {\n log.warn(\n `Ignoring miniMetadata with chainId ${miniMetadata.chainId} in ${MODULE_TYPE}. Expected chainId is ${networkId}`\n )\n return {\n success: [],\n errors: balanceDefs.map((def) => ({\n tokenId: def.token.id,\n address: def.address,\n error: new Error(`Invalid request: Expected chainId is ${networkId}`),\n })),\n }\n }\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n const balances = await fetchRpcQueryPack(connector, networkId, queries)\n\n return balanceDefs.reduce<FetchBalanceResults>(\n (acc, def) => {\n const balance = balances.find(\n (b) => b?.address === def.address && b?.tokenId === def.token.id\n )\n if (balance) acc.success.push(balance)\n //if no entry consider empty balance\n else\n acc.success.push({\n address: def.address,\n networkId,\n tokenId: def.token.id,\n source: MODULE_TYPE,\n status: \"live\",\n values: [\n { type: \"free\", label: \"free\", amount: \"0\" },\n { type: \"locked\", label: \"frozen\", amount: \"0\" },\n ],\n })\n return acc\n },\n { success: [], errors: [] }\n )\n}\n","import { type SubTokensToken, subTokensTokenId } from \"@talismn/chaindata-provider\"\nimport { assign } from \"lodash-es\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, PLATFORM, type TokenConfig } from \"./config\"\n\nexport const fetchTokens: IBalanceModule<typeof MODULE_TYPE, TokenConfig>[\"fetchTokens\"] = async ({\n networkId,\n tokens,\n miniMetadata,\n}) => {\n if (!miniMetadata?.data) return []\n\n // in this module we do not fetch any token information from the chain\n // this is because there are basically as many pallet implementations as there are networks (Expect Chaos, they said)\n // we rely on the config to provide all the info we need\n return tokens.map(\n (tokenConfig): SubTokensToken =>\n assign(\n {\n id: subTokensTokenId(networkId, tokenConfig.onChainId),\n type: MODULE_TYPE,\n platform: PLATFORM,\n networkId,\n onChainId: tokenConfig.onChainId,\n symbol: tokenConfig.symbol ?? \"Unit\",\n decimals: tokenConfig.decimals ?? 0,\n name: tokenConfig.name ?? tokenConfig.symbol ?? \"Unit\",\n existentialDeposit: tokenConfig.existentialDeposit ?? \"0\",\n isDefault: true,\n },\n tokenConfig\n )\n )\n}\n","import { MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\nimport { compactMetadata, encodeMetadata, parseMetadataRpc } from \"@talismn/scale\"\n\nimport { deriveMiniMetadataId } from \"../../types\"\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getConstantValue, hasStorageItems } from \"../shared\"\nimport { type MiniMetadataExtra, MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\n\nexport const getMiniMetadata: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"getMiniMetadata\"] = ({ networkId, specVersion, metadataRpc, config }) => {\n const source = MODULE_TYPE\n const chainId = networkId\n\n const systemVersion = getConstantValue<{ spec_version: number }>(metadataRpc, \"System\", \"Version\")\n if (specVersion !== systemVersion.spec_version)\n throw new Error(\n `specVersion mismatch: expected ${specVersion}, metadata got ${systemVersion.spec_version}`\n )\n\n const id = deriveMiniMetadataId({ source, chainId, specVersion })\n\n const { unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n if (unifiedMetadata.version < 14)\n throw new Error(\n `Unsupported metadata version: ${unifiedMetadata.version}. Minimum required is 14.`\n )\n\n const extra: MiniMetadataExtra = { palletId: config?.palletId ?? \"Tokens\" }\n\n return {\n id,\n source,\n chainId,\n specVersion,\n version: MINIMETADATA_VERSION,\n data: getData(metadataRpc, extra.palletId),\n extra,\n }\n}\n\nconst getData = (metadataRpc: `0x${string}`, pallet: string): `0x${string}` | null => {\n const { metadata, unifiedMetadata } = parseMetadataRpc(metadataRpc)\n\n // ensure the network has all the required bits\n if (!hasStorageItems(unifiedMetadata, pallet, [\"Accounts\"])) return null\n\n compactMetadata(metadata, [{ pallet, items: [\"Accounts\"] }])\n\n return encodeMetadata(metadata)\n}\n","import { mergeUint8 } from \"@polkadot-api/utils\"\nimport { isTokenOfType, type SubTokensToken } from \"@talismn/chaindata-provider\"\nimport { type MetadataBuilder, papiParse, parseMetadataRpc } from \"@talismn/scale\"\nimport { Binary, Enum } from \"polkadot-api\"\n\nimport type { BalanceTransferType, IBalanceModule } from \"../../types/IBalanceModule\"\nimport { MODULE_TYPE, type ModuleConfig, type TokenConfig } from \"./config\"\n\nexport const getTransferCallData: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig\n>[\"getTransferCallData\"] = ({ from, to, value, token, type, metadataRpc, config }) => {\n if (!isTokenOfType(token, MODULE_TYPE))\n throw new Error(`Token type ${token.type} is not ${MODULE_TYPE}.`)\n\n const { builder } = parseMetadataRpc(metadataRpc)\n\n // each chain has its own way of encoding the transfer call data\n // let's try our luck until one works!\n const options = getCallDataOptions(to, token, value, type, config)\n const callData = getCallDataFromOptions(builder, options)\n\n return {\n address: from,\n method: callData.asHex() as `0x${string}`,\n }\n}\n\nconst getTransferMethod = (type: BalanceTransferType) => {\n switch (type) {\n case \"keep-alive\":\n return \"transfer_keep_alive\"\n case \"all\":\n return \"transfer_all\"\n case \"allow-death\":\n return \"transfer\"\n }\n}\n\ntype CallDataOption = {\n pallet: string\n method: string\n getArgs: () => unknown\n}\n\nconst getCallDataFromOptions = (builder: MetadataBuilder, options: CallDataOption[]): Binary => {\n for (const { pallet, method, getArgs } of options) {\n try {\n return buildCallData(builder, pallet, method, getArgs())\n } catch {\n // wrong inputs, ignore and try the next one\n }\n }\n throw new Error(\"Failed to encode call data\")\n}\n\nconst buildCallData = (builder: MetadataBuilder, pallet: string, method: string, args: unknown) => {\n const { location, codec } = builder.buildCall(pallet, method)\n return Binary.fromBytes(mergeUint8([new Uint8Array(location), codec.enc(args)]))\n}\n\nconst getCallDataOptions = (\n to: string,\n token: SubTokensToken,\n value: string,\n type: BalanceTransferType,\n config: ModuleConfig | undefined\n): CallDataOption[] => {\n const onChainId = papiParse(token.onChainId)\n const method = getTransferMethod(type)\n\n return [\n {\n pallet: \"Currencies\",\n method: \"transfer\",\n getArgs: () => ({\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n amount: BigInt(value),\n }),\n },\n {\n pallet: \"Currencies\",\n method: \"transfer\",\n getArgs: () => ({\n dest: to,\n currency_id: onChainId,\n amount: BigInt(value),\n }),\n },\n {\n pallet: \"Tokens\",\n method,\n getArgs: () =>\n method === \"transfer_all\"\n ? {\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n keepAlive: false,\n }\n : {\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n amount: BigInt(value),\n },\n },\n {\n pallet: \"Tokens\",\n method,\n getArgs: () =>\n method === \"transfer_all\"\n ? {\n dest: to,\n currency_id: onChainId,\n keepAlive: false,\n }\n : {\n dest: to,\n currency_id: onChainId,\n amount: BigInt(value),\n },\n },\n ].concat(\n ...(config?.palletId\n ? [\n {\n pallet: config.palletId,\n method,\n getArgs: () =>\n method === \"transfer_all\"\n ? {\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n keepAlive: false,\n }\n : {\n dest: Enum(\"Id\", to),\n currency_id: onChainId,\n amount: BigInt(value),\n },\n },\n {\n pallet: config.palletId,\n method,\n getArgs: () =>\n method === \"transfer_all\"\n ? {\n dest: to,\n currency_id: onChainId,\n keepAlive: false,\n }\n : {\n dest: to,\n currency_id: onChainId,\n amount: BigInt(value),\n },\n },\n ]\n : [])\n )\n}\n","import { map, of } from \"rxjs\"\n\nimport type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport { getBalanceDefs } from \"../shared\"\nimport { getRpcQueryPack$ } from \"../shared/rpcQueryPack\"\nimport { buildQueries } from \"./buildQueries\"\nimport type { MiniMetadataExtra, MODULE_TYPE, ModuleConfig, TokenConfig } from \"./config\"\n\nexport const subscribeBalances: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n>[\"subscribeBalances\"] = ({ networkId, tokensWithAddresses, connector, miniMetadata }) => {\n if (!tokensWithAddresses.length) return of({ success: [], errors: [] })\n\n const balanceDefs = getBalanceDefs<typeof MODULE_TYPE>(tokensWithAddresses)\n\n const queries = buildQueries(networkId, balanceDefs, miniMetadata)\n\n return getRpcQueryPack$(connector, networkId, queries).pipe(\n map((balances) => ({\n success: balances,\n errors: [],\n }))\n )\n}\n","import type { IBalanceModule } from \"../../types/IBalanceModule\"\nimport {\n type MiniMetadataExtra,\n MODULE_TYPE,\n type ModuleConfig,\n PLATFORM,\n type TokenConfig,\n} from \"./config\"\nimport { fetchBalances } from \"./fetchBalances\"\nimport { fetchTokens } from \"./fetchTokens\"\nimport { getMiniMetadata } from \"./getMiniMetadata\"\nimport { getTransferCallData } from \"./getTransferCallData\"\nimport { subscribeBalances } from \"./subscribeBalances\"\n\nexport const SubTokensBalanceModule: IBalanceModule<\n typeof MODULE_TYPE,\n TokenConfig,\n ModuleConfig,\n MiniMetadataExtra\n> = {\n type: MODULE_TYPE,\n platform: PLATFORM,\n getMiniMetadata,\n fetchTokens,\n fetchBalances,\n subscribeBalances,\n getTransferCallData,\n}\n","import { SubTokensTokenSchema } from \"@talismn/chaindata-provider\"\nimport z from \"zod/v4\"\n\nimport { TokenConfigBaseSchema } from \"../../types/tokens\"\n\n// to be used by chaindata too\nexport const SubTokensTokenConfigSchema = z.strictObject({\n onChainId: SubTokensTokenSchema.shape.onChainId,\n ...TokenConfigBaseSchema.shape,\n\n // force these 3 fields because in this module we wont pull anything from chain\n symbol: z.string().nonempty(),\n decimals: z.number(),\n existentialDeposit: z.string().nonempty(),\n})\n\n// Do not use this type outside of this module\nexport type SubTokensTokenConfig = z.infer<typeof SubTokensTokenConfigSchema>\n\nexport const SubTokensModuleConfigSchema = z.strictObject({\n palletId: z.string().optional(),\n})\n\n// Do not use this type outside of this module\nexport type SubTokensModuleConfig = z.infer<typeof SubTokensModuleConfigSchema>\n\nexport const SubTokensMiniMetadataExtraSchema = z.strictObject({\n palletId: z.string(),\n})\n\nexport type SubTokensMiniMetadataExtra = z.infer<typeof SubTokensMiniMetadataExtraSchema>\n","import { EvmErc20BalanceModule } from \"./evm-erc20\"\nimport { EvmNativeBalanceModule } from \"./evm-native\"\nimport { EvmUniswapV2BalanceModule } from \"./evm-uniswapv2\"\nimport { SolNativeBalanceModule } from \"./sol-native\"\nimport { SolSplBalanceModule } from \"./sol-spl\"\nimport { SubAssetsBalanceModule } from \"./substrate-assets\"\nimport { SubDTaoBalanceModule } from \"./substrate-dtao\"\nimport { SubForeignAssetsBalanceModule } from \"./substrate-foreignassets\"\nimport { SubHydrationBalanceModule } from \"./substrate-hydration\"\nimport { SubNativeBalanceModule } from \"./substrate-native\"\nimport { SubPsp22BalanceModule } from \"./substrate-psp22\"\nimport { SubTokensBalanceModule } from \"./substrate-tokens\"\n\nexport const BALANCE_MODULES = [\n SubNativeBalanceModule,\n SubAssetsBalanceModule,\n SubDTaoBalanceModule,\n SubHydrationBalanceModule,\n SubForeignAssetsBalanceModule,\n SubPsp22BalanceModule,\n SubTokensBalanceModule,\n EvmErc20BalanceModule,\n EvmUniswapV2BalanceModule,\n EvmNativeBalanceModule,\n SolNativeBalanceModule,\n SolSplBalanceModule,\n]\n\nexport type AnyBalanceModule = (typeof BALANCE_MODULES)[number] // TODO yeet ? should use IBalance\n\nexport * from \"../types/IBalanceModule\"\nexport * from \"./abis\"\nexport * from \"./evm-erc20\"\nexport * from \"./evm-native\"\nexport * from \"./evm-uniswapv2\"\nexport * from \"./sol-native\"\nexport * from \"./sol-spl\"\nexport * from \"./substrate-assets\"\nexport * from \"./substrate-dtao\"\nexport * from \"./substrate-foreignassets\"\nexport * from \"./substrate-hydration\"\nexport * from \"./substrate-native\"\nexport * from \"./substrate-psp22\"\nexport * from \"./substrate-tokens\"\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport type { DotNetworkId } from \"@talismn/chaindata-provider\"\nimport { fetchBestMetadata } from \"@talismn/sapi\"\nimport { isAbortError } from \"@talismn/util\"\n\n// share requests as all modules will call this at once\nconst CACHE = new Map<string, Promise<`0x${string}`>>()\n\nexport const getMetadataRpc = async (\n chainConnector: IChainConnectorDot,\n networkId: DotNetworkId\n) => {\n if (CACHE.has(networkId)) return CACHE.get(networkId)!\n\n const pResult = fetchBestMetadata(\n (method, params, isCacheable) =>\n chainConnector.send(networkId, method, params, isCacheable, { expectErrors: true }),\n // do not allow fallback to v14 unless unavailable.\n // substrate-native and substrate-hydration need v15 metadata for runtime api calls\n false\n )\n\n CACHE.set(networkId, pResult)\n\n try {\n return await pResult\n } catch (cause) {\n if (isAbortError(cause)) throw cause\n throw new Error(`Failed to fetch metadataRpc for network ${networkId}`, { cause })\n } finally {\n CACHE.delete(networkId)\n }\n}\n","import type { IChainConnectorDot } from \"@talismn/chain-connectors\"\nimport type { DotNetworkId } from \"@talismn/chaindata-provider\"\n\n// cache the promise so it can be shared across multiple calls\nconst CACHE_GET_SPEC_VERSION = new Map<string, Promise<number>>()\n\nconst fetchSpecVersion = async (chainConnector: IChainConnectorDot, networkId: DotNetworkId) => {\n const { specVersion } = await chainConnector.send<{ specVersion: number }>(\n networkId,\n \"state_getRuntimeVersion\",\n [],\n true\n )\n return specVersion\n}\n\n/**\n * fetches the spec version of a network. current request is cached in case of multiple calls (all balance modules will kick in at once)\n */\nexport const getSpecVersion = async (\n chainConnector: IChainConnectorDot,\n networkId: DotNetworkId\n) => {\n if (CACHE_GET_SPEC_VERSION.has(networkId)) return CACHE_GET_SPEC_VERSION.get(networkId)!\n\n const pResult = fetchSpecVersion(chainConnector, networkId)\n\n CACHE_GET_SPEC_VERSION.set(networkId, pResult)\n\n try {\n return await pResult\n } catch (cause) {\n throw new Error(`Failed to fetch specVersion for network ${networkId}`, { cause })\n } finally {\n CACHE_GET_SPEC_VERSION.delete(networkId)\n }\n}\n","// used as the version field of mini metadata objects\n// increase this each time the minimetadata content (data or extra) changes, to invalidate old versions\nexport { MINIMETADATA_VERSION } from \"@talismn/chaindata-provider\"\n"],"mappings":"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","names":["import_chaindata_provider","import_crypto","import_util","import_lodash_es","import_rxjs","import_viem","anylogger","import_chaindata_provider","import_viem","import_viem","import_chaindata_provider","import_viem","z","import_chaindata_provider","import_crypto","import_viem","from","import_lodash_es","import_chaindata_provider","import_v4","import_chaindata_provider","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_crypto","fetchBalances","MODULE_TYPE","import_chaindata_provider","import_lodash_es","fetchTokens","MODULE_TYPE","PLATFORM","getMiniMetadata","import_chaindata_provider","import_crypto","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_crypto","import_lodash_es","import_viem","fetchBalances","MODULE_TYPE","BigNumber","import_chaindata_provider","import_lodash_es","import_v4","import_viem","getErc20ContractData","getTypedContract","TokenCacheSchema","z","fetchTokens","getErc20ContractData","MODULE_TYPE","PLATFORM","getMiniMetadata","import_chaindata_provider","import_crypto","import_viem","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_crypto","fetchBalances","MODULE_TYPE","publicKey","import_chaindata_provider","import_lodash_es","fetchTokens","MODULE_TYPE","PLATFORM","getMiniMetadata","import_web3","import_chaindata_provider","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_web3","import_chaindata_provider","import_util","import_lodash_es","module","import_scale","import_lodash_es","import_rxjs","import_scale","api","import_chaindata_provider","import_lodash_es","import_rxjs","fetchBalances","MODULE_TYPE","import_web3","import_chaindata_provider","import_lodash_es","import_v4","TokenCacheSchema","z","fetchTokens","MODULE_TYPE","PLATFORM","getMiniMetadata","import_spl_token","import_web3","import_chaindata_provider","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_scale","import_util","fetchBalances","MODULE_TYPE","import_chaindata_provider","import_scale","import_lodash_es","fetchTokens","MODULE_TYPE","import_chaindata_provider","import_scale","import_chaindata_provider","import_token_rates","import_util","import_bignumber","import_chaindata_provider","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_scale","import_util","import_lodash_es","import_chaindata_provider","fetchBalances","MODULE_TYPE","balance","values","import_chaindata_provider","import_scale","import_util","import_lodash_es","fetchTokens","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","import_utils","import_chaindata_provider","import_scale","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","extra","query","filter","BigNumber","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","getData","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","import_rxjs","subscribeBalances","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_scale","import_util","buildQueries","fetchBalances","MODULE_TYPE","buildQueries","import_chaindata_provider","import_scale","import_lodash_es","fetchTokens","MODULE_TYPE","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","getData","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","getTransferMethod","getEncodedArgs","getTransferEncodedArgs","getTransferAllEncodedArgs","getEncodedValue","import_rxjs","subscribeBalances","buildQueries","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_lodash_es","fetchBalances","MODULE_TYPE","addresses","import_chaindata_provider","import_scale","import_lodash_es","fetchTokens","MODULE_TYPE","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","getData","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_scale","import_util","upperFirst","value","import_scale","import_utils","import_polkadot_api","amount","fetchBalances","MODULE_TYPE","import_chaindata_provider","import_lodash_es","import_v4","fetchTokens","z","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","getTransferMethod","getEncodedArgs","getTransferEncodedArgs","getTransferAllEncodedArgs","getEncodedValue","import_rxjs","subscribeBalances","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_types","import_util","fetchBalances","import_api_contract","import_types","import_util","import_chaindata_provider","import_lodash_es","fetchTokens","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","import_api_contract","import_types","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","import_lodash_es","import_rxjs","SUBSCRIPTION_INTERVAL","subscribeBalances","fetchBalances","MODULE_TYPE","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_chaindata_provider","MODULE_TYPE","PLATFORM","import_scale","import_util","buildQueries","fetchBalances","MODULE_TYPE","buildQueries","import_chaindata_provider","import_lodash_es","fetchTokens","MODULE_TYPE","PLATFORM","import_chaindata_provider","import_scale","getMiniMetadata","MODULE_TYPE","getData","import_utils","import_chaindata_provider","import_scale","import_polkadot_api","getTransferCallData","from","MODULE_TYPE","getTransferMethod","import_rxjs","subscribeBalances","buildQueries","MODULE_TYPE","PLATFORM","getMiniMetadata","fetchTokens","fetchBalances","subscribeBalances","getTransferCallData","import_chaindata_provider","import_v4","z","import_util","CACHE","PQueue","addressesByTokenId","import_chaindata_provider"]}