@aptos-labs/cross-chain-core 4.24.5 → 4.24.7

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 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":"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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 +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.5";
1
+ export declare const CROSS_CHAIN_CORE_VERSION = "4.24.7";
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.5",
3
+ "version": "4.24.7",
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.4.1",
63
- "@aptos-labs/derived-wallet-ethereum": "0.1.3",
64
- "@aptos-labs/derived-wallet-solana": "0.2.3"
62
+ "@aptos-labs/wallet-adapter-core": "5.4.2",
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",
@@ -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.5";
1
+ export const CROSS_CHAIN_CORE_VERSION = "4.24.7";