{"version":3,"sources":["../src/chains/aptos/AptosClient.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - Aptos Chain Client\n * \n * Implementation of ChainClient interface for Aptos blockchain\n * Updated to use @aptos-labs/ts-sdk v5.x\n */\n\nimport { Aptos, AptosConfig, Network } from '@aptos-labs/ts-sdk';\nimport { sha3_256 } from 'js-sha3';\nimport type {\n    ChainClient,\n    ChainConfig,\n    TransferParams,\n    ExecuteParams,\n    BridgeParams,\n    DispatchResult,\n    WebAuthnSignature,\n    VaultCreationResult,\n} from '../../core/types.js';\nimport { encodeTransferAction, encodeExecuteAction, encodeBridgeAction } from '../../payload.js';\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Get Aptos network from string configuration\n * The new SDK works best with built-in network configuration\n */\nfunction getAptosNetworkEnum(network?: string): Network {\n    if (network === 'mainnet') return Network.MAINNET;\n    if (network === 'devnet') return Network.DEVNET;\n    return Network.TESTNET; // Default to testnet\n}\n\n// ============================================================================\n// Types\n// ============================================================================\n\nexport interface AptosClientConfig {\n    wormholeChainId: number;\n    rpcUrl: string;\n    moduleAddress: string; // Veridex Spoke module address\n    wormholeCoreBridge: string;\n    tokenBridge: string;\n    network?: 'mainnet' | 'testnet' | 'devnet';\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n// ============================================================================\n// AptosClient Class\n// ============================================================================\n\n/**\n * Aptos implementation of the ChainClient interface\n */\nexport class AptosClient implements ChainClient {\n    private config: ChainConfig;\n    private client: Aptos;\n    private moduleAddress: string;\n\n    constructor(config: AptosClientConfig) {\n        // Use SDK's built-in network configuration (more reliable than custom URLs)\n        const network = getAptosNetworkEnum(config.network);\n        \n        this.config = {\n            name: `Aptos ${config.network || 'mainnet'}`,\n            chainId: config.wormholeChainId,\n            wormholeChainId: config.wormholeChainId,\n            rpcUrl: config.rpcUrl, // Keep for reference, but not used for SDK\n            explorerUrl: config.network === 'testnet'\n                ? 'https://explorer.aptoslabs.com?network=testnet'\n                : 'https://explorer.aptoslabs.com',\n            isEvm: false,\n            contracts: {\n                hub: undefined, // Aptos is a spoke only\n                wormholeCoreBridge: config.wormholeCoreBridge,\n                tokenBridge: config.tokenBridge,\n            },\n        };\n\n        // Create Aptos client with built-in network configuration\n        // This is more reliable than custom fullnode URLs\n        const aptosConfig = new AptosConfig({ network });\n        this.client = new Aptos(aptosConfig);\n        this.moduleAddress = config.moduleAddress;\n    }\n\n    getConfig(): ChainConfig {\n        return this.config;\n    }\n\n    async getNonce(userKeyHash: string): Promise<bigint> {\n        try {\n            const vaultAddress = this.computeVaultAddressFromHash(userKeyHash);\n\n            // Query vault resource using new SDK\n            const resources = await this.client.getAccountResources({ \n                accountAddress: vaultAddress \n            });\n            const vaultResource = resources.find(\n                (r: { type: string }) => r.type === `${this.moduleAddress}::vault::Vault`\n            );\n            \n            if (!vaultResource) {\n                return 0n;\n            }\n\n            if (vaultResource && vaultResource.data) {\n                const data = vaultResource.data as { nonce?: string | number };\n                return BigInt(data.nonce || 0);\n            }\n\n            return 0n;\n        } catch (error) {\n            console.error('Error getting nonce:', error);\n            return 0n;\n        }\n    }\n\n    async getMessageFee(): Promise<bigint> {\n        try {\n            // Query Wormhole bridge for message fee\n            // For now, return a default estimate\n            // TODO: Query on-chain Wormhole config\n            return 0n; // Aptos doesn't charge a Wormhole fee in the same way\n        } catch (error) {\n            console.error('Error getting message fee:', error);\n            return 0n;\n        }\n    }\n\n    async buildTransferPayload(params: TransferParams): Promise<string> {\n        return encodeTransferAction(\n            params.token,\n            params.recipient,\n            params.amount\n        );\n    }\n\n    async buildExecutePayload(params: ExecuteParams): Promise<string> {\n        return encodeExecuteAction(\n            params.target,\n            params.value,\n            params.data\n        );\n    }\n\n    async buildBridgePayload(params: BridgeParams): Promise<string> {\n        return encodeBridgeAction(\n            params.token,\n            params.amount,\n            params.destinationChain,\n            params.recipient\n        );\n    }\n\n    async dispatch(\n        signature: WebAuthnSignature,\n        publicKeyX: bigint,\n        publicKeyY: bigint,\n        targetChain: number,\n        actionPayload: string,\n        nonce: bigint,\n        signer: any // Aptos AptosAccount\n    ): Promise<DispatchResult> {\n        void signature;\n        void publicKeyX;\n        void publicKeyY;\n        void targetChain;\n        void actionPayload;\n        void nonce;\n        void signer;\n        throw new Error(\n            'Direct dispatch not supported on Aptos spoke chains. ' +\n            'Actions must be dispatched from the Hub (EVM) chain. ' +\n            'This client is for receiving cross-chain messages only.'\n        );\n    }\n\n    /**\n     * Dispatch an action via relayer (gasless)\n     * Note: On Aptos, this still goes through the Hub chain\n     * Aptos is a spoke-only chain in Veridex architecture\n     */\n    async dispatchGasless(\n        signature: WebAuthnSignature,\n        publicKeyX: bigint,\n        publicKeyY: bigint,\n        targetChain: number,\n        actionPayload: string,\n        nonce: bigint,\n        relayerUrl: string\n    ): Promise<DispatchResult> {\n        // Compute key hash\n        const keyHash = this.computeKeyHash(publicKeyX, publicKeyY);\n\n        // Build the message that was signed (matches Hub chain format)\n        const message = this.buildMessage(keyHash, targetChain, actionPayload, nonce);\n\n        // Prepare request for relayer\n        const request = {\n            messageHash: message,\n            r: '0x' + signature.r.toString(16).padStart(64, '0'),\n            s: '0x' + signature.s.toString(16).padStart(64, '0'),\n            publicKeyX: '0x' + publicKeyX.toString(16).padStart(64, '0'),\n            publicKeyY: '0x' + publicKeyY.toString(16).padStart(64, '0'),\n            targetChain,\n            actionPayload,\n            nonce: Number(nonce),\n        };\n\n        // Submit to relayer\n        const response = await fetch(`${relayerUrl}/api/v1/submit`, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n            },\n            body: JSON.stringify(request),\n        });\n\n        if (!response.ok) {\n            const error = await response.json().catch(() => ({ error: response.statusText }));\n            throw new Error(`Relayer submission failed: ${error.error || response.statusText}`);\n        }\n\n        const result = await response.json();\n\n        if (!result.success) {\n            throw new Error(`Relayer submission failed: ${result.error}`);\n        }\n\n        return {\n            transactionHash: result.txHash,\n            sequence: BigInt(result.sequence || '0'),\n            userKeyHash: keyHash,\n            targetChain,\n        };\n    }\n\n    /**\n     * Get vault address from on-chain VaultRegistry.\n     * Queries the get_vault_address view function which looks up the vault in the registry.\n     */\n    async getVaultAddress(userKeyHash: string): Promise<string | null> {\n        try {\n            // Normalize: remove 0x if present, lowercase, pad to 64 chars, then add 0x\n            const rawHex = userKeyHash.startsWith('0x') \n                ? userKeyHash.slice(2).toLowerCase()\n                : userKeyHash.toLowerCase();\n            const keyHashHex = `0x${rawHex.padStart(64, '0')}`;\n            \n            // First check if vault exists to avoid noisy 400 errors in console\n            const existsResponse = await this.client.view({\n                payload: {\n                    function: `${this.moduleAddress}::spoke::vault_exists`,\n                    typeArguments: [],\n                    functionArguments: [keyHashHex],\n                }\n            });\n            if (!existsResponse || existsResponse.length === 0 || existsResponse[0] !== true) {\n                return null; // Vault doesn't exist\n            }\n            \n            // Vault exists, now get the address\n            const response = await this.client.view({\n                payload: {\n                    function: `${this.moduleAddress}::spoke::get_vault_address`,\n                    typeArguments: [],\n                    functionArguments: [keyHashHex],\n                }\n            });\n            \n            if (response && response.length > 0) {\n                const vaultAddress = response[0] as string;\n                return vaultAddress;\n            }\n\n            return null;\n        } catch (error: any) {\n            // E_VAULT_NOT_FOUND (error code 6) means vault doesn't exist in registry\n            if (error?.message?.includes('E_VAULT_NOT_FOUND') || \n                error?.message?.includes('error code 6') ||\n                error?.status === 404) {\n                return null;\n            }\n            console.error('Error getting vault address from registry:', error);\n            return null;\n        }\n    }\n\n    /**\n     * @deprecated Use getVaultAddress() instead - this method uses incorrect address derivation.\n     * On Aptos, vaults are created as named objects by the relayer, not resource accounts.\n     * The vault address depends on which relayer created it, so must be queried on-chain.\n     */\n    computeVaultAddress(userKeyHash: string): string {\n        console.warn(\n            'computeVaultAddress() is deprecated for Aptos. ' +\n            'Use getVaultAddress() to query the on-chain VaultRegistry instead.'\n        );\n        return this.computeVaultAddressFromHash(userKeyHash);\n    }\n\n    private computeVaultAddressFromHash(userKeyHash: string): string {\n        // NOTE: This is kept for backward compatibility but produces INCORRECT addresses!\n        // Aptos spoke uses object::create_named_object(creator, key_hash) where:\n        // - creator = relayer address (not module address)\n        // - scheme = 0xFD (named object, not 0xFE resource account)\n        // The correct approach is to query the VaultRegistry on-chain.\n\n        const sourceAddress = this.hexToBytes(this.moduleAddress.replace('0x', ''));\n        const seed = this.hexToBytes(userKeyHash.replace('0x', ''));\n        const scheme = new Uint8Array([0xFE]); // INCORRECT - kept for backward compat\n\n        const combined = new Uint8Array([...sourceAddress, ...seed, ...scheme]);\n        const hash = sha3_256(combined);\n\n        return '0x' + hash;\n    }\n\n    /**\n     * Convert hex string to Uint8Array (browser-compatible)\n     */\n    private hexToBytes(hex: string): Uint8Array {\n        const bytes = new Uint8Array(hex.length / 2);\n        for (let i = 0; i < hex.length; i += 2) {\n            bytes[i / 2] = parseInt(hex.substr(i, 2), 16);\n        }\n        return bytes;\n    }\n\n    async vaultExists(userKeyHash: string): Promise<boolean> {\n        const address = await this.getVaultAddress(userKeyHash);\n        return address !== null;\n    }\n\n    async createVault(userKeyHash: string, signer: any): Promise<VaultCreationResult> {\n        void userKeyHash;\n        void signer;\n        throw new Error(\n            'Vault creation on Aptos must be done via cross-chain message from Hub. ' +\n            'Use the Hub chain client to dispatch a vault creation action targeting Aptos.'\n        );\n    }\n\n    async createVaultSponsored?(\n        userKeyHash: string,\n        sponsorPrivateKey: string,\n        rpcUrl?: string\n    ): Promise<VaultCreationResult> {\n        void userKeyHash;\n        void sponsorPrivateKey;\n        void rpcUrl;\n        throw new Error(\n            'Vault creation on Aptos must be done via cross-chain message from Hub. ' +\n            'Use relayer gasless submission to create vault.'\n        );\n    }\n\n    /**\n     * Create a vault via the relayer (sponsored/gasless)\n     * This is the recommended way to create Aptos vaults\n     * \n     * The relayer will dispatch a vault creation action from Hub to Aptos spoke\n     */\n    async createVaultViaRelayer(\n        userKeyHash: string,\n        relayerUrl: string\n    ): Promise<VaultCreationResult> {\n        const response = await fetch(`${relayerUrl}/api/v1/aptos/vault`, {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n            },\n            body: JSON.stringify({\n                userKeyHash,\n                chainId: this.config.wormholeChainId,\n            }),\n        });\n\n        const result = await response.json();\n\n        if (!response.ok || !result.success) {\n            throw new Error(result.error || 'Failed to create vault via relayer');\n        }\n\n        return {\n            address: result.vaultAddress,\n            transactionHash: result.transactionHash || '',\n            blockNumber: 0,\n            gasUsed: 0n,\n            alreadyExisted: result.alreadyExists || false,\n            sponsoredBy: 'relayer',\n        };\n    }\n\n    /**\n     * Get vault info via relayer (includes existence check)\n     */\n    async getVaultViaRelayer(\n        userKeyHash: string,\n        relayerUrl: string\n    ): Promise<{ vaultAddress: string; exists: boolean }> {\n        const response = await fetch(\n            `${relayerUrl}/api/v1/aptos/vault/${userKeyHash}?chainId=${this.config.wormholeChainId}`\n        );\n\n        if (!response.ok) {\n            throw new Error('Failed to get vault info from relayer');\n        }\n\n        const result = await response.json();\n        return {\n            vaultAddress: result.vaultAddress,\n            exists: result.exists,\n        };\n    }\n\n    async estimateVaultCreationGas(userKeyHash: string): Promise<bigint> {\n        void userKeyHash;\n        // Return APT estimate for vault creation\n        // ~0.001 APT for account creation + gas\n        return 100_000n; // 0.001 APT in octas (1 APT = 100M octas)\n    }\n\n    getFactoryAddress(): string | undefined {\n        // Aptos uses module addresses, not factory pattern\n        return undefined;\n    }\n\n    getImplementationAddress(): string | undefined {\n        // Aptos uses module addresses, not implementation pattern\n        return undefined;\n    }\n\n    // ========================================================================\n    // Balance Methods\n    // ========================================================================\n\n    /**\n     * Get native APT balance\n     */\n    async getNativeBalance(address: string): Promise<bigint> {\n        try {\n            const resource = await this.client.getAccountResource({\n                accountAddress: address,\n                resourceType: '0x1::coin::CoinStore<0x1::aptos_coin::AptosCoin>'\n            });\n\n            if (resource && resource.data) {\n                const data = resource.data as any;\n                return BigInt(data.coin?.value || 0);\n            }\n\n            return 0n;\n        } catch (error) {\n            console.error('Error getting native balance:', error);\n            return 0n;\n        }\n    }\n\n    /**\n     * Get fungible asset (FA) or coin balance\n     */\n    async getTokenBalance(tokenAddress: string, ownerAddress: string): Promise<bigint> {\n        try {\n            // Try as Coin type first\n            const coinType = tokenAddress.includes('::')\n                ? tokenAddress\n                : `${tokenAddress}::coin::Coin`;\n\n            const resource = await this.client.getAccountResource({\n                accountAddress: ownerAddress,\n                resourceType: `0x1::coin::CoinStore<${coinType}>`\n            });\n\n            if (resource && resource.data) {\n                const data = resource.data as any;\n                return BigInt(data.coin?.value || 0);\n            }\n\n            return 0n;\n        } catch (error) {\n            // If Coin query fails, try Fungible Asset (FA) format\n            try {\n                // FA balances are stored differently\n                // Would need to query the FA resource\n                console.warn('FA balance query not fully implemented yet');\n                return 0n;\n            } catch (faError) {\n                console.error('Error getting token balance:', error);\n                return 0n;\n            }\n        }\n    }\n\n    // ========================================================================\n    // Utility Methods\n    // ========================================================================\n\n    /**\n     * Compute key hash from public key coordinates\n     * Matches EVM keccak256(abi.encode(publicKeyX, publicKeyY))\n     */\n    private computeKeyHash(publicKeyX: bigint, publicKeyY: bigint): string {\n        // Write as big-endian to match EVM encoding\n        const xHex = publicKeyX.toString(16).padStart(64, '0');\n        const yHex = publicKeyY.toString(16).padStart(64, '0');\n\n        const xBytes = this.hexToBytes(xHex);\n        const yBytes = this.hexToBytes(yHex);\n\n        // Use SHA3-256 for Aptos (which is what Aptos uses natively)\n        // For cross-chain compatibility, this should match the EVM hash\n        const combined = new Uint8Array([...xBytes, ...yBytes]);\n        const hash = sha3_256(combined);\n\n        return '0x' + hash;\n    }\n\n    /**\n     * Build message for signing (matches Hub chain format)\n     */\n    private buildMessage(\n        keyHash: string,\n        targetChain: number,\n        actionPayload: string,\n        nonce: bigint\n    ): string {\n        const keyHashBytes = this.hexToBytes(keyHash.replace('0x', ''));\n        const targetChainBytes = new Uint8Array(2);\n        targetChainBytes[0] = (targetChain >> 8) & 0xFF;\n        targetChainBytes[1] = targetChain & 0xFF;\n        const payloadBytes = this.hexToBytes(actionPayload.replace('0x', ''));\n        const nonceHex = nonce.toString(16).padStart(64, '0');\n        const nonceBytes = this.hexToBytes(nonceHex);\n\n        const combined = new Uint8Array([\n            ...keyHashBytes,\n            ...targetChainBytes,\n            ...payloadBytes,\n            ...nonceBytes,\n        ]);\n\n        const hash = sha3_256(combined);\n        return '0x' + hash;\n    }\n\n    /**\n     * Get Aptos client instance for advanced usage\n     */\n    getClient(): Aptos {\n        return this.client;\n    }\n\n    /**\n     * Get module address\n     */\n    getModuleAddress(): string {\n        return this.moduleAddress;\n    }\n\n    /**\n     * Get current ledger version\n     */\n    async getLedgerVersion(): Promise<bigint> {\n        const ledgerInfo = await this.client.getLedgerInfo();\n        return BigInt(ledgerInfo.ledger_version);\n    }\n\n    /**\n     * Get transaction by hash\n     */\n    async getTransaction(txHash: string): Promise<any> {\n        return await this.client.getTransactionByHash({ transactionHash: txHash });\n    }\n\n    /**\n     * Wait for transaction confirmation\n     */\n    async waitForTransaction(txHash: string, timeoutSecs: number = 30): Promise<any> {\n        return await this.client.waitForTransaction({\n            transactionHash: txHash,\n            options: {\n                timeoutSecs,\n                checkSuccess: true,\n            }\n        });\n    }\n\n    // ============================================================================\n    // Social Recovery Methods (Issue #23)\n    // ============================================================================\n    // \n    // Note: Social recovery is managed on the Hub chain (EVM).\n    // Aptos spokes receive and execute recovery VAAs broadcast from the Hub.\n    // The relayer service handles submitting recovery transactions to Aptos.\n    //\n    // SDK users should use EVMClient methods for guardian management and\n    // recovery initiation on the Hub chain.\n    // ============================================================================\n\n    /**\n     * Get vault resource for an owner\n     * \n     * @param ownerKeyHash - Owner's passkey hash (32 bytes as hex)\n     * @returns Vault resource data or null if not found\n     */\n    async getVaultResource(ownerKeyHash: string): Promise<{\n        ownerKeyHash: string;\n        authorizedSigners: string[];\n        nonce: bigint;\n    } | null> {\n        try {\n            const vaultAddress = this.computeVaultAddressFromHash(ownerKeyHash);\n\n            const resource = await this.client.getAccountResource({\n                accountAddress: vaultAddress,\n                resourceType: `${this.moduleAddress}::vault::Vault`\n            });\n\n            if (!resource || !resource.data) {\n                return null;\n            }\n\n            const data = resource.data as any;\n            return {\n                ownerKeyHash: data.owner_key_hash || ownerKeyHash,\n                authorizedSigners: data.authorized_signers || [],\n                nonce: BigInt(data.nonce || 0),\n            };\n        } catch (error) {\n            console.error('Error getting vault resource:', error);\n            return null;\n        }\n    }\n\n    /**\n     * Get authorized signers for a vault\n     * \n     * @param ownerKeyHash - Owner's passkey hash (32 bytes as hex)\n     * @returns Array of authorized signer key hashes\n     */\n    async getAuthorizedSigners(ownerKeyHash: string): Promise<string[]> {\n        const vaultResource = await this.getVaultResource(ownerKeyHash);\n        return vaultResource?.authorizedSigners || [];\n    }\n\n    /**\n     * Check if a VAA has been processed (for replay protection)\n     * \n     * @param vaaHash - VAA hash as hex string\n     * @returns Whether the VAA has been processed\n     */\n    async isVaaProcessed(vaaHash: string): Promise<boolean> {\n        try {\n            const resource = await this.client.getAccountResource({\n                accountAddress: this.moduleAddress,\n                resourceType: `${this.moduleAddress}::spoke::ProcessedVAAs`\n            });\n\n            if (!resource || !resource.data) {\n                return false;\n            }\n\n            const data = resource.data as any;\n            const processedVaas = data.processed || [];\n\n            // Check if vaaHash is in the processed list\n            const normalizedHash = vaaHash.toLowerCase().replace('0x', '');\n            return processedVaas.some((hash: string) => \n                hash.toLowerCase().replace('0x', '') === normalizedHash\n            );\n        } catch (error) {\n            console.error('Error checking VAA status:', error);\n            return false;\n        }\n    }\n\n    /**\n     * Check if protocol is paused\n     * \n     * @returns Whether the protocol is paused\n     */\n    async isProtocolPaused(): Promise<boolean> {\n        try {\n            const resource = await this.client.getAccountResource({\n                accountAddress: this.moduleAddress,\n                resourceType: `${this.moduleAddress}::spoke::Config`\n            });\n\n            if (!resource || !resource.data) {\n                return false;\n            }\n\n            const data = resource.data as any;\n            return data.paused === true;\n        } catch (error) {\n            console.error('Error checking pause status:', error);\n            return false;\n        }\n    }\n}\n"],"mappings":"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","names":[]}