@aptos-labs/cross-chain-core 5.9.0 → 6.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/CrossChainCore.d.ts +75 -0
- package/dist/CrossChainCore.d.ts.map +1 -1
- package/dist/index.js +360 -161
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +361 -165
- package/dist/index.mjs.map +1 -1
- package/dist/providers/wormhole/signers/AptosLocalSigner.d.ts +8 -6
- package/dist/providers/wormhole/signers/AptosLocalSigner.d.ts.map +1 -1
- package/dist/providers/wormhole/signers/AptosSigner.d.ts +2 -1
- package/dist/providers/wormhole/signers/AptosSigner.d.ts.map +1 -1
- package/dist/providers/wormhole/signers/EthereumSigner.d.ts +1 -1
- package/dist/providers/wormhole/signers/EthereumSigner.d.ts.map +1 -1
- package/dist/providers/wormhole/signers/Signer.d.ts +10 -2
- package/dist/providers/wormhole/signers/Signer.d.ts.map +1 -1
- package/dist/providers/wormhole/signers/SolanaLocalSigner.d.ts +4 -0
- package/dist/providers/wormhole/signers/SolanaLocalSigner.d.ts.map +1 -1
- package/dist/providers/wormhole/signers/SolanaSigner.d.ts.map +1 -1
- package/dist/providers/wormhole/signers/solanaUtils.d.ts.map +1 -1
- package/dist/providers/wormhole/types.d.ts +78 -1
- package/dist/providers/wormhole/types.d.ts.map +1 -1
- package/dist/providers/wormhole/wormhole.d.ts +27 -1
- package/dist/providers/wormhole/wormhole.d.ts.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +5 -5
- package/src/CrossChainCore.ts +91 -4
- package/src/providers/wormhole/signers/AptosLocalSigner.ts +27 -14
- package/src/providers/wormhole/signers/AptosSigner.ts +10 -1
- package/src/providers/wormhole/signers/EthereumSigner.ts +57 -6
- package/src/providers/wormhole/signers/Signer.ts +19 -2
- package/src/providers/wormhole/signers/SolanaLocalSigner.ts +7 -0
- package/src/providers/wormhole/signers/SolanaSigner.ts +4 -1
- package/src/providers/wormhole/signers/solanaUtils.ts +43 -19
- package/src/providers/wormhole/types.ts +100 -1
- package/src/providers/wormhole/wormhole.ts +138 -28
- package/src/version.ts +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/CrossChainCore.ts","../src/providers/wormhole/wormhole.ts","../src/utils/logger.ts","../src/utils/receiptSerialization.ts","../src/providers/wormhole/signers/AptosLocalSigner.ts","../src/providers/wormhole/signers/SolanaSigner.ts","../src/providers/wormhole/signers/solanaUtils.ts","../src/providers/wormhole/signers/EthereumSigner.ts","../src/providers/wormhole/signers/AptosSigner.ts","../src/providers/wormhole/signers/SuiSigner.ts","../src/providers/wormhole/signers/Signer.ts","../src/providers/wormhole/utils.ts","../src/providers/wormhole/types.ts","../src/providers/wormhole/signers/SolanaLocalSigner.ts","../src/config/types.ts","../src/config/testnet/chains.ts","../src/config/testnet/tokens.ts","../src/config/mainnet/chains.ts","../src/config/mainnet/tokens.ts","../src/utils/getUsdcBalance.ts"],"sourcesContent":["export * from \"./CrossChainCore\";\nexport * from \"./config\";\nexport * from \"./providers/wormhole/index\";\nexport * from \"./providers/wormhole/types\";\nexport * from \"./utils/receiptSerialization\";\nexport { Network } from \"@aptos-labs/ts-sdk\";\n","import { Account, Network } from \"@aptos-labs/ts-sdk\";\n\nimport {\n WormholeTransferRequest,\n WormholeTransferResponse,\n WormholeProvider,\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeWithdrawRequest,\n WormholeWithdrawResponse,\n} from \"./providers/wormhole\";\n\nimport {\n ChainsConfig,\n testnetChains,\n testnetTokens,\n mainnetChains,\n mainnetTokens,\n TokenConfig,\n ChainConfig,\n} from \"./config\";\nimport {\n getAptosWalletUSDCBalance,\n getEthereumWalletUSDCBalance,\n getSolanaWalletUSDCBalance,\n getSuiWalletUSDCBalance,\n} from \"./utils/getUsdcBalance\";\n\nexport interface CrossChainDappConfig {\n aptosNetwork: Network;\n disableTelemetry?: boolean;\n solanaConfig?: {\n rpc?: string;\n priorityFeeConfig?: {\n percentile?: number;\n percentileMultiple?: number;\n min?: number;\n max?: number;\n };\n /**\n * URL of a server-side API endpoint that claims withdraw transactions on Solana.\n * When set, the SDK will POST the attested receipt to this URL instead of\n * asking the user's wallet to sign the claim transaction.\n *\n * Expected request body: { serializedReceipt: string, destinationAddress: string, sourceChain: string }\n * Expected response: { destinationChainTxnId: string }\n * Check out the SERVERSIDE_SOLANA_SIGNER.md file for more details.\n * \n * @example\n * const crossChainCore = new CrossChainCore({\n * dappConfig: {\n * aptosNetwork: Network.TESTNET,\n * solanaConfig: {\n * serverClaimUrl: \"/api/claim-withdraw\",\n * },\n * },\n * });\n */\n serverClaimUrl?: string;\n };\n}\nexport type { AccountAddressInput } from \"@aptos-labs/ts-sdk\";\nexport { NetworkToChainId, NetworkToNodeAPI } from \"@aptos-labs/ts-sdk\";\nexport type AptosAccount = Account;\n\n// List of all the supported chain\nexport type Chain =\n | \"Solana\"\n | \"Ethereum\"\n | \"Sepolia\"\n | \"Aptos\"\n | \"BaseSepolia\"\n | \"ArbitrumSepolia\"\n | \"Avalanche\"\n | \"Base\"\n | \"Arbitrum\"\n | \"PolygonSepolia\"\n | \"Polygon\"\n | \"Sui\";\n\n// Map of Ethereum chain id to testnet chain config\nexport const EthereumChainIdToTestnetChain: Record<string, ChainConfig> = {\n 11155111: testnetChains.Sepolia!,\n 84532: testnetChains.BaseSepolia!,\n 421614: testnetChains.ArbitrumSepolia!,\n 43113: testnetChains.Avalanche!,\n 80002: testnetChains.PolygonSepolia!,\n};\n\n// Map of Ethereum chain id to mainnet chain config\nexport const EthereumChainIdToMainnetChain: Record<string, ChainConfig> = {\n 1: mainnetChains.Ethereum!,\n 8453: mainnetChains.Base!,\n 42161: mainnetChains.Arbitrum!,\n 43114: mainnetChains.Avalanche!,\n 137: mainnetChains.Polygon!,\n};\n\nexport type CCTPProviders = \"Wormhole\";\n\nexport interface CrossChainProvider<\n TQuoteRequest = any,\n TQuoteResponse = any,\n TTransferRequest = any,\n TTransferResponse = any,\n TWithdrawRequest = any,\n TWithdrawResponse = any,\n> {\n getQuote(params: TQuoteRequest): Promise<TQuoteResponse>;\n transfer(params: TTransferRequest): Promise<TTransferResponse>;\n withdraw(params: TWithdrawRequest): Promise<TWithdrawResponse>;\n}\n\nexport class CrossChainCore {\n readonly _dappConfig: CrossChainDappConfig = {\n aptosNetwork: Network.TESTNET,\n };\n\n readonly CHAINS: ChainsConfig = testnetChains;\n readonly TOKENS: Record<string, TokenConfig> = testnetTokens;\n\n constructor(args: { dappConfig: CrossChainDappConfig }) {\n this._dappConfig = args.dappConfig;\n if (args.dappConfig?.aptosNetwork === Network.MAINNET) {\n this.CHAINS = mainnetChains;\n this.TOKENS = mainnetTokens;\n } else {\n this.CHAINS = testnetChains;\n this.TOKENS = testnetTokens;\n }\n }\n\n getProvider(providerType: CCTPProviders): CrossChainProvider {\n switch (providerType) {\n case \"Wormhole\":\n return new WormholeProvider(this) as CrossChainProvider<\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeTransferRequest,\n WormholeTransferResponse,\n WormholeWithdrawRequest,\n WormholeWithdrawResponse\n >;\n default:\n throw new Error(`Unknown provider: ${providerType}`);\n }\n }\n\n async getWalletUSDCBalance(\n walletAddress: string,\n sourceChain: Chain,\n ): Promise<string> {\n if (sourceChain === \"Aptos\") {\n return await getAptosWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n );\n }\n\n if (!this.CHAINS[sourceChain]) {\n throw new Error(`Unsupported chain: ${sourceChain}`);\n }\n switch (sourceChain) {\n case \"Solana\":\n return await getSolanaWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n this._dappConfig?.solanaConfig?.rpc ??\n this.CHAINS[sourceChain].defaultRpc,\n );\n case \"Ethereum\":\n case \"BaseSepolia\":\n case \"Sepolia\":\n case \"Avalanche\":\n case \"ArbitrumSepolia\":\n case \"Arbitrum\":\n case \"Base\":\n case \"PolygonSepolia\":\n case \"Polygon\":\n return await getEthereumWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n sourceChain,\n // TODO: maybe let the user config it\n this.CHAINS[sourceChain].defaultRpc,\n );\n case \"Sui\":\n return await getSuiWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n this.CHAINS[sourceChain].defaultRpc,\n );\n default:\n throw new Error(`Unsupported chain: ${sourceChain}`);\n }\n }\n}\n","import {\n routes,\n Wormhole,\n wormhole,\n PlatformLoader,\n TransferState,\n} from \"@wormhole-foundation/sdk\";\nimport { Network, sleep } from \"@aptos-labs/ts-sdk\";\nimport aptos from \"@wormhole-foundation/sdk/aptos\";\nimport solana from \"@wormhole-foundation/sdk/solana\";\nimport evm from \"@wormhole-foundation/sdk/evm\";\nimport sui from \"@wormhole-foundation/sdk/sui\";\n\nimport {\n Chain,\n CrossChainProvider,\n CrossChainCore,\n} from \"../../CrossChainCore\";\nimport { logger } from \"../../utils/logger\";\nimport { serializeReceipt } from \"../../utils/receiptSerialization\";\nimport { AptosLocalSigner } from \"./signers/AptosLocalSigner\";\nimport { Signer } from \"./signers/Signer\";\nimport { ChainConfig } from \"../../config\";\nimport { createCCTPRoute } from \"./utils\";\nimport {\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeTransferRequest,\n WormholeTransferResponse,\n WormholeRouteResponse,\n WormholeRequest,\n WormholeSubmitTransferRequest,\n WormholeStartTransferResponse,\n WormholeClaimTransferRequest,\n WormholeWithdrawRequest,\n WormholeWithdrawResponse,\n WormholeInitiateWithdrawRequest,\n WormholeInitiateWithdrawResponse,\n WormholeClaimWithdrawRequest,\n WormholeClaimWithdrawResponse,\n WithdrawError,\n} from \"./types\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\nimport { EIP1193DerivedWallet } from \"@aptos-labs/derived-wallet-ethereum\";\nimport { SuiDerivedWallet } from \"@aptos-labs/derived-wallet-sui\";\n\nexport class WormholeProvider implements CrossChainProvider<\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeTransferRequest,\n WormholeTransferResponse,\n WormholeWithdrawRequest,\n WormholeWithdrawResponse\n> {\n private crossChainCore: CrossChainCore;\n\n private _wormholeContext: Wormhole<\"Mainnet\" | \"Testnet\"> | undefined;\n\n private wormholeRoute: WormholeRouteResponse | undefined;\n private wormholeRequest: WormholeRequest | undefined;\n private wormholeQuote: WormholeQuoteResponse | undefined;\n private destinationChain?: Chain;\n\n constructor(core: CrossChainCore) {\n this.crossChainCore = core;\n }\n\n get wormholeContext(): Wormhole<\"Mainnet\" | \"Testnet\"> | undefined {\n return this._wormholeContext;\n }\n\n private async setWormholeContext(sourceChain: Chain) {\n const dappNetwork = this.crossChainCore._dappConfig?.aptosNetwork;\n if (dappNetwork === Network.DEVNET) {\n throw new Error(\"Devnet is not supported on Wormhole\");\n }\n if (!sourceChain) {\n throw new Error(\"Origin chain not selected\");\n }\n const isMainnet = dappNetwork === Network.MAINNET;\n const platforms: PlatformLoader<any>[] = [aptos, solana, evm, sui];\n\n // Get custom RPC endpoints from config\n const solanaRpc =\n this.crossChainCore._dappConfig?.solanaConfig?.rpc ??\n this.crossChainCore.CHAINS[\"Solana\"]?.defaultRpc;\n\n const wh = await wormhole(isMainnet ? \"Mainnet\" : \"Testnet\", platforms, {\n chains: {\n Solana: {\n rpc: solanaRpc,\n },\n },\n });\n this._wormholeContext = wh;\n }\n\n private async getRoute(\n sourceChain: Chain,\n destinationChain: Chain,\n ): Promise<{\n route: WormholeRouteResponse;\n request: WormholeRequest;\n }> {\n if (!this._wormholeContext) {\n throw new Error(\"Wormhole context not initialized\");\n }\n\n const { route: cctpRoute, request } = await createCCTPRoute(\n this._wormholeContext,\n sourceChain,\n destinationChain,\n this.crossChainCore.TOKENS,\n );\n\n this.wormholeRoute = cctpRoute;\n this.wormholeRequest = request;\n this.destinationChain = destinationChain;\n\n return { route: cctpRoute, request };\n }\n\n async getQuote(input: WormholeQuoteRequest): Promise<WormholeQuoteResponse> {\n const { amount, originChain, type } = input;\n\n if (!this._wormholeContext) {\n await this.setWormholeContext(originChain);\n }\n\n logger.log(\"type\", type);\n // If the type of the transaction is \"transfer\", we want to transfer from a x-chain wallet to the Aptos wallet\n // If the type of the transaction is \"withdraw\", we want to transfer from the Aptos wallet to a x-chain wallet\n const sourceChain = type === \"transfer\" ? originChain : \"Aptos\";\n const destinationChain = type === \"transfer\" ? \"Aptos\" : originChain;\n\n const { route, request } = await this.getRoute(\n sourceChain,\n destinationChain,\n );\n\n // TODO what is nativeGas for?\n const transferParams = {\n amount: amount,\n options: { nativeGas: 0 },\n };\n\n const validated = await route.validate(request, transferParams);\n if (!validated.valid) {\n logger.log(\"invalid\", validated.valid);\n throw new Error(`Invalid quote: ${validated.error}`);\n }\n const quote = await route.quote(request, validated.params);\n if (!quote.success) {\n logger.log(\"quote failed\", quote.success);\n throw new Error(`Invalid quote: ${quote.error}`);\n }\n this.wormholeQuote = quote;\n logger.log(\"quote\", quote);\n return quote;\n }\n\n async submitCCTPTransfer(\n input: WormholeSubmitTransferRequest,\n ): Promise<WormholeStartTransferResponse> {\n const { sourceChain, wallet, destinationAddress } = input;\n\n if (!this._wormholeContext) {\n await this.setWormholeContext(sourceChain);\n }\n if (!this.wormholeRoute || !this.wormholeRequest || !this.wormholeQuote) {\n throw new Error(\"Wormhole route, request, or quote not initialized\");\n }\n\n let signerAddress: string;\n\n const chainContext = this.getChainConfig(sourceChain).context;\n\n //const currentAccount = await wallet.getAccount();\n if (chainContext === \"Solana\") {\n signerAddress =\n (wallet as SolanaDerivedWallet).solanaWallet.publicKey?.toBase58() ||\n \"\";\n } else if (chainContext === \"Ethereum\") {\n // is Ethereum\n [signerAddress] = await (\n wallet as EIP1193DerivedWallet\n ).eip1193Provider.request({\n method: \"eth_requestAccounts\",\n });\n } else if (chainContext === \"Sui\") {\n signerAddress =\n (wallet as SuiDerivedWallet).suiWallet.accounts[0].address || \"\";\n } else {\n throw new Error(\"Unsupported chain context: \" + chainContext);\n }\n logger.log(\"signerAddress\", signerAddress);\n\n const signer = new Signer(\n this.getChainConfig(sourceChain),\n signerAddress,\n {},\n wallet,\n this.crossChainCore,\n );\n\n logger.log(\"signer\", signer);\n logger.log(\"wormholeRequest\", this.wormholeRequest);\n logger.log(\"wormholeQuote\", this.wormholeQuote);\n\n let receipt = await this.wormholeRoute.initiate(\n this.wormholeRequest,\n signer,\n this.wormholeQuote,\n Wormhole.chainAddress(\"Aptos\", destinationAddress.toString()),\n );\n\n const originChainTxnId =\n \"originTxs\" in receipt\n ? receipt.originTxs[receipt.originTxs.length - 1].txid\n : undefined;\n\n return { originChainTxnId: originChainTxnId || \"\", receipt };\n }\n\n async claimCCTPTransfer(\n input: WormholeClaimTransferRequest,\n ): Promise<{ destinationChainTxnId: string }> {\n let { receipt, mainSigner, sponsorAccount } = input;\n if (!this.wormholeRoute) {\n throw new Error(\"Wormhole route not initialized\");\n }\n\n logger.log(\"mainSigner\", mainSigner.accountAddress.toString());\n\n let retries = 0;\n const maxRetries = 5;\n const baseDelay = 1000; // Initial delay of 1 second\n\n while (retries < maxRetries) {\n try {\n for await (receipt of this.wormholeRoute.track(receipt, 120 * 1000)) {\n if (receipt.state >= TransferState.SourceInitiated) {\n logger.log(\"Receipt is on track \", receipt);\n\n try {\n const signer = new AptosLocalSigner(\n \"Aptos\",\n {},\n mainSigner, // the account that signs the \"claim\" transaction\n sponsorAccount, // the fee payer account\n this.crossChainCore._dappConfig?.aptosNetwork,\n );\n\n if (routes.isManual(this.wormholeRoute)) {\n const circleAttestationReceipt =\n await this.wormholeRoute.complete(signer, receipt);\n logger.log(\"Claim receipt: \", circleAttestationReceipt);\n const destinationChainTxnId = signer.claimedTransactionHashes();\n return { destinationChainTxnId };\n } else {\n // Should be unreachable\n return { destinationChainTxnId: \"\" };\n }\n } catch (e) {\n console.error(\"Failed to claim\", e);\n return { destinationChainTxnId: \"\" };\n }\n }\n }\n } catch (e) {\n console.error(\n `Error tracking transfer (attempt ${retries + 1} / ${maxRetries}):`,\n e,\n );\n const delay = baseDelay * Math.pow(2, retries); // Exponential backoff\n await sleep(delay);\n retries++;\n }\n }\n // Should be unreachable\n return { destinationChainTxnId: \"\" };\n }\n\n /**\n * Initiates a transfer of USDC funds from the source chain wallet to the destination chain wallet\n * @param args\n * @returns\n */\n async transfer(\n input: WormholeTransferRequest,\n ): Promise<WormholeTransferResponse> {\n if (this.crossChainCore._dappConfig?.aptosNetwork === Network.DEVNET) {\n throw new Error(\"Devnet is not supported on Wormhole\");\n }\n // if amount is provided, it is expected to get the quote internally\n // and initiate a transfer automatically\n if (input.amount) {\n await this.getQuote({\n amount: input.amount,\n originChain: input.sourceChain,\n type: \"transfer\",\n });\n }\n // Submit transfer transaction from origin chain\n let { originChainTxnId, receipt } = await this.submitCCTPTransfer(input);\n // Claim transfer transaction on destination chain\n const { destinationChainTxnId } = await this.claimCCTPTransfer({\n receipt,\n mainSigner: input.mainSigner,\n sponsorAccount: input.sponsorAccount,\n });\n return { originChainTxnId, destinationChainTxnId };\n }\n\n // --- Split withdraw flow: initiateWithdraw + trackWithdraw + claimWithdraw ---\n\n /**\n * Phase 1: Initiates a withdraw by burning USDC on Aptos.\n * The user signs the Aptos burn transaction via their wallet.\n * Returns a receipt that can be tracked and later claimed.\n */\n async initiateWithdraw(\n input: WormholeInitiateWithdrawRequest,\n ): Promise<WormholeInitiateWithdrawResponse> {\n const { wallet, destinationAddress, sponsorAccount } = input;\n\n if (!this._wormholeContext) {\n throw new Error(\"Wormhole context not initialized\");\n }\n if (!this.wormholeRoute || !this.wormholeRequest || !this.wormholeQuote) {\n throw new Error(\"Wormhole route, request, or quote not initialized\");\n }\n\n const signer = new Signer(\n this.getChainConfig(\"Aptos\"),\n (\n await wallet.features[\"aptos:account\"].account()\n ).address.toString(),\n {},\n wallet,\n this.crossChainCore,\n sponsorAccount,\n );\n\n const wormholeDestAddress = Wormhole.chainAddress(\n this.destinationChain!,\n destinationAddress.toString(),\n );\n\n const receipt = await this.wormholeRoute.initiate(\n this.wormholeRequest,\n signer,\n this.wormholeQuote,\n wormholeDestAddress,\n );\n logger.log(\"initiateWithdraw receipt\", receipt);\n\n const originChainTxnId =\n \"originTxs\" in receipt\n ? receipt.originTxs[receipt.originTxs.length - 1].txid\n : undefined;\n\n return { originChainTxnId: originChainTxnId || \"\", receipt };\n }\n\n /**\n * Phase 2: Tracks a withdraw receipt until attestation is ready.\n * This polls Wormhole and returns once the receipt reaches the Attested state.\n */\n async trackWithdraw(\n receipt: routes.Receipt,\n ): Promise<routes.Receipt> {\n if (!this.wormholeRoute) {\n throw new Error(\"Wormhole route not initialized\");\n }\n\n let retries = 0;\n const maxRetries = 5;\n const baseDelay = 1000;\n\n while (retries < maxRetries) {\n try {\n for await (receipt of this.wormholeRoute.track(receipt, 120 * 1000)) {\n if (receipt.state >= TransferState.Attested) {\n logger.log(\"trackWithdraw: receipt attested\", receipt);\n return receipt;\n }\n }\n } catch (e) {\n console.error(\n `Error tracking withdraw (attempt ${retries + 1} / ${maxRetries}):`,\n e,\n );\n const delay = baseDelay * Math.pow(2, retries);\n await sleep(delay);\n retries++;\n }\n }\n throw new Error(\"Failed to track withdraw to attested state\");\n }\n\n /**\n * Phase 3: Claims the withdraw on the destination chain.\n *\n * If the destination is Solana and `solanaConfig.serverClaimUrl` is configured\n * in the dapp config, the SDK automatically POSTs the attested receipt to that\n * URL — no wallet popup required. The dapp's server endpoint handles signing\n * and submitting the claim transaction.\n *\n * Otherwise falls back to the wallet-based Signer (triggers wallet popup).\n */\n async claimWithdraw(\n input: WormholeClaimWithdrawRequest,\n ): Promise<WormholeClaimWithdrawResponse> {\n const { sourceChain, destinationAddress, receipt } = input;\n\n // Server-side claim path: Solana destination with configured serverClaimUrl\n const serverClaimUrl =\n this.crossChainCore._dappConfig?.solanaConfig?.serverClaimUrl;\n\n if (sourceChain === \"Solana\" && serverClaimUrl) {\n logger.log(\"claimWithdraw: using server-side claim via\", serverClaimUrl);\n\n const response = await fetch(serverClaimUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n receipt: serializeReceipt(receipt),\n destinationAddress,\n sourceChain,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.error ||\n `Server-side claim failed with status ${response.status}`,\n );\n }\n\n const result = await response.json();\n return { destinationChainTxnId: result.destinationChainTxnId };\n }\n\n // Wallet-based claim path\n if (!this.wormholeRoute) {\n throw new Error(\"Wormhole route not initialized\");\n }\n\n if (!input.wallet) {\n throw new Error(\n \"Wallet is required for claim when serverClaimUrl is not configured\",\n );\n }\n\n const claimSigner = new Signer(\n this.getChainConfig(sourceChain),\n destinationAddress,\n {},\n input.wallet,\n this.crossChainCore,\n );\n\n if (routes.isManual(this.wormholeRoute)) {\n const circleAttestationReceipt = await this.wormholeRoute.complete(\n claimSigner,\n receipt,\n );\n logger.log(\"claimWithdraw receipt:\", circleAttestationReceipt);\n const destinationChainTxnId = claimSigner.claimedTransactionHashes();\n return { destinationChainTxnId };\n } else {\n throw new Error(\"Automatic route not supported for manual claim\");\n }\n }\n\n /**\n * Withdraws USDC from Aptos to a destination chain.\n * Orchestrates all three phases internally:\n * 1. Initiate — user signs the Aptos burn transaction\n * 2. Track — wait for Wormhole attestation\n * 3. Claim — if serverClaimUrl is configured for Solana, delegates to\n * the server; otherwise uses the wallet-based signer.\n *\n * The optional `onPhaseChange` callback lets the dapp update its UI\n * as the flow progresses.\n */\n async withdraw(\n input: WormholeWithdrawRequest,\n ): Promise<WormholeWithdrawResponse> {\n const { sourceChain, wallet, destinationAddress, sponsorAccount, onPhaseChange } = input;\n\n // Phase 1: Initiate — user signs Aptos burn\n onPhaseChange?.(\"initiating\");\n const { originChainTxnId, receipt } = await this.initiateWithdraw({\n wallet,\n destinationAddress,\n sponsorAccount,\n });\n\n // Phases 2 & 3 are wrapped so that, if they fail, the caller still\n // receives the originChainTxnId (the irreversible Aptos burn).\n let currentPhase: \"tracking\" | \"claiming\" = \"tracking\";\n try {\n // Phase 2: Track — wait for attestation\n onPhaseChange?.(\"tracking\");\n const attestedReceipt = await this.trackWithdraw(receipt);\n\n // Phase 3: Claim — server-side or wallet-based\n currentPhase = \"claiming\";\n onPhaseChange?.(\"claiming\");\n const { destinationChainTxnId } = await this.claimWithdraw({\n sourceChain,\n destinationAddress: destinationAddress.toString(),\n receipt: attestedReceipt,\n wallet,\n });\n\n return { originChainTxnId, destinationChainTxnId };\n } catch (error: any) {\n throw new WithdrawError(\n error?.message ?? \"Withdraw failed after Aptos burn\",\n originChainTxnId,\n currentPhase,\n error,\n );\n }\n }\n\n getChainConfig(chain: Chain): ChainConfig {\n const chainConfig =\n this.crossChainCore.CHAINS[\n chain as keyof typeof this.crossChainCore.CHAINS\n ];\n if (!chainConfig) {\n throw new Error(`Chain config not found for chain: ${chain}`);\n }\n return chainConfig;\n }\n}\n","export const logger = {\n log: (...args: any[]) => {\n if (process.env.NODE_ENV === \"development\") {\n console.log(...args);\n }\n },\n warn: (...args: any[]) => {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (process.env.NODE_ENV === \"development\") {\n console.error(...args);\n }\n },\n};\n","import {\n routes,\n AttestationReceipt,\n UniversalAddress,\n} from \"@wormhole-foundation/sdk\";\n\n// Cross-platform base64 helpers (no Node.js Buffer dependency)\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Serializes a Wormhole receipt for JSON transport.\n *\n * JSON doesn't natively support BigInt, Uint8Array, or class instances.\n * This function converts these types to a serializable format with type markers\n * that can be reconstructed by `deserializeReceipt`.\n *\n * @example\n * ```typescript\n * import { serializeReceipt } from \"@aptos-labs/cross-chain-core\";\n *\n * // On the client side, before sending to server\n * const serialized = serializeReceipt(receipt);\n * await fetch(\"/api/claim\", {\n * method: \"POST\",\n * body: JSON.stringify({ receipt: serialized }),\n * });\n * ```\n */\nexport function serializeReceipt(\n receipt: routes.Receipt<AttestationReceipt>,\n): unknown {\n return JSON.parse(\n JSON.stringify(receipt, (_key, value) => {\n if (typeof value === \"bigint\") {\n return { __type: \"bigint\", value: value.toString() };\n }\n // Check UniversalAddress before Uint8Array — if the SDK ever makes\n // UniversalAddress extend Uint8Array the order matters.\n if (value instanceof UniversalAddress) {\n return {\n __type: \"UniversalAddress\",\n value: uint8ArrayToBase64(value.toUint8Array()),\n };\n }\n if (value instanceof Uint8Array) {\n return {\n __type: \"Uint8Array\",\n value: uint8ArrayToBase64(value),\n };\n }\n return value;\n }),\n );\n}\n\n/**\n * Deserializes a Wormhole receipt from JSON transport format.\n *\n * Reconstructs BigInt, Uint8Array, and UniversalAddress instances from\n * the serialized format produced by `serializeReceipt`.\n *\n * @example\n * ```typescript\n * import { deserializeReceipt, SolanaLocalSigner } from \"@aptos-labs/cross-chain-core\";\n *\n * // On the server side, after receiving from client\n * const receipt = deserializeReceipt(body.receipt);\n * await cctpRoute.complete(signer, receipt);\n * ```\n */\nexport function deserializeReceipt(\n obj: unknown,\n): routes.Receipt<AttestationReceipt> {\n function revive(value: unknown, key?: string): unknown {\n if (value && typeof value === \"object\") {\n const objValue = value as Record<string, unknown>;\n\n // Handle serialized BigInt, Uint8Array, and UniversalAddress\n if (\"__type\" in objValue) {\n if (objValue.__type === \"bigint\") {\n return BigInt(objValue.value as string);\n }\n if (objValue.__type === \"UniversalAddress\") {\n return new UniversalAddress(\n base64ToUint8Array(objValue.value as string),\n );\n }\n if (objValue.__type === \"Uint8Array\") {\n return base64ToUint8Array(objValue.value as string);\n }\n }\n\n // Backwards-compatible fallback: reconstruct UniversalAddress for known\n // CCTP message address fields that were serialized without __type markers\n // (i.e. data produced before UniversalAddress-aware serialization).\n const addressFields = [\n \"sender\",\n \"recipient\",\n \"destinationCaller\",\n \"burnToken\",\n \"mintRecipient\",\n \"messageSender\",\n ];\n if (key && addressFields.includes(key) && \"address\" in objValue) {\n const addressBytes = revive(objValue.address);\n if (addressBytes instanceof Uint8Array) {\n return new UniversalAddress(addressBytes);\n }\n }\n\n // Recursively process nested objects and arrays\n if (Array.isArray(value)) {\n return value.map((v, i) => revive(v, String(i)));\n }\n const result: Record<string, unknown> = {};\n for (const k in objValue) {\n result[k] = revive(objValue[k], k);\n }\n return result;\n }\n return value;\n }\n\n return revive(obj) as routes.Receipt<AttestationReceipt>;\n}\n\n","import {\n AccountAuthenticator,\n AnyRawTransaction,\n Aptos,\n AptosConfig,\n Network as AptosNetwork,\n Account,\n} from \"@aptos-labs/ts-sdk\";\n\nimport {\n Chain,\n Network,\n SignAndSendSigner,\n TxHash,\n UnsignedTransaction,\n} from \"@wormhole-foundation/sdk\";\nimport {\n AptosUnsignedTransaction,\n AptosChains,\n} from \"@wormhole-foundation/sdk-aptos\";\nimport { GasStationApiKey } from \"../types\";\nimport { isAccount } from \"./AptosSigner\";\n\nexport class AptosLocalSigner<\n N extends Network,\n C extends Chain,\n> implements SignAndSendSigner<N, C> {\n _chain: C;\n _options: any;\n _wallet: Account;\n _sponsorAccount: Account | GasStationApiKey | undefined;\n _claimedTransactionHashes: string[] = [];\n _dappNetwork: AptosNetwork;\n constructor(\n chain: C,\n options: any,\n wallet: Account,\n feePayerAccount: Account | GasStationApiKey | undefined,\n dappNetwork: AptosNetwork,\n ) {\n this._chain = chain;\n this._options = options;\n this._wallet = wallet;\n this._sponsorAccount = feePayerAccount;\n this._dappNetwork = dappNetwork;\n }\n\n chain(): C {\n return this._chain;\n }\n address(): string {\n return this._wallet.accountAddress.toString();\n }\n\n claimedTransactionHashes(): string {\n return this._claimedTransactionHashes.join(\",\");\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\n this._claimedTransactionHashes = [];\n\n for (const tx of txs) {\n const txId = await signAndSendTransaction(\n tx as AptosUnsignedTransaction<Network, AptosChains>,\n this._wallet,\n this._sponsorAccount,\n this._dappNetwork,\n );\n txHashes.push(txId);\n this._claimedTransactionHashes.push(txId);\n }\n return txHashes;\n }\n}\n\nexport async function signAndSendTransaction(\n request: UnsignedTransaction<Network, AptosChains>,\n wallet: Account,\n sponsorAccount: Account | GasStationApiKey | undefined,\n dappNetwork: AptosNetwork,\n) {\n if (!wallet) {\n throw new Error(\"Wallet is undefined\");\n }\n\n const payload = request.transaction;\n // The wallets do not handle Uint8Array serialization\n payload.functionArguments = payload.functionArguments.map((a: any) => {\n if (a instanceof Uint8Array) {\n return Array.from(a);\n } else if (typeof a === \"bigint\") {\n return a.toString();\n } else {\n return a;\n }\n });\n\n const aptosConfig = new AptosConfig({\n network: dappNetwork,\n });\n const aptos = new Aptos(aptosConfig);\n\n const txnToSign = await aptos.transaction.build.simple({\n data: payload,\n sender: wallet.accountAddress.toString(),\n withFeePayer: sponsorAccount ? true : false,\n });\n\n const senderAuthenticator = await aptos.transaction.sign({\n signer: wallet,\n transaction: txnToSign,\n });\n\n const txnToSubmit: {\n transaction: AnyRawTransaction;\n senderAuthenticator: AccountAuthenticator;\n feePayerAuthenticator?: AccountAuthenticator;\n } = {\n transaction: txnToSign,\n senderAuthenticator,\n };\n\n if (sponsorAccount) {\n // Gas station is currently impossible to use, since the transactino we get from \n // Wormhole is a script transaction and gas station only supports entry function transactions\n const feePayerSignerAuthenticator = aptos.transaction.signAsFeePayer({\n signer: sponsorAccount as Account,\n transaction: txnToSign,\n });\n txnToSubmit.feePayerAuthenticator = feePayerSignerAuthenticator;\n }\n const response = await aptos.transaction.submit.simple(txnToSubmit);\n\n const tx = await aptos.waitForTransaction({\n transactionHash: response.hash,\n });\n\n return tx.hash;\n}\n","/**\n * Client-side Solana signer for wallet-based transaction signing.\n * This function signs and sends the transaction while constantly checking for confirmation\n * and resending the transaction if it hasn't been confirmed after the specified interval.\n */\n\nimport {\n ConfirmOptions,\n Transaction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { Connection } from \"@solana/web3.js\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport { SolanaUnsignedTransaction } from \"@wormhole-foundation/sdk-solana\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\nimport {\n addPriorityFeeInstructions,\n sendAndConfirmTransaction,\n PriorityFeeConfig,\n} from \"./solanaUtils\";\n\n// Re-export types for backwards compatibility\nexport type { SolanaRpcProvider, PriorityFeeConfig } from \"./solanaUtils\";\nexport {\n sleep,\n isEmptyObject,\n determineRpcProvider,\n} from \"./solanaUtils\";\n\n// See https://docs.triton.one/chains/solana/sending-txs for more information\nexport async function signAndSendTransaction(\n request: SolanaUnsignedTransaction<Network>,\n wallet: AdapterWallet | undefined,\n options?: ConfirmOptions,\n crossChainCore?: CrossChainCore,\n) {\n if (!wallet || !(wallet instanceof SolanaDerivedWallet)) {\n throw new Error(\"Invalid wallet type or missing Solana wallet\");\n }\n\n const commitment = options?.commitment ?? \"finalized\";\n // Solana rpc should come from dapp config\n const connection = new Connection(\n crossChainCore?._dappConfig?.solanaConfig?.rpc ??\n crossChainCore?.CHAINS[\"Solana\"]?.defaultRpc ??\n \"https://api.devnet.solana.com\", // Last resort fallback\n );\n const { blockhash, lastValidBlockHeight } =\n await connection.getLatestBlockhash(commitment);\n\n // Add priority fee instructions\n const unsignedTx = await setPriorityFeeInstructions(\n connection,\n blockhash,\n lastValidBlockHeight,\n request,\n crossChainCore?._dappConfig?.solanaConfig?.priorityFeeConfig,\n );\n\n if (!wallet.solanaWallet.signTransaction) {\n throw new Error(\"Wallet does not support signing transactions\");\n }\n\n const tx = await wallet.solanaWallet.signTransaction(unsignedTx);\n\n if (!tx) throw new Error(\"Failed to sign transaction\");\n\n // Order matters. Phantom's Lighthouse security requires wallet to sign first,\n // then additional signers sign afterward\n if (request.transaction.signers && tx instanceof Transaction) {\n tx.partialSign(...request.transaction.signers);\n }\n\n const serializedTx = tx.serialize();\n\n // Use shared utility for sending and confirming\n const signature = await sendAndConfirmTransaction(\n serializedTx,\n blockhash,\n lastValidBlockHeight,\n {\n connection,\n commitment,\n retryIntervalMs: 5000,\n verbose: false,\n },\n );\n\n return signature;\n}\n\n/**\n * Prepares a transaction with priority fee instructions.\n */\nexport async function setPriorityFeeInstructions(\n connection: Connection,\n blockhash: string,\n lastValidBlockHeight: number,\n request: SolanaUnsignedTransaction<Network>,\n priorityFeeConfig?: PriorityFeeConfig,\n): Promise<Transaction | VersionedTransaction> {\n const unsignedTx = request.transaction.transaction as Transaction;\n\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Add priority fee instructions using shared utility\n await addPriorityFeeInstructions(\n connection,\n unsignedTx,\n priorityFeeConfig,\n false,\n );\n\n return unsignedTx;\n}\n","/**\n * Shared utilities for Solana transaction handling.\n * Used by both SolanaLocalSigner (server-side) and SolanaSigner (client-side).\n */\n\nimport {\n ComputeBudgetProgram,\n Connection,\n LAMPORTS_PER_SOL,\n RpcResponseAndContext,\n SignatureResult,\n SimulatedTransactionResponse,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n type Commitment,\n} from \"@solana/web3.js\";\nimport {\n determinePriorityFee,\n determinePriorityFeeTritonOne,\n} from \"@wormhole-foundation/sdk-solana\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Configuration for priority fees */\nexport interface PriorityFeeConfig {\n /** Percentile of recent fees to use (default: 0.9) */\n percentile?: number;\n /** Multiplier for the percentile fee (default: 1) */\n percentileMultiple?: number;\n /** Minimum fee in microlamports (default: 100_000) */\n min?: number;\n /** Maximum fee in microlamports (default: 100_000_000) */\n max?: number;\n}\n\n/** Configuration for sending and confirming transactions */\nexport interface SendAndConfirmConfig {\n connection: Connection;\n commitment: Commitment;\n retryIntervalMs?: number;\n /** Enable verbose logging (default: false) */\n verbose?: boolean;\n}\n\n/** RPC provider type for priority fee calculation */\nexport type SolanaRpcProvider = \"triton\" | \"helius\" | \"ankr\" | \"unknown\";\n\n// ============================================================================\n// Transaction Confirmation\n// ============================================================================\n\n/**\n * Sends a serialized transaction and waits for confirmation with automatic retries.\n *\n * @param serializedTx - The serialized transaction bytes\n * @param blockhash - The recent blockhash used in the transaction\n * @param lastValidBlockHeight - The last valid block height for the transaction\n * @param config - Configuration for sending and confirming\n * @returns The transaction signature\n */\nexport async function sendAndConfirmTransaction(\n serializedTx: Buffer | Uint8Array,\n blockhash: string,\n lastValidBlockHeight: number,\n config: SendAndConfirmConfig,\n): Promise<string> {\n const { connection, commitment, retryIntervalMs = 5000, verbose = false } = config;\n\n const sendOptions = {\n skipPreflight: true,\n maxRetries: 0,\n preflightCommitment: commitment,\n };\n\n const signature = await connection.sendRawTransaction(serializedTx, sendOptions);\n\n const confirmTransactionPromise = connection.confirmTransaction(\n { signature, blockhash, lastValidBlockHeight },\n commitment,\n );\n\n // Retry loop: resend if not confirmed after interval\n let confirmedTx: RpcResponseAndContext<SignatureResult> | null = null;\n let txSendAttempts = 1;\n\n while (!confirmedTx) {\n confirmedTx = await Promise.race([\n confirmTransactionPromise,\n new Promise<null>((resolve) =>\n setTimeout(() => resolve(null), retryIntervalMs),\n ),\n ]);\n\n if (confirmedTx) break;\n\n if (verbose) {\n console.log(\n `Tx not confirmed after ${retryIntervalMs * txSendAttempts++}ms, resending`,\n );\n }\n\n try {\n await connection.sendRawTransaction(serializedTx, sendOptions);\n } catch (e) {\n if (verbose) {\n console.error(\"Failed to resend transaction:\", e);\n }\n // Ignore resend errors, confirmation will handle success/failure\n }\n }\n\n if (confirmedTx.value.err) {\n const errorMessage = formatTransactionError(confirmedTx.value.err);\n throw new Error(errorMessage);\n }\n\n return signature;\n}\n\n/**\n * Formats a transaction error into a readable string.\n */\nexport function formatTransactionError(err: unknown): string {\n if (typeof err === \"object\" && err !== null) {\n try {\n return `Transaction failed: ${JSON.stringify(\n err,\n (_key, value) => (typeof value === \"bigint\" ? value.toString() : value),\n )}`;\n } catch {\n // Circular reference or other stringify error\n return \"Transaction failed: Unknown error\";\n }\n }\n return `Transaction failed: ${err}`;\n}\n\n// ============================================================================\n// Priority Fees\n// ============================================================================\n\n/**\n * Adds priority fee instructions to a transaction.\n * Simulates the transaction to determine compute units and calculates optimal fees.\n *\n * @param connection - Solana RPC connection\n * @param transaction - The transaction to add priority fees to\n * @param priorityFeeConfig - Configuration for priority fees\n * @param verbose - Enable verbose logging\n * @returns The transaction with priority fee instructions added\n */\nexport async function addPriorityFeeInstructions(\n connection: Connection,\n transaction: Transaction,\n priorityFeeConfig?: PriorityFeeConfig,\n verbose: boolean = false,\n): Promise<Transaction> {\n const computeBudgetIxFilter = (ix: TransactionInstruction) =>\n ix.programId.toString() !== \"ComputeBudget111111111111111111111111111111\";\n\n // Remove existing compute budget instructions if they were added by the SDK\n transaction.instructions = transaction.instructions.filter(computeBudgetIxFilter);\n\n const instructions = await createPriorityFeeInstructions(\n connection,\n transaction,\n priorityFeeConfig,\n verbose,\n );\n\n transaction.add(...instructions);\n\n return transaction;\n}\n\n/**\n * Creates priority fee instructions based on simulation and fee estimation.\n */\nexport async function createPriorityFeeInstructions(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n priorityFeeConfig?: PriorityFeeConfig,\n verbose: boolean = false,\n): Promise<TransactionInstruction[]> {\n // Simulate to get compute units\n const unitsUsed = await simulateAndGetComputeUnits(connection, transaction);\n const unitBudget = Math.floor(unitsUsed * 1.2); // Budget in 20% headroom\n\n const instructions: TransactionInstruction[] = [];\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n units: unitBudget,\n }),\n );\n\n // Calculate priority fee\n const {\n percentile = 0.9,\n percentileMultiple = 1,\n min = 100_000,\n max = 100_000_000,\n } = priorityFeeConfig ?? {};\n\n const rpcProvider = determineRpcProvider(connection.rpcEndpoint);\n const { fee, methodUsed } = await calculatePriorityFee(\n connection,\n transaction,\n rpcProvider,\n { percentile, percentileMultiple, min, max },\n );\n\n if (verbose) {\n const maxFeeInSol = (fee / 1e6 / LAMPORTS_PER_SOL) * unitBudget;\n console.table({\n \"RPC Provider\": rpcProvider,\n \"Method used\": methodUsed,\n \"Percentile used\": percentile,\n \"Multiple used\": percentileMultiple,\n \"Compute budget\": unitBudget,\n \"Priority fee\": fee,\n \"Max fee in SOL\": maxFeeInSol,\n });\n }\n\n instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: fee }),\n );\n\n return instructions;\n}\n\n/**\n * Simulates a transaction and returns the compute units consumed.\n */\nasync function simulateAndGetComputeUnits(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n): Promise<number> {\n let unitsUsed = 200_000;\n let simulationAttempts = 0;\n\n simulationLoop: while (true) {\n const response = await connection.simulateTransaction(transaction as Transaction);\n\n if (response.value.err) {\n if (checkKnownSimulationError(response.value)) {\n // Number of attempts will be at most 5 for known errors\n if (simulationAttempts < 5) {\n simulationAttempts++;\n await sleep(1000);\n continue simulationLoop;\n }\n } else if (simulationAttempts < 3) {\n // Number of attempts will be at most 3 for unknown errors\n simulationAttempts++;\n await sleep(1000);\n continue simulationLoop;\n }\n\n // Still failing after multiple attempts\n throw new Error(\n `Simulation failed: ${JSON.stringify(response.value.err)}\\nLogs:\\n${(\n response.value.logs || []\n ).join(\"\\n \")}`,\n );\n } else {\n // Simulation was successful\n if (response.value.unitsConsumed) {\n unitsUsed = response.value.unitsConsumed;\n }\n break;\n }\n }\n\n return unitsUsed;\n}\n\n/**\n * Calculates the priority fee based on RPC provider and configuration.\n */\nasync function calculatePriorityFee(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n rpcProvider: SolanaRpcProvider,\n config: Required<PriorityFeeConfig>,\n): Promise<{ fee: number; methodUsed: \"triton\" | \"default\" | \"minimum\" }> {\n const { percentile, percentileMultiple, min, max } = config;\n\n if (rpcProvider === \"triton\") {\n // Triton has an experimental RPC method that accepts a percentile parameter\n // and usually gives more accurate fee numbers.\n try {\n const fee = await determinePriorityFeeTritonOne(\n connection,\n transaction,\n percentile,\n percentileMultiple,\n min,\n max,\n );\n\n return { fee, methodUsed: \"triton\" };\n } catch (e) {\n console.warn(`Failed to determine priority fee using Triton RPC:`, e);\n }\n }\n\n try {\n // By default, use generic Solana RPC method\n const fee = await determinePriorityFee(\n connection,\n transaction,\n percentile,\n percentileMultiple,\n min,\n max,\n );\n\n return { fee, methodUsed: \"default\" };\n } catch (e) {\n console.warn(`Failed to determine priority fee:`, e);\n\n return { fee: min, methodUsed: \"minimum\" };\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Checks response logs for known simulation errors that can be retried.\n */\nfunction checkKnownSimulationError(response: SimulatedTransactionResponse): boolean {\n const errors: Record<string, string> = {};\n\n // This error occurs when the blockhash included in a transaction is not deemed to be valid\n if (response.err === \"BlockhashNotFound\") {\n errors[\"BlockhashNotFound\"] =\n \"Blockhash not found during simulation. Trying again.\";\n }\n\n // Check the response logs for any known errors\n if (response.logs) {\n for (const line of response.logs) {\n if (line.includes(\"SlippageToleranceExceeded\")) {\n errors[\"SlippageToleranceExceeded\"] =\n \"Slippage failure during simulation. Trying again.\";\n }\n\n if (line.includes(\"RequireGteViolated\")) {\n errors[\"RequireGteViolated\"] =\n \"Swap instruction failure during simulation. Trying again.\";\n }\n }\n }\n\n if (Object.keys(errors).length === 0) {\n return false;\n }\n\n console.table(errors);\n return true;\n}\n\n/**\n * Checks whether a hostname is exactly the given domain or a subdomain of it.\n * e.g. isHostOrSubdomainOf(\"api.triton.one\", \"triton.one\") => true\n * isHostOrSubdomainOf(\"not-triton.com\", \"triton.one\") => false\n */\nfunction isHostOrSubdomainOf(hostname: string, base: string): boolean {\n return hostname === base || hostname.endsWith(`.${base}`);\n}\n\n/**\n * Determines the RPC provider from the endpoint URL.\n */\nexport function determineRpcProvider(endpoint: string): SolanaRpcProvider {\n try {\n const url = new URL(endpoint);\n const hostname = url.hostname;\n if (isHostOrSubdomainOf(hostname, \"rpcpool.com\") || isHostOrSubdomainOf(hostname, \"triton.one\")) {\n return \"triton\";\n } else if (isHostOrSubdomainOf(hostname, \"helius-rpc.com\") || isHostOrSubdomainOf(hostname, \"helius.xyz\")) {\n return \"helius\";\n } else if (isHostOrSubdomainOf(hostname, \"ankr.com\")) {\n return \"ankr\";\n } else {\n return \"unknown\";\n }\n } catch {\n return \"unknown\";\n }\n}\n\n/**\n * Sleep for a specified duration.\n */\nexport async function sleep(timeout: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n\n/**\n * Checks whether an object is empty.\n */\nexport const isEmptyObject = (value: object | null | undefined): boolean => {\n if (value === null || value === undefined) {\n return true;\n }\n\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n\n return true;\n};\n\n","import {\n EvmUnsignedTransaction,\n EvmChains,\n} from \"@wormhole-foundation/sdk-evm\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport { ethers, getBigInt } from \"ethers\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { EIP1193DerivedWallet } from \"@aptos-labs/derived-wallet-ethereum\";\nexport async function signAndSendTransaction(\n request: EvmUnsignedTransaction<Network, EvmChains>,\n wallet: AdapterWallet,\n chainName: string,\n options: any,\n): Promise<string> {\n if (!wallet) {\n throw new Error(\"wallet.sendTransaction is undefined\");\n }\n // Ensure the signer is connected to the correct chain\n const chainId = await (\n wallet as EIP1193DerivedWallet\n ).eip1193Provider.request({\n method: \"eth_chainId\",\n });\n const actualChainId = parseInt(chainId, 16);\n\n if (!actualChainId)\n throw new Error(\"No signer found for chain\" + chainName);\n const expectedChainId = request.transaction.chainId\n ? getBigInt(request.transaction.chainId)\n : undefined;\n if (\n !actualChainId ||\n !expectedChainId ||\n BigInt(actualChainId) !== expectedChainId\n ) {\n throw new Error(\n `Signer is not connected to the right chain. Expected ${expectedChainId}, got ${actualChainId}`,\n );\n }\n\n const provider = new ethers.BrowserProvider(\n (wallet as EIP1193DerivedWallet).eip1193Provider,\n );\n const signer = await provider.getSigner();\n const response = await signer.sendTransaction(request.transaction);\n const receipt = await response.wait();\n\n return receipt?.hash || \"\";\n}\n","import {\n Account,\n AccountAddress,\n AccountAuthenticator,\n AnyRawTransaction,\n Aptos,\n AptosConfig,\n Network as AptosNetwork,\n Deserializer,\n InputGenerateTransactionPayloadData,\n ScriptFunctionArgumentTypes,\n} from \"@aptos-labs/ts-sdk\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport {\n AptosChains,\n AptosUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-aptos\";\nimport { GasStationApiKey } from \"..\";\nimport { UserResponseStatus } from \"@aptos-labs/wallet-standard\";\nimport { GasStationClient, GasStationTransactionSubmitter } from \"@aptos-labs/gas-station-client\";\n\nexport async function signAndSendTransaction(\n request: AptosUnsignedTransaction<Network, AptosChains>,\n wallet: AdapterWallet,\n sponsorAccount: Account | GasStationApiKey | undefined,\n dappNetwork: AptosNetwork,\n) {\n if (!wallet) {\n throw new Error(\"wallet.sendTransaction is undefined\");\n }\n\n const payload = request.transaction;\n // The wallets do not handle Uint8Array serialization\n payload.functionArguments = payload.functionArguments.map((a: any) => {\n if (a instanceof Uint8Array) {\n return Array.from(a);\n } else if (typeof a === \"bigint\") {\n return a.toString();\n } else {\n return a;\n }\n });\n\n\n // Configure Aptos client based on sponsor type\n let aptosConfig: AptosConfig;\n const useGasStation = sponsorAccount && !isAccount(sponsorAccount);\n\n if (useGasStation) {\n // Gas station flow - configure with plugin upfront\n const gasStationClient = new GasStationClient({\n network: dappNetwork,\n apiKey: sponsorAccount[dappNetwork as AptosNetwork.TESTNET | AptosNetwork.MAINNET],\n });\n const transactionSubmitter = new GasStationTransactionSubmitter(gasStationClient);\n \n aptosConfig = new AptosConfig({\n network: dappNetwork,\n pluginSettings: {\n TRANSACTION_SUBMITTER: transactionSubmitter,\n },\n });\n } else {\n // Regular flow or Account sponsor\n aptosConfig = new AptosConfig({\n network: dappNetwork,\n });\n }\n\n const aptos = new Aptos(aptosConfig);\n\n // Wormhole resturns a script function transaction payload, but due to a ts-sdk version mismatch,\n // linter complains on different types - so need to first convert to unknown and then to ScriptFunctionArgumentTypes.\n // Also, tranfering the arguments as it brings some errors (which not sure if bug or not), so we first extract them\n // and then tranform them into the functionArguments.\n const functionArguments = extractFunctionArguments(\n payload.functionArguments as unknown as ScriptFunctionArgumentTypes[],\n );\n\n // a custom function to withdraw tokens from the aptos chain,\n // published testnet:\n // https://explorer.aptoslabs.com/account/0x5e2d961f06cd27aa07554a39d55f5ce1e58dff35d803c3529b1cd5c4fa3ab584/modules/code/withdraw?network=testnet\n // published mainnet:\n // https://explorer.aptoslabs.com/account/0x5e2d961f06cd27aa07554a39d55f5ce1e58dff35d803c3529b1cd5c4fa3ab584/modules/code/withdraw?network=mainnet\n const withdrawFunction =\n \"0x5e2d961f06cd27aa07554a39d55f5ce1e58dff35d803c3529b1cd5c4fa3ab584::withdraw::deposit_for_burn\";\n const transactionData: InputGenerateTransactionPayloadData = {\n function: withdrawFunction,\n functionArguments,\n };\n\n const txnToSign = await aptos.transaction.build.simple({\n data: transactionData,\n sender: (\n await wallet.features[\"aptos:account\"]?.account()\n ).address.toString(),\n withFeePayer: sponsorAccount ? true : false,\n });\n\n const response =\n await wallet.features[\"aptos:signTransaction\"]?.signTransaction(txnToSign);\n\n if (response?.status === UserResponseStatus.REJECTED) {\n throw new Error(\"User has rejected the request\");\n }\n\n const txnToSubmit: {\n transaction: AnyRawTransaction;\n senderAuthenticator: AccountAuthenticator;\n feePayerAuthenticator?: AccountAuthenticator;\n } = {\n transaction: txnToSign,\n senderAuthenticator: response.args,\n };\n\n // Only sign as fee payer if it's an Account (not gas station)\n if (sponsorAccount && isAccount(sponsorAccount)) {\n const feePayerSignerAuthenticator = aptos.transaction.signAsFeePayer({\n signer: sponsorAccount,\n transaction: txnToSign,\n });\n txnToSubmit.feePayerAuthenticator = feePayerSignerAuthenticator;\n }\n\n const txnSubmitted = await aptos.transaction.submit.simple(txnToSubmit);\n\n const tx = await aptos.waitForTransaction({\n transactionHash: txnSubmitted.hash,\n });\n\n return tx.hash;\n}\n\n/**\n * Extracts the function arguments from the function arguments array and tranform them into types the sdk can ready.\n *\n * Note: we assume the argument types are always [U64, U32, accountAddress, accountAddress] - even tho we use\n * Wormhole fix version in the package.json, if wormhole changes this, we need to update this function.\n * @param functionArguments - The function arguments array.\n * @returns The function arguments.\n */\nfunction extractFunctionArguments(\n functionArguments: ScriptFunctionArgumentTypes[],\n) {\n const deserializer1 = new Deserializer(functionArguments[0].bcsToBytes());\n const amount = deserializer1.deserializeU64();\n\n const deserializer2 = new Deserializer(functionArguments[1].bcsToBytes());\n const destination_domain = deserializer2.deserializeU32();\n\n const mint_recipient = new AccountAddress(functionArguments[2].bcsToBytes());\n\n const burn_token = new AccountAddress(functionArguments[3].bcsToBytes());\n\n return [amount, destination_domain, mint_recipient, burn_token];\n}\n\nexport function isAccount(obj: Account | GasStationApiKey): obj is Account {\n return 'accountAddress' in obj;\n}\n","import { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport {\n SuiChains,\n SuiUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-sui\";\nimport { SuiDerivedWallet } from \"@aptos-labs/derived-wallet-sui\";\nimport {\n SuiSignAndExecuteTransactionInput,\n SuiSignAndExecuteTransactionOutput,\n} from \"@mysten/wallet-standard\";\n\nexport async function signAndSendTransaction(\n request: SuiUnsignedTransaction<Network, SuiChains>,\n wallet: AdapterWallet,\n): Promise<string> {\n if (!wallet) {\n throw new Error(\"wallet is undefined\");\n }\n const suiDerivedWallet = wallet as SuiDerivedWallet;\n\n const signAndExecuteTransactionFeature = suiDerivedWallet.suiWallet.features[\n \"sui:signAndExecuteTransaction\"\n ] as {\n signAndExecuteTransaction: (\n input: SuiSignAndExecuteTransactionInput,\n ) => Promise<SuiSignAndExecuteTransactionOutput>;\n };\n\n if (!signAndExecuteTransactionFeature) {\n throw new Error(\"wallet does not support signAndExecuteTransaction\");\n }\n\n const { digest } =\n await signAndExecuteTransactionFeature.signAndExecuteTransaction({\n transaction: request.transaction,\n account: suiDerivedWallet.suiWallet.accounts[0],\n chain: `sui:${request.network.toLocaleLowerCase()}`,\n });\n\n return digest;\n}\n","import {\n UnsignedTransaction,\n Network,\n Chain,\n TxHash,\n SignAndSendSigner,\n} from \"@wormhole-foundation/sdk\";\nimport { SolanaUnsignedTransaction } from \"@wormhole-foundation/sdk-solana\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport {\n EvmUnsignedTransaction,\n EvmChains,\n} from \"@wormhole-foundation/sdk-evm\";\nimport {\n SuiChains,\n SuiUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-sui\";\n\nimport * as solanaSigner from \"./SolanaSigner\";\nimport * as ethereumSigner from \"./EthereumSigner\";\nimport * as aptosSigner from \"./AptosSigner\";\nimport * as suiSigner from \"./SuiSigner\";\n\nimport { ChainConfig } from \"../../../config\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nimport { AptosChains } from \"@wormhole-foundation/sdk-aptos/dist/cjs/types\";\nimport { AptosUnsignedTransaction } from \"@wormhole-foundation/sdk-aptos/dist/cjs/unsignedTransaction\";\nimport { GasStationApiKey } from \"../types\";\nimport { Account } from \"@aptos-labs/ts-sdk\";\nexport class Signer<\n N extends Network,\n C extends Chain,\n> implements SignAndSendSigner<N, C> {\n _chain: ChainConfig;\n _address: string;\n _options: any;\n _wallet: AdapterWallet;\n _crossChainCore: CrossChainCore;\n _sponsorAccount: Account | GasStationApiKey | undefined;\n _claimedTransactionHashes: string[] = [];\n\n constructor(\n chain: ChainConfig,\n address: string,\n options: any,\n wallet: AdapterWallet,\n crossChainCore: CrossChainCore,\n sponsorAccount?: Account | GasStationApiKey | undefined,\n ) {\n this._chain = chain;\n this._address = address;\n this._options = options;\n this._wallet = wallet;\n this._crossChainCore = crossChainCore;\n this._sponsorAccount = sponsorAccount;\n }\n\n chain(): C {\n return this._chain.key as C;\n }\n address(): string {\n return this._address;\n }\n\n claimedTransactionHashes(): string {\n return this._claimedTransactionHashes.join(\",\");\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\n this._claimedTransactionHashes = [];\n\n for (const tx of txs) {\n const txId = await signAndSendTransaction(\n this._chain,\n tx,\n this._wallet,\n this._options,\n this._crossChainCore,\n this._sponsorAccount,\n );\n txHashes.push(txId);\n this._claimedTransactionHashes.push(txId);\n }\n return txHashes;\n }\n}\n\nexport const signAndSendTransaction = async (\n chain: ChainConfig,\n request: UnsignedTransaction<Network, Chain>,\n wallet: AdapterWallet,\n options: any = {},\n crossChainCore: CrossChainCore,\n sponsorAccount?: Account | GasStationApiKey | undefined,\n): Promise<string> => {\n if (!wallet) {\n throw new Error(\"wallet is undefined\");\n }\n\n const dappNetwork = crossChainCore._dappConfig.aptosNetwork;\n\n if (chain.context === \"Solana\") {\n const signature = await solanaSigner.signAndSendTransaction(\n request as SolanaUnsignedTransaction<Network>,\n wallet,\n options,\n crossChainCore,\n );\n return signature;\n } else if (chain.context === \"Ethereum\") {\n const tx = await ethereumSigner.signAndSendTransaction(\n request as EvmUnsignedTransaction<Network, EvmChains>,\n wallet,\n chain.displayName,\n options,\n );\n return tx;\n } else if (chain.context === \"Sui\") {\n const tx = await suiSigner.signAndSendTransaction(\n request as SuiUnsignedTransaction<Network, SuiChains>,\n wallet,\n );\n return tx;\n } else if (chain.context === \"Aptos\") {\n const tx = await aptosSigner.signAndSendTransaction(\n request as AptosUnsignedTransaction<Network, AptosChains>,\n wallet,\n sponsorAccount,\n dappNetwork,\n );\n return tx;\n } else {\n throw new Error(`Unsupported chain: ${chain}`);\n }\n};\n","/**\n * Utility functions for Wormhole CCTP route creation.\n * These helpers can be used both by WormholeProvider and server-side claim endpoints.\n */\n\nimport {\n chainToPlatform,\n routes,\n Wormhole,\n TokenId,\n} from \"@wormhole-foundation/sdk\";\nimport { Chain } from \"../../CrossChainCore\";\nimport { TokenConfig } from \"../../config\";\n\nexport interface CCTPRouteResult {\n route: routes.ManualRoute<\"Mainnet\" | \"Testnet\">;\n request: routes.RouteTransferRequest<\"Mainnet\" | \"Testnet\">;\n}\n\n/**\n * Creates a CCTP route for transferring USDC between two chains.\n *\n * This is a standalone helper that can be used both by WormholeProvider\n * (client-side) and server-side claim endpoints to avoid code duplication.\n *\n * @param wh - Initialized Wormhole context\n * @param sourceChain - Source chain (e.g., \"Aptos\")\n * @param destChain - Destination chain (e.g., \"Solana\")\n * @param tokens - Token configuration mapping (mainnetTokens or testnetTokens)\n * @returns The CCTP route and request for completing transfers\n * @throws Error if no valid CCTP route is found\n */\nexport async function createCCTPRoute(\n wh: Wormhole<\"Mainnet\" | \"Testnet\">,\n sourceChain: Chain,\n destChain: Chain,\n tokens: Record<string, TokenConfig>,\n): Promise<CCTPRouteResult> {\n const sourceToken: TokenId = Wormhole.tokenId(\n sourceChain,\n tokens[sourceChain].tokenId.address,\n );\n const destToken: TokenId = Wormhole.tokenId(\n destChain,\n tokens[destChain].tokenId.address,\n );\n\n const destContext = wh\n .getPlatform(chainToPlatform(destChain))\n .getChain(destChain);\n const sourceContext = wh\n .getPlatform(chainToPlatform(sourceChain))\n .getChain(sourceChain);\n\n const request = await routes.RouteTransferRequest.create(\n wh,\n { source: sourceToken, destination: destToken },\n sourceContext,\n destContext,\n );\n\n const resolver = wh.resolver([routes.CCTPRoute]);\n const foundRoutes = await resolver.findRoutes(request);\n const cctpRoute = foundRoutes[0];\n\n if (!cctpRoute || !routes.isManual(cctpRoute)) {\n throw new Error(\"Expected manual CCTP route\");\n }\n\n return { route: cctpRoute, request };\n}\n\n","import { AccountAddressInput, Account, Network } from \"@aptos-labs/ts-sdk\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { routes, AttestationReceipt } from \"@wormhole-foundation/sdk/dist/cjs\";\nimport { Chain, AptosAccount } from \"../..\";\n\nexport type WormholeRouteResponse = routes.Route<\n \"Mainnet\" | \"Testnet\",\n routes.Options,\n routes.ValidatedTransferParams<routes.Options>,\n routes.Receipt\n>;\n\nexport type WormholeRequest = routes.RouteTransferRequest<\n \"Mainnet\" | \"Testnet\"\n>;\n\nexport type WormholeQuoteResponse = routes.Quote<\n routes.Options,\n routes.ValidatedTransferParams<routes.Options>,\n any\n>;\n\nexport interface WormholeQuoteRequest {\n amount: string;\n originChain: Chain;\n type: \"transfer\" | \"withdraw\";\n}\n\nexport type GasStationApiKey = Partial<Record<Network.TESTNET | Network.MAINNET, string>>;\n\nexport interface WormholeTransferRequest {\n sourceChain: Chain;\n wallet: AdapterWallet;\n destinationAddress: AccountAddressInput;\n mainSigner: Account;\n amount?: string;\n sponsorAccount?: Account;\n}\n\nexport type WithdrawPhase =\n | \"initiating\" // User signing Aptos burn transaction\n | \"tracking\" // Waiting for Wormhole attestation (~60s)\n | \"claiming\"; // Claiming on destination chain\n\nexport interface WormholeWithdrawRequest {\n sourceChain: Chain;\n wallet: AdapterWallet;\n destinationAddress: AccountAddressInput;\n sponsorAccount?: Account | GasStationApiKey;\n /** Optional callback fired when the withdraw progresses to a new phase. */\n onPhaseChange?: (phase: WithdrawPhase) => void;\n}\n\nexport interface WormholeSubmitTransferRequest {\n sourceChain: Chain;\n wallet: AdapterWallet;\n destinationAddress: AccountAddressInput;\n}\n\nexport interface WormholeClaimTransferRequest {\n receipt: routes.Receipt<AttestationReceipt>;\n mainSigner: AptosAccount;\n sponsorAccount?: AptosAccount | GasStationApiKey;\n}\n\nexport interface WormholeTransferResponse {\n destinationChainTxnId: string;\n originChainTxnId: string;\n}\n\nexport interface WormholeWithdrawResponse {\n destinationChainTxnId: string;\n originChainTxnId: string;\n}\n\nexport interface WormholeStartTransferResponse {\n originChainTxnId: string;\n receipt: routes.Receipt<AttestationReceipt>;\n}\n\n// --- Split withdraw flow types ---\n\nexport interface WormholeInitiateWithdrawRequest {\n wallet: AdapterWallet;\n destinationAddress: AccountAddressInput;\n sponsorAccount?: Account | GasStationApiKey;\n}\n\nexport interface WormholeInitiateWithdrawResponse {\n originChainTxnId: string;\n receipt: routes.Receipt<AttestationReceipt>;\n}\n\nexport interface WormholeClaimWithdrawRequest {\n sourceChain: Chain;\n destinationAddress: string;\n receipt: routes.Receipt<AttestationReceipt>;\n // Required for wallet-based claim (non-Solana chains, or Solana without serverClaimUrl).\n // Not needed when the SDK uses the configured serverClaimUrl for Solana claims.\n wallet?: AdapterWallet;\n}\n\nexport interface WormholeClaimWithdrawResponse {\n destinationChainTxnId: string;\n}\n\n/**\n * Error thrown when the withdraw flow fails *after* the Aptos burn\n * transaction has already been submitted (i.e. during attestation tracking\n * or destination-chain claiming).\n *\n * Consumers should check `instanceof WithdrawError` in their catch block\n * to recover the `originChainTxnId` and display an explorer link so the\n * user can verify their burn on-chain.\n */\nexport class WithdrawError extends Error {\n /** Aptos burn transaction hash — always available when this error is thrown. */\n readonly originChainTxnId: string;\n /** The withdraw phase that failed (\"tracking\" or \"claiming\"). */\n readonly phase: WithdrawPhase;\n /**\n * The underlying error that caused this failure.\n * Mirrors ES2022 Error.cause — declared explicitly because the project's\n * TypeScript lib target does not include ES2022 ErrorOptions.\n */\n readonly cause?: unknown;\n\n constructor(\n message: string,\n originChainTxnId: string,\n phase: WithdrawPhase,\n cause?: unknown,\n ) {\n super(message);\n this.name = \"WithdrawError\";\n this.originChainTxnId = originChainTxnId;\n this.phase = phase;\n this.cause = cause;\n }\n}\n","import {\n Connection,\n Keypair,\n Transaction,\n type Commitment,\n} from \"@solana/web3.js\";\nimport {\n Chain,\n Network,\n SignAndSendSigner,\n TxHash,\n UnsignedTransaction,\n} from \"@wormhole-foundation/sdk\";\nimport {\n addPriorityFeeInstructions,\n PriorityFeeConfig,\n sendAndConfirmTransaction,\n} from \"./solanaUtils\";\n\nexport interface SolanaLocalSignerConfig {\n /** The Solana keypair to sign transactions with */\n keypair: Keypair;\n /** The Solana RPC connection */\n connection: Connection;\n /** Transaction confirmation commitment level (default: \"finalized\") */\n commitment?: Commitment;\n /** Retry interval in ms when transaction is not confirmed (default: 5000) */\n retryIntervalMs?: number;\n /** Priority fee configuration for faster transaction landing */\n priorityFeeConfig?: PriorityFeeConfig;\n /** Enable verbose logging (default: false) */\n verbose?: boolean;\n}\n\n/**\n * Server-side Solana signer for programmatic transaction signing.\n * Use this when you want to sign Solana transactions without user wallet interaction,\n * such as for server-side claim operations.\n *\n * @example\n * ```typescript\n * import { SolanaLocalSigner } from \"@aptos-labs/cross-chain-core\";\n * import { Connection, Keypair } from \"@solana/web3.js\";\n * import bs58 from \"bs58\";\n *\n * const keypair = Keypair.fromSecretKey(bs58.decode(process.env.SOLANA_CLAIM_SIGNER_KEY));\n * const connection = new Connection(\"https://api.mainnet-beta.solana.com\");\n *\n * const signer = new SolanaLocalSigner({\n * keypair,\n * connection,\n * // Optional: configure priority fees for faster landing\n * priorityFeeConfig: {\n * percentile: 0.9,\n * min: 100_000,\n * max: 1_000_000,\n * },\n * });\n * await cctpRoute.complete(signer, receipt);\n * ```\n */\nexport class SolanaLocalSigner<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n private keypair: Keypair;\n private connection: Connection;\n private commitment: Commitment;\n private retryIntervalMs: number;\n private priorityFeeConfig?: PriorityFeeConfig;\n private verbose: boolean;\n private _claimedTransactionHashes: string[] = [];\n\n constructor(config: SolanaLocalSignerConfig) {\n this.keypair = config.keypair;\n this.connection = config.connection;\n this.commitment = config.commitment ?? \"finalized\";\n this.retryIntervalMs = config.retryIntervalMs ?? 5000;\n this.priorityFeeConfig = config.priorityFeeConfig;\n this.verbose = config.verbose ?? false;\n }\n\n chain(): C {\n return \"Solana\" as C;\n }\n\n address(): string {\n return this.keypair.publicKey.toBase58();\n }\n\n /**\n * Returns all transaction hashes from the most recent signAndSend call,\n * joined by comma. If only one transaction was signed, returns a single hash string.\n */\n claimedTransactionHashes(): string {\n return this._claimedTransactionHashes.join(\",\");\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\n this._claimedTransactionHashes = [];\n\n for (const tx of txs) {\n const txId = await this.signAndSendTransaction(tx);\n txHashes.push(txId);\n this._claimedTransactionHashes.push(txId);\n }\n return txHashes;\n }\n\n private async signAndSendTransaction(request: any): Promise<string> {\n const { blockhash, lastValidBlockHeight } =\n await this.connection.getLatestBlockhash(this.commitment);\n\n // Wormhole SDK wraps transactions in SolanaUnsignedTransaction\n // The actual transaction is in the .transaction property\n // Sometimes it's nested: request.transaction.transaction\n let unsignedTx = request.transaction ?? request;\n\n // Capture additional signers before unwrapping.\n // SolanaUnsignedTransaction nests them at request.transaction.signers\n // (see SolanaSigner.ts for the client-side equivalent).\n const additionalSigners = request.transaction?.signers;\n\n // Unwrap nested transaction wrappers (Wormhole SDK's SolanaUnsignedTransaction)\n const MAX_UNWRAP_DEPTH = 10;\n let unwrapDepth = 0;\n while (\n unsignedTx &&\n typeof unsignedTx === \"object\" &&\n \"transaction\" in unsignedTx &&\n !(unsignedTx instanceof Transaction) &&\n !(\"signatures\" in unsignedTx && \"message\" in unsignedTx)\n ) {\n if (++unwrapDepth > MAX_UNWRAP_DEPTH) {\n throw new Error(\n \"Transaction unwrapping exceeded maximum depth — possible circular nesting\",\n );\n }\n unsignedTx = unsignedTx.transaction;\n }\n\n // Check if this is a versioned transaction using duck typing\n // (VersionedTransaction has .message and .signatures properties)\n const isVersioned =\n unsignedTx.message !== undefined &&\n unsignedTx.signatures !== undefined &&\n typeof unsignedTx.message.recentBlockhash !== \"undefined\";\n\n if (isVersioned) {\n // For versioned transactions, we need to update the blockhash and sign\n unsignedTx.message.recentBlockhash = blockhash;\n\n // Note: Priority fees for versioned transactions would require rebuilding\n // the message, which is more complex. For now, we skip priority fees for versioned txs.\n if (this.verbose || this.priorityFeeConfig) {\n console.warn(\n \"SolanaLocalSigner: Versioned transaction detected — priority fees are not applied. \" +\n \"Consider using legacy transactions if priority fees are required.\",\n );\n }\n unsignedTx.sign([this.keypair]);\n\n // Also sign with any additional signers from Wormhole SDK\n if (additionalSigners && additionalSigners.length > 0) {\n unsignedTx.sign(additionalSigners);\n }\n } else if (unsignedTx instanceof Transaction) {\n // Legacy transaction handling\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Add priority fee instructions if configured\n if (this.priorityFeeConfig) {\n await addPriorityFeeInstructions(\n this.connection,\n unsignedTx,\n this.priorityFeeConfig,\n this.verbose,\n );\n }\n\n // Sign with the local keypair (and any additional signers in a single call).\n // Transaction.sign() resets the signatures array to only the provided\n // signers, so calling partialSign() afterwards for extra signers would\n // throw \"unknown signer\". Passing everyone to sign() at once avoids this.\n if (additionalSigners && additionalSigners.length > 0) {\n unsignedTx.sign(this.keypair, ...additionalSigners);\n } else {\n unsignedTx.sign(this.keypair);\n }\n } else if (\n unsignedTx.recentBlockhash !== undefined ||\n unsignedTx.feePayer !== undefined\n ) {\n // Looks like a legacy transaction but instanceof check failed\n // This can happen with different module instances\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Add priority fee instructions if configured\n if (this.priorityFeeConfig) {\n await addPriorityFeeInstructions(\n this.connection,\n unsignedTx,\n this.priorityFeeConfig,\n this.verbose,\n );\n }\n\n // Same rationale as the instanceof Transaction branch above:\n // include all signers in a single sign() call to avoid \"unknown signer\".\n if (additionalSigners && additionalSigners.length > 0) {\n unsignedTx.sign(this.keypair, ...additionalSigners);\n } else {\n unsignedTx.sign(this.keypair);\n }\n } else {\n throw new Error(\n `Unsupported transaction type: ${unsignedTx?.constructor?.name}`,\n );\n }\n\n const serializedTx = unsignedTx.serialize();\n\n // Use shared utility for sending and confirming\n const signature = await sendAndConfirmTransaction(\n serializedTx,\n blockhash,\n lastValidBlockHeight,\n {\n connection: this.connection,\n commitment: this.commitment,\n retryIntervalMs: this.retryIntervalMs,\n verbose: this.verbose,\n },\n );\n\n return signature;\n }\n}\n\n// Re-export PriorityFeeConfig for convenience\nexport type { PriorityFeeConfig };\n","import { Chain } from \"../CrossChainCore\";\n\nexport enum Context {\n ETH = \"Ethereum\",\n SOLANA = \"Solana\",\n APTOS = \"Aptos\",\n SUI = \"Sui\",\n}\n\nexport type BaseChainConfig = {\n key: Chain;\n context: Context;\n disabledAsSource?: boolean;\n disabledAsDestination?: boolean;\n};\n\nexport interface ChainConfig extends BaseChainConfig {\n defaultRpc: string;\n displayName: string;\n explorerUrl: string;\n explorerName: string;\n chainId: number | string;\n icon: Chain;\n symbol?: string;\n}\n\nexport type ChainsConfig = {\n [chain in Chain]?: ChainConfig;\n};\n\nexport type TokenConfig = {\n symbol: string;\n name?: string;\n decimals: number;\n icon: string;\n tokenId: {\n chain: Chain;\n address: string;\n };\n};\n","import { Context, ChainsConfig } from \"../types\";\n\nexport const testnetChains: ChainsConfig = {\n Sepolia: {\n key: \"Sepolia\",\n context: Context.ETH,\n chainId: 11155111,\n displayName: \"Sepolia\",\n explorerUrl: \"https://sepolia.etherscan.io/\",\n explorerName: \"Etherscan\",\n icon: \"Ethereum\",\n symbol: \"ETH\",\n defaultRpc: \"https://ethereum-sepolia-rpc.publicnode.com\",\n },\n BaseSepolia: {\n key: \"BaseSepolia\",\n context: Context.ETH,\n chainId: 84532,\n displayName: \"Base Sepolia\",\n explorerUrl: \"https://sepolia.basescan.org\",\n explorerName: \"Basescan\",\n icon: \"BaseSepolia\",\n symbol: \"BASE\",\n defaultRpc:\n \"https://chain-proxy.wallet.coinbase.com?targetName=base-sepolia\",\n },\n ArbitrumSepolia: {\n key: \"ArbitrumSepolia\",\n context: Context.ETH,\n chainId: 421614,\n displayName: \"Arbitrum Sepolia\",\n explorerUrl: \"https://sepolia.arbiscan.io\",\n explorerName: \"Etherscan\",\n icon: \"Arbitrum\",\n symbol: \"ARB\",\n defaultRpc: \"https://sepolia-rollup.arbitrum.io/rpc\",\n },\n Avalanche: {\n key: \"Avalanche\",\n context: Context.ETH,\n chainId: 43113,\n displayName: \"Avalanche Fuji\",\n explorerUrl: \"https://testnet.snowtrace.io\",\n explorerName: \"Avascan\",\n icon: \"Avalanche\",\n symbol: \"AVAX\",\n defaultRpc: \"https://api.avax-test.network/ext/bc/C/rpc\",\n },\n PolygonSepolia: {\n key: \"PolygonSepolia\",\n context: Context.ETH,\n chainId: 80002,\n displayName: \"Polygon\",\n explorerUrl: \"https://amoy.polygonscan.com/\",\n explorerName: \"PolygonScan\",\n icon: \"Polygon\",\n symbol: \"MATIC\",\n defaultRpc: \"https://rpc-amoy.polygon.technology/\",\n },\n Solana: {\n key: \"Solana\",\n context: Context.SOLANA,\n displayName: \"Solana\",\n explorerUrl: \"https://solscan.io\",\n explorerName: \"Solscan\",\n chainId: 0,\n icon: \"Solana\",\n symbol: \"SOL\",\n defaultRpc: \"https://api.devnet.solana.com\",\n },\n Aptos: {\n key: \"Aptos\",\n context: Context.APTOS,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com?network=testnet\",\n explorerName: \"Aptos Explorer\",\n chainId: 0,\n icon: \"Aptos\",\n symbol: \"APT\",\n defaultRpc: \"https://fullnode.testnet.aptos.dev\",\n },\n Sui: {\n key: \"Sui\",\n context: Context.SUI,\n displayName: \"Sui\",\n explorerUrl: \"https://suiscan.xyz/testnet\",\n explorerName: \"Suiscan\",\n chainId: 0,\n icon: \"Sui\",\n symbol: \"SUI\",\n defaultRpc: \"https://fullnode.testnet.sui.io:443\",\n },\n};\n","import { TokenConfig } from \"../types\";\n\nexport const testnetTokens: Record<string, TokenConfig> = {\n Sepolia: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Sepolia\",\n address: \"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238\",\n },\n },\n Solana: {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Solana\",\n address: \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\n },\n icon: \"USDC\",\n decimals: 6,\n },\n Aptos: {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0x69091fbab5f7d635ee7ac5098cf0c1efbe31d68fec0f2cd565e8d168daf52832\",\n },\n icon: \"USDC\",\n },\n BaseSepolia: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"BaseSepolia\",\n address: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n },\n },\n Avalanche: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Avalanche\",\n address: \"0x5425890298aed601595a70AB815c96711a31Bc65\",\n },\n },\n ArbitrumSepolia: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"ArbitrumSepolia\",\n address: \"0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d\",\n },\n },\n PolygonSepolia: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"PolygonSepolia\",\n address: \"0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582\",\n },\n },\n Sui: {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Sui\",\n address:\n \"0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC\",\n },\n icon: \"USDC\",\n decimals: 6,\n },\n};\n","import { Context, ChainsConfig } from \"../types\";\n\nexport const mainnetChains: ChainsConfig = {\n Ethereum: {\n key: \"Ethereum\",\n context: Context.ETH,\n displayName: \"Ethereum\",\n explorerUrl: \"https://etherscan.io/\",\n explorerName: \"Etherscan\",\n chainId: 1,\n icon: \"Ethereum\",\n symbol: \"ETH\",\n defaultRpc: \"https://rpc.ankr.com/eth\",\n },\n Solana: {\n key: \"Solana\",\n context: Context.SOLANA,\n displayName: \"Solana\",\n explorerUrl: \"https://solscan.io\",\n explorerName: \"Solscan\",\n chainId: 0,\n icon: \"Solana\",\n symbol: \"SOL\",\n defaultRpc: \"https://solana-rpc.publicnode.com\",\n },\n Aptos: {\n key: \"Aptos\",\n context: Context.APTOS,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com/\",\n explorerName: \"Aptos Explorer\",\n chainId: 0,\n icon: \"Aptos\",\n symbol: \"APT\",\n defaultRpc: \"https://fullnode.mainnet.aptos.dev\",\n },\n Avalanche: {\n key: \"Avalanche\",\n context: Context.ETH,\n chainId: 43114,\n displayName: \"Avalanche\",\n explorerUrl: \"https://snowtrace.io\",\n explorerName: \"Avascan\",\n icon: \"Avalanche\",\n symbol: \"AVAX\",\n defaultRpc: \"https://avalanche-c-chain-rpc.publicnode.com\",\n },\n Base: {\n key: \"Base\",\n context: Context.ETH,\n chainId: 8453,\n displayName: \"Base\",\n explorerUrl: \"https://basescan.org\",\n explorerName: \"BaseScan\",\n icon: \"Base\",\n symbol: \"BASE\",\n defaultRpc: \"https://mainnet.base.org\",\n },\n Arbitrum: {\n key: \"Arbitrum\",\n context: Context.ETH,\n chainId: 42161,\n displayName: \"Arbitrum\",\n explorerUrl: \"https://arbiscan.io/\",\n explorerName: \"Arbitrum Explorer\",\n icon: \"Arbitrum\",\n symbol: \"ARB\",\n defaultRpc: \"https://arb1.arbitrum.io/rpc\",\n },\n Polygon: {\n key: \"Polygon\",\n context: Context.ETH,\n chainId: 137,\n displayName: \"Polygon\",\n explorerUrl: \"https://polygonscan.com/\",\n explorerName: \"PolygonScan\",\n icon: \"Polygon\",\n symbol: \"MATIC\",\n defaultRpc: \"https://polygon-bor-rpc.publicnode.com\",\n },\n Sui: {\n key: \"Sui\",\n context: Context.SUI,\n displayName: \"Sui\",\n explorerUrl: \"https://suiscan.xyz/\",\n explorerName: \"Suiscan\",\n chainId: 0,\n icon: \"Sui\",\n symbol: \"SUI\",\n defaultRpc: \"https://fullnode.mainnet.sui.io:443\",\n },\n};\n","import { TokenConfig } from \"../types\";\n\nexport const mainnetTokens: Record<string, TokenConfig> = {\n Ethereum: {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Ethereum\",\n address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n },\n icon: \"USDC\",\n decimals: 6,\n },\n Solana: {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Solana\",\n address: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n },\n icon: \"USDC\",\n decimals: 6,\n },\n Aptos: {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n },\n icon: \"USDC\",\n },\n Base: {\n symbol: \"USDC\",\n decimals: 6,\n icon: \"USDC\",\n tokenId: {\n chain: \"Base\",\n address: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n },\n },\n Arbitrum: {\n symbol: \"USDC\",\n decimals: 6,\n icon: \"USDC\",\n tokenId: {\n chain: \"Arbitrum\",\n address: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n },\n },\n Avalanche: {\n symbol: \"USDC\",\n decimals: 6,\n icon: \"USDC\",\n tokenId: {\n chain: \"Avalanche\",\n address: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n },\n },\n Polygon: {\n symbol: \"USDC\",\n decimals: 6,\n icon: \"USDC\",\n tokenId: {\n chain: \"Polygon\",\n address: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n },\n },\n Sui: {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Sui\",\n address:\n \"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC\",\n },\n icon: \"USDC\",\n },\n};\n","import { Aptos, AptosConfig, Network } from \"@aptos-labs/ts-sdk\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport { mainnetTokens, testnetTokens } from \"../config\";\nimport { ethers, JsonRpcProvider } from \"ethers\";\nimport { Chain } from \"../CrossChainCore\";\nimport { SuiClient } from \"@mysten/sui/client\";\n\nexport const getSolanaWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n rpc: string,\n): Promise<string> => {\n const address = new PublicKey(walletAddress);\n const tokenAddress =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Solana\"].tokenId.address\n : testnetTokens[\"Solana\"].tokenId.address;\n\n const connection = new Connection(rpc);\n // Find the token account for USDC\n const splToken = await connection.getTokenAccountsByOwner(address, {\n mint: new PublicKey(tokenAddress),\n });\n\n // If no token account exists, the wallet has never held USDC - balance is 0\n if (splToken.value.length === 0) {\n return \"0\";\n }\n\n const balance = await connection.getTokenAccountBalance(\n splToken.value[0]!.pubkey,\n );\n\n return (\n balance.value.uiAmountString ??\n ethers.formatUnits(BigInt(balance.value.amount), balance.value.decimals)\n );\n};\n\nexport const getEthereumWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n chain: Chain,\n rpc: string,\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[chain]\n : testnetTokens[chain];\n\n const tokenAddress = token.tokenId.address;\n const connection = new JsonRpcProvider(rpc);\n const abi = [\"function balanceOf(address owner) view returns (uint256)\"];\n const contract = new ethers.Contract(tokenAddress, abi, connection);\n const balance = await contract.balanceOf(walletAddress);\n return ethers.formatUnits(balance, token.decimals).toString();\n};\n\nexport const getAptosWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Aptos\"]\n : testnetTokens[\"Aptos\"];\n const tokenAddress = token.tokenId.address;\n const aptosConfig = new AptosConfig({ network: aptosNetwork });\n const connection = new Aptos(aptosConfig);\n const response = await connection.getCurrentFungibleAssetBalances({\n options: {\n where: {\n owner_address: { _eq: walletAddress },\n asset_type: { _eq: tokenAddress },\n },\n },\n });\n if (response.length === 0) {\n return \"0\";\n }\n return ethers.formatUnits(BigInt(response[0].amount), token.decimals);\n};\n\nexport const getSuiWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n rpc: string,\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Sui\"]\n : testnetTokens[\"Sui\"];\n\n const client = new SuiClient({\n url: rpc,\n });\n const balance = await client.getBalance({\n owner: walletAddress,\n coinType: token.tokenId.address,\n });\n // Reuse ethers' formatter for precise decimal formatting of large integers.\n return ethers.formatUnits(BigInt(balance.totalBalance), token.decimals);\n};\n"],"mappings":"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","names":["import_ts_sdk","import_sdk","import_ts_sdk","aptos","import_web3","signAndSendTransaction","signAndSendTransaction","import_ts_sdk","signAndSendTransaction","aptos","signAndSendTransaction","signAndSendTransaction","import_sdk","aptos","solana","evm","sui","import_web3","Context","import_ts_sdk","import_web3","import_ethers","import_ts_sdk","import_ts_sdk"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/CrossChainCore.ts","../src/providers/wormhole/wormhole.ts","../src/utils/logger.ts","../src/utils/receiptSerialization.ts","../src/providers/wormhole/signers/AptosLocalSigner.ts","../src/providers/wormhole/types.ts","../src/providers/wormhole/signers/AptosSigner.ts","../src/providers/wormhole/signers/SolanaSigner.ts","../src/providers/wormhole/signers/solanaUtils.ts","../src/providers/wormhole/signers/EthereumSigner.ts","../src/providers/wormhole/signers/SuiSigner.ts","../src/providers/wormhole/signers/Signer.ts","../src/providers/wormhole/utils.ts","../src/providers/wormhole/signers/SolanaLocalSigner.ts","../src/config/types.ts","../src/config/testnet/chains.ts","../src/config/testnet/tokens.ts","../src/config/mainnet/chains.ts","../src/config/mainnet/tokens.ts","../src/utils/getUsdcBalance.ts"],"sourcesContent":["export * from \"./CrossChainCore\";\nexport * from \"./config\";\nexport * from \"./providers/wormhole/index\";\nexport * from \"./providers/wormhole/types\";\nexport * from \"./utils/receiptSerialization\";\nexport { Network } from \"@aptos-labs/ts-sdk\";\n","import { Account, Network } from \"@aptos-labs/ts-sdk\";\n\nimport {\n WormholeTransferRequest,\n WormholeTransferResponse,\n WormholeProvider,\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeWithdrawRequest,\n WormholeWithdrawResponse,\n} from \"./providers/wormhole\";\n\nimport {\n ChainsConfig,\n testnetChains,\n testnetTokens,\n mainnetChains,\n mainnetTokens,\n TokenConfig,\n ChainConfig,\n} from \"./config\";\nimport {\n getAptosWalletUSDCBalance,\n getEthereumWalletUSDCBalance,\n getSolanaWalletUSDCBalance,\n getSuiWalletUSDCBalance,\n} from \"./utils/getUsdcBalance\";\n\nexport interface CrossChainDappConfig {\n aptosNetwork: Network;\n disableTelemetry?: boolean;\n /**\n * Returns an epoch-second timestamp used as `expireTimestamp` when building\n * Aptos transactions. Called at transaction-build time so that each\n * transaction in a multi-step bridge flow gets a fresh expiration window.\n *\n * @example\n * ```ts\n * getExpireTimestamp: () => Math.floor(Date.now() / 1000) + 120 // 2 minutes\n * ```\n */\n getExpireTimestamp?: () => number;\n solanaConfig?: {\n rpc?: string;\n priorityFeeConfig?: {\n percentile?: number;\n percentileMultiple?: number;\n min?: number;\n max?: number;\n };\n /**\n * URL of a server-side API endpoint that claims withdraw transactions on Solana.\n * When set, the SDK will POST the attested receipt to this URL instead of\n * asking the user's wallet to sign the claim transaction.\n *\n * Expected request body: { serializedReceipt: string, destinationAddress: string, sourceChain: string }\n * Expected response: { destinationChainTxnId: string }\n * Check out the SERVERSIDE_SOLANA_SIGNER.md file for more details.\n *\n * @example\n * const crossChainCore = new CrossChainCore({\n * dappConfig: {\n * aptosNetwork: Network.TESTNET,\n * solanaConfig: {\n * serverClaimUrl: \"/api/claim-withdraw\",\n * },\n * },\n * });\n */\n serverClaimUrl?: string;\n /**\n * Solana transaction confirmation commitment level.\n *\n * - `\"finalized\"` (default) — waits for supermajority finalization (~30 s).\n * - `\"confirmed\"` — waits for supermajority confirmation (~0.5 s).\n *\n * For bridge flows `\"confirmed\"` is usually sufficient because Wormhole\n * guardians independently verify finality before issuing attestations.\n *\n * @default \"finalized\"\n *\n * @example\n * const crossChainCore = new CrossChainCore({\n * dappConfig: {\n * aptosNetwork: Network.MAINNET,\n * solanaConfig: {\n * commitment: \"confirmed\", // ~0.5 s vs ~30 s\n * },\n * },\n * });\n */\n commitment?: \"confirmed\" | \"finalized\";\n };\n /**\n * Custom RPC endpoints for EVM chains. When provided, these override the\n * built-in `defaultRpc` values for balance lookups and Wormhole SDK\n * initialization.\n *\n * @example\n * ```ts\n * evmConfig: {\n * Ethereum: { rpc: \"https://rpc.ankr.com/eth/MY_KEY\" },\n * Base: { rpc: \"https://rpc.ankr.com/base/MY_KEY\" },\n * }\n * ```\n */\n evmConfig?: Partial<Record<EvmChainName, { rpc: string }>>;\n /**\n * Custom RPC endpoint for the Sui chain. When provided, overrides the\n * built-in `defaultRpc` for balance lookups and Wormhole SDK initialization.\n *\n * @example\n * ```ts\n * suiConfig: { rpc: \"https://fullnode.mainnet.sui.io\" }\n * ```\n */\n suiConfig?: { rpc?: string };\n}\nexport type { AccountAddressInput } from \"@aptos-labs/ts-sdk\";\nexport { NetworkToChainId, NetworkToNodeAPI } from \"@aptos-labs/ts-sdk\";\nexport type AptosAccount = Account;\n\n// List of all the supported chain\nexport type Chain =\n | \"Solana\"\n | \"Ethereum\"\n | \"Sepolia\"\n | \"Aptos\"\n | \"BaseSepolia\"\n | \"ArbitrumSepolia\"\n | \"Avalanche\"\n | \"Base\"\n | \"Arbitrum\"\n | \"PolygonSepolia\"\n | \"Polygon\"\n | \"Sui\";\n\n/**\n * EVM chain names supported by the SDK — derived from {@link Chain} by\n * excluding the non-EVM ecosystems. Adding a new EVM chain to `Chain`\n * automatically makes it a valid key in `evmConfig`.\n */\nexport type EvmChainName = Exclude<Chain, \"Solana\" | \"Aptos\" | \"Sui\">;\n\n// Record ensures every EvmChainName key is present at compile time.\nconst _evmChainRecord: Record<EvmChainName, true> = {\n Ethereum: true,\n Sepolia: true,\n BaseSepolia: true,\n ArbitrumSepolia: true,\n Avalanche: true,\n Base: true,\n Arbitrum: true,\n PolygonSepolia: true,\n Polygon: true,\n};\nexport const EVM_CHAIN_NAMES = Object.keys(_evmChainRecord) as EvmChainName[];\n\n// Map of Ethereum chain id to testnet chain config\nexport const EthereumChainIdToTestnetChain: Record<string, ChainConfig> = {\n 11155111: testnetChains.Sepolia!,\n 84532: testnetChains.BaseSepolia!,\n 421614: testnetChains.ArbitrumSepolia!,\n 43113: testnetChains.Avalanche!,\n 80002: testnetChains.PolygonSepolia!,\n};\n\n// Map of Ethereum chain id to mainnet chain config\nexport const EthereumChainIdToMainnetChain: Record<string, ChainConfig> = {\n 1: mainnetChains.Ethereum!,\n 8453: mainnetChains.Base!,\n 42161: mainnetChains.Arbitrum!,\n 43114: mainnetChains.Avalanche!,\n 137: mainnetChains.Polygon!,\n};\n\nexport type CCTPProviders = \"Wormhole\";\n\nexport interface CrossChainProvider<\n TQuoteRequest = any,\n TQuoteResponse = any,\n TTransferRequest = any,\n TTransferResponse = any,\n TWithdrawRequest = any,\n TWithdrawResponse = any,\n> {\n getQuote(params: TQuoteRequest): Promise<TQuoteResponse>;\n transfer(params: TTransferRequest): Promise<TTransferResponse>;\n withdraw(params: TWithdrawRequest): Promise<TWithdrawResponse>;\n}\n\nexport class CrossChainCore {\n readonly _dappConfig: CrossChainDappConfig = {\n aptosNetwork: Network.TESTNET,\n };\n\n readonly CHAINS: ChainsConfig = testnetChains;\n readonly TOKENS: Record<string, TokenConfig> = testnetTokens;\n\n /**\n * Last known source-chain transaction ID, set by signers immediately after\n * a transaction is submitted. Acts as a recovery side-channel so that\n * callers can retrieve the tx hash even when the orchestration layer throws\n * before returning it (e.g. claim failure after a successful burn).\n */\n _lastSourceChainTxId: string | undefined;\n\n constructor(args: { dappConfig: CrossChainDappConfig }) {\n this._dappConfig = args.dappConfig;\n if (args.dappConfig?.aptosNetwork === Network.MAINNET) {\n this.CHAINS = mainnetChains;\n this.TOKENS = mainnetTokens;\n } else {\n this.CHAINS = testnetChains;\n this.TOKENS = testnetTokens;\n }\n }\n\n getProvider(providerType: CCTPProviders): CrossChainProvider {\n switch (providerType) {\n case \"Wormhole\":\n return new WormholeProvider(this) as CrossChainProvider<\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeTransferRequest,\n WormholeTransferResponse,\n WormholeWithdrawRequest,\n WormholeWithdrawResponse\n >;\n default:\n throw new Error(`Unknown provider: ${providerType}`);\n }\n }\n\n async getWalletUSDCBalance(\n walletAddress: string,\n sourceChain: Chain,\n ): Promise<string> {\n if (sourceChain === \"Aptos\") {\n return await getAptosWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n );\n }\n\n if (!this.CHAINS[sourceChain]) {\n throw new Error(`Unsupported chain: ${sourceChain}`);\n }\n switch (sourceChain) {\n case \"Solana\":\n return await getSolanaWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n this._dappConfig?.solanaConfig?.rpc ??\n this.CHAINS[sourceChain].defaultRpc,\n );\n case \"Ethereum\":\n case \"BaseSepolia\":\n case \"Sepolia\":\n case \"Avalanche\":\n case \"ArbitrumSepolia\":\n case \"Arbitrum\":\n case \"Base\":\n case \"PolygonSepolia\":\n case \"Polygon\":\n return await getEthereumWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n sourceChain,\n this._dappConfig?.evmConfig?.[sourceChain]?.rpc ??\n this.CHAINS[sourceChain].defaultRpc,\n );\n case \"Sui\":\n return await getSuiWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n this._dappConfig?.suiConfig?.rpc ??\n this.CHAINS[sourceChain].defaultRpc,\n );\n default:\n throw new Error(`Unsupported chain: ${sourceChain}`);\n }\n }\n}\n","import {\n routes,\n Wormhole,\n wormhole,\n PlatformLoader,\n TransferState,\n} from \"@wormhole-foundation/sdk\";\nimport { Network, sleep } from \"@aptos-labs/ts-sdk\";\nimport aptos from \"@wormhole-foundation/sdk/aptos\";\nimport solana from \"@wormhole-foundation/sdk/solana\";\nimport evm from \"@wormhole-foundation/sdk/evm\";\nimport sui from \"@wormhole-foundation/sdk/sui\";\n\nimport {\n Chain,\n CrossChainProvider,\n CrossChainCore,\n EVM_CHAIN_NAMES,\n} from \"../../CrossChainCore\";\nimport { logger } from \"../../utils/logger\";\nimport { serializeReceipt } from \"../../utils/receiptSerialization\";\nimport { AptosLocalSigner } from \"./signers/AptosLocalSigner\";\nimport { isAccount } from \"./signers/AptosSigner\";\nimport { Signer } from \"./signers/Signer\";\nimport { ChainConfig } from \"../../config\";\nimport { createCCTPRoute } from \"./utils\";\nimport {\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeTransferRequest,\n WormholeTransferResponse,\n WormholeRouteResponse,\n WormholeRequest,\n WormholeSubmitTransferRequest,\n WormholeStartTransferResponse,\n WormholeClaimTransferRequest,\n WormholeWithdrawRequest,\n WormholeWithdrawResponse,\n WormholeInitiateWithdrawRequest,\n WormholeInitiateWithdrawResponse,\n WormholeClaimWithdrawRequest,\n WormholeClaimWithdrawResponse,\n RetryWithdrawClaimRequest,\n RetryWithdrawClaimResponse,\n WithdrawError,\n TransferError,\n} from \"./types\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\nimport { EIP1193DerivedWallet } from \"@aptos-labs/derived-wallet-ethereum\";\nimport { SuiDerivedWallet } from \"@aptos-labs/derived-wallet-sui\";\n\nexport class WormholeProvider implements CrossChainProvider<\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeTransferRequest,\n WormholeTransferResponse,\n WormholeWithdrawRequest,\n WormholeWithdrawResponse\n> {\n private crossChainCore: CrossChainCore;\n\n private _wormholeContext: Wormhole<\"Mainnet\" | \"Testnet\"> | undefined;\n\n private wormholeRoute: WormholeRouteResponse | undefined;\n private wormholeRequest: WormholeRequest | undefined;\n private wormholeQuote: WormholeQuoteResponse | undefined;\n private destinationChain?: Chain;\n\n constructor(core: CrossChainCore) {\n this.crossChainCore = core;\n }\n\n get wormholeContext(): Wormhole<\"Mainnet\" | \"Testnet\"> | undefined {\n return this._wormholeContext;\n }\n\n private async setWormholeContext(sourceChain: Chain) {\n const dappNetwork = this.crossChainCore._dappConfig?.aptosNetwork;\n if (dappNetwork === Network.DEVNET) {\n throw new Error(\"Devnet is not supported on Wormhole\");\n }\n if (!sourceChain) {\n throw new Error(\"Origin chain not selected\");\n }\n const isMainnet = dappNetwork === Network.MAINNET;\n const platforms: PlatformLoader<any>[] = [aptos, solana, evm, sui];\n\n // RPC resolution order per chain:\n // 1. User-provided config (solanaConfig / suiConfig / evmConfig)\n // 2. Built-in defaultRpc from CHAINS config\n const dappConfig = this.crossChainCore._dappConfig;\n const chains = this.crossChainCore.CHAINS;\n\n const solanaRpc =\n dappConfig?.solanaConfig?.rpc ?? chains[\"Solana\"]?.defaultRpc;\n\n const suiRpc = dappConfig?.suiConfig?.rpc ?? chains[\"Sui\"]?.defaultRpc;\n\n const evmChainsConfig: Record<string, { rpc: string }> = {};\n for (const name of EVM_CHAIN_NAMES) {\n const rpc =\n dappConfig?.evmConfig?.[name]?.rpc ?? chains[name]?.defaultRpc;\n if (rpc) {\n evmChainsConfig[name] = { rpc };\n }\n }\n\n const wh = await wormhole(isMainnet ? \"Mainnet\" : \"Testnet\", platforms, {\n chains: {\n ...(solanaRpc ? { Solana: { rpc: solanaRpc } } : {}),\n ...(suiRpc ? { Sui: { rpc: suiRpc } } : {}),\n ...evmChainsConfig,\n },\n });\n this._wormholeContext = wh;\n }\n\n private async getRoute(\n sourceChain: Chain,\n destinationChain: Chain,\n ): Promise<{\n route: WormholeRouteResponse;\n request: WormholeRequest;\n }> {\n if (!this._wormholeContext) {\n throw new Error(\"Wormhole context not initialized\");\n }\n\n const { route: cctpRoute, request } = await createCCTPRoute(\n this._wormholeContext,\n sourceChain,\n destinationChain,\n this.crossChainCore.TOKENS,\n );\n\n this.wormholeRoute = cctpRoute;\n this.wormholeRequest = request;\n this.destinationChain = destinationChain;\n\n return { route: cctpRoute, request };\n }\n\n async getQuote(input: WormholeQuoteRequest): Promise<WormholeQuoteResponse> {\n const { amount, originChain, type } = input;\n\n if (!this._wormholeContext) {\n await this.setWormholeContext(originChain);\n }\n\n logger.log(\"type\", type);\n // If the type of the transaction is \"transfer\", we want to transfer from a x-chain wallet to the Aptos wallet\n // If the type of the transaction is \"withdraw\", we want to transfer from the Aptos wallet to a x-chain wallet\n const sourceChain = type === \"transfer\" ? originChain : \"Aptos\";\n const destinationChain = type === \"transfer\" ? \"Aptos\" : originChain;\n\n const { route, request } = await this.getRoute(\n sourceChain,\n destinationChain,\n );\n\n // TODO what is nativeGas for?\n const transferParams = {\n amount: amount,\n options: { nativeGas: 0 },\n };\n\n const validated = await route.validate(request, transferParams);\n if (!validated.valid) {\n logger.log(\"invalid\", validated.valid);\n throw new Error(`Invalid quote: ${validated.error}`);\n }\n const quote = await route.quote(request, validated.params);\n if (!quote.success) {\n logger.log(\"quote failed\", quote.success);\n throw new Error(`Invalid quote: ${quote.error}`);\n }\n this.wormholeQuote = quote;\n logger.log(\"quote\", quote);\n return quote;\n }\n\n async submitCCTPTransfer(\n input: WormholeSubmitTransferRequest,\n ): Promise<WormholeStartTransferResponse> {\n const { sourceChain, wallet, destinationAddress, onTransactionSigned } =\n input;\n\n if (!this._wormholeContext) {\n await this.setWormholeContext(sourceChain);\n }\n if (!this.wormholeRoute || !this.wormholeRequest || !this.wormholeQuote) {\n throw new Error(\"Wormhole route, request, or quote not initialized\");\n }\n\n let signerAddress: string;\n\n const chainContext = this.getChainConfig(sourceChain).context;\n\n //const currentAccount = await wallet.getAccount();\n if (chainContext === \"Solana\") {\n signerAddress =\n (wallet as SolanaDerivedWallet).solanaWallet.publicKey?.toBase58() ||\n \"\";\n } else if (chainContext === \"Ethereum\") {\n // is Ethereum\n [signerAddress] = await (\n wallet as EIP1193DerivedWallet\n ).eip1193Provider.request({\n method: \"eth_requestAccounts\",\n });\n } else if (chainContext === \"Sui\") {\n signerAddress =\n (wallet as SuiDerivedWallet).suiWallet.accounts[0].address || \"\";\n } else {\n throw new Error(\"Unsupported chain context: \" + chainContext);\n }\n logger.log(\"signerAddress\", signerAddress);\n\n const signer = new Signer(\n this.getChainConfig(sourceChain),\n signerAddress,\n {},\n wallet,\n this.crossChainCore,\n undefined,\n onTransactionSigned,\n );\n\n logger.log(\"signer\", signer);\n logger.log(\"wormholeRequest\", this.wormholeRequest);\n logger.log(\"wormholeQuote\", this.wormholeQuote);\n\n let receipt = await this.wormholeRoute.initiate(\n this.wormholeRequest,\n signer,\n this.wormholeQuote,\n Wormhole.chainAddress(\"Aptos\", destinationAddress.toString()),\n );\n\n const originChainTxnId =\n \"originTxs\" in receipt\n ? receipt.originTxs[receipt.originTxs.length - 1].txid\n : undefined;\n\n return { originChainTxnId: originChainTxnId || \"\", receipt };\n }\n\n async claimCCTPTransfer(\n input: WormholeClaimTransferRequest,\n ): Promise<{ destinationChainTxnId: string }> {\n let { receipt, mainSigner, sponsorAccount, onTransactionSigned } = input;\n if (!this.wormholeRoute) {\n throw new Error(\"Wormhole route not initialized\");\n }\n if (sponsorAccount && !isAccount(sponsorAccount)) {\n throw new Error(\n \"AptosLocalSigner does not support GasStationApiKey as a sponsor account. \" +\n \"Wormhole claim transactions are script-based and cannot be submitted \" +\n \"via the gas station. Please provide an Account instance as the sponsor, \" +\n \"or omit the sponsor account.\",\n );\n }\n\n logger.log(\"mainSigner\", mainSigner.accountAddress.toString());\n\n let retries = 0;\n const maxRetries = 5;\n const baseDelay = 1000; // Initial delay of 1 second\n\n while (retries < maxRetries) {\n try {\n for await (receipt of this.wormholeRoute.track(receipt, 120 * 1000)) {\n if (receipt.state >= TransferState.SourceInitiated) {\n logger.log(\"Receipt is on track \", receipt);\n\n try {\n const signer = new AptosLocalSigner(\n \"Aptos\",\n {},\n mainSigner, // the account that signs the \"claim\" transaction\n sponsorAccount, // the fee payer account\n this.crossChainCore,\n onTransactionSigned,\n );\n\n if (routes.isManual(this.wormholeRoute)) {\n const circleAttestationReceipt =\n await this.wormholeRoute.complete(signer, receipt);\n logger.log(\"Claim receipt: \", circleAttestationReceipt);\n const destinationChainTxnId = signer.claimedTransactionHashes();\n return { destinationChainTxnId };\n } else {\n // Should be unreachable\n return { destinationChainTxnId: \"\" };\n }\n } catch (e) {\n console.error(\"Failed to claim\", e);\n return { destinationChainTxnId: \"\" };\n }\n }\n }\n } catch (e) {\n console.error(\n `Error tracking transfer (attempt ${retries + 1} / ${maxRetries}):`,\n e,\n );\n const delay = baseDelay * Math.pow(2, retries); // Exponential backoff\n await sleep(delay);\n retries++;\n }\n }\n // Should be unreachable\n return { destinationChainTxnId: \"\" };\n }\n\n /**\n * Initiates a transfer of USDC funds from the source chain wallet to the destination chain wallet\n * @param args\n * @returns\n */\n async transfer(\n input: WormholeTransferRequest,\n ): Promise<WormholeTransferResponse> {\n if (this.crossChainCore._dappConfig?.aptosNetwork === Network.DEVNET) {\n throw new Error(\"Devnet is not supported on Wormhole\");\n }\n // if amount is provided, it is expected to get the quote internally\n // and initiate a transfer automatically\n if (input.amount) {\n await this.getQuote({\n amount: input.amount,\n originChain: input.sourceChain,\n type: \"transfer\",\n });\n }\n // Submit transfer transaction from origin chain\n let { originChainTxnId, receipt } = await this.submitCCTPTransfer(input);\n // Claim transfer transaction on destination chain\n try {\n const { destinationChainTxnId } = await this.claimCCTPTransfer({\n receipt,\n mainSigner: input.mainSigner,\n sponsorAccount: input.sponsorAccount,\n onTransactionSigned: input.onTransactionSigned,\n });\n return { originChainTxnId, destinationChainTxnId };\n } catch (error: any) {\n throw new TransferError(\n error?.message ?? \"Transfer claim failed after source-chain burn\",\n originChainTxnId,\n error,\n );\n }\n }\n\n // --- Split withdraw flow: initiateWithdraw + trackWithdraw + claimWithdraw ---\n\n /**\n * Phase 1: Initiates a withdraw by burning USDC on Aptos.\n * The user signs the Aptos burn transaction via their wallet.\n * Returns a receipt that can be tracked and later claimed.\n */\n async initiateWithdraw(\n input: WormholeInitiateWithdrawRequest,\n ): Promise<WormholeInitiateWithdrawResponse> {\n const { wallet, destinationAddress, sponsorAccount, onTransactionSigned } =\n input;\n\n if (!this._wormholeContext) {\n throw new Error(\"Wormhole context not initialized\");\n }\n if (!this.wormholeRoute || !this.wormholeRequest || !this.wormholeQuote) {\n throw new Error(\"Wormhole route, request, or quote not initialized\");\n }\n\n const signer = new Signer(\n this.getChainConfig(\"Aptos\"),\n (await wallet.features[\"aptos:account\"].account()).address.toString(),\n {},\n wallet,\n this.crossChainCore,\n sponsorAccount,\n onTransactionSigned,\n );\n\n const wormholeDestAddress = Wormhole.chainAddress(\n this.destinationChain!,\n destinationAddress.toString(),\n );\n\n const receipt = await this.wormholeRoute.initiate(\n this.wormholeRequest,\n signer,\n this.wormholeQuote,\n wormholeDestAddress,\n );\n logger.log(\"initiateWithdraw receipt\", receipt);\n\n const originChainTxnId =\n \"originTxs\" in receipt\n ? receipt.originTxs[receipt.originTxs.length - 1].txid\n : undefined;\n\n return { originChainTxnId: originChainTxnId || \"\", receipt };\n }\n\n /**\n * Phase 2: Tracks a withdraw receipt until attestation is ready.\n * This polls Wormhole and returns once the receipt reaches the Attested state.\n */\n async trackWithdraw(receipt: routes.Receipt): Promise<routes.Receipt> {\n if (!this.wormholeRoute) {\n throw new Error(\"Wormhole route not initialized\");\n }\n\n let retries = 0;\n const maxRetries = 5;\n const baseDelay = 1000;\n\n while (retries < maxRetries) {\n try {\n for await (receipt of this.wormholeRoute.track(receipt, 120 * 1000)) {\n if (receipt.state >= TransferState.Attested) {\n logger.log(\"trackWithdraw: receipt attested\", receipt);\n return receipt;\n }\n }\n } catch (e) {\n console.error(\n `Error tracking withdraw (attempt ${retries + 1} / ${maxRetries}):`,\n e,\n );\n const delay = baseDelay * Math.pow(2, retries);\n await sleep(delay);\n retries++;\n }\n }\n throw new Error(\"Failed to track withdraw to attested state\");\n }\n\n /**\n * Phase 3: Claims the withdraw on the destination chain.\n *\n * If the destination is Solana and `solanaConfig.serverClaimUrl` is configured\n * in the dapp config, the SDK automatically POSTs the attested receipt to that\n * URL — no wallet popup required. The dapp's server endpoint handles signing\n * and submitting the claim transaction.\n *\n * Otherwise falls back to the wallet-based Signer (triggers wallet popup).\n */\n async claimWithdraw(\n input: WormholeClaimWithdrawRequest,\n ): Promise<WormholeClaimWithdrawResponse> {\n const { claimChain, destinationAddress, receipt } = input;\n\n // Server-side claim path: Solana destination with configured serverClaimUrl\n const serverClaimUrl =\n this.crossChainCore._dappConfig?.solanaConfig?.serverClaimUrl;\n\n if (claimChain === \"Solana\" && serverClaimUrl) {\n logger.log(\"claimWithdraw: using server-side claim via\", serverClaimUrl);\n\n const response = await fetch(serverClaimUrl, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n receipt: serializeReceipt(receipt),\n destinationAddress,\n claimChain,\n }),\n });\n\n if (!response.ok) {\n const errorData = await response.json().catch(() => ({}));\n throw new Error(\n errorData.error ||\n `Server-side claim failed with status ${response.status}`,\n );\n }\n\n const result = await response.json();\n return { destinationChainTxnId: result.destinationChainTxnId };\n }\n\n // Wallet-based claim path\n if (!this.wormholeRoute) {\n throw new Error(\"Wormhole route not initialized\");\n }\n\n if (!input.wallet) {\n throw new Error(\n \"Wallet is required for claim when serverClaimUrl is not configured\",\n );\n }\n\n const claimSigner = new Signer(\n this.getChainConfig(claimChain),\n destinationAddress,\n {},\n input.wallet,\n this.crossChainCore,\n undefined,\n input.onTransactionSigned,\n false,\n );\n\n if (routes.isManual(this.wormholeRoute)) {\n const circleAttestationReceipt = await this.wormholeRoute.complete(\n claimSigner,\n receipt,\n );\n logger.log(\"claimWithdraw receipt:\", circleAttestationReceipt);\n const destinationChainTxnId = claimSigner.claimedTransactionHashes();\n return { destinationChainTxnId };\n } else {\n throw new Error(\"Automatic route not supported for manual claim\");\n }\n }\n\n /**\n * Withdraws USDC from Aptos to a destination chain.\n * Orchestrates all three phases internally:\n * 1. Initiate — user signs the Aptos burn transaction\n * 2. Track — wait for Wormhole attestation\n * 3. Claim — if serverClaimUrl is configured for Solana, delegates to\n * the server; otherwise uses the wallet-based signer.\n *\n * The optional `onPhaseChange` callback lets the dapp update its UI\n * as the flow progresses.\n */\n async withdraw(\n input: WormholeWithdrawRequest,\n ): Promise<WormholeWithdrawResponse> {\n const {\n sourceChain,\n wallet,\n destinationAddress,\n sponsorAccount,\n onPhaseChange,\n onTransactionSigned,\n } = input;\n\n // Phase 1: Initiate — user signs Aptos burn\n onPhaseChange?.(\"initiating\");\n const { originChainTxnId, receipt } = await this.initiateWithdraw({\n wallet,\n destinationAddress,\n sponsorAccount,\n onTransactionSigned,\n });\n\n // Phases 2 & 3 are wrapped so that, if they fail, the caller still\n // receives the originChainTxnId (the irreversible Aptos burn).\n let currentPhase: \"tracking\" | \"claiming\" = \"tracking\";\n try {\n // Phase 2: Track — wait for attestation\n onPhaseChange?.(\"tracking\");\n const attestedReceipt = await this.trackWithdraw(receipt);\n\n // Phase 3: Claim — server-side or wallet-based\n currentPhase = \"claiming\";\n onPhaseChange?.(\"claiming\");\n const { destinationChainTxnId } = await this.claimWithdraw({\n claimChain: sourceChain,\n destinationAddress: destinationAddress.toString(),\n receipt: attestedReceipt,\n wallet,\n onTransactionSigned,\n });\n\n return { originChainTxnId, destinationChainTxnId };\n } catch (error: any) {\n throw new WithdrawError(\n error?.message ?? \"Withdraw failed after Aptos burn\",\n originChainTxnId,\n currentPhase,\n error,\n );\n }\n }\n\n /**\n * Retries a failed `claimWithdraw` call with configurable exponential backoff.\n *\n * Use this when the claim phase of a withdrawal fails (e.g., RPC instability,\n * network congestion) but the Aptos burn transaction has already been submitted.\n * The attested receipt can be recovered from the `WithdrawError` thrown by\n * `withdraw()` and passed directly to this method.\n *\n * @example\n * ```ts\n * try {\n * await provider.withdraw({ ... });\n * } catch (error) {\n * if (error instanceof WithdrawError && error.phase === \"claiming\") {\n * const result = await provider.retryWithdrawClaim({\n * sourceChain,\n * destinationAddress,\n * receipt: attestedReceipt,\n * wallet,\n * maxRetries: 5,\n * });\n * }\n * }\n * ```\n */\n async retryWithdrawClaim(\n input: RetryWithdrawClaimRequest,\n ): Promise<RetryWithdrawClaimResponse> {\n const {\n maxRetries = 5,\n initialDelayMs = 2000,\n backoffMultiplier = 2,\n ...claimInput\n } = input;\n\n let lastError: Error | undefined;\n let delay = initialDelayMs;\n\n for (let attempt = 0; attempt <= maxRetries; attempt++) {\n try {\n const result = await this.claimWithdraw(claimInput);\n return { ...result, retriesUsed: attempt };\n } catch (error) {\n lastError = error as Error;\n logger.log(\n `retryWithdrawClaim: attempt ${attempt + 1}/${maxRetries + 1} failed: ${lastError.message}`,\n );\n if (attempt < maxRetries) {\n await sleep(delay);\n delay *= backoffMultiplier;\n }\n }\n }\n\n throw new Error(\n `Claim failed after ${maxRetries + 1} attempts: ${lastError?.message}`,\n );\n }\n\n getChainConfig(chain: Chain): ChainConfig {\n const chainConfig =\n this.crossChainCore.CHAINS[\n chain as keyof typeof this.crossChainCore.CHAINS\n ];\n if (!chainConfig) {\n throw new Error(`Chain config not found for chain: ${chain}`);\n }\n return chainConfig;\n }\n}\n","export const logger = {\n log: (...args: any[]) => {\n if (process.env.NODE_ENV === \"development\") {\n console.log(...args);\n }\n },\n warn: (...args: any[]) => {\n if (process.env.NODE_ENV === \"development\") {\n console.warn(...args);\n }\n },\n error: (...args: any[]) => {\n if (process.env.NODE_ENV === \"development\") {\n console.error(...args);\n }\n },\n};\n","import {\n routes,\n AttestationReceipt,\n UniversalAddress,\n} from \"@wormhole-foundation/sdk\";\n\n// Cross-platform base64 helpers (no Node.js Buffer dependency)\nfunction uint8ArrayToBase64(bytes: Uint8Array): string {\n let binary = \"\";\n for (let i = 0; i < bytes.length; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n}\n\nfunction base64ToUint8Array(base64: string): Uint8Array {\n const binary = atob(base64);\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < binary.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n return bytes;\n}\n\n/**\n * Serializes a Wormhole receipt for JSON transport.\n *\n * JSON doesn't natively support BigInt, Uint8Array, or class instances.\n * This function converts these types to a serializable format with type markers\n * that can be reconstructed by `deserializeReceipt`.\n *\n * @example\n * ```typescript\n * import { serializeReceipt } from \"@aptos-labs/cross-chain-core\";\n *\n * // On the client side, before sending to server\n * const serialized = serializeReceipt(receipt);\n * await fetch(\"/api/claim\", {\n * method: \"POST\",\n * body: JSON.stringify({ receipt: serialized }),\n * });\n * ```\n */\nexport function serializeReceipt(\n receipt: routes.Receipt<AttestationReceipt>,\n): unknown {\n return JSON.parse(\n JSON.stringify(receipt, (_key, value) => {\n if (typeof value === \"bigint\") {\n return { __type: \"bigint\", value: value.toString() };\n }\n // Check UniversalAddress before Uint8Array — if the SDK ever makes\n // UniversalAddress extend Uint8Array the order matters.\n if (value instanceof UniversalAddress) {\n return {\n __type: \"UniversalAddress\",\n value: uint8ArrayToBase64(value.toUint8Array()),\n };\n }\n if (value instanceof Uint8Array) {\n return {\n __type: \"Uint8Array\",\n value: uint8ArrayToBase64(value),\n };\n }\n return value;\n }),\n );\n}\n\n/**\n * Deserializes a Wormhole receipt from JSON transport format.\n *\n * Reconstructs BigInt, Uint8Array, and UniversalAddress instances from\n * the serialized format produced by `serializeReceipt`.\n *\n * @example\n * ```typescript\n * import { deserializeReceipt, SolanaLocalSigner } from \"@aptos-labs/cross-chain-core\";\n *\n * // On the server side, after receiving from client\n * const receipt = deserializeReceipt(body.receipt);\n * await cctpRoute.complete(signer, receipt);\n * ```\n */\nexport function deserializeReceipt(\n obj: unknown,\n): routes.Receipt<AttestationReceipt> {\n function revive(value: unknown, key?: string): unknown {\n if (value && typeof value === \"object\") {\n const objValue = value as Record<string, unknown>;\n\n // Handle serialized BigInt, Uint8Array, and UniversalAddress\n if (\"__type\" in objValue) {\n if (objValue.__type === \"bigint\") {\n return BigInt(objValue.value as string);\n }\n if (objValue.__type === \"UniversalAddress\") {\n return new UniversalAddress(\n base64ToUint8Array(objValue.value as string),\n );\n }\n if (objValue.__type === \"Uint8Array\") {\n return base64ToUint8Array(objValue.value as string);\n }\n }\n\n // Backwards-compatible fallback: reconstruct UniversalAddress for known\n // CCTP message address fields that were serialized without __type markers\n // (i.e. data produced before UniversalAddress-aware serialization).\n const addressFields = [\n \"sender\",\n \"recipient\",\n \"destinationCaller\",\n \"burnToken\",\n \"mintRecipient\",\n \"messageSender\",\n ];\n if (key && addressFields.includes(key) && \"address\" in objValue) {\n const addressBytes = revive(objValue.address);\n if (addressBytes instanceof Uint8Array) {\n return new UniversalAddress(addressBytes);\n }\n }\n\n // Recursively process nested objects and arrays\n if (Array.isArray(value)) {\n return value.map((v, i) => revive(v, String(i)));\n }\n const result: Record<string, unknown> = {};\n for (const k in objValue) {\n result[k] = revive(objValue[k], k);\n }\n return result;\n }\n return value;\n }\n\n return revive(obj) as routes.Receipt<AttestationReceipt>;\n}\n\n","import {\n AccountAuthenticator,\n AnyRawTransaction,\n Aptos,\n AptosConfig,\n Account,\n} from \"@aptos-labs/ts-sdk\";\n\nimport {\n Chain,\n Network,\n SignAndSendSigner,\n TxHash,\n UnsignedTransaction,\n} from \"@wormhole-foundation/sdk\";\nimport {\n AptosUnsignedTransaction,\n AptosChains,\n} from \"@wormhole-foundation/sdk-aptos\";\nimport {\n OnTransactionSigned,\n validateExpireTimestamp,\n} from \"../types\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\n\nexport class AptosLocalSigner<\n N extends Network,\n C extends Chain,\n> implements SignAndSendSigner<N, C> {\n _chain: C;\n _options: any;\n _wallet: Account;\n _sponsorAccount: Account | undefined;\n _onTransactionSigned: OnTransactionSigned | undefined;\n _crossChainCore: CrossChainCore;\n _claimedTransactionHashes: string[] = [];\n constructor(\n chain: C,\n options: any,\n wallet: Account,\n feePayerAccount: Account | undefined,\n crossChainCore: CrossChainCore,\n onTransactionSigned?: OnTransactionSigned,\n ) {\n this._chain = chain;\n this._options = options;\n this._wallet = wallet;\n this._sponsorAccount = feePayerAccount;\n this._crossChainCore = crossChainCore;\n this._onTransactionSigned = onTransactionSigned;\n }\n\n chain(): C {\n return this._chain;\n }\n address(): string {\n return this._wallet.accountAddress.toString();\n }\n\n claimedTransactionHashes(): string {\n return this._claimedTransactionHashes.join(\",\");\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\n this._claimedTransactionHashes = [];\n\n for (const tx of txs) {\n this._onTransactionSigned?.(tx.description, null);\n const txId = await signAndSendTransaction(\n tx as AptosUnsignedTransaction<Network, AptosChains>,\n this._wallet,\n this._sponsorAccount,\n this._crossChainCore,\n );\n this._onTransactionSigned?.(tx.description, txId);\n txHashes.push(txId);\n this._claimedTransactionHashes.push(txId);\n }\n return txHashes;\n }\n}\n\nexport async function signAndSendTransaction(\n request: UnsignedTransaction<Network, AptosChains>,\n wallet: Account,\n sponsorAccount: Account | undefined,\n crossChainCore: CrossChainCore,\n) {\n if (!wallet) {\n throw new Error(\"Wallet is undefined\");\n }\n\n const payload = request.transaction;\n // The wallets do not handle Uint8Array serialization\n payload.functionArguments = payload.functionArguments.map((a: any) => {\n if (a instanceof Uint8Array) {\n return Array.from(a);\n } else if (typeof a === \"bigint\") {\n return a.toString();\n } else {\n return a;\n }\n });\n\n const dappNetwork = crossChainCore._dappConfig.aptosNetwork;\n const aptosConfig = new AptosConfig({\n network: dappNetwork,\n });\n const aptos = new Aptos(aptosConfig);\n\n const expireTimestamp = crossChainCore._dappConfig.getExpireTimestamp?.();\n if (typeof expireTimestamp !== \"undefined\") {\n validateExpireTimestamp(expireTimestamp);\n }\n const txnToSign = await aptos.transaction.build.simple({\n data: payload,\n sender: wallet.accountAddress.toString(),\n withFeePayer: sponsorAccount ? true : false,\n ...(typeof expireTimestamp !== \"undefined\"\n ? { options: { expireTimestamp } }\n : {}),\n });\n\n const senderAuthenticator = await aptos.transaction.sign({\n signer: wallet,\n transaction: txnToSign,\n });\n\n const txnToSubmit: {\n transaction: AnyRawTransaction;\n senderAuthenticator: AccountAuthenticator;\n feePayerAuthenticator?: AccountAuthenticator;\n } = {\n transaction: txnToSign,\n senderAuthenticator,\n };\n\n if (sponsorAccount) {\n const feePayerSignerAuthenticator = aptos.transaction.signAsFeePayer({\n signer: sponsorAccount,\n transaction: txnToSign,\n });\n txnToSubmit.feePayerAuthenticator = feePayerSignerAuthenticator;\n }\n const response = await aptos.transaction.submit.simple(txnToSubmit);\n\n const tx = await aptos.waitForTransaction({\n transactionHash: response.hash,\n });\n\n return tx.hash;\n}\n","import { AccountAddressInput, Account, Network } from \"@aptos-labs/ts-sdk\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { routes, AttestationReceipt } from \"@wormhole-foundation/sdk/dist/cjs\";\nimport { Chain, AptosAccount } from \"../..\";\n\nexport type WormholeRouteResponse = routes.Route<\n \"Mainnet\" | \"Testnet\",\n routes.Options,\n routes.ValidatedTransferParams<routes.Options>,\n routes.Receipt\n>;\n\nexport type WormholeRequest = routes.RouteTransferRequest<\n \"Mainnet\" | \"Testnet\"\n>;\n\nexport type WormholeQuoteResponse = routes.Quote<\n routes.Options,\n routes.ValidatedTransferParams<routes.Options>,\n any\n>;\n\nexport interface WormholeQuoteRequest {\n amount: string;\n originChain: Chain;\n type: \"transfer\" | \"withdraw\";\n}\n\nexport type GasStationApiKey = Partial<Record<Network.TESTNET | Network.MAINNET, string>>;\n\nexport interface WormholeTransferRequest {\n sourceChain: Chain;\n wallet: AdapterWallet;\n destinationAddress: AccountAddressInput;\n mainSigner: Account;\n amount?: string;\n sponsorAccount?: Account;\n /** Optional callback fired before and after each individual transaction is signed. */\n onTransactionSigned?: OnTransactionSigned;\n}\n\nexport type WithdrawPhase =\n | \"initiating\" // User signing Aptos burn transaction\n | \"tracking\" // Waiting for Wormhole attestation (~60s)\n | \"claiming\"; // Claiming on destination chain\n\n/**\n * Callback fired before and after each individual transaction is signed\n * and submitted during a bridge flow.\n *\n * @param description - A human-readable description of the transaction\n * (e.g. \"Approving USDC transfer\"). Comes from the Wormhole SDK's\n * `UnsignedTransaction.description`.\n * @param txId - `null` when called *before* signing; the on-chain\n * transaction hash when called *after* signing.\n */\nexport type OnTransactionSigned = (description: string, txId: string | null) => void;\n\nexport interface WormholeWithdrawRequest {\n /**\n * The non-Aptos chain involved in the withdrawal. For a withdrawal from\n * Aptos → Solana, this is `\"Solana\"`.\n *\n * Note: despite the name, this is the *destination* of the bridge transfer\n * (where USDC will be claimed), not the chain that burns USDC (which is\n * always Aptos for withdrawals).\n */\n sourceChain: Chain;\n wallet: AdapterWallet;\n destinationAddress: AccountAddressInput;\n sponsorAccount?: Account | GasStationApiKey;\n /** Optional callback fired when the withdraw progresses to a new phase. */\n onPhaseChange?: (phase: WithdrawPhase) => void;\n /** Optional callback fired before and after each individual transaction is signed. */\n onTransactionSigned?: OnTransactionSigned;\n}\n\nexport interface WormholeSubmitTransferRequest {\n sourceChain: Chain;\n wallet: AdapterWallet;\n destinationAddress: AccountAddressInput;\n /** Optional callback fired before and after each individual transaction is signed. */\n onTransactionSigned?: OnTransactionSigned;\n}\n\nexport interface WormholeClaimTransferRequest {\n receipt: routes.Receipt<AttestationReceipt>;\n mainSigner: AptosAccount;\n sponsorAccount?: AptosAccount | GasStationApiKey;\n /** Optional callback fired before and after each individual transaction is signed. */\n onTransactionSigned?: OnTransactionSigned;\n}\n\nexport interface WormholeTransferResponse {\n destinationChainTxnId: string;\n originChainTxnId: string;\n}\n\nexport interface WormholeWithdrawResponse {\n destinationChainTxnId: string;\n originChainTxnId: string;\n}\n\nexport interface WormholeStartTransferResponse {\n originChainTxnId: string;\n receipt: routes.Receipt<AttestationReceipt>;\n}\n\n// --- Split withdraw flow types ---\n\nexport interface WormholeInitiateWithdrawRequest {\n wallet: AdapterWallet;\n destinationAddress: AccountAddressInput;\n sponsorAccount?: Account | GasStationApiKey;\n /** Optional callback fired before and after each individual transaction is signed. */\n onTransactionSigned?: OnTransactionSigned;\n}\n\nexport interface WormholeInitiateWithdrawResponse {\n originChainTxnId: string;\n receipt: routes.Receipt<AttestationReceipt>;\n}\n\nexport interface WormholeClaimWithdrawRequest {\n /**\n * The chain on which the claim transaction will be executed (the destination\n * chain of the withdrawal).\n *\n * For example, when withdrawing from Aptos → Solana, `claimChain` is\n * `\"Solana\"` because that's where the USDC is minted/claimed.\n */\n claimChain: Chain;\n destinationAddress: string;\n receipt: routes.Receipt<AttestationReceipt>;\n // Required for wallet-based claim (non-Solana chains, or Solana without serverClaimUrl).\n // Not needed when the SDK uses the configured serverClaimUrl for Solana claims.\n wallet?: AdapterWallet;\n /** Optional callback fired before and after each individual transaction is signed. */\n onTransactionSigned?: OnTransactionSigned;\n}\n\nexport interface WormholeClaimWithdrawResponse {\n destinationChainTxnId: string;\n}\n\nexport interface RetryWithdrawClaimRequest extends WormholeClaimWithdrawRequest {\n /** Maximum number of retry attempts (default: 5). */\n maxRetries?: number;\n /** Initial delay in ms before the first retry (default: 2000). */\n initialDelayMs?: number;\n /** Multiplier applied to the delay after each failed attempt (default: 2). */\n backoffMultiplier?: number;\n}\n\nexport interface RetryWithdrawClaimResponse extends WormholeClaimWithdrawResponse {\n /** Number of retry attempts that were needed (0 means first attempt succeeded). */\n retriesUsed: number;\n}\n\n/**\n * Validates that a value returned by `getExpireTimestamp` is a non-negative\n * integer suitable for use as an epoch-second expiration timestamp.\n * Throws immediately for NaN, Infinity, negative values, or floats so that\n * misconfigured callbacks fail fast instead of producing silent misbehaviour.\n */\nexport function validateExpireTimestamp(value: number): void {\n if (!Number.isInteger(value) || value < 0) {\n throw new Error(\n `getExpireTimestamp returned an invalid value (${value}). ` +\n \"Expected a non-negative integer (epoch seconds).\",\n );\n }\n}\n\n/**\n * Error thrown when the transfer (deposit) flow fails *after* the source-chain\n * burn transaction has already been submitted (i.e. during attestation tracking\n * or Aptos claiming).\n *\n * Consumers should check `instanceof TransferError` in their catch block\n * to recover the `originChainTxnId` and display an explorer link so the\n * user can verify their burn on-chain.\n */\nexport class TransferError extends Error {\n /** Source-chain burn transaction hash — available when the burn succeeded before the failure. */\n readonly originChainTxnId: string;\n /**\n * The underlying error that caused this failure.\n * Mirrors ES2022 Error.cause — declared explicitly because the project's\n * TypeScript lib target does not include ES2022 ErrorOptions.\n */\n readonly cause?: unknown;\n\n constructor(\n message: string,\n originChainTxnId: string,\n cause?: unknown,\n ) {\n super(message);\n this.name = \"TransferError\";\n this.originChainTxnId = originChainTxnId;\n this.cause = cause;\n }\n}\n\n/**\n * Error thrown when the withdraw flow fails *after* the Aptos burn\n * transaction has already been submitted (i.e. during attestation tracking\n * or destination-chain claiming).\n *\n * Consumers should check `instanceof WithdrawError` in their catch block\n * to recover the `originChainTxnId` and display an explorer link so the\n * user can verify their burn on-chain.\n */\nexport class WithdrawError extends Error {\n /** Aptos burn transaction hash — always available when this error is thrown. */\n readonly originChainTxnId: string;\n /** The withdraw phase that failed (\"tracking\" or \"claiming\"). */\n readonly phase: WithdrawPhase;\n /**\n * The underlying error that caused this failure.\n * Mirrors ES2022 Error.cause — declared explicitly because the project's\n * TypeScript lib target does not include ES2022 ErrorOptions.\n */\n readonly cause?: unknown;\n\n constructor(\n message: string,\n originChainTxnId: string,\n phase: WithdrawPhase,\n cause?: unknown,\n ) {\n super(message);\n this.name = \"WithdrawError\";\n this.originChainTxnId = originChainTxnId;\n this.phase = phase;\n this.cause = cause;\n }\n}\n","import {\n Account,\n AccountAddress,\n AccountAuthenticator,\n AnyRawTransaction,\n Aptos,\n AptosConfig,\n Network as AptosNetwork,\n Deserializer,\n InputGenerateTransactionPayloadData,\n ScriptFunctionArgumentTypes,\n} from \"@aptos-labs/ts-sdk\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport {\n AptosChains,\n AptosUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-aptos\";\nimport { GasStationApiKey, validateExpireTimestamp } from \"..\";\nimport { UserResponseStatus } from \"@aptos-labs/wallet-standard\";\nimport { GasStationClient, GasStationTransactionSubmitter } from \"@aptos-labs/gas-station-client\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\n\nexport async function signAndSendTransaction(\n request: AptosUnsignedTransaction<Network, AptosChains>,\n wallet: AdapterWallet,\n sponsorAccount: Account | GasStationApiKey | undefined,\n dappNetwork: AptosNetwork,\n crossChainCore?: CrossChainCore,\n) {\n if (!wallet) {\n throw new Error(\"wallet.sendTransaction is undefined\");\n }\n\n const payload = request.transaction;\n // The wallets do not handle Uint8Array serialization\n payload.functionArguments = payload.functionArguments.map((a: any) => {\n if (a instanceof Uint8Array) {\n return Array.from(a);\n } else if (typeof a === \"bigint\") {\n return a.toString();\n } else {\n return a;\n }\n });\n\n\n // Configure Aptos client based on sponsor type\n let aptosConfig: AptosConfig;\n const useGasStation = sponsorAccount && !isAccount(sponsorAccount);\n\n if (useGasStation) {\n // Gas station flow - configure with plugin upfront\n const gasStationClient = new GasStationClient({\n network: dappNetwork,\n apiKey: sponsorAccount[dappNetwork as AptosNetwork.TESTNET | AptosNetwork.MAINNET],\n });\n const transactionSubmitter = new GasStationTransactionSubmitter(gasStationClient);\n \n aptosConfig = new AptosConfig({\n network: dappNetwork,\n pluginSettings: {\n TRANSACTION_SUBMITTER: transactionSubmitter,\n },\n });\n } else {\n // Regular flow or Account sponsor\n aptosConfig = new AptosConfig({\n network: dappNetwork,\n });\n }\n\n const aptos = new Aptos(aptosConfig);\n\n // Wormhole resturns a script function transaction payload, but due to a ts-sdk version mismatch,\n // linter complains on different types - so need to first convert to unknown and then to ScriptFunctionArgumentTypes.\n // Also, tranfering the arguments as it brings some errors (which not sure if bug or not), so we first extract them\n // and then tranform them into the functionArguments.\n const functionArguments = extractFunctionArguments(\n payload.functionArguments as unknown as ScriptFunctionArgumentTypes[],\n );\n\n // a custom function to withdraw tokens from the aptos chain,\n // published testnet:\n // https://explorer.aptoslabs.com/account/0x5e2d961f06cd27aa07554a39d55f5ce1e58dff35d803c3529b1cd5c4fa3ab584/modules/code/withdraw?network=testnet\n // published mainnet:\n // https://explorer.aptoslabs.com/account/0x5e2d961f06cd27aa07554a39d55f5ce1e58dff35d803c3529b1cd5c4fa3ab584/modules/code/withdraw?network=mainnet\n const withdrawFunction =\n \"0x5e2d961f06cd27aa07554a39d55f5ce1e58dff35d803c3529b1cd5c4fa3ab584::withdraw::deposit_for_burn\";\n const transactionData: InputGenerateTransactionPayloadData = {\n function: withdrawFunction,\n functionArguments,\n };\n\n const expireTimestamp = crossChainCore?._dappConfig?.getExpireTimestamp?.();\n if (typeof expireTimestamp !== \"undefined\") {\n validateExpireTimestamp(expireTimestamp);\n }\n const txnToSign = await aptos.transaction.build.simple({\n data: transactionData,\n sender: (\n await wallet.features[\"aptos:account\"]?.account()\n ).address.toString(),\n withFeePayer: sponsorAccount ? true : false,\n ...(typeof expireTimestamp !== \"undefined\"\n ? { options: { expireTimestamp } }\n : {}),\n });\n\n const response =\n await wallet.features[\"aptos:signTransaction\"]?.signTransaction(txnToSign);\n\n if (response?.status === UserResponseStatus.REJECTED) {\n throw new Error(\"User has rejected the request\");\n }\n\n const txnToSubmit: {\n transaction: AnyRawTransaction;\n senderAuthenticator: AccountAuthenticator;\n feePayerAuthenticator?: AccountAuthenticator;\n } = {\n transaction: txnToSign,\n senderAuthenticator: response.args,\n };\n\n // Only sign as fee payer if it's an Account (not gas station)\n if (sponsorAccount && isAccount(sponsorAccount)) {\n const feePayerSignerAuthenticator = aptos.transaction.signAsFeePayer({\n signer: sponsorAccount,\n transaction: txnToSign,\n });\n txnToSubmit.feePayerAuthenticator = feePayerSignerAuthenticator;\n }\n\n const txnSubmitted = await aptos.transaction.submit.simple(txnToSubmit);\n\n const tx = await aptos.waitForTransaction({\n transactionHash: txnSubmitted.hash,\n });\n\n return tx.hash;\n}\n\n/**\n * Extracts the function arguments from the function arguments array and tranform them into types the sdk can ready.\n *\n * Note: we assume the argument types are always [U64, U32, accountAddress, accountAddress] - even tho we use\n * Wormhole fix version in the package.json, if wormhole changes this, we need to update this function.\n * @param functionArguments - The function arguments array.\n * @returns The function arguments.\n */\nfunction extractFunctionArguments(\n functionArguments: ScriptFunctionArgumentTypes[],\n) {\n const deserializer1 = new Deserializer(functionArguments[0].bcsToBytes());\n const amount = deserializer1.deserializeU64();\n\n const deserializer2 = new Deserializer(functionArguments[1].bcsToBytes());\n const destination_domain = deserializer2.deserializeU32();\n\n const mint_recipient = new AccountAddress(functionArguments[2].bcsToBytes());\n\n const burn_token = new AccountAddress(functionArguments[3].bcsToBytes());\n\n return [amount, destination_domain, mint_recipient, burn_token];\n}\n\nexport function isAccount(obj: Account | GasStationApiKey): obj is Account {\n return 'accountAddress' in obj;\n}\n","/**\n * Client-side Solana signer for wallet-based transaction signing.\n * This function signs and sends the transaction while constantly checking for confirmation\n * and resending the transaction if it hasn't been confirmed after the specified interval.\n */\n\nimport {\n ConfirmOptions,\n Transaction,\n VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { Connection } from \"@solana/web3.js\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport { SolanaUnsignedTransaction } from \"@wormhole-foundation/sdk-solana\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\nimport {\n addPriorityFeeInstructions,\n sendAndConfirmTransaction,\n PriorityFeeConfig,\n} from \"./solanaUtils\";\n\n// Re-export types for backwards compatibility\nexport type { SolanaRpcProvider, PriorityFeeConfig } from \"./solanaUtils\";\nexport {\n sleep,\n isEmptyObject,\n determineRpcProvider,\n} from \"./solanaUtils\";\n\n// See https://docs.triton.one/chains/solana/sending-txs for more information\nexport async function signAndSendTransaction(\n request: SolanaUnsignedTransaction<Network>,\n wallet: AdapterWallet | undefined,\n options?: ConfirmOptions,\n crossChainCore?: CrossChainCore,\n) {\n if (!wallet || !(wallet instanceof SolanaDerivedWallet)) {\n throw new Error(\"Invalid wallet type or missing Solana wallet\");\n }\n\n const commitment =\n options?.commitment ??\n crossChainCore?._dappConfig?.solanaConfig?.commitment ??\n \"finalized\";\n // Solana rpc should come from dapp config\n const connection = new Connection(\n crossChainCore?._dappConfig?.solanaConfig?.rpc ??\n crossChainCore?.CHAINS[\"Solana\"]?.defaultRpc ??\n \"https://api.devnet.solana.com\", // Last resort fallback\n );\n const { blockhash, lastValidBlockHeight } =\n await connection.getLatestBlockhash(commitment);\n\n // Add priority fee instructions\n const unsignedTx = await setPriorityFeeInstructions(\n connection,\n blockhash,\n lastValidBlockHeight,\n request,\n crossChainCore?._dappConfig?.solanaConfig?.priorityFeeConfig,\n );\n\n if (!wallet.solanaWallet.signTransaction) {\n throw new Error(\"Wallet does not support signing transactions\");\n }\n\n const tx = await wallet.solanaWallet.signTransaction(unsignedTx);\n\n if (!tx) throw new Error(\"Failed to sign transaction\");\n\n // Order matters. Phantom's Lighthouse security requires wallet to sign first,\n // then additional signers sign afterward\n if (request.transaction.signers && tx instanceof Transaction) {\n tx.partialSign(...request.transaction.signers);\n }\n\n const serializedTx = tx.serialize();\n\n // Use shared utility for sending and confirming\n const signature = await sendAndConfirmTransaction(\n serializedTx,\n blockhash,\n lastValidBlockHeight,\n {\n connection,\n commitment,\n retryIntervalMs: 5000,\n verbose: false,\n },\n );\n\n return signature;\n}\n\n/**\n * Prepares a transaction with priority fee instructions.\n */\nexport async function setPriorityFeeInstructions(\n connection: Connection,\n blockhash: string,\n lastValidBlockHeight: number,\n request: SolanaUnsignedTransaction<Network>,\n priorityFeeConfig?: PriorityFeeConfig,\n): Promise<Transaction | VersionedTransaction> {\n const unsignedTx = request.transaction.transaction as Transaction;\n\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Add priority fee instructions using shared utility\n await addPriorityFeeInstructions(\n connection,\n unsignedTx,\n priorityFeeConfig,\n false,\n );\n\n return unsignedTx;\n}\n","/**\n * Shared utilities for Solana transaction handling.\n * Used by both SolanaLocalSigner (server-side) and SolanaSigner (client-side).\n */\n\nimport {\n ComputeBudgetProgram,\n Connection,\n LAMPORTS_PER_SOL,\n RpcResponseAndContext,\n SignatureResult,\n SimulatedTransactionResponse,\n Transaction,\n TransactionInstruction,\n VersionedTransaction,\n type Commitment,\n} from \"@solana/web3.js\";\nimport {\n determinePriorityFee,\n determinePriorityFeeTritonOne,\n} from \"@wormhole-foundation/sdk-solana\";\n\n// ============================================================================\n// Types\n// ============================================================================\n\n/** Configuration for priority fees */\nexport interface PriorityFeeConfig {\n /** Percentile of recent fees to use (default: 0.9) */\n percentile?: number;\n /** Multiplier for the percentile fee (default: 1) */\n percentileMultiple?: number;\n /** Minimum fee in microlamports (default: 100_000) */\n min?: number;\n /** Maximum fee in microlamports (default: 100_000_000) */\n max?: number;\n}\n\n/** Configuration for sending and confirming transactions */\nexport interface SendAndConfirmConfig {\n connection: Connection;\n commitment: Commitment;\n retryIntervalMs?: number;\n /** Enable verbose logging (default: false) */\n verbose?: boolean;\n}\n\n/** RPC provider type for priority fee calculation */\nexport type SolanaRpcProvider = \"triton\" | \"helius\" | \"ankr\" | \"unknown\";\n\n// ============================================================================\n// Transaction Confirmation\n// ============================================================================\n\n/**\n * Sends a serialized transaction and waits for confirmation with automatic retries.\n *\n * @param serializedTx - The serialized transaction bytes\n * @param blockhash - The recent blockhash used in the transaction\n * @param lastValidBlockHeight - The last valid block height for the transaction\n * @param config - Configuration for sending and confirming\n * @returns The transaction signature\n */\nexport async function sendAndConfirmTransaction(\n serializedTx: Buffer | Uint8Array,\n blockhash: string,\n lastValidBlockHeight: number,\n config: SendAndConfirmConfig,\n): Promise<string> {\n const { connection, commitment, retryIntervalMs = 5000, verbose = false } = config;\n\n const sendOptions = {\n skipPreflight: true,\n maxRetries: 0,\n preflightCommitment: commitment,\n };\n\n const signature = await connection.sendRawTransaction(serializedTx, sendOptions);\n\n const confirmTransactionPromise = connection.confirmTransaction(\n { signature, blockhash, lastValidBlockHeight },\n commitment,\n );\n\n // Retry loop: resend if not confirmed after interval.\n // The confirmation promise can reject with \"block height exceeded\" when the\n // blockhash expires before confirmation completes. Because the transaction was\n // already sent (sendRawTransaction succeeded), it may still land on-chain.\n // In that case we return the signature so the caller can track it, rather than\n // throwing and losing the transaction reference.\n let confirmedTx: RpcResponseAndContext<SignatureResult> | null = null;\n let txSendAttempts = 1;\n\n try {\n while (!confirmedTx) {\n confirmedTx = await Promise.race([\n confirmTransactionPromise,\n new Promise<null>((resolve) =>\n setTimeout(() => resolve(null), retryIntervalMs),\n ),\n ]);\n\n if (confirmedTx) break;\n\n if (verbose) {\n console.log(\n `Tx not confirmed after ${retryIntervalMs * txSendAttempts++}ms, resending`,\n );\n }\n\n try {\n await connection.sendRawTransaction(serializedTx, sendOptions);\n } catch (e) {\n if (verbose) {\n console.error(\"Failed to resend transaction:\", e);\n }\n // Ignore resend errors, confirmation will handle success/failure\n }\n }\n } catch (e) {\n const message = e instanceof Error ? e.message.toLowerCase() : \"\";\n if (\n message.includes(\"block height exceeded\") ||\n message.includes(\"blockheightexceeded\")\n ) {\n if (verbose) {\n console.warn(\n \"Block height exceeded but tx was already sent, returning signature:\",\n signature,\n );\n }\n // Transaction was already sent — return the signature so the caller can\n // track confirmation asynchronously instead of losing the tx reference.\n return signature;\n }\n throw e;\n }\n\n if (confirmedTx.value.err) {\n const errorMessage = formatTransactionError(confirmedTx.value.err);\n throw new Error(errorMessage);\n }\n\n return signature;\n}\n\n/**\n * Formats a transaction error into a readable string.\n */\nexport function formatTransactionError(err: unknown): string {\n if (typeof err === \"object\" && err !== null) {\n try {\n return `Transaction failed: ${JSON.stringify(\n err,\n (_key, value) => (typeof value === \"bigint\" ? value.toString() : value),\n )}`;\n } catch {\n // Circular reference or other stringify error\n return \"Transaction failed: Unknown error\";\n }\n }\n return `Transaction failed: ${err}`;\n}\n\n// ============================================================================\n// Priority Fees\n// ============================================================================\n\n/**\n * Adds priority fee instructions to a transaction.\n * Simulates the transaction to determine compute units and calculates optimal fees.\n *\n * @param connection - Solana RPC connection\n * @param transaction - The transaction to add priority fees to\n * @param priorityFeeConfig - Configuration for priority fees\n * @param verbose - Enable verbose logging\n * @returns The transaction with priority fee instructions added\n */\nexport async function addPriorityFeeInstructions(\n connection: Connection,\n transaction: Transaction,\n priorityFeeConfig?: PriorityFeeConfig,\n verbose: boolean = false,\n): Promise<Transaction> {\n const computeBudgetIxFilter = (ix: TransactionInstruction) =>\n ix.programId.toString() !== \"ComputeBudget111111111111111111111111111111\";\n\n // Remove existing compute budget instructions if they were added by the SDK\n transaction.instructions = transaction.instructions.filter(computeBudgetIxFilter);\n\n const instructions = await createPriorityFeeInstructions(\n connection,\n transaction,\n priorityFeeConfig,\n verbose,\n );\n\n transaction.add(...instructions);\n\n return transaction;\n}\n\n/**\n * Creates priority fee instructions based on simulation and fee estimation.\n */\nexport async function createPriorityFeeInstructions(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n priorityFeeConfig?: PriorityFeeConfig,\n verbose: boolean = false,\n): Promise<TransactionInstruction[]> {\n // Simulate to get compute units\n const unitsUsed = await simulateAndGetComputeUnits(connection, transaction);\n const unitBudget = Math.floor(unitsUsed * 1.2); // Budget in 20% headroom\n\n const instructions: TransactionInstruction[] = [];\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n units: unitBudget,\n }),\n );\n\n // Calculate priority fee\n const {\n percentile = 0.9,\n percentileMultiple = 1,\n min = 100_000,\n max = 100_000_000,\n } = priorityFeeConfig ?? {};\n\n const rpcProvider = determineRpcProvider(connection.rpcEndpoint);\n const { fee, methodUsed } = await calculatePriorityFee(\n connection,\n transaction,\n rpcProvider,\n { percentile, percentileMultiple, min, max },\n );\n\n if (verbose) {\n const maxFeeInSol = (fee / 1e6 / LAMPORTS_PER_SOL) * unitBudget;\n console.table({\n \"RPC Provider\": rpcProvider,\n \"Method used\": methodUsed,\n \"Percentile used\": percentile,\n \"Multiple used\": percentileMultiple,\n \"Compute budget\": unitBudget,\n \"Priority fee\": fee,\n \"Max fee in SOL\": maxFeeInSol,\n });\n }\n\n instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: fee }),\n );\n\n return instructions;\n}\n\n/**\n * Simulates a transaction and returns the compute units consumed.\n */\nasync function simulateAndGetComputeUnits(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n): Promise<number> {\n let unitsUsed = 200_000;\n let simulationAttempts = 0;\n\n simulationLoop: while (true) {\n const response = await connection.simulateTransaction(transaction as Transaction);\n\n if (response.value.err) {\n if (checkKnownSimulationError(response.value)) {\n // Number of attempts will be at most 5 for known errors\n if (simulationAttempts < 5) {\n simulationAttempts++;\n await sleep(1000);\n continue simulationLoop;\n }\n } else if (simulationAttempts < 3) {\n // Number of attempts will be at most 3 for unknown errors\n simulationAttempts++;\n await sleep(1000);\n continue simulationLoop;\n }\n\n // Still failing after multiple attempts\n throw new Error(\n `Simulation failed: ${JSON.stringify(response.value.err)}\\nLogs:\\n${(\n response.value.logs || []\n ).join(\"\\n \")}`,\n );\n } else {\n // Simulation was successful\n if (response.value.unitsConsumed) {\n unitsUsed = response.value.unitsConsumed;\n }\n break;\n }\n }\n\n return unitsUsed;\n}\n\n/**\n * Calculates the priority fee based on RPC provider and configuration.\n */\nasync function calculatePriorityFee(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n rpcProvider: SolanaRpcProvider,\n config: Required<PriorityFeeConfig>,\n): Promise<{ fee: number; methodUsed: \"triton\" | \"default\" | \"minimum\" }> {\n const { percentile, percentileMultiple, min, max } = config;\n\n if (rpcProvider === \"triton\") {\n // Triton has an experimental RPC method that accepts a percentile parameter\n // and usually gives more accurate fee numbers.\n try {\n const fee = await determinePriorityFeeTritonOne(\n connection,\n transaction,\n percentile,\n percentileMultiple,\n min,\n max,\n );\n\n return { fee, methodUsed: \"triton\" };\n } catch (e) {\n console.warn(`Failed to determine priority fee using Triton RPC:`, e);\n }\n }\n\n try {\n // By default, use generic Solana RPC method\n const fee = await determinePriorityFee(\n connection,\n transaction,\n percentile,\n percentileMultiple,\n min,\n max,\n );\n\n return { fee, methodUsed: \"default\" };\n } catch (e) {\n console.warn(`Failed to determine priority fee:`, e);\n\n return { fee: min, methodUsed: \"minimum\" };\n }\n}\n\n// ============================================================================\n// Helpers\n// ============================================================================\n\n/**\n * Checks response logs for known simulation errors that can be retried.\n */\nfunction checkKnownSimulationError(response: SimulatedTransactionResponse): boolean {\n const errors: Record<string, string> = {};\n\n // This error occurs when the blockhash included in a transaction is not deemed to be valid\n if (response.err === \"BlockhashNotFound\") {\n errors[\"BlockhashNotFound\"] =\n \"Blockhash not found during simulation. Trying again.\";\n }\n\n // Check the response logs for any known errors\n if (response.logs) {\n for (const line of response.logs) {\n if (line.includes(\"SlippageToleranceExceeded\")) {\n errors[\"SlippageToleranceExceeded\"] =\n \"Slippage failure during simulation. Trying again.\";\n }\n\n if (line.includes(\"RequireGteViolated\")) {\n errors[\"RequireGteViolated\"] =\n \"Swap instruction failure during simulation. Trying again.\";\n }\n }\n }\n\n if (Object.keys(errors).length === 0) {\n return false;\n }\n\n console.table(errors);\n return true;\n}\n\n/**\n * Checks whether a hostname is exactly the given domain or a subdomain of it.\n * e.g. isHostOrSubdomainOf(\"api.triton.one\", \"triton.one\") => true\n * isHostOrSubdomainOf(\"not-triton.com\", \"triton.one\") => false\n */\nfunction isHostOrSubdomainOf(hostname: string, base: string): boolean {\n return hostname === base || hostname.endsWith(`.${base}`);\n}\n\n/**\n * Determines the RPC provider from the endpoint URL.\n */\nexport function determineRpcProvider(endpoint: string): SolanaRpcProvider {\n try {\n const url = new URL(endpoint);\n const hostname = url.hostname;\n if (isHostOrSubdomainOf(hostname, \"rpcpool.com\") || isHostOrSubdomainOf(hostname, \"triton.one\")) {\n return \"triton\";\n } else if (isHostOrSubdomainOf(hostname, \"helius-rpc.com\") || isHostOrSubdomainOf(hostname, \"helius.xyz\")) {\n return \"helius\";\n } else if (isHostOrSubdomainOf(hostname, \"ankr.com\")) {\n return \"ankr\";\n } else {\n return \"unknown\";\n }\n } catch {\n return \"unknown\";\n }\n}\n\n/**\n * Sleep for a specified duration.\n */\nexport async function sleep(timeout: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n\n/**\n * Checks whether an object is empty.\n */\nexport const isEmptyObject = (value: object | null | undefined): boolean => {\n if (value === null || value === undefined) {\n return true;\n }\n\n for (const key in value) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n\n return true;\n};\n\n","import {\n EvmUnsignedTransaction,\n EvmChains,\n} from \"@wormhole-foundation/sdk-evm\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport { ethers, getBigInt } from \"ethers\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { EIP1193DerivedWallet } from \"@aptos-labs/derived-wallet-ethereum\";\n\nexport async function signAndSendTransaction(\n request: EvmUnsignedTransaction<Network, EvmChains>,\n wallet: AdapterWallet,\n chainName: string,\n): Promise<string> {\n if (!wallet) {\n throw new Error(\"wallet.sendTransaction is undefined\");\n }\n // Ensure the signer is connected to the correct chain\n const chainId = await (\n wallet as EIP1193DerivedWallet\n ).eip1193Provider.request({\n method: \"eth_chainId\",\n });\n const actualChainId = parseInt(chainId, 16);\n\n if (!actualChainId) throw new Error(\"No signer found for chain\" + chainName);\n const expectedChainId = request.transaction.chainId\n ? getBigInt(request.transaction.chainId)\n : undefined;\n if (\n !actualChainId ||\n !expectedChainId ||\n BigInt(actualChainId) !== expectedChainId\n ) {\n throw new Error(\n `Signer is not connected to the right chain. Expected ${expectedChainId}, got ${actualChainId}`,\n );\n }\n\n const provider = new ethers.BrowserProvider(\n (wallet as EIP1193DerivedWallet).eip1193Provider,\n );\n const signer = await provider.getSigner();\n\n let response: ethers.TransactionResponse;\n try {\n response = await signer.sendTransaction(request.transaction);\n } catch (e) {\n // Some wallet providers (e.g. MetaMask via injected provider) can throw\n // after the transaction is already broadcast. Try to extract the hash from\n // the error so the caller can track the pending transaction.\n const message = e instanceof Error ? e.message : String(e);\n const hashMatch = message.match(/\"hash\":\\s*\"(0x[a-fA-F0-9]{64})\"/);\n if (hashMatch) {\n console.warn(\"Extracted EVM tx hash from error:\", hashMatch[1]);\n return hashMatch[1];\n }\n throw e;\n }\n\n try {\n const receipt = await response.wait();\n return receipt?.hash || response.hash || \"\";\n } catch (e: any) {\n // When a user speeds up or cancels a transaction in their wallet, ethers\n // throws a TRANSACTION_REPLACED error. We must handle this specifically\n // to avoid returning the old (now-invalid) hash.\n if (e?.code === \"TRANSACTION_REPLACED\") {\n // \"repriced\" means the same transaction data was re-sent with higher\n // gas — the bridge burn still went through with the replacement tx.\n if (e.reason === \"repriced\") {\n const replacementHash = e.receipt?.hash || e.replacement?.hash;\n if (replacementHash) {\n console.warn(\n \"EVM transaction was repriced. Using replacement hash:\",\n replacementHash,\n );\n return replacementHash;\n }\n }\n // \"cancelled\" or \"replaced\" means the original burn was superseded by\n // a different transaction (e.g. a 0-value self-transfer or an entirely\n // different call). The bridge burn did not happen, so we must not\n // return a hash that implies success.\n throw e;\n }\n\n // wait() can fail due to network timeouts or RPC instability, but the\n // transaction was already submitted (sendTransaction returned successfully).\n // Return the hash so the caller can track confirmation asynchronously.\n if (response.hash) {\n console.warn(\n \"EVM transaction wait failed but tx was submitted:\",\n response.hash,\n );\n return response.hash;\n }\n throw e;\n }\n}\n","import { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport {\n SuiChains,\n SuiUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-sui\";\nimport { SuiDerivedWallet } from \"@aptos-labs/derived-wallet-sui\";\nimport {\n SuiSignAndExecuteTransactionInput,\n SuiSignAndExecuteTransactionOutput,\n} from \"@mysten/wallet-standard\";\n\nexport async function signAndSendTransaction(\n request: SuiUnsignedTransaction<Network, SuiChains>,\n wallet: AdapterWallet,\n): Promise<string> {\n if (!wallet) {\n throw new Error(\"wallet is undefined\");\n }\n const suiDerivedWallet = wallet as SuiDerivedWallet;\n\n const signAndExecuteTransactionFeature = suiDerivedWallet.suiWallet.features[\n \"sui:signAndExecuteTransaction\"\n ] as {\n signAndExecuteTransaction: (\n input: SuiSignAndExecuteTransactionInput,\n ) => Promise<SuiSignAndExecuteTransactionOutput>;\n };\n\n if (!signAndExecuteTransactionFeature) {\n throw new Error(\"wallet does not support signAndExecuteTransaction\");\n }\n\n const { digest } =\n await signAndExecuteTransactionFeature.signAndExecuteTransaction({\n transaction: request.transaction,\n account: suiDerivedWallet.suiWallet.accounts[0],\n chain: `sui:${request.network.toLocaleLowerCase()}`,\n });\n\n return digest;\n}\n","import {\n UnsignedTransaction,\n Network,\n Chain,\n TxHash,\n SignAndSendSigner,\n} from \"@wormhole-foundation/sdk\";\nimport { SolanaUnsignedTransaction } from \"@wormhole-foundation/sdk-solana\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport {\n EvmUnsignedTransaction,\n EvmChains,\n} from \"@wormhole-foundation/sdk-evm\";\nimport {\n SuiChains,\n SuiUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-sui\";\n\nimport * as solanaSigner from \"./SolanaSigner\";\nimport * as ethereumSigner from \"./EthereumSigner\";\nimport * as aptosSigner from \"./AptosSigner\";\nimport * as suiSigner from \"./SuiSigner\";\n\nimport { ChainConfig } from \"../../../config\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nimport { AptosChains } from \"@wormhole-foundation/sdk-aptos/dist/cjs/types\";\nimport { AptosUnsignedTransaction } from \"@wormhole-foundation/sdk-aptos/dist/cjs/unsignedTransaction\";\nimport { GasStationApiKey, OnTransactionSigned } from \"../types\";\nimport { Account } from \"@aptos-labs/ts-sdk\";\nexport class Signer<\n N extends Network,\n C extends Chain,\n> implements SignAndSendSigner<N, C> {\n _chain: ChainConfig;\n _address: string;\n _options: any;\n _wallet: AdapterWallet;\n _crossChainCore: CrossChainCore;\n _sponsorAccount: Account | GasStationApiKey | undefined;\n _onTransactionSigned: OnTransactionSigned | undefined;\n _claimedTransactionHashes: string[] = [];\n /**\n * When true, signed tx hashes are written to\n * `_crossChainCore._lastSourceChainTxId` as a recovery side-channel.\n * Set to false for destination-chain claim signers so they don't\n * overwrite the source-chain burn hash.\n */\n _trackAsSourceChain: boolean;\n\n constructor(\n chain: ChainConfig,\n address: string,\n options: any,\n wallet: AdapterWallet,\n crossChainCore: CrossChainCore,\n sponsorAccount?: Account | GasStationApiKey | undefined,\n onTransactionSigned?: OnTransactionSigned,\n trackAsSourceChain: boolean = true,\n ) {\n this._chain = chain;\n this._address = address;\n this._options = options;\n this._wallet = wallet;\n this._crossChainCore = crossChainCore;\n this._sponsorAccount = sponsorAccount;\n this._onTransactionSigned = onTransactionSigned;\n this._trackAsSourceChain = trackAsSourceChain;\n }\n\n chain(): C {\n return this._chain.key as C;\n }\n address(): string {\n return this._address;\n }\n\n claimedTransactionHashes(): string {\n return this._claimedTransactionHashes.join(\",\");\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\n this._claimedTransactionHashes = [];\n\n for (const tx of txs) {\n this._onTransactionSigned?.(tx.description, null);\n const txId = await signAndSendTransaction(\n this._chain,\n tx,\n this._wallet,\n this._options,\n this._crossChainCore,\n this._sponsorAccount,\n );\n if (this._trackAsSourceChain) {\n this._crossChainCore._lastSourceChainTxId = txId;\n }\n this._onTransactionSigned?.(tx.description, txId);\n txHashes.push(txId);\n this._claimedTransactionHashes.push(txId);\n }\n return txHashes;\n }\n}\n\nexport const signAndSendTransaction = async (\n chain: ChainConfig,\n request: UnsignedTransaction<Network, Chain>,\n wallet: AdapterWallet,\n options: any = {},\n crossChainCore: CrossChainCore,\n sponsorAccount?: Account | GasStationApiKey | undefined,\n): Promise<string> => {\n if (!wallet) {\n throw new Error(\"wallet is undefined\");\n }\n\n const dappNetwork = crossChainCore._dappConfig.aptosNetwork;\n\n if (chain.context === \"Solana\") {\n const signature = await solanaSigner.signAndSendTransaction(\n request as SolanaUnsignedTransaction<Network>,\n wallet,\n options,\n crossChainCore,\n );\n return signature;\n } else if (chain.context === \"Ethereum\") {\n const tx = await ethereumSigner.signAndSendTransaction(\n request as EvmUnsignedTransaction<Network, EvmChains>,\n wallet,\n chain.displayName,\n );\n return tx;\n } else if (chain.context === \"Sui\") {\n const tx = await suiSigner.signAndSendTransaction(\n request as SuiUnsignedTransaction<Network, SuiChains>,\n wallet,\n );\n return tx;\n } else if (chain.context === \"Aptos\") {\n const tx = await aptosSigner.signAndSendTransaction(\n request as AptosUnsignedTransaction<Network, AptosChains>,\n wallet,\n sponsorAccount,\n dappNetwork,\n crossChainCore,\n );\n return tx;\n } else {\n throw new Error(`Unsupported chain: ${chain}`);\n }\n};\n","/**\n * Utility functions for Wormhole CCTP route creation.\n * These helpers can be used both by WormholeProvider and server-side claim endpoints.\n */\n\nimport {\n chainToPlatform,\n routes,\n Wormhole,\n TokenId,\n} from \"@wormhole-foundation/sdk\";\nimport { Chain } from \"../../CrossChainCore\";\nimport { TokenConfig } from \"../../config\";\n\nexport interface CCTPRouteResult {\n route: routes.ManualRoute<\"Mainnet\" | \"Testnet\">;\n request: routes.RouteTransferRequest<\"Mainnet\" | \"Testnet\">;\n}\n\n/**\n * Creates a CCTP route for transferring USDC between two chains.\n *\n * This is a standalone helper that can be used both by WormholeProvider\n * (client-side) and server-side claim endpoints to avoid code duplication.\n *\n * @param wh - Initialized Wormhole context\n * @param sourceChain - Source chain (e.g., \"Aptos\")\n * @param destChain - Destination chain (e.g., \"Solana\")\n * @param tokens - Token configuration mapping (mainnetTokens or testnetTokens)\n * @returns The CCTP route and request for completing transfers\n * @throws Error if no valid CCTP route is found\n */\nexport async function createCCTPRoute(\n wh: Wormhole<\"Mainnet\" | \"Testnet\">,\n sourceChain: Chain,\n destChain: Chain,\n tokens: Record<string, TokenConfig>,\n): Promise<CCTPRouteResult> {\n const sourceToken: TokenId = Wormhole.tokenId(\n sourceChain,\n tokens[sourceChain].tokenId.address,\n );\n const destToken: TokenId = Wormhole.tokenId(\n destChain,\n tokens[destChain].tokenId.address,\n );\n\n const destContext = wh\n .getPlatform(chainToPlatform(destChain))\n .getChain(destChain);\n const sourceContext = wh\n .getPlatform(chainToPlatform(sourceChain))\n .getChain(sourceChain);\n\n const request = await routes.RouteTransferRequest.create(\n wh,\n { source: sourceToken, destination: destToken },\n sourceContext,\n destContext,\n );\n\n const resolver = wh.resolver([routes.CCTPRoute]);\n const foundRoutes = await resolver.findRoutes(request);\n const cctpRoute = foundRoutes[0];\n\n if (!cctpRoute || !routes.isManual(cctpRoute)) {\n throw new Error(\"Expected manual CCTP route\");\n }\n\n return { route: cctpRoute, request };\n}\n\n","import {\n Connection,\n Keypair,\n Transaction,\n type Commitment,\n} from \"@solana/web3.js\";\nimport {\n Chain,\n Network,\n SignAndSendSigner,\n TxHash,\n UnsignedTransaction,\n} from \"@wormhole-foundation/sdk\";\nimport {\n addPriorityFeeInstructions,\n PriorityFeeConfig,\n sendAndConfirmTransaction,\n} from \"./solanaUtils\";\nimport { OnTransactionSigned } from \"../types\";\n\nexport interface SolanaLocalSignerConfig {\n /** The Solana keypair to sign transactions with */\n keypair: Keypair;\n /** The Solana RPC connection */\n connection: Connection;\n /** Transaction confirmation commitment level (default: \"finalized\") */\n commitment?: Commitment;\n /** Retry interval in ms when transaction is not confirmed (default: 5000) */\n retryIntervalMs?: number;\n /** Priority fee configuration for faster transaction landing */\n priorityFeeConfig?: PriorityFeeConfig;\n /** Enable verbose logging (default: false) */\n verbose?: boolean;\n /** Optional callback fired before and after each individual transaction is signed. */\n onTransactionSigned?: OnTransactionSigned;\n}\n\n/**\n * Server-side Solana signer for programmatic transaction signing.\n * Use this when you want to sign Solana transactions without user wallet interaction,\n * such as for server-side claim operations.\n *\n * @example\n * ```typescript\n * import { SolanaLocalSigner } from \"@aptos-labs/cross-chain-core\";\n * import { Connection, Keypair } from \"@solana/web3.js\";\n * import bs58 from \"bs58\";\n *\n * const keypair = Keypair.fromSecretKey(bs58.decode(process.env.SOLANA_CLAIM_SIGNER_KEY));\n * const connection = new Connection(\"https://api.mainnet-beta.solana.com\");\n *\n * const signer = new SolanaLocalSigner({\n * keypair,\n * connection,\n * // Optional: configure priority fees for faster landing\n * priorityFeeConfig: {\n * percentile: 0.9,\n * min: 100_000,\n * max: 1_000_000,\n * },\n * });\n * await cctpRoute.complete(signer, receipt);\n * ```\n */\nexport class SolanaLocalSigner<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n private keypair: Keypair;\n private connection: Connection;\n private commitment: Commitment;\n private retryIntervalMs: number;\n private priorityFeeConfig?: PriorityFeeConfig;\n private verbose: boolean;\n private _onTransactionSigned?: OnTransactionSigned;\n private _claimedTransactionHashes: string[] = [];\n\n constructor(config: SolanaLocalSignerConfig) {\n this.keypair = config.keypair;\n this.connection = config.connection;\n this.commitment = config.commitment ?? \"finalized\";\n this.retryIntervalMs = config.retryIntervalMs ?? 5000;\n this.priorityFeeConfig = config.priorityFeeConfig;\n this.verbose = config.verbose ?? false;\n this._onTransactionSigned = config.onTransactionSigned;\n }\n\n chain(): C {\n return \"Solana\" as C;\n }\n\n address(): string {\n return this.keypair.publicKey.toBase58();\n }\n\n /**\n * Returns all transaction hashes from the most recent signAndSend call,\n * joined by comma. If only one transaction was signed, returns a single hash string.\n */\n claimedTransactionHashes(): string {\n return this._claimedTransactionHashes.join(\",\");\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\n this._claimedTransactionHashes = [];\n\n for (const tx of txs) {\n this._onTransactionSigned?.(tx.description, null);\n const txId = await this.signAndSendTransaction(tx);\n this._onTransactionSigned?.(tx.description, txId);\n txHashes.push(txId);\n this._claimedTransactionHashes.push(txId);\n }\n return txHashes;\n }\n\n private async signAndSendTransaction(request: any): Promise<string> {\n const { blockhash, lastValidBlockHeight } =\n await this.connection.getLatestBlockhash(this.commitment);\n\n // Wormhole SDK wraps transactions in SolanaUnsignedTransaction\n // The actual transaction is in the .transaction property\n // Sometimes it's nested: request.transaction.transaction\n let unsignedTx = request.transaction ?? request;\n\n // Capture additional signers before unwrapping.\n // SolanaUnsignedTransaction nests them at request.transaction.signers\n // (see SolanaSigner.ts for the client-side equivalent).\n const additionalSigners = request.transaction?.signers;\n\n // Unwrap nested transaction wrappers (Wormhole SDK's SolanaUnsignedTransaction)\n const MAX_UNWRAP_DEPTH = 10;\n let unwrapDepth = 0;\n while (\n unsignedTx &&\n typeof unsignedTx === \"object\" &&\n \"transaction\" in unsignedTx &&\n !(unsignedTx instanceof Transaction) &&\n !(\"signatures\" in unsignedTx && \"message\" in unsignedTx)\n ) {\n if (++unwrapDepth > MAX_UNWRAP_DEPTH) {\n throw new Error(\n \"Transaction unwrapping exceeded maximum depth — possible circular nesting\",\n );\n }\n unsignedTx = unsignedTx.transaction;\n }\n\n // Check if this is a versioned transaction using duck typing\n // (VersionedTransaction has .message and .signatures properties)\n const isVersioned =\n unsignedTx.message !== undefined &&\n unsignedTx.signatures !== undefined &&\n typeof unsignedTx.message.recentBlockhash !== \"undefined\";\n\n if (isVersioned) {\n // For versioned transactions, we need to update the blockhash and sign\n unsignedTx.message.recentBlockhash = blockhash;\n\n // Note: Priority fees for versioned transactions would require rebuilding\n // the message, which is more complex. For now, we skip priority fees for versioned txs.\n if (this.verbose || this.priorityFeeConfig) {\n console.warn(\n \"SolanaLocalSigner: Versioned transaction detected — priority fees are not applied. \" +\n \"Consider using legacy transactions if priority fees are required.\",\n );\n }\n unsignedTx.sign([this.keypair]);\n\n // Also sign with any additional signers from Wormhole SDK\n if (additionalSigners && additionalSigners.length > 0) {\n unsignedTx.sign(additionalSigners);\n }\n } else if (unsignedTx instanceof Transaction) {\n // Legacy transaction handling\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Add priority fee instructions if configured\n if (this.priorityFeeConfig) {\n await addPriorityFeeInstructions(\n this.connection,\n unsignedTx,\n this.priorityFeeConfig,\n this.verbose,\n );\n }\n\n // Sign with the local keypair (and any additional signers in a single call).\n // Transaction.sign() resets the signatures array to only the provided\n // signers, so calling partialSign() afterwards for extra signers would\n // throw \"unknown signer\". Passing everyone to sign() at once avoids this.\n if (additionalSigners && additionalSigners.length > 0) {\n unsignedTx.sign(this.keypair, ...additionalSigners);\n } else {\n unsignedTx.sign(this.keypair);\n }\n } else if (\n unsignedTx.recentBlockhash !== undefined ||\n unsignedTx.feePayer !== undefined\n ) {\n // Looks like a legacy transaction but instanceof check failed\n // This can happen with different module instances\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Add priority fee instructions if configured\n if (this.priorityFeeConfig) {\n await addPriorityFeeInstructions(\n this.connection,\n unsignedTx,\n this.priorityFeeConfig,\n this.verbose,\n );\n }\n\n // Same rationale as the instanceof Transaction branch above:\n // include all signers in a single sign() call to avoid \"unknown signer\".\n if (additionalSigners && additionalSigners.length > 0) {\n unsignedTx.sign(this.keypair, ...additionalSigners);\n } else {\n unsignedTx.sign(this.keypair);\n }\n } else {\n throw new Error(\n `Unsupported transaction type: ${unsignedTx?.constructor?.name}`,\n );\n }\n\n const serializedTx = unsignedTx.serialize();\n\n // Use shared utility for sending and confirming\n const signature = await sendAndConfirmTransaction(\n serializedTx,\n blockhash,\n lastValidBlockHeight,\n {\n connection: this.connection,\n commitment: this.commitment,\n retryIntervalMs: this.retryIntervalMs,\n verbose: this.verbose,\n },\n );\n\n return signature;\n }\n}\n\n// Re-export PriorityFeeConfig for convenience\nexport type { PriorityFeeConfig };\n","import { Chain } from \"../CrossChainCore\";\n\nexport enum Context {\n ETH = \"Ethereum\",\n SOLANA = \"Solana\",\n APTOS = \"Aptos\",\n SUI = \"Sui\",\n}\n\nexport type BaseChainConfig = {\n key: Chain;\n context: Context;\n disabledAsSource?: boolean;\n disabledAsDestination?: boolean;\n};\n\nexport interface ChainConfig extends BaseChainConfig {\n defaultRpc: string;\n displayName: string;\n explorerUrl: string;\n explorerName: string;\n chainId: number | string;\n icon: Chain;\n symbol?: string;\n}\n\nexport type ChainsConfig = {\n [chain in Chain]?: ChainConfig;\n};\n\nexport type TokenConfig = {\n symbol: string;\n name?: string;\n decimals: number;\n icon: string;\n tokenId: {\n chain: Chain;\n address: string;\n };\n};\n","import { Context, ChainsConfig } from \"../types\";\n\nexport const testnetChains: ChainsConfig = {\n Sepolia: {\n key: \"Sepolia\",\n context: Context.ETH,\n chainId: 11155111,\n displayName: \"Sepolia\",\n explorerUrl: \"https://sepolia.etherscan.io/\",\n explorerName: \"Etherscan\",\n icon: \"Ethereum\",\n symbol: \"ETH\",\n defaultRpc: \"https://ethereum-sepolia-rpc.publicnode.com\",\n },\n BaseSepolia: {\n key: \"BaseSepolia\",\n context: Context.ETH,\n chainId: 84532,\n displayName: \"Base Sepolia\",\n explorerUrl: \"https://sepolia.basescan.org\",\n explorerName: \"Basescan\",\n icon: \"BaseSepolia\",\n symbol: \"BASE\",\n defaultRpc:\n \"https://chain-proxy.wallet.coinbase.com?targetName=base-sepolia\",\n },\n ArbitrumSepolia: {\n key: \"ArbitrumSepolia\",\n context: Context.ETH,\n chainId: 421614,\n displayName: \"Arbitrum Sepolia\",\n explorerUrl: \"https://sepolia.arbiscan.io\",\n explorerName: \"Etherscan\",\n icon: \"Arbitrum\",\n symbol: \"ARB\",\n defaultRpc: \"https://sepolia-rollup.arbitrum.io/rpc\",\n },\n Avalanche: {\n key: \"Avalanche\",\n context: Context.ETH,\n chainId: 43113,\n displayName: \"Avalanche Fuji\",\n explorerUrl: \"https://testnet.snowtrace.io\",\n explorerName: \"Avascan\",\n icon: \"Avalanche\",\n symbol: \"AVAX\",\n defaultRpc: \"https://api.avax-test.network/ext/bc/C/rpc\",\n },\n PolygonSepolia: {\n key: \"PolygonSepolia\",\n context: Context.ETH,\n chainId: 80002,\n displayName: \"Polygon\",\n explorerUrl: \"https://amoy.polygonscan.com/\",\n explorerName: \"PolygonScan\",\n icon: \"Polygon\",\n symbol: \"MATIC\",\n defaultRpc: \"https://rpc-amoy.polygon.technology/\",\n },\n Solana: {\n key: \"Solana\",\n context: Context.SOLANA,\n displayName: \"Solana\",\n explorerUrl: \"https://solscan.io\",\n explorerName: \"Solscan\",\n chainId: 0,\n icon: \"Solana\",\n symbol: \"SOL\",\n defaultRpc: \"https://api.devnet.solana.com\",\n },\n Aptos: {\n key: \"Aptos\",\n context: Context.APTOS,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com?network=testnet\",\n explorerName: \"Aptos Explorer\",\n chainId: 0,\n icon: \"Aptos\",\n symbol: \"APT\",\n defaultRpc: \"https://fullnode.testnet.aptos.dev\",\n },\n Sui: {\n key: \"Sui\",\n context: Context.SUI,\n displayName: \"Sui\",\n explorerUrl: \"https://suiscan.xyz/testnet\",\n explorerName: \"Suiscan\",\n chainId: 0,\n icon: \"Sui\",\n symbol: \"SUI\",\n defaultRpc: \"https://fullnode.testnet.sui.io:443\",\n },\n};\n","import { TokenConfig } from \"../types\";\n\nexport const testnetTokens: Record<string, TokenConfig> = {\n Sepolia: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Sepolia\",\n address: \"0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238\",\n },\n },\n Solana: {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Solana\",\n address: \"4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU\",\n },\n icon: \"USDC\",\n decimals: 6,\n },\n Aptos: {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0x69091fbab5f7d635ee7ac5098cf0c1efbe31d68fec0f2cd565e8d168daf52832\",\n },\n icon: \"USDC\",\n },\n BaseSepolia: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"BaseSepolia\",\n address: \"0x036CbD53842c5426634e7929541eC2318f3dCF7e\",\n },\n },\n Avalanche: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Avalanche\",\n address: \"0x5425890298aed601595a70AB815c96711a31Bc65\",\n },\n },\n ArbitrumSepolia: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"ArbitrumSepolia\",\n address: \"0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d\",\n },\n },\n PolygonSepolia: {\n symbol: \"USDC\",\n icon: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"PolygonSepolia\",\n address: \"0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582\",\n },\n },\n Sui: {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Sui\",\n address:\n \"0xa1ec7fc00a6f40db9693ad1415d0c193ad3906494428cf252621037bd7117e29::usdc::USDC\",\n },\n icon: \"USDC\",\n decimals: 6,\n },\n};\n","import { Context, ChainsConfig } from \"../types\";\n\nexport const mainnetChains: ChainsConfig = {\n Ethereum: {\n key: \"Ethereum\",\n context: Context.ETH,\n displayName: \"Ethereum\",\n explorerUrl: \"https://etherscan.io/\",\n explorerName: \"Etherscan\",\n chainId: 1,\n icon: \"Ethereum\",\n symbol: \"ETH\",\n defaultRpc: \"https://rpc.ankr.com/eth\",\n },\n Solana: {\n key: \"Solana\",\n context: Context.SOLANA,\n displayName: \"Solana\",\n explorerUrl: \"https://solscan.io\",\n explorerName: \"Solscan\",\n chainId: 0,\n icon: \"Solana\",\n symbol: \"SOL\",\n defaultRpc: \"https://solana-rpc.publicnode.com\",\n },\n Aptos: {\n key: \"Aptos\",\n context: Context.APTOS,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com/\",\n explorerName: \"Aptos Explorer\",\n chainId: 0,\n icon: \"Aptos\",\n symbol: \"APT\",\n defaultRpc: \"https://fullnode.mainnet.aptos.dev\",\n },\n Avalanche: {\n key: \"Avalanche\",\n context: Context.ETH,\n chainId: 43114,\n displayName: \"Avalanche\",\n explorerUrl: \"https://snowtrace.io\",\n explorerName: \"Avascan\",\n icon: \"Avalanche\",\n symbol: \"AVAX\",\n defaultRpc: \"https://avalanche-c-chain-rpc.publicnode.com\",\n },\n Base: {\n key: \"Base\",\n context: Context.ETH,\n chainId: 8453,\n displayName: \"Base\",\n explorerUrl: \"https://basescan.org\",\n explorerName: \"BaseScan\",\n icon: \"Base\",\n symbol: \"BASE\",\n defaultRpc: \"https://mainnet.base.org\",\n },\n Arbitrum: {\n key: \"Arbitrum\",\n context: Context.ETH,\n chainId: 42161,\n displayName: \"Arbitrum\",\n explorerUrl: \"https://arbiscan.io/\",\n explorerName: \"Arbitrum Explorer\",\n icon: \"Arbitrum\",\n symbol: \"ARB\",\n defaultRpc: \"https://arb1.arbitrum.io/rpc\",\n },\n Polygon: {\n key: \"Polygon\",\n context: Context.ETH,\n chainId: 137,\n displayName: \"Polygon\",\n explorerUrl: \"https://polygonscan.com/\",\n explorerName: \"PolygonScan\",\n icon: \"Polygon\",\n symbol: \"MATIC\",\n defaultRpc: \"https://polygon-bor-rpc.publicnode.com\",\n },\n Sui: {\n key: \"Sui\",\n context: Context.SUI,\n displayName: \"Sui\",\n explorerUrl: \"https://suiscan.xyz/\",\n explorerName: \"Suiscan\",\n chainId: 0,\n icon: \"Sui\",\n symbol: \"SUI\",\n defaultRpc: \"https://fullnode.mainnet.sui.io:443\",\n },\n};\n","import { TokenConfig } from \"../types\";\n\nexport const mainnetTokens: Record<string, TokenConfig> = {\n Ethereum: {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Ethereum\",\n address: \"0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48\",\n },\n icon: \"USDC\",\n decimals: 6,\n },\n Solana: {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Solana\",\n address: \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\",\n },\n icon: \"USDC\",\n decimals: 6,\n },\n Aptos: {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n },\n icon: \"USDC\",\n },\n Base: {\n symbol: \"USDC\",\n decimals: 6,\n icon: \"USDC\",\n tokenId: {\n chain: \"Base\",\n address: \"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913\",\n },\n },\n Arbitrum: {\n symbol: \"USDC\",\n decimals: 6,\n icon: \"USDC\",\n tokenId: {\n chain: \"Arbitrum\",\n address: \"0xaf88d065e77c8cC2239327C5EDb3A432268e5831\",\n },\n },\n Avalanche: {\n symbol: \"USDC\",\n decimals: 6,\n icon: \"USDC\",\n tokenId: {\n chain: \"Avalanche\",\n address: \"0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E\",\n },\n },\n Polygon: {\n symbol: \"USDC\",\n decimals: 6,\n icon: \"USDC\",\n tokenId: {\n chain: \"Polygon\",\n address: \"0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359\",\n },\n },\n Sui: {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Sui\",\n address:\n \"0xdba34672e30cb065b1f93e3ab55318768fd6fef66c15942c9f7cb846e2f900e7::usdc::USDC\",\n },\n icon: \"USDC\",\n },\n};\n","import { Aptos, AptosConfig, Network } from \"@aptos-labs/ts-sdk\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport { mainnetTokens, testnetTokens } from \"../config\";\nimport { ethers, JsonRpcProvider } from \"ethers\";\nimport { Chain } from \"../CrossChainCore\";\nimport { SuiClient } from \"@mysten/sui/client\";\n\nexport const getSolanaWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n rpc: string,\n): Promise<string> => {\n const address = new PublicKey(walletAddress);\n const tokenAddress =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Solana\"].tokenId.address\n : testnetTokens[\"Solana\"].tokenId.address;\n\n const connection = new Connection(rpc);\n // Find the token account for USDC\n const splToken = await connection.getTokenAccountsByOwner(address, {\n mint: new PublicKey(tokenAddress),\n });\n\n // If no token account exists, the wallet has never held USDC - balance is 0\n if (splToken.value.length === 0) {\n return \"0\";\n }\n\n const balance = await connection.getTokenAccountBalance(\n splToken.value[0]!.pubkey,\n );\n\n return (\n balance.value.uiAmountString ??\n ethers.formatUnits(BigInt(balance.value.amount), balance.value.decimals)\n );\n};\n\nexport const getEthereumWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n chain: Chain,\n rpc: string,\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[chain]\n : testnetTokens[chain];\n\n const tokenAddress = token.tokenId.address;\n const connection = new JsonRpcProvider(rpc);\n const abi = [\"function balanceOf(address owner) view returns (uint256)\"];\n const contract = new ethers.Contract(tokenAddress, abi, connection);\n const balance = await contract.balanceOf(walletAddress);\n return ethers.formatUnits(balance, token.decimals).toString();\n};\n\nexport const getAptosWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Aptos\"]\n : testnetTokens[\"Aptos\"];\n const tokenAddress = token.tokenId.address;\n const aptosConfig = new AptosConfig({ network: aptosNetwork });\n const connection = new Aptos(aptosConfig);\n const response = await connection.getCurrentFungibleAssetBalances({\n options: {\n where: {\n owner_address: { _eq: walletAddress },\n asset_type: { _eq: tokenAddress },\n },\n },\n });\n if (response.length === 0) {\n return \"0\";\n }\n return ethers.formatUnits(BigInt(response[0].amount), token.decimals);\n};\n\nexport const getSuiWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n rpc: string,\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Sui\"]\n : testnetTokens[\"Sui\"];\n\n const client = new SuiClient({\n url: rpc,\n });\n const balance = await client.getBalance({\n owner: walletAddress,\n coinType: token.tokenId.address,\n });\n // Reuse ethers' formatter for precise decimal formatting of large integers.\n return ethers.formatUnits(BigInt(balance.totalBalance), token.decimals);\n};\n"],"mappings":"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","names":["CrossChainCore","import_ts_sdk","import_sdk","import_ts_sdk","aptos","import_ts_sdk","signAndSendTransaction","aptos","import_web3","signAndSendTransaction","signAndSendTransaction","signAndSendTransaction","signAndSendTransaction","import_sdk","aptos","solana","evm","sui","import_web3","Context","import_ts_sdk","import_web3","import_ethers","import_ts_sdk","CrossChainCore","import_ts_sdk"]}
|