@aptos-labs/cross-chain-core 4.24.6 → 4.24.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js.map +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/version.d.ts +1 -1
- package/package.json +5 -5
- package/src/CrossChainCore.ts +5 -5
- package/src/providers/wormhole/signers/AptosLocalSigner.ts +3 -3
- package/src/providers/wormhole/signers/EthereumSigner.ts +3 -3
- package/src/providers/wormhole/signers/Signer.ts +5 -5
- package/src/providers/wormhole/signers/SolanaSigner.ts +20 -20
- package/src/providers/wormhole/wormhole.ts +10 -10
- package/src/utils/getUsdcBalance.ts +3 -3
- 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/providers/wormhole/signers/AptosLocalSigner.ts","../src/providers/wormhole/signers/SolanaSigner.ts","../src/providers/wormhole/signers/EthereumSigner.ts","../src/providers/wormhole/signers/Signer.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 { Network } from \"@aptos-labs/ts-sdk\";\n","import { Account, Network } from \"@aptos-labs/ts-sdk\";\n\nimport {\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse,\n WormholeProvider,\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n} from \"./providers/wormhole\";\n\nimport {\n ChainsConfig,\n testnetChains,\n testnetTokens,\n mainnetChains,\n mainnetTokens,\n TokenConfig,\n AptosTestnetUSDCToken,\n AptosMainnetUSDCToken,\n} from \"./config\";\nimport {\n getAptosWalletUSDCBalance,\n getEthereumWalletUSDCBalance,\n getSolanaWalletUSDCBalance,\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}\nexport type { AccountAddressInput } from \"@aptos-labs/ts-sdk\";\nexport { NetworkToChainId, NetworkToNodeAPI } from \"@aptos-labs/ts-sdk\";\nexport type AptosAccount = Account;\n\nexport type Chain = \"Solana\" | \"Ethereum\" | \"Sepolia\" | \"Aptos\";\n\nexport type CCTPProviders = \"Wormhole\";\n\nexport interface CrossChainProvider<\n TQuoteRequest = any,\n TQuoteResponse = any,\n TInitiateTransferRequest = any,\n TInitiateTransferResponse = any,\n> {\n getQuote(params: TQuoteRequest): Promise<TQuoteResponse>;\n initiateCCTPTransfer(\n params: TInitiateTransferRequest\n ): Promise<TInitiateTransferResponse>;\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 readonly APTOS_TOKEN: TokenConfig = AptosTestnetUSDCToken;\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 this.APTOS_TOKEN = AptosMainnetUSDCToken;\n } else {\n this.CHAINS = testnetChains;\n this.TOKENS = testnetTokens;\n this.APTOS_TOKEN = AptosTestnetUSDCToken;\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 WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse\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 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 \"Sepolia\":\n return await getEthereumWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n // TODO: maybe let the user config it\n this.CHAINS[sourceChain].defaultRpc\n );\n default:\n throw new Error(`Unsupported chain: ${sourceChain}`);\n }\n }\n}\n","import {\n chainToPlatform,\n routes,\n TokenId,\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\";\n\nimport {\n Chain,\n CrossChainProvider,\n CrossChainCore,\n} from \"../../CrossChainCore\";\nimport { logger } from \"../../utils/logger\";\nimport { AptosLocalSigner } from \"./signers/AptosLocalSigner\";\nimport { Signer } from \"./signers/Signer\";\nimport { ChainConfig } from \"../../config\";\nimport {\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse,\n WormholeRouteResponse,\n WormholeRequest,\n WormholeSubmitTransferRequest,\n WormholeStartTransferResponse,\n WormholeClaimTransferRequest,\n} from \"./types\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\nimport { EIP1193DerivedWallet } from \"@aptos-labs/derived-wallet-ethereum\";\n\nexport class WormholeProvider\n implements\n CrossChainProvider<\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse\n >\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\n constructor(core: CrossChainCore) {\n this.crossChainCore = core;\n }\n\n get wormholeContext(): Wormhole<\"Mainnet\" | \"Testnet\"> | undefined {\n return this._wormholeContext;\n }\n\n 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];\n const wh = await wormhole(isMainnet ? \"Mainnet\" : \"Testnet\", platforms);\n this._wormholeContext = wh;\n }\n\n async getRoute(sourceChain: Chain): Promise<{\n route: WormholeRouteResponse;\n request: WormholeRequest;\n }> {\n if (!this._wormholeContext) {\n throw new Error(\"Wormhole context not initialized\");\n }\n\n const { sourceToken, destToken } = this.getTokenInfo(sourceChain);\n\n const sourceContext = this._wormholeContext\n .getPlatform(chainToPlatform(sourceChain))\n .getChain(sourceChain);\n\n logger.log(\"sourceContext\", sourceContext);\n\n const destContext = this._wormholeContext\n .getPlatform(chainToPlatform(\"Aptos\"))\n .getChain(\"Aptos\");\n\n logger.log(\"destContext\", destContext);\n\n const request = await routes.RouteTransferRequest.create(\n this._wormholeContext,\n {\n source: sourceToken,\n destination: destToken,\n },\n sourceContext,\n destContext\n );\n\n const resolver = this._wormholeContext.resolver([\n routes.CCTPRoute, // manual CCTP\n ]);\n\n const route = await resolver.findRoutes(request);\n const cctpRoute = route[0];\n\n this.wormholeRoute = cctpRoute;\n this.wormholeRequest = request;\n\n return { route: cctpRoute, request };\n }\n\n async getQuote(input: WormholeQuoteRequest): Promise<WormholeQuoteResponse> {\n const { amount, sourceChain } = input;\n\n if (!this._wormholeContext) {\n await this.setWormholeContext(sourceChain);\n }\n\n const { route, request } = await this.getRoute(sourceChain);\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}`).message;\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}`).message;\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 {\n // is Ethereum\n [signerAddress] = await (\n wallet as EIP1193DerivedWallet\n ).eip1193Provider.request({\n method: \"eth_requestAccounts\",\n });\n }\n logger.log(\"signerAddress\", signerAddress);\n\n const signer = new Signer(\n this.getChainConfig(sourceChain),\n signerAddress,\n {},\n wallet\n );\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 ? sponsorAccount : undefined // the fee payer account\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 initiateCCTPTransfer(\n input: WormholeInitiateTransferRequest\n ): Promise<WormholeInitiateTransferResponse> {\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 sourceChain: input.sourceChain,\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 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 getTokenInfo(sourceChain: Chain): {\n sourceToken: TokenId;\n destToken: TokenId;\n } {\n const sourceToken: TokenId = Wormhole.tokenId(\n this.crossChainCore.TOKENS[sourceChain].tokenId.chain as Chain,\n this.crossChainCore.TOKENS[sourceChain].tokenId.address\n );\n\n const destToken: TokenId = Wormhole.tokenId(\n this.crossChainCore.APTOS_TOKEN.tokenId.chain as Chain,\n this.crossChainCore.APTOS_TOKEN.tokenId.address\n );\n\n return { sourceToken, destToken };\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 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\";\n\nexport class AptosLocalSigner<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n _chain: C;\n _options: any;\n _wallet: Account;\n _sponsorAccount: Account | GasStationApiKey | undefined;\n _claimedTransactionHashes: string;\n\n constructor(\n chain: C,\n options: any,\n wallet: Account,\n feePayerAccount: Account | GasStationApiKey | undefined\n ) {\n this._chain = chain;\n this._options = options;\n this._wallet = wallet;\n this._sponsorAccount = feePayerAccount;\n this._claimedTransactionHashes = \"\";\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;\n }\n /* other methods... */\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\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 );\n txHashes.push(txId);\n this._claimedTransactionHashes = 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) {\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: AptosNetwork.TESTNET,\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 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 if (typeof sponsorAccount === \"string\") {\n // TODO: handle gas station integration here\n } else {\n const feePayerSignerAuthenticator = aptos.transaction.signAsFeePayer({\n signer: sponsorAccount as Account,\n transaction: txnToSign,\n });\n txnToSubmit.feePayerAuthenticator = feePayerSignerAuthenticator;\n }\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","// 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\nimport {\n AddressLookupTableAccount,\n Commitment,\n ComputeBudgetProgram,\n ConfirmOptions,\n LAMPORTS_PER_SOL,\n SimulatedTransactionResponse,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { Transaction } from \"@solana/web3.js\";\nimport { RpcResponseAndContext, SignatureResult } from \"@solana/web3.js\";\nimport {\n determinePriorityFee,\n determinePriorityFeeTritonOne,\n SolanaUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-solana\";\n\nimport { Connection } from \"@solana/web3.js\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\n\nexport type SolanaRpcProvider = \"triton\" | \"helius\" | \"ankr\" | \"unknown\";\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\").message;\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 \"https://api.devnet.solana.com\"\n );\n const { blockhash, lastValidBlockHeight } =\n await connection.getLatestBlockhash(commitment);\n\n // Circle Manual CCTP on Wormhole is always of a Trnasaction type\n // https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/f7d992e04f844edcc4128659f12f75ade3553717/platforms/solana/protocols/cctp/src/circleBridge.ts#L173\n const transaction = request.transaction.transaction as Transaction;\n\n /**\n * TODO: Priority Fee is supported, but needs to come from dapp config\n */\n const unsignedTx = await setPriorityFeeInstructions(\n connection,\n blockhash,\n lastValidBlockHeight,\n request,\n crossChainCore\n );\n\n let confirmTransactionPromise: Promise<\n RpcResponseAndContext<SignatureResult>\n > | null = null;\n let confirmedTx: RpcResponseAndContext<SignatureResult> | null = null;\n let txSendAttempts = 1;\n let signature = \"\";\n\n // transaction.recentBlockhash = blockhash;\n // if (request.transaction.signers) {\n // transaction.partialSign(...request.transaction.signers);\n // }\n\n if (!wallet.solanaWallet.signTransaction) {\n throw new Error(\"Wallet does not support signing transactions\").message;\n }\n\n const tx = await wallet.solanaWallet.signTransaction(unsignedTx);\n\n if (!tx) throw new Error(\"Failed to sign transaction\").message;\n const serializedTx = tx.serialize();\n const sendOptions = {\n skipPreflight: true,\n maxRetries: 0,\n preFlightCommitment: commitment, // See PR and linked issue for why setting this matters: https://github.com/anza-xyz/agave/pull/483\n };\n signature = await connection.sendRawTransaction(serializedTx, sendOptions);\n confirmTransactionPromise = connection.confirmTransaction(\n {\n signature,\n blockhash,\n lastValidBlockHeight,\n },\n commitment\n );\n\n // This loop will break once the transaction has been confirmed or the block height is exceeded.\n // An exception will be thrown if the block height is exceeded by the confirmTransactionPromise.\n // The transaction will be resent if it hasn't been confirmed after the interval.\n const txRetryInterval = 5000;\n while (!confirmedTx) {\n confirmedTx = await Promise.race([\n confirmTransactionPromise,\n new Promise<null>((resolve) =>\n setTimeout(() => {\n resolve(null);\n }, txRetryInterval)\n ),\n ]);\n if (confirmedTx) {\n break;\n }\n console.log(\n `Tx not confirmed after ${\n txRetryInterval * txSendAttempts++\n }ms, resending`\n );\n try {\n await connection.sendRawTransaction(serializedTx, sendOptions);\n } catch (e) {\n console.error(\"Failed to resend transaction:\", e);\n }\n }\n\n if (confirmedTx.value.err) {\n let errorMessage = `Transaction failed: ${confirmedTx.value.err}`;\n if (typeof confirmedTx.value.err === \"object\") {\n try {\n errorMessage = `Transaction failed: ${JSON.stringify(\n confirmedTx.value.err,\n (_key, value) =>\n typeof value === \"bigint\" ? value.toString() : value // Handle bigint props\n )}`;\n } catch (e: unknown) {\n // Most likely a circular reference error, we can't stringify this error object.\n // See for more details:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#exceptions\n errorMessage = `Transaction failed: Unknown error`;\n }\n }\n throw new Error(`Transaction failed: ${errorMessage}`).message;\n }\n\n return signature;\n}\n\nexport async function setPriorityFeeInstructions(\n connection: Connection,\n blockhash: string,\n lastValidBlockHeight: number,\n request: SolanaUnsignedTransaction<Network>,\n crossChainCore?: CrossChainCore\n): Promise<Transaction | VersionedTransaction> {\n const unsignedTx = request.transaction.transaction as Transaction;\n\n const computeBudgetIxFilter = (ix: TransactionInstruction) =>\n ix.programId.toString() !== \"ComputeBudget111111111111111111111111111111\";\n\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Remove existing compute budget instructions if they were added by the SDK\n unsignedTx.instructions = unsignedTx.instructions.filter(\n computeBudgetIxFilter\n );\n unsignedTx.add(\n ...(await createPriorityFeeInstructions(\n connection,\n unsignedTx,\n crossChainCore\n ))\n );\n if (request.transaction.signers) {\n unsignedTx.partialSign(...request.transaction.signers);\n }\n\n return unsignedTx;\n}\n\n// This will throw if the simulation fails\nasync function createPriorityFeeInstructions(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n crossChainCore?: CrossChainCore\n) {\n let unitsUsed = 200_000;\n let simulationAttempts = 0;\n\n simulationLoop: while (true) {\n const response = await connection.simulateTransaction(\n transaction as Transaction\n );\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 for both known and unknown errors\n // We should throw in that case\n throw new Error(\n `Simulation failed: ${JSON.stringify(response.value.err)}\\nLogs:\\n${(\n response.value.logs || []\n ).join(\"\\n \")}`\n ).message;\n } else {\n // Simulation was successful\n if (response.value.unitsConsumed) {\n unitsUsed = response.value.unitsConsumed;\n }\n break;\n }\n }\n\n const unitBudget = Math.floor(unitsUsed * 1.2); // Budget in 20% headroom\n\n const instructions: TransactionInstruction[] = [];\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n // Set compute budget to 120% of the units used in the simulated transaction\n units: unitBudget,\n })\n );\n\n const {\n percentile = 0.9,\n percentileMultiple = 1,\n min = 100_000,\n max = 100_000_000,\n } = crossChainCore?._dappConfig?.solanaConfig?.priorityFeeConfig ?? {};\n\n const calculateFee = async (\n rpcProvider?: SolanaRpcProvider\n ): Promise<{ fee: number; methodUsed: \"triton\" | \"default\" | \"minimum\" }> => {\n if (rpcProvider === \"triton\") {\n // Triton has an experimental RPC method that accepts a percentile paramater\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 {\n fee,\n methodUsed: \"triton\",\n };\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 {\n fee,\n methodUsed: \"default\",\n };\n } catch (e) {\n console.warn(`Failed to determine priority fee using Triton RPC:`, e);\n\n return {\n fee: min,\n methodUsed: \"minimum\",\n };\n }\n };\n\n const rpcProvider = determineRpcProvider(connection.rpcEndpoint);\n\n const { fee, methodUsed } = await calculateFee(rpcProvider);\n\n const maxFeeInSol =\n (fee /\n // convert microlamports to lamports\n 1e6 /\n // convert lamports to SOL\n LAMPORTS_PER_SOL) *\n // multiply by maximum compute units used\n unitBudget;\n\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 instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: fee })\n );\n return instructions;\n}\n\n// Checks response logs for known errors.\n// Returns when the first error is encountered.\nfunction checkKnownSimulationError(\n response: SimulatedTransactionResponse\n): boolean {\n const errors = {} as any;\n\n // This error occur when the blockhash included in a transaction is not deemed to be valid\n // when a validator processes a transaction. We can retry the simulation to get a valid blockhash.\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 // In some cases which aren't deterministic, like a slippage error, we can retry the\n // simulation a few times to get a successful response.\n if (line.includes(\"SlippageToleranceExceeded\")) {\n errors[\"SlippageToleranceExceeded\"] =\n \"Slippage failure during simulation. Trying again.\";\n }\n\n // In this case a require_gte expression was violated during a Swap instruction.\n // We can retry the simulation to get a successful response.\n if (line.includes(\"RequireGteViolated\")) {\n errors[\"RequireGteViolated\"] =\n \"Swap instruction failure during simulation. Trying again.\";\n }\n }\n }\n\n // No known simulation errors found\n if (isEmptyObject(errors)) {\n return false;\n }\n\n console.table(errors);\n return true;\n}\n\nexport async function sleep(timeout: number) {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n\n/**\n * Checks whether an object is empty.\n *\n * isEmptyObject(null)\n * // => true\n *\n * isEmptyObject(undefined)\n * // => true\n *\n * isEmptyObject({})\n * // => true\n *\n * isEmptyObject({ 'a': 1 })\n * // => false\n */\nexport const isEmptyObject = (value: object | null | undefined) => {\n if (value === null || value === undefined) {\n return true;\n }\n\n // Check all property keys for any own prop\n for (const key in value) {\n if (value.hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n\n return true;\n};\n\nfunction determineRpcProvider(endpoint: string): SolanaRpcProvider {\n try {\n const url = new URL(endpoint);\n const hostname = url.hostname;\n if (hostname === \"rpcpool.com\") {\n return \"triton\";\n } else if (hostname === \"helius-rpc.com\") {\n return \"helius\";\n } else if (hostname === \"rpc.ankr.com\") {\n return \"ankr\";\n } else {\n return \"unknown\";\n }\n } catch (e) {\n return \"unknown\";\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\").message;\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).message;\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 ).message;\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 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\";\n\nimport * as solanaSigner from \"./SolanaSigner\";\nimport * as ethereumSigner from \"./EthereumSigner\";\n// import {\n// SuiChains,\n// SuiUnsignedTransaction,\n// } from \"@wormhole-foundation/sdk-sui\";\n// import * as suiSigner from \"./SuiSigner\";\n\nimport { ChainConfig } from \"../../../config\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nexport class Signer<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n _chain: ChainConfig;\n _address: string;\n _options: any;\n _wallet: AdapterWallet;\n _crossChainCore?: CrossChainCore;\n\n constructor(\n chain: ChainConfig,\n address: string,\n options: any,\n wallet: AdapterWallet,\n crossChainCore?: CrossChainCore\n ) {\n this._chain = chain;\n this._address = address;\n this._options = options;\n this._wallet = wallet;\n this._crossChainCore = crossChainCore;\n }\n\n chain(): C {\n return this._chain.displayName as C;\n }\n address(): string {\n return this._address;\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\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 );\n txHashes.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): Promise<string> => {\n if (!wallet) {\n throw new Error(\"wallet is undefined\");\n }\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 {\n throw new Error(`Unsupported chain: ${chain}`);\n }\n};\n","import { ChainId } from \"@wormhole-foundation/sdk\";\nimport { Chain } from \"../CrossChainCore\";\n\nexport enum Context {\n ETH = \"Ethereum\",\n SOLANA = \"Solana\",\n APTOS = \"Aptos\",\n}\n\nexport type BaseChainConfig = {\n key: Chain;\n id: ChainId;\n context: Context;\n finalityThreshold: number;\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 gasToken: string;\n wrappedGasToken?: string;\n chainId: number | string;\n icon: Chain;\n maxBlockSearch: number;\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 } from \"../types\";\n\nimport { ChainsConfig } from \"../types\";\n\nexport const testnetChains: ChainsConfig = {\n Sepolia: {\n key: \"Sepolia\",\n id: 10002,\n context: Context.ETH,\n finalityThreshold: 0,\n displayName: \"Sepolia\",\n explorerUrl: \"https://sepolia.etherscan.io/\",\n explorerName: \"Etherscan\",\n gasToken: \"ETHsepolia\",\n chainId: 11155111,\n icon: \"Ethereum\",\n maxBlockSearch: 2000,\n symbol: \"ETH\",\n defaultRpc: \"https://eth-sepolia.public.blastapi.io\",\n wrappedGasToken: \"0xeef12A83EE5b7161D3873317c8E0E7B76e0B5D9c\",\n },\n Solana: {\n key: \"Solana\",\n id: 1,\n context: Context.SOLANA,\n finalityThreshold: 32,\n displayName: \"Solana\",\n explorerUrl: \"https://explorer.solana.com/\",\n explorerName: \"Solana Explorer\",\n gasToken: \"SOL\",\n chainId: 0,\n icon: \"Solana\",\n maxBlockSearch: 2000,\n symbol: \"SOL\",\n defaultRpc: \"https://api.devnet.solana.com\",\n wrappedGasToken: \"So11111111111111111111111111111111111111112\",\n },\n // Sui: {\n // key: \"Sui\",\n // id: 21,\n // context: Context.SUI,\n // finalityThreshold: 0,\n // displayName: \"Sui\",\n // explorerUrl: \"https://suiscan.xyz/testnet/\",\n // explorerName: \"Suiscan\",\n // gasToken: \"SUI\",\n // chainId: 0,\n // icon: \"Sui\",\n // maxBlockSearch: 0,\n // symbol: \"SUI\",\n // sdkName: \"Sui\",\n // },\n};\n\nexport const AptosTestnetChain = {\n key: \"Aptos\",\n id: 22,\n context: Context.APTOS,\n finalityThreshold: 0,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com?network=testnet\",\n explorerName: \"Aptos Explorer\",\n gasToken: \"APT\",\n chainId: 0,\n icon: \"Aptos\",\n maxBlockSearch: 0,\n symbol: \"APT\",\n sdkName: \"Aptos\",\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 // 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\nexport const AptosTestnetUSDCToken: TokenConfig = {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0x69091fbab5f7d635ee7ac5098cf0c1efbe31d68fec0f2cd565e8d168daf52832\",\n },\n icon: \"USDC\",\n};\n","import { Context, ChainsConfig } from \"../types\";\n\nexport const mainnetChains: ChainsConfig = {\n Ethereum: {\n key: \"Ethereum\",\n id: 2,\n context: Context.ETH,\n finalityThreshold: 64,\n displayName: \"Ethereum\",\n explorerUrl: \"https://etherscan.io/\",\n explorerName: \"Etherscan\",\n gasToken: \"ETH\",\n chainId: 1,\n icon: \"Ethereum\",\n maxBlockSearch: 2000,\n symbol: \"ETH\",\n defaultRpc: \"https://rpc.ankr.com/eth\",\n },\n Solana: {\n key: \"Solana\",\n id: 1,\n context: Context.SOLANA,\n finalityThreshold: 32,\n displayName: \"Solana\",\n explorerUrl: \"https://explorer.solana.com/\",\n explorerName: \"Solana Explorer\",\n gasToken: \"SOL\",\n chainId: 0,\n icon: \"Solana\",\n maxBlockSearch: 2000,\n symbol: \"SOL\",\n defaultRpc: \"https://solana-mainnet.rpc.extrnode.com\",\n },\n // Sui: {\n // key: \"Sui\",\n // id: 21,\n // context: Context.SUI,\n // finalityThreshold: 0,\n // displayName: \"Sui\",\n // sdkName: \"Sui\",\n // explorerUrl: \"https://suiscan.xyz/\",\n // explorerName: \"Suiscan\",\n // gasToken: \"SUI\",\n // chainId: 0,\n // icon: \"Sui\",\n // maxBlockSearch: 0,\n // symbol: \"SUI\",\n // },\n};\n\nexport const AptosMainnetChain = {\n key: \"Aptos\",\n id: 22,\n context: \"Aptos\",\n finalityThreshold: 0,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com/\",\n explorerName: \"Aptos Explorer\",\n gasToken: \"APT\",\n chainId: 0,\n icon: \"Aptos\",\n maxBlockSearch: 0,\n symbol: \"APT\",\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 // 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\nexport const AptosMainnetUSDCToken: TokenConfig = {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n },\n icon: \"USDC\",\n decimals: 6,\n};\n","import { Aptos, AptosConfig, Network } from \"@aptos-labs/ts-sdk\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport {\n AptosMainnetUSDCToken,\n AptosTestnetUSDCToken,\n mainnetTokens,\n testnetTokens,\n} from \"../config\";\nimport { ethers, JsonRpcProvider } from \"ethers\";\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 // Check to see if we were passed wallet address or token account\n const splToken = await connection.getTokenAccountsByOwner(address, {\n mint: new PublicKey(tokenAddress),\n });\n\n // Use the first token account if it exists, otherwise fall back to wallet address\n const checkAddress =\n splToken.value.length > 0 ? splToken.value[0]!.pubkey : address;\n\n const balance = await connection.getTokenAccountBalance(checkAddress);\n\n return (\n balance.value.uiAmountString ??\n (Number(balance.value.amount) / 10 ** balance.value.decimals).toString()\n );\n};\n\nexport const getEthereumWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n rpc: string\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Ethereum\"]\n : testnetTokens[\"Sepolia\"];\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 ? AptosMainnetUSDCToken\n : AptosTestnetUSDCToken;\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 const balance = (\n Number(response[0].amount) /\n 10 ** token.decimals\n ).toString();\n return balance;\n};\n"],"mappings":"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","names":["import_ts_sdk","import_ts_sdk","AptosNetwork","aptos","import_web3","signAndSendTransaction","rpcProvider","fee","signAndSendTransaction","signAndSendTransaction","aptos","solana","evm","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/providers/wormhole/signers/AptosLocalSigner.ts","../src/providers/wormhole/signers/SolanaSigner.ts","../src/providers/wormhole/signers/EthereumSigner.ts","../src/providers/wormhole/signers/Signer.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 { Network } from \"@aptos-labs/ts-sdk\";\n","import { Account, Network } from \"@aptos-labs/ts-sdk\";\n\nimport {\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse,\n WormholeProvider,\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n} from \"./providers/wormhole\";\n\nimport {\n ChainsConfig,\n testnetChains,\n testnetTokens,\n mainnetChains,\n mainnetTokens,\n TokenConfig,\n AptosTestnetUSDCToken,\n AptosMainnetUSDCToken,\n} from \"./config\";\nimport {\n getAptosWalletUSDCBalance,\n getEthereumWalletUSDCBalance,\n getSolanaWalletUSDCBalance,\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}\nexport type { AccountAddressInput } from \"@aptos-labs/ts-sdk\";\nexport { NetworkToChainId, NetworkToNodeAPI } from \"@aptos-labs/ts-sdk\";\nexport type AptosAccount = Account;\n\nexport type Chain = \"Solana\" | \"Ethereum\" | \"Sepolia\" | \"Aptos\";\n\nexport type CCTPProviders = \"Wormhole\";\n\nexport interface CrossChainProvider<\n TQuoteRequest = any,\n TQuoteResponse = any,\n TInitiateTransferRequest = any,\n TInitiateTransferResponse = any,\n> {\n getQuote(params: TQuoteRequest): Promise<TQuoteResponse>;\n initiateCCTPTransfer(\n params: TInitiateTransferRequest,\n ): Promise<TInitiateTransferResponse>;\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 readonly APTOS_TOKEN: TokenConfig = AptosTestnetUSDCToken;\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 this.APTOS_TOKEN = AptosMainnetUSDCToken;\n } else {\n this.CHAINS = testnetChains;\n this.TOKENS = testnetTokens;\n this.APTOS_TOKEN = AptosTestnetUSDCToken;\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 WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse\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 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 \"Sepolia\":\n return await getEthereumWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n // TODO: maybe let the user config it\n this.CHAINS[sourceChain].defaultRpc,\n );\n default:\n throw new Error(`Unsupported chain: ${sourceChain}`);\n }\n }\n}\n","import {\n chainToPlatform,\n routes,\n TokenId,\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\";\n\nimport {\n Chain,\n CrossChainProvider,\n CrossChainCore,\n} from \"../../CrossChainCore\";\nimport { logger } from \"../../utils/logger\";\nimport { AptosLocalSigner } from \"./signers/AptosLocalSigner\";\nimport { Signer } from \"./signers/Signer\";\nimport { ChainConfig } from \"../../config\";\nimport {\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse,\n WormholeRouteResponse,\n WormholeRequest,\n WormholeSubmitTransferRequest,\n WormholeStartTransferResponse,\n WormholeClaimTransferRequest,\n} from \"./types\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\nimport { EIP1193DerivedWallet } from \"@aptos-labs/derived-wallet-ethereum\";\n\nexport class WormholeProvider\n implements\n CrossChainProvider<\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse\n >\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\n constructor(core: CrossChainCore) {\n this.crossChainCore = core;\n }\n\n get wormholeContext(): Wormhole<\"Mainnet\" | \"Testnet\"> | undefined {\n return this._wormholeContext;\n }\n\n 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];\n const wh = await wormhole(isMainnet ? \"Mainnet\" : \"Testnet\", platforms);\n this._wormholeContext = wh;\n }\n\n async getRoute(sourceChain: Chain): Promise<{\n route: WormholeRouteResponse;\n request: WormholeRequest;\n }> {\n if (!this._wormholeContext) {\n throw new Error(\"Wormhole context not initialized\");\n }\n\n const { sourceToken, destToken } = this.getTokenInfo(sourceChain);\n\n const sourceContext = this._wormholeContext\n .getPlatform(chainToPlatform(sourceChain))\n .getChain(sourceChain);\n\n logger.log(\"sourceContext\", sourceContext);\n\n const destContext = this._wormholeContext\n .getPlatform(chainToPlatform(\"Aptos\"))\n .getChain(\"Aptos\");\n\n logger.log(\"destContext\", destContext);\n\n const request = await routes.RouteTransferRequest.create(\n this._wormholeContext,\n {\n source: sourceToken,\n destination: destToken,\n },\n sourceContext,\n destContext,\n );\n\n const resolver = this._wormholeContext.resolver([\n routes.CCTPRoute, // manual CCTP\n ]);\n\n const route = await resolver.findRoutes(request);\n const cctpRoute = route[0];\n\n this.wormholeRoute = cctpRoute;\n this.wormholeRequest = request;\n\n return { route: cctpRoute, request };\n }\n\n async getQuote(input: WormholeQuoteRequest): Promise<WormholeQuoteResponse> {\n const { amount, sourceChain } = input;\n\n if (!this._wormholeContext) {\n await this.setWormholeContext(sourceChain);\n }\n\n const { route, request } = await this.getRoute(sourceChain);\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}`).message;\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}`).message;\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 {\n // is Ethereum\n [signerAddress] = await (\n wallet as EIP1193DerivedWallet\n ).eip1193Provider.request({\n method: \"eth_requestAccounts\",\n });\n }\n logger.log(\"signerAddress\", signerAddress);\n\n const signer = new Signer(\n this.getChainConfig(sourceChain),\n signerAddress,\n {},\n wallet,\n );\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 ? sponsorAccount : undefined, // the fee payer account\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 initiateCCTPTransfer(\n input: WormholeInitiateTransferRequest,\n ): Promise<WormholeInitiateTransferResponse> {\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 sourceChain: input.sourceChain,\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 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 getTokenInfo(sourceChain: Chain): {\n sourceToken: TokenId;\n destToken: TokenId;\n } {\n const sourceToken: TokenId = Wormhole.tokenId(\n this.crossChainCore.TOKENS[sourceChain].tokenId.chain as Chain,\n this.crossChainCore.TOKENS[sourceChain].tokenId.address,\n );\n\n const destToken: TokenId = Wormhole.tokenId(\n this.crossChainCore.APTOS_TOKEN.tokenId.chain as Chain,\n this.crossChainCore.APTOS_TOKEN.tokenId.address,\n );\n\n return { sourceToken, destToken };\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 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\";\n\nexport class AptosLocalSigner<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n _chain: C;\n _options: any;\n _wallet: Account;\n _sponsorAccount: Account | GasStationApiKey | undefined;\n _claimedTransactionHashes: string;\n\n constructor(\n chain: C,\n options: any,\n wallet: Account,\n feePayerAccount: Account | GasStationApiKey | undefined,\n ) {\n this._chain = chain;\n this._options = options;\n this._wallet = wallet;\n this._sponsorAccount = feePayerAccount;\n this._claimedTransactionHashes = \"\";\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;\n }\n /* other methods... */\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\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 );\n txHashes.push(txId);\n this._claimedTransactionHashes = 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) {\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: AptosNetwork.TESTNET,\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 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 if (typeof sponsorAccount === \"string\") {\n // TODO: handle gas station integration here\n } else {\n const feePayerSignerAuthenticator = aptos.transaction.signAsFeePayer({\n signer: sponsorAccount as Account,\n transaction: txnToSign,\n });\n txnToSubmit.feePayerAuthenticator = feePayerSignerAuthenticator;\n }\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","// 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\nimport {\n AddressLookupTableAccount,\n Commitment,\n ComputeBudgetProgram,\n ConfirmOptions,\n LAMPORTS_PER_SOL,\n SimulatedTransactionResponse,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { Transaction } from \"@solana/web3.js\";\nimport { RpcResponseAndContext, SignatureResult } from \"@solana/web3.js\";\nimport {\n determinePriorityFee,\n determinePriorityFeeTritonOne,\n SolanaUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-solana\";\n\nimport { Connection } from \"@solana/web3.js\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\n\nexport type SolanaRpcProvider = \"triton\" | \"helius\" | \"ankr\" | \"unknown\";\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\").message;\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 \"https://api.devnet.solana.com\",\n );\n const { blockhash, lastValidBlockHeight } =\n await connection.getLatestBlockhash(commitment);\n\n // Circle Manual CCTP on Wormhole is always of a Trnasaction type\n // https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/f7d992e04f844edcc4128659f12f75ade3553717/platforms/solana/protocols/cctp/src/circleBridge.ts#L173\n const transaction = request.transaction.transaction as Transaction;\n\n /**\n * TODO: Priority Fee is supported, but needs to come from dapp config\n */\n const unsignedTx = await setPriorityFeeInstructions(\n connection,\n blockhash,\n lastValidBlockHeight,\n request,\n crossChainCore,\n );\n\n let confirmTransactionPromise: Promise<\n RpcResponseAndContext<SignatureResult>\n > | null = null;\n let confirmedTx: RpcResponseAndContext<SignatureResult> | null = null;\n let txSendAttempts = 1;\n let signature = \"\";\n\n // transaction.recentBlockhash = blockhash;\n // if (request.transaction.signers) {\n // transaction.partialSign(...request.transaction.signers);\n // }\n\n if (!wallet.solanaWallet.signTransaction) {\n throw new Error(\"Wallet does not support signing transactions\").message;\n }\n\n const tx = await wallet.solanaWallet.signTransaction(unsignedTx);\n\n if (!tx) throw new Error(\"Failed to sign transaction\").message;\n const serializedTx = tx.serialize();\n const sendOptions = {\n skipPreflight: true,\n maxRetries: 0,\n preFlightCommitment: commitment, // See PR and linked issue for why setting this matters: https://github.com/anza-xyz/agave/pull/483\n };\n signature = await connection.sendRawTransaction(serializedTx, sendOptions);\n confirmTransactionPromise = connection.confirmTransaction(\n {\n signature,\n blockhash,\n lastValidBlockHeight,\n },\n commitment,\n );\n\n // This loop will break once the transaction has been confirmed or the block height is exceeded.\n // An exception will be thrown if the block height is exceeded by the confirmTransactionPromise.\n // The transaction will be resent if it hasn't been confirmed after the interval.\n const txRetryInterval = 5000;\n while (!confirmedTx) {\n confirmedTx = await Promise.race([\n confirmTransactionPromise,\n new Promise<null>((resolve) =>\n setTimeout(() => {\n resolve(null);\n }, txRetryInterval),\n ),\n ]);\n if (confirmedTx) {\n break;\n }\n console.log(\n `Tx not confirmed after ${\n txRetryInterval * txSendAttempts++\n }ms, resending`,\n );\n try {\n await connection.sendRawTransaction(serializedTx, sendOptions);\n } catch (e) {\n console.error(\"Failed to resend transaction:\", e);\n }\n }\n\n if (confirmedTx.value.err) {\n let errorMessage = `Transaction failed: ${confirmedTx.value.err}`;\n if (typeof confirmedTx.value.err === \"object\") {\n try {\n errorMessage = `Transaction failed: ${JSON.stringify(\n confirmedTx.value.err,\n (_key, value) =>\n typeof value === \"bigint\" ? value.toString() : value, // Handle bigint props\n )}`;\n } catch (e: unknown) {\n // Most likely a circular reference error, we can't stringify this error object.\n // See for more details:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#exceptions\n errorMessage = `Transaction failed: Unknown error`;\n }\n }\n throw new Error(`Transaction failed: ${errorMessage}`).message;\n }\n\n return signature;\n}\n\nexport async function setPriorityFeeInstructions(\n connection: Connection,\n blockhash: string,\n lastValidBlockHeight: number,\n request: SolanaUnsignedTransaction<Network>,\n crossChainCore?: CrossChainCore,\n): Promise<Transaction | VersionedTransaction> {\n const unsignedTx = request.transaction.transaction as Transaction;\n\n const computeBudgetIxFilter = (ix: TransactionInstruction) =>\n ix.programId.toString() !== \"ComputeBudget111111111111111111111111111111\";\n\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Remove existing compute budget instructions if they were added by the SDK\n unsignedTx.instructions = unsignedTx.instructions.filter(\n computeBudgetIxFilter,\n );\n unsignedTx.add(\n ...(await createPriorityFeeInstructions(\n connection,\n unsignedTx,\n crossChainCore,\n )),\n );\n if (request.transaction.signers) {\n unsignedTx.partialSign(...request.transaction.signers);\n }\n\n return unsignedTx;\n}\n\n// This will throw if the simulation fails\nasync function createPriorityFeeInstructions(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n crossChainCore?: CrossChainCore,\n) {\n let unitsUsed = 200_000;\n let simulationAttempts = 0;\n\n simulationLoop: while (true) {\n const response = await connection.simulateTransaction(\n transaction as Transaction,\n );\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 for both known and unknown errors\n // We should throw in that case\n throw new Error(\n `Simulation failed: ${JSON.stringify(response.value.err)}\\nLogs:\\n${(\n response.value.logs || []\n ).join(\"\\n \")}`,\n ).message;\n } else {\n // Simulation was successful\n if (response.value.unitsConsumed) {\n unitsUsed = response.value.unitsConsumed;\n }\n break;\n }\n }\n\n const unitBudget = Math.floor(unitsUsed * 1.2); // Budget in 20% headroom\n\n const instructions: TransactionInstruction[] = [];\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n // Set compute budget to 120% of the units used in the simulated transaction\n units: unitBudget,\n }),\n );\n\n const {\n percentile = 0.9,\n percentileMultiple = 1,\n min = 100_000,\n max = 100_000_000,\n } = crossChainCore?._dappConfig?.solanaConfig?.priorityFeeConfig ?? {};\n\n const calculateFee = async (\n rpcProvider?: SolanaRpcProvider,\n ): Promise<{ fee: number; methodUsed: \"triton\" | \"default\" | \"minimum\" }> => {\n if (rpcProvider === \"triton\") {\n // Triton has an experimental RPC method that accepts a percentile paramater\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 {\n fee,\n methodUsed: \"triton\",\n };\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 {\n fee,\n methodUsed: \"default\",\n };\n } catch (e) {\n console.warn(`Failed to determine priority fee using Triton RPC:`, e);\n\n return {\n fee: min,\n methodUsed: \"minimum\",\n };\n }\n };\n\n const rpcProvider = determineRpcProvider(connection.rpcEndpoint);\n\n const { fee, methodUsed } = await calculateFee(rpcProvider);\n\n const maxFeeInSol =\n (fee /\n // convert microlamports to lamports\n 1e6 /\n // convert lamports to SOL\n LAMPORTS_PER_SOL) *\n // multiply by maximum compute units used\n unitBudget;\n\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 instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: fee }),\n );\n return instructions;\n}\n\n// Checks response logs for known errors.\n// Returns when the first error is encountered.\nfunction checkKnownSimulationError(\n response: SimulatedTransactionResponse,\n): boolean {\n const errors = {} as any;\n\n // This error occur when the blockhash included in a transaction is not deemed to be valid\n // when a validator processes a transaction. We can retry the simulation to get a valid blockhash.\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 // In some cases which aren't deterministic, like a slippage error, we can retry the\n // simulation a few times to get a successful response.\n if (line.includes(\"SlippageToleranceExceeded\")) {\n errors[\"SlippageToleranceExceeded\"] =\n \"Slippage failure during simulation. Trying again.\";\n }\n\n // In this case a require_gte expression was violated during a Swap instruction.\n // We can retry the simulation to get a successful response.\n if (line.includes(\"RequireGteViolated\")) {\n errors[\"RequireGteViolated\"] =\n \"Swap instruction failure during simulation. Trying again.\";\n }\n }\n }\n\n // No known simulation errors found\n if (isEmptyObject(errors)) {\n return false;\n }\n\n console.table(errors);\n return true;\n}\n\nexport async function sleep(timeout: number) {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n\n/**\n * Checks whether an object is empty.\n *\n * isEmptyObject(null)\n * // => true\n *\n * isEmptyObject(undefined)\n * // => true\n *\n * isEmptyObject({})\n * // => true\n *\n * isEmptyObject({ 'a': 1 })\n * // => false\n */\nexport const isEmptyObject = (value: object | null | undefined) => {\n if (value === null || value === undefined) {\n return true;\n }\n\n // Check all property keys for any own prop\n for (const key in value) {\n if (value.hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n\n return true;\n};\n\nfunction determineRpcProvider(endpoint: string): SolanaRpcProvider {\n try {\n const url = new URL(endpoint);\n const hostname = url.hostname;\n if (hostname === \"rpcpool.com\") {\n return \"triton\";\n } else if (hostname === \"helius-rpc.com\") {\n return \"helius\";\n } else if (hostname === \"rpc.ankr.com\") {\n return \"ankr\";\n } else {\n return \"unknown\";\n }\n } catch (e) {\n return \"unknown\";\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\").message;\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).message;\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 ).message;\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 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\";\n\nimport * as solanaSigner from \"./SolanaSigner\";\nimport * as ethereumSigner from \"./EthereumSigner\";\n// import {\n// SuiChains,\n// SuiUnsignedTransaction,\n// } from \"@wormhole-foundation/sdk-sui\";\n// import * as suiSigner from \"./SuiSigner\";\n\nimport { ChainConfig } from \"../../../config\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nexport class Signer<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n _chain: ChainConfig;\n _address: string;\n _options: any;\n _wallet: AdapterWallet;\n _crossChainCore?: CrossChainCore;\n\n constructor(\n chain: ChainConfig,\n address: string,\n options: any,\n wallet: AdapterWallet,\n crossChainCore?: CrossChainCore,\n ) {\n this._chain = chain;\n this._address = address;\n this._options = options;\n this._wallet = wallet;\n this._crossChainCore = crossChainCore;\n }\n\n chain(): C {\n return this._chain.displayName as C;\n }\n address(): string {\n return this._address;\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\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 );\n txHashes.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): Promise<string> => {\n if (!wallet) {\n throw new Error(\"wallet is undefined\");\n }\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 {\n throw new Error(`Unsupported chain: ${chain}`);\n }\n};\n","import { ChainId } from \"@wormhole-foundation/sdk\";\nimport { Chain } from \"../CrossChainCore\";\n\nexport enum Context {\n ETH = \"Ethereum\",\n SOLANA = \"Solana\",\n APTOS = \"Aptos\",\n}\n\nexport type BaseChainConfig = {\n key: Chain;\n id: ChainId;\n context: Context;\n finalityThreshold: number;\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 gasToken: string;\n wrappedGasToken?: string;\n chainId: number | string;\n icon: Chain;\n maxBlockSearch: number;\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 } from \"../types\";\n\nimport { ChainsConfig } from \"../types\";\n\nexport const testnetChains: ChainsConfig = {\n Sepolia: {\n key: \"Sepolia\",\n id: 10002,\n context: Context.ETH,\n finalityThreshold: 0,\n displayName: \"Sepolia\",\n explorerUrl: \"https://sepolia.etherscan.io/\",\n explorerName: \"Etherscan\",\n gasToken: \"ETHsepolia\",\n chainId: 11155111,\n icon: \"Ethereum\",\n maxBlockSearch: 2000,\n symbol: \"ETH\",\n defaultRpc: \"https://eth-sepolia.public.blastapi.io\",\n wrappedGasToken: \"0xeef12A83EE5b7161D3873317c8E0E7B76e0B5D9c\",\n },\n Solana: {\n key: \"Solana\",\n id: 1,\n context: Context.SOLANA,\n finalityThreshold: 32,\n displayName: \"Solana\",\n explorerUrl: \"https://explorer.solana.com/\",\n explorerName: \"Solana Explorer\",\n gasToken: \"SOL\",\n chainId: 0,\n icon: \"Solana\",\n maxBlockSearch: 2000,\n symbol: \"SOL\",\n defaultRpc: \"https://api.devnet.solana.com\",\n wrappedGasToken: \"So11111111111111111111111111111111111111112\",\n },\n // Sui: {\n // key: \"Sui\",\n // id: 21,\n // context: Context.SUI,\n // finalityThreshold: 0,\n // displayName: \"Sui\",\n // explorerUrl: \"https://suiscan.xyz/testnet/\",\n // explorerName: \"Suiscan\",\n // gasToken: \"SUI\",\n // chainId: 0,\n // icon: \"Sui\",\n // maxBlockSearch: 0,\n // symbol: \"SUI\",\n // sdkName: \"Sui\",\n // },\n};\n\nexport const AptosTestnetChain = {\n key: \"Aptos\",\n id: 22,\n context: Context.APTOS,\n finalityThreshold: 0,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com?network=testnet\",\n explorerName: \"Aptos Explorer\",\n gasToken: \"APT\",\n chainId: 0,\n icon: \"Aptos\",\n maxBlockSearch: 0,\n symbol: \"APT\",\n sdkName: \"Aptos\",\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 // 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\nexport const AptosTestnetUSDCToken: TokenConfig = {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0x69091fbab5f7d635ee7ac5098cf0c1efbe31d68fec0f2cd565e8d168daf52832\",\n },\n icon: \"USDC\",\n};\n","import { Context, ChainsConfig } from \"../types\";\n\nexport const mainnetChains: ChainsConfig = {\n Ethereum: {\n key: \"Ethereum\",\n id: 2,\n context: Context.ETH,\n finalityThreshold: 64,\n displayName: \"Ethereum\",\n explorerUrl: \"https://etherscan.io/\",\n explorerName: \"Etherscan\",\n gasToken: \"ETH\",\n chainId: 1,\n icon: \"Ethereum\",\n maxBlockSearch: 2000,\n symbol: \"ETH\",\n defaultRpc: \"https://rpc.ankr.com/eth\",\n },\n Solana: {\n key: \"Solana\",\n id: 1,\n context: Context.SOLANA,\n finalityThreshold: 32,\n displayName: \"Solana\",\n explorerUrl: \"https://explorer.solana.com/\",\n explorerName: \"Solana Explorer\",\n gasToken: \"SOL\",\n chainId: 0,\n icon: \"Solana\",\n maxBlockSearch: 2000,\n symbol: \"SOL\",\n defaultRpc: \"https://solana-mainnet.rpc.extrnode.com\",\n },\n // Sui: {\n // key: \"Sui\",\n // id: 21,\n // context: Context.SUI,\n // finalityThreshold: 0,\n // displayName: \"Sui\",\n // sdkName: \"Sui\",\n // explorerUrl: \"https://suiscan.xyz/\",\n // explorerName: \"Suiscan\",\n // gasToken: \"SUI\",\n // chainId: 0,\n // icon: \"Sui\",\n // maxBlockSearch: 0,\n // symbol: \"SUI\",\n // },\n};\n\nexport const AptosMainnetChain = {\n key: \"Aptos\",\n id: 22,\n context: \"Aptos\",\n finalityThreshold: 0,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com/\",\n explorerName: \"Aptos Explorer\",\n gasToken: \"APT\",\n chainId: 0,\n icon: \"Aptos\",\n maxBlockSearch: 0,\n symbol: \"APT\",\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 // 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\nexport const AptosMainnetUSDCToken: TokenConfig = {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n },\n icon: \"USDC\",\n decimals: 6,\n};\n","import { Aptos, AptosConfig, Network } from \"@aptos-labs/ts-sdk\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport {\n AptosMainnetUSDCToken,\n AptosTestnetUSDCToken,\n mainnetTokens,\n testnetTokens,\n} from \"../config\";\nimport { ethers, JsonRpcProvider } from \"ethers\";\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 // Check to see if we were passed wallet address or token account\n const splToken = await connection.getTokenAccountsByOwner(address, {\n mint: new PublicKey(tokenAddress),\n });\n\n // Use the first token account if it exists, otherwise fall back to wallet address\n const checkAddress =\n splToken.value.length > 0 ? splToken.value[0]!.pubkey : address;\n\n const balance = await connection.getTokenAccountBalance(checkAddress);\n\n return (\n balance.value.uiAmountString ??\n (Number(balance.value.amount) / 10 ** balance.value.decimals).toString()\n );\n};\n\nexport const getEthereumWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n rpc: string,\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Ethereum\"]\n : testnetTokens[\"Sepolia\"];\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 ? AptosMainnetUSDCToken\n : AptosTestnetUSDCToken;\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 const balance = (\n Number(response[0].amount) /\n 10 ** token.decimals\n ).toString();\n return balance;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,IAAAA,iBAAiC;;;ACAjC,iBAQO;AACP,IAAAC,iBAA+B;AAC/B,mBAAkB;AAClB,oBAAmB;AACnB,iBAAgB;;;ACZT,IAAM,SAAS;AAAA,EACpB,KAAK,IAAI,SAAgB;AACvB,QAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,cAAQ,IAAI,GAAG,IAAI;AAAA,IACrB;AAAA,EACF;AAAA,EACA,MAAM,IAAI,SAAgB;AACxB,QAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,cAAQ,KAAK,GAAG,IAAI;AAAA,IACtB;AAAA,EACF;AAAA,EACA,OAAO,IAAI,SAAgB;AACzB,QAAI,QAAQ,IAAI,aAAa,eAAe;AAC1C,cAAQ,MAAM,GAAG,IAAI;AAAA,IACvB;AAAA,EACF;AACF;;;AChBA,oBAOO;AAeA,IAAM,mBAAN,MAEP;AAAA,EAOE,YACE,OACA,SACA,QACA,iBACA;AACA,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,kBAAkB;AACvB,SAAK,4BAA4B;AAAA,EACnC;AAAA,EAEA,QAAW;AACT,WAAO,KAAK;AAAA,EACd;AAAA,EACA,UAAkB;AAChB,WAAO,KAAK,QAAQ,eAAe,SAAS;AAAA,EAC9C;AAAA,EAEA,2BAAmC;AACjC,WAAO,KAAK;AAAA,EACd;AAAA;AAAA,EAGA,MAAM,YAAY,KAAqD;AACrE,UAAM,WAAqB,CAAC;AAE5B,eAAW,MAAM,KAAK;AACpB,YAAM,OAAO,MAAM;AAAA,QACjB;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AACA,eAAS,KAAK,IAAI;AAClB,WAAK,4BAA4B;AAAA,IACnC;AACA,WAAO;AAAA,EACT;AACF;AAEA,eAAsB,uBACpB,SACA,QACA,gBACA;AACA,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAEA,QAAM,UAAU,QAAQ;AAExB,UAAQ,oBAAoB,QAAQ,kBAAkB,IAAI,CAAC,MAAW;AACpE,QAAI,aAAa,YAAY;AAC3B,aAAO,MAAM,KAAK,CAAC;AAAA,IACrB,WAAW,OAAO,MAAM,UAAU;AAChC,aAAO,EAAE,SAAS;AAAA,IACpB,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,CAAC;AAED,QAAM,cAAc,IAAI,0BAAY;AAAA,IAClC,SAAS,cAAAC,QAAa;AAAA,EACxB,CAAC;AACD,QAAMC,SAAQ,IAAI,oBAAM,WAAW;AAEnC,QAAM,YAAY,MAAMA,OAAM,YAAY,MAAM,OAAO;AAAA,IACrD,MAAM;AAAA,IACN,QAAQ,OAAO,eAAe,SAAS;AAAA,IACvC,cAAc,iBAAiB,OAAO;AAAA,EACxC,CAAC;AACD,QAAM,sBAAsB,MAAMA,OAAM,YAAY,KAAK;AAAA,IACvD,QAAQ;AAAA,IACR,aAAa;AAAA,EACf,CAAC;AAED,QAAM,cAIF;AAAA,IACF,aAAa;AAAA,IACb;AAAA,EACF;AAEA,MAAI,gBAAgB;AAClB,QAAI,OAAO,mBAAmB,UAAU;AAAA,IAExC,OAAO;AACL,YAAM,8BAA8BA,OAAM,YAAY,eAAe;AAAA,QACnE,QAAQ;AAAA,QACR,aAAa;AAAA,MACf,CAAC;AACD,kBAAY,wBAAwB;AAAA,IACtC;AAAA,EACF;AACA,QAAM,WAAW,MAAMA,OAAM,YAAY,OAAO,OAAO,WAAW;AAElE,QAAM,KAAK,MAAMA,OAAM,mBAAmB;AAAA,IACxC,iBAAiB,SAAS;AAAA,EAC5B,CAAC;AAED,SAAO,GAAG;AACZ;;;ACpIA,kBAUO;AAIP,wBAIO;AAEP,IAAAC,eAA2B;AAI3B,mCAAoC;AAKpC,eAAsBC,wBACpB,SACA,QACA,SACA,gBACA;AACA,MAAI,CAAC,UAAU,EAAE,kBAAkB,mDAAsB;AACvD,UAAM,IAAI,MAAM,8CAA8C,EAAE;AAAA,EAClE;AAEA,QAAM,aAAa,SAAS,cAAc;AAE1C,QAAM,aAAa,IAAI;AAAA,IACrB,gBAAgB,aAAa,cAAc,OACzC;AAAA,EACJ;AACA,QAAM,EAAE,WAAW,qBAAqB,IACtC,MAAM,WAAW,mBAAmB,UAAU;AAIhD,QAAM,cAAc,QAAQ,YAAY;AAKxC,QAAM,aAAa,MAAM;AAAA,IACvB;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAEA,MAAI,4BAEO;AACX,MAAI,cAA6D;AACjE,MAAI,iBAAiB;AACrB,MAAI,YAAY;AAOhB,MAAI,CAAC,OAAO,aAAa,iBAAiB;AACxC,UAAM,IAAI,MAAM,8CAA8C,EAAE;AAAA,EAClE;AAEA,QAAM,KAAK,MAAM,OAAO,aAAa,gBAAgB,UAAU;AAE/D,MAAI,CAAC,GAAI,OAAM,IAAI,MAAM,4BAA4B,EAAE;AACvD,QAAM,eAAe,GAAG,UAAU;AAClC,QAAM,cAAc;AAAA,IAClB,eAAe;AAAA,IACf,YAAY;AAAA,IACZ,qBAAqB;AAAA;AAAA,EACvB;AACA,cAAY,MAAM,WAAW,mBAAmB,cAAc,WAAW;AACzE,8BAA4B,WAAW;AAAA,IACrC;AAAA,MACE;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,IACA;AAAA,EACF;AAKA,QAAM,kBAAkB;AACxB,SAAO,CAAC,aAAa;AACnB,kBAAc,MAAM,QAAQ,KAAK;AAAA,MAC/B;AAAA,MACA,IAAI;AAAA,QAAc,CAAC,YACjB,WAAW,MAAM;AACf,kBAAQ,IAAI;AAAA,QACd,GAAG,eAAe;AAAA,MACpB;AAAA,IACF,CAAC;AACD,QAAI,aAAa;AACf;AAAA,IACF;AACA,YAAQ;AAAA,MACN,0BACE,kBAAkB,gBACpB;AAAA,IACF;AACA,QAAI;AACF,YAAM,WAAW,mBAAmB,cAAc,WAAW;AAAA,IAC/D,SAAS,GAAG;AACV,cAAQ,MAAM,iCAAiC,CAAC;AAAA,IAClD;AAAA,EACF;AAEA,MAAI,YAAY,MAAM,KAAK;AACzB,QAAI,eAAe,uBAAuB,YAAY,MAAM,GAAG;AAC/D,QAAI,OAAO,YAAY,MAAM,QAAQ,UAAU;AAC7C,UAAI;AACF,uBAAe,uBAAuB,KAAK;AAAA,UACzC,YAAY,MAAM;AAAA,UAClB,CAAC,MAAM,UACL,OAAO,UAAU,WAAW,MAAM,SAAS,IAAI;AAAA;AAAA,QACnD,CAAC;AAAA,MACH,SAAS,GAAY;AAInB,uBAAe;AAAA,MACjB;AAAA,IACF;AACA,UAAM,IAAI,MAAM,uBAAuB,YAAY,EAAE,EAAE;AAAA,EACzD;AAEA,SAAO;AACT;AAEA,eAAsB,2BACpB,YACA,WACA,sBACA,SACA,gBAC6C;AAC7C,QAAM,aAAa,QAAQ,YAAY;AAEvC,QAAM,wBAAwB,CAAC,OAC7B,GAAG,UAAU,SAAS,MAAM;AAE9B,aAAW,kBAAkB;AAC7B,aAAW,uBAAuB;AAGlC,aAAW,eAAe,WAAW,aAAa;AAAA,IAChD;AAAA,EACF;AACA,aAAW;AAAA,IACT,GAAI,MAAM;AAAA,MACR;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,MAAI,QAAQ,YAAY,SAAS;AAC/B,eAAW,YAAY,GAAG,QAAQ,YAAY,OAAO;AAAA,EACvD;AAEA,SAAO;AACT;AAGA,eAAe,8BACb,YACA,aACA,gBACA;AACA,MAAI,YAAY;AAChB,MAAI,qBAAqB;AAEzB,iBAAgB,QAAO,MAAM;AAC3B,UAAM,WAAW,MAAM,WAAW;AAAA,MAChC;AAAA,IACF;AAEA,QAAI,SAAS,MAAM,KAAK;AACtB,UAAI,0BAA0B,SAAS,KAAK,GAAG;AAE7C,YAAI,qBAAqB,GAAG;AAC1B;AACA,gBAAM,MAAM,GAAI;AAChB,mBAAS;AAAA,QACX;AAAA,MACF,WAAW,qBAAqB,GAAG;AAEjC;AACA,cAAM,MAAM,GAAI;AAChB,iBAAS;AAAA,MACX;AAIA,YAAM,IAAI;AAAA,QACR,sBAAsB,KAAK,UAAU,SAAS,MAAM,GAAG,CAAC;AAAA;AAAA,GACtD,SAAS,MAAM,QAAQ,CAAC,GACxB,KAAK,MAAM,CAAC;AAAA,MAChB,EAAE;AAAA,IACJ,OAAO;AAEL,UAAI,SAAS,MAAM,eAAe;AAChC,oBAAY,SAAS,MAAM;AAAA,MAC7B;AACA;AAAA,IACF;AAAA,EACF;AAEA,QAAM,aAAa,KAAK,MAAM,YAAY,GAAG;AAE7C,QAAM,eAAyC,CAAC;AAChD,eAAa;AAAA,IACX,iCAAqB,oBAAoB;AAAA;AAAA,MAEvC,OAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,QAAM;AAAA,IACJ,aAAa;AAAA,IACb,qBAAqB;AAAA,IACrB,MAAM;AAAA,IACN,MAAM;AAAA,EACR,IAAI,gBAAgB,aAAa,cAAc,qBAAqB,CAAC;AAErE,QAAM,eAAe,OACnBC,iBAC2E;AAC3E,QAAIA,iBAAgB,UAAU;AAG5B,UAAI;AACF,cAAMC,OAAM,UAAM;AAAA,UAChB;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,UACA;AAAA,QACF;AAEA,eAAO;AAAA,UACL,KAAAA;AAAA,UACA,YAAY;AAAA,QACd;AAAA,MACF,SAAS,GAAG;AACV,gBAAQ,KAAK,sDAAsD,CAAC;AAAA,MACtE;AAAA,IACF;AAEA,QAAI;AAEF,YAAMA,OAAM,UAAM;AAAA,QAChB;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAEA,aAAO;AAAA,QACL,KAAAA;AAAA,QACA,YAAY;AAAA,MACd;AAAA,IACF,SAAS,GAAG;AACV,cAAQ,KAAK,sDAAsD,CAAC;AAEpE,aAAO;AAAA,QACL,KAAK;AAAA,QACL,YAAY;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAEA,QAAM,cAAc,qBAAqB,WAAW,WAAW;AAE/D,QAAM,EAAE,KAAK,WAAW,IAAI,MAAM,aAAa,WAAW;AAE1D,QAAM,cACH;AAAA,EAEC;AAAA,EAEA;AAAA,EAEF;AAEF,UAAQ,MAAM;AAAA,IACZ,gBAAgB;AAAA,IAChB,eAAe;AAAA,IACf,mBAAmB;AAAA,IACnB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,gBAAgB;AAAA,IAChB,kBAAkB;AAAA,EACpB,CAAC;AAED,eAAa;AAAA,IACX,iCAAqB,oBAAoB,EAAE,eAAe,IAAI,CAAC;AAAA,EACjE;AACA,SAAO;AACT;AAIA,SAAS,0BACP,UACS;AACT,QAAM,SAAS,CAAC;AAIhB,MAAI,SAAS,QAAQ,qBAAqB;AACxC,WAAO,mBAAmB,IACxB;AAAA,EACJ;AAGA,MAAI,SAAS,MAAM;AACjB,eAAW,QAAQ,SAAS,MAAM;AAGhC,UAAI,KAAK,SAAS,2BAA2B,GAAG;AAC9C,eAAO,2BAA2B,IAChC;AAAA,MACJ;AAIA,UAAI,KAAK,SAAS,oBAAoB,GAAG;AACvC,eAAO,oBAAoB,IACzB;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,MAAM,GAAG;AACzB,WAAO;AAAA,EACT;AAEA,UAAQ,MAAM,MAAM;AACpB,SAAO;AACT;AAEA,eAAsB,MAAM,SAAiB;AAC3C,SAAO,IAAI,QAAQ,CAAC,YAAY,WAAW,SAAS,OAAO,CAAC;AAC9D;AAiBO,IAAM,gBAAgB,CAAC,UAAqC;AACjE,MAAI,UAAU,QAAQ,UAAU,QAAW;AACzC,WAAO;AAAA,EACT;AAGA,aAAW,OAAO,OAAO;AACvB,QAAI,MAAM,eAAe,KAAK,OAAO,GAAG,GAAG;AACzC,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,UAAqC;AACjE,MAAI;AACF,UAAM,MAAM,IAAI,IAAI,QAAQ;AAC5B,UAAM,WAAW,IAAI;AACrB,QAAI,aAAa,eAAe;AAC9B,aAAO;AAAA,IACT,WAAW,aAAa,kBAAkB;AACxC,aAAO;AAAA,IACT,WAAW,aAAa,gBAAgB;AACtC,aAAO;AAAA,IACT,OAAO;AACL,aAAO;AAAA,IACT;AAAA,EACF,SAAS,GAAG;AACV,WAAO;AAAA,EACT;AACF;;;AC5ZA,oBAAkC;AAGlC,eAAsBC,wBACpB,SACA,QACA,WACA,SACiB;AACjB,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,qCAAqC,EAAE;AAAA,EACzD;AAEA,QAAM,UAAU,MACd,OACA,gBAAgB,QAAQ;AAAA,IACxB,QAAQ;AAAA,EACV,CAAC;AACD,QAAM,gBAAgB,SAAS,SAAS,EAAE;AAE1C,MAAI,CAAC;AACH,UAAM,IAAI,MAAM,8BAA8B,SAAS,EAAE;AAC3D,QAAM,kBAAkB,QAAQ,YAAY,cACxC,yBAAU,QAAQ,YAAY,OAAO,IACrC;AACJ,MACE,CAAC,iBACD,CAAC,mBACD,OAAO,aAAa,MAAM,iBAC1B;AACA,UAAM,IAAI;AAAA,MACR,wDAAwD,eAAe,SAAS,aAAa;AAAA,IAC/F,EAAE;AAAA,EACJ;AAEA,QAAM,WAAW,IAAI,qBAAO;AAAA,IACzB,OAAgC;AAAA,EACnC;AACA,QAAM,SAAS,MAAM,SAAS,UAAU;AACxC,QAAM,WAAW,MAAM,OAAO,gBAAgB,QAAQ,WAAW;AACjE,QAAM,UAAU,MAAM,SAAS,KAAK;AAEpC,SAAO,SAAS,QAAQ;AAC1B;;;ACxBO,IAAM,SAAN,MAEP;AAAA,EAOE,YACE,OACA,SACA,SACA,QACA,gBACA;AACA,SAAK,SAAS;AACd,SAAK,WAAW;AAChB,SAAK,WAAW;AAChB,SAAK,UAAU;AACf,SAAK,kBAAkB;AAAA,EACzB;AAAA,EAEA,QAAW;AACT,WAAO,KAAK,OAAO;AAAA,EACrB;AAAA,EACA,UAAkB;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,YAAY,KAAqD;AACrE,UAAM,WAAqB,CAAC;AAE5B,eAAW,MAAM,KAAK;AACpB,YAAM,OAAO,MAAMC;AAAA,QACjB,KAAK;AAAA,QACL;AAAA,QACA,KAAK;AAAA,QACL,KAAK;AAAA,QACL,KAAK;AAAA,MACP;AACA,eAAS,KAAK,IAAI;AAAA,IACpB;AACA,WAAO;AAAA,EACT;AACF;AAEO,IAAMA,0BAAyB,OACpC,OACA,SACA,QACA,UAAe,CAAC,GAChB,mBACoB;AACpB,MAAI,CAAC,QAAQ;AACX,UAAM,IAAI,MAAM,qBAAqB;AAAA,EACvC;AAEA,MAAI,MAAM,YAAY,UAAU;AAC9B,UAAM,YAAY,MAAmBA;AAAA,MACnC;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AACA,WAAO;AAAA,EACT,WAAW,MAAM,YAAY,YAAY;AACvC,UAAM,KAAK,MAAqBA;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,MAAM;AAAA,MACN;AAAA,IACF;AACA,WAAO;AAAA,EACT,OAAO;AACL,UAAM,IAAI,MAAM,sBAAsB,KAAK,EAAE;AAAA,EAC/C;AACF;;;ALhEO,IAAM,mBAAN,MAQP;AAAA,EASE,YAAY,MAAsB;AAChC,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAEA,IAAI,kBAA+D;AACjE,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,MAAM,mBAAmB,aAAoB;AAC3C,UAAM,cAAc,KAAK,eAAe,aAAa;AACrD,QAAI,gBAAgB,uBAAQ,QAAQ;AAClC,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AACA,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,2BAA2B;AAAA,IAC7C;AACA,UAAM,YAAY,gBAAgB,uBAAQ;AAC1C,UAAM,YAAmC,CAAC,aAAAC,SAAO,cAAAC,SAAQ,WAAAC,OAAG;AAC5D,UAAM,KAAK,UAAM,qBAAS,YAAY,YAAY,WAAW,SAAS;AACtE,SAAK,mBAAmB;AAAA,EAC1B;AAAA,EAEA,MAAM,SAAS,aAGZ;AACD,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,IAAI,MAAM,kCAAkC;AAAA,IACpD;AAEA,UAAM,EAAE,aAAa,UAAU,IAAI,KAAK,aAAa,WAAW;AAEhE,UAAM,gBAAgB,KAAK,iBACxB,gBAAY,4BAAgB,WAAW,CAAC,EACxC,SAAS,WAAW;AAEvB,WAAO,IAAI,iBAAiB,aAAa;AAEzC,UAAM,cAAc,KAAK,iBACtB,gBAAY,4BAAgB,OAAO,CAAC,EACpC,SAAS,OAAO;AAEnB,WAAO,IAAI,eAAe,WAAW;AAErC,UAAM,UAAU,MAAM,kBAAO,qBAAqB;AAAA,MAChD,KAAK;AAAA,MACL;AAAA,QACE,QAAQ;AAAA,QACR,aAAa;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAEA,UAAM,WAAW,KAAK,iBAAiB,SAAS;AAAA,MAC9C,kBAAO;AAAA;AAAA,IACT,CAAC;AAED,UAAM,QAAQ,MAAM,SAAS,WAAW,OAAO;AAC/C,UAAM,YAAY,MAAM,CAAC;AAEzB,SAAK,gBAAgB;AACrB,SAAK,kBAAkB;AAEvB,WAAO,EAAE,OAAO,WAAW,QAAQ;AAAA,EACrC;AAAA,EAEA,MAAM,SAAS,OAA6D;AAC1E,UAAM,EAAE,QAAQ,YAAY,IAAI;AAEhC,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,KAAK,mBAAmB,WAAW;AAAA,IAC3C;AAEA,UAAM,EAAE,OAAO,QAAQ,IAAI,MAAM,KAAK,SAAS,WAAW;AAG1D,UAAM,iBAAiB;AAAA,MACrB;AAAA,MACA,SAAS,EAAE,WAAW,EAAE;AAAA,IAC1B;AAEA,UAAM,YAAY,MAAM,MAAM,SAAS,SAAS,cAAc;AAC9D,QAAI,CAAC,UAAU,OAAO;AACpB,aAAO,IAAI,WAAW,UAAU,KAAK;AACrC,YAAM,IAAI,MAAM,kBAAkB,UAAU,KAAK,EAAE,EAAE;AAAA,IACvD;AACA,UAAM,QAAQ,MAAM,MAAM,MAAM,SAAS,UAAU,MAAM;AACzD,QAAI,CAAC,MAAM,SAAS;AAClB,aAAO,IAAI,gBAAgB,MAAM,OAAO;AACxC,YAAM,IAAI,MAAM,kBAAkB,MAAM,KAAK,EAAE,EAAE;AAAA,IACnD;AACA,SAAK,gBAAgB;AACrB,WAAO,IAAI,SAAS,KAAK;AACzB,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,mBACJ,OACwC;AACxC,UAAM,EAAE,aAAa,QAAQ,mBAAmB,IAAI;AAEpD,QAAI,CAAC,KAAK,kBAAkB;AAC1B,YAAM,KAAK,mBAAmB,WAAW;AAAA,IAC3C;AACA,QAAI,CAAC,KAAK,iBAAiB,CAAC,KAAK,mBAAmB,CAAC,KAAK,eAAe;AACvE,YAAM,IAAI,MAAM,mDAAmD;AAAA,IACrE;AAEA,QAAI;AAEJ,UAAM,eAAe,KAAK,eAAe,WAAW,EAAE;AAGtD,QAAI,iBAAiB,UAAU;AAC7B,sBACG,OAA+B,aAAa,WAAW,SAAS,KACjE;AAAA,IACJ,OAAO;AAEL,OAAC,aAAa,IAAI,MAChB,OACA,gBAAgB,QAAQ;AAAA,QACxB,QAAQ;AAAA,MACV,CAAC;AAAA,IACH;AACA,WAAO,IAAI,iBAAiB,aAAa;AAEzC,UAAM,SAAS,IAAI;AAAA,MACjB,KAAK,eAAe,WAAW;AAAA,MAC/B;AAAA,MACA,CAAC;AAAA,MACD;AAAA,IACF;AAEA,QAAI,UAAU,MAAM,KAAK,cAAc;AAAA,MACrC,KAAK;AAAA,MACL;AAAA,MACA,KAAK;AAAA,MACL,oBAAS,aAAa,SAAS,mBAAmB,SAAS,CAAC;AAAA,IAC9D;AAEA,UAAM,mBACJ,eAAe,UACX,QAAQ,UAAU,QAAQ,UAAU,SAAS,CAAC,EAAE,OAChD;AAEN,WAAO,EAAE,kBAAkB,oBAAoB,IAAI,QAAQ;AAAA,EAC7D;AAAA,EAEA,MAAM,kBACJ,OAC4C;AAC5C,QAAI,EAAE,SAAS,YAAY,eAAe,IAAI;AAC9C,QAAI,CAAC,KAAK,eAAe;AACvB,YAAM,IAAI,MAAM,gCAAgC;AAAA,IAClD;AAEA,WAAO,IAAI,cAAc,WAAW,eAAe,SAAS,CAAC;AAE7D,QAAI,UAAU;AACd,UAAM,aAAa;AACnB,UAAM,YAAY;AAElB,WAAO,UAAU,YAAY;AAC3B,UAAI;AACF,mBAAW,WAAW,KAAK,cAAc,MAAM,SAAS,MAAM,GAAI,GAAG;AACnE,cAAI,QAAQ,SAAS,yBAAc,iBAAiB;AAClD,mBAAO,IAAI,wBAAwB,OAAO;AAE1C,gBAAI;AACF,oBAAM,SAAS,IAAI;AAAA,gBACjB;AAAA,gBACA,CAAC;AAAA,gBACD;AAAA;AAAA,gBACA,iBAAiB,iBAAiB;AAAA;AAAA,cACpC;AAEA,kBAAI,kBAAO,SAAS,KAAK,aAAa,GAAG;AACvC,sBAAM,2BACJ,MAAM,KAAK,cAAc,SAAS,QAAQ,OAAO;AACnD,uBAAO,IAAI,mBAAmB,wBAAwB;AACtD,sBAAM,wBAAwB,OAAO,yBAAyB;AAC9D,uBAAO,EAAE,sBAAsB;AAAA,cACjC,OAAO;AAEL,uBAAO,EAAE,uBAAuB,GAAG;AAAA,cACrC;AAAA,YACF,SAAS,GAAG;AACV,sBAAQ,MAAM,mBAAmB,CAAC;AAClC,qBAAO,EAAE,uBAAuB,GAAG;AAAA,YACrC;AAAA,UACF;AAAA,QACF;AAAA,MACF,SAAS,GAAG;AACV,gBAAQ;AAAA,UACN,oCAAoC,UAAU,CAAC,MAAM,UAAU;AAAA,UAC/D;AAAA,QACF;AACA,cAAM,QAAQ,YAAY,KAAK,IAAI,GAAG,OAAO;AAC7C,kBAAM,sBAAM,KAAK;AACjB;AAAA,MACF;AAAA,IACF;AAEA,WAAO,EAAE,uBAAuB,GAAG;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,qBACJ,OAC2C;AAC3C,QAAI,KAAK,eAAe,aAAa,iBAAiB,uBAAQ,QAAQ;AACpE,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAGA,QAAI,MAAM,QAAQ;AAChB,YAAM,KAAK,SAAS;AAAA,QAClB,QAAQ,MAAM;AAAA,QACd,aAAa,MAAM;AAAA,MACrB,CAAC;AAAA,IACH;AAEA,QAAI,EAAE,kBAAkB,QAAQ,IAAI,MAAM,KAAK,mBAAmB,KAAK;AAEvE,UAAM,EAAE,sBAAsB,IAAI,MAAM,KAAK,kBAAkB;AAAA,MAC7D;AAAA,MACA,YAAY,MAAM;AAAA,MAClB,gBAAgB,MAAM;AAAA,IACxB,CAAC;AACD,WAAO,EAAE,kBAAkB,sBAAsB;AAAA,EACnD;AAAA,EAEA,eAAe,OAA2B;AACxC,UAAM,cACJ,KAAK,eAAe,OAClB,KACF;AACF,QAAI,CAAC,aAAa;AAChB,YAAM,IAAI,MAAM,qCAAqC,KAAK,EAAE;AAAA,IAC9D;AACA,WAAO;AAAA,EACT;AAAA,EAEA,aAAa,aAGX;AACA,UAAM,cAAuB,oBAAS;AAAA,MACpC,KAAK,eAAe,OAAO,WAAW,EAAE,QAAQ;AAAA,MAChD,KAAK,eAAe,OAAO,WAAW,EAAE,QAAQ;AAAA,IAClD;AAEA,UAAM,YAAqB,oBAAS;AAAA,MAClC,KAAK,eAAe,YAAY,QAAQ;AAAA,MACxC,KAAK,eAAe,YAAY,QAAQ;AAAA,IAC1C;AAEA,WAAO,EAAE,aAAa,UAAU;AAAA,EAClC;AACF;;;AM5TO,IAAK,UAAL,kBAAKC,aAAL;AACL,EAAAA,SAAA,SAAM;AACN,EAAAA,SAAA,YAAS;AACT,EAAAA,SAAA,WAAQ;AAHE,SAAAA;AAAA,GAAA;;;ACCL,IAAM,gBAA8B;AAAA,EACzC,SAAS;AAAA,IACP,KAAK;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AAAA,EACA,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,iBAAiB;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBF;AAEO,IAAM,oBAAoB;AAAA,EAC/B,KAAK;AAAA,EACL,IAAI;AAAA,EACJ;AAAA,EACA,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,QAAQ;AAAA,EACR,SAAS;AACX;;;AClEO,IAAM,gBAA6C;AAAA,EACxD,SAAS;AAAA,IACP,QAAQ;AAAA,IACR,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWF;AAEO,IAAM,wBAAqC;AAAA,EAChD,QAAQ;AAAA,EACR,UAAU;AAAA,EACV,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SACE;AAAA,EACJ;AAAA,EACA,MAAM;AACR;;;ACxCO,IAAM,gBAA8B;AAAA,EACzC,UAAU;AAAA,IACR,KAAK;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA,EACA,QAAQ;AAAA,IACN,KAAK;AAAA,IACL,IAAI;AAAA,IACJ;AAAA,IACA,mBAAmB;AAAA,IACnB,aAAa;AAAA,IACb,aAAa;AAAA,IACb,cAAc;AAAA,IACd,UAAU;AAAA,IACV,SAAS;AAAA,IACT,MAAM;AAAA,IACN,gBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,YAAY;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgBF;AAEO,IAAM,oBAAoB;AAAA,EAC/B,KAAK;AAAA,EACL,IAAI;AAAA,EACJ,SAAS;AAAA,EACT,mBAAmB;AAAA,EACnB,aAAa;AAAA,EACb,aAAa;AAAA,EACb,cAAc;AAAA,EACd,UAAU;AAAA,EACV,SAAS;AAAA,EACT,MAAM;AAAA,EACN,gBAAgB;AAAA,EAChB,QAAQ;AACV;;;AC7DO,IAAM,gBAA6C;AAAA,EACxD,UAAU;AAAA,IACR,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA,EACA,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,OAAO;AAAA,MACP,SAAS;AAAA,IACX;AAAA,IACA,MAAM;AAAA,IACN,UAAU;AAAA,EACZ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWF;AAEO,IAAM,wBAAqC;AAAA,EAChD,QAAQ;AAAA,EACR,SAAS;AAAA,IACP,OAAO;AAAA,IACP,SACE;AAAA,EACJ;AAAA,EACA,MAAM;AAAA,EACN,UAAU;AACZ;;;AC1CA,IAAAC,iBAA4C;AAC5C,IAAAC,eAAsC;AAOtC,IAAAC,iBAAwC;AAEjC,IAAM,6BAA6B,OACxC,eACA,cACA,QACoB;AACpB,QAAM,UAAU,IAAI,uBAAU,aAAa;AAC3C,QAAM,eACJ,iBAAiB,uBAAQ,UACrB,cAAc,QAAQ,EAAE,QAAQ,UAChC,cAAc,QAAQ,EAAE,QAAQ;AAEtC,QAAM,aAAa,IAAI,wBAAW,GAAG;AAErC,QAAM,WAAW,MAAM,WAAW,wBAAwB,SAAS;AAAA,IACjE,MAAM,IAAI,uBAAU,YAAY;AAAA,EAClC,CAAC;AAGD,QAAM,eACJ,SAAS,MAAM,SAAS,IAAI,SAAS,MAAM,CAAC,EAAG,SAAS;AAE1D,QAAM,UAAU,MAAM,WAAW,uBAAuB,YAAY;AAEpE,SACE,QAAQ,MAAM,mBACb,OAAO,QAAQ,MAAM,MAAM,IAAI,MAAM,QAAQ,MAAM,UAAU,SAAS;AAE3E;AAEO,IAAM,+BAA+B,OAC1C,eACA,cACA,QACoB;AACpB,QAAM,QACJ,iBAAiB,uBAAQ,UACrB,cAAc,UAAU,IACxB,cAAc,SAAS;AAE7B,QAAM,eAAe,MAAM,QAAQ;AACnC,QAAM,aAAa,IAAI,+BAAgB,GAAG;AAC1C,QAAM,MAAM,CAAC,0DAA0D;AACvE,QAAM,WAAW,IAAI,sBAAO,SAAS,cAAc,KAAK,UAAU;AAClE,QAAM,UAAU,MAAM,SAAS,UAAU,aAAa;AACtD,SAAO,sBAAO,YAAY,SAAS,MAAM,QAAQ,EAAE,SAAS;AAC9D;AAEO,IAAM,4BAA4B,OACvC,eACA,iBACoB;AACpB,QAAM,QACJ,iBAAiB,uBAAQ,UACrB,wBACA;AACN,QAAM,eAAe,MAAM,QAAQ;AACnC,QAAM,cAAc,IAAI,2BAAY,EAAE,SAAS,aAAa,CAAC;AAC7D,QAAM,aAAa,IAAI,qBAAM,WAAW;AACxC,QAAM,WAAW,MAAM,WAAW,gCAAgC;AAAA,IAChE,SAAS;AAAA,MACP,OAAO;AAAA,QACL,eAAe,EAAE,KAAK,cAAc;AAAA,QACpC,YAAY,EAAE,KAAK,aAAa;AAAA,MAClC;AAAA,IACF;AAAA,EACF,CAAC;AACD,QAAM,WACJ,OAAO,SAAS,CAAC,EAAE,MAAM,IACzB,MAAM,MAAM,UACZ,SAAS;AACX,SAAO;AACT;;;AZzCA,IAAAC,iBAAmD;AAmB5C,IAAM,iBAAN,MAAqB;AAAA,EAU1B,YAAY,MAA4C;AATxD,SAAS,cAAoC;AAAA,MAC3C,cAAc,uBAAQ;AAAA,IACxB;AAEA,SAAS,SAAuB;AAChC,SAAS,SAAsC;AAE/C,SAAS,cAA2B;AAGlC,SAAK,cAAc,KAAK;AACxB,QAAI,KAAK,YAAY,iBAAiB,uBAAQ,SAAS;AACrD,WAAK,SAAS;AACd,WAAK,SAAS;AACd,WAAK,cAAc;AAAA,IACrB,OAAO;AACL,WAAK,SAAS;AACd,WAAK,SAAS;AACd,WAAK,cAAc;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,YAAY,cAAiD;AAC3D,YAAQ,cAAc;AAAA,MACpB,KAAK;AACH,eAAO,IAAI,iBAAiB,IAAI;AAAA,MAMlC;AACE,cAAM,IAAI,MAAM,qBAAqB,YAAY,EAAE;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,MAAM,qBACJ,eACA,aACiB;AACjB,QAAI,gBAAgB,SAAS;AAC3B,aAAO,MAAM;AAAA,QACX;AAAA,QACA,KAAK,YAAY;AAAA,MACnB;AAAA,IACF;AACA,QAAI,CAAC,KAAK,OAAO,WAAW,GAAG;AAC7B,YAAM,IAAI,MAAM,sBAAsB,WAAW,EAAE;AAAA,IACrD;AACA,YAAQ,aAAa;AAAA,MACnB,KAAK;AACH,eAAO,MAAM;AAAA,UACX;AAAA,UACA,KAAK,YAAY;AAAA,UACjB,KAAK,aAAa,cAAc,OAC9B,KAAK,OAAO,WAAW,EAAE;AAAA,QAC7B;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,eAAO,MAAM;AAAA,UACX;AAAA,UACA,KAAK,YAAY;AAAA;AAAA,UAEjB,KAAK,OAAO,WAAW,EAAE;AAAA,QAC3B;AAAA,MACF;AACE,cAAM,IAAI,MAAM,sBAAsB,WAAW,EAAE;AAAA,IACvD;AAAA,EACF;AACF;;;AD7HA,IAAAC,iBAAwB;","names":["import_ts_sdk","import_ts_sdk","AptosNetwork","aptos","import_web3","signAndSendTransaction","rpcProvider","fee","signAndSendTransaction","signAndSendTransaction","aptos","solana","evm","Context","import_ts_sdk","import_web3","import_ethers","import_ts_sdk","import_ts_sdk"]}
|
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/CrossChainCore.ts","../src/providers/wormhole/wormhole.ts","../src/utils/logger.ts","../src/providers/wormhole/signers/AptosLocalSigner.ts","../src/providers/wormhole/signers/SolanaSigner.ts","../src/providers/wormhole/signers/EthereumSigner.ts","../src/providers/wormhole/signers/Signer.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","../src/index.ts"],"sourcesContent":["import { Account, Network } from \"@aptos-labs/ts-sdk\";\n\nimport {\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse,\n WormholeProvider,\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n} from \"./providers/wormhole\";\n\nimport {\n ChainsConfig,\n testnetChains,\n testnetTokens,\n mainnetChains,\n mainnetTokens,\n TokenConfig,\n AptosTestnetUSDCToken,\n AptosMainnetUSDCToken,\n} from \"./config\";\nimport {\n getAptosWalletUSDCBalance,\n getEthereumWalletUSDCBalance,\n getSolanaWalletUSDCBalance,\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}\nexport type { AccountAddressInput } from \"@aptos-labs/ts-sdk\";\nexport { NetworkToChainId, NetworkToNodeAPI } from \"@aptos-labs/ts-sdk\";\nexport type AptosAccount = Account;\n\nexport type Chain = \"Solana\" | \"Ethereum\" | \"Sepolia\" | \"Aptos\";\n\nexport type CCTPProviders = \"Wormhole\";\n\nexport interface CrossChainProvider<\n TQuoteRequest = any,\n TQuoteResponse = any,\n TInitiateTransferRequest = any,\n TInitiateTransferResponse = any,\n> {\n getQuote(params: TQuoteRequest): Promise<TQuoteResponse>;\n initiateCCTPTransfer(\n params: TInitiateTransferRequest\n ): Promise<TInitiateTransferResponse>;\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 readonly APTOS_TOKEN: TokenConfig = AptosTestnetUSDCToken;\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 this.APTOS_TOKEN = AptosMainnetUSDCToken;\n } else {\n this.CHAINS = testnetChains;\n this.TOKENS = testnetTokens;\n this.APTOS_TOKEN = AptosTestnetUSDCToken;\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 WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse\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 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 \"Sepolia\":\n return await getEthereumWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n // TODO: maybe let the user config it\n this.CHAINS[sourceChain].defaultRpc\n );\n default:\n throw new Error(`Unsupported chain: ${sourceChain}`);\n }\n }\n}\n","import {\n chainToPlatform,\n routes,\n TokenId,\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\";\n\nimport {\n Chain,\n CrossChainProvider,\n CrossChainCore,\n} from \"../../CrossChainCore\";\nimport { logger } from \"../../utils/logger\";\nimport { AptosLocalSigner } from \"./signers/AptosLocalSigner\";\nimport { Signer } from \"./signers/Signer\";\nimport { ChainConfig } from \"../../config\";\nimport {\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse,\n WormholeRouteResponse,\n WormholeRequest,\n WormholeSubmitTransferRequest,\n WormholeStartTransferResponse,\n WormholeClaimTransferRequest,\n} from \"./types\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\nimport { EIP1193DerivedWallet } from \"@aptos-labs/derived-wallet-ethereum\";\n\nexport class WormholeProvider\n implements\n CrossChainProvider<\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse\n >\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\n constructor(core: CrossChainCore) {\n this.crossChainCore = core;\n }\n\n get wormholeContext(): Wormhole<\"Mainnet\" | \"Testnet\"> | undefined {\n return this._wormholeContext;\n }\n\n 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];\n const wh = await wormhole(isMainnet ? \"Mainnet\" : \"Testnet\", platforms);\n this._wormholeContext = wh;\n }\n\n async getRoute(sourceChain: Chain): Promise<{\n route: WormholeRouteResponse;\n request: WormholeRequest;\n }> {\n if (!this._wormholeContext) {\n throw new Error(\"Wormhole context not initialized\");\n }\n\n const { sourceToken, destToken } = this.getTokenInfo(sourceChain);\n\n const sourceContext = this._wormholeContext\n .getPlatform(chainToPlatform(sourceChain))\n .getChain(sourceChain);\n\n logger.log(\"sourceContext\", sourceContext);\n\n const destContext = this._wormholeContext\n .getPlatform(chainToPlatform(\"Aptos\"))\n .getChain(\"Aptos\");\n\n logger.log(\"destContext\", destContext);\n\n const request = await routes.RouteTransferRequest.create(\n this._wormholeContext,\n {\n source: sourceToken,\n destination: destToken,\n },\n sourceContext,\n destContext\n );\n\n const resolver = this._wormholeContext.resolver([\n routes.CCTPRoute, // manual CCTP\n ]);\n\n const route = await resolver.findRoutes(request);\n const cctpRoute = route[0];\n\n this.wormholeRoute = cctpRoute;\n this.wormholeRequest = request;\n\n return { route: cctpRoute, request };\n }\n\n async getQuote(input: WormholeQuoteRequest): Promise<WormholeQuoteResponse> {\n const { amount, sourceChain } = input;\n\n if (!this._wormholeContext) {\n await this.setWormholeContext(sourceChain);\n }\n\n const { route, request } = await this.getRoute(sourceChain);\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}`).message;\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}`).message;\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 {\n // is Ethereum\n [signerAddress] = await (\n wallet as EIP1193DerivedWallet\n ).eip1193Provider.request({\n method: \"eth_requestAccounts\",\n });\n }\n logger.log(\"signerAddress\", signerAddress);\n\n const signer = new Signer(\n this.getChainConfig(sourceChain),\n signerAddress,\n {},\n wallet\n );\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 ? sponsorAccount : undefined // the fee payer account\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 initiateCCTPTransfer(\n input: WormholeInitiateTransferRequest\n ): Promise<WormholeInitiateTransferResponse> {\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 sourceChain: input.sourceChain,\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 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 getTokenInfo(sourceChain: Chain): {\n sourceToken: TokenId;\n destToken: TokenId;\n } {\n const sourceToken: TokenId = Wormhole.tokenId(\n this.crossChainCore.TOKENS[sourceChain].tokenId.chain as Chain,\n this.crossChainCore.TOKENS[sourceChain].tokenId.address\n );\n\n const destToken: TokenId = Wormhole.tokenId(\n this.crossChainCore.APTOS_TOKEN.tokenId.chain as Chain,\n this.crossChainCore.APTOS_TOKEN.tokenId.address\n );\n\n return { sourceToken, destToken };\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 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\";\n\nexport class AptosLocalSigner<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n _chain: C;\n _options: any;\n _wallet: Account;\n _sponsorAccount: Account | GasStationApiKey | undefined;\n _claimedTransactionHashes: string;\n\n constructor(\n chain: C,\n options: any,\n wallet: Account,\n feePayerAccount: Account | GasStationApiKey | undefined\n ) {\n this._chain = chain;\n this._options = options;\n this._wallet = wallet;\n this._sponsorAccount = feePayerAccount;\n this._claimedTransactionHashes = \"\";\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;\n }\n /* other methods... */\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\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 );\n txHashes.push(txId);\n this._claimedTransactionHashes = 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) {\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: AptosNetwork.TESTNET,\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 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 if (typeof sponsorAccount === \"string\") {\n // TODO: handle gas station integration here\n } else {\n const feePayerSignerAuthenticator = aptos.transaction.signAsFeePayer({\n signer: sponsorAccount as Account,\n transaction: txnToSign,\n });\n txnToSubmit.feePayerAuthenticator = feePayerSignerAuthenticator;\n }\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","// 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\nimport {\n AddressLookupTableAccount,\n Commitment,\n ComputeBudgetProgram,\n ConfirmOptions,\n LAMPORTS_PER_SOL,\n SimulatedTransactionResponse,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { Transaction } from \"@solana/web3.js\";\nimport { RpcResponseAndContext, SignatureResult } from \"@solana/web3.js\";\nimport {\n determinePriorityFee,\n determinePriorityFeeTritonOne,\n SolanaUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-solana\";\n\nimport { Connection } from \"@solana/web3.js\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\n\nexport type SolanaRpcProvider = \"triton\" | \"helius\" | \"ankr\" | \"unknown\";\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\").message;\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 \"https://api.devnet.solana.com\"\n );\n const { blockhash, lastValidBlockHeight } =\n await connection.getLatestBlockhash(commitment);\n\n // Circle Manual CCTP on Wormhole is always of a Trnasaction type\n // https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/f7d992e04f844edcc4128659f12f75ade3553717/platforms/solana/protocols/cctp/src/circleBridge.ts#L173\n const transaction = request.transaction.transaction as Transaction;\n\n /**\n * TODO: Priority Fee is supported, but needs to come from dapp config\n */\n const unsignedTx = await setPriorityFeeInstructions(\n connection,\n blockhash,\n lastValidBlockHeight,\n request,\n crossChainCore\n );\n\n let confirmTransactionPromise: Promise<\n RpcResponseAndContext<SignatureResult>\n > | null = null;\n let confirmedTx: RpcResponseAndContext<SignatureResult> | null = null;\n let txSendAttempts = 1;\n let signature = \"\";\n\n // transaction.recentBlockhash = blockhash;\n // if (request.transaction.signers) {\n // transaction.partialSign(...request.transaction.signers);\n // }\n\n if (!wallet.solanaWallet.signTransaction) {\n throw new Error(\"Wallet does not support signing transactions\").message;\n }\n\n const tx = await wallet.solanaWallet.signTransaction(unsignedTx);\n\n if (!tx) throw new Error(\"Failed to sign transaction\").message;\n const serializedTx = tx.serialize();\n const sendOptions = {\n skipPreflight: true,\n maxRetries: 0,\n preFlightCommitment: commitment, // See PR and linked issue for why setting this matters: https://github.com/anza-xyz/agave/pull/483\n };\n signature = await connection.sendRawTransaction(serializedTx, sendOptions);\n confirmTransactionPromise = connection.confirmTransaction(\n {\n signature,\n blockhash,\n lastValidBlockHeight,\n },\n commitment\n );\n\n // This loop will break once the transaction has been confirmed or the block height is exceeded.\n // An exception will be thrown if the block height is exceeded by the confirmTransactionPromise.\n // The transaction will be resent if it hasn't been confirmed after the interval.\n const txRetryInterval = 5000;\n while (!confirmedTx) {\n confirmedTx = await Promise.race([\n confirmTransactionPromise,\n new Promise<null>((resolve) =>\n setTimeout(() => {\n resolve(null);\n }, txRetryInterval)\n ),\n ]);\n if (confirmedTx) {\n break;\n }\n console.log(\n `Tx not confirmed after ${\n txRetryInterval * txSendAttempts++\n }ms, resending`\n );\n try {\n await connection.sendRawTransaction(serializedTx, sendOptions);\n } catch (e) {\n console.error(\"Failed to resend transaction:\", e);\n }\n }\n\n if (confirmedTx.value.err) {\n let errorMessage = `Transaction failed: ${confirmedTx.value.err}`;\n if (typeof confirmedTx.value.err === \"object\") {\n try {\n errorMessage = `Transaction failed: ${JSON.stringify(\n confirmedTx.value.err,\n (_key, value) =>\n typeof value === \"bigint\" ? value.toString() : value // Handle bigint props\n )}`;\n } catch (e: unknown) {\n // Most likely a circular reference error, we can't stringify this error object.\n // See for more details:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#exceptions\n errorMessage = `Transaction failed: Unknown error`;\n }\n }\n throw new Error(`Transaction failed: ${errorMessage}`).message;\n }\n\n return signature;\n}\n\nexport async function setPriorityFeeInstructions(\n connection: Connection,\n blockhash: string,\n lastValidBlockHeight: number,\n request: SolanaUnsignedTransaction<Network>,\n crossChainCore?: CrossChainCore\n): Promise<Transaction | VersionedTransaction> {\n const unsignedTx = request.transaction.transaction as Transaction;\n\n const computeBudgetIxFilter = (ix: TransactionInstruction) =>\n ix.programId.toString() !== \"ComputeBudget111111111111111111111111111111\";\n\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Remove existing compute budget instructions if they were added by the SDK\n unsignedTx.instructions = unsignedTx.instructions.filter(\n computeBudgetIxFilter\n );\n unsignedTx.add(\n ...(await createPriorityFeeInstructions(\n connection,\n unsignedTx,\n crossChainCore\n ))\n );\n if (request.transaction.signers) {\n unsignedTx.partialSign(...request.transaction.signers);\n }\n\n return unsignedTx;\n}\n\n// This will throw if the simulation fails\nasync function createPriorityFeeInstructions(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n crossChainCore?: CrossChainCore\n) {\n let unitsUsed = 200_000;\n let simulationAttempts = 0;\n\n simulationLoop: while (true) {\n const response = await connection.simulateTransaction(\n transaction as Transaction\n );\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 for both known and unknown errors\n // We should throw in that case\n throw new Error(\n `Simulation failed: ${JSON.stringify(response.value.err)}\\nLogs:\\n${(\n response.value.logs || []\n ).join(\"\\n \")}`\n ).message;\n } else {\n // Simulation was successful\n if (response.value.unitsConsumed) {\n unitsUsed = response.value.unitsConsumed;\n }\n break;\n }\n }\n\n const unitBudget = Math.floor(unitsUsed * 1.2); // Budget in 20% headroom\n\n const instructions: TransactionInstruction[] = [];\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n // Set compute budget to 120% of the units used in the simulated transaction\n units: unitBudget,\n })\n );\n\n const {\n percentile = 0.9,\n percentileMultiple = 1,\n min = 100_000,\n max = 100_000_000,\n } = crossChainCore?._dappConfig?.solanaConfig?.priorityFeeConfig ?? {};\n\n const calculateFee = async (\n rpcProvider?: SolanaRpcProvider\n ): Promise<{ fee: number; methodUsed: \"triton\" | \"default\" | \"minimum\" }> => {\n if (rpcProvider === \"triton\") {\n // Triton has an experimental RPC method that accepts a percentile paramater\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 {\n fee,\n methodUsed: \"triton\",\n };\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 {\n fee,\n methodUsed: \"default\",\n };\n } catch (e) {\n console.warn(`Failed to determine priority fee using Triton RPC:`, e);\n\n return {\n fee: min,\n methodUsed: \"minimum\",\n };\n }\n };\n\n const rpcProvider = determineRpcProvider(connection.rpcEndpoint);\n\n const { fee, methodUsed } = await calculateFee(rpcProvider);\n\n const maxFeeInSol =\n (fee /\n // convert microlamports to lamports\n 1e6 /\n // convert lamports to SOL\n LAMPORTS_PER_SOL) *\n // multiply by maximum compute units used\n unitBudget;\n\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 instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: fee })\n );\n return instructions;\n}\n\n// Checks response logs for known errors.\n// Returns when the first error is encountered.\nfunction checkKnownSimulationError(\n response: SimulatedTransactionResponse\n): boolean {\n const errors = {} as any;\n\n // This error occur when the blockhash included in a transaction is not deemed to be valid\n // when a validator processes a transaction. We can retry the simulation to get a valid blockhash.\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 // In some cases which aren't deterministic, like a slippage error, we can retry the\n // simulation a few times to get a successful response.\n if (line.includes(\"SlippageToleranceExceeded\")) {\n errors[\"SlippageToleranceExceeded\"] =\n \"Slippage failure during simulation. Trying again.\";\n }\n\n // In this case a require_gte expression was violated during a Swap instruction.\n // We can retry the simulation to get a successful response.\n if (line.includes(\"RequireGteViolated\")) {\n errors[\"RequireGteViolated\"] =\n \"Swap instruction failure during simulation. Trying again.\";\n }\n }\n }\n\n // No known simulation errors found\n if (isEmptyObject(errors)) {\n return false;\n }\n\n console.table(errors);\n return true;\n}\n\nexport async function sleep(timeout: number) {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n\n/**\n * Checks whether an object is empty.\n *\n * isEmptyObject(null)\n * // => true\n *\n * isEmptyObject(undefined)\n * // => true\n *\n * isEmptyObject({})\n * // => true\n *\n * isEmptyObject({ 'a': 1 })\n * // => false\n */\nexport const isEmptyObject = (value: object | null | undefined) => {\n if (value === null || value === undefined) {\n return true;\n }\n\n // Check all property keys for any own prop\n for (const key in value) {\n if (value.hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n\n return true;\n};\n\nfunction determineRpcProvider(endpoint: string): SolanaRpcProvider {\n try {\n const url = new URL(endpoint);\n const hostname = url.hostname;\n if (hostname === \"rpcpool.com\") {\n return \"triton\";\n } else if (hostname === \"helius-rpc.com\") {\n return \"helius\";\n } else if (hostname === \"rpc.ankr.com\") {\n return \"ankr\";\n } else {\n return \"unknown\";\n }\n } catch (e) {\n return \"unknown\";\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\").message;\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).message;\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 ).message;\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 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\";\n\nimport * as solanaSigner from \"./SolanaSigner\";\nimport * as ethereumSigner from \"./EthereumSigner\";\n// import {\n// SuiChains,\n// SuiUnsignedTransaction,\n// } from \"@wormhole-foundation/sdk-sui\";\n// import * as suiSigner from \"./SuiSigner\";\n\nimport { ChainConfig } from \"../../../config\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nexport class Signer<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n _chain: ChainConfig;\n _address: string;\n _options: any;\n _wallet: AdapterWallet;\n _crossChainCore?: CrossChainCore;\n\n constructor(\n chain: ChainConfig,\n address: string,\n options: any,\n wallet: AdapterWallet,\n crossChainCore?: CrossChainCore\n ) {\n this._chain = chain;\n this._address = address;\n this._options = options;\n this._wallet = wallet;\n this._crossChainCore = crossChainCore;\n }\n\n chain(): C {\n return this._chain.displayName as C;\n }\n address(): string {\n return this._address;\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\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 );\n txHashes.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): Promise<string> => {\n if (!wallet) {\n throw new Error(\"wallet is undefined\");\n }\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 {\n throw new Error(`Unsupported chain: ${chain}`);\n }\n};\n","import { ChainId } from \"@wormhole-foundation/sdk\";\nimport { Chain } from \"../CrossChainCore\";\n\nexport enum Context {\n ETH = \"Ethereum\",\n SOLANA = \"Solana\",\n APTOS = \"Aptos\",\n}\n\nexport type BaseChainConfig = {\n key: Chain;\n id: ChainId;\n context: Context;\n finalityThreshold: number;\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 gasToken: string;\n wrappedGasToken?: string;\n chainId: number | string;\n icon: Chain;\n maxBlockSearch: number;\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 } from \"../types\";\n\nimport { ChainsConfig } from \"../types\";\n\nexport const testnetChains: ChainsConfig = {\n Sepolia: {\n key: \"Sepolia\",\n id: 10002,\n context: Context.ETH,\n finalityThreshold: 0,\n displayName: \"Sepolia\",\n explorerUrl: \"https://sepolia.etherscan.io/\",\n explorerName: \"Etherscan\",\n gasToken: \"ETHsepolia\",\n chainId: 11155111,\n icon: \"Ethereum\",\n maxBlockSearch: 2000,\n symbol: \"ETH\",\n defaultRpc: \"https://eth-sepolia.public.blastapi.io\",\n wrappedGasToken: \"0xeef12A83EE5b7161D3873317c8E0E7B76e0B5D9c\",\n },\n Solana: {\n key: \"Solana\",\n id: 1,\n context: Context.SOLANA,\n finalityThreshold: 32,\n displayName: \"Solana\",\n explorerUrl: \"https://explorer.solana.com/\",\n explorerName: \"Solana Explorer\",\n gasToken: \"SOL\",\n chainId: 0,\n icon: \"Solana\",\n maxBlockSearch: 2000,\n symbol: \"SOL\",\n defaultRpc: \"https://api.devnet.solana.com\",\n wrappedGasToken: \"So11111111111111111111111111111111111111112\",\n },\n // Sui: {\n // key: \"Sui\",\n // id: 21,\n // context: Context.SUI,\n // finalityThreshold: 0,\n // displayName: \"Sui\",\n // explorerUrl: \"https://suiscan.xyz/testnet/\",\n // explorerName: \"Suiscan\",\n // gasToken: \"SUI\",\n // chainId: 0,\n // icon: \"Sui\",\n // maxBlockSearch: 0,\n // symbol: \"SUI\",\n // sdkName: \"Sui\",\n // },\n};\n\nexport const AptosTestnetChain = {\n key: \"Aptos\",\n id: 22,\n context: Context.APTOS,\n finalityThreshold: 0,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com?network=testnet\",\n explorerName: \"Aptos Explorer\",\n gasToken: \"APT\",\n chainId: 0,\n icon: \"Aptos\",\n maxBlockSearch: 0,\n symbol: \"APT\",\n sdkName: \"Aptos\",\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 // 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\nexport const AptosTestnetUSDCToken: TokenConfig = {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0x69091fbab5f7d635ee7ac5098cf0c1efbe31d68fec0f2cd565e8d168daf52832\",\n },\n icon: \"USDC\",\n};\n","import { Context, ChainsConfig } from \"../types\";\n\nexport const mainnetChains: ChainsConfig = {\n Ethereum: {\n key: \"Ethereum\",\n id: 2,\n context: Context.ETH,\n finalityThreshold: 64,\n displayName: \"Ethereum\",\n explorerUrl: \"https://etherscan.io/\",\n explorerName: \"Etherscan\",\n gasToken: \"ETH\",\n chainId: 1,\n icon: \"Ethereum\",\n maxBlockSearch: 2000,\n symbol: \"ETH\",\n defaultRpc: \"https://rpc.ankr.com/eth\",\n },\n Solana: {\n key: \"Solana\",\n id: 1,\n context: Context.SOLANA,\n finalityThreshold: 32,\n displayName: \"Solana\",\n explorerUrl: \"https://explorer.solana.com/\",\n explorerName: \"Solana Explorer\",\n gasToken: \"SOL\",\n chainId: 0,\n icon: \"Solana\",\n maxBlockSearch: 2000,\n symbol: \"SOL\",\n defaultRpc: \"https://solana-mainnet.rpc.extrnode.com\",\n },\n // Sui: {\n // key: \"Sui\",\n // id: 21,\n // context: Context.SUI,\n // finalityThreshold: 0,\n // displayName: \"Sui\",\n // sdkName: \"Sui\",\n // explorerUrl: \"https://suiscan.xyz/\",\n // explorerName: \"Suiscan\",\n // gasToken: \"SUI\",\n // chainId: 0,\n // icon: \"Sui\",\n // maxBlockSearch: 0,\n // symbol: \"SUI\",\n // },\n};\n\nexport const AptosMainnetChain = {\n key: \"Aptos\",\n id: 22,\n context: \"Aptos\",\n finalityThreshold: 0,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com/\",\n explorerName: \"Aptos Explorer\",\n gasToken: \"APT\",\n chainId: 0,\n icon: \"Aptos\",\n maxBlockSearch: 0,\n symbol: \"APT\",\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 // 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\nexport const AptosMainnetUSDCToken: TokenConfig = {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n },\n icon: \"USDC\",\n decimals: 6,\n};\n","import { Aptos, AptosConfig, Network } from \"@aptos-labs/ts-sdk\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport {\n AptosMainnetUSDCToken,\n AptosTestnetUSDCToken,\n mainnetTokens,\n testnetTokens,\n} from \"../config\";\nimport { ethers, JsonRpcProvider } from \"ethers\";\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 // Check to see if we were passed wallet address or token account\n const splToken = await connection.getTokenAccountsByOwner(address, {\n mint: new PublicKey(tokenAddress),\n });\n\n // Use the first token account if it exists, otherwise fall back to wallet address\n const checkAddress =\n splToken.value.length > 0 ? splToken.value[0]!.pubkey : address;\n\n const balance = await connection.getTokenAccountBalance(checkAddress);\n\n return (\n balance.value.uiAmountString ??\n (Number(balance.value.amount) / 10 ** balance.value.decimals).toString()\n );\n};\n\nexport const getEthereumWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n rpc: string\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Ethereum\"]\n : testnetTokens[\"Sepolia\"];\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 ? AptosMainnetUSDCToken\n : AptosTestnetUSDCToken;\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 const balance = (\n Number(response[0].amount) /\n 10 ** token.decimals\n ).toString();\n return balance;\n};\n","export * from \"./CrossChainCore\";\nexport * from \"./config\";\nexport * from \"./providers/wormhole/index\";\nexport * from \"./providers/wormhole/types\";\nexport { Network } from \"@aptos-labs/ts-sdk\";\n"],"mappings":"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","names":["Network","sleep","aptos","signAndSendTransaction","rpcProvider","fee","signAndSendTransaction","signAndSendTransaction","sleep","Context","Aptos","AptosConfig","Network","Connection","ethers","Network","Connection","AptosConfig","Aptos","Network","Network"]}
|
|
1
|
+
{"version":3,"sources":["../src/CrossChainCore.ts","../src/providers/wormhole/wormhole.ts","../src/utils/logger.ts","../src/providers/wormhole/signers/AptosLocalSigner.ts","../src/providers/wormhole/signers/SolanaSigner.ts","../src/providers/wormhole/signers/EthereumSigner.ts","../src/providers/wormhole/signers/Signer.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","../src/index.ts"],"sourcesContent":["import { Account, Network } from \"@aptos-labs/ts-sdk\";\n\nimport {\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse,\n WormholeProvider,\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n} from \"./providers/wormhole\";\n\nimport {\n ChainsConfig,\n testnetChains,\n testnetTokens,\n mainnetChains,\n mainnetTokens,\n TokenConfig,\n AptosTestnetUSDCToken,\n AptosMainnetUSDCToken,\n} from \"./config\";\nimport {\n getAptosWalletUSDCBalance,\n getEthereumWalletUSDCBalance,\n getSolanaWalletUSDCBalance,\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}\nexport type { AccountAddressInput } from \"@aptos-labs/ts-sdk\";\nexport { NetworkToChainId, NetworkToNodeAPI } from \"@aptos-labs/ts-sdk\";\nexport type AptosAccount = Account;\n\nexport type Chain = \"Solana\" | \"Ethereum\" | \"Sepolia\" | \"Aptos\";\n\nexport type CCTPProviders = \"Wormhole\";\n\nexport interface CrossChainProvider<\n TQuoteRequest = any,\n TQuoteResponse = any,\n TInitiateTransferRequest = any,\n TInitiateTransferResponse = any,\n> {\n getQuote(params: TQuoteRequest): Promise<TQuoteResponse>;\n initiateCCTPTransfer(\n params: TInitiateTransferRequest,\n ): Promise<TInitiateTransferResponse>;\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 readonly APTOS_TOKEN: TokenConfig = AptosTestnetUSDCToken;\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 this.APTOS_TOKEN = AptosMainnetUSDCToken;\n } else {\n this.CHAINS = testnetChains;\n this.TOKENS = testnetTokens;\n this.APTOS_TOKEN = AptosTestnetUSDCToken;\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 WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse\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 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 \"Sepolia\":\n return await getEthereumWalletUSDCBalance(\n walletAddress,\n this._dappConfig.aptosNetwork,\n // TODO: maybe let the user config it\n this.CHAINS[sourceChain].defaultRpc,\n );\n default:\n throw new Error(`Unsupported chain: ${sourceChain}`);\n }\n }\n}\n","import {\n chainToPlatform,\n routes,\n TokenId,\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\";\n\nimport {\n Chain,\n CrossChainProvider,\n CrossChainCore,\n} from \"../../CrossChainCore\";\nimport { logger } from \"../../utils/logger\";\nimport { AptosLocalSigner } from \"./signers/AptosLocalSigner\";\nimport { Signer } from \"./signers/Signer\";\nimport { ChainConfig } from \"../../config\";\nimport {\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse,\n WormholeRouteResponse,\n WormholeRequest,\n WormholeSubmitTransferRequest,\n WormholeStartTransferResponse,\n WormholeClaimTransferRequest,\n} from \"./types\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\nimport { EIP1193DerivedWallet } from \"@aptos-labs/derived-wallet-ethereum\";\n\nexport class WormholeProvider\n implements\n CrossChainProvider<\n WormholeQuoteRequest,\n WormholeQuoteResponse,\n WormholeInitiateTransferRequest,\n WormholeInitiateTransferResponse\n >\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\n constructor(core: CrossChainCore) {\n this.crossChainCore = core;\n }\n\n get wormholeContext(): Wormhole<\"Mainnet\" | \"Testnet\"> | undefined {\n return this._wormholeContext;\n }\n\n 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];\n const wh = await wormhole(isMainnet ? \"Mainnet\" : \"Testnet\", platforms);\n this._wormholeContext = wh;\n }\n\n async getRoute(sourceChain: Chain): Promise<{\n route: WormholeRouteResponse;\n request: WormholeRequest;\n }> {\n if (!this._wormholeContext) {\n throw new Error(\"Wormhole context not initialized\");\n }\n\n const { sourceToken, destToken } = this.getTokenInfo(sourceChain);\n\n const sourceContext = this._wormholeContext\n .getPlatform(chainToPlatform(sourceChain))\n .getChain(sourceChain);\n\n logger.log(\"sourceContext\", sourceContext);\n\n const destContext = this._wormholeContext\n .getPlatform(chainToPlatform(\"Aptos\"))\n .getChain(\"Aptos\");\n\n logger.log(\"destContext\", destContext);\n\n const request = await routes.RouteTransferRequest.create(\n this._wormholeContext,\n {\n source: sourceToken,\n destination: destToken,\n },\n sourceContext,\n destContext,\n );\n\n const resolver = this._wormholeContext.resolver([\n routes.CCTPRoute, // manual CCTP\n ]);\n\n const route = await resolver.findRoutes(request);\n const cctpRoute = route[0];\n\n this.wormholeRoute = cctpRoute;\n this.wormholeRequest = request;\n\n return { route: cctpRoute, request };\n }\n\n async getQuote(input: WormholeQuoteRequest): Promise<WormholeQuoteResponse> {\n const { amount, sourceChain } = input;\n\n if (!this._wormholeContext) {\n await this.setWormholeContext(sourceChain);\n }\n\n const { route, request } = await this.getRoute(sourceChain);\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}`).message;\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}`).message;\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 {\n // is Ethereum\n [signerAddress] = await (\n wallet as EIP1193DerivedWallet\n ).eip1193Provider.request({\n method: \"eth_requestAccounts\",\n });\n }\n logger.log(\"signerAddress\", signerAddress);\n\n const signer = new Signer(\n this.getChainConfig(sourceChain),\n signerAddress,\n {},\n wallet,\n );\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 ? sponsorAccount : undefined, // the fee payer account\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 initiateCCTPTransfer(\n input: WormholeInitiateTransferRequest,\n ): Promise<WormholeInitiateTransferResponse> {\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 sourceChain: input.sourceChain,\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 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 getTokenInfo(sourceChain: Chain): {\n sourceToken: TokenId;\n destToken: TokenId;\n } {\n const sourceToken: TokenId = Wormhole.tokenId(\n this.crossChainCore.TOKENS[sourceChain].tokenId.chain as Chain,\n this.crossChainCore.TOKENS[sourceChain].tokenId.address,\n );\n\n const destToken: TokenId = Wormhole.tokenId(\n this.crossChainCore.APTOS_TOKEN.tokenId.chain as Chain,\n this.crossChainCore.APTOS_TOKEN.tokenId.address,\n );\n\n return { sourceToken, destToken };\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 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\";\n\nexport class AptosLocalSigner<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n _chain: C;\n _options: any;\n _wallet: Account;\n _sponsorAccount: Account | GasStationApiKey | undefined;\n _claimedTransactionHashes: string;\n\n constructor(\n chain: C,\n options: any,\n wallet: Account,\n feePayerAccount: Account | GasStationApiKey | undefined,\n ) {\n this._chain = chain;\n this._options = options;\n this._wallet = wallet;\n this._sponsorAccount = feePayerAccount;\n this._claimedTransactionHashes = \"\";\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;\n }\n /* other methods... */\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\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 );\n txHashes.push(txId);\n this._claimedTransactionHashes = 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) {\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: AptosNetwork.TESTNET,\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 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 if (typeof sponsorAccount === \"string\") {\n // TODO: handle gas station integration here\n } else {\n const feePayerSignerAuthenticator = aptos.transaction.signAsFeePayer({\n signer: sponsorAccount as Account,\n transaction: txnToSign,\n });\n txnToSubmit.feePayerAuthenticator = feePayerSignerAuthenticator;\n }\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","// 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\nimport {\n AddressLookupTableAccount,\n Commitment,\n ComputeBudgetProgram,\n ConfirmOptions,\n LAMPORTS_PER_SOL,\n SimulatedTransactionResponse,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\n\nimport { Transaction } from \"@solana/web3.js\";\nimport { RpcResponseAndContext, SignatureResult } from \"@solana/web3.js\";\nimport {\n determinePriorityFee,\n determinePriorityFeeTritonOne,\n SolanaUnsignedTransaction,\n} from \"@wormhole-foundation/sdk-solana\";\n\nimport { Connection } from \"@solana/web3.js\";\nimport { Network } from \"@wormhole-foundation/sdk\";\nimport { AdapterWallet } from \"@aptos-labs/wallet-adapter-core\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nimport { SolanaDerivedWallet } from \"@aptos-labs/derived-wallet-solana\";\n\nexport type SolanaRpcProvider = \"triton\" | \"helius\" | \"ankr\" | \"unknown\";\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\").message;\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 \"https://api.devnet.solana.com\",\n );\n const { blockhash, lastValidBlockHeight } =\n await connection.getLatestBlockhash(commitment);\n\n // Circle Manual CCTP on Wormhole is always of a Trnasaction type\n // https://github.com/wormhole-foundation/wormhole-sdk-ts/blob/f7d992e04f844edcc4128659f12f75ade3553717/platforms/solana/protocols/cctp/src/circleBridge.ts#L173\n const transaction = request.transaction.transaction as Transaction;\n\n /**\n * TODO: Priority Fee is supported, but needs to come from dapp config\n */\n const unsignedTx = await setPriorityFeeInstructions(\n connection,\n blockhash,\n lastValidBlockHeight,\n request,\n crossChainCore,\n );\n\n let confirmTransactionPromise: Promise<\n RpcResponseAndContext<SignatureResult>\n > | null = null;\n let confirmedTx: RpcResponseAndContext<SignatureResult> | null = null;\n let txSendAttempts = 1;\n let signature = \"\";\n\n // transaction.recentBlockhash = blockhash;\n // if (request.transaction.signers) {\n // transaction.partialSign(...request.transaction.signers);\n // }\n\n if (!wallet.solanaWallet.signTransaction) {\n throw new Error(\"Wallet does not support signing transactions\").message;\n }\n\n const tx = await wallet.solanaWallet.signTransaction(unsignedTx);\n\n if (!tx) throw new Error(\"Failed to sign transaction\").message;\n const serializedTx = tx.serialize();\n const sendOptions = {\n skipPreflight: true,\n maxRetries: 0,\n preFlightCommitment: commitment, // See PR and linked issue for why setting this matters: https://github.com/anza-xyz/agave/pull/483\n };\n signature = await connection.sendRawTransaction(serializedTx, sendOptions);\n confirmTransactionPromise = connection.confirmTransaction(\n {\n signature,\n blockhash,\n lastValidBlockHeight,\n },\n commitment,\n );\n\n // This loop will break once the transaction has been confirmed or the block height is exceeded.\n // An exception will be thrown if the block height is exceeded by the confirmTransactionPromise.\n // The transaction will be resent if it hasn't been confirmed after the interval.\n const txRetryInterval = 5000;\n while (!confirmedTx) {\n confirmedTx = await Promise.race([\n confirmTransactionPromise,\n new Promise<null>((resolve) =>\n setTimeout(() => {\n resolve(null);\n }, txRetryInterval),\n ),\n ]);\n if (confirmedTx) {\n break;\n }\n console.log(\n `Tx not confirmed after ${\n txRetryInterval * txSendAttempts++\n }ms, resending`,\n );\n try {\n await connection.sendRawTransaction(serializedTx, sendOptions);\n } catch (e) {\n console.error(\"Failed to resend transaction:\", e);\n }\n }\n\n if (confirmedTx.value.err) {\n let errorMessage = `Transaction failed: ${confirmedTx.value.err}`;\n if (typeof confirmedTx.value.err === \"object\") {\n try {\n errorMessage = `Transaction failed: ${JSON.stringify(\n confirmedTx.value.err,\n (_key, value) =>\n typeof value === \"bigint\" ? value.toString() : value, // Handle bigint props\n )}`;\n } catch (e: unknown) {\n // Most likely a circular reference error, we can't stringify this error object.\n // See for more details:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#exceptions\n errorMessage = `Transaction failed: Unknown error`;\n }\n }\n throw new Error(`Transaction failed: ${errorMessage}`).message;\n }\n\n return signature;\n}\n\nexport async function setPriorityFeeInstructions(\n connection: Connection,\n blockhash: string,\n lastValidBlockHeight: number,\n request: SolanaUnsignedTransaction<Network>,\n crossChainCore?: CrossChainCore,\n): Promise<Transaction | VersionedTransaction> {\n const unsignedTx = request.transaction.transaction as Transaction;\n\n const computeBudgetIxFilter = (ix: TransactionInstruction) =>\n ix.programId.toString() !== \"ComputeBudget111111111111111111111111111111\";\n\n unsignedTx.recentBlockhash = blockhash;\n unsignedTx.lastValidBlockHeight = lastValidBlockHeight;\n\n // Remove existing compute budget instructions if they were added by the SDK\n unsignedTx.instructions = unsignedTx.instructions.filter(\n computeBudgetIxFilter,\n );\n unsignedTx.add(\n ...(await createPriorityFeeInstructions(\n connection,\n unsignedTx,\n crossChainCore,\n )),\n );\n if (request.transaction.signers) {\n unsignedTx.partialSign(...request.transaction.signers);\n }\n\n return unsignedTx;\n}\n\n// This will throw if the simulation fails\nasync function createPriorityFeeInstructions(\n connection: Connection,\n transaction: Transaction | VersionedTransaction,\n crossChainCore?: CrossChainCore,\n) {\n let unitsUsed = 200_000;\n let simulationAttempts = 0;\n\n simulationLoop: while (true) {\n const response = await connection.simulateTransaction(\n transaction as Transaction,\n );\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 for both known and unknown errors\n // We should throw in that case\n throw new Error(\n `Simulation failed: ${JSON.stringify(response.value.err)}\\nLogs:\\n${(\n response.value.logs || []\n ).join(\"\\n \")}`,\n ).message;\n } else {\n // Simulation was successful\n if (response.value.unitsConsumed) {\n unitsUsed = response.value.unitsConsumed;\n }\n break;\n }\n }\n\n const unitBudget = Math.floor(unitsUsed * 1.2); // Budget in 20% headroom\n\n const instructions: TransactionInstruction[] = [];\n instructions.push(\n ComputeBudgetProgram.setComputeUnitLimit({\n // Set compute budget to 120% of the units used in the simulated transaction\n units: unitBudget,\n }),\n );\n\n const {\n percentile = 0.9,\n percentileMultiple = 1,\n min = 100_000,\n max = 100_000_000,\n } = crossChainCore?._dappConfig?.solanaConfig?.priorityFeeConfig ?? {};\n\n const calculateFee = async (\n rpcProvider?: SolanaRpcProvider,\n ): Promise<{ fee: number; methodUsed: \"triton\" | \"default\" | \"minimum\" }> => {\n if (rpcProvider === \"triton\") {\n // Triton has an experimental RPC method that accepts a percentile paramater\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 {\n fee,\n methodUsed: \"triton\",\n };\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 {\n fee,\n methodUsed: \"default\",\n };\n } catch (e) {\n console.warn(`Failed to determine priority fee using Triton RPC:`, e);\n\n return {\n fee: min,\n methodUsed: \"minimum\",\n };\n }\n };\n\n const rpcProvider = determineRpcProvider(connection.rpcEndpoint);\n\n const { fee, methodUsed } = await calculateFee(rpcProvider);\n\n const maxFeeInSol =\n (fee /\n // convert microlamports to lamports\n 1e6 /\n // convert lamports to SOL\n LAMPORTS_PER_SOL) *\n // multiply by maximum compute units used\n unitBudget;\n\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 instructions.push(\n ComputeBudgetProgram.setComputeUnitPrice({ microLamports: fee }),\n );\n return instructions;\n}\n\n// Checks response logs for known errors.\n// Returns when the first error is encountered.\nfunction checkKnownSimulationError(\n response: SimulatedTransactionResponse,\n): boolean {\n const errors = {} as any;\n\n // This error occur when the blockhash included in a transaction is not deemed to be valid\n // when a validator processes a transaction. We can retry the simulation to get a valid blockhash.\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 // In some cases which aren't deterministic, like a slippage error, we can retry the\n // simulation a few times to get a successful response.\n if (line.includes(\"SlippageToleranceExceeded\")) {\n errors[\"SlippageToleranceExceeded\"] =\n \"Slippage failure during simulation. Trying again.\";\n }\n\n // In this case a require_gte expression was violated during a Swap instruction.\n // We can retry the simulation to get a successful response.\n if (line.includes(\"RequireGteViolated\")) {\n errors[\"RequireGteViolated\"] =\n \"Swap instruction failure during simulation. Trying again.\";\n }\n }\n }\n\n // No known simulation errors found\n if (isEmptyObject(errors)) {\n return false;\n }\n\n console.table(errors);\n return true;\n}\n\nexport async function sleep(timeout: number) {\n return new Promise((resolve) => setTimeout(resolve, timeout));\n}\n\n/**\n * Checks whether an object is empty.\n *\n * isEmptyObject(null)\n * // => true\n *\n * isEmptyObject(undefined)\n * // => true\n *\n * isEmptyObject({})\n * // => true\n *\n * isEmptyObject({ 'a': 1 })\n * // => false\n */\nexport const isEmptyObject = (value: object | null | undefined) => {\n if (value === null || value === undefined) {\n return true;\n }\n\n // Check all property keys for any own prop\n for (const key in value) {\n if (value.hasOwnProperty.call(value, key)) {\n return false;\n }\n }\n\n return true;\n};\n\nfunction determineRpcProvider(endpoint: string): SolanaRpcProvider {\n try {\n const url = new URL(endpoint);\n const hostname = url.hostname;\n if (hostname === \"rpcpool.com\") {\n return \"triton\";\n } else if (hostname === \"helius-rpc.com\") {\n return \"helius\";\n } else if (hostname === \"rpc.ankr.com\") {\n return \"ankr\";\n } else {\n return \"unknown\";\n }\n } catch (e) {\n return \"unknown\";\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\").message;\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).message;\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 ).message;\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 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\";\n\nimport * as solanaSigner from \"./SolanaSigner\";\nimport * as ethereumSigner from \"./EthereumSigner\";\n// import {\n// SuiChains,\n// SuiUnsignedTransaction,\n// } from \"@wormhole-foundation/sdk-sui\";\n// import * as suiSigner from \"./SuiSigner\";\n\nimport { ChainConfig } from \"../../../config\";\nimport { CrossChainCore } from \"../../../CrossChainCore\";\nexport class Signer<N extends Network, C extends Chain>\n implements SignAndSendSigner<N, C>\n{\n _chain: ChainConfig;\n _address: string;\n _options: any;\n _wallet: AdapterWallet;\n _crossChainCore?: CrossChainCore;\n\n constructor(\n chain: ChainConfig,\n address: string,\n options: any,\n wallet: AdapterWallet,\n crossChainCore?: CrossChainCore,\n ) {\n this._chain = chain;\n this._address = address;\n this._options = options;\n this._wallet = wallet;\n this._crossChainCore = crossChainCore;\n }\n\n chain(): C {\n return this._chain.displayName as C;\n }\n address(): string {\n return this._address;\n }\n\n async signAndSend(txs: UnsignedTransaction<N, C>[]): Promise<TxHash[]> {\n const txHashes: TxHash[] = [];\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 );\n txHashes.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): Promise<string> => {\n if (!wallet) {\n throw new Error(\"wallet is undefined\");\n }\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 {\n throw new Error(`Unsupported chain: ${chain}`);\n }\n};\n","import { ChainId } from \"@wormhole-foundation/sdk\";\nimport { Chain } from \"../CrossChainCore\";\n\nexport enum Context {\n ETH = \"Ethereum\",\n SOLANA = \"Solana\",\n APTOS = \"Aptos\",\n}\n\nexport type BaseChainConfig = {\n key: Chain;\n id: ChainId;\n context: Context;\n finalityThreshold: number;\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 gasToken: string;\n wrappedGasToken?: string;\n chainId: number | string;\n icon: Chain;\n maxBlockSearch: number;\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 } from \"../types\";\n\nimport { ChainsConfig } from \"../types\";\n\nexport const testnetChains: ChainsConfig = {\n Sepolia: {\n key: \"Sepolia\",\n id: 10002,\n context: Context.ETH,\n finalityThreshold: 0,\n displayName: \"Sepolia\",\n explorerUrl: \"https://sepolia.etherscan.io/\",\n explorerName: \"Etherscan\",\n gasToken: \"ETHsepolia\",\n chainId: 11155111,\n icon: \"Ethereum\",\n maxBlockSearch: 2000,\n symbol: \"ETH\",\n defaultRpc: \"https://eth-sepolia.public.blastapi.io\",\n wrappedGasToken: \"0xeef12A83EE5b7161D3873317c8E0E7B76e0B5D9c\",\n },\n Solana: {\n key: \"Solana\",\n id: 1,\n context: Context.SOLANA,\n finalityThreshold: 32,\n displayName: \"Solana\",\n explorerUrl: \"https://explorer.solana.com/\",\n explorerName: \"Solana Explorer\",\n gasToken: \"SOL\",\n chainId: 0,\n icon: \"Solana\",\n maxBlockSearch: 2000,\n symbol: \"SOL\",\n defaultRpc: \"https://api.devnet.solana.com\",\n wrappedGasToken: \"So11111111111111111111111111111111111111112\",\n },\n // Sui: {\n // key: \"Sui\",\n // id: 21,\n // context: Context.SUI,\n // finalityThreshold: 0,\n // displayName: \"Sui\",\n // explorerUrl: \"https://suiscan.xyz/testnet/\",\n // explorerName: \"Suiscan\",\n // gasToken: \"SUI\",\n // chainId: 0,\n // icon: \"Sui\",\n // maxBlockSearch: 0,\n // symbol: \"SUI\",\n // sdkName: \"Sui\",\n // },\n};\n\nexport const AptosTestnetChain = {\n key: \"Aptos\",\n id: 22,\n context: Context.APTOS,\n finalityThreshold: 0,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com?network=testnet\",\n explorerName: \"Aptos Explorer\",\n gasToken: \"APT\",\n chainId: 0,\n icon: \"Aptos\",\n maxBlockSearch: 0,\n symbol: \"APT\",\n sdkName: \"Aptos\",\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 // 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\nexport const AptosTestnetUSDCToken: TokenConfig = {\n symbol: \"USDC\",\n decimals: 6,\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0x69091fbab5f7d635ee7ac5098cf0c1efbe31d68fec0f2cd565e8d168daf52832\",\n },\n icon: \"USDC\",\n};\n","import { Context, ChainsConfig } from \"../types\";\n\nexport const mainnetChains: ChainsConfig = {\n Ethereum: {\n key: \"Ethereum\",\n id: 2,\n context: Context.ETH,\n finalityThreshold: 64,\n displayName: \"Ethereum\",\n explorerUrl: \"https://etherscan.io/\",\n explorerName: \"Etherscan\",\n gasToken: \"ETH\",\n chainId: 1,\n icon: \"Ethereum\",\n maxBlockSearch: 2000,\n symbol: \"ETH\",\n defaultRpc: \"https://rpc.ankr.com/eth\",\n },\n Solana: {\n key: \"Solana\",\n id: 1,\n context: Context.SOLANA,\n finalityThreshold: 32,\n displayName: \"Solana\",\n explorerUrl: \"https://explorer.solana.com/\",\n explorerName: \"Solana Explorer\",\n gasToken: \"SOL\",\n chainId: 0,\n icon: \"Solana\",\n maxBlockSearch: 2000,\n symbol: \"SOL\",\n defaultRpc: \"https://solana-mainnet.rpc.extrnode.com\",\n },\n // Sui: {\n // key: \"Sui\",\n // id: 21,\n // context: Context.SUI,\n // finalityThreshold: 0,\n // displayName: \"Sui\",\n // sdkName: \"Sui\",\n // explorerUrl: \"https://suiscan.xyz/\",\n // explorerName: \"Suiscan\",\n // gasToken: \"SUI\",\n // chainId: 0,\n // icon: \"Sui\",\n // maxBlockSearch: 0,\n // symbol: \"SUI\",\n // },\n};\n\nexport const AptosMainnetChain = {\n key: \"Aptos\",\n id: 22,\n context: \"Aptos\",\n finalityThreshold: 0,\n displayName: \"Aptos\",\n explorerUrl: \"https://explorer.aptoslabs.com/\",\n explorerName: \"Aptos Explorer\",\n gasToken: \"APT\",\n chainId: 0,\n icon: \"Aptos\",\n maxBlockSearch: 0,\n symbol: \"APT\",\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 // 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\nexport const AptosMainnetUSDCToken: TokenConfig = {\n symbol: \"USDC\",\n tokenId: {\n chain: \"Aptos\",\n address:\n \"0xbae207659db88bea0cbead6da0ed00aac12edcdda169e591cd41c94180b46f3b\",\n },\n icon: \"USDC\",\n decimals: 6,\n};\n","import { Aptos, AptosConfig, Network } from \"@aptos-labs/ts-sdk\";\nimport { Connection, PublicKey } from \"@solana/web3.js\";\nimport {\n AptosMainnetUSDCToken,\n AptosTestnetUSDCToken,\n mainnetTokens,\n testnetTokens,\n} from \"../config\";\nimport { ethers, JsonRpcProvider } from \"ethers\";\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 // Check to see if we were passed wallet address or token account\n const splToken = await connection.getTokenAccountsByOwner(address, {\n mint: new PublicKey(tokenAddress),\n });\n\n // Use the first token account if it exists, otherwise fall back to wallet address\n const checkAddress =\n splToken.value.length > 0 ? splToken.value[0]!.pubkey : address;\n\n const balance = await connection.getTokenAccountBalance(checkAddress);\n\n return (\n balance.value.uiAmountString ??\n (Number(balance.value.amount) / 10 ** balance.value.decimals).toString()\n );\n};\n\nexport const getEthereumWalletUSDCBalance = async (\n walletAddress: string,\n aptosNetwork: Network,\n rpc: string,\n): Promise<string> => {\n const token =\n aptosNetwork === Network.MAINNET\n ? mainnetTokens[\"Ethereum\"]\n : testnetTokens[\"Sepolia\"];\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 ? AptosMainnetUSDCToken\n : AptosTestnetUSDCToken;\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 const balance = (\n Number(response[0].amount) /\n 10 ** token.decimals\n ).toString();\n return balance;\n};\n","export * from \"./CrossChainCore\";\nexport * from \"./config\";\nexport * from \"./providers/wormhole/index\";\nexport * from \"./providers/wormhole/types\";\nexport { Network } from \"@aptos-labs/ts-sdk\";\n"],"mappings":"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","names":["Network","sleep","aptos","signAndSendTransaction","rpcProvider","fee","signAndSendTransaction","signAndSendTransaction","sleep","Context","Aptos","AptosConfig","Network","Connection","ethers","Network","Connection","AptosConfig","Aptos","Network","Network"]}
|
package/dist/version.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const CROSS_CHAIN_CORE_VERSION = "4.24.
|
|
1
|
+
export declare const CROSS_CHAIN_CORE_VERSION = "4.24.8";
|
|
2
2
|
//# sourceMappingURL=version.d.ts.map
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aptos-labs/cross-chain-core",
|
|
3
|
-
"version": "4.24.
|
|
3
|
+
"version": "4.24.8",
|
|
4
4
|
"description": "Aptos Cross Chain Core",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -59,12 +59,12 @@
|
|
|
59
59
|
"evm": "link:@wormhole-foundation/sdk/evm",
|
|
60
60
|
"solana": "link:@wormhole-foundation/sdk/solana",
|
|
61
61
|
"tweetnacl": "^1.0.3",
|
|
62
|
-
"@aptos-labs/wallet-adapter-core": "5.
|
|
63
|
-
"@aptos-labs/derived-wallet-ethereum": "0.2.
|
|
64
|
-
"@aptos-labs/derived-wallet-solana": "0.2.
|
|
62
|
+
"@aptos-labs/wallet-adapter-core": "5.5.0",
|
|
63
|
+
"@aptos-labs/derived-wallet-ethereum": "0.2.1",
|
|
64
|
+
"@aptos-labs/derived-wallet-solana": "0.2.5"
|
|
65
65
|
},
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"@aptos-labs/ts-sdk": "^1.38.0"
|
|
67
|
+
"@aptos-labs/ts-sdk": "^1.38.0 || ^2.0.0"
|
|
68
68
|
},
|
|
69
69
|
"files": [
|
|
70
70
|
"dist",
|
package/src/CrossChainCore.ts
CHANGED
|
@@ -53,7 +53,7 @@ export interface CrossChainProvider<
|
|
|
53
53
|
> {
|
|
54
54
|
getQuote(params: TQuoteRequest): Promise<TQuoteResponse>;
|
|
55
55
|
initiateCCTPTransfer(
|
|
56
|
-
params: TInitiateTransferRequest
|
|
56
|
+
params: TInitiateTransferRequest,
|
|
57
57
|
): Promise<TInitiateTransferResponse>;
|
|
58
58
|
}
|
|
59
59
|
|
|
@@ -96,12 +96,12 @@ export class CrossChainCore {
|
|
|
96
96
|
|
|
97
97
|
async getWalletUSDCBalance(
|
|
98
98
|
walletAddress: string,
|
|
99
|
-
sourceChain: Chain
|
|
99
|
+
sourceChain: Chain,
|
|
100
100
|
): Promise<string> {
|
|
101
101
|
if (sourceChain === "Aptos") {
|
|
102
102
|
return await getAptosWalletUSDCBalance(
|
|
103
103
|
walletAddress,
|
|
104
|
-
this._dappConfig.aptosNetwork
|
|
104
|
+
this._dappConfig.aptosNetwork,
|
|
105
105
|
);
|
|
106
106
|
}
|
|
107
107
|
if (!this.CHAINS[sourceChain]) {
|
|
@@ -113,7 +113,7 @@ export class CrossChainCore {
|
|
|
113
113
|
walletAddress,
|
|
114
114
|
this._dappConfig.aptosNetwork,
|
|
115
115
|
this._dappConfig?.solanaConfig?.rpc ??
|
|
116
|
-
this.CHAINS[sourceChain].defaultRpc
|
|
116
|
+
this.CHAINS[sourceChain].defaultRpc,
|
|
117
117
|
);
|
|
118
118
|
case "Ethereum":
|
|
119
119
|
case "Sepolia":
|
|
@@ -121,7 +121,7 @@ export class CrossChainCore {
|
|
|
121
121
|
walletAddress,
|
|
122
122
|
this._dappConfig.aptosNetwork,
|
|
123
123
|
// TODO: maybe let the user config it
|
|
124
|
-
this.CHAINS[sourceChain].defaultRpc
|
|
124
|
+
this.CHAINS[sourceChain].defaultRpc,
|
|
125
125
|
);
|
|
126
126
|
default:
|
|
127
127
|
throw new Error(`Unsupported chain: ${sourceChain}`);
|
|
@@ -33,7 +33,7 @@ export class AptosLocalSigner<N extends Network, C extends Chain>
|
|
|
33
33
|
chain: C,
|
|
34
34
|
options: any,
|
|
35
35
|
wallet: Account,
|
|
36
|
-
feePayerAccount: Account | GasStationApiKey | undefined
|
|
36
|
+
feePayerAccount: Account | GasStationApiKey | undefined,
|
|
37
37
|
) {
|
|
38
38
|
this._chain = chain;
|
|
39
39
|
this._options = options;
|
|
@@ -61,7 +61,7 @@ export class AptosLocalSigner<N extends Network, C extends Chain>
|
|
|
61
61
|
const txId = await signAndSendTransaction(
|
|
62
62
|
tx as AptosUnsignedTransaction<Network, AptosChains>,
|
|
63
63
|
this._wallet,
|
|
64
|
-
this._sponsorAccount
|
|
64
|
+
this._sponsorAccount,
|
|
65
65
|
);
|
|
66
66
|
txHashes.push(txId);
|
|
67
67
|
this._claimedTransactionHashes = txId;
|
|
@@ -73,7 +73,7 @@ export class AptosLocalSigner<N extends Network, C extends Chain>
|
|
|
73
73
|
export async function signAndSendTransaction(
|
|
74
74
|
request: UnsignedTransaction<Network, AptosChains>,
|
|
75
75
|
wallet: Account,
|
|
76
|
-
sponsorAccount: Account | GasStationApiKey | undefined
|
|
76
|
+
sponsorAccount: Account | GasStationApiKey | undefined,
|
|
77
77
|
) {
|
|
78
78
|
if (!wallet) {
|
|
79
79
|
throw new Error("Wallet is undefined");
|
|
@@ -10,7 +10,7 @@ export async function signAndSendTransaction(
|
|
|
10
10
|
request: EvmUnsignedTransaction<Network, EvmChains>,
|
|
11
11
|
wallet: AdapterWallet,
|
|
12
12
|
chainName: string,
|
|
13
|
-
options: any
|
|
13
|
+
options: any,
|
|
14
14
|
): Promise<string> {
|
|
15
15
|
if (!wallet) {
|
|
16
16
|
throw new Error("wallet.sendTransaction is undefined").message;
|
|
@@ -34,12 +34,12 @@ export async function signAndSendTransaction(
|
|
|
34
34
|
BigInt(actualChainId) !== expectedChainId
|
|
35
35
|
) {
|
|
36
36
|
throw new Error(
|
|
37
|
-
`Signer is not connected to the right chain. Expected ${expectedChainId}, got ${actualChainId}
|
|
37
|
+
`Signer is not connected to the right chain. Expected ${expectedChainId}, got ${actualChainId}`,
|
|
38
38
|
).message;
|
|
39
39
|
}
|
|
40
40
|
|
|
41
41
|
const provider = new ethers.BrowserProvider(
|
|
42
|
-
(wallet as EIP1193DerivedWallet).eip1193Provider
|
|
42
|
+
(wallet as EIP1193DerivedWallet).eip1193Provider,
|
|
43
43
|
);
|
|
44
44
|
const signer = await provider.getSigner();
|
|
45
45
|
const response = await signer.sendTransaction(request.transaction);
|
|
@@ -36,7 +36,7 @@ export class Signer<N extends Network, C extends Chain>
|
|
|
36
36
|
address: string,
|
|
37
37
|
options: any,
|
|
38
38
|
wallet: AdapterWallet,
|
|
39
|
-
crossChainCore?: CrossChainCore
|
|
39
|
+
crossChainCore?: CrossChainCore,
|
|
40
40
|
) {
|
|
41
41
|
this._chain = chain;
|
|
42
42
|
this._address = address;
|
|
@@ -61,7 +61,7 @@ export class Signer<N extends Network, C extends Chain>
|
|
|
61
61
|
tx,
|
|
62
62
|
this._wallet,
|
|
63
63
|
this._options,
|
|
64
|
-
this._crossChainCore
|
|
64
|
+
this._crossChainCore,
|
|
65
65
|
);
|
|
66
66
|
txHashes.push(txId);
|
|
67
67
|
}
|
|
@@ -74,7 +74,7 @@ export const signAndSendTransaction = async (
|
|
|
74
74
|
request: UnsignedTransaction<Network, Chain>,
|
|
75
75
|
wallet: AdapterWallet,
|
|
76
76
|
options: any = {},
|
|
77
|
-
crossChainCore?: CrossChainCore
|
|
77
|
+
crossChainCore?: CrossChainCore,
|
|
78
78
|
): Promise<string> => {
|
|
79
79
|
if (!wallet) {
|
|
80
80
|
throw new Error("wallet is undefined");
|
|
@@ -85,7 +85,7 @@ export const signAndSendTransaction = async (
|
|
|
85
85
|
request as SolanaUnsignedTransaction<Network>,
|
|
86
86
|
wallet,
|
|
87
87
|
options,
|
|
88
|
-
crossChainCore
|
|
88
|
+
crossChainCore,
|
|
89
89
|
);
|
|
90
90
|
return signature;
|
|
91
91
|
} else if (chain.context === "Ethereum") {
|
|
@@ -93,7 +93,7 @@ export const signAndSendTransaction = async (
|
|
|
93
93
|
request as EvmUnsignedTransaction<Network, EvmChains>,
|
|
94
94
|
wallet,
|
|
95
95
|
chain.displayName,
|
|
96
|
-
options
|
|
96
|
+
options,
|
|
97
97
|
);
|
|
98
98
|
return tx;
|
|
99
99
|
} else {
|
|
@@ -34,7 +34,7 @@ export async function signAndSendTransaction(
|
|
|
34
34
|
request: SolanaUnsignedTransaction<Network>,
|
|
35
35
|
wallet: AdapterWallet | undefined,
|
|
36
36
|
options?: ConfirmOptions,
|
|
37
|
-
crossChainCore?: CrossChainCore
|
|
37
|
+
crossChainCore?: CrossChainCore,
|
|
38
38
|
) {
|
|
39
39
|
if (!wallet || !(wallet instanceof SolanaDerivedWallet)) {
|
|
40
40
|
throw new Error("Invalid wallet type or missing Solana wallet").message;
|
|
@@ -44,7 +44,7 @@ export async function signAndSendTransaction(
|
|
|
44
44
|
// Solana rpc should come from dapp config
|
|
45
45
|
const connection = new Connection(
|
|
46
46
|
crossChainCore?._dappConfig?.solanaConfig?.rpc ??
|
|
47
|
-
"https://api.devnet.solana.com"
|
|
47
|
+
"https://api.devnet.solana.com",
|
|
48
48
|
);
|
|
49
49
|
const { blockhash, lastValidBlockHeight } =
|
|
50
50
|
await connection.getLatestBlockhash(commitment);
|
|
@@ -61,7 +61,7 @@ export async function signAndSendTransaction(
|
|
|
61
61
|
blockhash,
|
|
62
62
|
lastValidBlockHeight,
|
|
63
63
|
request,
|
|
64
|
-
crossChainCore
|
|
64
|
+
crossChainCore,
|
|
65
65
|
);
|
|
66
66
|
|
|
67
67
|
let confirmTransactionPromise: Promise<
|
|
@@ -96,7 +96,7 @@ export async function signAndSendTransaction(
|
|
|
96
96
|
blockhash,
|
|
97
97
|
lastValidBlockHeight,
|
|
98
98
|
},
|
|
99
|
-
commitment
|
|
99
|
+
commitment,
|
|
100
100
|
);
|
|
101
101
|
|
|
102
102
|
// This loop will break once the transaction has been confirmed or the block height is exceeded.
|
|
@@ -109,7 +109,7 @@ export async function signAndSendTransaction(
|
|
|
109
109
|
new Promise<null>((resolve) =>
|
|
110
110
|
setTimeout(() => {
|
|
111
111
|
resolve(null);
|
|
112
|
-
}, txRetryInterval)
|
|
112
|
+
}, txRetryInterval),
|
|
113
113
|
),
|
|
114
114
|
]);
|
|
115
115
|
if (confirmedTx) {
|
|
@@ -118,7 +118,7 @@ export async function signAndSendTransaction(
|
|
|
118
118
|
console.log(
|
|
119
119
|
`Tx not confirmed after ${
|
|
120
120
|
txRetryInterval * txSendAttempts++
|
|
121
|
-
}ms, resending
|
|
121
|
+
}ms, resending`,
|
|
122
122
|
);
|
|
123
123
|
try {
|
|
124
124
|
await connection.sendRawTransaction(serializedTx, sendOptions);
|
|
@@ -134,7 +134,7 @@ export async function signAndSendTransaction(
|
|
|
134
134
|
errorMessage = `Transaction failed: ${JSON.stringify(
|
|
135
135
|
confirmedTx.value.err,
|
|
136
136
|
(_key, value) =>
|
|
137
|
-
typeof value === "bigint" ? value.toString() : value // Handle bigint props
|
|
137
|
+
typeof value === "bigint" ? value.toString() : value, // Handle bigint props
|
|
138
138
|
)}`;
|
|
139
139
|
} catch (e: unknown) {
|
|
140
140
|
// Most likely a circular reference error, we can't stringify this error object.
|
|
@@ -154,7 +154,7 @@ export async function setPriorityFeeInstructions(
|
|
|
154
154
|
blockhash: string,
|
|
155
155
|
lastValidBlockHeight: number,
|
|
156
156
|
request: SolanaUnsignedTransaction<Network>,
|
|
157
|
-
crossChainCore?: CrossChainCore
|
|
157
|
+
crossChainCore?: CrossChainCore,
|
|
158
158
|
): Promise<Transaction | VersionedTransaction> {
|
|
159
159
|
const unsignedTx = request.transaction.transaction as Transaction;
|
|
160
160
|
|
|
@@ -166,14 +166,14 @@ export async function setPriorityFeeInstructions(
|
|
|
166
166
|
|
|
167
167
|
// Remove existing compute budget instructions if they were added by the SDK
|
|
168
168
|
unsignedTx.instructions = unsignedTx.instructions.filter(
|
|
169
|
-
computeBudgetIxFilter
|
|
169
|
+
computeBudgetIxFilter,
|
|
170
170
|
);
|
|
171
171
|
unsignedTx.add(
|
|
172
172
|
...(await createPriorityFeeInstructions(
|
|
173
173
|
connection,
|
|
174
174
|
unsignedTx,
|
|
175
|
-
crossChainCore
|
|
176
|
-
))
|
|
175
|
+
crossChainCore,
|
|
176
|
+
)),
|
|
177
177
|
);
|
|
178
178
|
if (request.transaction.signers) {
|
|
179
179
|
unsignedTx.partialSign(...request.transaction.signers);
|
|
@@ -186,14 +186,14 @@ export async function setPriorityFeeInstructions(
|
|
|
186
186
|
async function createPriorityFeeInstructions(
|
|
187
187
|
connection: Connection,
|
|
188
188
|
transaction: Transaction | VersionedTransaction,
|
|
189
|
-
crossChainCore?: CrossChainCore
|
|
189
|
+
crossChainCore?: CrossChainCore,
|
|
190
190
|
) {
|
|
191
191
|
let unitsUsed = 200_000;
|
|
192
192
|
let simulationAttempts = 0;
|
|
193
193
|
|
|
194
194
|
simulationLoop: while (true) {
|
|
195
195
|
const response = await connection.simulateTransaction(
|
|
196
|
-
transaction as Transaction
|
|
196
|
+
transaction as Transaction,
|
|
197
197
|
);
|
|
198
198
|
|
|
199
199
|
if (response.value.err) {
|
|
@@ -216,7 +216,7 @@ async function createPriorityFeeInstructions(
|
|
|
216
216
|
throw new Error(
|
|
217
217
|
`Simulation failed: ${JSON.stringify(response.value.err)}\nLogs:\n${(
|
|
218
218
|
response.value.logs || []
|
|
219
|
-
).join("\n ")}
|
|
219
|
+
).join("\n ")}`,
|
|
220
220
|
).message;
|
|
221
221
|
} else {
|
|
222
222
|
// Simulation was successful
|
|
@@ -234,7 +234,7 @@ async function createPriorityFeeInstructions(
|
|
|
234
234
|
ComputeBudgetProgram.setComputeUnitLimit({
|
|
235
235
|
// Set compute budget to 120% of the units used in the simulated transaction
|
|
236
236
|
units: unitBudget,
|
|
237
|
-
})
|
|
237
|
+
}),
|
|
238
238
|
);
|
|
239
239
|
|
|
240
240
|
const {
|
|
@@ -245,7 +245,7 @@ async function createPriorityFeeInstructions(
|
|
|
245
245
|
} = crossChainCore?._dappConfig?.solanaConfig?.priorityFeeConfig ?? {};
|
|
246
246
|
|
|
247
247
|
const calculateFee = async (
|
|
248
|
-
rpcProvider?: SolanaRpcProvider
|
|
248
|
+
rpcProvider?: SolanaRpcProvider,
|
|
249
249
|
): Promise<{ fee: number; methodUsed: "triton" | "default" | "minimum" }> => {
|
|
250
250
|
if (rpcProvider === "triton") {
|
|
251
251
|
// Triton has an experimental RPC method that accepts a percentile paramater
|
|
@@ -257,7 +257,7 @@ async function createPriorityFeeInstructions(
|
|
|
257
257
|
percentile,
|
|
258
258
|
percentileMultiple,
|
|
259
259
|
min,
|
|
260
|
-
max
|
|
260
|
+
max,
|
|
261
261
|
);
|
|
262
262
|
|
|
263
263
|
return {
|
|
@@ -277,7 +277,7 @@ async function createPriorityFeeInstructions(
|
|
|
277
277
|
percentile,
|
|
278
278
|
percentileMultiple,
|
|
279
279
|
min,
|
|
280
|
-
max
|
|
280
|
+
max,
|
|
281
281
|
);
|
|
282
282
|
|
|
283
283
|
return {
|
|
@@ -318,7 +318,7 @@ async function createPriorityFeeInstructions(
|
|
|
318
318
|
});
|
|
319
319
|
|
|
320
320
|
instructions.push(
|
|
321
|
-
ComputeBudgetProgram.setComputeUnitPrice({ microLamports: fee })
|
|
321
|
+
ComputeBudgetProgram.setComputeUnitPrice({ microLamports: fee }),
|
|
322
322
|
);
|
|
323
323
|
return instructions;
|
|
324
324
|
}
|
|
@@ -326,7 +326,7 @@ async function createPriorityFeeInstructions(
|
|
|
326
326
|
// Checks response logs for known errors.
|
|
327
327
|
// Returns when the first error is encountered.
|
|
328
328
|
function checkKnownSimulationError(
|
|
329
|
-
response: SimulatedTransactionResponse
|
|
329
|
+
response: SimulatedTransactionResponse,
|
|
330
330
|
): boolean {
|
|
331
331
|
const errors = {} as any;
|
|
332
332
|
|
|
@@ -103,7 +103,7 @@ export class WormholeProvider
|
|
|
103
103
|
destination: destToken,
|
|
104
104
|
},
|
|
105
105
|
sourceContext,
|
|
106
|
-
destContext
|
|
106
|
+
destContext,
|
|
107
107
|
);
|
|
108
108
|
|
|
109
109
|
const resolver = this._wormholeContext.resolver([
|
|
@@ -150,7 +150,7 @@ export class WormholeProvider
|
|
|
150
150
|
}
|
|
151
151
|
|
|
152
152
|
async submitCCTPTransfer(
|
|
153
|
-
input: WormholeSubmitTransferRequest
|
|
153
|
+
input: WormholeSubmitTransferRequest,
|
|
154
154
|
): Promise<WormholeStartTransferResponse> {
|
|
155
155
|
const { sourceChain, wallet, destinationAddress } = input;
|
|
156
156
|
|
|
@@ -184,14 +184,14 @@ export class WormholeProvider
|
|
|
184
184
|
this.getChainConfig(sourceChain),
|
|
185
185
|
signerAddress,
|
|
186
186
|
{},
|
|
187
|
-
wallet
|
|
187
|
+
wallet,
|
|
188
188
|
);
|
|
189
189
|
|
|
190
190
|
let receipt = await this.wormholeRoute.initiate(
|
|
191
191
|
this.wormholeRequest,
|
|
192
192
|
signer,
|
|
193
193
|
this.wormholeQuote,
|
|
194
|
-
Wormhole.chainAddress("Aptos", destinationAddress.toString())
|
|
194
|
+
Wormhole.chainAddress("Aptos", destinationAddress.toString()),
|
|
195
195
|
);
|
|
196
196
|
|
|
197
197
|
const originChainTxnId =
|
|
@@ -203,7 +203,7 @@ export class WormholeProvider
|
|
|
203
203
|
}
|
|
204
204
|
|
|
205
205
|
async claimCCTPTransfer(
|
|
206
|
-
input: WormholeClaimTransferRequest
|
|
206
|
+
input: WormholeClaimTransferRequest,
|
|
207
207
|
): Promise<{ destinationChainTxnId: string }> {
|
|
208
208
|
let { receipt, mainSigner, sponsorAccount } = input;
|
|
209
209
|
if (!this.wormholeRoute) {
|
|
@@ -227,7 +227,7 @@ export class WormholeProvider
|
|
|
227
227
|
"Aptos",
|
|
228
228
|
{},
|
|
229
229
|
mainSigner, // the account that signs the "claim" transaction
|
|
230
|
-
sponsorAccount ? sponsorAccount : undefined // the fee payer account
|
|
230
|
+
sponsorAccount ? sponsorAccount : undefined, // the fee payer account
|
|
231
231
|
);
|
|
232
232
|
|
|
233
233
|
if (routes.isManual(this.wormholeRoute)) {
|
|
@@ -249,7 +249,7 @@ export class WormholeProvider
|
|
|
249
249
|
} catch (e) {
|
|
250
250
|
console.error(
|
|
251
251
|
`Error tracking transfer (attempt ${retries + 1} / ${maxRetries}):`,
|
|
252
|
-
e
|
|
252
|
+
e,
|
|
253
253
|
);
|
|
254
254
|
const delay = baseDelay * Math.pow(2, retries); // Exponential backoff
|
|
255
255
|
await sleep(delay);
|
|
@@ -266,7 +266,7 @@ export class WormholeProvider
|
|
|
266
266
|
* @returns
|
|
267
267
|
*/
|
|
268
268
|
async initiateCCTPTransfer(
|
|
269
|
-
input: WormholeInitiateTransferRequest
|
|
269
|
+
input: WormholeInitiateTransferRequest,
|
|
270
270
|
): Promise<WormholeInitiateTransferResponse> {
|
|
271
271
|
if (this.crossChainCore._dappConfig?.aptosNetwork === Network.DEVNET) {
|
|
272
272
|
throw new Error("Devnet is not supported on Wormhole");
|
|
@@ -307,12 +307,12 @@ export class WormholeProvider
|
|
|
307
307
|
} {
|
|
308
308
|
const sourceToken: TokenId = Wormhole.tokenId(
|
|
309
309
|
this.crossChainCore.TOKENS[sourceChain].tokenId.chain as Chain,
|
|
310
|
-
this.crossChainCore.TOKENS[sourceChain].tokenId.address
|
|
310
|
+
this.crossChainCore.TOKENS[sourceChain].tokenId.address,
|
|
311
311
|
);
|
|
312
312
|
|
|
313
313
|
const destToken: TokenId = Wormhole.tokenId(
|
|
314
314
|
this.crossChainCore.APTOS_TOKEN.tokenId.chain as Chain,
|
|
315
|
-
this.crossChainCore.APTOS_TOKEN.tokenId.address
|
|
315
|
+
this.crossChainCore.APTOS_TOKEN.tokenId.address,
|
|
316
316
|
);
|
|
317
317
|
|
|
318
318
|
return { sourceToken, destToken };
|
|
@@ -11,7 +11,7 @@ import { ethers, JsonRpcProvider } from "ethers";
|
|
|
11
11
|
export const getSolanaWalletUSDCBalance = async (
|
|
12
12
|
walletAddress: string,
|
|
13
13
|
aptosNetwork: Network,
|
|
14
|
-
rpc: string
|
|
14
|
+
rpc: string,
|
|
15
15
|
): Promise<string> => {
|
|
16
16
|
const address = new PublicKey(walletAddress);
|
|
17
17
|
const tokenAddress =
|
|
@@ -40,7 +40,7 @@ export const getSolanaWalletUSDCBalance = async (
|
|
|
40
40
|
export const getEthereumWalletUSDCBalance = async (
|
|
41
41
|
walletAddress: string,
|
|
42
42
|
aptosNetwork: Network,
|
|
43
|
-
rpc: string
|
|
43
|
+
rpc: string,
|
|
44
44
|
): Promise<string> => {
|
|
45
45
|
const token =
|
|
46
46
|
aptosNetwork === Network.MAINNET
|
|
@@ -57,7 +57,7 @@ export const getEthereumWalletUSDCBalance = async (
|
|
|
57
57
|
|
|
58
58
|
export const getAptosWalletUSDCBalance = async (
|
|
59
59
|
walletAddress: string,
|
|
60
|
-
aptosNetwork: Network
|
|
60
|
+
aptosNetwork: Network,
|
|
61
61
|
): Promise<string> => {
|
|
62
62
|
const token =
|
|
63
63
|
aptosNetwork === Network.MAINNET
|
package/src/version.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export const CROSS_CHAIN_CORE_VERSION = "4.24.
|
|
1
|
+
export const CROSS_CHAIN_CORE_VERSION = "4.24.8";
|