@talismn/chaindata-provider 2.0.0 → 2.0.1

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,"file":"index.js","names":["z","z","z","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","z","LZString","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","LZString","z","z","z","z","z","z","z","Dexie","packageJson.name","z","isNotNil","Observable","Observable","log","initChaindata","#storage$","#dynamicTokens$","#chaindata$","#dynamicTokensWriteQueue","#enqueueDynamicTokensWrite","z"],"sources":["../src/chaindata/shared/EthereumAddress.ts","../src/chaindata/shared/HexString.ts","../src/chaindata/shared/SolanaAddress.ts","../src/chaindata/tokens/TokenBase.ts","../src/chaindata/tokens/utils.ts","../src/chaindata/tokens/EvmErc20Token.ts","../src/chaindata/tokens/EvmNativeToken.ts","../src/chaindata/tokens/EvmUniswapV2Token.ts","../src/chaindata/tokens/SolNativeToken.ts","../src/chaindata/tokens/SolSplToken.ts","../src/chaindata/tokens/SolToken2022Token.ts","../src/chaindata/tokens/SubstrateAssetsToken.ts","../src/chaindata/tokens/SubstrateDTaoToken.ts","../src/chaindata/tokens/SubstrateForeignAssetsToken.ts","../src/chaindata/tokens/SubstrateHydrationToken.ts","../src/chaindata/tokens/SubstrateNativeToken.ts","../src/chaindata/tokens/SubstratePsp22Token.ts","../src/chaindata/tokens/SubstrateTokensToken.ts","../src/chaindata/tokens/Token.ts","../src/chaindata/networks/NetworkBase.ts","../src/chaindata/networks/DotNetwork.ts","../src/chaindata/networks/EthNetwork.ts","../src/chaindata/networks/SolNetwork.ts","../src/chaindata/networks/Network.ts","../src/chaindata/miniMetadata.ts","../src/chaindata/utils.ts","../src/constants.ts","../src/getBlockExplorerUrls.ts","../src/upgrades/2024-01-25-upgradeAddIsDefaultToExistingChains.ts","../src/upgrades/2024-01-25-upgradeRemoveSymbolFromNativeTokenId.ts","../src/legacy/TalismanChaindataDatabase.ts","../package.json","../src/log.ts","../src/state/chunkedValidation.ts","../src/state/combinedChaindata.ts","../src/state/validatedCache.ts","../src/state/net.ts","../src/state/githubChaindata.ts","../src/state/initChaindata.json","../src/state/defaultChaindata.ts","../src/state/oldDb.ts","../src/provider/ChaindataProvider.ts","../src/state/schema.ts","../src/util.ts"],"sourcesContent":["import z from \"zod/v4\"\n\nexport const EthereumAddressSchema = z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/, { message: \"Invalid Ethereum address\" })\n .transform((val) => val as `0x${string}`)\n\nexport type EthereumAddress = z.infer<typeof EthereumAddressSchema>\n","import z from \"zod/v4\"\n\nexport const HexStringSchema = z\n .string()\n .regex(/^0x[a-fA-F0-9]+$/, { message: \"Invalid HexString\" })\n .transform((val) => val as `0x${string}`)\n\nexport type HexString = z.infer<typeof HexStringSchema>\n","import z from \"zod/v4\"\n\n// Solana addresses are base58-encoded 32-byte public keys\nconst SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/\n\nexport const SolanaAddressSchema = z\n .string()\n .regex(SOLANA_ADDRESS_REGEX, { message: \"Invalid Solana address\" })\n\nexport type SolanaAddress = z.infer<typeof SolanaAddressSchema>\n","import z from \"zod/v4\"\n\nexport const TokenBaseSchema = z.strictObject({\n id: z.string(),\n networkId: z.string(),\n isDefault: z.boolean().optional(),\n decimals: z.int().min(0),\n symbol: z.string().nonempty(),\n name: z.string().optional(),\n logo: z.string().optional(),\n coingeckoId: z.string().optional(),\n noDiscovery: z.boolean().optional(),\n mirrorOf: z.string().optional(),\n})\nexport type TokenBase = z.infer<typeof TokenBaseSchema>\n","export const generateTokenId = (...parts: string[]) => parts.join(\":\")\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport { EthereumAddressSchema } from \"../shared\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"evm-erc20\"\n\nexport const EvmErc20TokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"ethereum\"),\n contractAddress: EthereumAddressSchema,\n})\nexport type EvmErc20Token = z.infer<typeof EvmErc20TokenSchema>\n\nexport const EvmErc20BalancesConfigSchema = z.strictObject({})\n\nexport type EvmErc20BalancesConfig = z.infer<typeof EvmErc20BalancesConfigSchema>\n\nexport type EvmErc20TokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n contractAddress: `0x${string}`\n}\n\nexport const evmErc20TokenId = (networkId: string, contractAddress: `0x${string}`) =>\n generateTokenId(networkId, TOKEN_TYPE, contractAddress.toLowerCase())\n\nexport const parseEvmErc20TokenId = (tokenId: TokenId): EvmErc20TokenIdSpecs => {\n const [networkId, type, contractAddress] = tokenId.split(\":\")\n if (!networkId || !contractAddress) throw new Error(`Invalid EvmErc20Token ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid EvmErc20Token type: ${type}`)\n\n return {\n type,\n networkId,\n contractAddress: EthereumAddressSchema.parse(contractAddress),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"evm-native\"\n\nexport const EvmNativeTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"ethereum\"),\n})\nexport type EvmNativeToken = z.infer<typeof EvmNativeTokenSchema>\n\nexport const EvmNativeBalancesConfigSchema = z.strictObject({})\n\nexport type EvmNativeBalancesConfig = z.infer<typeof EvmNativeBalancesConfigSchema>\n\nexport type EvmNativeTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n}\n\nexport const evmNativeTokenId = (networkId: NetworkId) => generateTokenId(networkId, TOKEN_TYPE)\n\nexport const parseEvmNativeTokenId = (tokenId: TokenId): EvmNativeTokenIdSpecs => {\n const [networkId, type] = tokenId.split(\":\")\n if (!networkId || type !== TOKEN_TYPE) throw new Error(`Invalid EvmNativeToken ID: ${tokenId}`)\n\n return { type, networkId }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport { EthereumAddressSchema } from \"../shared\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"evm-uniswapv2\"\n\nexport const EvmUniswapV2TokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"ethereum\"),\n contractAddress: EthereumAddressSchema,\n isCustom: z.boolean().optional(),\n symbol0: z.string().nonempty(),\n symbol1: z.string().nonempty(),\n decimals0: z.int().min(0),\n decimals1: z.int().min(0),\n tokenAddress0: EthereumAddressSchema,\n tokenAddress1: EthereumAddressSchema,\n coingeckoId0: z.string().optional(),\n coingeckoId1: z.string().optional(),\n})\nexport type EvmUniswapV2Token = z.infer<typeof EvmUniswapV2TokenSchema>\n\nexport const EvmUniswapV2BalancesConfigSchema = z.strictObject({})\n\nexport type EvmUniswapV2BalancesConfig = z.infer<typeof EvmUniswapV2BalancesConfigSchema>\n\nexport type EvmUniswapV2TokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n contractAddress: `0x${string}`\n}\n\nexport const evmUniswapV2TokenId = (\n networkId: NetworkId,\n contractAddress: EvmUniswapV2Token[\"contractAddress\"]\n) => generateTokenId(networkId, TOKEN_TYPE, contractAddress.toLowerCase())\n\nexport const parseEvmUniswapV2TokenId = (tokenId: TokenId): EvmUniswapV2TokenIdSpecs => {\n const [networkId, type, contractAddress] = tokenId.split(\":\")\n if (!networkId || !contractAddress) throw new Error(`Invalid EvmUniswapV2Token ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid EvmUniswapV2Token type: ${type}`)\n\n return {\n type,\n networkId,\n contractAddress: EthereumAddressSchema.parse(contractAddress),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { SolNetworkId } from \"../networks/SolNetwork\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"sol-native\"\n\nexport const SolNativeTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"solana\"),\n})\nexport type SolNativeToken = z.infer<typeof SolNativeTokenSchema>\n\nexport const SolNativeBalancesConfigSchema = z.strictObject({})\n\nexport type SolNativeBalancesConfig = z.infer<typeof SolNativeBalancesConfigSchema>\n\nexport type SolNativeTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: SolNetworkId\n}\n\nexport const solNativeTokenId = (networkId: SolNetworkId) => generateTokenId(networkId, TOKEN_TYPE)\n\nexport const parseSolNativeTokenId = (tokenId: TokenId): SolNativeTokenIdSpecs => {\n const [networkId, type] = tokenId.split(\":\")\n if (!networkId || type !== TOKEN_TYPE) throw new Error(`Invalid SolNativeToken ID: ${tokenId}`)\n\n return { type, networkId }\n}\n","import z from \"zod/v4\"\n\nimport type { SolNetworkId } from \"../networks\"\nimport { SolanaAddressSchema } from \"../shared\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"sol-spl\"\n\nexport const SolSplTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"solana\"),\n mintAddress: SolanaAddressSchema,\n})\nexport type SolSplToken = z.infer<typeof SolSplTokenSchema>\n\nexport const SolSplBalancesConfigSchema = z.strictObject({})\n\nexport type SolSplBalancesConfig = z.infer<typeof SolSplBalancesConfigSchema>\n\nexport type SolSplTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: SolNetworkId\n mintAddress: string\n}\n\nexport const solSplTokenId = (networkId: string, mintAddress: string) =>\n generateTokenId(networkId, TOKEN_TYPE, mintAddress)\n\nexport const parseSolSplTokenId = (tokenId: TokenId): SolSplTokenIdSpecs => {\n const [networkId, type, mintAddress] = tokenId.split(\":\")\n if (!networkId || !mintAddress) throw new Error(`Invalid SolSplToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SolSplToken type: ${type}`)\n\n return {\n type,\n networkId,\n mintAddress: SolanaAddressSchema.parse(mintAddress),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { SolNetworkId } from \"../networks\"\nimport { SolanaAddressSchema } from \"../shared\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"sol-token2022\"\n\nexport const SolToken2022TokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"solana\"),\n mintAddress: SolanaAddressSchema,\n isTransferable: z.boolean().optional(),\n})\nexport type SolToken2022Token = z.infer<typeof SolToken2022TokenSchema>\n\nexport const SolToken2022BalancesConfigSchema = z.strictObject({})\n\nexport type SolToken2022BalancesConfig = z.infer<typeof SolToken2022BalancesConfigSchema>\n\nexport type SolToken2022TokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: SolNetworkId\n mintAddress: string\n}\n\nexport const solToken2022TokenId = (networkId: string, mintAddress: string) =>\n generateTokenId(networkId, TOKEN_TYPE, mintAddress)\n\nexport const parseSolToken2022TokenId = (tokenId: TokenId): SolToken2022TokenIdSpecs => {\n const [networkId, type, mintAddress] = tokenId.split(\":\")\n if (!networkId || !mintAddress) throw new Error(`Invalid SolToken2022Token ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SolToken2022Token type: ${type}`)\n\n return {\n type,\n networkId,\n mintAddress: SolanaAddressSchema.parse(mintAddress),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-assets\"\n\nexport const SubAssetsTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n // number when used with papi - uint32 in theory (on asset hubs) but astar implemented it to u128 which makes it incompatible with number type\n assetId: z.union([z.uint32(), z.string()]).transform(String),\n isFrozen: z.boolean().optional(),\n isSufficient: z.boolean(),\n existentialDeposit: z.string(),\n})\nexport type SubAssetsToken = z.infer<typeof SubAssetsTokenSchema>\n\nexport const SubAssetsBalancesConfigSchema = z.strictObject({})\n\nexport type SubAssetsBalancesConfig = z.infer<typeof SubAssetsBalancesConfigSchema>\n\nexport type SubAssetTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n assetId: string\n}\n\nexport const subAssetTokenId = (networkId: NetworkId, assetId: string) =>\n generateTokenId(networkId, TOKEN_TYPE, assetId)\n\nexport const parseSubAssetTokenId = (tokenId: TokenId): SubAssetTokenIdSpecs => {\n const [networkId, type, assetId] = tokenId.split(\":\")\n if (!networkId || !assetId) throw new Error(`Invalid SubAssetsToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubAssetsToken type: ${type}`)\n\n return {\n type,\n networkId,\n assetId: SubAssetsTokenSchema.shape.assetId.parse(assetId),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-dtao\"\n\nexport const SubDTaoTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n netuid: z.number().int(),\n subnetName: z.string().optional(),\n\n // hotkey is set only for dynamic tokens (provisionned at runtime)\n hotkey: z.string().optional(),\n isTransferable: z.boolean().default(true),\n})\nexport type SubDTaoToken = z.infer<typeof SubDTaoTokenSchema>\n\nexport const SubDTaoBalancesConfigSchema = z.strictObject({})\n\nexport type SubDTaoBalancesConfig = z.infer<typeof SubDTaoBalancesConfigSchema>\n\nexport type SubDTaoTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n netuid: number\n hotkey?: string\n}\n\nexport const subDTaoTokenId = (networkId: NetworkId, subnetId: number, hotkey?: string) =>\n hotkey\n ? generateTokenId(networkId, TOKEN_TYPE, String(subnetId), hotkey)\n : generateTokenId(networkId, TOKEN_TYPE, String(subnetId))\n\nexport const parseSubDTaoTokenId = (tokenId: TokenId): SubDTaoTokenIdSpecs => {\n const [networkId, type, netuid, hotkey] = tokenId.split(\":\")\n if (!networkId || !netuid) throw new Error(`Invalid SubDTaoToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubDTaoToken type: ${type}`)\n\n return {\n type,\n networkId,\n netuid: SubDTaoTokenSchema.shape.netuid.parse(Number(netuid)),\n hotkey,\n }\n}\n","import LZString from \"lz-string\"\nimport z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nexport const TOKEN_TYPE = \"substrate-foreignassets\"\n\nexport const SubForeignAssetsTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n onChainId: z.string(),\n isFrozen: z.boolean().optional(),\n isSufficient: z.boolean(),\n existentialDeposit: z.string(),\n})\nexport type SubForeignAssetsToken = z.infer<typeof SubForeignAssetsTokenSchema>\n\nexport const SubForeignAssetsBalancesConfigSchema = z.strictObject({})\n\nexport type SubForeignAssetsBalancesConfig = z.infer<typeof SubForeignAssetsBalancesConfigSchema>\n\nexport type ForeignAssetsTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n onChainId: string\n}\n\nexport const subForeignAssetTokenId = (networkId: NetworkId, onChainId: string) =>\n generateTokenId(networkId, TOKEN_TYPE, LZString.compressToEncodedURIComponent(onChainId))\n\nexport const parseSubForeignAssetTokenId = (tokenId: TokenId): ForeignAssetsTokenIdSpecs => {\n const [networkId, type, onChainId] = tokenId.split(\":\")\n if (!networkId || !onChainId) throw new Error(`Invalid SubForeignAssetsToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubForeignAssetsToken type: ${type}`)\n\n return {\n type,\n networkId,\n onChainId: LZString.decompressFromEncodedURIComponent(onChainId) || \"\",\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-hydration\"\n\nexport const SubHydrationTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n onChainId: z.uint32(),\n assetType: z.enum([\"Token\", \"Erc20\", \"External\"]),\n isSufficient: z.boolean(),\n existentialDeposit: z.string(),\n})\nexport type SubHydrationToken = z.infer<typeof SubHydrationTokenSchema>\n\nexport const SubHydrationBalancesConfigSchema = z.strictObject({})\n\nexport type SubHydrationBalancesConfig = z.infer<typeof SubHydrationBalancesConfigSchema>\n\nexport type SubHydrationTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n onChainId: number\n}\n\nexport const subHydrationTokenId = (networkId: NetworkId, onChainId: number) =>\n generateTokenId(networkId, TOKEN_TYPE, String(onChainId))\n\nexport const parseSubHydrationTokenId = (tokenId: string): SubHydrationTokenIdSpecs => {\n const [networkId, type, onChainId] = tokenId.split(\":\")\n if (!networkId || !onChainId) throw new Error(`Invalid ${TOKEN_TYPE} ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid ${TOKEN_TYPE} type: ${type}`)\n\n return {\n type,\n networkId,\n onChainId: Number(onChainId),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-native\"\n\nexport const SubNativeTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n existentialDeposit: z.string(),\n})\nexport type SubNativeToken = z.infer<typeof SubNativeTokenSchema>\n\nexport const SubNativeBalancesConfigSchema = z.object({\n disable: z.boolean().optional(),\n})\n\nexport type SubNativeBalancesConfig = z.infer<typeof SubNativeBalancesConfigSchema>\n\nexport type SubNativeTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n}\n\nexport const subNativeTokenId = (networkId: NetworkId) => generateTokenId(networkId, TOKEN_TYPE)\n\nexport const parseSubNativeTokenId = (tokenId: TokenId): SubNativeTokenIdSpecs => {\n const [networkId, type] = tokenId.split(\":\")\n if (!networkId || type !== TOKEN_TYPE) throw new Error(`Invalid SubNativeToken ID: ${tokenId}`)\n\n return { type, networkId }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-psp22\"\n\nexport const SubPsp22TokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n contractAddress: z.string().nonempty(),\n})\nexport type SubPsp22Token = z.infer<typeof SubPsp22TokenSchema>\n\nexport const SubPsp22BalancesConfigSchema = z.strictObject({})\n\nexport type SubPsp22BalancesConfig = z.infer<typeof SubPsp22BalancesConfigSchema>\n\nexport type SubPsp22TokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n contractAddress: string\n}\n\nexport const subPsp22TokenId = (networkId: NetworkId, contractAddress: string) =>\n generateTokenId(networkId, TOKEN_TYPE, contractAddress.toLowerCase())\n\nexport const parseSubPsp22TokenId = (tokenId: TokenId): SubPsp22TokenIdSpecs => {\n const [networkId, type, contractAddress] = tokenId.split(\":\")\n if (!networkId || !contractAddress) throw new Error(`Invalid SubPsp22Token ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubPsp22Token type: ${type}`)\n\n return {\n type,\n networkId,\n contractAddress,\n }\n}\n","import LZString from \"lz-string\"\nimport z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-tokens\"\n\nexport const SubTokensTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n onChainId: z.union([z.string(), z.number()]),\n existentialDeposit: z.string(),\n})\nexport type SubTokensToken = z.infer<typeof SubTokensTokenSchema>\n\nexport const SubTokensBalancesConfigSchema = z.object({\n palletId: z.string().optional(),\n})\n\nexport type SubTokensBalancesConfig = z.infer<typeof SubTokensBalancesConfigSchema>\n\nexport type SubTokensTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n onChainId: string\n}\n\nexport const subTokensTokenId = (networkId: NetworkId, onChainId: string | number) =>\n generateTokenId(networkId, TOKEN_TYPE, LZString.compressToEncodedURIComponent(String(onChainId)))\n\nexport const parseSubTokensTokenId = (tokenId: string): SubTokensTokenIdSpecs => {\n const [networkId, type, onChainId] = tokenId.split(\":\")\n if (!networkId || !onChainId) throw new Error(`Invalid SubTokensToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubTokensToken type: ${type}`)\n\n return {\n type,\n networkId,\n onChainId: LZString.decompressFromEncodedURIComponent(onChainId) || \"\",\n }\n}\n","import z from \"zod/v4\"\n\nimport { type EvmErc20TokenIdSpecs, EvmErc20TokenSchema } from \"./EvmErc20Token\"\nimport { type EvmNativeTokenIdSpecs, EvmNativeTokenSchema } from \"./EvmNativeToken\"\nimport { type EvmUniswapV2TokenIdSpecs, EvmUniswapV2TokenSchema } from \"./EvmUniswapV2Token\"\nimport { type SolNativeToken, SolNativeTokenSchema } from \"./SolNativeToken\"\nimport { type SolSplToken, SolSplTokenSchema } from \"./SolSplToken\"\nimport { type SolToken2022Token, SolToken2022TokenSchema } from \"./SolToken2022Token\"\nimport { SubAssetsTokenSchema, type SubAssetTokenIdSpecs } from \"./SubstrateAssetsToken\"\nimport { type SubDTaoTokenIdSpecs, SubDTaoTokenSchema } from \"./SubstrateDTaoToken\"\nimport {\n type ForeignAssetsTokenIdSpecs,\n SubForeignAssetsTokenSchema,\n} from \"./SubstrateForeignAssetsToken\"\nimport { type SubHydrationToken, SubHydrationTokenSchema } from \"./SubstrateHydrationToken\"\nimport { type SubNativeTokenIdSpecs, SubNativeTokenSchema } from \"./SubstrateNativeToken\"\nimport { type SubPsp22TokenIdSpecs, SubPsp22TokenSchema } from \"./SubstratePsp22Token\"\nimport { type SubTokensTokenIdSpecs, SubTokensTokenSchema } from \"./SubstrateTokensToken\"\n\n/**\n * The `Token` sum type, which is a union of all of the possible `TokenTypes`.\n */\nexport const TokenSchemaBase = z.discriminatedUnion(\"type\", [\n EvmErc20TokenSchema,\n EvmNativeTokenSchema,\n EvmUniswapV2TokenSchema,\n SubAssetsTokenSchema,\n SubDTaoTokenSchema,\n SubForeignAssetsTokenSchema,\n SubNativeTokenSchema,\n SubPsp22TokenSchema,\n SubTokensTokenSchema,\n SubHydrationTokenSchema,\n SolNativeTokenSchema,\n SolSplTokenSchema,\n SolToken2022TokenSchema,\n])\n\nexport const TokenTypeSchema = z.enum(TokenSchemaBase.options.map((t) => t.shape.type.value))\n\nexport type Token = z.infer<typeof TokenSchemaBase>\n\nexport type TokenId = Token[\"id\"]\n\nexport type TokenList = Record<TokenId, Token>\n\nexport type TokenType = z.infer<typeof TokenTypeSchema>\n\nexport type TokenIdSpecs<T extends TokenType> = T extends \"evm-erc20\"\n ? EvmErc20TokenIdSpecs\n : T extends \"evm-native\"\n ? EvmNativeTokenIdSpecs\n : T extends \"evm-uniswapv2\"\n ? EvmUniswapV2TokenIdSpecs\n : T extends \"substrate-assets\"\n ? SubAssetTokenIdSpecs\n : T extends \"substrate-dtao\"\n ? SubDTaoTokenIdSpecs\n : T extends \"substrate-foreignassets\"\n ? ForeignAssetsTokenIdSpecs\n : T extends \"substrate-native\"\n ? SubNativeTokenIdSpecs\n : T extends \"substrate-psp22\"\n ? SubPsp22TokenIdSpecs\n : T extends \"substrate-tokens\"\n ? SubTokensTokenIdSpecs\n : T extends \"substrate-hydration\"\n ? SubHydrationToken\n : T extends \"sol-native\"\n ? SolNativeToken\n : T extends \"sol-spl\"\n ? SolSplToken\n : T extends \"sol-token2022\"\n ? SolToken2022Token\n : never\n\n// transform to control in which order properties are output as JSON when parsed from schema\nexport const TokenSchema = TokenSchemaBase.transform((token: Token): Token => {\n // reorder properties for easier reading\n const {\n id,\n platform,\n networkId,\n type,\n symbol,\n decimals,\n name,\n coingeckoId,\n logo,\n isDefault,\n mirrorOf,\n noDiscovery,\n } = token\n\n return Object.assign(\n // appropriate order of base properties\n {\n id,\n platform,\n networkId,\n type,\n symbol,\n decimals,\n name,\n coingeckoId,\n logo,\n isDefault,\n mirrorOf,\n noDiscovery,\n },\n // token type specifics go after\n token\n )\n})\n","import { z } from \"zod/v4\"\n\nexport const NetworkBaseSchema = z.strictObject({\n id: z.string().nonempty(),\n isTestnet: z.boolean().optional(),\n isDefault: z.boolean().optional(),\n forceScan: z.boolean().optional(),\n name: z.string().nonempty(),\n logo: z.string().nonempty().optional(),\n nativeTokenId: z.string().nonempty(),\n nativeCurrency: z.strictObject({\n decimals: z.uint32(),\n symbol: z.string().nonempty(),\n name: z.string().nonempty(),\n coingeckoId: z.string().optional(),\n mirrorOf: z.string().optional(),\n logo: z.string().optional(),\n }),\n themeColor: z.string().nonempty().optional(),\n blockExplorerUrls: z.array(z.url({ protocol: /^https?$/ })).default([]),\n})\nexport type NetworkBase = z.infer<typeof NetworkBaseSchema>\n","import z from \"zod/v4\"\n\nimport { HexStringSchema } from \"../shared\"\nimport {\n SubAssetsBalancesConfigSchema,\n SubDTaoBalancesConfigSchema,\n SubForeignAssetsBalancesConfigSchema,\n SubHydrationBalancesConfigSchema,\n SubNativeBalancesConfigSchema,\n SubPsp22BalancesConfigSchema,\n SubTokensBalancesConfigSchema,\n} from \"../tokens\"\nimport { NetworkBaseSchema } from \"./NetworkBase\"\n\nexport const DotNetworkBalancesConfigSchema = z.strictObject({\n \"substrate-native\": SubNativeBalancesConfigSchema.optional(),\n \"substrate-assets\": SubAssetsBalancesConfigSchema.optional(),\n \"substrate-psp22\": SubPsp22BalancesConfigSchema.optional(),\n \"substrate-tokens\": SubTokensBalancesConfigSchema.optional(),\n \"substrate-foreignassets\": SubForeignAssetsBalancesConfigSchema.optional(),\n \"substrate-hydration\": SubHydrationBalancesConfigSchema.optional(),\n \"substrate-dtao\": SubDTaoBalancesConfigSchema.optional(),\n})\n\nexport type DotNetworkBalancesConfig = z.infer<typeof DotNetworkBalancesConfigSchema>\n\nexport const DotNetworkTopologySchema = z.discriminatedUnion(\"type\", [\n z.strictObject({ type: z.literal(\"standalone\") }),\n z.strictObject({ type: z.literal(\"relay\") }),\n z.strictObject({\n type: z.literal(\"parachain\"),\n relayId: z.string().nonempty(),\n paraId: z.number().int(),\n }),\n])\n\nexport const DotNetworkSchema = NetworkBaseSchema.extend({\n genesisHash: HexStringSchema,\n platform: z.literal(\"polkadot\"),\n chainName: z.string(), // system_chain - used only to lookup typesBundle in p.js, for chains that do not have metadata v14\n specName: z.string(),\n specVersion: z.uint32().describe(\"Don't trust it, it might not be up to date\"),\n account: z.enum([\"secp256k1\", \"*25519\"]),\n chainspecQrUrl: z.string().nonempty().optional(),\n latestMetadataQrUrl: z.string().nonempty().optional(),\n prefix: z.number(),\n oldPrefix: z.number().optional(),\n rpcs: z.array(z.url({ protocol: /^wss?$/ })),\n registryTypes: z.any().optional(),\n signedExtensions: z.any().optional(),\n hasCheckMetadataHash: z.boolean().optional(),\n hasExtrinsicSignatureTypePrefix: z.boolean().optional(),\n isUnknownFeeToken: z.boolean().optional(),\n topology: DotNetworkTopologySchema,\n balancesConfig: DotNetworkBalancesConfigSchema.optional(),\n})\n\nexport type DotNetwork = z.infer<typeof DotNetworkSchema>\n\nexport type DotNetworkId = DotNetwork[\"id\"]\n\nexport type DotNetworkList = Record<DotNetworkId, DotNetwork>\n","import z from \"zod/v4\"\n\nimport { EthereumAddressSchema } from \"../shared\"\nimport {\n EvmErc20BalancesConfigSchema,\n EvmNativeBalancesConfigSchema,\n EvmUniswapV2BalancesConfigSchema,\n} from \"../tokens\"\nimport { NetworkBaseSchema } from \"./NetworkBase\"\n\nexport const EthNetworkBalancesConfigSchema = z.strictObject({\n \"evm-native\": EvmNativeBalancesConfigSchema.optional(),\n \"evm-erc20\": EvmErc20BalancesConfigSchema.optional(),\n \"evm-uniswapv2\": EvmUniswapV2BalancesConfigSchema.optional(),\n})\n\nexport type EthNetworkBalancesConfig = z.infer<typeof EthNetworkBalancesConfigSchema>\n\nconst ContractsSchema = z.strictObject({\n Erc20Aggregator: EthereumAddressSchema.optional(),\n Multicall3: EthereumAddressSchema.optional(),\n})\n\nconst L2FeeSchema = z.discriminatedUnion(\"type\", [\n z.strictObject({\n type: z.literal(\"op-stack\"),\n }),\n z.strictObject({\n type: z.literal(\"scroll\"),\n l1GasPriceOracle: EthereumAddressSchema,\n }),\n])\n\nexport const EthNetworkSchema = NetworkBaseSchema.extend({\n platform: z.literal(\"ethereum\"),\n substrateChainId: z.string().optional(),\n preserveGasEstimate: z.boolean().optional(),\n rpcs: z.array(z.url({ protocol: /^https?$/ })),\n feeType: z.enum([\"legacy\", \"eip-1559\"]).optional(),\n l2FeeType: L2FeeSchema.optional(),\n contracts: ContractsSchema.optional(),\n balancesConfig: EthNetworkBalancesConfigSchema.optional(),\n})\n\nexport type EthNetwork = z.infer<typeof EthNetworkSchema>\n\nexport type EthNetworkId = EthNetwork[\"id\"]\n\nexport type EthNetworkList = Record<EthNetworkId, EthNetwork>\n","import z from \"zod/v4\"\n\nimport {\n SolNativeBalancesConfigSchema,\n SolSplBalancesConfigSchema,\n SolToken2022BalancesConfigSchema,\n} from \"../tokens\"\nimport { NetworkBaseSchema } from \"./NetworkBase\"\n\nexport const SolNetworkBalancesConfigSchema = z.strictObject({\n \"sol-native\": SolNativeBalancesConfigSchema.optional(),\n \"sol-spl\": SolSplBalancesConfigSchema.optional(),\n \"sol-token2022\": SolToken2022BalancesConfigSchema.optional(),\n})\n\nexport type SolNetworkBalancesConfig = z.infer<typeof SolNetworkBalancesConfigSchema>\n\nexport const SolNetworkSchema = NetworkBaseSchema.extend({\n platform: z.literal(\"solana\"),\n genesisHash: z.string(),\n rpcs: z.array(z.url({ protocol: /^https?$/ })),\n balancesConfig: SolNetworkBalancesConfigSchema.optional(),\n})\n\nexport type SolNetwork = z.infer<typeof SolNetworkSchema>\n\nexport type SolNetworkId = SolNetwork[\"id\"]\n\nexport type SolNetworkList = Record<SolNetworkId, SolNetwork>\n","import z from \"zod/v4\"\n\nimport { DotNetworkSchema } from \"./DotNetwork\"\nimport { EthNetworkSchema } from \"./EthNetwork\"\nimport { SolNetworkSchema } from \"./SolNetwork\"\n\nexport const NetworkSchema = z.discriminatedUnion(\"platform\", [\n DotNetworkSchema,\n EthNetworkSchema,\n SolNetworkSchema,\n])\n\nexport type Network = z.infer<typeof NetworkSchema>\n\nexport type NetworkId = Network[\"id\"]\n\nexport type NetworkPlatform = Network[\"platform\"]\n\nexport type NetworkList = Record<NetworkId, Network>\n","import z from \"zod/v4\"\n\nimport { DotNetworkSchema } from \"./networks\"\nimport { HexStringSchema } from \"./shared\"\n\nexport const AnyMiniMetadataSchema = z.strictObject({\n /** The DB id for this metadata */\n id: z.string().nonempty(),\n /** The balance module which created this miniMetadata */\n source: z.string().nonempty(), // TODO make it an enum of balance module types ?\n /** The chain this miniMetadata came from */\n chainId: DotNetworkSchema.shape.id,\n /** The chain specVersion which this miniMetadata is valid for */\n specVersion: DotNetworkSchema.shape.specVersion,\n /** the version of the balances library used to craft the mini metadata */\n version: z.string().nonempty(),\n /** The miniMetadata encoded as a hex string */\n data: HexStringSchema.nullable(),\n // /** module specific information about the chain, such as pallet ids for specific features */\n extra: z.any().nullable(),\n})\n\nexport type AnyMiniMetadata = z.infer<typeof AnyMiniMetadataSchema>\n","import type { DotNetwork, Network, NetworkPlatform } from \"./networks\"\nimport {\n EvmNativeTokenSchema,\n parseEvmErc20TokenId,\n parseEvmNativeTokenId,\n parseEvmUniswapV2TokenId,\n parseSolSplTokenId,\n parseSolToken2022TokenId,\n parseSubAssetTokenId,\n parseSubDTaoTokenId,\n parseSubForeignAssetTokenId,\n parseSubHydrationTokenId,\n parseSubNativeTokenId,\n parseSubPsp22TokenId,\n parseSubTokensTokenId,\n SubNativeTokenSchema,\n type Token,\n type TokenId,\n type TokenIdSpecs,\n type TokenType,\n} from \"./tokens\"\nimport { parseSolNativeTokenId, SolNativeTokenSchema } from \"./tokens/SolNativeToken\"\n\nexport type NetworkOfPlatform<P extends NetworkPlatform> = Extract<Network, { platform: P }>\n\nexport const isNetworkOfPlatform = <P extends NetworkPlatform>(\n network: Network | null | undefined,\n platform: P\n): network is Extract<Network, { platform: P }> => {\n return !!network && network.platform === platform\n}\n\nexport const isNetworkInPlatforms = <P extends NetworkPlatform[]>(\n network: Network | null | undefined,\n platforms: P\n): network is NetworkOfPlatform<P[number]> => {\n return platforms.some((platform) => isNetworkOfPlatform(network, platform))\n}\n\nexport const isNetworkDot = (network: Network | null | undefined) => {\n return isNetworkOfPlatform(network, \"polkadot\")\n}\n\nexport const isNetworkEth = (network: Network | null | undefined) => {\n return isNetworkOfPlatform(network, \"ethereum\")\n}\n\nexport const isNetworkSol = (network: Network | null | undefined) => {\n return isNetworkOfPlatform(network, \"solana\")\n}\n\nexport const getNetworkGenesisHash = <\n Net extends Network,\n Res = Net extends DotNetwork ? DotNetwork[\"genesisHash\"] : undefined,\n>(\n network: Net | null | undefined\n): Res => {\n return (isNetworkDot(network) ? network.genesisHash : undefined) as Res\n}\n\nexport type TokenOfType<T extends TokenType> = Extract<Token, { type: T }>\nexport type TokenOfPlatform<P extends NetworkPlatform> = Extract<Token, { platform: P }>\nexport type DotToken = TokenOfPlatform<\"polkadot\">\nexport type EthToken = TokenOfPlatform<\"ethereum\">\nexport type SolToken = TokenOfPlatform<\"solana\">\n\nexport const isTokenOfPlatform = <P extends NetworkPlatform>(\n token: Token | null | undefined,\n platform: P\n): token is TokenOfPlatform<P> => {\n return !!token && token.platform === platform\n}\n\nexport const isTokenEth = (token: Token | null | undefined) => {\n return isTokenOfPlatform(token, \"ethereum\")\n}\n\nexport const isTokenDot = (token: Token | null | undefined) => {\n return isTokenOfPlatform(token, \"polkadot\")\n}\n\nexport const isTokenSol = (token: Token | null | undefined) => {\n return isTokenOfPlatform(token, \"solana\")\n}\n\nexport const isTokenNeedExistentialDeposit = (token: Token) => \"existentialDeposit\" in token\n\nexport const isTokenOfType = <T extends TokenType>(\n token: Token | null | undefined,\n type: T\n): token is TokenOfType<T> => {\n return !!token && token.type === type\n}\n\nexport const isTokenInTypes = <T extends TokenType[]>(\n token: Token | null | undefined,\n types: T\n): token is TokenOfType<T[number]> => {\n return types.some((type) => isTokenOfType(token, type))\n}\n\nexport const isTokenSubNative = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-native\")\n}\n\nexport const isTokenSubAssets = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-assets\")\n}\n\nexport const isTokenSubDTao = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-dtao\")\n}\n\nexport const isTokenSubForeignAssets = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-foreignassets\")\n}\n\nexport const isTokenSubPsp22 = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-psp22\")\n}\n\nexport const isTokenSubTokens = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-tokens\")\n}\n\nexport const isTokenSubHydration = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-hydration\")\n}\n\nexport const isTokenEvmNative = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"evm-native\")\n}\n\nexport const isTokenEvmErc20 = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"evm-erc20\")\n}\n\nexport const isTokenEvmUniswapV2 = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"evm-uniswapv2\")\n}\n\nexport const isTokenSolSpl = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"sol-spl\")\n}\n\nexport const isTokenSolToken2022 = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"sol-token2022\")\n}\n\nexport const parseTokenId = <T extends TokenType>(tokenId: TokenId): TokenIdSpecs<T> => {\n const parts = tokenId.split(\":\")\n if (parts.length < 2) throw new Error(`Invalid TokenId: ${tokenId}`)\n\n const type = parts[1] as TokenType\n\n switch (type) {\n case \"evm-native\":\n return parseEvmNativeTokenId(tokenId) as TokenIdSpecs<T>\n case \"evm-erc20\":\n return parseEvmErc20TokenId(tokenId) as TokenIdSpecs<T>\n case \"evm-uniswapv2\":\n return parseEvmUniswapV2TokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-native\":\n return parseSubNativeTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-psp22\":\n return parseSubPsp22TokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-assets\":\n return parseSubAssetTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-foreignassets\":\n return parseSubForeignAssetTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-dtao\":\n return parseSubDTaoTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-tokens\":\n return parseSubTokensTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-hydration\":\n return parseSubHydrationTokenId(tokenId) as TokenIdSpecs<T>\n case \"sol-native\":\n return parseSolNativeTokenId(tokenId) as TokenIdSpecs<T>\n case \"sol-spl\":\n return parseSolSplTokenId(tokenId) as TokenIdSpecs<T>\n case \"sol-token2022\":\n return parseSolToken2022TokenId(tokenId) as TokenIdSpecs<T>\n }\n\n throw new Error(`Invalid TokenId: ${tokenId}`)\n}\n\nexport const isTokenIdOfType = <T extends TokenType>(\n tokenId: unknown,\n type: T\n): tokenId is TokenId => {\n if (typeof tokenId !== \"string\") return false\n try {\n return parseTokenId(tokenId).type === type\n } catch {\n return false\n }\n}\n\nexport const isTokenIdInTypes = <T extends TokenType[]>(\n tokenId: unknown,\n types: T\n): tokenId is TokenId => {\n return types.some((type) => isTokenIdOfType(tokenId, type))\n}\n\nexport const networkIdFromTokenId = (tokenId: TokenId): Network[\"id\"] =>\n parseTokenId(tokenId).networkId\n\nconst PLATFORM_NATIVE_TOKENS = {\n polkadot: SubNativeTokenSchema.shape.type.value,\n ethereum: EvmNativeTokenSchema.shape.type.value,\n solana: SolNativeTokenSchema.shape.type.value,\n}\n\nexport type NativeTokenType<P extends NetworkPlatform = NetworkPlatform> =\n (typeof PLATFORM_NATIVE_TOKENS)[P]\n\nexport type NativeToken<P extends NetworkPlatform = NetworkPlatform> = Extract<\n Token,\n { type: NativeTokenType<P> }\n>\n\nexport const isNativeTokenType = <P extends NetworkPlatform = NetworkPlatform>(\n type: TokenType,\n platform?: P\n): type is NativeTokenType<P> => {\n if (platform) return type === PLATFORM_NATIVE_TOKENS[platform]\n return Object.values(PLATFORM_NATIVE_TOKENS).includes(type as NativeTokenType)\n}\n\nexport const isNativeToken = <P extends NetworkPlatform = NetworkPlatform>(\n token: Token,\n platform?: P\n): token is NativeToken<P> => {\n return (isNativeTokenType(token.type, platform) && !platform) || token.platform === platform\n}\n","/** @dev temporarily change branch here when testing changes in chaindata */\nconst CHAINDATA_BRANCH = \"main\"\n\n// pub subfolder needs to be incremented each time the schema of chaindata changes, or when the content of the minimetadata changes\nexport const CHAINDATA_PUB_FOLDER = \"pub/v12\"\n\nexport const MINIMETADATA_VERSION = CHAINDATA_PUB_FOLDER.split(\"/\").pop()!\nif (!MINIMETADATA_VERSION) {\n throw new Error(\"MINIMETADATA_VERSION is not defined, please check CHAINDATA_PUB_FOLDER\")\n}\n\n//\n// GitHub repo constants\n//\n\nconst githubCdn = \"https://raw.githubusercontent.com\"\n\nconst githubChaindataOrg = \"TalismanSociety\"\nconst githubChaindataRepo = \"chaindata\"\nconst githubChaindataBranch = CHAINDATA_BRANCH\nconst githubChaindataDistDir = CHAINDATA_PUB_FOLDER\n\nexport const githubChaindataBaseUrl = `${githubCdn}/${githubChaindataOrg}/${githubChaindataRepo}/${githubChaindataBranch}`\nexport const githubChaindataDistUrl = `${githubChaindataBaseUrl}/${githubChaindataDistDir}`\n\nexport const githubChaindataTokensAssetsDir = \"assets/tokens\"\n","import { startCase, uniq } from \"lodash-es\"\n\nimport type { Network } from \"./chaindata\"\n\nexport type BlockExplorerQuery =\n | {\n type: \"address\"\n // to be used for contracts mainly, otherwise use \"account\"\n address: string\n }\n | {\n type: \"account\"\n address: string\n }\n | {\n type: \"transaction\"\n // hash for most networks, signature for solana\n id: string\n }\n | {\n type: \"block\"\n // block number for most networks, block hash for polkadot.js, slot for solana\n id: string | number | bigint\n }\n | {\n type: \"extrinsic\"\n blockNumber: number | bigint\n extrinsicIndex: number\n }\n | {\n type: \"extrinsic-unknown\"\n hash: `0x${string}`\n }\n\nexport const getBlockExplorerUrls = (network: Network, query: BlockExplorerQuery): string[] => {\n return uniq(\n network.blockExplorerUrls\n .map((explorerUrl) => getExplorerUrl(explorerUrl, query, network.rpcs?.[0]))\n .filter(Boolean) as string[]\n )\n}\n\nconst getExplorerUrl = (\n explorerUrl: string,\n query: BlockExplorerQuery,\n rpcUrl?: string\n): string | null => {\n if (explorerUrl.includes(\"{RPC_URL}\")) {\n if (!rpcUrl) return null\n // rpc url is always in the query string, use encodeURIComponent\n explorerUrl = explorerUrl.replace(\"{RPC_URL}\", encodeURIComponent(rpcUrl))\n }\n\n const url = new URL(explorerUrl)\n const host = getExplorerHost(url)\n const path = getQueryPath(query, host)\n\n if (!path) return null // path is not supported by the host\n\n switch (host) {\n case \"polkadot.js\":\n url.pathname = `/apps/`\n url.hash = path\n break\n case \"statescan.io\":\n url.pathname = `/`\n url.hash = path\n break\n default: {\n // preserve any base path from the explorer URL (e.g., /chain in https://bittensor.ai/chain)\n const basePath = url.pathname.replace(/\\/$/, \"\")\n url.pathname = basePath + path\n break\n }\n }\n\n return url.toString()\n}\n\ntype ExplorerHost =\n | \"polkadot.js\"\n | \"avail.so\"\n | \"statescan.io\"\n | \"taostats.io\"\n | \"subscan.io\"\n | \"etherscan.io\"\n | \"solscan.io\"\n | \"blockscout.com\"\n | \"moonscan.io\"\n | \"bittensor.ai\"\n | (string & {})\n\nconst getExplorerHost = (explorerUrl: URL): ExplorerHost => {\n const hostname = explorerUrl.hostname.toLowerCase()\n\n if (explorerUrl.hostname.endsWith(\"polkadot.js.org\")) return \"polkadot.js\"\n\n // last 2 parts of the hostname\n const parts = hostname.split(\".\")\n return parts.length > 2 ? parts.slice(-2).join(\".\") : hostname\n}\n\nconst getQueryPath = (query: BlockExplorerQuery, host: ExplorerHost): string | null => {\n switch (query.type) {\n case \"transaction\":\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return null\n case \"statescan.io\":\n return `/extrinsics/${query.id}`\n case \"taostats.io\":\n return `/transaction/${query.id}`\n case \"subscan.io\":\n return `/extrinsic/${query.id}`\n default:\n return `/tx/${query.id}`\n }\n case \"address\":\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return null\n case \"statescan.io\":\n return `/accounts/${query.address}`\n case \"subscan.io\":\n case \"taostats.io\":\n case \"bittensor.ai\":\n return `/account/${query.address}`\n default:\n return `/address/${query.address}`\n }\n case \"account\": {\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return null\n case \"statescan.io\":\n return `/accounts/${query.address}`\n default:\n return `/account/${query.address}`\n }\n }\n case \"block\": {\n const isNumber = typeof query.id !== \"string\" || /^\\d+$/.test(query.id)\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return isNumber ? null : `/explorer/query/${query.id}` // supports block hash only\n case \"statescan.io\":\n return isNumber ? `/blocks/${query.id}` : null\n case \"taostats.io\":\n return isNumber ? `/block/${query.id}/extrinsics` : null\n default:\n return isNumber ? `/block/${query.id}` : null\n }\n }\n case \"extrinsic\": {\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return null // unsupported\n case \"statescan.io\":\n return `/extrinsics/${query.blockNumber}-${query.extrinsicIndex}`\n case \"taostats.io\":\n return `/extrinsic/${query.blockNumber}-${query.extrinsicIndex.toString().padStart(4, \"0\")}`\n default:\n return `/extrinsic/${query.blockNumber}-${query.extrinsicIndex}`\n }\n }\n case \"extrinsic-unknown\": {\n switch (host) {\n case \"subscan.io\":\n return `/extrinsic/${query.hash}`\n default:\n return null\n }\n }\n default:\n return null // unsupported query type\n }\n}\n\nexport const getBlockExplorerLabel = (blockExplorerUrl: string): string => {\n const url = new URL(blockExplorerUrl)\n const host = getExplorerHost(url)\n\n switch (host) {\n case \"polkadot.js\":\n return \"Polkadot.js\"\n case \"bittensor.ai\":\n return \"Bittensor.ai\"\n default: {\n const parts = url.hostname.split(\".\")\n return parts.length === 2 ? startCase(parts[0]) : host\n }\n }\n}\n","import type { Transaction } from \"dexie\"\n\nimport type { Token, TokenId } from \"../chaindata\"\nimport type { LegacyChain, LegacyChainId } from \"../legacy/Chain\"\nimport type { LegacyEvmNetwork, LegacyEvmNetworkId } from \"../legacy/EvmNetwork\"\n\n// for DB version 2, Wallet version 1.21.0\nexport const upgradeAddIsDefaultToExistingChains = async (tx: Transaction) => {\n const chainsTable = tx.table<LegacyChain, LegacyChainId>(\"chains\")\n const evmNetworksTable = tx.table<LegacyEvmNetwork, LegacyEvmNetworkId>(\"evmNetworks\")\n const tokensTable = tx.table<Token, TokenId>(\"tokens\")\n\n await chainsTable.toCollection().modify((chain) => {\n if (\"isCustom\" in chain && chain.isCustom) return\n chain.isDefault = true\n })\n await evmNetworksTable.toCollection().modify((evmNetwork) => {\n if (\"isCustom\" in evmNetwork && evmNetwork.isCustom) return\n evmNetwork.isDefault = true\n })\n await tokensTable.toCollection().modify((token) => {\n if (\"isCustom\" in token && token.isCustom) return\n token.isDefault = true\n })\n}\n","import type { Transaction } from \"dexie\"\n\nimport type { Token, TokenId } from \"../chaindata\"\nimport type { LegacyChain, LegacyChainId } from \"../legacy/Chain\"\nimport type { LegacyEvmNetwork, LegacyEvmNetworkId } from \"../legacy/EvmNetwork\"\n\nconst legacySubNativeTokenId = (chainId: LegacyChainId) =>\n `${chainId}-substrate-native`.toLowerCase().replace(/ /g, \"-\")\n\nconst legacyEvmNativeTokenId = (chainId: LegacyEvmNetworkId) =>\n `${chainId}-evm-native`.toLowerCase().replace(/ /g, \"-\")\n\n// for DB version 2, Wallet version 1.21.0\nexport const upgradeRemoveSymbolFromNativeTokenId = async (tx: Transaction) => {\n const tokensTable = tx.table<Token, TokenId>(\"tokens\")\n const chainsTable = tx.table<LegacyChain, LegacyChainId>(\"chains\")\n const evmNetworksTable = tx.table<LegacyEvmNetwork, LegacyEvmNetworkId>(\"evmNetworks\")\n\n const nativeTokens = (await tokensTable.toArray()).filter((t) =>\n [\"substrate-native\", \"evm-native\"].includes(t.type)\n )\n const chains = await chainsTable.toArray()\n const evmNetworks = await evmNetworksTable.toArray()\n\n const tokenIdsToDelete: TokenId[] = []\n const tokensToUpsert: Token[] = []\n const chainsToUpsert: LegacyChain[] = []\n const evmNetworksToUpsert: LegacyEvmNetwork[] = []\n\n for (const nativeToken of nativeTokens) {\n const networkId = nativeToken.networkId || nativeToken.networkId\n if (!networkId) continue\n\n const id =\n nativeToken.type === \"substrate-native\"\n ? legacySubNativeTokenId(networkId)\n : nativeToken.type === \"evm-native\"\n ? legacyEvmNativeTokenId(networkId)\n : undefined\n if (!id) continue\n\n const chain = chains.find(({ id }) => id === networkId)\n const evmNetwork = evmNetworks.find(({ id }) => id === networkId)\n\n tokenIdsToDelete.push(nativeToken.id)\n tokensToUpsert.push({ ...nativeToken, id })\n if (chain) chainsToUpsert.push({ ...chain, nativeToken: { id } })\n if (evmNetwork) evmNetworksToUpsert.push({ ...evmNetwork, nativeToken: { id } })\n }\n\n await tokensTable.bulkPut(tokensToUpsert)\n await chainsTable.bulkPut(chainsToUpsert)\n await evmNetworksTable.bulkPut(evmNetworksToUpsert)\n await tokensTable.bulkDelete(tokenIdsToDelete)\n}\n","import { Dexie } from \"dexie\"\n\nimport type { Token, TokenId } from \"../chaindata\"\nimport { upgradeAddIsDefaultToExistingChains } from \"../upgrades/2024-01-25-upgradeAddIsDefaultToExistingChains\"\nimport { upgradeRemoveSymbolFromNativeTokenId } from \"../upgrades/2024-01-25-upgradeRemoveSymbolFromNativeTokenId\"\nimport type { LegacyChain, LegacyChainId, LegacyCustomChain } from \"./Chain\"\nimport type { LegacyCustomEvmNetwork, LegacyEvmNetwork, LegacyEvmNetworkId } from \"./EvmNetwork\"\n\nclass TalismanChaindataDatabase extends Dexie {\n chains!: Dexie.Table<LegacyChain | LegacyCustomChain, LegacyChainId>\n evmNetworks!: Dexie.Table<LegacyEvmNetwork | LegacyCustomEvmNetwork, LegacyEvmNetworkId>\n tokens!: Dexie.Table<Token, TokenId>\n\n constructor() {\n super(\"TalismanChaindata\")\n\n // https://dexie.org/docs/Tutorial/Design#database-versioning\n this.version(2)\n .stores({\n // You only need to specify properties that you wish to index.\n // The object store will allow any properties on your stored objects but you can only query them by indexed properties\n // https://dexie.org/docs/API-Reference#declare-database\n //\n // Never index properties containing images, movies or large (huge) strings. Store them in IndexedDB, yes! but just don’t index them!\n // https://dexie.org/docs/Version/Version.stores()#warning\n chains: \"id, genesisHash, name\",\n evmNetworks: \"id, name\",\n tokens: \"id, type, symbol, coingeckoId, dcentName, contractAddress\",\n })\n .upgrade(upgradeRemoveSymbolFromNativeTokenId)\n .upgrade(upgradeAddIsDefaultToExistingChains)\n }\n}\n\n/** @deprecated */\nexport const getChaindataDbV3 = () => new TalismanChaindataDatabase()\n","","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","import {\n arrayItemsEqualWithYield,\n type ChunkedOptions,\n createTimeSlicer,\n forEachWithYield,\n keyByWithYield,\n type TimeSlicer,\n validateArrayWithYield,\n} from \"@talismn/util\"\nimport z from \"zod/v4\"\n\nimport { AnyMiniMetadataSchema, NetworkSchema, TokenSchema } from \"../chaindata\"\nimport type { Chaindata, CustomChaindata } from \"./schema\"\n\n/**\n * Chunked (cooperatively time-sliced) equivalents of ChaindataFileSchema.safeParse and\n * CustomChaindataSchema.safeParse (see ./schema.ts).\n *\n * Validating the whole file with one `schema.safeParse(data)` call blocks the JS thread\n * for the entire validation of thousands of networks/tokens. Element-wise validation of\n * `z.array(X)` is result-identical to the array parse (including TokenSchema's key-order\n * `.transform()` and default filling), so instead we validate each element inside a time\n * budget and yield the thread to the host event loop between slices.\n *\n * Parity with the sync schemas (guarded by chunkedValidation.test.ts):\n * - identical output data (values AND key order)\n * - identical issues (code/path/message), with element issue paths prefixed\n * `[section, index, ...path]` like the array parse produces\n * - the file-level native-token `.check()` cross-reference only runs when the base parse\n * produced no issues, matching zod's check gating\n */\n\nexport type ChunkedParseResult<T> =\n | { success: true; data: T }\n | { success: false; error: z.ZodError }\n\nconst getSlicer = (options?: ChunkedOptions): TimeSlicer =>\n options?.slicer ?? createTimeSlicer({ budgetMs: options?.budgetMs, signal: options?.signal })\n\n/** cheap top-level shape parse: replicates z.object's non-object/missing-field/wrong-type issues */\nconst ChaindataFileShapeSchema = z.object({\n networks: z.array(z.unknown()),\n tokens: z.array(z.unknown()),\n miniMetadatas: z.array(z.unknown()),\n})\n\n/** replicates CustomChaindataSchema's strictObject top level (unrecognized keys are issues) */\nconst CustomChaindataShapeSchema = z.strictObject({\n networks: z.array(z.unknown()).optional(),\n tokens: z.array(z.unknown()),\n})\n\nconst prefixIssues = (\n section: string,\n errors: { index: number; error: z.ZodError }[]\n): z.core.$ZodIssue[] =>\n errors.flatMap(({ index, error }) =>\n error.issues.map((issue) => ({ ...issue, path: [section, index, ...issue.path] }))\n )\n\nconst validateSection = async <T>(\n section: string,\n items: readonly unknown[],\n schema: z.ZodType<T>,\n issues: z.core.$ZodIssue[],\n slicer: TimeSlicer\n): Promise<T[]> => {\n const result = await validateArrayWithYield<T, z.ZodError>(\n items,\n (item) => schema.safeParse(item),\n { slicer }\n )\n if (result.success) return result.data\n issues.push(...prefixIssues(section, result.errors))\n return []\n}\n\n/** the native-token cross-reference from ChaindataFileSchema/CustomChaindataSchema `.check()` */\nconst checkNativeTokens = async (\n value: { networks?: { id: string; nativeTokenId: string }[]; tokens: { id: string }[] },\n issues: z.core.$ZodIssue[],\n slicer: TimeSlicer\n): Promise<void> => {\n const tokensById = await keyByWithYield(value.tokens, (t) => t.id, { slicer })\n await forEachWithYield(\n value.networks ?? [],\n (network, index) => {\n const nativeToken = tokensById[network.nativeTokenId]\n if (!nativeToken)\n issues.push({\n code: \"custom\",\n message: `Network ${network.id} has no native token`,\n input: value,\n path: [\"networks\", index, \"nativeTokenId\"],\n })\n },\n { slicer }\n )\n}\n\nexport const parseChaindataFileChunked = async (\n input: unknown,\n options?: ChunkedOptions\n): Promise<ChunkedParseResult<Chaindata>> => {\n const slicer = getSlicer(options)\n\n const shape = ChaindataFileShapeSchema.safeParse(input)\n if (!shape.success) return { success: false, error: shape.error }\n\n const issues: z.core.$ZodIssue[] = []\n const networks = await validateSection(\n \"networks\",\n shape.data.networks,\n NetworkSchema,\n issues,\n slicer\n )\n const tokens = await validateSection(\"tokens\", shape.data.tokens, TokenSchema, issues, slicer)\n const miniMetadatas = await validateSection(\n \"miniMetadatas\",\n shape.data.miniMetadatas,\n AnyMiniMetadataSchema,\n issues,\n slicer\n )\n\n const data: Chaindata = { networks, tokens, miniMetadatas }\n\n // like zod, only run the file-level check when the base parse produced no issues\n if (!issues.length) await checkNativeTokens(data, issues, slicer)\n\n if (issues.length) return { success: false, error: new z.ZodError(issues) }\n return { success: true, data }\n}\n\nexport const parseCustomChaindataChunked = async (\n input: unknown,\n options?: ChunkedOptions\n): Promise<ChunkedParseResult<CustomChaindata>> => {\n const slicer = getSlicer(options)\n\n const shape = CustomChaindataShapeSchema.safeParse(input)\n if (!shape.success) return { success: false, error: shape.error }\n\n const issues: z.core.$ZodIssue[] = []\n const networks =\n shape.data.networks !== undefined\n ? await validateSection(\"networks\", shape.data.networks, NetworkSchema, issues, slicer)\n : undefined\n const tokens = await validateSection(\"tokens\", shape.data.tokens, TokenSchema, issues, slicer)\n\n // like z.object, don't add missing optional keys to the output\n const data: CustomChaindata = networks !== undefined ? { networks, tokens } : { tokens }\n\n if (!issues.length) await checkNativeTokens(data, issues, slicer)\n\n if (issues.length) return { success: false, error: new z.ZodError(issues) }\n return { success: true, data }\n}\n\n/** chunked equivalent of lodash `isEqual(a, b)` for validated {networks,tokens,miniMetadatas} shapes */\nexport const chaindataEqualWithYield = async (\n a: Chaindata,\n b: Chaindata,\n options?: ChunkedOptions\n): Promise<boolean> => {\n const slicer = getSlicer(options)\n return (\n (await arrayItemsEqualWithYield(a.networks, b.networks, { slicer })) &&\n (await arrayItemsEqualWithYield(a.tokens, b.tokens, { slicer })) &&\n (await arrayItemsEqualWithYield(a.miniMetadatas, b.miniMetadatas, { slicer }))\n )\n}\n","import {\n arrayItemsEqualWithYield,\n isNotNil,\n keyByWithYield,\n mapWithYield,\n switchMapChunked,\n type TimeSlicer,\n} from \"@talismn/util\"\nimport { assign, isEqual, values } from \"lodash-es\"\nimport {\n combineLatest,\n distinctUntilChanged,\n isObservable,\n type Observable,\n of,\n shareReplay,\n} from \"rxjs\"\n\nimport { type Network, type Token, TokenSchema } from \"../chaindata\"\nimport log from \"../log\"\nimport { parseCustomChaindataChunked } from \"./chunkedValidation\"\nimport type { Chaindata, CustomChaindata } from \"./schema\"\n\nconst DEFAULT_CUSTOM_CHAINDATA: CustomChaindata = { networks: [], tokens: [] }\n\ntype AnyMiniMetadata = Chaindata[\"miniMetadatas\"][number]\n\n/**\n * Reference stabilization for one section (networks/tokens/miniMetadatas) of the combined\n * chaindata: reuses the previous item reference for items that are deep-equal (matched by\n * id), and returns the exact previous ARRAY reference when nothing changed at all.\n *\n * This is what lets everything downstream compare by reference instead of deep-walking\n * the whole dataset on every emission — ChaindataProvider's distinctUntilKeyChanged\n * relies on it, and consumers keeping per-item references (e.g. balances subscriptions)\n * don't see spurious changes for unrelated tokens.\n */\nconst makeSectionStabilizer = <T extends { id: string }>() => {\n let prevArray: T[] | null = null\n let prevById: Record<string, T> | null = null\n\n return async (next: T[], slicer: TimeSlicer): Promise<T[]> => {\n if (prevArray === next) return prevArray\n\n if (prevArray === null || prevById === null) {\n prevArray = next\n prevById = await keyByWithYield(next, (t) => t.id, { slicer })\n return next\n }\n\n const previousArray = prevArray\n const previousById = prevById\n let identical = next.length === previousArray.length\n\n const result = await mapWithYield(\n next,\n (item, index) => {\n const prev = previousById[item.id]\n const stabilized =\n prev !== undefined && (prev === item || isEqual(prev, item)) ? prev : item\n if (identical && previousArray[index] !== stabilized) identical = false\n return stabilized\n },\n { slicer }\n )\n\n if (identical) return previousArray\n prevArray = result\n prevById = await keyByWithYield(result, (t) => t.id, { slicer })\n return result\n }\n}\n\nexport const getCombinedChaindata$ = (\n default$: Observable<Chaindata>,\n custom$: Observable<CustomChaindata> | CustomChaindata | undefined,\n dynamicTokens$: Observable<Token[]>\n): Observable<Chaindata> => {\n // ensure custom$ is an observable\n if (!custom$) custom$ = of(DEFAULT_CUSTOM_CHAINDATA)\n if (!isObservable(custom$)) custom$ = of(custom$)\n\n // check custom one against schema (chunked — validation yields the thread on budget)\n let prevCustom: CustomChaindata | null = null\n const customChaindata$ = custom$.pipe(\n switchMapChunked(async (data, { slicer }) => {\n const result = await parseCustomChaindataChunked(data, { slicer })\n if (!result.success) log.error(\"Invalid custom chaindata provided\", result.error)\n const next = result.success ? result.data : DEFAULT_CUSTOM_CHAINDATA\n\n // reference stabilization: reuse the previous object when content is unchanged, so\n // the distinctUntilChanged below dedupes by reference\n if (\n prevCustom !== null &&\n (await arrayItemsEqualWithYield(prevCustom.networks, next.networks, { slicer })) &&\n (await arrayItemsEqualWithYield(prevCustom.tokens, next.tokens, { slicer }))\n )\n return prevCustom\n\n prevCustom = next\n return next\n }),\n distinctUntilChanged()\n )\n\n // append valid dynamic tokens to chaindata tokens (they must not be considered custom tokens)\n const defaultChainData$ = combineLatest([default$, dynamicTokens$]).pipe(\n switchMapChunked(async ([data, dynamicTokens], { slicer }) => {\n const validDynamicTokens = (\n await mapWithYield(\n dynamicTokens,\n (t) => {\n const result = TokenSchema.safeParse(t)\n return result.success ? result.data : null\n },\n { slicer }\n )\n ).filter(isNotNil)\n\n const tokensById = await keyByWithYield(data.tokens.concat(validDynamicTokens), (t) => t.id, {\n slicer,\n })\n\n return { ...data, tokens: values(tokensById) }\n })\n )\n\n const stabilizeNetworks = makeSectionStabilizer<Network>()\n const stabilizeTokens = makeSectionStabilizer<Token>()\n const stabilizeMiniMetadatas = makeSectionStabilizer<AnyMiniMetadata>()\n let prevCombined: Chaindata | null = null\n\n // merge custom into default\n return combineLatest({ defaultData: defaultChainData$, customData: customChaindata$ }).pipe(\n switchMapChunked(async (data, { slicer }) => {\n const start = performance.now()\n const merged = await mergeDefaultAndCustomChaindata(data.defaultData, data.customData, slicer)\n\n const networks = await stabilizeNetworks(merged.networks as Network[], slicer)\n const tokens = await stabilizeTokens(merged.tokens as Token[], slicer)\n const miniMetadatas = await stabilizeMiniMetadatas(merged.miniMetadatas, slicer)\n\n const result: Chaindata =\n prevCombined !== null &&\n prevCombined.networks === networks &&\n prevCombined.tokens === tokens &&\n prevCombined.miniMetadatas === miniMetadatas\n ? prevCombined\n : { networks, tokens, miniMetadatas }\n prevCombined = result\n\n log.debug(\n \"[ChaindataProvider] Combined chaindata merge: %sms\",\n (performance.now() - start).toFixed(2)\n )\n return result\n }),\n distinctUntilChanged(),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n}\n\n/**\n * Merges default and custom chaindata, adding __isCustom, __isKnown, __isTestnet flags.\n *\n * Input data is already validated by upstream observables (storageValidated$ for default,\n * customChaindata$ pipe for custom). This is a pure data transformation, chunked so it\n * yields the thread to the host event loop on budget.\n */\nconst mergeDefaultAndCustomChaindata = async (\n defaultData: Chaindata,\n customData: CustomChaindata,\n slicer: TimeSlicer\n) => {\n const defaultNetworksById = await keyByWithYield(\n await mapWithYield(\n defaultData.networks,\n (n) => ({ ...n, __isKnown: true, __isCustom: false }),\n {\n slicer,\n }\n ),\n (n) => n.id,\n { slicer }\n )\n const customNetworksById = await keyByWithYield(\n await mapWithYield(\n customData.networks ?? [],\n (t) => ({ ...t, __isKnown: !!defaultNetworksById[t.id], __isCustom: true }),\n { slicer }\n ),\n (n) => n.id,\n { slicer }\n )\n const networksById = assign({}, defaultNetworksById, customNetworksById)\n\n const defaultTokensById = await keyByWithYield(\n await mapWithYield(\n defaultData.tokens,\n (n) => ({\n ...n,\n __isCustom: false,\n __isKnown: true,\n __isTestnet: !!networksById[n.networkId]?.isTestnet,\n }),\n { slicer }\n ),\n (n) => n.id,\n { slicer }\n )\n const customTokensById = await keyByWithYield(\n await mapWithYield(\n customData.tokens,\n (t) => ({\n ...t,\n __isCustom: true,\n __isKnown: !!defaultTokensById[t.id],\n __isTestnet: !!networksById[t.networkId]?.isTestnet,\n }),\n { slicer }\n ),\n (n) => n.id,\n { slicer }\n )\n const tokensById = assign({}, defaultTokensById, customTokensById)\n\n return {\n networks: values(networksById),\n tokens: values(tokensById),\n miniMetadatas: defaultData.miniMetadatas,\n }\n}\n\n// Types for the merged chaindata with __isCustom/__isKnown/__isTestnet flags.\n// Previously inferred from ChaindataProviderDataSchema via z.infer.\ntype ChaindataProviderNetwork = Network & { __isCustom: boolean; __isKnown: boolean }\ntype ChaindataProviderToken = Token & {\n __isCustom: boolean\n __isKnown: boolean\n __isTestnet: boolean\n}\n\n// Flag checks only — no Zod safeParse. All data is already validated upstream:\n// - Default chaindata: validated by ChaindataFileSchema in storageValidated$ / fetchChaindata()\n// - Custom chaindata: validated by CustomChaindataSchema in the customChaindata$ pipe\n// - Dynamic tokens: validated by TokenSchema.safeParse in the defaultChainData$ pipe\nexport const isNetworkCustom = (network: Network): boolean =>\n typeof network === \"object\" && (network as ChaindataProviderNetwork).__isCustom === true\n\nexport const isNetworkKnown = (network: Network): boolean =>\n typeof network === \"object\" && (network as ChaindataProviderNetwork).__isKnown === true\n\nexport const isTokenCustom = (token: Token): boolean =>\n typeof token === \"object\" && (token as ChaindataProviderToken).__isCustom === true\n\nexport const isTokenKnown = (token: Token): boolean =>\n typeof token === \"object\" && (token as ChaindataProviderToken).__isKnown === true\n\nexport const isTokenTestnet = (token: Token): boolean =>\n typeof token === \"object\" && (token as ChaindataProviderToken).__isTestnet === true\n\nexport const getCleanNetwork = (network: Network): Network => {\n const { __isCustom, __isKnown, ...rest } = network as ChaindataProviderNetwork\n return rest as Network\n}\n\nexport const getCleanToken = (token: Token): Token => {\n const { __isCustom, __isKnown, __isTestnet, ...rest } = token as ChaindataProviderToken\n return rest as Token\n}\n","/**\n * Tracks objects that have already passed chaindata schema validation, so the expensive\n * validation (thousands of tokens) runs at most ONCE per object instead of on every\n * emission through the pipeline.\n *\n * Safe because parse output is immutable-by-convention in this package, and re-parsing\n * already-parsed data is idempotent (defaults filled, token key order already applied).\n */\nconst validated = new WeakSet<object>()\n\nexport const markChaindataValidated = <T extends object>(data: T): T => {\n validated.add(data)\n return data\n}\n\nexport const isChaindataValidated = (data: unknown): boolean =>\n typeof data === \"object\" && data !== null && validated.has(data)\n","import { githubChaindataDistUrl } from \"../constants\"\nimport log from \"../log\"\nimport { type ChunkedParseResult, parseChaindataFileChunked } from \"./chunkedValidation\"\nimport { markChaindataValidated } from \"./validatedCache\"\n\nconst CHAINDATA_CONSOLIDATED_URL = `${githubChaindataDistUrl}/chaindata.min.json`\n\n// exported for tests\nexport const getFallbackUrl = (url: string) => {\n // if gitraw fails, try jsdelivr (note: jsdelivr paths use {user}/{repo}@{ref}/{path}).\n // only the {user}/{repo} part is parsed - the ref is kept verbatim because it may contain\n // slashes (e.g. feat/foo), which jsdelivr resolves greedily, same as github\n if (url.startsWith(\"https://raw.githubusercontent.com/\")) {\n const fallbackUrl = url.replace(\n /^https:\\/\\/raw\\.githubusercontent\\.com\\/([^/]+)\\/([^/]+)\\//i,\n \"https://cdn.jsdelivr.net/gh/$1/$2@\"\n )\n // guard against malformed urls that the regex can't transform, to prevent infinite recursion\n return fallbackUrl !== url ? fallbackUrl : null\n }\n\n // can add more fallbacks here such as unpkg, etc.\n\n return null\n}\n\ntype FetchJsonFromGitHubOptions<T> = {\n /** chunked validator (e.g. parseChaindataFileChunked) — runs in time slices, yielding the thread between them */\n validate?: (data: unknown, signal?: AbortSignal) => Promise<ChunkedParseResult<T>>\n signal?: AbortSignal\n}\n\nconst fetchJsonFromGithubUrl = async <T>(\n url: string,\n { signal, validate }: FetchJsonFromGitHubOptions<T> = {}\n): Promise<T> => {\n const req = await fetch(url, { signal })\n\n // uncomment the line below to test initChaindata provisioning\n // if (Date.now()) throw new Error(\"OMG SHE GOT A KNIFE!\")\n\n if (!req.ok) {\n const fallbackUrl = getFallbackUrl(url)\n if (fallbackUrl) return fetchJsonFromGithubUrl(fallbackUrl, { validate, signal })\n throw new Error(`Failed to fetch from ${url}: ${req.status} ${req.statusText}`)\n }\n\n const data = await req.json()\n\n if (validate) {\n const start = performance.now()\n const result = await validate(data, signal)\n log.debug(\n `[ChaindataProvider] Validating downloaded ${url?.split(\"/\").pop()} took ${performance.now() - start} ms`\n )\n if (!result.success) {\n log.error(\"Failed to parse data from\", url, { error: result.error })\n throw new Error(`Schema validation failed for ${url}`)\n }\n return result.data as T\n }\n\n return data as T\n}\n\n// export because of generate-init-data script\nexport const fetchChaindata = (signal?: AbortSignal) =>\n fetchJsonFromGithubUrl(CHAINDATA_CONSOLIDATED_URL, {\n validate: async (data, signal) => {\n const result = await parseChaindataFileChunked(data, { signal })\n // mark so storageValidated$ doesn't re-validate this exact object on every emission\n if (result.success) markChaindataValidated(result.data)\n return result\n },\n signal,\n })\n","import { Observable, shareReplay } from \"rxjs\"\n\nimport log from \"../log\"\nimport { fetchChaindata } from \"./net\"\nimport type { Chaindata } from \"./schema\"\n\nconst REFRESH_INTERVAL = 300_000 // 5 mins\n\nlet lastUpdatedAt = 0\n\nexport const githubChaindata$ = new Observable<Chaindata>((subscriber) => {\n const controller = new AbortController()\n subscriber.add(() => controller.abort())\n\n let timeout: ReturnType<typeof setTimeout> | null = null\n subscriber.add(() => timeout && clearTimeout(timeout))\n\n const refresh = async () => {\n try {\n const delay = Math.max(0, lastUpdatedAt + 60_000 - Date.now())\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay))\n if (controller.signal.aborted) return\n\n log.debug(\"[defaultChaindata$] Refreshing chaindata from GitHub\")\n const data = await fetchChaindata(controller.signal)\n lastUpdatedAt = Date.now()\n\n // data is already validated by fetchChaindata (net.ts)\n subscriber.next(data)\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") return\n\n log.error(\"Failed to fetch chaindata\", error)\n if (!subscriber.closed) subscriber.error(error)\n } finally {\n if (!controller.signal.aborted) timeout = setTimeout(refresh, REFRESH_INTERVAL)\n }\n }\n refresh()\n}).pipe(shareReplay({ bufferSize: 1, refCount: true }))\n","","import { switchMapChunked } from \"@talismn/util\"\nimport { firstValueFrom, Observable, type Subject, shareReplay } from \"rxjs\"\n\nimport log from \"../log\"\nimport type { ChaindataStorage } from \"../provider/ChaindataProvider\"\nimport { chaindataEqualWithYield, parseChaindataFileChunked } from \"./chunkedValidation\"\nimport { githubChaindata$ } from \"./githubChaindata\"\nimport initChaindata from \"./initChaindata.json\"\nimport type { Chaindata } from \"./schema\"\nimport { isChaindataValidated, markChaindataValidated } from \"./validatedCache\"\n\nconst EMPTY_DATA: Chaindata = { networks: [], tokens: [], miniMetadatas: [] }\n\nexport const getDefaultChaindata$ = (storage$: Subject<ChaindataStorage>) => {\n // ref-memo of the last validated input: storage$ is a ReplaySubject which replays its\n // last value whenever the shareReplay below recovers from refCount 0 — without this,\n // every re-subscription would re-validate the whole dataset\n let lastInput: ChaindataStorage | null = null\n let lastOutput: Chaindata = EMPTY_DATA\n\n const storageValidated$ = storage$.pipe(\n switchMapChunked(async (data, { slicer }) => {\n // objects marked by fetchChaindata / the initChaindata provisioning below have\n // already been validated: pass them through without re-validating\n if (isChaindataValidated(data)) return data as Chaindata\n if (data === lastInput) return lastOutput\n\n const start = performance.now()\n const validation = await parseChaindataFileChunked(data, { slicer })\n log.debug(\n \"[storageValidated$] Chaindata schema validation: %sms\",\n (performance.now() - start).toFixed(2)\n )\n if (!validation.success)\n log.warn(\"[storageValidated$] Chaindata schema validation failed\", {\n error: validation.error,\n })\n\n lastInput = data\n // schema is invalid, fallback to empty data\n lastOutput = validation.success ? markChaindataValidated(validation.data) : EMPTY_DATA\n return lastOutput\n }),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n\n return new Observable<Chaindata>((subscriber) => {\n const githubToStorageSubscription = githubChaindata$.subscribe({\n error: async () => {\n const storageData = await firstValueFrom(storageValidated$)\n\n if (\n storageData.networks.length ||\n storageData.tokens.length ||\n storageData.miniMetadatas.length\n )\n return log.info(\n \"[defaultChaindata$] DB is not empty, skipping initial data provision\",\n storageData\n )\n\n try {\n // if fetching from github fails, and if DB is empty, provision it with initial data\n log.info(\"[defaultChaindata$] Importing initial chaindata file\")\n const validation = await parseChaindataFileChunked(initChaindata)\n if (!validation.success) {\n log.error(\"[defaultChaindata$] initChaindata failed schema validation\", {\n error: validation.error,\n })\n return\n }\n storage$.next(markChaindataValidated(validation.data))\n log.info(\"[defaultChaindata$] Initial chaindata file imported successfully\")\n } catch (cause) {\n log.error(\"[defaultChaindata$] Failed to import initial chaindata file\", { cause })\n return\n }\n },\n next: async (githubData) => {\n const now = performance.now()\n try {\n const storageData = await firstValueFrom(storageValidated$)\n\n const shouldUpdate = !(await chaindataEqualWithYield(storageData, githubData))\n if (!shouldUpdate)\n return log.debug(\n `[defaultChaindata$] No db updates needed: ${performance.now() - now}ms`\n )\n\n // update local chaindata if github chaindata is different\n log.debug(\n `[defaultChaindata$] Updating chaindata in DB (networks:${githubData.networks.length}, tokens:${githubData.tokens.length}, meta:${githubData.miniMetadatas.length})`\n )\n storage$.next(githubData)\n\n log.info(`[defaultChaindata$] Db synchronized with GitHub :${performance.now() - now}ms`)\n } catch (cause) {\n log.error(\"[defaultChaindata$] Failed to sync chaindata\", { cause })\n }\n },\n })\n subscriber.add(githubToStorageSubscription)\n\n const outputFromStorageSubscription = storageValidated$.subscribe(subscriber)\n subscriber.add(outputFromStorageSubscription)\n }).pipe(shareReplay({ bufferSize: 1, refCount: true }))\n}\n","export const tryToDeleteOldChaindataDb = () => {\n try {\n // try and delete it if it's still there\n indexedDB.deleteDatabase(\"TalismanChaindataV4\")\n } catch {\n // dont care if it fails\n }\n}\n","import {\n arrayItemsEqualWithYield,\n forEachWithYield,\n isPromise,\n replaySubjectFrom,\n} from \"@talismn/util\"\nimport { isEqual, keyBy, values } from \"lodash-es\"\nimport {\n distinctUntilKeyChanged,\n firstValueFrom,\n map,\n type Observable,\n type ReplaySubject,\n shareReplay,\n} from \"rxjs\"\n\nimport {\n type AnyMiniMetadata,\n type DotNetwork,\n isNetworkOfPlatform,\n isTokenOfType,\n type Network,\n type NetworkId,\n type NetworkOfPlatform,\n type NetworkPlatform,\n type SubDTaoToken,\n subDTaoTokenId,\n type Token,\n type TokenId,\n type TokenOfType,\n TokenSchema,\n type TokenType,\n} from \"../chaindata\"\nimport log from \"../log\"\nimport { getCombinedChaindata$ } from \"../state/combinedChaindata\"\nimport { getDefaultChaindata$ } from \"../state/defaultChaindata\"\nimport { tryToDeleteOldChaindataDb } from \"../state/oldDb\"\nimport type { Chaindata, CustomChaindata } from \"../state/schema\"\nimport type { IChaindataProvider } from \"./ChaindataProviderInterface\"\n\n/**\n * This type will be used for in-memory storage of chaindata.\n *\n * Provide a Subject<ChaindataStorage> and subscribe to changes to persist the data to disk.\n * Instantiate ChaindataProvider with this subject to restore persisted data from disk.\n */\nexport type ChaindataStorage = {\n networks: Network[]\n tokens: Token[]\n miniMetadatas: AnyMiniMetadata[]\n}\n\n/** By default, chaindata will be stored in memory and not persisted. */\nconst DEFAULT_STORAGE: ChaindataStorage = {\n networks: [],\n tokens: [],\n miniMetadatas: [],\n}\n\nexport type ChaindataProviderOptions = {\n persistedStorage?: ChaindataStorage | Promise<ChaindataStorage | undefined>\n customChaindata$?: Observable<CustomChaindata> | CustomChaindata\n dynamicTokens$?: ReplaySubject<Token[]>\n}\n\nexport class ChaindataProvider implements IChaindataProvider {\n #storage$: ReplaySubject<ChaindataStorage>\n #chaindata$: Observable<Chaindata>\n #dynamicTokens$: ReplaySubject<Token[]>\n #dynamicTokensWriteQueue: Promise<unknown> = Promise.resolve()\n\n constructor({\n persistedStorage,\n customChaindata$,\n dynamicTokens$,\n }: ChaindataProviderOptions = {}) {\n tryToDeleteOldChaindataDb()\n\n // merge persistedStorage with DEFAULT_STORAGE to make sure there's no missing keys\n const mergedStorage = isPromise(persistedStorage)\n ? persistedStorage.then((storage) => ({ ...DEFAULT_STORAGE, ...storage }))\n : { ...DEFAULT_STORAGE, ...persistedStorage }\n this.#storage$ = replaySubjectFrom(mergedStorage)\n const defaultChaindata$ = getDefaultChaindata$(this.#storage$)\n\n this.#dynamicTokens$ = replaySubjectFrom(dynamicTokens$ ?? [])\n\n this.#chaindata$ = getCombinedChaindata$(\n defaultChaindata$,\n customChaindata$,\n this.#dynamicTokens$\n )\n }\n\n /**\n * Subscribe to this observable and save its contents somewhere persistent.\n *\n * Instantiate `new ChaindataProvider({ persistedStorage })` with the saved contents\n * to prevent the need to wait for them to download on every startup.\n */\n get storage$() {\n return this.#storage$.asObservable()\n }\n\n /**\n * Mini metadatas\n */\n\n get miniMetadatas$() {\n return this.#chaindata$.pipe(\n // reference compare is sufficient (and free): combinedChaindata's section\n // stabilizer reuses the previous array reference when the content is deep-equal\n distinctUntilKeyChanged(\"miniMetadatas\"),\n map(({ miniMetadatas }) => miniMetadatas),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n }\n\n async getMiniMetadatas() {\n return await wrapObservableWithGetter(\"Failed to get miniMetadatas\", this.miniMetadatas$)\n }\n\n get miniMetadatasMapById$() {\n return this.miniMetadatas$.pipe(\n map(itemsToMapById),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n }\n async getMiniMetadatasMapById() {\n return await wrapObservableWithGetter(\n \"Failed to get mini metadatas by id\",\n this.miniMetadatasMapById$\n )\n }\n\n getMiniMetadataById$(id: string) {\n return this.miniMetadatasMapById$.pipe(map((miniMetadatas) => miniMetadatas[id] ?? null))\n }\n\n async miniMetadataById(id: string) {\n return await wrapObservableWithGetter(\n \"Failed to get mini metadata by id\",\n this.getMiniMetadataById$(id)\n )\n }\n\n /**\n * Tokens\n */\n\n get tokens$() {\n return this.#chaindata$.pipe(\n // reference compare is sufficient (and free): combinedChaindata's section\n // stabilizer reuses the previous array reference when the content is deep-equal\n distinctUntilKeyChanged(\"tokens\"),\n map(({ tokens }) => tokens),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n }\n\n getTokens$<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(type?: T): Observable<R[]> {\n return this.tokens$.pipe(map(filterTokensByType(type))) as Observable<R[]>\n }\n\n async getTokens<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(type?: T): Promise<R[]> {\n return (await wrapObservableWithGetter(\"Failed to get tokens\", this.getTokens$(type))) as R[]\n }\n\n getTokenIds$(type?: TokenType) {\n return this.getTokens$(type).pipe(map(itemsToIds))\n }\n async getTokenIds(type?: TokenType) {\n return await wrapObservableWithGetter(\"Failed to get tokenIds\", this.getTokenIds$(type))\n }\n\n getTokensMapById$<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(type?: T): Observable<Record<TokenId, R>> {\n return this.getTokens$(type).pipe(map(itemsToMapById)) as Observable<Record<TokenId, R>>\n }\n async getTokensMapById<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(type?: T): Promise<Record<TokenId, R>> {\n return (await wrapObservableWithGetter(\n \"Failed to get tokens map by id\",\n this.getTokensMapById$(type)\n )) as Record<TokenId, R>\n }\n\n getTokenById$<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(id: TokenId, type?: T): Observable<R | null> {\n return this.getTokensMapById$(type).pipe(\n map((tokens) => tokens[id] ?? null)\n ) as Observable<R | null>\n }\n async getTokenById<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(id: TokenId, type?: T): Promise<R | null> {\n return (await wrapObservableWithGetter(\n \"Failed to get token by id\",\n this.getTokenById$(id, type)\n )) as R | null\n }\n\n /**\n * Serializes read-merge-write cycles on #dynamicTokens$: registrations come concurrently\n * from independent balance module pipelines (and syncDynamicTokens), and the cycles span\n * multiple awaits — interleaved cycles would both read the same snapshot and the later\n * write would silently drop the earlier one's newly added tokens.\n */\n #enqueueDynamicTokensWrite<T>(task: () => Promise<T>): Promise<T> {\n const result = this.#dynamicTokensWriteQueue.then(task)\n this.#dynamicTokensWriteQueue = result.catch(() => undefined)\n return result\n }\n\n /**\n * Registers token dynamically a runtime. used for SPL and dTAO tokens.\n * @param tokens\n */\n async registerDynamicTokens(tokens: Token[]) {\n if (!tokens.length) return\n\n // check schema (chunked — yields the thread between time slices, throws on invalid)\n await forEachWithYield(tokens, (t) => void TokenSchema.parse(t))\n\n await this.#enqueueDynamicTokensWrite(async () => {\n const currentStorage = await firstValueFrom(this.#dynamicTokens$)\n const currentById = keyBy<Token>(currentStorage, (t) => t.id)\n const newById = keyBy<Token>(tokens, (t) => t.id)\n const dynamicTokens = values<Token>({ ...currentById, ...newById }).sort((a, b) =>\n a.id.localeCompare(b.id)\n )\n\n // update only if necessary\n if (!(await arrayItemsEqualWithYield(currentStorage, dynamicTokens))) {\n this.#dynamicTokens$.next(dynamicTokens)\n }\n })\n }\n\n /**\n * dynamic tokens are created when they are first detected by the balance modules.\n * this method syncs their metadata (name, symbol, logo) with custom logic specific to each token type,\n * and removes dynamic entries that have since been curated into the default chaindata.\n */\n async syncDynamicTokens() {\n await this.#enqueueDynamicTokensWrite(async () => {\n const dynamicTokens = await firstValueFrom(this.#dynamicTokens$)\n if (!dynamicTokens.length) return\n\n // ids present in the default (curated) chaindata — used to drop dynamic\n // duplicates so curated metadata wins (combined chaindata applies last-wins\n // by id, so leaving a dynamic entry in place would shadow the curated one).\n const defaultStorage = await firstValueFrom(this.#storage$)\n const defaultTokenIds = new Set(defaultStorage.tokens.map((t) => t.id))\n\n const next: Token[] = []\n let changed = false\n\n for (const token of dynamicTokens) {\n // drop dynamic tokens whose ids are now curated by default chaindata\n if (\n (token.type === \"sol-spl\" || token.type === \"sol-token2022\") &&\n defaultTokenIds.has(token.id)\n ) {\n changed = true\n continue\n }\n\n if (token.type === \"substrate-dtao\") {\n const templateTokenId = subDTaoTokenId(token.networkId, token.netuid)\n const templateToken = await this.getTokenById(templateTokenId, \"substrate-dtao\")\n if (templateToken) {\n const updatedToken: SubDTaoToken = {\n ...token,\n symbol: templateToken.symbol,\n name: templateToken.name,\n logo: templateToken.logo,\n subnetName: templateToken.subnetName,\n }\n if (!isEqual(token, updatedToken)) {\n changed = true\n next.push(updatedToken)\n continue\n }\n }\n }\n\n next.push(token)\n }\n\n if (changed) {\n log.debug(\"[ChaindataProvider] syncDynamicTokens: updating dynamic tokens\", next)\n const sorted = next.slice().sort((a, b) => a.id.localeCompare(b.id))\n this.#dynamicTokens$.next(sorted)\n }\n })\n }\n\n /**\n * Networks\n */\n\n get networks$() {\n return this.#chaindata$.pipe(\n // reference compare is sufficient (and free): combinedChaindata's section\n // stabilizer reuses the previous array reference when the content is deep-equal\n distinctUntilKeyChanged(\"networks\"),\n map(({ networks }) => networks),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n }\n\n getNetworks$<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(platform?: P): Observable<R[]> {\n return this.networks$.pipe(map(filterNetworksByPlatform(platform))) as Observable<R[]>\n }\n async getNetworks<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(platform?: P): Promise<R[]> {\n return (await wrapObservableWithGetter(\n \"Failed to get networks\",\n this.getNetworks$(platform)\n )) as R[]\n }\n\n getNetworkIds$(platform?: NetworkPlatform) {\n return this.getNetworks$(platform).pipe(map(itemsToIds))\n }\n async getNetworkIds(platform?: NetworkPlatform) {\n return await wrapObservableWithGetter(\"Failed to get networkIds\", this.getNetworkIds$(platform))\n }\n\n getNetworksMapById$<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(platform?: P) {\n return this.getNetworks$(platform).pipe(map(itemsToMapById)) as Observable<Record<NetworkId, R>>\n }\n async getNetworksMapById<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(platform?: P): Promise<Record<NetworkId, R>> {\n return (await wrapObservableWithGetter(\n \"Failed to get networks by id\",\n this.getNetworksMapById$(platform)\n )) as Record<NetworkId, R>\n }\n\n getNetworksMapByGenesisHash$(): Observable<Record<`0x${string}`, DotNetwork>> {\n return this.getNetworks$(\"polkadot\").pipe(map(itemsToMapByGenesisHash))\n }\n async getNetworksMapByGenesisHash() {\n return await wrapObservableWithGetter(\n \"Failed to get networks by genesisHash\",\n this.getNetworksMapByGenesisHash$()\n )\n }\n\n getNetworkById$<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(networkId: NetworkId, platform?: P): Observable<R | null> {\n return this.getNetworksMapById$(platform).pipe(\n map((networksById) => networksById[networkId] ?? null)\n ) as Observable<R | null>\n }\n\n async getNetworkById<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(networkId: NetworkId, platform?: P): Promise<R | null> {\n return (await wrapObservableWithGetter(\n \"Failed to get network by id\",\n this.getNetworkById$(networkId, platform)\n )) as R | null\n }\n\n getNetworkByGenesisHash$(genesisHash: `0x${string}`) {\n return this.getNetworksMapByGenesisHash$().pipe(\n map((networksByGenesisHash) => networksByGenesisHash[genesisHash] ?? null)\n )\n }\n async getNetworkByGenesisHash(genesisHash: `0x${string}`) {\n return await wrapObservableWithGetter(\n \"Failed to get network by genesisHash\",\n this.getNetworkByGenesisHash$(genesisHash)\n )\n }\n}\n\n//\n// map from Item[] to another type\n//\n\nconst itemsToIds = <T extends { id: string }>(items: T[]): string[] => items.map(({ id }) => id)\n\n// ref-memo: tokens/networks arrays are reference-stable across emissions and subscriptions\n// (combinedChaindata's stabilizer), so the map is only rebuilt when the data actually changes\nconst mapByIdCache = new WeakMap<object, Record<string, unknown>>()\nconst itemsToMapById = <T extends { id: string }>(items: T[]): Record<string, T> => {\n const cached = mapByIdCache.get(items)\n if (cached) return cached as Record<string, T>\n const result = Object.fromEntries(items.map((item) => [item.id, item]))\n mapByIdCache.set(items, result)\n return result\n}\n\nconst itemsToMapByGenesisHash = <T extends { genesisHash: `0x${string}` | null }>(\n items: T[]\n): Record<`0x${string}`, T> =>\n Object.fromEntries(items.flatMap((item) => (item.genesisHash ? [[item.genesisHash, item]] : [])))\n\nconst filterTokensByType =\n <T extends TokenType | undefined, R extends T extends TokenType ? TokenOfType<T>[] : Token[]>(\n type: T\n ) =>\n (tokens: Token[]): R =>\n // pass the original array through when unfiltered, to keep it reference-stable\n // across emissions (itemsToMapById's ref-memo depends on it)\n (type ? tokens.filter((token) => isTokenOfType(token, type)) : tokens) as R\n\nconst filterNetworksByPlatform =\n <\n P extends NetworkPlatform | undefined,\n R extends P extends NetworkPlatform ? NetworkOfPlatform<P>[] : Network[],\n >(\n platform: P\n ) =>\n (networks: Network[]): R =>\n // pass the original array through when unfiltered (see filterTokensByType)\n (platform\n ? networks.filter((network) => isNetworkOfPlatform(network, platform))\n : networks) as R\n\n//\n// Utils to wrap Observable methods with one-shot Promise methods\n//\n\ntype ObservableReturnType<O> = O extends Observable<infer T> ? T : O\n\n// biome-ignore lint/suspicious/noExplicitAny: legacy\nconst wrapObservableWithGetter = async <O extends Observable<any>>(\n errorReason: string,\n observable: O\n): Promise<ObservableReturnType<O>> => {\n return await withErrorReason(errorReason, () => firstValueFrom(observable))\n}\n\nconst withErrorReason = async <T>(reason: string, task: () => Promise<T> | T): Promise<T> => {\n try {\n return await task()\n } catch (cause) {\n throw new Error(reason, { cause })\n }\n}\n","import { keyBy } from \"lodash-es\"\nimport z from \"zod/v4\"\n\nimport { AnyMiniMetadataSchema, NetworkSchema, TokenSchema } from \"../chaindata\"\n\nexport const ChaindataFileSchema = z\n .object({\n networks: z.array(NetworkSchema),\n tokens: z.array(TokenSchema),\n miniMetadatas: z.array(AnyMiniMetadataSchema),\n })\n .check((ctx) => {\n //ensure each network has a native token\n const tokensById = keyBy(ctx.value.tokens, (t) => t.id)\n for (const network of ctx.value.networks ?? []) {\n const nativeToken = tokensById[network.nativeTokenId]\n if (!nativeToken)\n ctx.issues.push({\n code: \"custom\",\n message: `Network ${network.id} has no native token`,\n input: ctx.value,\n path: [\"networks\", ctx.value.networks!.indexOf(network), \"nativeTokenId\"],\n })\n }\n })\n\nexport type Chaindata = z.infer<typeof ChaindataFileSchema>\n\nexport const CustomChaindataSchema = z\n .strictObject({\n networks: z.array(NetworkSchema).optional(),\n tokens: z.array(TokenSchema),\n })\n .check((ctx) => {\n //ensure each network has a native token\n const tokensById = keyBy(ctx.value.tokens, (t) => t.id)\n for (const network of ctx.value.networks ?? []) {\n const nativeToken = tokensById[network.nativeTokenId]\n if (!nativeToken)\n ctx.issues.push({\n code: \"custom\",\n message: `Network ${network.id} has no native token`,\n input: ctx.value,\n path: [\"networks\", ctx.value.networks!.indexOf(network), \"nativeTokenId\"],\n })\n }\n })\n\nexport type CustomChaindata = z.infer<typeof CustomChaindataSchema>\n","import { githubChaindataBaseUrl, githubChaindataTokensAssetsDir } from \"./constants\"\n\ntype KNOWN_TOKEN_ID = \"uniswap\"\n\nexport const getGithubTokenLogoUrl = (tokenId: KNOWN_TOKEN_ID): string => {\n return `${githubChaindataBaseUrl}/${githubChaindataTokensAssetsDir}/${tokenId}.svg`\n}\n\n/**\n * Use only if you are sure this token is supported by Talisman or the url might 404\n * @param coingeckoId\n * @returns\n */\nexport const getGithubTokenLogoUrlByCoingeckoId = (coingeckoId: string): string => {\n return `${githubChaindataBaseUrl}/assets/tokens/coingecko/${coingeckoId}.webp`\n}\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AE5BtD,MAAM,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"}
1
+ {"version":3,"file":"index.js","names":["z","z","z","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","z","LZString","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","TOKEN_TYPE","z","LZString","z","z","z","z","z","z","z","Dexie","packageJson.name","z","isNotNil","Observable","Observable","log","initChaindata","#storage$","#dynamicTokens$","#chaindata$","#dynamicTokensWriteQueue","#enqueueDynamicTokensWrite","z"],"sources":["../src/chaindata/shared/EthereumAddress.ts","../src/chaindata/shared/HexString.ts","../src/chaindata/shared/SolanaAddress.ts","../src/chaindata/tokens/TokenBase.ts","../src/chaindata/tokens/utils.ts","../src/chaindata/tokens/EvmErc20Token.ts","../src/chaindata/tokens/EvmNativeToken.ts","../src/chaindata/tokens/EvmUniswapV2Token.ts","../src/chaindata/tokens/SolNativeToken.ts","../src/chaindata/tokens/SolSplToken.ts","../src/chaindata/tokens/SolToken2022Token.ts","../src/chaindata/tokens/SubstrateAssetsToken.ts","../src/chaindata/tokens/SubstrateDTaoToken.ts","../src/chaindata/tokens/SubstrateForeignAssetsToken.ts","../src/chaindata/tokens/SubstrateHydrationToken.ts","../src/chaindata/tokens/SubstrateNativeToken.ts","../src/chaindata/tokens/SubstratePsp22Token.ts","../src/chaindata/tokens/SubstrateTokensToken.ts","../src/chaindata/tokens/Token.ts","../src/chaindata/networks/NetworkBase.ts","../src/chaindata/networks/DotNetwork.ts","../src/chaindata/networks/EthNetwork.ts","../src/chaindata/networks/SolNetwork.ts","../src/chaindata/networks/Network.ts","../src/chaindata/miniMetadata.ts","../src/chaindata/utils.ts","../src/constants.ts","../src/getBlockExplorerUrls.ts","../src/upgrades/2024-01-25-upgradeAddIsDefaultToExistingChains.ts","../src/upgrades/2024-01-25-upgradeRemoveSymbolFromNativeTokenId.ts","../src/legacy/TalismanChaindataDatabase.ts","../package.json","../src/log.ts","../src/state/chunkedValidation.ts","../src/state/combinedChaindata.ts","../src/state/validatedCache.ts","../src/state/net.ts","../src/state/githubChaindata.ts","../src/state/initChaindata.json","../src/state/defaultChaindata.ts","../src/state/oldDb.ts","../src/provider/ChaindataProvider.ts","../src/state/schema.ts","../src/util.ts"],"sourcesContent":["import z from \"zod/v4\"\n\nexport const EthereumAddressSchema = z\n .string()\n .regex(/^0x[a-fA-F0-9]{40}$/, { message: \"Invalid Ethereum address\" })\n .transform((val) => val as `0x${string}`)\n\nexport type EthereumAddress = z.infer<typeof EthereumAddressSchema>\n","import z from \"zod/v4\"\n\nexport const HexStringSchema = z\n .string()\n .regex(/^0x[a-fA-F0-9]+$/, { message: \"Invalid HexString\" })\n .transform((val) => val as `0x${string}`)\n\nexport type HexString = z.infer<typeof HexStringSchema>\n","import z from \"zod/v4\"\n\n// Solana addresses are base58-encoded 32-byte public keys\nconst SOLANA_ADDRESS_REGEX = /^[1-9A-HJ-NP-Za-km-z]{32,44}$/\n\nexport const SolanaAddressSchema = z\n .string()\n .regex(SOLANA_ADDRESS_REGEX, { message: \"Invalid Solana address\" })\n\nexport type SolanaAddress = z.infer<typeof SolanaAddressSchema>\n","import z from \"zod/v4\"\n\nexport const TokenBaseSchema = z.strictObject({\n id: z.string(),\n networkId: z.string(),\n isDefault: z.boolean().optional(),\n decimals: z.int().min(0),\n symbol: z.string().nonempty(),\n name: z.string().optional(),\n logo: z.string().optional(),\n coingeckoId: z.string().optional(),\n noDiscovery: z.boolean().optional(),\n mirrorOf: z.string().optional(),\n})\nexport type TokenBase = z.infer<typeof TokenBaseSchema>\n","export const generateTokenId = (...parts: string[]) => parts.join(\":\")\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport { EthereumAddressSchema } from \"../shared\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"evm-erc20\"\n\nexport const EvmErc20TokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"ethereum\"),\n contractAddress: EthereumAddressSchema,\n})\nexport type EvmErc20Token = z.infer<typeof EvmErc20TokenSchema>\n\nexport const EvmErc20BalancesConfigSchema = z.strictObject({})\n\nexport type EvmErc20BalancesConfig = z.infer<typeof EvmErc20BalancesConfigSchema>\n\nexport type EvmErc20TokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n contractAddress: `0x${string}`\n}\n\nexport const evmErc20TokenId = (networkId: string, contractAddress: `0x${string}`) =>\n generateTokenId(networkId, TOKEN_TYPE, contractAddress.toLowerCase())\n\nexport const parseEvmErc20TokenId = (tokenId: TokenId): EvmErc20TokenIdSpecs => {\n const [networkId, type, contractAddress] = tokenId.split(\":\")\n if (!networkId || !contractAddress) throw new Error(`Invalid EvmErc20Token ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid EvmErc20Token type: ${type}`)\n\n return {\n type,\n networkId,\n contractAddress: EthereumAddressSchema.parse(contractAddress),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"evm-native\"\n\nexport const EvmNativeTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"ethereum\"),\n})\nexport type EvmNativeToken = z.infer<typeof EvmNativeTokenSchema>\n\nexport const EvmNativeBalancesConfigSchema = z.strictObject({})\n\nexport type EvmNativeBalancesConfig = z.infer<typeof EvmNativeBalancesConfigSchema>\n\nexport type EvmNativeTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n}\n\nexport const evmNativeTokenId = (networkId: NetworkId) => generateTokenId(networkId, TOKEN_TYPE)\n\nexport const parseEvmNativeTokenId = (tokenId: TokenId): EvmNativeTokenIdSpecs => {\n const [networkId, type] = tokenId.split(\":\")\n if (!networkId || type !== TOKEN_TYPE) throw new Error(`Invalid EvmNativeToken ID: ${tokenId}`)\n\n return { type, networkId }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport { EthereumAddressSchema } from \"../shared\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"evm-uniswapv2\"\n\nexport const EvmUniswapV2TokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"ethereum\"),\n contractAddress: EthereumAddressSchema,\n isCustom: z.boolean().optional(),\n symbol0: z.string().nonempty(),\n symbol1: z.string().nonempty(),\n decimals0: z.int().min(0),\n decimals1: z.int().min(0),\n tokenAddress0: EthereumAddressSchema,\n tokenAddress1: EthereumAddressSchema,\n coingeckoId0: z.string().optional(),\n coingeckoId1: z.string().optional(),\n})\nexport type EvmUniswapV2Token = z.infer<typeof EvmUniswapV2TokenSchema>\n\nexport const EvmUniswapV2BalancesConfigSchema = z.strictObject({})\n\nexport type EvmUniswapV2BalancesConfig = z.infer<typeof EvmUniswapV2BalancesConfigSchema>\n\nexport type EvmUniswapV2TokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n contractAddress: `0x${string}`\n}\n\nexport const evmUniswapV2TokenId = (\n networkId: NetworkId,\n contractAddress: EvmUniswapV2Token[\"contractAddress\"]\n) => generateTokenId(networkId, TOKEN_TYPE, contractAddress.toLowerCase())\n\nexport const parseEvmUniswapV2TokenId = (tokenId: TokenId): EvmUniswapV2TokenIdSpecs => {\n const [networkId, type, contractAddress] = tokenId.split(\":\")\n if (!networkId || !contractAddress) throw new Error(`Invalid EvmUniswapV2Token ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid EvmUniswapV2Token type: ${type}`)\n\n return {\n type,\n networkId,\n contractAddress: EthereumAddressSchema.parse(contractAddress),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { SolNetworkId } from \"../networks/SolNetwork\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"sol-native\"\n\nexport const SolNativeTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"solana\"),\n})\nexport type SolNativeToken = z.infer<typeof SolNativeTokenSchema>\n\nexport const SolNativeBalancesConfigSchema = z.strictObject({})\n\nexport type SolNativeBalancesConfig = z.infer<typeof SolNativeBalancesConfigSchema>\n\nexport type SolNativeTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: SolNetworkId\n}\n\nexport const solNativeTokenId = (networkId: SolNetworkId) => generateTokenId(networkId, TOKEN_TYPE)\n\nexport const parseSolNativeTokenId = (tokenId: TokenId): SolNativeTokenIdSpecs => {\n const [networkId, type] = tokenId.split(\":\")\n if (!networkId || type !== TOKEN_TYPE) throw new Error(`Invalid SolNativeToken ID: ${tokenId}`)\n\n return { type, networkId }\n}\n","import z from \"zod/v4\"\n\nimport type { SolNetworkId } from \"../networks\"\nimport { SolanaAddressSchema } from \"../shared\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"sol-spl\"\n\nexport const SolSplTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"solana\"),\n mintAddress: SolanaAddressSchema,\n})\nexport type SolSplToken = z.infer<typeof SolSplTokenSchema>\n\nexport const SolSplBalancesConfigSchema = z.strictObject({})\n\nexport type SolSplBalancesConfig = z.infer<typeof SolSplBalancesConfigSchema>\n\nexport type SolSplTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: SolNetworkId\n mintAddress: string\n}\n\nexport const solSplTokenId = (networkId: string, mintAddress: string) =>\n generateTokenId(networkId, TOKEN_TYPE, mintAddress)\n\nexport const parseSolSplTokenId = (tokenId: TokenId): SolSplTokenIdSpecs => {\n const [networkId, type, mintAddress] = tokenId.split(\":\")\n if (!networkId || !mintAddress) throw new Error(`Invalid SolSplToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SolSplToken type: ${type}`)\n\n return {\n type,\n networkId,\n mintAddress: SolanaAddressSchema.parse(mintAddress),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { SolNetworkId } from \"../networks\"\nimport { SolanaAddressSchema } from \"../shared\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"sol-token2022\"\n\nexport const SolToken2022TokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"solana\"),\n mintAddress: SolanaAddressSchema,\n isTransferable: z.boolean().optional(),\n})\nexport type SolToken2022Token = z.infer<typeof SolToken2022TokenSchema>\n\nexport const SolToken2022BalancesConfigSchema = z.strictObject({})\n\nexport type SolToken2022BalancesConfig = z.infer<typeof SolToken2022BalancesConfigSchema>\n\nexport type SolToken2022TokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: SolNetworkId\n mintAddress: string\n}\n\nexport const solToken2022TokenId = (networkId: string, mintAddress: string) =>\n generateTokenId(networkId, TOKEN_TYPE, mintAddress)\n\nexport const parseSolToken2022TokenId = (tokenId: TokenId): SolToken2022TokenIdSpecs => {\n const [networkId, type, mintAddress] = tokenId.split(\":\")\n if (!networkId || !mintAddress) throw new Error(`Invalid SolToken2022Token ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SolToken2022Token type: ${type}`)\n\n return {\n type,\n networkId,\n mintAddress: SolanaAddressSchema.parse(mintAddress),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-assets\"\n\nexport const SubAssetsTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n // number when used with papi - uint32 in theory (on asset hubs) but astar implemented it to u128 which makes it incompatible with number type\n assetId: z.union([z.uint32(), z.string()]).transform(String),\n isFrozen: z.boolean().optional(),\n isSufficient: z.boolean(),\n existentialDeposit: z.string(),\n})\nexport type SubAssetsToken = z.infer<typeof SubAssetsTokenSchema>\n\nexport const SubAssetsBalancesConfigSchema = z.strictObject({})\n\nexport type SubAssetsBalancesConfig = z.infer<typeof SubAssetsBalancesConfigSchema>\n\nexport type SubAssetTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n assetId: string\n}\n\nexport const subAssetTokenId = (networkId: NetworkId, assetId: string) =>\n generateTokenId(networkId, TOKEN_TYPE, assetId)\n\nexport const parseSubAssetTokenId = (tokenId: TokenId): SubAssetTokenIdSpecs => {\n const [networkId, type, assetId] = tokenId.split(\":\")\n if (!networkId || !assetId) throw new Error(`Invalid SubAssetsToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubAssetsToken type: ${type}`)\n\n return {\n type,\n networkId,\n assetId: SubAssetsTokenSchema.shape.assetId.parse(assetId),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-dtao\"\n\nexport const SubDTaoTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n netuid: z.number().int(),\n subnetName: z.string().optional(),\n\n // hotkey is set only for dynamic tokens (provisionned at runtime)\n hotkey: z.string().optional(),\n isTransferable: z.boolean().default(true),\n})\nexport type SubDTaoToken = z.infer<typeof SubDTaoTokenSchema>\n\nexport const SubDTaoBalancesConfigSchema = z.strictObject({})\n\nexport type SubDTaoBalancesConfig = z.infer<typeof SubDTaoBalancesConfigSchema>\n\nexport type SubDTaoTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n netuid: number\n hotkey?: string\n}\n\nexport const subDTaoTokenId = (networkId: NetworkId, subnetId: number, hotkey?: string) =>\n hotkey\n ? generateTokenId(networkId, TOKEN_TYPE, String(subnetId), hotkey)\n : generateTokenId(networkId, TOKEN_TYPE, String(subnetId))\n\nexport const parseSubDTaoTokenId = (tokenId: TokenId): SubDTaoTokenIdSpecs => {\n const [networkId, type, netuid, hotkey] = tokenId.split(\":\")\n if (!networkId || !netuid) throw new Error(`Invalid SubDTaoToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubDTaoToken type: ${type}`)\n\n return {\n type,\n networkId,\n netuid: SubDTaoTokenSchema.shape.netuid.parse(Number(netuid)),\n hotkey,\n }\n}\n","import LZString from \"lz-string\"\nimport z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nexport const TOKEN_TYPE = \"substrate-foreignassets\"\n\nexport const SubForeignAssetsTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n onChainId: z.string(),\n isFrozen: z.boolean().optional(),\n isSufficient: z.boolean(),\n existentialDeposit: z.string(),\n})\nexport type SubForeignAssetsToken = z.infer<typeof SubForeignAssetsTokenSchema>\n\nexport const SubForeignAssetsBalancesConfigSchema = z.strictObject({})\n\nexport type SubForeignAssetsBalancesConfig = z.infer<typeof SubForeignAssetsBalancesConfigSchema>\n\nexport type ForeignAssetsTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n onChainId: string\n}\n\nexport const subForeignAssetTokenId = (networkId: NetworkId, onChainId: string) =>\n generateTokenId(networkId, TOKEN_TYPE, LZString.compressToEncodedURIComponent(onChainId))\n\nexport const parseSubForeignAssetTokenId = (tokenId: TokenId): ForeignAssetsTokenIdSpecs => {\n const [networkId, type, onChainId] = tokenId.split(\":\")\n if (!networkId || !onChainId) throw new Error(`Invalid SubForeignAssetsToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubForeignAssetsToken type: ${type}`)\n\n return {\n type,\n networkId,\n onChainId: LZString.decompressFromEncodedURIComponent(onChainId) || \"\",\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-hydration\"\n\nexport const SubHydrationTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n onChainId: z.uint32(),\n assetType: z.enum([\"Token\", \"Erc20\", \"External\"]),\n isSufficient: z.boolean(),\n existentialDeposit: z.string(),\n})\nexport type SubHydrationToken = z.infer<typeof SubHydrationTokenSchema>\n\nexport const SubHydrationBalancesConfigSchema = z.strictObject({})\n\nexport type SubHydrationBalancesConfig = z.infer<typeof SubHydrationBalancesConfigSchema>\n\nexport type SubHydrationTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n onChainId: number\n}\n\nexport const subHydrationTokenId = (networkId: NetworkId, onChainId: number) =>\n generateTokenId(networkId, TOKEN_TYPE, String(onChainId))\n\nexport const parseSubHydrationTokenId = (tokenId: string): SubHydrationTokenIdSpecs => {\n const [networkId, type, onChainId] = tokenId.split(\":\")\n if (!networkId || !onChainId) throw new Error(`Invalid ${TOKEN_TYPE} ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid ${TOKEN_TYPE} type: ${type}`)\n\n return {\n type,\n networkId,\n onChainId: Number(onChainId),\n }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-native\"\n\nexport const SubNativeTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n existentialDeposit: z.string(),\n})\nexport type SubNativeToken = z.infer<typeof SubNativeTokenSchema>\n\nexport const SubNativeBalancesConfigSchema = z.object({\n disable: z.boolean().optional(),\n})\n\nexport type SubNativeBalancesConfig = z.infer<typeof SubNativeBalancesConfigSchema>\n\nexport type SubNativeTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n}\n\nexport const subNativeTokenId = (networkId: NetworkId) => generateTokenId(networkId, TOKEN_TYPE)\n\nexport const parseSubNativeTokenId = (tokenId: TokenId): SubNativeTokenIdSpecs => {\n const [networkId, type] = tokenId.split(\":\")\n if (!networkId || type !== TOKEN_TYPE) throw new Error(`Invalid SubNativeToken ID: ${tokenId}`)\n\n return { type, networkId }\n}\n","import z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport type { TokenId } from \"./Token\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-psp22\"\n\nexport const SubPsp22TokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n contractAddress: z.string().nonempty(),\n})\nexport type SubPsp22Token = z.infer<typeof SubPsp22TokenSchema>\n\nexport const SubPsp22BalancesConfigSchema = z.strictObject({})\n\nexport type SubPsp22BalancesConfig = z.infer<typeof SubPsp22BalancesConfigSchema>\n\nexport type SubPsp22TokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n contractAddress: string\n}\n\nexport const subPsp22TokenId = (networkId: NetworkId, contractAddress: string) =>\n generateTokenId(networkId, TOKEN_TYPE, contractAddress.toLowerCase())\n\nexport const parseSubPsp22TokenId = (tokenId: TokenId): SubPsp22TokenIdSpecs => {\n const [networkId, type, contractAddress] = tokenId.split(\":\")\n if (!networkId || !contractAddress) throw new Error(`Invalid SubPsp22Token ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubPsp22Token type: ${type}`)\n\n return {\n type,\n networkId,\n contractAddress,\n }\n}\n","import LZString from \"lz-string\"\nimport z from \"zod/v4\"\n\nimport type { NetworkId } from \"../networks\"\nimport { TokenBaseSchema } from \"./TokenBase\"\nimport { generateTokenId } from \"./utils\"\n\nconst TOKEN_TYPE = \"substrate-tokens\"\n\nexport const SubTokensTokenSchema = TokenBaseSchema.extend({\n type: z.literal(TOKEN_TYPE),\n platform: z.literal(\"polkadot\"),\n onChainId: z.union([z.string(), z.number()]),\n existentialDeposit: z.string(),\n})\nexport type SubTokensToken = z.infer<typeof SubTokensTokenSchema>\n\nexport const SubTokensBalancesConfigSchema = z.object({\n palletId: z.string().optional(),\n})\n\nexport type SubTokensBalancesConfig = z.infer<typeof SubTokensBalancesConfigSchema>\n\nexport type SubTokensTokenIdSpecs = {\n type: typeof TOKEN_TYPE\n networkId: NetworkId\n onChainId: string\n}\n\nexport const subTokensTokenId = (networkId: NetworkId, onChainId: string | number) =>\n generateTokenId(networkId, TOKEN_TYPE, LZString.compressToEncodedURIComponent(String(onChainId)))\n\nexport const parseSubTokensTokenId = (tokenId: string): SubTokensTokenIdSpecs => {\n const [networkId, type, onChainId] = tokenId.split(\":\")\n if (!networkId || !onChainId) throw new Error(`Invalid SubTokensToken ID: ${tokenId}`)\n if (type !== TOKEN_TYPE) throw new Error(`Invalid SubTokensToken type: ${type}`)\n\n return {\n type,\n networkId,\n onChainId: LZString.decompressFromEncodedURIComponent(onChainId) || \"\",\n }\n}\n","import z from \"zod/v4\"\n\nimport { type EvmErc20TokenIdSpecs, EvmErc20TokenSchema } from \"./EvmErc20Token\"\nimport { type EvmNativeTokenIdSpecs, EvmNativeTokenSchema } from \"./EvmNativeToken\"\nimport { type EvmUniswapV2TokenIdSpecs, EvmUniswapV2TokenSchema } from \"./EvmUniswapV2Token\"\nimport { type SolNativeToken, SolNativeTokenSchema } from \"./SolNativeToken\"\nimport { type SolSplToken, SolSplTokenSchema } from \"./SolSplToken\"\nimport { type SolToken2022Token, SolToken2022TokenSchema } from \"./SolToken2022Token\"\nimport { SubAssetsTokenSchema, type SubAssetTokenIdSpecs } from \"./SubstrateAssetsToken\"\nimport { type SubDTaoTokenIdSpecs, SubDTaoTokenSchema } from \"./SubstrateDTaoToken\"\nimport {\n type ForeignAssetsTokenIdSpecs,\n SubForeignAssetsTokenSchema,\n} from \"./SubstrateForeignAssetsToken\"\nimport { type SubHydrationToken, SubHydrationTokenSchema } from \"./SubstrateHydrationToken\"\nimport { type SubNativeTokenIdSpecs, SubNativeTokenSchema } from \"./SubstrateNativeToken\"\nimport { type SubPsp22TokenIdSpecs, SubPsp22TokenSchema } from \"./SubstratePsp22Token\"\nimport { type SubTokensTokenIdSpecs, SubTokensTokenSchema } from \"./SubstrateTokensToken\"\n\n/**\n * The `Token` sum type, which is a union of all of the possible `TokenTypes`.\n */\nexport const TokenSchemaBase = z.discriminatedUnion(\"type\", [\n EvmErc20TokenSchema,\n EvmNativeTokenSchema,\n EvmUniswapV2TokenSchema,\n SubAssetsTokenSchema,\n SubDTaoTokenSchema,\n SubForeignAssetsTokenSchema,\n SubNativeTokenSchema,\n SubPsp22TokenSchema,\n SubTokensTokenSchema,\n SubHydrationTokenSchema,\n SolNativeTokenSchema,\n SolSplTokenSchema,\n SolToken2022TokenSchema,\n])\n\nexport const TokenTypeSchema = z.enum(TokenSchemaBase.options.map((t) => t.shape.type.value))\n\nexport type Token = z.infer<typeof TokenSchemaBase>\n\nexport type TokenId = Token[\"id\"]\n\nexport type TokenList = Record<TokenId, Token>\n\nexport type TokenType = z.infer<typeof TokenTypeSchema>\n\nexport type TokenIdSpecs<T extends TokenType> = T extends \"evm-erc20\"\n ? EvmErc20TokenIdSpecs\n : T extends \"evm-native\"\n ? EvmNativeTokenIdSpecs\n : T extends \"evm-uniswapv2\"\n ? EvmUniswapV2TokenIdSpecs\n : T extends \"substrate-assets\"\n ? SubAssetTokenIdSpecs\n : T extends \"substrate-dtao\"\n ? SubDTaoTokenIdSpecs\n : T extends \"substrate-foreignassets\"\n ? ForeignAssetsTokenIdSpecs\n : T extends \"substrate-native\"\n ? SubNativeTokenIdSpecs\n : T extends \"substrate-psp22\"\n ? SubPsp22TokenIdSpecs\n : T extends \"substrate-tokens\"\n ? SubTokensTokenIdSpecs\n : T extends \"substrate-hydration\"\n ? SubHydrationToken\n : T extends \"sol-native\"\n ? SolNativeToken\n : T extends \"sol-spl\"\n ? SolSplToken\n : T extends \"sol-token2022\"\n ? SolToken2022Token\n : never\n\n// transform to control in which order properties are output as JSON when parsed from schema\nexport const TokenSchema = TokenSchemaBase.transform((token: Token): Token => {\n // reorder properties for easier reading\n const {\n id,\n platform,\n networkId,\n type,\n symbol,\n decimals,\n name,\n coingeckoId,\n logo,\n isDefault,\n mirrorOf,\n noDiscovery,\n } = token\n\n return Object.assign(\n // appropriate order of base properties\n {\n id,\n platform,\n networkId,\n type,\n symbol,\n decimals,\n name,\n coingeckoId,\n logo,\n isDefault,\n mirrorOf,\n noDiscovery,\n },\n // token type specifics go after\n token\n )\n})\n","import { z } from \"zod/v4\"\n\nexport const NetworkBaseSchema = z.strictObject({\n id: z.string().nonempty(),\n isTestnet: z.boolean().optional(),\n isDefault: z.boolean().optional(),\n forceScan: z.boolean().optional(),\n name: z.string().nonempty(),\n logo: z.string().nonempty().optional(),\n nativeTokenId: z.string().nonempty(),\n nativeCurrency: z.strictObject({\n decimals: z.uint32(),\n symbol: z.string().nonempty(),\n name: z.string().nonempty(),\n coingeckoId: z.string().optional(),\n mirrorOf: z.string().optional(),\n logo: z.string().optional(),\n }),\n themeColor: z.string().nonempty().optional(),\n blockExplorerUrls: z.array(z.url({ protocol: /^https?$/ })).default([]),\n})\nexport type NetworkBase = z.infer<typeof NetworkBaseSchema>\n","import z from \"zod/v4\"\n\nimport { HexStringSchema } from \"../shared\"\nimport {\n SubAssetsBalancesConfigSchema,\n SubDTaoBalancesConfigSchema,\n SubForeignAssetsBalancesConfigSchema,\n SubHydrationBalancesConfigSchema,\n SubNativeBalancesConfigSchema,\n SubPsp22BalancesConfigSchema,\n SubTokensBalancesConfigSchema,\n} from \"../tokens\"\nimport { NetworkBaseSchema } from \"./NetworkBase\"\n\nexport const DotNetworkBalancesConfigSchema = z.strictObject({\n \"substrate-native\": SubNativeBalancesConfigSchema.optional(),\n \"substrate-assets\": SubAssetsBalancesConfigSchema.optional(),\n \"substrate-psp22\": SubPsp22BalancesConfigSchema.optional(),\n \"substrate-tokens\": SubTokensBalancesConfigSchema.optional(),\n \"substrate-foreignassets\": SubForeignAssetsBalancesConfigSchema.optional(),\n \"substrate-hydration\": SubHydrationBalancesConfigSchema.optional(),\n \"substrate-dtao\": SubDTaoBalancesConfigSchema.optional(),\n})\n\nexport type DotNetworkBalancesConfig = z.infer<typeof DotNetworkBalancesConfigSchema>\n\nexport const DotNetworkTopologySchema = z.discriminatedUnion(\"type\", [\n z.strictObject({ type: z.literal(\"standalone\") }),\n z.strictObject({ type: z.literal(\"relay\") }),\n z.strictObject({\n type: z.literal(\"parachain\"),\n relayId: z.string().nonempty(),\n paraId: z.number().int(),\n }),\n])\n\nexport const DotNetworkSchema = NetworkBaseSchema.extend({\n genesisHash: HexStringSchema,\n platform: z.literal(\"polkadot\"),\n chainName: z.string(), // system_chain - used only to lookup typesBundle in p.js, for chains that do not have metadata v14\n specName: z.string(),\n specVersion: z.uint32().describe(\"Don't trust it, it might not be up to date\"),\n account: z.enum([\"secp256k1\", \"*25519\"]),\n chainspecQrUrl: z.string().nonempty().optional(),\n latestMetadataQrUrl: z.string().nonempty().optional(),\n prefix: z.number(),\n oldPrefix: z.number().optional(),\n rpcs: z.array(z.url({ protocol: /^wss?$/ })),\n registryTypes: z.any().optional(),\n signedExtensions: z.any().optional(),\n hasCheckMetadataHash: z.boolean().optional(),\n hasExtrinsicSignatureTypePrefix: z.boolean().optional(),\n isUnknownFeeToken: z.boolean().optional(),\n topology: DotNetworkTopologySchema,\n balancesConfig: DotNetworkBalancesConfigSchema.optional(),\n})\n\nexport type DotNetwork = z.infer<typeof DotNetworkSchema>\n\nexport type DotNetworkId = DotNetwork[\"id\"]\n\nexport type DotNetworkList = Record<DotNetworkId, DotNetwork>\n","import z from \"zod/v4\"\n\nimport { EthereumAddressSchema } from \"../shared\"\nimport {\n EvmErc20BalancesConfigSchema,\n EvmNativeBalancesConfigSchema,\n EvmUniswapV2BalancesConfigSchema,\n} from \"../tokens\"\nimport { NetworkBaseSchema } from \"./NetworkBase\"\n\nexport const EthNetworkBalancesConfigSchema = z.strictObject({\n \"evm-native\": EvmNativeBalancesConfigSchema.optional(),\n \"evm-erc20\": EvmErc20BalancesConfigSchema.optional(),\n \"evm-uniswapv2\": EvmUniswapV2BalancesConfigSchema.optional(),\n})\n\nexport type EthNetworkBalancesConfig = z.infer<typeof EthNetworkBalancesConfigSchema>\n\nconst ContractsSchema = z.strictObject({\n Erc20Aggregator: EthereumAddressSchema.optional(),\n Multicall3: EthereumAddressSchema.optional(),\n})\n\nconst L2FeeSchema = z.discriminatedUnion(\"type\", [\n z.strictObject({\n type: z.literal(\"op-stack\"),\n }),\n z.strictObject({\n type: z.literal(\"scroll\"),\n l1GasPriceOracle: EthereumAddressSchema,\n }),\n])\n\nexport const EthNetworkSchema = NetworkBaseSchema.extend({\n platform: z.literal(\"ethereum\"),\n substrateChainId: z.string().optional(),\n preserveGasEstimate: z.boolean().optional(),\n rpcs: z.array(z.url({ protocol: /^https?$/ })),\n feeType: z.enum([\"legacy\", \"eip-1559\"]).optional(),\n l2FeeType: L2FeeSchema.optional(),\n contracts: ContractsSchema.optional(),\n balancesConfig: EthNetworkBalancesConfigSchema.optional(),\n})\n\nexport type EthNetwork = z.infer<typeof EthNetworkSchema>\n\nexport type EthNetworkId = EthNetwork[\"id\"]\n\nexport type EthNetworkList = Record<EthNetworkId, EthNetwork>\n","import z from \"zod/v4\"\n\nimport {\n SolNativeBalancesConfigSchema,\n SolSplBalancesConfigSchema,\n SolToken2022BalancesConfigSchema,\n} from \"../tokens\"\nimport { NetworkBaseSchema } from \"./NetworkBase\"\n\nexport const SolNetworkBalancesConfigSchema = z.strictObject({\n \"sol-native\": SolNativeBalancesConfigSchema.optional(),\n \"sol-spl\": SolSplBalancesConfigSchema.optional(),\n \"sol-token2022\": SolToken2022BalancesConfigSchema.optional(),\n})\n\nexport type SolNetworkBalancesConfig = z.infer<typeof SolNetworkBalancesConfigSchema>\n\nexport const SolNetworkSchema = NetworkBaseSchema.extend({\n platform: z.literal(\"solana\"),\n genesisHash: z.string(),\n rpcs: z.array(z.url({ protocol: /^https?$/ })),\n balancesConfig: SolNetworkBalancesConfigSchema.optional(),\n})\n\nexport type SolNetwork = z.infer<typeof SolNetworkSchema>\n\nexport type SolNetworkId = SolNetwork[\"id\"]\n\nexport type SolNetworkList = Record<SolNetworkId, SolNetwork>\n","import z from \"zod/v4\"\n\nimport { DotNetworkSchema } from \"./DotNetwork\"\nimport { EthNetworkSchema } from \"./EthNetwork\"\nimport { SolNetworkSchema } from \"./SolNetwork\"\n\nexport const NetworkSchema = z.discriminatedUnion(\"platform\", [\n DotNetworkSchema,\n EthNetworkSchema,\n SolNetworkSchema,\n])\n\nexport type Network = z.infer<typeof NetworkSchema>\n\nexport type NetworkId = Network[\"id\"]\n\nexport type NetworkPlatform = Network[\"platform\"]\n\nexport type NetworkList = Record<NetworkId, Network>\n","import z from \"zod/v4\"\n\nimport { DotNetworkSchema } from \"./networks\"\nimport { HexStringSchema } from \"./shared\"\n\nexport const AnyMiniMetadataSchema = z.strictObject({\n /** The DB id for this metadata */\n id: z.string().nonempty(),\n /** The balance module which created this miniMetadata */\n source: z.string().nonempty(), // TODO make it an enum of balance module types ?\n /** The chain this miniMetadata came from */\n chainId: DotNetworkSchema.shape.id,\n /** The chain specVersion which this miniMetadata is valid for */\n specVersion: DotNetworkSchema.shape.specVersion,\n /** the version of the balances library used to craft the mini metadata */\n version: z.string().nonempty(),\n /** The miniMetadata encoded as a hex string */\n data: HexStringSchema.nullable(),\n // /** module specific information about the chain, such as pallet ids for specific features */\n extra: z.any().nullable(),\n})\n\nexport type AnyMiniMetadata = z.infer<typeof AnyMiniMetadataSchema>\n","import type { DotNetwork, Network, NetworkPlatform } from \"./networks\"\nimport {\n EvmNativeTokenSchema,\n parseEvmErc20TokenId,\n parseEvmNativeTokenId,\n parseEvmUniswapV2TokenId,\n parseSolSplTokenId,\n parseSolToken2022TokenId,\n parseSubAssetTokenId,\n parseSubDTaoTokenId,\n parseSubForeignAssetTokenId,\n parseSubHydrationTokenId,\n parseSubNativeTokenId,\n parseSubPsp22TokenId,\n parseSubTokensTokenId,\n SubNativeTokenSchema,\n type Token,\n type TokenId,\n type TokenIdSpecs,\n type TokenType,\n} from \"./tokens\"\nimport { parseSolNativeTokenId, SolNativeTokenSchema } from \"./tokens/SolNativeToken\"\n\nexport type NetworkOfPlatform<P extends NetworkPlatform> = Extract<Network, { platform: P }>\n\nexport const isNetworkOfPlatform = <P extends NetworkPlatform>(\n network: Network | null | undefined,\n platform: P\n): network is Extract<Network, { platform: P }> => {\n return !!network && network.platform === platform\n}\n\nexport const isNetworkInPlatforms = <P extends NetworkPlatform[]>(\n network: Network | null | undefined,\n platforms: P\n): network is NetworkOfPlatform<P[number]> => {\n return platforms.some((platform) => isNetworkOfPlatform(network, platform))\n}\n\nexport const isNetworkDot = (network: Network | null | undefined) => {\n return isNetworkOfPlatform(network, \"polkadot\")\n}\n\nexport const isNetworkEth = (network: Network | null | undefined) => {\n return isNetworkOfPlatform(network, \"ethereum\")\n}\n\nexport const isNetworkSol = (network: Network | null | undefined) => {\n return isNetworkOfPlatform(network, \"solana\")\n}\n\nexport const getNetworkGenesisHash = <\n Net extends Network,\n Res = Net extends DotNetwork ? DotNetwork[\"genesisHash\"] : undefined,\n>(\n network: Net | null | undefined\n): Res => {\n return (isNetworkDot(network) ? network.genesisHash : undefined) as Res\n}\n\nexport type TokenOfType<T extends TokenType> = Extract<Token, { type: T }>\nexport type TokenOfPlatform<P extends NetworkPlatform> = Extract<Token, { platform: P }>\nexport type DotToken = TokenOfPlatform<\"polkadot\">\nexport type EthToken = TokenOfPlatform<\"ethereum\">\nexport type SolToken = TokenOfPlatform<\"solana\">\n\nexport const isTokenOfPlatform = <P extends NetworkPlatform>(\n token: Token | null | undefined,\n platform: P\n): token is TokenOfPlatform<P> => {\n return !!token && token.platform === platform\n}\n\nexport const isTokenEth = (token: Token | null | undefined) => {\n return isTokenOfPlatform(token, \"ethereum\")\n}\n\nexport const isTokenDot = (token: Token | null | undefined) => {\n return isTokenOfPlatform(token, \"polkadot\")\n}\n\nexport const isTokenSol = (token: Token | null | undefined) => {\n return isTokenOfPlatform(token, \"solana\")\n}\n\nexport const isTokenNeedExistentialDeposit = (token: Token) => \"existentialDeposit\" in token\n\nexport const isTokenOfType = <T extends TokenType>(\n token: Token | null | undefined,\n type: T\n): token is TokenOfType<T> => {\n return !!token && token.type === type\n}\n\nexport const isTokenInTypes = <T extends TokenType[]>(\n token: Token | null | undefined,\n types: T\n): token is TokenOfType<T[number]> => {\n return types.some((type) => isTokenOfType(token, type))\n}\n\nexport const isTokenSubNative = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-native\")\n}\n\nexport const isTokenSubAssets = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-assets\")\n}\n\nexport const isTokenSubDTao = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-dtao\")\n}\n\nexport const isTokenSubForeignAssets = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-foreignassets\")\n}\n\nexport const isTokenSubPsp22 = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-psp22\")\n}\n\nexport const isTokenSubTokens = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-tokens\")\n}\n\nexport const isTokenSubHydration = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"substrate-hydration\")\n}\n\nexport const isTokenEvmNative = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"evm-native\")\n}\n\nexport const isTokenEvmErc20 = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"evm-erc20\")\n}\n\nexport const isTokenEvmUniswapV2 = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"evm-uniswapv2\")\n}\n\nexport const isTokenSolSpl = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"sol-spl\")\n}\n\nexport const isTokenSolToken2022 = (token: Token | null | undefined) => {\n return isTokenOfType(token, \"sol-token2022\")\n}\n\nexport const parseTokenId = <T extends TokenType>(tokenId: TokenId): TokenIdSpecs<T> => {\n const parts = tokenId.split(\":\")\n if (parts.length < 2) throw new Error(`Invalid TokenId: ${tokenId}`)\n\n const type = parts[1] as TokenType\n\n switch (type) {\n case \"evm-native\":\n return parseEvmNativeTokenId(tokenId) as TokenIdSpecs<T>\n case \"evm-erc20\":\n return parseEvmErc20TokenId(tokenId) as TokenIdSpecs<T>\n case \"evm-uniswapv2\":\n return parseEvmUniswapV2TokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-native\":\n return parseSubNativeTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-psp22\":\n return parseSubPsp22TokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-assets\":\n return parseSubAssetTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-foreignassets\":\n return parseSubForeignAssetTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-dtao\":\n return parseSubDTaoTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-tokens\":\n return parseSubTokensTokenId(tokenId) as TokenIdSpecs<T>\n case \"substrate-hydration\":\n return parseSubHydrationTokenId(tokenId) as TokenIdSpecs<T>\n case \"sol-native\":\n return parseSolNativeTokenId(tokenId) as TokenIdSpecs<T>\n case \"sol-spl\":\n return parseSolSplTokenId(tokenId) as TokenIdSpecs<T>\n case \"sol-token2022\":\n return parseSolToken2022TokenId(tokenId) as TokenIdSpecs<T>\n }\n\n throw new Error(`Invalid TokenId: ${tokenId}`)\n}\n\nexport const isTokenIdOfType = <T extends TokenType>(\n tokenId: unknown,\n type: T\n): tokenId is TokenId => {\n if (typeof tokenId !== \"string\") return false\n try {\n return parseTokenId(tokenId).type === type\n } catch {\n return false\n }\n}\n\nexport const isTokenIdInTypes = <T extends TokenType[]>(\n tokenId: unknown,\n types: T\n): tokenId is TokenId => {\n return types.some((type) => isTokenIdOfType(tokenId, type))\n}\n\nexport const networkIdFromTokenId = (tokenId: TokenId): Network[\"id\"] =>\n parseTokenId(tokenId).networkId\n\nconst PLATFORM_NATIVE_TOKENS = {\n polkadot: SubNativeTokenSchema.shape.type.value,\n ethereum: EvmNativeTokenSchema.shape.type.value,\n solana: SolNativeTokenSchema.shape.type.value,\n}\n\nexport type NativeTokenType<P extends NetworkPlatform = NetworkPlatform> =\n (typeof PLATFORM_NATIVE_TOKENS)[P]\n\nexport type NativeToken<P extends NetworkPlatform = NetworkPlatform> = Extract<\n Token,\n { type: NativeTokenType<P> }\n>\n\nexport const isNativeTokenType = <P extends NetworkPlatform = NetworkPlatform>(\n type: TokenType,\n platform?: P\n): type is NativeTokenType<P> => {\n if (platform) return type === PLATFORM_NATIVE_TOKENS[platform]\n return Object.values(PLATFORM_NATIVE_TOKENS).includes(type as NativeTokenType)\n}\n\nexport const isNativeToken = <P extends NetworkPlatform = NetworkPlatform>(\n token: Token,\n platform?: P\n): token is NativeToken<P> => {\n return (isNativeTokenType(token.type, platform) && !platform) || token.platform === platform\n}\n","/** @dev temporarily change branch here when testing changes in chaindata */\nconst CHAINDATA_BRANCH = \"main\"\n\n// pub subfolder needs to be incremented each time the schema of chaindata changes, or when the content of the minimetadata changes\nexport const CHAINDATA_PUB_FOLDER = \"pub/v13\"\n\nexport const MINIMETADATA_VERSION = CHAINDATA_PUB_FOLDER.split(\"/\").pop()!\nif (!MINIMETADATA_VERSION) {\n throw new Error(\"MINIMETADATA_VERSION is not defined, please check CHAINDATA_PUB_FOLDER\")\n}\n\n//\n// GitHub repo constants\n//\n\nconst githubCdn = \"https://raw.githubusercontent.com\"\n\nconst githubChaindataOrg = \"TalismanSociety\"\nconst githubChaindataRepo = \"chaindata\"\nconst githubChaindataBranch = CHAINDATA_BRANCH\nconst githubChaindataDistDir = CHAINDATA_PUB_FOLDER\n\nexport const githubChaindataBaseUrl = `${githubCdn}/${githubChaindataOrg}/${githubChaindataRepo}/${githubChaindataBranch}`\nexport const githubChaindataDistUrl = `${githubChaindataBaseUrl}/${githubChaindataDistDir}`\n\nexport const githubChaindataTokensAssetsDir = \"assets/tokens\"\n","import { startCase, uniq } from \"lodash-es\"\n\nimport type { Network } from \"./chaindata\"\n\nexport type BlockExplorerQuery =\n | {\n type: \"address\"\n // to be used for contracts mainly, otherwise use \"account\"\n address: string\n }\n | {\n type: \"account\"\n address: string\n }\n | {\n type: \"transaction\"\n // hash for most networks, signature for solana\n id: string\n }\n | {\n type: \"block\"\n // block number for most networks, block hash for polkadot.js, slot for solana\n id: string | number | bigint\n }\n | {\n type: \"extrinsic\"\n blockNumber: number | bigint\n extrinsicIndex: number\n }\n | {\n type: \"extrinsic-unknown\"\n hash: `0x${string}`\n }\n\nexport const getBlockExplorerUrls = (network: Network, query: BlockExplorerQuery): string[] => {\n return uniq(\n network.blockExplorerUrls\n .map((explorerUrl) => getExplorerUrl(explorerUrl, query, network.rpcs?.[0]))\n .filter(Boolean) as string[]\n )\n}\n\nconst getExplorerUrl = (\n explorerUrl: string,\n query: BlockExplorerQuery,\n rpcUrl?: string\n): string | null => {\n if (explorerUrl.includes(\"{RPC_URL}\")) {\n if (!rpcUrl) return null\n // rpc url is always in the query string, use encodeURIComponent\n explorerUrl = explorerUrl.replace(\"{RPC_URL}\", encodeURIComponent(rpcUrl))\n }\n\n const url = new URL(explorerUrl)\n const host = getExplorerHost(url)\n const path = getQueryPath(query, host)\n\n if (!path) return null // path is not supported by the host\n\n switch (host) {\n case \"polkadot.js\":\n url.pathname = `/apps/`\n url.hash = path\n break\n case \"statescan.io\":\n url.pathname = `/`\n url.hash = path\n break\n default: {\n // preserve any base path from the explorer URL (e.g., /chain in https://bittensor.ai/chain)\n const basePath = url.pathname.replace(/\\/$/, \"\")\n url.pathname = basePath + path\n break\n }\n }\n\n return url.toString()\n}\n\ntype ExplorerHost =\n | \"polkadot.js\"\n | \"avail.so\"\n | \"statescan.io\"\n | \"taostats.io\"\n | \"subscan.io\"\n | \"etherscan.io\"\n | \"solscan.io\"\n | \"blockscout.com\"\n | \"moonscan.io\"\n | \"bittensor.ai\"\n | (string & {})\n\nconst getExplorerHost = (explorerUrl: URL): ExplorerHost => {\n const hostname = explorerUrl.hostname.toLowerCase()\n\n if (explorerUrl.hostname.endsWith(\"polkadot.js.org\")) return \"polkadot.js\"\n\n // last 2 parts of the hostname\n const parts = hostname.split(\".\")\n return parts.length > 2 ? parts.slice(-2).join(\".\") : hostname\n}\n\nconst getQueryPath = (query: BlockExplorerQuery, host: ExplorerHost): string | null => {\n switch (query.type) {\n case \"transaction\":\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return null\n case \"statescan.io\":\n return `/extrinsics/${query.id}`\n case \"taostats.io\":\n return `/transaction/${query.id}`\n case \"subscan.io\":\n return `/extrinsic/${query.id}`\n default:\n return `/tx/${query.id}`\n }\n case \"address\":\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return null\n case \"statescan.io\":\n return `/accounts/${query.address}`\n case \"subscan.io\":\n case \"taostats.io\":\n case \"bittensor.ai\":\n return `/account/${query.address}`\n default:\n return `/address/${query.address}`\n }\n case \"account\": {\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return null\n case \"statescan.io\":\n return `/accounts/${query.address}`\n default:\n return `/account/${query.address}`\n }\n }\n case \"block\": {\n const isNumber = typeof query.id !== \"string\" || /^\\d+$/.test(query.id)\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return isNumber ? null : `/explorer/query/${query.id}` // supports block hash only\n case \"statescan.io\":\n return isNumber ? `/blocks/${query.id}` : null\n case \"taostats.io\":\n return isNumber ? `/block/${query.id}/extrinsics` : null\n default:\n return isNumber ? `/block/${query.id}` : null\n }\n }\n case \"extrinsic\": {\n switch (host) {\n case \"avail.so\":\n case \"polkadot.js\":\n return null // unsupported\n case \"statescan.io\":\n return `/extrinsics/${query.blockNumber}-${query.extrinsicIndex}`\n case \"taostats.io\":\n return `/extrinsic/${query.blockNumber}-${query.extrinsicIndex.toString().padStart(4, \"0\")}`\n default:\n return `/extrinsic/${query.blockNumber}-${query.extrinsicIndex}`\n }\n }\n case \"extrinsic-unknown\": {\n switch (host) {\n case \"subscan.io\":\n return `/extrinsic/${query.hash}`\n default:\n return null\n }\n }\n default:\n return null // unsupported query type\n }\n}\n\nexport const getBlockExplorerLabel = (blockExplorerUrl: string): string => {\n const url = new URL(blockExplorerUrl)\n const host = getExplorerHost(url)\n\n switch (host) {\n case \"polkadot.js\":\n return \"Polkadot.js\"\n case \"bittensor.ai\":\n return \"Bittensor.ai\"\n default: {\n const parts = url.hostname.split(\".\")\n return parts.length === 2 ? startCase(parts[0]) : host\n }\n }\n}\n","import type { Transaction } from \"dexie\"\n\nimport type { Token, TokenId } from \"../chaindata\"\nimport type { LegacyChain, LegacyChainId } from \"../legacy/Chain\"\nimport type { LegacyEvmNetwork, LegacyEvmNetworkId } from \"../legacy/EvmNetwork\"\n\n// for DB version 2, Wallet version 1.21.0\nexport const upgradeAddIsDefaultToExistingChains = async (tx: Transaction) => {\n const chainsTable = tx.table<LegacyChain, LegacyChainId>(\"chains\")\n const evmNetworksTable = tx.table<LegacyEvmNetwork, LegacyEvmNetworkId>(\"evmNetworks\")\n const tokensTable = tx.table<Token, TokenId>(\"tokens\")\n\n await chainsTable.toCollection().modify((chain) => {\n if (\"isCustom\" in chain && chain.isCustom) return\n chain.isDefault = true\n })\n await evmNetworksTable.toCollection().modify((evmNetwork) => {\n if (\"isCustom\" in evmNetwork && evmNetwork.isCustom) return\n evmNetwork.isDefault = true\n })\n await tokensTable.toCollection().modify((token) => {\n if (\"isCustom\" in token && token.isCustom) return\n token.isDefault = true\n })\n}\n","import type { Transaction } from \"dexie\"\n\nimport type { Token, TokenId } from \"../chaindata\"\nimport type { LegacyChain, LegacyChainId } from \"../legacy/Chain\"\nimport type { LegacyEvmNetwork, LegacyEvmNetworkId } from \"../legacy/EvmNetwork\"\n\nconst legacySubNativeTokenId = (chainId: LegacyChainId) =>\n `${chainId}-substrate-native`.toLowerCase().replace(/ /g, \"-\")\n\nconst legacyEvmNativeTokenId = (chainId: LegacyEvmNetworkId) =>\n `${chainId}-evm-native`.toLowerCase().replace(/ /g, \"-\")\n\n// for DB version 2, Wallet version 1.21.0\nexport const upgradeRemoveSymbolFromNativeTokenId = async (tx: Transaction) => {\n const tokensTable = tx.table<Token, TokenId>(\"tokens\")\n const chainsTable = tx.table<LegacyChain, LegacyChainId>(\"chains\")\n const evmNetworksTable = tx.table<LegacyEvmNetwork, LegacyEvmNetworkId>(\"evmNetworks\")\n\n const nativeTokens = (await tokensTable.toArray()).filter((t) =>\n [\"substrate-native\", \"evm-native\"].includes(t.type)\n )\n const chains = await chainsTable.toArray()\n const evmNetworks = await evmNetworksTable.toArray()\n\n const tokenIdsToDelete: TokenId[] = []\n const tokensToUpsert: Token[] = []\n const chainsToUpsert: LegacyChain[] = []\n const evmNetworksToUpsert: LegacyEvmNetwork[] = []\n\n for (const nativeToken of nativeTokens) {\n const networkId = nativeToken.networkId || nativeToken.networkId\n if (!networkId) continue\n\n const id =\n nativeToken.type === \"substrate-native\"\n ? legacySubNativeTokenId(networkId)\n : nativeToken.type === \"evm-native\"\n ? legacyEvmNativeTokenId(networkId)\n : undefined\n if (!id) continue\n\n const chain = chains.find(({ id }) => id === networkId)\n const evmNetwork = evmNetworks.find(({ id }) => id === networkId)\n\n tokenIdsToDelete.push(nativeToken.id)\n tokensToUpsert.push({ ...nativeToken, id })\n if (chain) chainsToUpsert.push({ ...chain, nativeToken: { id } })\n if (evmNetwork) evmNetworksToUpsert.push({ ...evmNetwork, nativeToken: { id } })\n }\n\n await tokensTable.bulkPut(tokensToUpsert)\n await chainsTable.bulkPut(chainsToUpsert)\n await evmNetworksTable.bulkPut(evmNetworksToUpsert)\n await tokensTable.bulkDelete(tokenIdsToDelete)\n}\n","import { Dexie } from \"dexie\"\n\nimport type { Token, TokenId } from \"../chaindata\"\nimport { upgradeAddIsDefaultToExistingChains } from \"../upgrades/2024-01-25-upgradeAddIsDefaultToExistingChains\"\nimport { upgradeRemoveSymbolFromNativeTokenId } from \"../upgrades/2024-01-25-upgradeRemoveSymbolFromNativeTokenId\"\nimport type { LegacyChain, LegacyChainId, LegacyCustomChain } from \"./Chain\"\nimport type { LegacyCustomEvmNetwork, LegacyEvmNetwork, LegacyEvmNetworkId } from \"./EvmNetwork\"\n\nclass TalismanChaindataDatabase extends Dexie {\n chains!: Dexie.Table<LegacyChain | LegacyCustomChain, LegacyChainId>\n evmNetworks!: Dexie.Table<LegacyEvmNetwork | LegacyCustomEvmNetwork, LegacyEvmNetworkId>\n tokens!: Dexie.Table<Token, TokenId>\n\n constructor() {\n super(\"TalismanChaindata\")\n\n // https://dexie.org/docs/Tutorial/Design#database-versioning\n this.version(2)\n .stores({\n // You only need to specify properties that you wish to index.\n // The object store will allow any properties on your stored objects but you can only query them by indexed properties\n // https://dexie.org/docs/API-Reference#declare-database\n //\n // Never index properties containing images, movies or large (huge) strings. Store them in IndexedDB, yes! but just don’t index them!\n // https://dexie.org/docs/Version/Version.stores()#warning\n chains: \"id, genesisHash, name\",\n evmNetworks: \"id, name\",\n tokens: \"id, type, symbol, coingeckoId, dcentName, contractAddress\",\n })\n .upgrade(upgradeRemoveSymbolFromNativeTokenId)\n .upgrade(upgradeAddIsDefaultToExistingChains)\n }\n}\n\n/** @deprecated */\nexport const getChaindataDbV3 = () => new TalismanChaindataDatabase()\n","","import anylogger from \"anylogger\"\n\nimport packageJson from \"../package.json\"\n\nexport default anylogger(packageJson.name)\n","import {\n arrayItemsEqualWithYield,\n type ChunkedOptions,\n createTimeSlicer,\n forEachWithYield,\n keyByWithYield,\n type TimeSlicer,\n validateArrayWithYield,\n} from \"@talismn/util\"\nimport z from \"zod/v4\"\n\nimport { AnyMiniMetadataSchema, NetworkSchema, TokenSchema } from \"../chaindata\"\nimport type { Chaindata, CustomChaindata } from \"./schema\"\n\n/**\n * Chunked (cooperatively time-sliced) equivalents of ChaindataFileSchema.safeParse and\n * CustomChaindataSchema.safeParse (see ./schema.ts).\n *\n * Validating the whole file with one `schema.safeParse(data)` call blocks the JS thread\n * for the entire validation of thousands of networks/tokens. Element-wise validation of\n * `z.array(X)` is result-identical to the array parse (including TokenSchema's key-order\n * `.transform()` and default filling), so instead we validate each element inside a time\n * budget and yield the thread to the host event loop between slices.\n *\n * Parity with the sync schemas (guarded by chunkedValidation.test.ts):\n * - identical output data (values AND key order)\n * - identical issues (code/path/message), with element issue paths prefixed\n * `[section, index, ...path]` like the array parse produces\n * - the file-level native-token `.check()` cross-reference only runs when the base parse\n * produced no issues, matching zod's check gating\n */\n\nexport type ChunkedParseResult<T> =\n | { success: true; data: T }\n | { success: false; error: z.ZodError }\n\nconst getSlicer = (options?: ChunkedOptions): TimeSlicer =>\n options?.slicer ?? createTimeSlicer({ budgetMs: options?.budgetMs, signal: options?.signal })\n\n/** cheap top-level shape parse: replicates z.object's non-object/missing-field/wrong-type issues */\nconst ChaindataFileShapeSchema = z.object({\n networks: z.array(z.unknown()),\n tokens: z.array(z.unknown()),\n miniMetadatas: z.array(z.unknown()),\n})\n\n/** replicates CustomChaindataSchema's strictObject top level (unrecognized keys are issues) */\nconst CustomChaindataShapeSchema = z.strictObject({\n networks: z.array(z.unknown()).optional(),\n tokens: z.array(z.unknown()),\n})\n\nconst prefixIssues = (\n section: string,\n errors: { index: number; error: z.ZodError }[]\n): z.core.$ZodIssue[] =>\n errors.flatMap(({ index, error }) =>\n error.issues.map((issue) => ({ ...issue, path: [section, index, ...issue.path] }))\n )\n\nconst validateSection = async <T>(\n section: string,\n items: readonly unknown[],\n schema: z.ZodType<T>,\n issues: z.core.$ZodIssue[],\n slicer: TimeSlicer\n): Promise<T[]> => {\n const result = await validateArrayWithYield<T, z.ZodError>(\n items,\n (item) => schema.safeParse(item),\n { slicer }\n )\n if (result.success) return result.data\n issues.push(...prefixIssues(section, result.errors))\n return []\n}\n\n/** the native-token cross-reference from ChaindataFileSchema/CustomChaindataSchema `.check()` */\nconst checkNativeTokens = async (\n value: { networks?: { id: string; nativeTokenId: string }[]; tokens: { id: string }[] },\n issues: z.core.$ZodIssue[],\n slicer: TimeSlicer\n): Promise<void> => {\n const tokensById = await keyByWithYield(value.tokens, (t) => t.id, { slicer })\n await forEachWithYield(\n value.networks ?? [],\n (network, index) => {\n const nativeToken = tokensById[network.nativeTokenId]\n if (!nativeToken)\n issues.push({\n code: \"custom\",\n message: `Network ${network.id} has no native token`,\n input: value,\n path: [\"networks\", index, \"nativeTokenId\"],\n })\n },\n { slicer }\n )\n}\n\nexport const parseChaindataFileChunked = async (\n input: unknown,\n options?: ChunkedOptions\n): Promise<ChunkedParseResult<Chaindata>> => {\n const slicer = getSlicer(options)\n\n const shape = ChaindataFileShapeSchema.safeParse(input)\n if (!shape.success) return { success: false, error: shape.error }\n\n const issues: z.core.$ZodIssue[] = []\n const networks = await validateSection(\n \"networks\",\n shape.data.networks,\n NetworkSchema,\n issues,\n slicer\n )\n const tokens = await validateSection(\"tokens\", shape.data.tokens, TokenSchema, issues, slicer)\n const miniMetadatas = await validateSection(\n \"miniMetadatas\",\n shape.data.miniMetadatas,\n AnyMiniMetadataSchema,\n issues,\n slicer\n )\n\n const data: Chaindata = { networks, tokens, miniMetadatas }\n\n // like zod, only run the file-level check when the base parse produced no issues\n if (!issues.length) await checkNativeTokens(data, issues, slicer)\n\n if (issues.length) return { success: false, error: new z.ZodError(issues) }\n return { success: true, data }\n}\n\nexport const parseCustomChaindataChunked = async (\n input: unknown,\n options?: ChunkedOptions\n): Promise<ChunkedParseResult<CustomChaindata>> => {\n const slicer = getSlicer(options)\n\n const shape = CustomChaindataShapeSchema.safeParse(input)\n if (!shape.success) return { success: false, error: shape.error }\n\n const issues: z.core.$ZodIssue[] = []\n const networks =\n shape.data.networks !== undefined\n ? await validateSection(\"networks\", shape.data.networks, NetworkSchema, issues, slicer)\n : undefined\n const tokens = await validateSection(\"tokens\", shape.data.tokens, TokenSchema, issues, slicer)\n\n // like z.object, don't add missing optional keys to the output\n const data: CustomChaindata = networks !== undefined ? { networks, tokens } : { tokens }\n\n if (!issues.length) await checkNativeTokens(data, issues, slicer)\n\n if (issues.length) return { success: false, error: new z.ZodError(issues) }\n return { success: true, data }\n}\n\n/** chunked equivalent of lodash `isEqual(a, b)` for validated {networks,tokens,miniMetadatas} shapes */\nexport const chaindataEqualWithYield = async (\n a: Chaindata,\n b: Chaindata,\n options?: ChunkedOptions\n): Promise<boolean> => {\n const slicer = getSlicer(options)\n return (\n (await arrayItemsEqualWithYield(a.networks, b.networks, { slicer })) &&\n (await arrayItemsEqualWithYield(a.tokens, b.tokens, { slicer })) &&\n (await arrayItemsEqualWithYield(a.miniMetadatas, b.miniMetadatas, { slicer }))\n )\n}\n","import {\n arrayItemsEqualWithYield,\n isNotNil,\n keyByWithYield,\n mapWithYield,\n switchMapChunked,\n type TimeSlicer,\n} from \"@talismn/util\"\nimport { assign, isEqual, values } from \"lodash-es\"\nimport {\n combineLatest,\n distinctUntilChanged,\n isObservable,\n type Observable,\n of,\n shareReplay,\n} from \"rxjs\"\n\nimport { type Network, type Token, TokenSchema } from \"../chaindata\"\nimport log from \"../log\"\nimport { parseCustomChaindataChunked } from \"./chunkedValidation\"\nimport type { Chaindata, CustomChaindata } from \"./schema\"\n\nconst DEFAULT_CUSTOM_CHAINDATA: CustomChaindata = { networks: [], tokens: [] }\n\ntype AnyMiniMetadata = Chaindata[\"miniMetadatas\"][number]\n\n/**\n * Reference stabilization for one section (networks/tokens/miniMetadatas) of the combined\n * chaindata: reuses the previous item reference for items that are deep-equal (matched by\n * id), and returns the exact previous ARRAY reference when nothing changed at all.\n *\n * This is what lets everything downstream compare by reference instead of deep-walking\n * the whole dataset on every emission — ChaindataProvider's distinctUntilKeyChanged\n * relies on it, and consumers keeping per-item references (e.g. balances subscriptions)\n * don't see spurious changes for unrelated tokens.\n */\nconst makeSectionStabilizer = <T extends { id: string }>() => {\n let prevArray: T[] | null = null\n let prevById: Record<string, T> | null = null\n\n return async (next: T[], slicer: TimeSlicer): Promise<T[]> => {\n if (prevArray === next) return prevArray\n\n if (prevArray === null || prevById === null) {\n prevArray = next\n prevById = await keyByWithYield(next, (t) => t.id, { slicer })\n return next\n }\n\n const previousArray = prevArray\n const previousById = prevById\n let identical = next.length === previousArray.length\n\n const result = await mapWithYield(\n next,\n (item, index) => {\n const prev = previousById[item.id]\n const stabilized =\n prev !== undefined && (prev === item || isEqual(prev, item)) ? prev : item\n if (identical && previousArray[index] !== stabilized) identical = false\n return stabilized\n },\n { slicer }\n )\n\n if (identical) return previousArray\n prevArray = result\n prevById = await keyByWithYield(result, (t) => t.id, { slicer })\n return result\n }\n}\n\nexport const getCombinedChaindata$ = (\n default$: Observable<Chaindata>,\n custom$: Observable<CustomChaindata> | CustomChaindata | undefined,\n dynamicTokens$: Observable<Token[]>\n): Observable<Chaindata> => {\n // ensure custom$ is an observable\n if (!custom$) custom$ = of(DEFAULT_CUSTOM_CHAINDATA)\n if (!isObservable(custom$)) custom$ = of(custom$)\n\n // check custom one against schema (chunked — validation yields the thread on budget)\n let prevCustom: CustomChaindata | null = null\n const customChaindata$ = custom$.pipe(\n switchMapChunked(async (data, { slicer }) => {\n const result = await parseCustomChaindataChunked(data, { slicer })\n if (!result.success) log.error(\"Invalid custom chaindata provided\", result.error)\n const next = result.success ? result.data : DEFAULT_CUSTOM_CHAINDATA\n\n // reference stabilization: reuse the previous object when content is unchanged, so\n // the distinctUntilChanged below dedupes by reference\n if (\n prevCustom !== null &&\n (await arrayItemsEqualWithYield(prevCustom.networks, next.networks, { slicer })) &&\n (await arrayItemsEqualWithYield(prevCustom.tokens, next.tokens, { slicer }))\n )\n return prevCustom\n\n prevCustom = next\n return next\n }),\n distinctUntilChanged()\n )\n\n // append valid dynamic tokens to chaindata tokens (they must not be considered custom tokens)\n const defaultChainData$ = combineLatest([default$, dynamicTokens$]).pipe(\n switchMapChunked(async ([data, dynamicTokens], { slicer }) => {\n const validDynamicTokens = (\n await mapWithYield(\n dynamicTokens,\n (t) => {\n const result = TokenSchema.safeParse(t)\n return result.success ? result.data : null\n },\n { slicer }\n )\n ).filter(isNotNil)\n\n const tokensById = await keyByWithYield(data.tokens.concat(validDynamicTokens), (t) => t.id, {\n slicer,\n })\n\n return { ...data, tokens: values(tokensById) }\n })\n )\n\n const stabilizeNetworks = makeSectionStabilizer<Network>()\n const stabilizeTokens = makeSectionStabilizer<Token>()\n const stabilizeMiniMetadatas = makeSectionStabilizer<AnyMiniMetadata>()\n let prevCombined: Chaindata | null = null\n\n // merge custom into default\n return combineLatest({ defaultData: defaultChainData$, customData: customChaindata$ }).pipe(\n switchMapChunked(async (data, { slicer }) => {\n const start = performance.now()\n const merged = await mergeDefaultAndCustomChaindata(data.defaultData, data.customData, slicer)\n\n const networks = await stabilizeNetworks(merged.networks as Network[], slicer)\n const tokens = await stabilizeTokens(merged.tokens as Token[], slicer)\n const miniMetadatas = await stabilizeMiniMetadatas(merged.miniMetadatas, slicer)\n\n const result: Chaindata =\n prevCombined !== null &&\n prevCombined.networks === networks &&\n prevCombined.tokens === tokens &&\n prevCombined.miniMetadatas === miniMetadatas\n ? prevCombined\n : { networks, tokens, miniMetadatas }\n prevCombined = result\n\n log.debug(\n \"[ChaindataProvider] Combined chaindata merge: %sms\",\n (performance.now() - start).toFixed(2)\n )\n return result\n }),\n distinctUntilChanged(),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n}\n\n/**\n * Merges default and custom chaindata, adding __isCustom, __isKnown, __isTestnet flags.\n *\n * Input data is already validated by upstream observables (storageValidated$ for default,\n * customChaindata$ pipe for custom). This is a pure data transformation, chunked so it\n * yields the thread to the host event loop on budget.\n */\nconst mergeDefaultAndCustomChaindata = async (\n defaultData: Chaindata,\n customData: CustomChaindata,\n slicer: TimeSlicer\n) => {\n const defaultNetworksById = await keyByWithYield(\n await mapWithYield(\n defaultData.networks,\n (n) => ({ ...n, __isKnown: true, __isCustom: false }),\n {\n slicer,\n }\n ),\n (n) => n.id,\n { slicer }\n )\n const customNetworksById = await keyByWithYield(\n await mapWithYield(\n customData.networks ?? [],\n (t) => ({ ...t, __isKnown: !!defaultNetworksById[t.id], __isCustom: true }),\n { slicer }\n ),\n (n) => n.id,\n { slicer }\n )\n const networksById = assign({}, defaultNetworksById, customNetworksById)\n\n const defaultTokensById = await keyByWithYield(\n await mapWithYield(\n defaultData.tokens,\n (n) => ({\n ...n,\n __isCustom: false,\n __isKnown: true,\n __isTestnet: !!networksById[n.networkId]?.isTestnet,\n }),\n { slicer }\n ),\n (n) => n.id,\n { slicer }\n )\n const customTokensById = await keyByWithYield(\n await mapWithYield(\n customData.tokens,\n (t) => ({\n ...t,\n __isCustom: true,\n __isKnown: !!defaultTokensById[t.id],\n __isTestnet: !!networksById[t.networkId]?.isTestnet,\n }),\n { slicer }\n ),\n (n) => n.id,\n { slicer }\n )\n const tokensById = assign({}, defaultTokensById, customTokensById)\n\n return {\n networks: values(networksById),\n tokens: values(tokensById),\n miniMetadatas: defaultData.miniMetadatas,\n }\n}\n\n// Types for the merged chaindata with __isCustom/__isKnown/__isTestnet flags.\n// Previously inferred from ChaindataProviderDataSchema via z.infer.\ntype ChaindataProviderNetwork = Network & { __isCustom: boolean; __isKnown: boolean }\ntype ChaindataProviderToken = Token & {\n __isCustom: boolean\n __isKnown: boolean\n __isTestnet: boolean\n}\n\n// Flag checks only — no Zod safeParse. All data is already validated upstream:\n// - Default chaindata: validated by ChaindataFileSchema in storageValidated$ / fetchChaindata()\n// - Custom chaindata: validated by CustomChaindataSchema in the customChaindata$ pipe\n// - Dynamic tokens: validated by TokenSchema.safeParse in the defaultChainData$ pipe\nexport const isNetworkCustom = (network: Network): boolean =>\n typeof network === \"object\" && (network as ChaindataProviderNetwork).__isCustom === true\n\nexport const isNetworkKnown = (network: Network): boolean =>\n typeof network === \"object\" && (network as ChaindataProviderNetwork).__isKnown === true\n\nexport const isTokenCustom = (token: Token): boolean =>\n typeof token === \"object\" && (token as ChaindataProviderToken).__isCustom === true\n\nexport const isTokenKnown = (token: Token): boolean =>\n typeof token === \"object\" && (token as ChaindataProviderToken).__isKnown === true\n\nexport const isTokenTestnet = (token: Token): boolean =>\n typeof token === \"object\" && (token as ChaindataProviderToken).__isTestnet === true\n\nexport const getCleanNetwork = (network: Network): Network => {\n const { __isCustom, __isKnown, ...rest } = network as ChaindataProviderNetwork\n return rest as Network\n}\n\nexport const getCleanToken = (token: Token): Token => {\n const { __isCustom, __isKnown, __isTestnet, ...rest } = token as ChaindataProviderToken\n return rest as Token\n}\n","/**\n * Tracks objects that have already passed chaindata schema validation, so the expensive\n * validation (thousands of tokens) runs at most ONCE per object instead of on every\n * emission through the pipeline.\n *\n * Safe because parse output is immutable-by-convention in this package, and re-parsing\n * already-parsed data is idempotent (defaults filled, token key order already applied).\n */\nconst validated = new WeakSet<object>()\n\nexport const markChaindataValidated = <T extends object>(data: T): T => {\n validated.add(data)\n return data\n}\n\nexport const isChaindataValidated = (data: unknown): boolean =>\n typeof data === \"object\" && data !== null && validated.has(data)\n","import { githubChaindataDistUrl } from \"../constants\"\nimport log from \"../log\"\nimport { type ChunkedParseResult, parseChaindataFileChunked } from \"./chunkedValidation\"\nimport { markChaindataValidated } from \"./validatedCache\"\n\nconst CHAINDATA_CONSOLIDATED_URL = `${githubChaindataDistUrl}/chaindata.min.json`\n\n// exported for tests\nexport const getFallbackUrl = (url: string) => {\n // if gitraw fails, try jsdelivr (note: jsdelivr paths use {user}/{repo}@{ref}/{path}).\n // only the {user}/{repo} part is parsed - the ref is kept verbatim because it may contain\n // slashes (e.g. feat/foo), which jsdelivr resolves greedily, same as github\n if (url.startsWith(\"https://raw.githubusercontent.com/\")) {\n const fallbackUrl = url.replace(\n /^https:\\/\\/raw\\.githubusercontent\\.com\\/([^/]+)\\/([^/]+)\\//i,\n \"https://cdn.jsdelivr.net/gh/$1/$2@\"\n )\n // guard against malformed urls that the regex can't transform, to prevent infinite recursion\n return fallbackUrl !== url ? fallbackUrl : null\n }\n\n // can add more fallbacks here such as unpkg, etc.\n\n return null\n}\n\ntype FetchJsonFromGitHubOptions<T> = {\n /** chunked validator (e.g. parseChaindataFileChunked) — runs in time slices, yielding the thread between them */\n validate?: (data: unknown, signal?: AbortSignal) => Promise<ChunkedParseResult<T>>\n signal?: AbortSignal\n}\n\nconst fetchJsonFromGithubUrl = async <T>(\n url: string,\n { signal, validate }: FetchJsonFromGitHubOptions<T> = {}\n): Promise<T> => {\n const req = await fetch(url, { signal })\n\n // uncomment the line below to test initChaindata provisioning\n // if (Date.now()) throw new Error(\"OMG SHE GOT A KNIFE!\")\n\n if (!req.ok) {\n const fallbackUrl = getFallbackUrl(url)\n if (fallbackUrl) return fetchJsonFromGithubUrl(fallbackUrl, { validate, signal })\n throw new Error(`Failed to fetch from ${url}: ${req.status} ${req.statusText}`)\n }\n\n const data = await req.json()\n\n if (validate) {\n const start = performance.now()\n const result = await validate(data, signal)\n log.debug(\n `[ChaindataProvider] Validating downloaded ${url?.split(\"/\").pop()} took ${performance.now() - start} ms`\n )\n if (!result.success) {\n log.error(\"Failed to parse data from\", url, { error: result.error })\n throw new Error(`Schema validation failed for ${url}`)\n }\n return result.data as T\n }\n\n return data as T\n}\n\n// export because of generate-init-data script\nexport const fetchChaindata = (signal?: AbortSignal) =>\n fetchJsonFromGithubUrl(CHAINDATA_CONSOLIDATED_URL, {\n validate: async (data, signal) => {\n const result = await parseChaindataFileChunked(data, { signal })\n // mark so storageValidated$ doesn't re-validate this exact object on every emission\n if (result.success) markChaindataValidated(result.data)\n return result\n },\n signal,\n })\n","import { Observable, shareReplay } from \"rxjs\"\n\nimport log from \"../log\"\nimport { fetchChaindata } from \"./net\"\nimport type { Chaindata } from \"./schema\"\n\nconst REFRESH_INTERVAL = 300_000 // 5 mins\n\nlet lastUpdatedAt = 0\n\nexport const githubChaindata$ = new Observable<Chaindata>((subscriber) => {\n const controller = new AbortController()\n subscriber.add(() => controller.abort())\n\n let timeout: ReturnType<typeof setTimeout> | null = null\n subscriber.add(() => timeout && clearTimeout(timeout))\n\n const refresh = async () => {\n try {\n const delay = Math.max(0, lastUpdatedAt + 60_000 - Date.now())\n if (delay > 0) await new Promise((resolve) => setTimeout(resolve, delay))\n if (controller.signal.aborted) return\n\n log.debug(\"[defaultChaindata$] Refreshing chaindata from GitHub\")\n const data = await fetchChaindata(controller.signal)\n lastUpdatedAt = Date.now()\n\n // data is already validated by fetchChaindata (net.ts)\n subscriber.next(data)\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") return\n\n log.error(\"Failed to fetch chaindata\", error)\n if (!subscriber.closed) subscriber.error(error)\n } finally {\n if (!controller.signal.aborted) timeout = setTimeout(refresh, REFRESH_INTERVAL)\n }\n }\n refresh()\n}).pipe(shareReplay({ bufferSize: 1, refCount: true }))\n","","import { switchMapChunked } from \"@talismn/util\"\nimport { firstValueFrom, Observable, type Subject, shareReplay } from \"rxjs\"\n\nimport log from \"../log\"\nimport type { ChaindataStorage } from \"../provider/ChaindataProvider\"\nimport { chaindataEqualWithYield, parseChaindataFileChunked } from \"./chunkedValidation\"\nimport { githubChaindata$ } from \"./githubChaindata\"\nimport initChaindata from \"./initChaindata.json\"\nimport type { Chaindata } from \"./schema\"\nimport { isChaindataValidated, markChaindataValidated } from \"./validatedCache\"\n\nconst EMPTY_DATA: Chaindata = { networks: [], tokens: [], miniMetadatas: [] }\n\nexport const getDefaultChaindata$ = (storage$: Subject<ChaindataStorage>) => {\n // ref-memo of the last validated input: storage$ is a ReplaySubject which replays its\n // last value whenever the shareReplay below recovers from refCount 0 — without this,\n // every re-subscription would re-validate the whole dataset\n let lastInput: ChaindataStorage | null = null\n let lastOutput: Chaindata = EMPTY_DATA\n\n const storageValidated$ = storage$.pipe(\n switchMapChunked(async (data, { slicer }) => {\n // objects marked by fetchChaindata / the initChaindata provisioning below have\n // already been validated: pass them through without re-validating\n if (isChaindataValidated(data)) return data as Chaindata\n if (data === lastInput) return lastOutput\n\n const start = performance.now()\n const validation = await parseChaindataFileChunked(data, { slicer })\n log.debug(\n \"[storageValidated$] Chaindata schema validation: %sms\",\n (performance.now() - start).toFixed(2)\n )\n if (!validation.success)\n log.warn(\"[storageValidated$] Chaindata schema validation failed\", {\n error: validation.error,\n })\n\n lastInput = data\n // schema is invalid, fallback to empty data\n lastOutput = validation.success ? markChaindataValidated(validation.data) : EMPTY_DATA\n return lastOutput\n }),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n\n return new Observable<Chaindata>((subscriber) => {\n const githubToStorageSubscription = githubChaindata$.subscribe({\n error: async () => {\n const storageData = await firstValueFrom(storageValidated$)\n\n if (\n storageData.networks.length ||\n storageData.tokens.length ||\n storageData.miniMetadatas.length\n )\n return log.info(\n \"[defaultChaindata$] DB is not empty, skipping initial data provision\",\n storageData\n )\n\n try {\n // if fetching from github fails, and if DB is empty, provision it with initial data\n log.info(\"[defaultChaindata$] Importing initial chaindata file\")\n const validation = await parseChaindataFileChunked(initChaindata)\n if (!validation.success) {\n log.error(\"[defaultChaindata$] initChaindata failed schema validation\", {\n error: validation.error,\n })\n return\n }\n storage$.next(markChaindataValidated(validation.data))\n log.info(\"[defaultChaindata$] Initial chaindata file imported successfully\")\n } catch (cause) {\n log.error(\"[defaultChaindata$] Failed to import initial chaindata file\", { cause })\n return\n }\n },\n next: async (githubData) => {\n const now = performance.now()\n try {\n const storageData = await firstValueFrom(storageValidated$)\n\n const shouldUpdate = !(await chaindataEqualWithYield(storageData, githubData))\n if (!shouldUpdate)\n return log.debug(\n `[defaultChaindata$] No db updates needed: ${performance.now() - now}ms`\n )\n\n // update local chaindata if github chaindata is different\n log.debug(\n `[defaultChaindata$] Updating chaindata in DB (networks:${githubData.networks.length}, tokens:${githubData.tokens.length}, meta:${githubData.miniMetadatas.length})`\n )\n storage$.next(githubData)\n\n log.info(`[defaultChaindata$] Db synchronized with GitHub :${performance.now() - now}ms`)\n } catch (cause) {\n log.error(\"[defaultChaindata$] Failed to sync chaindata\", { cause })\n }\n },\n })\n subscriber.add(githubToStorageSubscription)\n\n const outputFromStorageSubscription = storageValidated$.subscribe(subscriber)\n subscriber.add(outputFromStorageSubscription)\n }).pipe(shareReplay({ bufferSize: 1, refCount: true }))\n}\n","export const tryToDeleteOldChaindataDb = () => {\n try {\n // try and delete it if it's still there\n indexedDB.deleteDatabase(\"TalismanChaindataV4\")\n } catch {\n // dont care if it fails\n }\n}\n","import {\n arrayItemsEqualWithYield,\n forEachWithYield,\n isPromise,\n replaySubjectFrom,\n} from \"@talismn/util\"\nimport { isEqual, keyBy, values } from \"lodash-es\"\nimport {\n distinctUntilKeyChanged,\n firstValueFrom,\n map,\n type Observable,\n type ReplaySubject,\n shareReplay,\n} from \"rxjs\"\n\nimport {\n type AnyMiniMetadata,\n type DotNetwork,\n isNetworkOfPlatform,\n isTokenOfType,\n type Network,\n type NetworkId,\n type NetworkOfPlatform,\n type NetworkPlatform,\n type SubDTaoToken,\n subDTaoTokenId,\n type Token,\n type TokenId,\n type TokenOfType,\n TokenSchema,\n type TokenType,\n} from \"../chaindata\"\nimport log from \"../log\"\nimport { getCombinedChaindata$ } from \"../state/combinedChaindata\"\nimport { getDefaultChaindata$ } from \"../state/defaultChaindata\"\nimport { tryToDeleteOldChaindataDb } from \"../state/oldDb\"\nimport type { Chaindata, CustomChaindata } from \"../state/schema\"\nimport type { IChaindataProvider } from \"./ChaindataProviderInterface\"\n\n/**\n * This type will be used for in-memory storage of chaindata.\n *\n * Provide a Subject<ChaindataStorage> and subscribe to changes to persist the data to disk.\n * Instantiate ChaindataProvider with this subject to restore persisted data from disk.\n */\nexport type ChaindataStorage = {\n networks: Network[]\n tokens: Token[]\n miniMetadatas: AnyMiniMetadata[]\n}\n\n/** By default, chaindata will be stored in memory and not persisted. */\nconst DEFAULT_STORAGE: ChaindataStorage = {\n networks: [],\n tokens: [],\n miniMetadatas: [],\n}\n\nexport type ChaindataProviderOptions = {\n persistedStorage?: ChaindataStorage | Promise<ChaindataStorage | undefined>\n customChaindata$?: Observable<CustomChaindata> | CustomChaindata\n dynamicTokens$?: ReplaySubject<Token[]>\n}\n\nexport class ChaindataProvider implements IChaindataProvider {\n #storage$: ReplaySubject<ChaindataStorage>\n #chaindata$: Observable<Chaindata>\n #dynamicTokens$: ReplaySubject<Token[]>\n #dynamicTokensWriteQueue: Promise<unknown> = Promise.resolve()\n\n constructor({\n persistedStorage,\n customChaindata$,\n dynamicTokens$,\n }: ChaindataProviderOptions = {}) {\n tryToDeleteOldChaindataDb()\n\n // merge persistedStorage with DEFAULT_STORAGE to make sure there's no missing keys\n const mergedStorage = isPromise(persistedStorage)\n ? persistedStorage.then((storage) => ({ ...DEFAULT_STORAGE, ...storage }))\n : { ...DEFAULT_STORAGE, ...persistedStorage }\n this.#storage$ = replaySubjectFrom(mergedStorage)\n const defaultChaindata$ = getDefaultChaindata$(this.#storage$)\n\n this.#dynamicTokens$ = replaySubjectFrom(dynamicTokens$ ?? [])\n\n this.#chaindata$ = getCombinedChaindata$(\n defaultChaindata$,\n customChaindata$,\n this.#dynamicTokens$\n )\n }\n\n /**\n * Subscribe to this observable and save its contents somewhere persistent.\n *\n * Instantiate `new ChaindataProvider({ persistedStorage })` with the saved contents\n * to prevent the need to wait for them to download on every startup.\n */\n get storage$() {\n return this.#storage$.asObservable()\n }\n\n /**\n * Mini metadatas\n */\n\n get miniMetadatas$() {\n return this.#chaindata$.pipe(\n // reference compare is sufficient (and free): combinedChaindata's section\n // stabilizer reuses the previous array reference when the content is deep-equal\n distinctUntilKeyChanged(\"miniMetadatas\"),\n map(({ miniMetadatas }) => miniMetadatas),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n }\n\n async getMiniMetadatas() {\n return await wrapObservableWithGetter(\"Failed to get miniMetadatas\", this.miniMetadatas$)\n }\n\n get miniMetadatasMapById$() {\n return this.miniMetadatas$.pipe(\n map(itemsToMapById),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n }\n async getMiniMetadatasMapById() {\n return await wrapObservableWithGetter(\n \"Failed to get mini metadatas by id\",\n this.miniMetadatasMapById$\n )\n }\n\n getMiniMetadataById$(id: string) {\n return this.miniMetadatasMapById$.pipe(map((miniMetadatas) => miniMetadatas[id] ?? null))\n }\n\n async miniMetadataById(id: string) {\n return await wrapObservableWithGetter(\n \"Failed to get mini metadata by id\",\n this.getMiniMetadataById$(id)\n )\n }\n\n /**\n * Tokens\n */\n\n get tokens$() {\n return this.#chaindata$.pipe(\n // reference compare is sufficient (and free): combinedChaindata's section\n // stabilizer reuses the previous array reference when the content is deep-equal\n distinctUntilKeyChanged(\"tokens\"),\n map(({ tokens }) => tokens),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n }\n\n getTokens$<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(type?: T): Observable<R[]> {\n return this.tokens$.pipe(map(filterTokensByType(type))) as Observable<R[]>\n }\n\n async getTokens<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(type?: T): Promise<R[]> {\n return (await wrapObservableWithGetter(\"Failed to get tokens\", this.getTokens$(type))) as R[]\n }\n\n getTokenIds$(type?: TokenType) {\n return this.getTokens$(type).pipe(map(itemsToIds))\n }\n async getTokenIds(type?: TokenType) {\n return await wrapObservableWithGetter(\"Failed to get tokenIds\", this.getTokenIds$(type))\n }\n\n getTokensMapById$<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(type?: T): Observable<Record<TokenId, R>> {\n return this.getTokens$(type).pipe(map(itemsToMapById)) as Observable<Record<TokenId, R>>\n }\n async getTokensMapById<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(type?: T): Promise<Record<TokenId, R>> {\n return (await wrapObservableWithGetter(\n \"Failed to get tokens map by id\",\n this.getTokensMapById$(type)\n )) as Record<TokenId, R>\n }\n\n getTokenById$<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(id: TokenId, type?: T): Observable<R | null> {\n return this.getTokensMapById$(type).pipe(\n map((tokens) => tokens[id] ?? null)\n ) as Observable<R | null>\n }\n async getTokenById<\n T extends TokenType | undefined,\n R extends T extends TokenType ? TokenOfType<T> : Token,\n >(id: TokenId, type?: T): Promise<R | null> {\n return (await wrapObservableWithGetter(\n \"Failed to get token by id\",\n this.getTokenById$(id, type)\n )) as R | null\n }\n\n /**\n * Serializes read-merge-write cycles on #dynamicTokens$: registrations come concurrently\n * from independent balance module pipelines (and syncDynamicTokens), and the cycles span\n * multiple awaits — interleaved cycles would both read the same snapshot and the later\n * write would silently drop the earlier one's newly added tokens.\n */\n #enqueueDynamicTokensWrite<T>(task: () => Promise<T>): Promise<T> {\n const result = this.#dynamicTokensWriteQueue.then(task)\n this.#dynamicTokensWriteQueue = result.catch(() => undefined)\n return result\n }\n\n /**\n * Registers token dynamically a runtime. used for SPL and dTAO tokens.\n * @param tokens\n */\n async registerDynamicTokens(tokens: Token[]) {\n if (!tokens.length) return\n\n // check schema (chunked — yields the thread between time slices, throws on invalid)\n await forEachWithYield(tokens, (t) => void TokenSchema.parse(t))\n\n await this.#enqueueDynamicTokensWrite(async () => {\n const currentStorage = await firstValueFrom(this.#dynamicTokens$)\n const currentById = keyBy<Token>(currentStorage, (t) => t.id)\n const newById = keyBy<Token>(tokens, (t) => t.id)\n const dynamicTokens = values<Token>({ ...currentById, ...newById }).sort((a, b) =>\n a.id.localeCompare(b.id)\n )\n\n // update only if necessary\n if (!(await arrayItemsEqualWithYield(currentStorage, dynamicTokens))) {\n this.#dynamicTokens$.next(dynamicTokens)\n }\n })\n }\n\n /**\n * dynamic tokens are created when they are first detected by the balance modules.\n * this method syncs their metadata (name, symbol, logo) with custom logic specific to each token type,\n * and removes dynamic entries that have since been curated into the default chaindata.\n */\n async syncDynamicTokens() {\n await this.#enqueueDynamicTokensWrite(async () => {\n const dynamicTokens = await firstValueFrom(this.#dynamicTokens$)\n if (!dynamicTokens.length) return\n\n // ids present in the default (curated) chaindata — used to drop dynamic\n // duplicates so curated metadata wins (combined chaindata applies last-wins\n // by id, so leaving a dynamic entry in place would shadow the curated one).\n const defaultStorage = await firstValueFrom(this.#storage$)\n const defaultTokenIds = new Set(defaultStorage.tokens.map((t) => t.id))\n\n const next: Token[] = []\n let changed = false\n\n for (const token of dynamicTokens) {\n // drop dynamic tokens whose ids are now curated by default chaindata\n if (\n (token.type === \"sol-spl\" || token.type === \"sol-token2022\") &&\n defaultTokenIds.has(token.id)\n ) {\n changed = true\n continue\n }\n\n if (token.type === \"substrate-dtao\") {\n const templateTokenId = subDTaoTokenId(token.networkId, token.netuid)\n const templateToken = await this.getTokenById(templateTokenId, \"substrate-dtao\")\n if (templateToken) {\n const updatedToken: SubDTaoToken = {\n ...token,\n symbol: templateToken.symbol,\n name: templateToken.name,\n logo: templateToken.logo,\n subnetName: templateToken.subnetName,\n }\n if (!isEqual(token, updatedToken)) {\n changed = true\n next.push(updatedToken)\n continue\n }\n }\n }\n\n next.push(token)\n }\n\n if (changed) {\n log.debug(\"[ChaindataProvider] syncDynamicTokens: updating dynamic tokens\", next)\n const sorted = next.slice().sort((a, b) => a.id.localeCompare(b.id))\n this.#dynamicTokens$.next(sorted)\n }\n })\n }\n\n /**\n * Networks\n */\n\n get networks$() {\n return this.#chaindata$.pipe(\n // reference compare is sufficient (and free): combinedChaindata's section\n // stabilizer reuses the previous array reference when the content is deep-equal\n distinctUntilKeyChanged(\"networks\"),\n map(({ networks }) => networks),\n shareReplay({ bufferSize: 1, refCount: true })\n )\n }\n\n getNetworks$<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(platform?: P): Observable<R[]> {\n return this.networks$.pipe(map(filterNetworksByPlatform(platform))) as Observable<R[]>\n }\n async getNetworks<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(platform?: P): Promise<R[]> {\n return (await wrapObservableWithGetter(\n \"Failed to get networks\",\n this.getNetworks$(platform)\n )) as R[]\n }\n\n getNetworkIds$(platform?: NetworkPlatform) {\n return this.getNetworks$(platform).pipe(map(itemsToIds))\n }\n async getNetworkIds(platform?: NetworkPlatform) {\n return await wrapObservableWithGetter(\"Failed to get networkIds\", this.getNetworkIds$(platform))\n }\n\n getNetworksMapById$<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(platform?: P) {\n return this.getNetworks$(platform).pipe(map(itemsToMapById)) as Observable<Record<NetworkId, R>>\n }\n async getNetworksMapById<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(platform?: P): Promise<Record<NetworkId, R>> {\n return (await wrapObservableWithGetter(\n \"Failed to get networks by id\",\n this.getNetworksMapById$(platform)\n )) as Record<NetworkId, R>\n }\n\n getNetworksMapByGenesisHash$(): Observable<Record<`0x${string}`, DotNetwork>> {\n return this.getNetworks$(\"polkadot\").pipe(map(itemsToMapByGenesisHash))\n }\n async getNetworksMapByGenesisHash() {\n return await wrapObservableWithGetter(\n \"Failed to get networks by genesisHash\",\n this.getNetworksMapByGenesisHash$()\n )\n }\n\n getNetworkById$<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(networkId: NetworkId, platform?: P): Observable<R | null> {\n return this.getNetworksMapById$(platform).pipe(\n map((networksById) => networksById[networkId] ?? null)\n ) as Observable<R | null>\n }\n\n async getNetworkById<\n P extends NetworkPlatform | undefined,\n R = P extends NetworkPlatform ? NetworkOfPlatform<P> : Network,\n >(networkId: NetworkId, platform?: P): Promise<R | null> {\n return (await wrapObservableWithGetter(\n \"Failed to get network by id\",\n this.getNetworkById$(networkId, platform)\n )) as R | null\n }\n\n getNetworkByGenesisHash$(genesisHash: `0x${string}`) {\n return this.getNetworksMapByGenesisHash$().pipe(\n map((networksByGenesisHash) => networksByGenesisHash[genesisHash] ?? null)\n )\n }\n async getNetworkByGenesisHash(genesisHash: `0x${string}`) {\n return await wrapObservableWithGetter(\n \"Failed to get network by genesisHash\",\n this.getNetworkByGenesisHash$(genesisHash)\n )\n }\n}\n\n//\n// map from Item[] to another type\n//\n\nconst itemsToIds = <T extends { id: string }>(items: T[]): string[] => items.map(({ id }) => id)\n\n// ref-memo: tokens/networks arrays are reference-stable across emissions and subscriptions\n// (combinedChaindata's stabilizer), so the map is only rebuilt when the data actually changes\nconst mapByIdCache = new WeakMap<object, Record<string, unknown>>()\nconst itemsToMapById = <T extends { id: string }>(items: T[]): Record<string, T> => {\n const cached = mapByIdCache.get(items)\n if (cached) return cached as Record<string, T>\n const result = Object.fromEntries(items.map((item) => [item.id, item]))\n mapByIdCache.set(items, result)\n return result\n}\n\nconst itemsToMapByGenesisHash = <T extends { genesisHash: `0x${string}` | null }>(\n items: T[]\n): Record<`0x${string}`, T> =>\n Object.fromEntries(items.flatMap((item) => (item.genesisHash ? [[item.genesisHash, item]] : [])))\n\nconst filterTokensByType =\n <T extends TokenType | undefined, R extends T extends TokenType ? TokenOfType<T>[] : Token[]>(\n type: T\n ) =>\n (tokens: Token[]): R =>\n // pass the original array through when unfiltered, to keep it reference-stable\n // across emissions (itemsToMapById's ref-memo depends on it)\n (type ? tokens.filter((token) => isTokenOfType(token, type)) : tokens) as R\n\nconst filterNetworksByPlatform =\n <\n P extends NetworkPlatform | undefined,\n R extends P extends NetworkPlatform ? NetworkOfPlatform<P>[] : Network[],\n >(\n platform: P\n ) =>\n (networks: Network[]): R =>\n // pass the original array through when unfiltered (see filterTokensByType)\n (platform\n ? networks.filter((network) => isNetworkOfPlatform(network, platform))\n : networks) as R\n\n//\n// Utils to wrap Observable methods with one-shot Promise methods\n//\n\ntype ObservableReturnType<O> = O extends Observable<infer T> ? T : O\n\n// biome-ignore lint/suspicious/noExplicitAny: legacy\nconst wrapObservableWithGetter = async <O extends Observable<any>>(\n errorReason: string,\n observable: O\n): Promise<ObservableReturnType<O>> => {\n return await withErrorReason(errorReason, () => firstValueFrom(observable))\n}\n\nconst withErrorReason = async <T>(reason: string, task: () => Promise<T> | T): Promise<T> => {\n try {\n return await task()\n } catch (cause) {\n throw new Error(reason, { cause })\n }\n}\n","import { keyBy } from \"lodash-es\"\nimport z from \"zod/v4\"\n\nimport { AnyMiniMetadataSchema, NetworkSchema, TokenSchema } from \"../chaindata\"\n\nexport const ChaindataFileSchema = z\n .object({\n networks: z.array(NetworkSchema),\n tokens: z.array(TokenSchema),\n miniMetadatas: z.array(AnyMiniMetadataSchema),\n })\n .check((ctx) => {\n //ensure each network has a native token\n const tokensById = keyBy(ctx.value.tokens, (t) => t.id)\n for (const network of ctx.value.networks ?? []) {\n const nativeToken = tokensById[network.nativeTokenId]\n if (!nativeToken)\n ctx.issues.push({\n code: \"custom\",\n message: `Network ${network.id} has no native token`,\n input: ctx.value,\n path: [\"networks\", ctx.value.networks!.indexOf(network), \"nativeTokenId\"],\n })\n }\n })\n\nexport type Chaindata = z.infer<typeof ChaindataFileSchema>\n\nexport const CustomChaindataSchema = z\n .strictObject({\n networks: z.array(NetworkSchema).optional(),\n tokens: z.array(TokenSchema),\n })\n .check((ctx) => {\n //ensure each network has a native token\n const tokensById = keyBy(ctx.value.tokens, (t) => t.id)\n for (const network of ctx.value.networks ?? []) {\n const nativeToken = tokensById[network.nativeTokenId]\n if (!nativeToken)\n ctx.issues.push({\n code: \"custom\",\n message: `Network ${network.id} has no native token`,\n input: ctx.value,\n path: [\"networks\", ctx.value.networks!.indexOf(network), \"nativeTokenId\"],\n })\n }\n })\n\nexport type CustomChaindata = z.infer<typeof CustomChaindataSchema>\n","import { githubChaindataBaseUrl, githubChaindataTokensAssetsDir } from \"./constants\"\n\ntype KNOWN_TOKEN_ID = \"uniswap\"\n\nexport const getGithubTokenLogoUrl = (tokenId: KNOWN_TOKEN_ID): string => {\n return `${githubChaindataBaseUrl}/${githubChaindataTokensAssetsDir}/${tokenId}.svg`\n}\n\n/**\n * Use only if you are sure this token is supported by Talisman or the url might 404\n * @param coingeckoId\n * @returns\n */\nexport const getGithubTokenLogoUrlByCoingeckoId = (coingeckoId: string): string => {\n return `${githubChaindataBaseUrl}/assets/tokens/coingecko/${coingeckoId}.webp`\n}\n"],"mappings":"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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}