agentwallet-sdk 5.0.0 → 5.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +221 -0
- package/dist/abi.d.ts +397 -0
- package/dist/abi.d.ts.map +1 -0
- package/dist/abi.js +255 -0
- package/dist/abi.js.map +1 -0
- package/dist/ap2/index.d.ts +185 -0
- package/dist/ap2/index.d.ts.map +1 -0
- package/dist/ap2/index.js +255 -0
- package/dist/ap2/index.js.map +1 -0
- package/dist/bridge/abis.d.ts +64 -0
- package/dist/bridge/abis.d.ts.map +1 -0
- package/dist/bridge/abis.js +129 -0
- package/dist/bridge/abis.js.map +1 -0
- package/dist/bridge/client.d.ts +35 -0
- package/dist/bridge/client.d.ts.map +1 -0
- package/dist/bridge/client.js +230 -0
- package/dist/bridge/client.js.map +1 -0
- package/dist/bridge/index.d.ts +4 -0
- package/dist/bridge/index.d.ts.map +1 -0
- package/dist/bridge/index.js +3 -0
- package/dist/bridge/index.js.map +1 -0
- package/dist/bridge/types.d.ts +69 -0
- package/dist/bridge/types.d.ts.map +1 -0
- package/dist/bridge/types.js +53 -0
- package/dist/bridge/types.js.map +1 -0
- package/dist/bridge/unified.d.ts +101 -0
- package/dist/bridge/unified.d.ts.map +1 -0
- package/dist/bridge/unified.js +284 -0
- package/dist/bridge/unified.js.map +1 -0
- package/dist/chains.d.ts +62 -0
- package/dist/chains.d.ts.map +1 -0
- package/dist/chains.js +108 -0
- package/dist/chains.js.map +1 -0
- package/dist/escrow/MutualStakeEscrow.d.ts +75 -0
- package/dist/escrow/MutualStakeEscrow.d.ts.map +1 -0
- package/dist/escrow/MutualStakeEscrow.js +339 -0
- package/dist/escrow/MutualStakeEscrow.js.map +1 -0
- package/dist/escrow/types.d.ts +59 -0
- package/dist/escrow/types.d.ts.map +1 -0
- package/dist/escrow/types.js +11 -0
- package/dist/escrow/types.js.map +1 -0
- package/dist/escrow/verifiers.d.ts +26 -0
- package/dist/escrow/verifiers.d.ts.map +1 -0
- package/dist/escrow/verifiers.js +53 -0
- package/dist/escrow/verifiers.js.map +1 -0
- package/dist/fiat/index.d.ts +10 -0
- package/dist/fiat/index.d.ts.map +1 -0
- package/dist/fiat/index.js +9 -0
- package/dist/fiat/index.js.map +1 -0
- package/dist/fiat/onramp.d.ts +101 -0
- package/dist/fiat/onramp.d.ts.map +1 -0
- package/dist/fiat/onramp.js +155 -0
- package/dist/fiat/onramp.js.map +1 -0
- package/dist/fiat/providers/index.d.ts +16 -0
- package/dist/fiat/providers/index.d.ts.map +1 -0
- package/dist/fiat/providers/index.js +30 -0
- package/dist/fiat/providers/index.js.map +1 -0
- package/dist/fiat/providers/moonpay.d.ts +22 -0
- package/dist/fiat/providers/moonpay.d.ts.map +1 -0
- package/dist/fiat/providers/moonpay.js +107 -0
- package/dist/fiat/providers/moonpay.js.map +1 -0
- package/dist/fiat/providers/stripe.d.ts +26 -0
- package/dist/fiat/providers/stripe.d.ts.map +1 -0
- package/dist/fiat/providers/stripe.js +135 -0
- package/dist/fiat/providers/stripe.js.map +1 -0
- package/dist/fiat/providers/transak.d.ts +26 -0
- package/dist/fiat/providers/transak.d.ts.map +1 -0
- package/dist/fiat/providers/transak.js +119 -0
- package/dist/fiat/providers/transak.js.map +1 -0
- package/dist/fiat/types.d.ts +106 -0
- package/dist/fiat/types.d.ts.map +1 -0
- package/dist/fiat/types.js +13 -0
- package/dist/fiat/types.js.map +1 -0
- package/dist/flash/executor.d.ts +119 -0
- package/dist/flash/executor.d.ts.map +1 -0
- package/dist/flash/executor.js +195 -0
- package/dist/flash/executor.js.map +1 -0
- package/dist/flash/index.d.ts +28 -0
- package/dist/flash/index.d.ts.map +1 -0
- package/dist/flash/index.js +29 -0
- package/dist/flash/index.js.map +1 -0
- package/dist/flash/scanner.d.ts +133 -0
- package/dist/flash/scanner.d.ts.map +1 -0
- package/dist/flash/scanner.js +212 -0
- package/dist/flash/scanner.js.map +1 -0
- package/dist/flash/types.d.ts +136 -0
- package/dist/flash/types.d.ts.map +1 -0
- package/dist/flash/types.js +23 -0
- package/dist/flash/types.js.map +1 -0
- package/dist/gas/index.d.ts +4 -0
- package/dist/gas/index.d.ts.map +1 -0
- package/dist/gas/index.js +3 -0
- package/dist/gas/index.js.map +1 -0
- package/dist/gas/sponsor.d.ts +70 -0
- package/dist/gas/sponsor.d.ts.map +1 -0
- package/dist/gas/sponsor.js +193 -0
- package/dist/gas/sponsor.js.map +1 -0
- package/dist/gas/types.d.ts +76 -0
- package/dist/gas/types.d.ts.map +1 -0
- package/dist/gas/types.js +21 -0
- package/dist/gas/types.js.map +1 -0
- package/dist/identity/agent-identity.d.ts +276 -0
- package/dist/identity/agent-identity.d.ts.map +1 -0
- package/dist/identity/agent-identity.js +300 -0
- package/dist/identity/agent-identity.js.map +1 -0
- package/dist/identity/erc6551.d.ts +441 -0
- package/dist/identity/erc6551.d.ts.map +1 -0
- package/dist/identity/erc6551.js +517 -0
- package/dist/identity/erc6551.js.map +1 -0
- package/dist/identity/erc8004.d.ts +305 -0
- package/dist/identity/erc8004.d.ts.map +1 -0
- package/dist/identity/erc8004.js +413 -0
- package/dist/identity/erc8004.js.map +1 -0
- package/dist/identity/index.d.ts +7 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +4 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/reputation.d.ts +318 -0
- package/dist/identity/reputation.d.ts.map +1 -0
- package/dist/identity/reputation.js +272 -0
- package/dist/identity/reputation.js.map +1 -0
- package/dist/identity/validation.d.ts +284 -0
- package/dist/identity/validation.d.ts.map +1 -0
- package/dist/identity/validation.js +226 -0
- package/dist/identity/validation.js.map +1 -0
- package/dist/index.d.ts +38803 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +376 -0
- package/dist/index.js.map +1 -0
- package/dist/mev/index.d.ts +4 -0
- package/dist/mev/index.d.ts.map +1 -0
- package/dist/mev/index.js +8 -0
- package/dist/mev/index.js.map +1 -0
- package/dist/mev/protection.d.ts +54 -0
- package/dist/mev/protection.d.ts.map +1 -0
- package/dist/mev/protection.js +185 -0
- package/dist/mev/protection.js.map +1 -0
- package/dist/mev/risk.d.ts +19 -0
- package/dist/mev/risk.d.ts.map +1 -0
- package/dist/mev/risk.js +95 -0
- package/dist/mev/risk.js.map +1 -0
- package/dist/mev/types.d.ts +49 -0
- package/dist/mev/types.d.ts.map +1 -0
- package/dist/mev/types.js +2 -0
- package/dist/mev/types.js.map +1 -0
- package/dist/plugins/elizaos.d.ts +52 -0
- package/dist/plugins/elizaos.d.ts.map +1 -0
- package/dist/plugins/elizaos.js +89 -0
- package/dist/plugins/elizaos.js.map +1 -0
- package/dist/policy/SpendingPolicy.d.ts +106 -0
- package/dist/policy/SpendingPolicy.d.ts.map +1 -0
- package/dist/policy/SpendingPolicy.js +155 -0
- package/dist/policy/SpendingPolicy.js.map +1 -0
- package/dist/policy/SpendingPolicy.test.d.ts +2 -0
- package/dist/policy/SpendingPolicy.test.d.ts.map +1 -0
- package/dist/policy/SpendingPolicy.test.js +143 -0
- package/dist/policy/SpendingPolicy.test.js.map +1 -0
- package/dist/settlement/index.d.ts +4 -0
- package/dist/settlement/index.d.ts.map +1 -0
- package/dist/settlement/index.js +3 -0
- package/dist/settlement/index.js.map +1 -0
- package/dist/settlement/types.d.ts +66 -0
- package/dist/settlement/types.d.ts.map +1 -0
- package/dist/settlement/types.js +37 -0
- package/dist/settlement/types.js.map +1 -0
- package/dist/settlement/verifier.d.ts +75 -0
- package/dist/settlement/verifier.d.ts.map +1 -0
- package/dist/settlement/verifier.js +354 -0
- package/dist/settlement/verifier.js.map +1 -0
- package/dist/solana/bridge.d.ts +144 -0
- package/dist/solana/bridge.d.ts.map +1 -0
- package/dist/solana/bridge.js +352 -0
- package/dist/solana/bridge.js.map +1 -0
- package/dist/solana/index.d.ts +8 -0
- package/dist/solana/index.d.ts.map +1 -0
- package/dist/solana/index.js +6 -0
- package/dist/solana/index.js.map +1 -0
- package/dist/solana/swap.d.ts +85 -0
- package/dist/solana/swap.d.ts.map +1 -0
- package/dist/solana/swap.js +173 -0
- package/dist/solana/swap.js.map +1 -0
- package/dist/solana/types.d.ts +126 -0
- package/dist/solana/types.d.ts.map +1 -0
- package/dist/solana/types.js +10 -0
- package/dist/solana/types.js.map +1 -0
- package/dist/solana/wallet.d.ts +83 -0
- package/dist/solana/wallet.d.ts.map +1 -0
- package/dist/solana/wallet.js +164 -0
- package/dist/solana/wallet.js.map +1 -0
- package/dist/solana/x402.d.ts +69 -0
- package/dist/solana/x402.d.ts.map +1 -0
- package/dist/solana/x402.js +154 -0
- package/dist/solana/x402.js.map +1 -0
- package/dist/solver/adapter.d.ts +47 -0
- package/dist/solver/adapter.d.ts.map +1 -0
- package/dist/solver/adapter.js +146 -0
- package/dist/solver/adapter.js.map +1 -0
- package/dist/solver/analyzer.d.ts +48 -0
- package/dist/solver/analyzer.d.ts.map +1 -0
- package/dist/solver/analyzer.js +171 -0
- package/dist/solver/analyzer.js.map +1 -0
- package/dist/solver/builder.d.ts +31 -0
- package/dist/solver/builder.d.ts.map +1 -0
- package/dist/solver/builder.js +60 -0
- package/dist/solver/builder.js.map +1 -0
- package/dist/solver/index.d.ts +22 -0
- package/dist/solver/index.d.ts.map +1 -0
- package/dist/solver/index.js +25 -0
- package/dist/solver/index.js.map +1 -0
- package/dist/solver/types.d.ts +115 -0
- package/dist/solver/types.d.ts.map +1 -0
- package/dist/solver/types.js +10 -0
- package/dist/solver/types.js.map +1 -0
- package/dist/spend-guard/index.d.ts +125 -0
- package/dist/spend-guard/index.d.ts.map +1 -0
- package/dist/spend-guard/index.js +150 -0
- package/dist/spend-guard/index.js.map +1 -0
- package/dist/swap/SwapModule.d.ts +34 -0
- package/dist/swap/SwapModule.d.ts.map +1 -0
- package/dist/swap/SwapModule.js +144 -0
- package/dist/swap/SwapModule.js.map +1 -0
- package/dist/swap/abi.d.ts +51 -0
- package/dist/swap/abi.d.ts.map +1 -0
- package/dist/swap/abi.js +118 -0
- package/dist/swap/abi.js.map +1 -0
- package/dist/swap/index.d.ts +5 -0
- package/dist/swap/index.d.ts.map +1 -0
- package/dist/swap/index.js +4 -0
- package/dist/swap/index.js.map +1 -0
- package/dist/swap/router/cache.d.ts +13 -0
- package/dist/swap/router/cache.d.ts.map +1 -0
- package/dist/swap/router/cache.js +30 -0
- package/dist/swap/router/cache.js.map +1 -0
- package/dist/swap/router/flashbots.d.ts +10 -0
- package/dist/swap/router/flashbots.d.ts.map +1 -0
- package/dist/swap/router/flashbots.js +43 -0
- package/dist/swap/router/flashbots.js.map +1 -0
- package/dist/swap/router/health.d.ts +17 -0
- package/dist/swap/router/health.d.ts.map +1 -0
- package/dist/swap/router/health.js +38 -0
- package/dist/swap/router/health.js.map +1 -0
- package/dist/swap/router/index.d.ts +10 -0
- package/dist/swap/router/index.d.ts.map +1 -0
- package/dist/swap/router/index.js +10 -0
- package/dist/swap/router/index.js.map +1 -0
- package/dist/swap/router/providers/cowswap.d.ts +11 -0
- package/dist/swap/router/providers/cowswap.d.ts.map +1 -0
- package/dist/swap/router/providers/cowswap.js +79 -0
- package/dist/swap/router/providers/cowswap.js.map +1 -0
- package/dist/swap/router/providers/index.d.ts +20 -0
- package/dist/swap/router/providers/index.d.ts.map +1 -0
- package/dist/swap/router/providers/index.js +32 -0
- package/dist/swap/router/providers/index.js.map +1 -0
- package/dist/swap/router/providers/jupiter.d.ts +12 -0
- package/dist/swap/router/providers/jupiter.d.ts.map +1 -0
- package/dist/swap/router/providers/jupiter.js +73 -0
- package/dist/swap/router/providers/jupiter.js.map +1 -0
- package/dist/swap/router/providers/lifi.d.ts +11 -0
- package/dist/swap/router/providers/lifi.d.ts.map +1 -0
- package/dist/swap/router/providers/lifi.js +123 -0
- package/dist/swap/router/providers/lifi.js.map +1 -0
- package/dist/swap/router/providers/oneinch.d.ts +13 -0
- package/dist/swap/router/providers/oneinch.d.ts.map +1 -0
- package/dist/swap/router/providers/oneinch.js +71 -0
- package/dist/swap/router/providers/oneinch.js.map +1 -0
- package/dist/swap/router/providers/paraswap.d.ts +11 -0
- package/dist/swap/router/providers/paraswap.d.ts.map +1 -0
- package/dist/swap/router/providers/paraswap.js +73 -0
- package/dist/swap/router/providers/paraswap.js.map +1 -0
- package/dist/swap/router/providers/uniswap.d.ts +31 -0
- package/dist/swap/router/providers/uniswap.d.ts.map +1 -0
- package/dist/swap/router/providers/uniswap.js +237 -0
- package/dist/swap/router/providers/uniswap.js.map +1 -0
- package/dist/swap/router/providers/zerox.d.ts +13 -0
- package/dist/swap/router/providers/zerox.d.ts.map +1 -0
- package/dist/swap/router/providers/zerox.js +94 -0
- package/dist/swap/router/providers/zerox.js.map +1 -0
- package/dist/swap/router/router.d.ts +86 -0
- package/dist/swap/router/router.d.ts.map +1 -0
- package/dist/swap/router/router.js +224 -0
- package/dist/swap/router/router.js.map +1 -0
- package/dist/swap/router/rsi/engine.d.ts +60 -0
- package/dist/swap/router/rsi/engine.d.ts.map +1 -0
- package/dist/swap/router/rsi/engine.js +483 -0
- package/dist/swap/router/rsi/engine.js.map +1 -0
- package/dist/swap/router/rsi/index.d.ts +3 -0
- package/dist/swap/router/rsi/index.d.ts.map +1 -0
- package/dist/swap/router/rsi/index.js +3 -0
- package/dist/swap/router/rsi/index.js.map +1 -0
- package/dist/swap/router/rsi/types.d.ts +106 -0
- package/dist/swap/router/rsi/types.d.ts.map +1 -0
- package/dist/swap/router/rsi/types.js +3 -0
- package/dist/swap/router/rsi/types.js.map +1 -0
- package/dist/swap/router/types.d.ts +120 -0
- package/dist/swap/router/types.d.ts.map +1 -0
- package/dist/swap/router/types.js +16 -0
- package/dist/swap/router/types.js.map +1 -0
- package/dist/swap/types.d.ts +51 -0
- package/dist/swap/types.d.ts.map +1 -0
- package/dist/swap/types.js +17 -0
- package/dist/swap/types.js.map +1 -0
- package/dist/tax/engine.d.ts +131 -0
- package/dist/tax/engine.d.ts.map +1 -0
- package/dist/tax/engine.js +307 -0
- package/dist/tax/engine.js.map +1 -0
- package/dist/tax/index.d.ts +9 -0
- package/dist/tax/index.d.ts.map +1 -0
- package/dist/tax/index.js +12 -0
- package/dist/tax/index.js.map +1 -0
- package/dist/tax/lots.d.ts +60 -0
- package/dist/tax/lots.d.ts.map +1 -0
- package/dist/tax/lots.js +129 -0
- package/dist/tax/lots.js.map +1 -0
- package/dist/tax/types.d.ts +113 -0
- package/dist/tax/types.d.ts.map +1 -0
- package/dist/tax/types.js +18 -0
- package/dist/tax/types.js.map +1 -0
- package/dist/types.d.ts +110 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +9 -0
- package/dist/types.js.map +1 -0
- package/dist/x402/__tests__/budget.test.d.ts +2 -0
- package/dist/x402/__tests__/budget.test.d.ts.map +1 -0
- package/dist/x402/__tests__/budget.test.js +114 -0
- package/dist/x402/__tests__/budget.test.js.map +1 -0
- package/dist/x402/__tests__/client.test.d.ts +2 -0
- package/dist/x402/__tests__/client.test.d.ts.map +1 -0
- package/dist/x402/__tests__/client.test.js +107 -0
- package/dist/x402/__tests__/client.test.js.map +1 -0
- package/dist/x402/budget.d.ts +52 -0
- package/dist/x402/budget.d.ts.map +1 -0
- package/dist/x402/budget.js +113 -0
- package/dist/x402/budget.js.map +1 -0
- package/dist/x402/chains/abstract/index.d.ts +135 -0
- package/dist/x402/chains/abstract/index.d.ts.map +1 -0
- package/dist/x402/chains/abstract/index.js +190 -0
- package/dist/x402/chains/abstract/index.js.map +1 -0
- package/dist/x402/client.d.ts +60 -0
- package/dist/x402/client.d.ts.map +1 -0
- package/dist/x402/client.js +205 -0
- package/dist/x402/client.js.map +1 -0
- package/dist/x402/index.d.ts +8 -0
- package/dist/x402/index.d.ts.map +1 -0
- package/dist/x402/index.js +8 -0
- package/dist/x402/index.js.map +1 -0
- package/dist/x402/middleware.d.ts +37 -0
- package/dist/x402/middleware.d.ts.map +1 -0
- package/dist/x402/middleware.js +65 -0
- package/dist/x402/middleware.js.map +1 -0
- package/dist/x402/types.d.ts +91 -0
- package/dist/x402/types.d.ts.map +1 -0
- package/dist/x402/types.js +9 -0
- package/dist/x402/types.js.map +1 -0
- package/dist/yield/index.d.ts +26 -0
- package/dist/yield/index.d.ts.map +1 -0
- package/dist/yield/index.js +29 -0
- package/dist/yield/index.js.map +1 -0
- package/dist/yield/rates.d.ts +114 -0
- package/dist/yield/rates.d.ts.map +1 -0
- package/dist/yield/rates.js +351 -0
- package/dist/yield/rates.js.map +1 -0
- package/dist/yield/types.d.ts +134 -0
- package/dist/yield/types.d.ts.map +1 -0
- package/dist/yield/types.js +24 -0
- package/dist/yield/types.js.map +1 -0
- package/dist/yield/vault.d.ts +112 -0
- package/dist/yield/vault.d.ts.map +1 -0
- package/dist/yield/vault.js +264 -0
- package/dist/yield/vault.js.map +1 -0
- package/package.json +46 -7
- package/index.js +0 -2
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// BridgeModule — CCTP V2 cross-chain USDC bridge for AgentWallet
|
|
2
|
+
// Non-custodial: all signing is done locally via the agent's WalletClient.
|
|
3
|
+
import { createPublicClient, http, keccak256, pad, getContract, } from 'viem';
|
|
4
|
+
import { base, mainnet, optimism, arbitrum } from 'viem/chains';
|
|
5
|
+
import { TokenMessengerV2Abi, MessageTransmitterV2Abi, ERC20BridgeAbi, } from './abis.js';
|
|
6
|
+
import { CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, USDC_CONTRACT, TOKEN_MESSENGER_V2, MESSAGE_TRANSMITTER_V2, FINALITY_THRESHOLD, CIRCLE_ATTESTATION_API, MAX_ATTESTATION_POLLS, ATTESTATION_POLL_INTERVAL_MS, } from './types.js';
|
|
7
|
+
const VIEM_CHAINS = { base, ethereum: mainnet, optimism, arbitrum };
|
|
8
|
+
export class BridgeModule {
|
|
9
|
+
constructor(walletClient, fromChain = 'base', options = {}) {
|
|
10
|
+
if (!walletClient.account) {
|
|
11
|
+
throw new BridgeError('NO_WALLET_CLIENT', 'WalletClient must have an account attached. Use privateKeyToAccount() or similar to attach a signer.');
|
|
12
|
+
}
|
|
13
|
+
this.walletClient = walletClient;
|
|
14
|
+
this.fromChain = fromChain;
|
|
15
|
+
this.fromRpcUrl = options.rpcUrl;
|
|
16
|
+
this.publicClient = createPublicClient({
|
|
17
|
+
chain: VIEM_CHAINS[fromChain],
|
|
18
|
+
transport: http(options.rpcUrl),
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
async bridge(amount, toChain, options = {}) {
|
|
22
|
+
const startMs = Date.now();
|
|
23
|
+
this.validateBridgeParams(amount, toChain);
|
|
24
|
+
const account = this.walletClient.account;
|
|
25
|
+
const recipient = options.destinationAddress ?? account.address;
|
|
26
|
+
const minFinalityThreshold = options.minFinalityThreshold ?? FINALITY_THRESHOLD.FAST;
|
|
27
|
+
const maxFee = options.maxFee ?? 0n;
|
|
28
|
+
const attestationApiUrl = options.attestationApiUrl ?? CIRCLE_ATTESTATION_API;
|
|
29
|
+
await this.approveUsdc(amount);
|
|
30
|
+
const burnResult = await this.depositForBurn(amount, toChain, recipient, minFinalityThreshold, maxFee);
|
|
31
|
+
const attestation = await this.pollForAttestation(burnResult.messageHash, this.fromChain, attestationApiUrl);
|
|
32
|
+
const mintTxHash = await this.receiveMessage(burnResult.messageBytes, attestation, toChain, options.destinationRpcUrl);
|
|
33
|
+
return {
|
|
34
|
+
burnTxHash: burnResult.burnTxHash,
|
|
35
|
+
mintTxHash,
|
|
36
|
+
amount,
|
|
37
|
+
fromChain: this.fromChain,
|
|
38
|
+
toChain,
|
|
39
|
+
recipient,
|
|
40
|
+
nonce: burnResult.nonce,
|
|
41
|
+
elapsedMs: Date.now() - startMs,
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
async burn(amount, toChain, options = {}) {
|
|
45
|
+
this.validateBridgeParams(amount, toChain);
|
|
46
|
+
const account = this.walletClient.account;
|
|
47
|
+
const recipient = options.destinationAddress ?? account.address;
|
|
48
|
+
const minFinalityThreshold = options.minFinalityThreshold ?? FINALITY_THRESHOLD.FAST;
|
|
49
|
+
const maxFee = options.maxFee ?? 0n;
|
|
50
|
+
await this.approveUsdc(amount);
|
|
51
|
+
return this.depositForBurn(amount, toChain, recipient, minFinalityThreshold, maxFee);
|
|
52
|
+
}
|
|
53
|
+
async waitForAttestation(messageHash, apiUrl = CIRCLE_ATTESTATION_API) {
|
|
54
|
+
return this.pollForAttestation(messageHash, this.fromChain, apiUrl);
|
|
55
|
+
}
|
|
56
|
+
async mint(messageBytes, attestation, toChain, destinationRpcUrl) {
|
|
57
|
+
return this.receiveMessage(messageBytes, attestation, toChain, destinationRpcUrl);
|
|
58
|
+
}
|
|
59
|
+
async getUsdcBalance() {
|
|
60
|
+
const account = this.walletClient.account;
|
|
61
|
+
const usdc = getContract({
|
|
62
|
+
address: USDC_CONTRACT[this.fromChain],
|
|
63
|
+
abi: ERC20BridgeAbi,
|
|
64
|
+
client: this.publicClient,
|
|
65
|
+
});
|
|
66
|
+
return usdc.read.balanceOf([account.address]);
|
|
67
|
+
}
|
|
68
|
+
async getUsdcAllowance() {
|
|
69
|
+
const account = this.walletClient.account;
|
|
70
|
+
const usdc = getContract({
|
|
71
|
+
address: USDC_CONTRACT[this.fromChain],
|
|
72
|
+
abi: ERC20BridgeAbi,
|
|
73
|
+
client: this.publicClient,
|
|
74
|
+
});
|
|
75
|
+
return usdc.read.allowance([account.address, TOKEN_MESSENGER_V2[this.fromChain]]);
|
|
76
|
+
}
|
|
77
|
+
async approveUsdc(amount) {
|
|
78
|
+
const account = this.walletClient.account;
|
|
79
|
+
const spender = TOKEN_MESSENGER_V2[this.fromChain];
|
|
80
|
+
const usdcAddress = USDC_CONTRACT[this.fromChain];
|
|
81
|
+
const usdc = getContract({ address: usdcAddress, abi: ERC20BridgeAbi, client: this.publicClient });
|
|
82
|
+
const currentAllowance = await usdc.read.allowance([account.address, spender]);
|
|
83
|
+
if (currentAllowance >= amount)
|
|
84
|
+
return;
|
|
85
|
+
const usdcWrite = getContract({
|
|
86
|
+
address: usdcAddress,
|
|
87
|
+
abi: ERC20BridgeAbi,
|
|
88
|
+
client: { public: this.publicClient, wallet: this.walletClient },
|
|
89
|
+
});
|
|
90
|
+
const approveTxHash = await usdcWrite.write.approve([spender, amount], {
|
|
91
|
+
account,
|
|
92
|
+
chain: VIEM_CHAINS[this.fromChain],
|
|
93
|
+
});
|
|
94
|
+
const approveReceipt = await this.publicClient.waitForTransactionReceipt({ hash: approveTxHash });
|
|
95
|
+
if (approveReceipt.status !== 'success') {
|
|
96
|
+
throw new BridgeError('INSUFFICIENT_ALLOWANCE', `USDC approve failed (tx: ${approveTxHash}).`);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
async depositForBurn(amount, toChain, recipient, minFinalityThreshold, maxFee) {
|
|
100
|
+
const account = this.walletClient.account;
|
|
101
|
+
const destinationDomain = CCTP_DOMAIN_IDS[toChain];
|
|
102
|
+
const messengerAddress = TOKEN_MESSENGER_V2[this.fromChain];
|
|
103
|
+
const usdcAddress = USDC_CONTRACT[this.fromChain];
|
|
104
|
+
const mintRecipient = pad(recipient, { size: 32 });
|
|
105
|
+
const destinationCaller = pad('0x0', { size: 32 });
|
|
106
|
+
const messenger = getContract({
|
|
107
|
+
address: messengerAddress,
|
|
108
|
+
abi: TokenMessengerV2Abi,
|
|
109
|
+
client: { public: this.publicClient, wallet: this.walletClient },
|
|
110
|
+
});
|
|
111
|
+
let burnTxHash;
|
|
112
|
+
try {
|
|
113
|
+
burnTxHash = await messenger.write.depositForBurn([amount, destinationDomain, mintRecipient, usdcAddress, destinationCaller, maxFee, minFinalityThreshold], { account, chain: VIEM_CHAINS[this.fromChain] });
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
117
|
+
throw new BridgeError('BURN_FAILED', `CCTP depositForBurn failed: ${msg}.`);
|
|
118
|
+
}
|
|
119
|
+
const receipt = await this.publicClient.waitForTransactionReceipt({ hash: burnTxHash });
|
|
120
|
+
if (receipt.status !== 'success') {
|
|
121
|
+
throw new BridgeError('BURN_FAILED', `depositForBurn transaction reverted (tx: ${burnTxHash}).`);
|
|
122
|
+
}
|
|
123
|
+
const { messageBytes, messageHash, nonce } = this.extractMessageSent(receipt);
|
|
124
|
+
return { burnTxHash, nonce, messageHash, messageBytes, sourceDomain: CCTP_DOMAIN_IDS[this.fromChain], destinationDomain };
|
|
125
|
+
}
|
|
126
|
+
extractMessageSent(receipt) {
|
|
127
|
+
const MESSAGE_SENT_TOPIC = '0x8c5261668696ce22758910d05bab8f186d6eb247ceac2af2e82c7dc17669b036';
|
|
128
|
+
for (const log of receipt.logs) {
|
|
129
|
+
if (log.topics[0]?.toLowerCase() === MESSAGE_SENT_TOPIC.toLowerCase()) {
|
|
130
|
+
const rawData = log.data;
|
|
131
|
+
if (rawData.length < 130)
|
|
132
|
+
continue;
|
|
133
|
+
const dataHex = rawData.slice(2);
|
|
134
|
+
const lengthHex = dataHex.slice(64, 128);
|
|
135
|
+
const messageLength = parseInt(lengthHex, 16);
|
|
136
|
+
if (messageLength === 0)
|
|
137
|
+
continue;
|
|
138
|
+
const messageBytesHex = dataHex.slice(128, 128 + messageLength * 2);
|
|
139
|
+
const messageBytes = ('0x' + messageBytesHex);
|
|
140
|
+
const messageHash = keccak256(messageBytes);
|
|
141
|
+
const nonceBytesHex = messageBytesHex.slice(24, 40);
|
|
142
|
+
const nonce = BigInt('0x' + nonceBytesHex);
|
|
143
|
+
return { messageBytes, messageHash, nonce };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
throw new BridgeError('BURN_FAILED', 'Could not find MessageSent event in burn transaction receipt.');
|
|
147
|
+
}
|
|
148
|
+
async pollForAttestation(messageHash, fromChain, apiUrl) {
|
|
149
|
+
const sourceDomain = CCTP_DOMAIN_IDS[fromChain];
|
|
150
|
+
const url = `${apiUrl}/v2/messages/${sourceDomain}/${messageHash}`;
|
|
151
|
+
for (let attempt = 0; attempt < MAX_ATTESTATION_POLLS; attempt++) {
|
|
152
|
+
let response;
|
|
153
|
+
try {
|
|
154
|
+
const res = await fetch(url, { headers: { Accept: 'application/json' } });
|
|
155
|
+
if (!res.ok) {
|
|
156
|
+
if (res.status === 404) {
|
|
157
|
+
await this.sleep(ATTESTATION_POLL_INTERVAL_MS);
|
|
158
|
+
continue;
|
|
159
|
+
}
|
|
160
|
+
const body = await res.text().catch(() => '');
|
|
161
|
+
throw new BridgeError('ATTESTATION_ERROR', `Circle API returned HTTP ${res.status}: ${body}.`);
|
|
162
|
+
}
|
|
163
|
+
response = await res.json();
|
|
164
|
+
}
|
|
165
|
+
catch (err) {
|
|
166
|
+
if (err instanceof BridgeError)
|
|
167
|
+
throw err;
|
|
168
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
169
|
+
throw new BridgeError('ATTESTATION_ERROR', `Failed to reach Circle IRIS API: ${msg}.`);
|
|
170
|
+
}
|
|
171
|
+
if (response.status === 'complete' && response.attestation)
|
|
172
|
+
return response.attestation;
|
|
173
|
+
if (response.status === 'error') {
|
|
174
|
+
throw new BridgeError('ATTESTATION_ERROR', `Circle attestation failed: ${response.error ?? 'unknown error'}.`);
|
|
175
|
+
}
|
|
176
|
+
await this.sleep(ATTESTATION_POLL_INTERVAL_MS);
|
|
177
|
+
}
|
|
178
|
+
throw new BridgeError('ATTESTATION_TIMEOUT', `Attestation not received after ${MAX_ATTESTATION_POLLS} attempts. Message hash: ${messageHash}.`);
|
|
179
|
+
}
|
|
180
|
+
async receiveMessage(messageBytes, attestation, toChain, destinationRpcUrl) {
|
|
181
|
+
const account = this.walletClient.account;
|
|
182
|
+
const transmitterAddress = MESSAGE_TRANSMITTER_V2[toChain];
|
|
183
|
+
const destChain = VIEM_CHAINS[toChain];
|
|
184
|
+
const destPublicClient = createPublicClient({ chain: destChain, transport: http(destinationRpcUrl) });
|
|
185
|
+
const transmitter = getContract({
|
|
186
|
+
address: transmitterAddress,
|
|
187
|
+
abi: MessageTransmitterV2Abi,
|
|
188
|
+
client: { public: destPublicClient, wallet: this.walletClient },
|
|
189
|
+
});
|
|
190
|
+
let mintTxHash;
|
|
191
|
+
try {
|
|
192
|
+
mintTxHash = await transmitter.write.receiveMessage([messageBytes, attestation], { account, chain: destChain });
|
|
193
|
+
}
|
|
194
|
+
catch (err) {
|
|
195
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
196
|
+
throw new BridgeError('MINT_FAILED', `CCTP receiveMessage failed on ${toChain}: ${msg}.`);
|
|
197
|
+
}
|
|
198
|
+
const mintReceipt = await destPublicClient.waitForTransactionReceipt({ hash: mintTxHash });
|
|
199
|
+
if (mintReceipt.status !== 'success') {
|
|
200
|
+
throw new BridgeError('MINT_FAILED', `receiveMessage reverted on ${toChain} (tx: ${mintTxHash}).`);
|
|
201
|
+
}
|
|
202
|
+
return mintTxHash;
|
|
203
|
+
}
|
|
204
|
+
validateBridgeParams(amount, toChain) {
|
|
205
|
+
if (amount <= 0n) {
|
|
206
|
+
throw new BridgeError('INVALID_AMOUNT', `Bridge amount must be greater than 0. Received: ${amount}.`);
|
|
207
|
+
}
|
|
208
|
+
if (!(toChain in CCTP_DOMAIN_IDS)) {
|
|
209
|
+
throw new BridgeError('UNSUPPORTED_CHAIN', `Chain '${toChain}' is not supported.`);
|
|
210
|
+
}
|
|
211
|
+
if (toChain === this.fromChain) {
|
|
212
|
+
throw new BridgeError('UNSUPPORTED_CHAIN', `Source and destination chains must be different.`);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
sleep(ms) {
|
|
216
|
+
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
export class BridgeError extends Error {
|
|
220
|
+
constructor(code, message) {
|
|
221
|
+
super(`[BridgeModule:${code}] ${message}`);
|
|
222
|
+
this.code = code;
|
|
223
|
+
this.name = 'BridgeError';
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
export function createBridge(walletClient, fromChain = 'base', options = {}) {
|
|
227
|
+
return new BridgeModule(walletClient, fromChain, options);
|
|
228
|
+
}
|
|
229
|
+
export { CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, USDC_CONTRACT, TOKEN_MESSENGER_V2, MESSAGE_TRANSMITTER_V2, FINALITY_THRESHOLD, };
|
|
230
|
+
//# sourceMappingURL=client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/bridge/client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { BridgeModule, BridgeError, createBridge, CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, USDC_CONTRACT, TOKEN_MESSENGER_V2, MESSAGE_TRANSMITTER_V2, FINALITY_THRESHOLD, } from './client.js';
|
|
2
|
+
export type { BridgeChain, BridgeOptions, BurnResult, BridgeResult, AttestationResponse, AttestationStatus, } from './types.js';
|
|
3
|
+
export { TokenMessengerV2Abi, MessageTransmitterV2Abi, ERC20BridgeAbi } from './abis.js';
|
|
4
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAAE,WAAW,EAAE,YAAY,EACvC,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAChD,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,GAC/D,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,WAAW,EAAE,aAAa,EAAE,UAAU,EAAE,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,GAC7F,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export { BridgeModule, BridgeError, createBridge, CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, USDC_CONTRACT, TOKEN_MESSENGER_V2, MESSAGE_TRANSMITTER_V2, FINALITY_THRESHOLD, } from './client.js';
|
|
2
|
+
export { TokenMessengerV2Abi, MessageTransmitterV2Abi, ERC20BridgeAbi } from './abis.js';
|
|
3
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/bridge/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAAE,WAAW,EAAE,YAAY,EACvC,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAChD,kBAAkB,EAAE,sBAAsB,EAAE,kBAAkB,GAC/D,MAAM,aAAa,CAAC;AAIrB,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import type { Address, Hash, Hex } from 'viem';
|
|
2
|
+
/** Supported bridge destination chains */
|
|
3
|
+
export type BridgeChain = 'ethereum' | 'optimism' | 'base' | 'arbitrum';
|
|
4
|
+
/** CCTP V2 domain IDs (Circle's internal chain identifiers) */
|
|
5
|
+
export declare const CCTP_DOMAIN_IDS: Record<BridgeChain, number>;
|
|
6
|
+
/** EVM chain IDs for supported bridge chains */
|
|
7
|
+
export declare const BRIDGE_CHAIN_IDS: Record<BridgeChain, number>;
|
|
8
|
+
/** USDC contract addresses per chain */
|
|
9
|
+
export declare const USDC_CONTRACT: Record<BridgeChain, Address>;
|
|
10
|
+
/**
|
|
11
|
+
* CCTP V2 TokenMessengerV2 addresses (source chain — where burn happens).
|
|
12
|
+
*/
|
|
13
|
+
export declare const TOKEN_MESSENGER_V2: Record<BridgeChain, Address>;
|
|
14
|
+
/** CCTP V2 MessageTransmitterV2 addresses (destination chain — where mint happens) */
|
|
15
|
+
export declare const MESSAGE_TRANSMITTER_V2: Record<BridgeChain, Address>;
|
|
16
|
+
/**
|
|
17
|
+
* CCTP V2 minFinalityThreshold values.
|
|
18
|
+
* - FAST (0): ~12 seconds. Circle fast attestation.
|
|
19
|
+
* - FINALIZED (1000): Full on-chain finality.
|
|
20
|
+
*/
|
|
21
|
+
export declare const FINALITY_THRESHOLD: {
|
|
22
|
+
readonly FAST: 0;
|
|
23
|
+
readonly FINALIZED: 1000;
|
|
24
|
+
};
|
|
25
|
+
/** Circle IRIS attestation API base URL */
|
|
26
|
+
export declare const CIRCLE_ATTESTATION_API = "https://iris-api.circle.com";
|
|
27
|
+
/** Max attestation polling attempts before timeout */
|
|
28
|
+
export declare const MAX_ATTESTATION_POLLS = 60;
|
|
29
|
+
/** Polling interval for attestation (milliseconds) */
|
|
30
|
+
export declare const ATTESTATION_POLL_INTERVAL_MS = 5000;
|
|
31
|
+
/** Options for a bridge operation */
|
|
32
|
+
export interface BridgeOptions {
|
|
33
|
+
minFinalityThreshold?: number;
|
|
34
|
+
maxFee?: bigint;
|
|
35
|
+
destinationAddress?: Address;
|
|
36
|
+
destinationRpcUrl?: string;
|
|
37
|
+
attestationApiUrl?: string;
|
|
38
|
+
}
|
|
39
|
+
/** Result of a bridge.burn() operation */
|
|
40
|
+
export interface BurnResult {
|
|
41
|
+
burnTxHash: Hash;
|
|
42
|
+
nonce: bigint;
|
|
43
|
+
messageHash: Hex;
|
|
44
|
+
messageBytes: Hex;
|
|
45
|
+
sourceDomain: number;
|
|
46
|
+
destinationDomain: number;
|
|
47
|
+
}
|
|
48
|
+
/** Circle attestation status */
|
|
49
|
+
export type AttestationStatus = 'pending_confirmations' | 'complete' | 'error';
|
|
50
|
+
/** Circle IRIS API response for an attestation */
|
|
51
|
+
export interface AttestationResponse {
|
|
52
|
+
status: AttestationStatus;
|
|
53
|
+
attestation: Hex | null;
|
|
54
|
+
error?: string;
|
|
55
|
+
}
|
|
56
|
+
/** Result of the full bridge() operation */
|
|
57
|
+
export interface BridgeResult {
|
|
58
|
+
burnTxHash: Hash;
|
|
59
|
+
mintTxHash: Hash;
|
|
60
|
+
amount: bigint;
|
|
61
|
+
fromChain: BridgeChain;
|
|
62
|
+
toChain: BridgeChain;
|
|
63
|
+
recipient: Address;
|
|
64
|
+
nonce: bigint;
|
|
65
|
+
elapsedMs: number;
|
|
66
|
+
}
|
|
67
|
+
/** Error codes for actionable bridge error messages */
|
|
68
|
+
export type BridgeErrorCode = 'UNSUPPORTED_CHAIN' | 'INSUFFICIENT_ALLOWANCE' | 'INSUFFICIENT_BALANCE' | 'BURN_FAILED' | 'ATTESTATION_TIMEOUT' | 'ATTESTATION_ERROR' | 'MINT_FAILED' | 'INVALID_AMOUNT' | 'NO_WALLET_CLIENT';
|
|
69
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/bridge/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,MAAM,CAAC;AAE/C,0CAA0C;AAC1C,MAAM,MAAM,WAAW,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,UAAU,CAAC;AAExE,+DAA+D;AAC/D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAKvD,CAAC;AAEF,gDAAgD;AAChD,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,WAAW,EAAE,MAAM,CAKxD,CAAC;AAEF,wCAAwC;AACxC,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CAKtD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CAK3D,CAAC;AAEF,sFAAsF;AACtF,eAAO,MAAM,sBAAsB,EAAE,MAAM,CAAC,WAAW,EAAE,OAAO,CAK/D,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,kBAAkB;;;CAGrB,CAAC;AAEX,2CAA2C;AAC3C,eAAO,MAAM,sBAAsB,gCAAgC,CAAC;AACpE,sDAAsD;AACtD,eAAO,MAAM,qBAAqB,KAAK,CAAC;AACxC,sDAAsD;AACtD,eAAO,MAAM,4BAA4B,OAAO,CAAC;AAEjD,qCAAqC;AACrC,MAAM,WAAW,aAAa;IAC5B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,0CAA0C;AAC1C,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,GAAG,CAAC;IACjB,YAAY,EAAE,GAAG,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,gCAAgC;AAChC,MAAM,MAAM,iBAAiB,GAAG,uBAAuB,GAAG,UAAU,GAAG,OAAO,CAAC;AAE/E,kDAAkD;AAClD,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,iBAAiB,CAAC;IAC1B,WAAW,EAAE,GAAG,GAAG,IAAI,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,4CAA4C;AAC5C,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,IAAI,CAAC;IACjB,UAAU,EAAE,IAAI,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,WAAW,CAAC;IACvB,OAAO,EAAE,WAAW,CAAC;IACrB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,uDAAuD;AACvD,MAAM,MAAM,eAAe,GACvB,mBAAmB,GACnB,wBAAwB,GACxB,sBAAsB,GACtB,aAAa,GACb,qBAAqB,GACrB,mBAAmB,GACnB,aAAa,GACb,gBAAgB,GAChB,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/** CCTP V2 domain IDs (Circle's internal chain identifiers) */
|
|
2
|
+
export const CCTP_DOMAIN_IDS = {
|
|
3
|
+
ethereum: 0,
|
|
4
|
+
optimism: 2,
|
|
5
|
+
arbitrum: 3,
|
|
6
|
+
base: 6,
|
|
7
|
+
};
|
|
8
|
+
/** EVM chain IDs for supported bridge chains */
|
|
9
|
+
export const BRIDGE_CHAIN_IDS = {
|
|
10
|
+
ethereum: 1,
|
|
11
|
+
optimism: 10,
|
|
12
|
+
arbitrum: 42161,
|
|
13
|
+
base: 8453,
|
|
14
|
+
};
|
|
15
|
+
/** USDC contract addresses per chain */
|
|
16
|
+
export const USDC_CONTRACT = {
|
|
17
|
+
base: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',
|
|
18
|
+
ethereum: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',
|
|
19
|
+
optimism: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',
|
|
20
|
+
arbitrum: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* CCTP V2 TokenMessengerV2 addresses (source chain — where burn happens).
|
|
24
|
+
*/
|
|
25
|
+
export const TOKEN_MESSENGER_V2 = {
|
|
26
|
+
base: '0x8FD3bCdFd9987D7F3C86b67D2f25Dd4e82C80b2B',
|
|
27
|
+
ethereum: '0xbd3fa81b58ba92a82136038b25adec7066af3155',
|
|
28
|
+
optimism: '0x28Bc09B4EFdA1E348a97cA91F16CC43adFF2f50d',
|
|
29
|
+
arbitrum: '0x19330d10D9Cc8751218eaf51E8885D058642E08A',
|
|
30
|
+
};
|
|
31
|
+
/** CCTP V2 MessageTransmitterV2 addresses (destination chain — where mint happens) */
|
|
32
|
+
export const MESSAGE_TRANSMITTER_V2 = {
|
|
33
|
+
base: '0xE737e5cEBEEBa77EFE7EcB0cd46C6b9c1Ce1e8b3',
|
|
34
|
+
ethereum: '0xE737e5cEBEEBa77EFE7EcB0cd46C6b9c1Ce1e8b3',
|
|
35
|
+
optimism: '0xE737e5cEBEEBa77EFE7EcB0cd46C6b9c1Ce1e8b3',
|
|
36
|
+
arbitrum: '0xE737e5cEBEEBa77EFE7EcB0cd46C6b9c1Ce1e8b3',
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* CCTP V2 minFinalityThreshold values.
|
|
40
|
+
* - FAST (0): ~12 seconds. Circle fast attestation.
|
|
41
|
+
* - FINALIZED (1000): Full on-chain finality.
|
|
42
|
+
*/
|
|
43
|
+
export const FINALITY_THRESHOLD = {
|
|
44
|
+
FAST: 0,
|
|
45
|
+
FINALIZED: 1000,
|
|
46
|
+
};
|
|
47
|
+
/** Circle IRIS attestation API base URL */
|
|
48
|
+
export const CIRCLE_ATTESTATION_API = 'https://iris-api.circle.com';
|
|
49
|
+
/** Max attestation polling attempts before timeout */
|
|
50
|
+
export const MAX_ATTESTATION_POLLS = 60;
|
|
51
|
+
/** Polling interval for attestation (milliseconds) */
|
|
52
|
+
export const ATTESTATION_POLL_INTERVAL_MS = 5000;
|
|
53
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/bridge/types.ts"],"names":[],"mappings":"AAKA,+DAA+D;AAC/D,MAAM,CAAC,MAAM,eAAe,GAAgC;IAC1D,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,CAAC;IACX,IAAI,EAAE,CAAC;CACR,CAAC;AAEF,gDAAgD;AAChD,MAAM,CAAC,MAAM,gBAAgB,GAAgC;IAC3D,QAAQ,EAAE,CAAC;IACX,QAAQ,EAAE,EAAE;IACZ,QAAQ,EAAE,KAAK;IACf,IAAI,EAAE,IAAI;CACX,CAAC;AAEF,wCAAwC;AACxC,MAAM,CAAC,MAAM,aAAa,GAAiC;IACzD,IAAI,EAAE,4CAA4C;IAClD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;CACvD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAiC;IAC9D,IAAI,EAAE,4CAA4C;IAClD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;CACvD,CAAC;AAEF,sFAAsF;AACtF,MAAM,CAAC,MAAM,sBAAsB,GAAiC;IAClE,IAAI,EAAE,4CAA4C;IAClD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;IACtD,QAAQ,EAAE,4CAA4C;CACvD,CAAC;AAEF;;;;GAIG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,IAAI,EAAE,CAAC;IACP,SAAS,EAAE,IAAI;CACP,CAAC;AAEX,2CAA2C;AAC3C,MAAM,CAAC,MAAM,sBAAsB,GAAG,6BAA6B,CAAC;AACpE,sDAAsD;AACtD,MAAM,CAAC,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACxC,sDAAsD;AACtD,MAAM,CAAC,MAAM,4BAA4B,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import type { WalletClient } from 'viem';
|
|
2
|
+
import type { Keypair } from '@solana/web3.js';
|
|
3
|
+
import { BridgeError } from './client.js';
|
|
4
|
+
import type { BridgeChain, BridgeResult } from './types.js';
|
|
5
|
+
import { type CCTPSupportedChain, type BridgeQuote, CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, BRIDGE_RPC_URLS, calcBridgeFee } from './types.js';
|
|
6
|
+
import { SolanaBridgeError } from '../solana/bridge.js';
|
|
7
|
+
export interface UnifiedBridgeConfig {
|
|
8
|
+
/** EVM wallet client (required for any EVM source chain) */
|
|
9
|
+
evmSigner?: WalletClient;
|
|
10
|
+
/** Solana keypair (required when Solana is source) */
|
|
11
|
+
solanaWallet?: Keypair;
|
|
12
|
+
/** Solana RPC URL (default: mainnet-beta public) */
|
|
13
|
+
solanaRpcUrl?: string;
|
|
14
|
+
/** Override EVM RPC URLs per chain */
|
|
15
|
+
evmRpcOverrides?: Partial<Record<BridgeChain, string>>;
|
|
16
|
+
/** Circle attestation API override */
|
|
17
|
+
attestationApiUrl?: string;
|
|
18
|
+
/** Platform fee wallet address (future: fee collection) */
|
|
19
|
+
feeWallet?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface UnifiedBridgeParams {
|
|
22
|
+
/** USDC amount in base units (6 decimals). 1 USDC = 1_000_000 */
|
|
23
|
+
amount: bigint;
|
|
24
|
+
/** Source chain */
|
|
25
|
+
sourceChain: CCTPSupportedChain;
|
|
26
|
+
/** Destination chain */
|
|
27
|
+
destinationChain: CCTPSupportedChain;
|
|
28
|
+
/** Recipient address (hex for EVM, base58 for Solana destination) */
|
|
29
|
+
destinationAddress: string;
|
|
30
|
+
/** Finality: 0 = fast (~20s), 1000 = finalized (~15min) */
|
|
31
|
+
minFinalityThreshold?: number;
|
|
32
|
+
/** Apply 0.1% platform fee (default: true) */
|
|
33
|
+
applyPlatformFee?: boolean;
|
|
34
|
+
/** Override destination RPC URL */
|
|
35
|
+
destinationRpcUrl?: string;
|
|
36
|
+
}
|
|
37
|
+
export type { BridgeResult, BridgeQuote, CCTPSupportedChain };
|
|
38
|
+
/**
|
|
39
|
+
* UnifiedBridge — Cross-chain USDC bridge across all 17 CCTP V2 supported chains.
|
|
40
|
+
*
|
|
41
|
+
* Routing:
|
|
42
|
+
* - EVM → EVM: BridgeModule (approve → burn → attest → mint)
|
|
43
|
+
* - EVM → Solana: BridgeModule burn + SolanaCCTPBridge receive
|
|
44
|
+
* - Solana → EVM: SolanaCCTPBridge burn + EVM receiveMessage
|
|
45
|
+
* - Solana → Solana: throws (use native Solana transfer instead)
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```ts
|
|
49
|
+
* import { UnifiedBridge } from 'agentwallet-sdk';
|
|
50
|
+
* import { createWalletClient } from 'viem';
|
|
51
|
+
*
|
|
52
|
+
* const bridge = new UnifiedBridge({ evmSigner });
|
|
53
|
+
*
|
|
54
|
+
* // Bridge 1 USDC from Base to Polygon
|
|
55
|
+
* const result = await bridge.bridge({
|
|
56
|
+
* amount: 1_000_000n,
|
|
57
|
+
* sourceChain: 'base',
|
|
58
|
+
* destinationChain: 'polygon',
|
|
59
|
+
* destinationAddress: '0x...',
|
|
60
|
+
* });
|
|
61
|
+
* console.log(bridge.getSupportedChains()); // 17 chains!
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export declare class UnifiedBridge {
|
|
65
|
+
private readonly config;
|
|
66
|
+
private readonly solanaConnection;
|
|
67
|
+
constructor(config?: UnifiedBridgeConfig);
|
|
68
|
+
/**
|
|
69
|
+
* Bridge USDC between any two CCTP V2 supported chains.
|
|
70
|
+
* Routes automatically based on source/destination chain types.
|
|
71
|
+
*/
|
|
72
|
+
bridge(params: UnifiedBridgeParams): Promise<BridgeResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Get all supported chains (16 EVM + Solana = 17 total).
|
|
75
|
+
*/
|
|
76
|
+
getSupportedChains(): CCTPSupportedChain[];
|
|
77
|
+
/**
|
|
78
|
+
* Get a bridge quote: fee breakdown + estimated time.
|
|
79
|
+
*/
|
|
80
|
+
getQuote(params: {
|
|
81
|
+
amount: bigint;
|
|
82
|
+
sourceChain: CCTPSupportedChain;
|
|
83
|
+
destinationChain: CCTPSupportedChain;
|
|
84
|
+
}): BridgeQuote;
|
|
85
|
+
/**
|
|
86
|
+
* Check if a route is supported.
|
|
87
|
+
*/
|
|
88
|
+
isRouteSupported(source: CCTPSupportedChain, destination: CCTPSupportedChain): boolean;
|
|
89
|
+
private bridgeEvmToEvm;
|
|
90
|
+
private bridgeSolanaToEvm;
|
|
91
|
+
private bridgeEvmToSolana;
|
|
92
|
+
private validateParams;
|
|
93
|
+
/**
|
|
94
|
+
* Convert a Solana base58 address to a 32-byte hex string for EVM mintRecipient.
|
|
95
|
+
* Per Circle docs: hex-encoded USDC token account address.
|
|
96
|
+
*/
|
|
97
|
+
private solanaAddressToHex;
|
|
98
|
+
}
|
|
99
|
+
export { BridgeError, SolanaBridgeError };
|
|
100
|
+
export { CCTP_DOMAIN_IDS, BRIDGE_CHAIN_IDS, BRIDGE_RPC_URLS, calcBridgeFee, };
|
|
101
|
+
//# sourceMappingURL=unified.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unified.d.ts","sourceRoot":"","sources":["../../src/bridge/unified.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,MAAM,CAAC;AACzC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAC;AAE/C,OAAO,EAAgB,WAAW,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC5D,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,WAAW,EAChB,eAAe,EACf,gBAAgB,EAChB,eAAe,EAEf,aAAa,EAGd,MAAM,YAAY,CAAC;AACpB,OAAO,EAAoB,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAI1E,MAAM,WAAW,mBAAmB;IAClC,4DAA4D;IAC5D,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,sDAAsD;IACtD,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,oDAAoD;IACpD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sCAAsC;IACtC,eAAe,CAAC,EAAE,OAAO,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,sCAAsC;IACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,mBAAmB;IAClC,iEAAiE;IACjE,MAAM,EAAE,MAAM,CAAC;IACf,mBAAmB;IACnB,WAAW,EAAE,kBAAkB,CAAC;IAChC,wBAAwB;IACxB,gBAAgB,EAAE,kBAAkB,CAAC;IACrC,qEAAqE;IACrE,kBAAkB,EAAE,MAAM,CAAC;IAC3B,2DAA2D;IAC3D,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,8CAA8C;IAC9C,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,mCAAmC;IACnC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;AAI9D;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsB;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAa;gBAElC,MAAM,GAAE,mBAAwB;IAU5C;;;OAGG;IACG,MAAM,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAAC,YAAY,CAAC;IA4DhE;;OAEG;IACH,kBAAkB,IAAI,kBAAkB,EAAE;IAI1C;;OAEG;IACH,QAAQ,CAAC,MAAM,EAAE;QACf,MAAM,EAAE,MAAM,CAAC;QACf,WAAW,EAAE,kBAAkB,CAAC;QAChC,gBAAgB,EAAE,kBAAkB,CAAC;KACtC,GAAG,WAAW;IAuBf;;OAEG;IACH,gBAAgB,CAAC,MAAM,EAAE,kBAAkB,EAAE,WAAW,EAAE,kBAAkB,GAAG,OAAO;YAQxE,cAAc;YAmCd,iBAAiB;YA4EjB,iBAAiB;IAoF/B,OAAO,CAAC,cAAc;IAsCtB;;;OAGG;IACH,OAAO,CAAC,kBAAkB;CAkB3B;AAID,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,CAAC;AAC1C,OAAO,EACL,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,aAAa,GACd,CAAC"}
|