{"version":3,"sources":["../src/core/WalletManager.ts","../src/constants/tokens.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - Wallet Manager\n * \n * Manages deterministic wallet addresses across multiple chains.\n * Vault addresses are computed using CREATE2 on EVM chains and chain-specific\n * derivation on non-EVM chains, all based on the user's passkey public key.\n */\n\nimport { ethers } from 'ethers';\nimport type { \n    PasskeyCredential,\n    UnifiedIdentity,\n    ChainAddress,\n    WalletManagerConfig,\n} from './types.js';\nimport { computeKeyHash } from '../utils.js';\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * EIP-1167 minimal proxy bytecode prefix (before implementation address)\n * 3d602d80600a3d3981f3363d3d373d3d3d363d73\n */\nconst PROXY_BYTECODE_PREFIX = '0x3d602d80600a3d3981f3363d3d373d3d3d363d73';\n\n/**\n * EIP-1167 minimal proxy bytecode suffix (after implementation address)\n * 5af43d82803e903d91602b57fd5bf3\n */\nconst PROXY_BYTECODE_SUFFIX = '5af43d82803e903d91602b57fd5bf3';\n\n// ============================================================================\n// WalletManager Class\n// ============================================================================\n\n/**\n * Manages wallet address derivation and storage for Veridex Protocol\n * \n * @example\n * ```typescript\n * const manager = new WalletManager();\n * \n * // Compute vault address for a credential\n * const address = await manager.computeVaultAddress(\n *   credential.keyHash,\n *   factoryAddress,\n *   implementationAddress\n * );\n * \n * // Get unified identity with addresses on all chains\n * const identity = await manager.getUnifiedIdentity(credential, chainConfigs);\n * ```\n */\nexport class WalletManager {\n    private config: WalletManagerConfig;\n    private addressCache: Map<string, ChainAddress[]> = new Map();\n\n    constructor(config: WalletManagerConfig = {}) {\n        this.config = {\n            cacheAddresses: config.cacheAddresses ?? true,\n            persistToStorage: config.persistToStorage ?? false,\n            storageKey: config.storageKey ?? 'veridex_wallet_addresses',\n        };\n\n        // Load cached addresses from storage if enabled\n        if (this.config.persistToStorage && typeof window !== 'undefined') {\n            this.loadFromStorage();\n        }\n    }\n\n    // ========================================================================\n    // Address Computation\n    // ========================================================================\n\n    /**\n     * Compute the deterministic vault address for an EVM chain\n     * \n     * Uses CREATE2 with EIP-1167 minimal proxy pattern:\n     * - Salt = keccak256(factoryAddress, ownerKeyHash)\n     * - InitCode = EIP-1167 proxy bytecode with implementation address\n     * \n     * @param keyHash - The owner's key hash (keccak256 of public key coordinates)\n     * @param factoryAddress - The vault factory contract address\n     * @param implementationAddress - The vault implementation contract address\n     * @returns The deterministic vault address\n     */\n    computeVaultAddress(\n        keyHash: string,\n        factoryAddress: string,\n        implementationAddress: string\n    ): string {\n        // Compute salt: keccak256(abi.encodePacked(factory, keyHash))\n        const salt = ethers.keccak256(\n            ethers.solidityPacked(\n                ['address', 'bytes32'],\n                [factoryAddress, keyHash]\n            )\n        );\n\n        // Build EIP-1167 initcode\n        const initCode = this.buildProxyInitCode(implementationAddress);\n        const initCodeHash = ethers.keccak256(initCode);\n\n        // CREATE2 address computation:\n        // address = keccak256(0xff ++ factory ++ salt ++ initCodeHash)[12:]\n        const create2Data = ethers.solidityPacked(\n            ['bytes1', 'address', 'bytes32', 'bytes32'],\n            ['0xff', factoryAddress, salt, initCodeHash]\n        );\n\n        const hash = ethers.keccak256(create2Data);\n        // Take last 20 bytes as address\n        return ethers.getAddress('0x' + hash.slice(26));\n    }\n\n    /**\n     * Compute vault address from public key coordinates\n     * \n     * @param publicKeyX - P-256 public key X coordinate\n     * @param publicKeyY - P-256 public key Y coordinate\n     * @param factoryAddress - The vault factory contract address\n     * @param implementationAddress - The vault implementation contract address\n     * @returns The deterministic vault address\n     */\n    computeVaultAddressFromPublicKey(\n        publicKeyX: bigint,\n        publicKeyY: bigint,\n        factoryAddress: string,\n        implementationAddress: string\n    ): string {\n        const keyHash = computeKeyHash(publicKeyX, publicKeyY);\n        return this.computeVaultAddress(keyHash, factoryAddress, implementationAddress);\n    }\n\n    /**\n     * Build EIP-1167 minimal proxy initcode\n     */\n    private buildProxyInitCode(implementationAddress: string): string {\n        // Remove 0x prefix if present and lowercase\n        const impl = implementationAddress.toLowerCase().replace('0x', '');\n        \n        // EIP-1167 bytecode format\n        return PROXY_BYTECODE_PREFIX + impl + PROXY_BYTECODE_SUFFIX;\n    }\n\n    // ========================================================================\n    // Unified Identity\n    // ========================================================================\n\n    /**\n     * Get unified identity with addresses across all configured chains\n     * \n     * @param credential - The passkey credential\n     * @param chainConfigs - Map of chain configurations with factory/implementation addresses\n     * @returns Unified identity with addresses on each chain\n     */\n    async getUnifiedIdentity(\n        credential: PasskeyCredential,\n        chainConfigs: Map<number, ChainAddressConfig>\n    ): Promise<UnifiedIdentity> {\n        const addresses: ChainAddress[] = [];\n\n        for (const [wormholeChainId, config] of chainConfigs) {\n            const address = await this.deriveAddressForChain(\n                credential,\n                wormholeChainId,\n                config\n            );\n            \n            if (address) {\n                addresses.push(address);\n            }\n        }\n\n        const identity: UnifiedIdentity = {\n            keyHash: credential.keyHash,\n            publicKeyX: credential.publicKeyX,\n            publicKeyY: credential.publicKeyY,\n            credentialId: credential.credentialId,\n            addresses,\n            createdAt: Date.now(),\n            updatedAt: Date.now(),\n        };\n\n        // Cache the identity\n        if (this.config.cacheAddresses) {\n            this.addressCache.set(credential.keyHash, addresses);\n        }\n\n        // Persist to storage if enabled\n        if (this.config.persistToStorage) {\n            this.saveToStorage(identity);\n        }\n\n        return identity;\n    }\n\n    /**\n     * Derive address for a specific chain\n     */\n    private async deriveAddressForChain(\n        credential: PasskeyCredential,\n        wormholeChainId: number,\n        config: ChainAddressConfig\n    ): Promise<ChainAddress | null> {\n        if (config.isEvm) {\n            // EVM chains use CREATE2\n            if (!config.factoryAddress || !config.implementationAddress) {\n                return null;\n            }\n\n            const address = this.computeVaultAddress(\n                credential.keyHash,\n                config.factoryAddress,\n                config.implementationAddress\n            );\n\n            return {\n                wormholeChainId,\n                chainName: config.chainName,\n                address,\n                isEvm: true,\n                deployed: false, // Will be checked separately\n            };\n        } else {\n            // Non-EVM chains have chain-specific address derivation\n            return this.deriveNonEvmAddress(credential, wormholeChainId, config);\n        }\n    }\n\n    /**\n     * Derive address for non-EVM chains\n     * \n     * Each chain has its own address format:\n     * - Solana: Base58 encoded public key hash\n     * - Aptos: 32-byte hex address\n     * - Sui: 32-byte hex address with 0x prefix\n     */\n    private deriveNonEvmAddress(\n        credential: PasskeyCredential,\n        wormholeChainId: number,\n        _config: ChainAddressConfig\n    ): ChainAddress | null {\n        switch (wormholeChainId) {\n            case 1: // Solana\n                // Solana uses the key hash directly as a seed for PDA derivation\n                // The actual address depends on the program ID\n                return {\n                    wormholeChainId: 1,\n                    chainName: 'Solana',\n                    address: credential.keyHash, // PDA will be derived from this\n                    isEvm: false,\n                    derivationType: 'pda',\n                    deployed: false,\n                };\n\n            case 22: // Aptos\n                // Aptos uses the key hash as the resource account address\n                return {\n                    wormholeChainId: 22,\n                    chainName: 'Aptos',\n                    address: credential.keyHash,\n                    isEvm: false,\n                    derivationType: 'resource_account',\n                    deployed: false,\n                };\n\n            case 21: // Sui\n                // Sui uses the key hash with 0x prefix\n                return {\n                    wormholeChainId: 21,\n                    chainName: 'Sui',\n                    address: credential.keyHash,\n                    isEvm: false,\n                    derivationType: 'object',\n                    deployed: false,\n                };\n\n            default:\n                // Unknown chain\n                return null;\n        }\n    }\n\n    // ========================================================================\n    // Address Lookup\n    // ========================================================================\n\n    /**\n     * Get cached address for a chain\n     */\n    getAddressForChain(keyHash: string, wormholeChainId: number): ChainAddress | undefined {\n        const addresses = this.addressCache.get(keyHash);\n        return addresses?.find(a => a.wormholeChainId === wormholeChainId);\n    }\n\n    /**\n     * Get all cached addresses for a key hash\n     */\n    getAddresses(keyHash: string): ChainAddress[] {\n        return this.addressCache.get(keyHash) ?? [];\n    }\n\n    /**\n     * Update deployment status for an address\n     */\n    updateDeploymentStatus(\n        keyHash: string,\n        wormholeChainId: number,\n        deployed: boolean,\n        deploymentTxHash?: string\n    ): void {\n        const addresses = this.addressCache.get(keyHash);\n        if (!addresses) return;\n\n        const address = addresses.find(a => a.wormholeChainId === wormholeChainId);\n        if (address) {\n            address.deployed = deployed;\n            address.deploymentTxHash = deploymentTxHash;\n        }\n\n        // Persist update if enabled\n        if (this.config.persistToStorage) {\n            this.saveAddressesToStorage(keyHash, addresses);\n        }\n    }\n\n    // ========================================================================\n    // Storage\n    // ========================================================================\n\n    /**\n     * Load addresses from localStorage\n     */\n    private loadFromStorage(): void {\n        if (typeof window === 'undefined') return;\n\n        try {\n            const stored = localStorage.getItem(this.config.storageKey!);\n            if (!stored) return;\n\n            const data = JSON.parse(stored) as StoredWalletData;\n            \n            for (const [keyHash, addresses] of Object.entries(data.addresses)) {\n                this.addressCache.set(keyHash, addresses);\n            }\n        } catch (error) {\n            console.warn('Failed to load wallet addresses from storage:', error);\n        }\n    }\n\n    /**\n     * Save identity to localStorage\n     */\n    private saveToStorage(identity: UnifiedIdentity): void {\n        if (typeof window === 'undefined') return;\n\n        try {\n            const stored = localStorage.getItem(this.config.storageKey!) ?? '{}';\n            const data = JSON.parse(stored) as StoredWalletData;\n\n            if (!data.addresses) {\n                data.addresses = {};\n            }\n\n            // Store identity with serialized bigints\n            data.addresses[identity.keyHash] = identity.addresses;\n            data.identities = data.identities ?? {};\n            data.identities[identity.keyHash] = {\n                keyHash: identity.keyHash,\n                publicKeyX: identity.publicKeyX.toString(),\n                publicKeyY: identity.publicKeyY.toString(),\n                credentialId: identity.credentialId,\n                createdAt: identity.createdAt,\n                updatedAt: identity.updatedAt,\n            };\n\n            localStorage.setItem(this.config.storageKey!, JSON.stringify(data));\n        } catch (error) {\n            console.warn('Failed to save wallet addresses to storage:', error);\n        }\n    }\n\n    /**\n     * Save addresses to localStorage\n     */\n    private saveAddressesToStorage(keyHash: string, addresses: ChainAddress[]): void {\n        if (typeof window === 'undefined') return;\n\n        try {\n            const stored = localStorage.getItem(this.config.storageKey!) ?? '{}';\n            const data = JSON.parse(stored) as StoredWalletData;\n\n            if (!data.addresses) {\n                data.addresses = {};\n            }\n\n            data.addresses[keyHash] = addresses;\n            localStorage.setItem(this.config.storageKey!, JSON.stringify(data));\n        } catch (error) {\n            console.warn('Failed to save wallet addresses to storage:', error);\n        }\n    }\n\n    /**\n     * Clear all cached data\n     */\n    clearCache(): void {\n        this.addressCache.clear();\n        \n        if (this.config.persistToStorage && typeof window !== 'undefined') {\n            localStorage.removeItem(this.config.storageKey!);\n        }\n    }\n\n    /**\n     * Load identity from storage\n     */\n    loadIdentityFromStorage(keyHash: string): UnifiedIdentity | null {\n        if (typeof window === 'undefined') return null;\n\n        try {\n            const stored = localStorage.getItem(this.config.storageKey!);\n            if (!stored) return null;\n\n            const data = JSON.parse(stored) as StoredWalletData;\n            const storedIdentity = data.identities?.[keyHash];\n            const addresses = data.addresses?.[keyHash];\n\n            if (!storedIdentity || !addresses) return null;\n\n            return {\n                keyHash: storedIdentity.keyHash,\n                publicKeyX: BigInt(storedIdentity.publicKeyX),\n                publicKeyY: BigInt(storedIdentity.publicKeyY),\n                credentialId: storedIdentity.credentialId,\n                addresses,\n                createdAt: storedIdentity.createdAt,\n                updatedAt: storedIdentity.updatedAt,\n            };\n        } catch (error) {\n            console.warn('Failed to load identity from storage:', error);\n            return null;\n        }\n    }\n}\n\n// ============================================================================\n// Helper Types (Internal)\n// ============================================================================\n\ninterface ChainAddressConfig {\n    chainName: string;\n    isEvm: boolean;\n    factoryAddress?: string;\n    implementationAddress?: string;\n}\n\ninterface StoredWalletData {\n    addresses: Record<string, ChainAddress[]>;\n    identities?: Record<string, {\n        keyHash: string;\n        publicKeyX: string;\n        publicKeyY: string;\n        credentialId: string;\n        createdAt: number;\n        updatedAt: number;\n    }>;\n}\n\n// Export the helper type for external use\nexport type { ChainAddressConfig };\n","/**\n * Veridex Protocol SDK - Token Constants\n * \n * Known tokens per chain for balance fetching and transfers\n */\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface TokenInfo {\n    /** Token symbol (e.g., 'USDC', 'ETH') */\n    symbol: string;\n    /** Token name (e.g., 'USD Coin') */\n    name: string;\n    /** Token address (use 'native' for native token) */\n    address: string;\n    /** Number of decimals */\n    decimals: number;\n    /** Optional logo URL */\n    logoUrl?: string;\n    /** Whether this is the native token */\n    isNative: boolean;\n    /** Wormhole-wrapped token address on other chains (by wormhole chain ID) */\n    wrappedAddresses?: Record<number, string>;\n}\n\nexport interface ChainTokenList {\n    /** Wormhole chain ID */\n    wormholeChainId: number;\n    /** Chain name */\n    chainName: string;\n    /** Native token info */\n    nativeToken: TokenInfo;\n    /** ERC20/SPL/etc tokens */\n    tokens: TokenInfo[];\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n/**\n * Native token address constant\n */\nexport const NATIVE_TOKEN_ADDRESS = 'native';\n\n/**\n * Zero address for EVM chains\n */\nexport const EVM_ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';\n\n// ============================================================================\n// Base Sepolia (Hub Chain) - Wormhole Chain ID 10004\n// ============================================================================\n\nexport const BASE_SEPOLIA_TOKENS: ChainTokenList = {\n    wormholeChainId: 10004,\n    chainName: 'Base Sepolia',\n    nativeToken: {\n        symbol: 'ETH',\n        name: 'Ether',\n        address: NATIVE_TOKEN_ADDRESS,\n        decimals: 18,\n        isNative: true,\n    },\n    tokens: [\n        {\n            symbol: 'USDC',\n            name: 'USD Coin (Test)',\n            address: '0x036CbD53842c5426634e7929541eC2318f3dCF7e', // Circle test USDC\n            decimals: 6,\n            isNative: false,\n        },\n        {\n            symbol: 'WETH',\n            name: 'Wrapped Ether',\n            address: '0x4200000000000000000000000000000000000006',\n            decimals: 18,\n            isNative: false,\n        },\n    ],\n};\n\n// ============================================================================\n// Optimism Sepolia (Spoke Chain) - Wormhole Chain ID 10005\n// ============================================================================\n\nexport const OPTIMISM_SEPOLIA_TOKENS: ChainTokenList = {\n    wormholeChainId: 10005,\n    chainName: 'Optimism Sepolia',\n    nativeToken: {\n        symbol: 'ETH',\n        name: 'Ether',\n        address: NATIVE_TOKEN_ADDRESS,\n        decimals: 18,\n        isNative: true,\n    },\n    tokens: [\n        {\n            symbol: 'USDC',\n            name: 'USD Coin (Test)',\n            address: '0x5fd84259d66Cd46123540766Be93DFE6D43130D7', // Test USDC\n            decimals: 6,\n            isNative: false,\n        },\n        {\n            symbol: 'WETH',\n            name: 'Wrapped Ether',\n            address: '0x4200000000000000000000000000000000000006',\n            decimals: 18,\n            isNative: false,\n        },\n        {\n            symbol: 'WETH.base',\n            name: 'Wrapped WETH (Base via Wormhole)',\n            address: '0xD408f6498f48aE11BcAb518dA39cF7940eE3271d', // Wormhole-wrapped Base WETH\n            decimals: 18,\n            isNative: false,\n        },\n    ],\n};\n\n// ============================================================================\n// Arbitrum Sepolia (Spoke Chain) - Wormhole Chain ID 10003\n// ============================================================================\n\nexport const ARBITRUM_SEPOLIA_TOKENS: ChainTokenList = {\n    wormholeChainId: 10003,\n    chainName: 'Arbitrum Sepolia',\n    nativeToken: {\n        symbol: 'ETH',\n        name: 'Ether',\n        address: NATIVE_TOKEN_ADDRESS,\n        decimals: 18,\n        isNative: true,\n    },\n    tokens: [\n        {\n            symbol: 'USDC',\n            name: 'USD Coin (Test)',\n            address: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d', // Circle USDC Arbitrum Sepolia\n            decimals: 6,\n            isNative: false,\n        },\n        {\n            symbol: 'WETH',\n            name: 'Wrapped Ether',\n            address: '0x980B62Da83eFf3D4576C647993b0c1D7faf17c73',\n            decimals: 18,\n            isNative: false,\n        },\n    ],\n};\n\n// ============================================================================\n// Ethereum Sepolia (Spoke Chain) - Wormhole Chain ID 10002\n// ============================================================================\n\nexport const ETHEREUM_SEPOLIA_TOKENS: ChainTokenList = {\n    wormholeChainId: 10002,\n    chainName: 'Ethereum Sepolia',\n    nativeToken: {\n        symbol: 'ETH',\n        name: 'Ether',\n        address: NATIVE_TOKEN_ADDRESS,\n        decimals: 18,\n        isNative: true,\n    },\n    tokens: [\n        {\n            symbol: 'USDC',\n            name: 'USD Coin (Test)',\n            address: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238', // Circle USDC Sepolia\n            decimals: 6,\n            isNative: false,\n        },\n        {\n            symbol: 'WETH',\n            name: 'Wrapped Ether',\n            address: '0x7b79995e5f793A07Bc00c21412e50Ecae098E7f9', // WETH Sepolia\n            decimals: 18,\n            isNative: false,\n        },\n        {\n            symbol: 'LINK',\n            name: 'Chainlink Token',\n            address: '0x779877A7B0D9E8603169DdbD7836e478b4624789', // LINK Sepolia\n            decimals: 18,\n            isNative: false,\n        },\n    ],\n};\n\n// ============================================================================\n// Monad Testnet (Spoke Chain) - Wormhole Chain ID 10048\n// ============================================================================\n\nexport const MONAD_TESTNET_TOKENS: ChainTokenList = {\n    wormholeChainId: 10048,\n    chainName: 'Monad Testnet',\n    nativeToken: {\n        symbol: 'MON',\n        name: 'Monad',\n        decimals: 18,\n        address: NATIVE_TOKEN_ADDRESS,\n        isNative: true,\n    },\n    tokens: [\n        {\n            symbol: 'USDC',\n            name: 'USD Coin',\n            decimals: 6,\n            address: '0x754704Bc059F8C67012fEd69BC8A327a5aafb603',\n            isNative: false,\n        },\n        {\n            symbol: 'AUSD',\n            name: 'Agora Dollar',\n            decimals: 18,\n            address: '0x00000000eFE302BEAA2b3e6e1b18d08D69a9012a',\n            isNative: false,\n        },\n        {\n            symbol: 'WMON',\n            name: 'Wrapped MON',\n            decimals: 18,\n            address: '0x3bd359C1119dA7Da1D913D1C4D2B7c461115433A',\n            isNative: false,\n        },\n    ],\n};\n\n// ============================================================================\n// Avalanche Fuji (Spoke/Hub Chain) - Wormhole Chain ID 6\n// ============================================================================\n\nexport const AVALANCHE_FUJI_TOKENS: ChainTokenList = {\n    wormholeChainId: 6,\n    chainName: 'Avalanche Fuji',\n    nativeToken: {\n        symbol: 'AVAX',\n        name: 'Avalanche',\n        address: NATIVE_TOKEN_ADDRESS,\n        decimals: 18,\n        isNative: true,\n    },\n    tokens: [\n        {\n            symbol: 'USDC',\n            name: 'USD Coin (Test)',\n            address: '0x5425890298aed601595a70AB815c96711a31Bc65', // Circle USDC Fuji\n            decimals: 6,\n            isNative: false,\n        },\n        {\n            symbol: 'USDT',\n            name: 'Tether USD (Test)',\n            address: '0xAb231A5744C8E6c45481754928cCfFFFd4aa0732', // USDT Fuji\n            decimals: 6,\n            isNative: false,\n        },\n        {\n            symbol: 'WAVAX',\n            name: 'Wrapped AVAX',\n            address: '0xd00ae08403B9bbb9124bB305C09058E32C39A48c', // WAVAX Fuji\n            decimals: 18,\n            isNative: false,\n        },\n    ],\n};\n\n// ============================================================================\n// Token Registry\n// ============================================================================\n\n/**\n * All token lists indexed by Wormhole chain ID\n */\nexport const TOKEN_REGISTRY: Record<number, ChainTokenList> = {\n    10004: BASE_SEPOLIA_TOKENS,\n    10005: OPTIMISM_SEPOLIA_TOKENS,\n    10003: ARBITRUM_SEPOLIA_TOKENS,\n    10002: ETHEREUM_SEPOLIA_TOKENS,\n    10048: MONAD_TESTNET_TOKENS,\n    6: AVALANCHE_FUJI_TOKENS,\n};\n\n// ============================================================================\n// Helper Functions\n// ============================================================================\n\n/**\n * Get token list for a chain\n */\nexport function getTokenList(wormholeChainId: number): ChainTokenList | null {\n    return TOKEN_REGISTRY[wormholeChainId] ?? null;\n}\n\n/**\n * Get all tokens for a chain (native + ERC20)\n */\nexport function getAllTokens(wormholeChainId: number): TokenInfo[] {\n    const list = getTokenList(wormholeChainId);\n    if (!list) return [];\n    return [list.nativeToken, ...list.tokens];\n}\n\n/**\n * Get token info by symbol\n */\nexport function getTokenBySymbol(wormholeChainId: number, symbol: string): TokenInfo | null {\n    const tokens = getAllTokens(wormholeChainId);\n    return tokens.find(t => t.symbol.toLowerCase() === symbol.toLowerCase()) ?? null;\n}\n\n/**\n * Get token info by address\n */\nexport function getTokenByAddress(wormholeChainId: number, address: string): TokenInfo | null {\n    const tokens = getAllTokens(wormholeChainId);\n    const normalizedAddress = address.toLowerCase();\n    return tokens.find(t => t.address.toLowerCase() === normalizedAddress) ?? null;\n}\n\n/**\n * Check if an address is the native token\n */\nexport function isNativeToken(address: string): boolean {\n    return address.toLowerCase() === NATIVE_TOKEN_ADDRESS ||\n        address === EVM_ZERO_ADDRESS;\n}\n\n/**\n * Get supported chain IDs\n */\nexport function getSupportedChainIds(): number[] {\n    return Object.keys(TOKEN_REGISTRY).map(Number);\n}\n\n/**\n * Get chain name by Wormhole chain ID\n */\nexport function getChainName(wormholeChainId: number): string | null {\n    return TOKEN_REGISTRY[wormholeChainId]?.chainName ?? null;\n}\n"],"mappings":";;;;;AAQA,SAAS,cAAc;AAiBvB,IAAM,wBAAwB;AAM9B,IAAM,wBAAwB;AAwBvB,IAAM,gBAAN,MAAoB;AAAA,EACf;AAAA,EACA,eAA4C,oBAAI,IAAI;AAAA,EAE5D,YAAY,SAA8B,CAAC,GAAG;AAC1C,SAAK,SAAS;AAAA,MACV,gBAAgB,OAAO,kBAAkB;AAAA,MACzC,kBAAkB,OAAO,oBAAoB;AAAA,MAC7C,YAAY,OAAO,cAAc;AAAA,IACrC;AAGA,QAAI,KAAK,OAAO,oBAAoB,OAAO,WAAW,aAAa;AAC/D,WAAK,gBAAgB;AAAA,IACzB;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAkBA,oBACI,SACA,gBACA,uBACM;AAEN,UAAM,OAAO,OAAO;AAAA,MAChB,OAAO;AAAA,QACH,CAAC,WAAW,SAAS;AAAA,QACrB,CAAC,gBAAgB,OAAO;AAAA,MAC5B;AAAA,IACJ;AAGA,UAAM,WAAW,KAAK,mBAAmB,qBAAqB;AAC9D,UAAM,eAAe,OAAO,UAAU,QAAQ;AAI9C,UAAM,cAAc,OAAO;AAAA,MACvB,CAAC,UAAU,WAAW,WAAW,SAAS;AAAA,MAC1C,CAAC,QAAQ,gBAAgB,MAAM,YAAY;AAAA,IAC/C;AAEA,UAAM,OAAO,OAAO,UAAU,WAAW;AAEzC,WAAO,OAAO,WAAW,OAAO,KAAK,MAAM,EAAE,CAAC;AAAA,EAClD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWA,iCACI,YACA,YACA,gBACA,uBACM;AACN,UAAM,UAAU,eAAe,YAAY,UAAU;AACrD,WAAO,KAAK,oBAAoB,SAAS,gBAAgB,qBAAqB;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA,EAKQ,mBAAmB,uBAAuC;AAE9D,UAAM,OAAO,sBAAsB,YAAY,EAAE,QAAQ,MAAM,EAAE;AAGjE,WAAO,wBAAwB,OAAO;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAaA,MAAM,mBACF,YACA,cACwB;AACxB,UAAM,YAA4B,CAAC;AAEnC,eAAW,CAAC,iBAAiB,MAAM,KAAK,cAAc;AAClD,YAAM,UAAU,MAAM,KAAK;AAAA,QACvB;AAAA,QACA;AAAA,QACA;AAAA,MACJ;AAEA,UAAI,SAAS;AACT,kBAAU,KAAK,OAAO;AAAA,MAC1B;AAAA,IACJ;AAEA,UAAM,WAA4B;AAAA,MAC9B,SAAS,WAAW;AAAA,MACpB,YAAY,WAAW;AAAA,MACvB,YAAY,WAAW;AAAA,MACvB,cAAc,WAAW;AAAA,MACzB;AAAA,MACA,WAAW,KAAK,IAAI;AAAA,MACpB,WAAW,KAAK,IAAI;AAAA,IACxB;AAGA,QAAI,KAAK,OAAO,gBAAgB;AAC5B,WAAK,aAAa,IAAI,WAAW,SAAS,SAAS;AAAA,IACvD;AAGA,QAAI,KAAK,OAAO,kBAAkB;AAC9B,WAAK,cAAc,QAAQ;AAAA,IAC/B;AAEA,WAAO;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,sBACV,YACA,iBACA,QAC4B;AAC5B,QAAI,OAAO,OAAO;AAEd,UAAI,CAAC,OAAO,kBAAkB,CAAC,OAAO,uBAAuB;AACzD,eAAO;AAAA,MACX;AAEA,YAAM,UAAU,KAAK;AAAA,QACjB,WAAW;AAAA,QACX,OAAO;AAAA,QACP,OAAO;AAAA,MACX;AAEA,aAAO;AAAA,QACH;AAAA,QACA,WAAW,OAAO;AAAA,QAClB;AAAA,QACA,OAAO;AAAA,QACP,UAAU;AAAA;AAAA,MACd;AAAA,IACJ,OAAO;AAEH,aAAO,KAAK,oBAAoB,YAAY,iBAAiB,MAAM;AAAA,IACvE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUQ,oBACJ,YACA,iBACA,SACmB;AACnB,YAAQ,iBAAiB;AAAA,MACrB,KAAK;AAGD,eAAO;AAAA,UACH,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS,WAAW;AAAA;AAAA,UACpB,OAAO;AAAA,UACP,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACd;AAAA,MAEJ,KAAK;AAED,eAAO;AAAA,UACH,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS,WAAW;AAAA,UACpB,OAAO;AAAA,UACP,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACd;AAAA,MAEJ,KAAK;AAED,eAAO;AAAA,UACH,iBAAiB;AAAA,UACjB,WAAW;AAAA,UACX,SAAS,WAAW;AAAA,UACpB,OAAO;AAAA,UACP,gBAAgB;AAAA,UAChB,UAAU;AAAA,QACd;AAAA,MAEJ;AAEI,eAAO;AAAA,IACf;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,mBAAmB,SAAiB,iBAAmD;AACnF,UAAM,YAAY,KAAK,aAAa,IAAI,OAAO;AAC/C,WAAO,WAAW,KAAK,OAAK,EAAE,oBAAoB,eAAe;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA,EAKA,aAAa,SAAiC;AAC1C,WAAO,KAAK,aAAa,IAAI,OAAO,KAAK,CAAC;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,uBACI,SACA,iBACA,UACA,kBACI;AACJ,UAAM,YAAY,KAAK,aAAa,IAAI,OAAO;AAC/C,QAAI,CAAC,UAAW;AAEhB,UAAM,UAAU,UAAU,KAAK,OAAK,EAAE,oBAAoB,eAAe;AACzE,QAAI,SAAS;AACT,cAAQ,WAAW;AACnB,cAAQ,mBAAmB;AAAA,IAC/B;AAGA,QAAI,KAAK,OAAO,kBAAkB;AAC9B,WAAK,uBAAuB,SAAS,SAAS;AAAA,IAClD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASQ,kBAAwB;AAC5B,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI;AACA,YAAM,SAAS,aAAa,QAAQ,KAAK,OAAO,UAAW;AAC3D,UAAI,CAAC,OAAQ;AAEb,YAAM,OAAO,KAAK,MAAM,MAAM;AAE9B,iBAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAQ,KAAK,SAAS,GAAG;AAC/D,aAAK,aAAa,IAAI,SAAS,SAAS;AAAA,MAC5C;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,KAAK,iDAAiD,KAAK;AAAA,IACvE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,UAAiC;AACnD,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI;AACA,YAAM,SAAS,aAAa,QAAQ,KAAK,OAAO,UAAW,KAAK;AAChE,YAAM,OAAO,KAAK,MAAM,MAAM;AAE9B,UAAI,CAAC,KAAK,WAAW;AACjB,aAAK,YAAY,CAAC;AAAA,MACtB;AAGA,WAAK,UAAU,SAAS,OAAO,IAAI,SAAS;AAC5C,WAAK,aAAa,KAAK,cAAc,CAAC;AACtC,WAAK,WAAW,SAAS,OAAO,IAAI;AAAA,QAChC,SAAS,SAAS;AAAA,QAClB,YAAY,SAAS,WAAW,SAAS;AAAA,QACzC,YAAY,SAAS,WAAW,SAAS;AAAA,QACzC,cAAc,SAAS;AAAA,QACvB,WAAW,SAAS;AAAA,QACpB,WAAW,SAAS;AAAA,MACxB;AAEA,mBAAa,QAAQ,KAAK,OAAO,YAAa,KAAK,UAAU,IAAI,CAAC;AAAA,IACtE,SAAS,OAAO;AACZ,cAAQ,KAAK,+CAA+C,KAAK;AAAA,IACrE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKQ,uBAAuB,SAAiB,WAAiC;AAC7E,QAAI,OAAO,WAAW,YAAa;AAEnC,QAAI;AACA,YAAM,SAAS,aAAa,QAAQ,KAAK,OAAO,UAAW,KAAK;AAChE,YAAM,OAAO,KAAK,MAAM,MAAM;AAE9B,UAAI,CAAC,KAAK,WAAW;AACjB,aAAK,YAAY,CAAC;AAAA,MACtB;AAEA,WAAK,UAAU,OAAO,IAAI;AAC1B,mBAAa,QAAQ,KAAK,OAAO,YAAa,KAAK,UAAU,IAAI,CAAC;AAAA,IACtE,SAAS,OAAO;AACZ,cAAQ,KAAK,+CAA+C,KAAK;AAAA,IACrE;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACf,SAAK,aAAa,MAAM;AAExB,QAAI,KAAK,OAAO,oBAAoB,OAAO,WAAW,aAAa;AAC/D,mBAAa,WAAW,KAAK,OAAO,UAAW;AAAA,IACnD;AAAA,EACJ;AAAA;AAAA;AAAA;AAAA,EAKA,wBAAwB,SAAyC;AAC7D,QAAI,OAAO,WAAW,YAAa,QAAO;AAE1C,QAAI;AACA,YAAM,SAAS,aAAa,QAAQ,KAAK,OAAO,UAAW;AAC3D,UAAI,CAAC,OAAQ,QAAO;AAEpB,YAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,YAAM,iBAAiB,KAAK,aAAa,OAAO;AAChD,YAAM,YAAY,KAAK,YAAY,OAAO;AAE1C,UAAI,CAAC,kBAAkB,CAAC,UAAW,QAAO;AAE1C,aAAO;AAAA,QACH,SAAS,eAAe;AAAA,QACxB,YAAY,OAAO,eAAe,UAAU;AAAA,QAC5C,YAAY,OAAO,eAAe,UAAU;AAAA,QAC5C,cAAc,eAAe;AAAA,QAC7B;AAAA,QACA,WAAW,eAAe;AAAA,QAC1B,WAAW,eAAe;AAAA,MAC9B;AAAA,IACJ,SAAS,OAAO;AACZ,cAAQ,KAAK,yCAAyC,KAAK;AAC3D,aAAO;AAAA,IACX;AAAA,EACJ;AACJ;;;AClZO,IAAM,uBAAuB;AAK7B,IAAM,mBAAmB;AAMzB,IAAM,sBAAsC;AAAA,EAC/C,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,aAAa;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACJ;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;AAMO,IAAM,0BAA0C;AAAA,EACnD,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,aAAa;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACJ;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;AAMO,IAAM,0BAA0C;AAAA,EACnD,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,aAAa;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACJ;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;AAMO,IAAM,0BAA0C;AAAA,EACnD,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,aAAa;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACJ;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;AAMO,IAAM,uBAAuC;AAAA,EAChD,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,aAAa;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,UAAU;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACJ;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;AAMO,IAAM,wBAAwC;AAAA,EACjD,iBAAiB;AAAA,EACjB,WAAW;AAAA,EACX,aAAa;AAAA,IACT,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,SAAS;AAAA,IACT,UAAU;AAAA,IACV,UAAU;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACJ;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,IACA;AAAA,MACI,QAAQ;AAAA,MACR,MAAM;AAAA,MACN,SAAS;AAAA;AAAA,MACT,UAAU;AAAA,MACV,UAAU;AAAA,IACd;AAAA,EACJ;AACJ;AASO,IAAM,iBAAiD;AAAA,EAC1D,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,GAAG;AACP;AASO,SAAS,aAAa,iBAAgD;AACzE,SAAO,eAAe,eAAe,KAAK;AAC9C;AAKO,SAAS,aAAa,iBAAsC;AAC/D,QAAM,OAAO,aAAa,eAAe;AACzC,MAAI,CAAC,KAAM,QAAO,CAAC;AACnB,SAAO,CAAC,KAAK,aAAa,GAAG,KAAK,MAAM;AAC5C;AAKO,SAAS,iBAAiB,iBAAyB,QAAkC;AACxF,QAAM,SAAS,aAAa,eAAe;AAC3C,SAAO,OAAO,KAAK,OAAK,EAAE,OAAO,YAAY,MAAM,OAAO,YAAY,CAAC,KAAK;AAChF;AAKO,SAAS,kBAAkB,iBAAyB,SAAmC;AAC1F,QAAM,SAAS,aAAa,eAAe;AAC3C,QAAM,oBAAoB,QAAQ,YAAY;AAC9C,SAAO,OAAO,KAAK,OAAK,EAAE,QAAQ,YAAY,MAAM,iBAAiB,KAAK;AAC9E;AAKO,SAAS,cAAc,SAA0B;AACpD,SAAO,QAAQ,YAAY,MAAM,wBAC7B,YAAY;AACpB;AAKO,SAAS,uBAAiC;AAC7C,SAAO,OAAO,KAAK,cAAc,EAAE,IAAI,MAAM;AACjD;AAKO,SAAS,aAAa,iBAAwC;AACjE,SAAO,eAAe,eAAe,GAAG,aAAa;AACzD;","names":[]}