{"version":3,"sources":["../src/chains/solana/SolanaClient.ts"],"sourcesContent":["/**\n * Veridex Protocol SDK - Solana Chain Client\n * \n * Implementation of ChainClient interface for Solana blockchain\n */\n\nimport {\n    Connection,\n    PublicKey,\n} from '@solana/web3.js';\nimport {\n    getAssociatedTokenAddressSync,\n} from '@solana/spl-token';\nimport { createHash } from 'crypto';\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// Types\n// ============================================================================\n\nexport interface SolanaClientConfig {\n    wormholeChainId: number;\n    rpcUrl: string;\n    programId: string; // Veridex Spoke program\n    wormholeCoreBridge: string;\n    tokenBridge: string;\n    network?: 'mainnet' | 'devnet' | 'testnet';\n    commitment?: 'processed' | 'confirmed' | 'finalized';\n}\n\n// ============================================================================\n// Constants\n// ============================================================================\n\n// ============================================================================\n// SolanaClient Class\n// ============================================================================\n\n/**\n * Solana implementation of the ChainClient interface\n */\nexport class SolanaClient implements ChainClient {\n    private config: ChainConfig;\n    private connection: Connection;\n    private programId: PublicKey;\n\n    constructor(config: SolanaClientConfig) {\n        this.config = {\n            name: `Solana ${config.network || 'mainnet'}`,\n            chainId: config.wormholeChainId,\n            wormholeChainId: config.wormholeChainId,\n            rpcUrl: config.rpcUrl,\n            explorerUrl: config.network === 'devnet'\n                ? 'https://explorer.solana.com?cluster=devnet'\n                : 'https://explorer.solana.com',\n            isEvm: false,\n            contracts: {\n                hub: undefined, // Solana is a spoke only\n                wormholeCoreBridge: config.wormholeCoreBridge,\n                tokenBridge: config.tokenBridge,\n            },\n        };\n\n        this.connection = new Connection(\n            config.rpcUrl,\n            config.commitment || 'confirmed'\n        );\n        this.programId = new PublicKey(config.programId);\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            const accountInfo = await this.connection.getAccountInfo(new PublicKey(vaultAddress));\n\n            if (!accountInfo || accountInfo.data.length < 40) {\n                return 0n;\n            }\n\n            // Nonce is stored at offset 8 (after discriminator)\n            // Read as u64 little-endian\n            const nonce = accountInfo.data.readBigUInt64LE(8);\n            return nonce;\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 account\n            return 0n; // Solana 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 // Solana Keypair or similar\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 Solana 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 Solana, this still goes through the Hub chain\n     * Solana 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    async getVaultAddress(userKeyHash: string): Promise<string | null> {\n        try {\n            const vaultAddress = this.computeVaultAddressFromHash(userKeyHash);\n            const accountInfo = await this.connection.getAccountInfo(new PublicKey(vaultAddress));\n\n            if (!accountInfo) {\n                return null;\n            }\n\n            return vaultAddress;\n        } catch (error) {\n            console.error('Error getting vault address:', error);\n            return null;\n        }\n    }\n\n    /**\n     * Compute vault address using PDA (Program Derived Address)\n     * Seeds: [\"vault\", userKeyHash]\n     */\n    computeVaultAddress(userKeyHash: string): string {\n        return this.computeVaultAddressFromHash(userKeyHash);\n    }\n\n    private computeVaultAddressFromHash(userKeyHash: string): string {\n        const userKeyHashBuffer = Buffer.from(userKeyHash.replace('0x', ''), 'hex');\n        const [vaultPda] = PublicKey.findProgramAddressSync(\n            [Buffer.from('vault'), userKeyHashBuffer],\n            this.programId\n        );\n        return vaultPda.toBase58();\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 Solana must be done via relayer. ' +\n            'Use createVaultViaRelayer() instead.'\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 Solana must be done via relayer. ' +\n            'Use createVaultViaRelayer() instead.'\n        );\n    }\n\n    /**\n     * Create a vault via the relayer (sponsored/gasless)\n     * This is the recommended way to create Solana vaults\n     */\n    async createVaultViaRelayer(\n        userKeyHash: string,\n        relayerUrl: string\n    ): Promise<VaultCreationResult> {\n        const response = await fetch(`${relayerUrl}/api/v1/solana/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, // Solana doesn't have block numbers like EVM\n            gasUsed: 0n, // Solana uses compute units, not gas\n            alreadyExisted: !result.transactionHash,\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/solana/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 SOL estimate for vault creation (rent + compute)\n        // ~0.002 SOL for rent-exempt account + compute units\n        return 2_000_000n; // 0.002 SOL in lamports\n    }\n\n    getFactoryAddress(): string | undefined {\n        // Solana uses program addresses, not factory pattern\n        return undefined;\n    }\n\n    getImplementationAddress(): string | undefined {\n        // Solana uses program addresses, not implementation pattern\n        return undefined;\n    }\n\n    // ========================================================================\n    // Balance Methods\n    // ========================================================================\n\n    /**\n     * Get native SOL balance\n     */\n    async getNativeBalance(address: string): Promise<bigint> {\n        const balance = await this.connection.getBalance(new PublicKey(address));\n        return BigInt(balance);\n    }\n\n    /**\n     * Get SPL token balance\n     */\n    async getTokenBalance(tokenAddress: string, ownerAddress: string): Promise<bigint> {\n        try {\n            const mint = new PublicKey(tokenAddress);\n            const owner = new PublicKey(ownerAddress);\n            const ata = getAssociatedTokenAddressSync(mint, owner);\n\n            const balance = await this.connection.getTokenAccountBalance(ata);\n            return BigInt(balance.value.amount);\n        } catch (error) {\n            console.error('Error getting token balance:', error);\n            return 0n;\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        // Use SHA-256 for Solana (Solana doesn't have keccak256 built-in)\n        // The relayer will convert this to match EVM format\n        const xBuffer = Buffer.alloc(32);\n        const yBuffer = Buffer.alloc(32);\n\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        Buffer.from(xHex, 'hex').copy(xBuffer);\n        Buffer.from(yHex, 'hex').copy(yBuffer);\n\n        // For cross-chain compatibility, we need to match the EVM hash\n        // This should be keccak256, but we'll return a format the relayer expects\n        const combined = Buffer.concat([xBuffer, yBuffer]);\n        const hash = createHash('sha256').update(combined).digest();\n\n        return '0x' + hash.toString('hex');\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        // This should match the EVM message format for cross-chain compatibility\n        const keyHashBuffer = Buffer.from(keyHash.replace('0x', ''), 'hex');\n        const targetChainBuffer = Buffer.alloc(2);\n        targetChainBuffer.writeUInt16BE(targetChain);\n        const payloadBuffer = Buffer.from(actionPayload.replace('0x', ''), 'hex');\n        const nonceBuffer = Buffer.alloc(32);\n        const nonceHex = nonce.toString(16).padStart(64, '0');\n        Buffer.from(nonceHex, 'hex').copy(nonceBuffer);\n\n        const combined = Buffer.concat([\n            keyHashBuffer,\n            targetChainBuffer,\n            payloadBuffer,\n            nonceBuffer,\n        ]);\n\n        const hash = createHash('sha256').update(combined).digest();\n        return '0x' + hash.toString('hex');\n    }\n\n    /**\n     * Get connection instance for advanced usage\n     */\n    getConnection(): Connection {\n        return this.connection;\n    }\n\n    /**\n     * Get program ID\n     */\n    getProgramId(): PublicKey {\n        return this.programId;\n    }\n\n    /**\n     * Get current slot\n     */\n    async getSlot(): Promise<number> {\n        return await this.connection.getSlot();\n    }\n\n    /**\n     * Get transaction status\n     */\n    async getTransaction(signature: string, commitment?: 'confirmed' | 'finalized') {\n        return await this.connection.getTransaction(signature, {\n            commitment: commitment || 'confirmed',\n            maxSupportedTransactionVersion: 0,\n        });\n    }\n\n    // ============================================================================\n    // Social Recovery Methods (Issue #23)\n    // ============================================================================\n    // \n    // Note: Social recovery is managed on the Hub chain (EVM).\n    // Solana spokes receive and execute recovery VAAs broadcast from the Hub.\n    // These methods are placeholders that indicate spoke-only chains don't\n    // initiate recovery - they only execute recovery instructions from Hub VAAs.\n    //\n    // The relayer service handles:\n    // 1. Fetching recovery VAAs from Wormhole guardians\n    // 2. Submitting execute_recovery instruction to Solana spoke\n    // 3. Processing OwnerRecovered events\n    //\n    // SDK users should use EVMClient methods for guardian management and\n    // recovery initiation on the Hub chain.\n    // ============================================================================\n\n    /**\n     * Check if a recovery VAA has been executed on this spoke\n     * \n     * @param vaaHash - Hash of the recovery VAA\n     * @returns Whether the VAA has been processed\n     */\n    async isRecoveryExecuted(vaaHash: string): Promise<boolean> {\n        try {\n            // Derive VAA record PDA\n            const vaaHashBuffer = Buffer.from(vaaHash.replace('0x', ''), 'hex');\n            const [vaaRecordPda] = PublicKey.findProgramAddressSync(\n                [Buffer.from('vaa_record'), vaaHashBuffer],\n                this.programId\n            );\n\n            const accountInfo = await this.connection.getAccountInfo(vaaRecordPda);\n            if (!accountInfo || accountInfo.data.length < 9) {\n                return false;\n            }\n\n            // First byte after discriminator is 'processed' bool\n            return accountInfo.data[8] === 1;\n        } catch (error) {\n            console.error('Error checking recovery execution:', error);\n            return false;\n        }\n    }\n\n    /**\n     * Get vault owner after potential recovery\n     * \n     * @param vaultAddress - Vault address to check\n     * @returns Current owner key hash\n     */\n    async getVaultOwner(vaultAddress: string): Promise<string> {\n        try {\n            const accountInfo = await this.connection.getAccountInfo(new PublicKey(vaultAddress));\n            if (!accountInfo || accountInfo.data.length < 40) {\n                throw new Error('Vault not found');\n            }\n\n            // Owner key hash is stored after discriminator (8 bytes) at offset 8-40\n            const ownerKeyHash = accountInfo.data.slice(8, 40);\n            return '0x' + ownerKeyHash.toString('hex');\n        } catch (error) {\n            console.error('Error getting vault owner:', error);\n            throw error;\n        }\n    }\n\n    /**\n     * Get authorized signers for a vault\n     * \n     * @param vaultAddress - Vault address to check\n     * @returns Array of authorized signer key hashes\n     */\n    async getAuthorizedSigners(vaultAddress: string): Promise<string[]> {\n        try {\n            const accountInfo = await this.connection.getAccountInfo(new PublicKey(vaultAddress));\n            if (!accountInfo || accountInfo.data.length < 235) {\n                throw new Error('Vault not found');\n            }\n\n            // Vault layout:\n            // 8 bytes discriminator\n            // 32 bytes owner_key_hash\n            // 8 bytes nonce\n            // 1 byte paused\n            // 8 bytes daily_limit\n            // 8 bytes daily_spent\n            // 8 bytes day_start\n            // 1 byte bump\n            // 1 byte authorized_signer_count\n            // 5 * 32 bytes authorized_signers\n\n            const signerCount = accountInfo.data[66]; // offset 8+32+8+1+8+8+1 = 66\n            const signers: string[] = [];\n\n            for (let i = 0; i < signerCount; i++) {\n                const offset = 67 + (i * 32); // Start of authorized_signers array\n                const keyHash = accountInfo.data.slice(offset, offset + 32);\n                signers.push('0x' + keyHash.toString('hex'));\n            }\n\n            return signers;\n        } catch (error) {\n            console.error('Error getting authorized signers:', error);\n            throw error;\n        }\n    }\n}\n"],"mappings":"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","names":[]}