@continuumdao/ctm-mpc-defi 0.2.57 → 0.2.58
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/agent/catalog.cjs +446 -38
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +212 -3
- package/dist/agent/catalog.js +436 -39
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/circle-cctp/SKILL.md +1 -1
- package/dist/agent/skills/railgun/SKILL.md +39 -0
- package/dist/protocols/evm/circle-cctp/index.cjs +5 -3
- package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.d.ts +3 -1
- package/dist/protocols/evm/circle-cctp/index.js +5 -4
- package/dist/protocols/evm/circle-cctp/index.js.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.cjs +1 -1
- package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.d.ts +1 -1
- package/dist/protocols/evm/continuum-dao/index.js +1 -1
- package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
- package/dist/protocols/evm/railgun/index.cjs +1261 -0
- package/dist/protocols/evm/railgun/index.cjs.map +1 -0
- package/dist/protocols/evm/railgun/index.d.ts +294 -0
- package/dist/protocols/evm/railgun/index.js +1218 -0
- package/dist/protocols/evm/railgun/index.js.map +1 -0
- package/package.json +17 -1
|
@@ -33,7 +33,7 @@ After `{ requestId }`: `sign_request_agree` → `trigger_sign_result` → `broad
|
|
|
33
33
|
| `sourceChainId` | yes | EIP-155 id where burn executes |
|
|
34
34
|
| `destChainId` | yes | EIP-155 destination (mint chain) |
|
|
35
35
|
| `transferAmountHuman` | yes for a usable maxFee | USDC the recipient receives (6 decimals). Protocol fee is this amount times Iris `minimumFee` bps. Omit only to inspect raw forwarding tiers. |
|
|
36
|
-
| `feeTier` | no | `low` \| `med`
|
|
36
|
+
| `feeTier` | no | `low` \| `med` \| `high` (default) |
|
|
37
37
|
| `minFinalityThreshold` | no | `1000` fast (default, has protocol fee) or `2000` standard |
|
|
38
38
|
|
|
39
39
|
`maxFee = forwardFee[tier] + protocolFee`. `forwardFee*` is the Forwarding Service component only. `maxFeeLow` / `Med` / `High` are the combined caps. Returns `fees` plus the same fields at the top level, including `protocolFeeHuman`, `minimumFeeBps`, and `totalBurnHuman` when an amount was passed. Pass that output as `feeSnapshot` to build and balance tools. Do not add `minimumFee` again on top of `maxFee`.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: railgun
|
|
3
|
+
description: Shield public ERC-20s into the Railgun wallet stored on the KeyGen. Private transfer and unshield need the KeyGen signing quorum.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Railgun (MCP)
|
|
7
|
+
|
|
8
|
+
Railgun does not publish a token allowlist. Any standard ERC-20 on a deployed chain can be shielded, except CTM. CTM is off until a broadcaster quotes it: do not shield, privately transfer, or unshield CTM, and do not treat it as a supported Railgun token. The asset-row icon is the top 5 ERC-20s in the latest indexed Shield events. That read does not scan chain logs. Railgun is not deployed on Linea.
|
|
9
|
+
|
|
10
|
+
Use `get_defi_protocol_supported_chains` for deployed chains. Contract addresses come from Railgun `NETWORK_CONFIG`. Do not invent chain ids or token lists.
|
|
11
|
+
|
|
12
|
+
The 0zk address and its balances are stored on the KeyGen record. Each node holds a viewing key, so the node agent and Telegram can scan balances. The spending key is split into shares at the KeyGen signing quorum. No node can spend the 0zk wallet by itself. Do not ask the user to unlock a browser wallet, and do not pass a mnemonic, viewing key, or encryption key.
|
|
13
|
+
|
|
14
|
+
## Tools
|
|
15
|
+
|
|
16
|
+
| Intent | Tool |
|
|
17
|
+
|--------|------|
|
|
18
|
+
| Create the KeyGen Railgun wallet, or read its 0zk address | `ctm_railgun_ensure_wallet` |
|
|
19
|
+
| Public tokens that show the Railgun icon | `ctm_railgun_fetch_popular_assets` |
|
|
20
|
+
| This KeyGen's shielded balances | `ctm_railgun_fetch_private_balances` |
|
|
21
|
+
| Shield a public ERC-20 into the 0zk address | `ctm_railgun_build_shield_multisign` |
|
|
22
|
+
| Start a private transfer | `ctm_railgun_private_transfer` |
|
|
23
|
+
| Start an unshield to a public address | `ctm_railgun_unshield` |
|
|
24
|
+
| Agree this node's share of a pending spend | `ctm_railgun_agree_spend` |
|
|
25
|
+
|
|
26
|
+
Call `ctm_railgun_ensure_wallet` first. Use the returned `railgunAddress` as the shield recipient. Call `ctm_railgun_fetch_private_balances` before an unshield or private transfer. Pass `refresh: true` when the stored scan may be stale. If `walletConfigured` is false, call `ctm_railgun_ensure_wallet` and then fetch again.
|
|
27
|
+
|
|
28
|
+
`ctm_railgun_fetch_popular_assets` is the public icon list, not the shielded holdings.
|
|
29
|
+
|
|
30
|
+
## Shield
|
|
31
|
+
|
|
32
|
+
1. Call `ctm_railgun_build_shield_multisign` without `shieldSignature`, with `railgunAddress` from `ctm_railgun_ensure_wallet`. Submit that personal_sign request.
|
|
33
|
+
2. Call the same tool again with `shieldSignature` set to the completed signature. Submit the resulting approve-and-shield transaction.
|
|
34
|
+
|
|
35
|
+
The first call signs Railgun's shield message. The second call builds the EVM shield. If allowance is short, the second call includes an approve, and a zero-approve reset when a non-zero allowance is still too small. Shielding spends the KeyGen threshold key, not the 0zk spending key.
|
|
36
|
+
|
|
37
|
+
## Private transfer and unshield
|
|
38
|
+
|
|
39
|
+
These start a pending spend and agree this node's share. The response is `pending` until `approvals` reaches `quorum`. Tell the user the `spendId` and ask an operator on each other KeyGen node to call `ctm_railgun_agree_spend` with that id. When the quorum is reached, the node that started the spend builds the proof and discards the spending key. A later balance scan shows the result. Unshield defaults the recipient to the KeyGen Ethereum address.
|
|
@@ -139,6 +139,7 @@ var CCTP_EVM_CHAINS = [
|
|
|
139
139
|
label: "Arc Testnet"
|
|
140
140
|
}
|
|
141
141
|
];
|
|
142
|
+
var CCTP_DEFAULT_FEE_TIER = "high";
|
|
142
143
|
function cctpChainConfig(chainId) {
|
|
143
144
|
return CCTP_EVM_CHAINS.find((c) => c.chainId === chainId) ?? null;
|
|
144
145
|
}
|
|
@@ -259,7 +260,7 @@ function selectCctpIrisFeeRow(rows, finalityThreshold) {
|
|
|
259
260
|
return match ?? rows[0] ?? {};
|
|
260
261
|
}
|
|
261
262
|
async function fetchCctpBurnFees(args) {
|
|
262
|
-
const tier = args.feeTier ??
|
|
263
|
+
const tier = args.feeTier ?? CCTP_DEFAULT_FEE_TIER;
|
|
263
264
|
const finalityThreshold = args.minFinalityThreshold ?? CCTP_DEFAULT_MIN_FINALITY_THRESHOLD;
|
|
264
265
|
const base = irisApiBaseForChainId(args.sourceChainId);
|
|
265
266
|
const url = `${base}/v2/burn/USDC/fees/${args.sourceDomain}/${args.destDomain}?forward=true`;
|
|
@@ -699,7 +700,7 @@ async function buildEvmMultisignBodyCctpBurnBatch(args) {
|
|
|
699
700
|
tokenMessenger: viem.getAddress(src.tokenMessenger),
|
|
700
701
|
minFinalityThreshold: minFinality,
|
|
701
702
|
proposalMaxFee,
|
|
702
|
-
feeTier: args.feeTier ??
|
|
703
|
+
feeTier: args.feeTier ?? CCTP_DEFAULT_FEE_TIER
|
|
703
704
|
});
|
|
704
705
|
const transferHuman = args.transferAmountHuman.trim();
|
|
705
706
|
const totalBurn = transferAmount + maxFee;
|
|
@@ -943,7 +944,7 @@ function cctpFeeSummaryFromBodyForSign(bodyForSign) {
|
|
|
943
944
|
const transferAmountHuman = formatCctpUsdcHuman(transferAmount);
|
|
944
945
|
const maxFeeHuman = formatCctpUsdcHuman(maxFee);
|
|
945
946
|
const totalBurnHuman = formatCctpUsdcHuman(totalBurn);
|
|
946
|
-
const tier = cctpBurn.feeTier ??
|
|
947
|
+
const tier = cctpBurn.feeTier ?? CCTP_DEFAULT_FEE_TIER;
|
|
947
948
|
const src = cctpChainConfig(cctpBurn.sourceChainId);
|
|
948
949
|
const dst = cctpChainConfig(cctpBurn.destChainId);
|
|
949
950
|
const routePart = src && dst ? ` Route: ${src.label} \u2192 ${dst.label}.` : "";
|
|
@@ -1103,6 +1104,7 @@ var circleCctpProtocolModule = {
|
|
|
1103
1104
|
};
|
|
1104
1105
|
registerProtocolModule(circleCctpProtocolModule);
|
|
1105
1106
|
|
|
1107
|
+
exports.CCTP_DEFAULT_FEE_TIER = CCTP_DEFAULT_FEE_TIER;
|
|
1106
1108
|
exports.CCTP_DEFAULT_MIN_FINALITY_THRESHOLD = CCTP_DEFAULT_MIN_FINALITY_THRESHOLD;
|
|
1107
1109
|
exports.CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS = CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS;
|
|
1108
1110
|
exports.CCTP_ERC20_APPROVE_FALLBACK_GAS = CCTP_ERC20_APPROVE_FALLBACK_GAS;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/protocols/evm/circle-cctp/constants.ts","../../../../src/protocols/evm/circle-cctp/support.ts","../../../../src/protocols/evm/circle-cctp/fees.ts","../../../../src/protocols/evm/circle-cctp/format.ts","../../../../src/core/defiEvmClient.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/circle-cctp/prechecks.ts","../../../../src/protocols/evm/circle-cctp/multisign.ts","../../../../src/protocols/evm/circle-cctp/executeHelpers.ts","../../../../src/protocols/evm/circle-cctp/reads.ts","../../../../src/protocols/evm/circle-cctp/index.ts"],"names":["n","getAddress","formatUnits","http","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","parseAbi","parseUnits","pad","encodeFunctionData","t","erc20BalanceAbi"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** Circle CCTP V2 + Forwarding Service — shared constants. */\n\nexport const CIRCLE_CCTP_PROTOCOL_ID = 'circle-cctp'\n\nexport const IRIS_API_MAINNET = 'https://iris-api.circle.com'\nexport const IRIS_API_SANDBOX = 'https://iris-api-sandbox.circle.com'\n\n/** EVM mainnet TokenMessengerV2 (most chains). */\nexport const TOKEN_MESSENGER_V2_MAINNET = '0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d' as const\n/** EVM testnet TokenMessengerV2. */\nexport const TOKEN_MESSENGER_V2_TESTNET = '0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA' as const\n\n/**\n * Forwarding Service hook: magic \"cctp-forward\" + version 0 + additional length 0.\n * @see https://developers.circle.com/cctp/concepts/forwarding-service\n */\nexport const FORWARDING_SERVICE_HOOK_DATA =\n '0x636374702d666f72776172640000000000000000000000000000000000000000' as const\n\n/** Fast Transfer finality threshold (Circle docs use 1000). */\nexport const CCTP_DEFAULT_MIN_FINALITY_THRESHOLD = 1000\n\nexport const CCTP_USDC_DECIMALS = 6\n\nexport const CCTP_ERC20_APPROVE_FALLBACK_GAS = 100_000n\nexport const CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS = 350_000n\n\nexport type CctpNetworkKind = 'mainnet' | 'testnet'\n\nexport type CctpChainConfig = {\n chainId: number\n domain: number\n network: CctpNetworkKind\n usdc: `0x${string}`\n tokenMessenger: `0x${string}`\n label: string\n}\n\n/** Supported CCTP EVM chains (source or destination). */\nexport const CCTP_EVM_CHAINS: readonly CctpChainConfig[] = [\n {\n chainId: 1,\n domain: 0,\n network: 'mainnet',\n usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Ethereum',\n },\n {\n chainId: 43114,\n domain: 1,\n network: 'mainnet',\n usdc: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Avalanche',\n },\n {\n chainId: 10,\n domain: 2,\n network: 'mainnet',\n usdc: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'OP Mainnet',\n },\n {\n chainId: 42161,\n domain: 3,\n network: 'mainnet',\n usdc: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Arbitrum',\n },\n {\n chainId: 8453,\n domain: 6,\n network: 'mainnet',\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Base',\n },\n {\n chainId: 137,\n domain: 7,\n network: 'mainnet',\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Polygon PoS',\n },\n {\n chainId: 11155111,\n domain: 0,\n network: 'testnet',\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Ethereum Sepolia',\n },\n {\n chainId: 43113,\n domain: 1,\n network: 'testnet',\n usdc: '0x5425890298aed601595a70AB815c96711a31Bc65',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Avalanche Fuji',\n },\n {\n chainId: 11155420,\n domain: 2,\n network: 'testnet',\n usdc: '0x5fd84259d66Cd46123540766Be93DFE6D43130D7',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'OP Sepolia',\n },\n {\n chainId: 421614,\n domain: 3,\n network: 'testnet',\n usdc: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Arbitrum Sepolia',\n },\n {\n chainId: 84532,\n domain: 6,\n network: 'testnet',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Base Sepolia',\n },\n {\n chainId: 80002,\n domain: 7,\n network: 'testnet',\n usdc: '0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Polygon Amoy',\n },\n {\n chainId: 5042,\n domain: 26,\n network: 'mainnet',\n usdc: '0x3600000000000000000000000000000000000000',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Arc',\n },\n {\n chainId: 5042002,\n domain: 26,\n network: 'testnet',\n usdc: '0x3600000000000000000000000000000000000000',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Arc Testnet',\n },\n] as const\n\nexport type CctpFeeTier = 'low' | 'med' | 'high'\n","import { getAddress } from 'viem'\nimport {\n CCTP_EVM_CHAINS,\n IRIS_API_MAINNET,\n IRIS_API_SANDBOX,\n type CctpChainConfig,\n type CctpNetworkKind,\n} from './constants.js'\n\nexport function cctpChainConfig(chainId: number): CctpChainConfig | null {\n return CCTP_EVM_CHAINS.find((c) => c.chainId === chainId) ?? null\n}\n\n/** Parse EIP-155 / decimal / 0x hex chain id for CCTP lookups. */\nexport function parseCctpEvmChainId(chainId: number | string): number {\n if (typeof chainId === 'number') {\n return Number.isFinite(chainId) ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const n = Number.parseInt(t.slice('eip155:'.length).trim(), 10)\n return Number.isFinite(n) ? n : Number.NaN\n }\n if (low.startsWith('0x')) {\n const n = Number.parseInt(t, 16)\n return Number.isFinite(n) ? n : Number.NaN\n }\n const n = Number.parseInt(t, 10)\n return Number.isFinite(n) ? n : Number.NaN\n}\n\nexport function isCctpSourceChainSupported(chainId: number | string): boolean {\n const n = parseCctpEvmChainId(chainId)\n return Number.isFinite(n) && cctpChainConfig(n) != null\n}\n\nexport function cctpCanonicalUsdcAddress(chainId: number | string): `0x${string}` | null {\n const n = parseCctpEvmChainId(chainId)\n if (!Number.isFinite(n)) return null\n const raw = cctpChainConfig(n)?.usdc\n if (!raw) return null\n try {\n return getAddress(raw)\n } catch {\n return null\n }\n}\n\n/** True when `contractAddress` is native Circle USDC on a supported CCTP source chain. */\nexport function isCctpCanonicalUsdcRow(chainId: number | string, contractAddress: string): boolean {\n const n = parseCctpEvmChainId(chainId)\n if (!Number.isFinite(n)) return false\n const canonical = cctpCanonicalUsdcAddress(n)\n if (!canonical) return false\n try {\n return getAddress(contractAddress as `0x${string}`).toLowerCase() === canonical.toLowerCase()\n } catch {\n return false\n }\n}\n\nexport function chainIdToDomain(chainId: number): number | null {\n return cctpChainConfig(chainId)?.domain ?? null\n}\n\nexport function domainToChainId(domain: number, network: CctpNetworkKind): number | null {\n const row = CCTP_EVM_CHAINS.find((c) => c.domain === domain && c.network === network)\n return row?.chainId ?? null\n}\n\nexport function isCctpRouteSupported(sourceChainId: number, destChainId: number): boolean {\n const src = cctpChainConfig(sourceChainId)\n const dst = cctpChainConfig(destChainId)\n if (!src || !dst) return false\n if (src.network !== dst.network) return false\n if (src.chainId === dst.chainId) return false\n return true\n}\n\nexport function irisApiBaseForChainId(chainId: number): string {\n const cfg = cctpChainConfig(chainId)\n if (!cfg) throw new Error(`Chain ${chainId} is not a supported CCTP EVM chain.`)\n return cfg.network === 'mainnet' ? IRIS_API_MAINNET : IRIS_API_SANDBOX\n}\n\nexport function cctpSupportedRoutes(network?: CctpNetworkKind): Array<{\n sourceChainId: number\n destChainId: number\n sourceDomain: number\n destDomain: number\n sourceLabel: string\n destLabel: string\n network: CctpNetworkKind\n}> {\n const chains = network ? CCTP_EVM_CHAINS.filter((c) => c.network === network) : [...CCTP_EVM_CHAINS]\n const out: Array<{\n sourceChainId: number\n destChainId: number\n sourceDomain: number\n destDomain: number\n sourceLabel: string\n destLabel: string\n network: CctpNetworkKind\n }> = []\n for (const src of chains) {\n for (const dst of chains) {\n if (src.chainId === dst.chainId) continue\n if (src.network !== dst.network) continue\n out.push({\n sourceChainId: src.chainId,\n destChainId: dst.chainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n sourceLabel: src.label,\n destLabel: dst.label,\n network: src.network,\n })\n }\n }\n return out\n}\n","import { CCTP_DEFAULT_MIN_FINALITY_THRESHOLD, type CctpFeeTier } from './constants.js'\nimport { irisApiBaseForChainId } from './support.js'\n\nexport type CctpBurnFeesResult = {\n sourceDomain: number\n destDomain: number\n /** Iris row used for this quote (1000 = fast transfer, 2000 = standard). */\n finalityThreshold: number\n /** Fast-transfer protocol fee rate from that row, in basis points. May be fractional (for example 1.3). */\n minimumFeeBps: number\n /** Protocol fee in USDC base units for `transferAmount`. Zero when no amount was supplied. */\n protocolFee: bigint\n /**\n * `forwardFee[tier] + protocolFee`. This is the `maxFee` for `depositForBurnWithHook`.\n * Without `transferAmount`, this is the forwarding fee only.\n */\n maxFee: bigint\n forwardFeeLow: bigint\n forwardFeeMed: bigint\n forwardFeeHigh: bigint\n maxFeeLow: bigint\n maxFeeMed: bigint\n maxFeeHigh: bigint\n feeTierUsed: CctpFeeTier\n}\n\n/**\n * CCTP fast-transfer protocol fee.\n * `minimumFee` from Iris is basis points of the amount the recipient receives.\n * Matches Circle's reference: `(amount * round(bps * 100)) / 1_000_000`.\n */\nexport function cctpProtocolFeeBaseUnits(transferAmount: bigint, minimumFeeBps: number): bigint {\n if (transferAmount <= 0n || !Number.isFinite(minimumFeeBps) || minimumFeeBps <= 0) return 0n\n const scaledBps = BigInt(Math.round(minimumFeeBps * 100))\n if (scaledBps <= 0n) return 0n\n return (transferAmount * scaledBps) / 1_000_000n\n}\n\nfunction pickForwardFeeTier(row: Record<string, unknown>, tier: CctpFeeTier): bigint {\n const forwardFee = row.forwardFee as Record<string, unknown> | undefined\n if (forwardFee && typeof forwardFee === 'object') {\n const key = tier === 'low' ? 'low' : tier === 'high' ? 'high' : 'med'\n const v = forwardFee[key]\n if (v != null) return BigInt(String(v))\n }\n const maxFee = row.maximumFee ?? row.maxFee ?? row.forwardFee\n if (maxFee != null && typeof maxFee !== 'object') return BigInt(String(maxFee))\n throw new Error('Iris fee response missing forwardFee tiers.')\n}\n\nfunction feeRows(json: unknown): Record<string, unknown>[] {\n if (Array.isArray(json)) return json.filter((row) => row && typeof row === 'object') as Record<string, unknown>[]\n if (json && typeof json === 'object') {\n const data = (json as Record<string, unknown>).data\n if (Array.isArray(data)) return data.filter((row) => row && typeof row === 'object') as Record<string, unknown>[]\n return [json as Record<string, unknown>]\n }\n return []\n}\n\n/** Prefer the Iris row for the burn's finality threshold (fast = 1000). */\nexport function selectCctpIrisFeeRow(\n rows: Record<string, unknown>[],\n finalityThreshold: number,\n): Record<string, unknown> {\n const match = rows.find((row) => Number(row.finalityThreshold) === finalityThreshold)\n return match ?? rows[0] ?? {}\n}\n\n/**\n * Fetch CCTP Forwarding Service burn fees from Circle Iris (`?forward=true`).\n * `maxFee` is the selected forwarding tier plus the protocol fee for `transferAmount`.\n */\nexport async function fetchCctpBurnFees(args: {\n sourceChainId: number\n sourceDomain: number\n destDomain: number\n feeTier?: CctpFeeTier\n /** USDC base units the recipient receives. Required for a maxFee that covers the protocol fee. */\n transferAmount?: bigint\n /** Iris fee row. Defaults to fast transfer (1000). */\n minFinalityThreshold?: number\n}): Promise<CctpBurnFeesResult> {\n const tier = args.feeTier ?? 'med'\n const finalityThreshold = args.minFinalityThreshold ?? CCTP_DEFAULT_MIN_FINALITY_THRESHOLD\n const base = irisApiBaseForChainId(args.sourceChainId)\n const url = `${base}/v2/burn/USDC/fees/${args.sourceDomain}/${args.destDomain}?forward=true`\n const res = await fetch(url, { headers: { Accept: 'application/json' } })\n if (!res.ok) {\n const text = await res.text().catch(() => '')\n throw new Error(`Iris fee quote failed (${res.status}): ${text.slice(0, 200)}`)\n }\n const row = selectCctpIrisFeeRow(feeRows(await res.json()), finalityThreshold)\n const low = pickForwardFeeTier(row, 'low')\n const med = pickForwardFeeTier(row, 'med')\n const high = pickForwardFeeTier(row, 'high')\n const minimumFeeRaw = row.minimumFee\n const minimumFeeBps = typeof minimumFeeRaw === 'number' ? minimumFeeRaw : Number(minimumFeeRaw ?? 0)\n const transferAmount = args.transferAmount ?? 0n\n const protocolFee = cctpProtocolFeeBaseUnits(transferAmount, minimumFeeBps)\n const forwardForTier = tier === 'low' ? low : tier === 'high' ? high : med\n return {\n sourceDomain: args.sourceDomain,\n destDomain: args.destDomain,\n finalityThreshold: Number(row.finalityThreshold ?? finalityThreshold),\n minimumFeeBps: Number.isFinite(minimumFeeBps) ? minimumFeeBps : 0,\n protocolFee,\n maxFee: forwardForTier + protocolFee,\n forwardFeeLow: low,\n forwardFeeMed: med,\n forwardFeeHigh: high,\n maxFeeLow: low + protocolFee,\n maxFeeMed: med + protocolFee,\n maxFeeHigh: high + protocolFee,\n feeTierUsed: tier,\n }\n}\n","import { formatUnits } from 'viem'\nimport { CCTP_USDC_DECIMALS } from './constants.js'\n\n/** Trim trailing zeros from a USDC human amount (6 decimals). */\nexport function formatCctpUsdcHuman(wei: bigint): string {\n const raw = formatUnits(wei, CCTP_USDC_DECIMALS)\n if (!raw.includes('.')) return raw\n return raw.replace(/\\.?0+$/, '') || '0'\n}\n","import { http, type Transport } from 'viem'\n\n/**\n * Optional browser transport for protocol `eth_*` reads (allowance, decimals, spoke views).\n * Node / MCP leave this unset and use viem `http(rpcUrl)`.\n */\nlet evmRpcTransportFactory: ((rpcUrl: string) => Transport) | undefined\n\nexport function setDefiEvmRpcTransportFactory(factory: ((rpcUrl: string) => Transport) | undefined): void {\n evmRpcTransportFactory = factory\n}\n\nexport function getDefiEvmRpcTransportFactory(): ((rpcUrl: string) => Transport) | undefined {\n return evmRpcTransportFactory\n}\n\n/** Same-origin proxy in the browser when the app has called {@link setDefiEvmRpcTransportFactory}. */\nexport function defiEvmTransport(rpcUrl: string, opts?: Parameters<typeof http>[1]): Transport {\n const url = rpcUrl.trim()\n return evmRpcTransportFactory?.(url) ?? http(url, opts)\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n /** Unix seconds (UTC) for mpc-auth multiSignRequest expiryDate. */\n expiryDate?: number\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload, (_, v) => (typeof v === 'bigint' ? v.toString() : v))\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n if (input.expiryDate != null && input.expiryDate > 0) {\n bodyForSign.expiryDate = Math.floor(input.expiryDate)\n }\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import { keccak256, createPublicClient, defineChain, serializeTransaction, getAddress, parseGwei, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../core/defiEvmClient.js'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: defiEvmTransport(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n expiryDate: context.expiryDate,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import { createPublicClient, defineChain, getAddress, parseAbi, parseUnits } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { CCTP_USDC_DECIMALS } from './constants.js'\nimport { cctpChainConfig, isCctpRouteSupported } from './support.js'\n\nconst erc20BalanceAbi = parseAbi(['function balanceOf(address account) view returns (uint256)'])\n\nexport async function cctpAssertBurnPreconditions(args: {\n sourceChainId: number\n destChainId: number\n transferAmountHuman: string\n maxFee: bigint\n rpcUrl: string\n executorAddress: string\n}): Promise<{ transferAmount: bigint; totalBurn: bigint }> {\n if (!isCctpRouteSupported(args.sourceChainId, args.destChainId)) {\n throw new Error('CCTP route is not supported for the selected source and destination chains.')\n }\n const src = cctpChainConfig(args.sourceChainId)\n if (!src) throw new Error('Unsupported CCTP source chain.')\n const transferAmount = parseUnits(args.transferAmountHuman.trim(), CCTP_USDC_DECIMALS)\n if (transferAmount <= 0n) throw new Error('Transfer amount must be greater than zero.')\n const totalBurn = transferAmount + args.maxFee\n const ch = defineChain({\n id: args.sourceChainId,\n name: src.label,\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl.trim()] } },\n })\n const client = createPublicClient({ chain: ch, transport: defiEvmTransport(args.rpcUrl.trim()) })\n const owner = getAddress(args.executorAddress)\n const balance = await client.readContract({\n address: getAddress(src.usdc),\n abi: erc20BalanceAbi,\n functionName: 'balanceOf',\n args: [owner],\n })\n if (balance < totalBurn) {\n throw new Error(\n `Insufficient USDC on source chain: need ${totalBurn.toString()} (transfer + maxFee), have ${balance.toString()}.`,\n )\n }\n return { transferAmount, totalBurn }\n}\n","import {\n type Address,\n encodeFunctionData,\n getAddress,\n pad,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail, EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport {\n CCTP_DEFAULT_MIN_FINALITY_THRESHOLD,\n CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS,\n CCTP_ERC20_APPROVE_FALLBACK_GAS,\n CCTP_USDC_DECIMALS,\n FORWARDING_SERVICE_HOOK_DATA,\n type CctpFeeTier,\n} from './constants.js'\nimport { cctpChainConfig } from './support.js'\nimport { cctpAssertBurnPreconditions } from './prechecks.js'\nimport { fetchCctpBurnFees } from './fees.js'\nimport type { CctpBurnExtra } from './types.js'\n\ntype CctpStepKind = 'approve' | 'depositForBurnWithHook'\ntype CctpStep = EvmTxStep & { kind: CctpStepKind; fallbackGas?: bigint }\n\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\nconst tokenMessengerAbi = parseAbi([\n 'function depositForBurnWithHook(uint256 amount, uint32 destinationDomain, bytes32 mintRecipient, address burnToken, bytes32 destinationCaller, uint256 maxFee, uint32 minFinalityThreshold, bytes hookData)',\n])\n\nexport function buildCctpBurnExtraJSON(args: {\n sourceChainId: number\n sourceDomain: number\n destDomain: number\n destChainId: number\n transferAmount: bigint\n maxFee: bigint\n mintRecipient: Address\n burnToken: Address\n tokenMessenger: Address\n minFinalityThreshold: number\n proposalMaxFee: bigint\n feeTier?: CctpFeeTier\n}): CctpBurnExtra {\n return {\n version: 1,\n sourceChainId: args.sourceChainId,\n sourceDomain: args.sourceDomain,\n destDomain: args.destDomain,\n destChainId: args.destChainId,\n transferAmount: args.transferAmount.toString(),\n mintRecipient: pad(args.mintRecipient, { size: 32 }),\n burnToken: args.burnToken,\n tokenMessenger: args.tokenMessenger,\n useForwardingService: true,\n forwardingHookData: FORWARDING_SERVICE_HOOK_DATA,\n minFinalityThreshold: args.minFinalityThreshold,\n proposalMaxFee: args.proposalMaxFee.toString(),\n feeTier: args.feeTier,\n }\n}\n\nexport function buildCctpBurnSteps(args: {\n sourceChainId: number\n destChainId: number\n executorAddress: Address\n mintRecipient: Address\n transferAmount: bigint\n maxFee: bigint\n minFinalityThreshold: number\n currentAllowance?: bigint\n}): CctpStep[] {\n const src = cctpChainConfig(args.sourceChainId)\n const dst = cctpChainConfig(args.destChainId)\n if (!src || !dst) throw new Error('Unsupported CCTP source or destination chain.')\n const usdc = getAddress(src.usdc)\n const tokenMessenger = getAddress(src.tokenMessenger)\n const totalBurn = args.transferAmount + args.maxFee\n const mintRecipientBytes32 = pad(args.mintRecipient, { size: 32 })\n const destinationCaller = pad('0x', { size: 32 })\n\n const steps: CctpStep[] = []\n const allowance = args.currentAllowance ?? 0n\n if (allowance < totalBurn) {\n if (allowance > 0n) {\n steps.push({\n kind: 'approve',\n to: usdc,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [tokenMessenger, 0n] }),\n value: 0n,\n fallbackGas: CCTP_ERC20_APPROVE_FALLBACK_GAS,\n })\n }\n steps.push({\n kind: 'approve',\n to: usdc,\n data: encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [tokenMessenger, totalBurn],\n }),\n value: 0n,\n fallbackGas: CCTP_ERC20_APPROVE_FALLBACK_GAS,\n })\n }\n\n steps.push({\n kind: 'depositForBurnWithHook',\n to: tokenMessenger,\n data: encodeFunctionData({\n abi: tokenMessengerAbi,\n functionName: 'depositForBurnWithHook',\n args: [\n totalBurn,\n dst.domain,\n mintRecipientBytes32,\n usdc,\n destinationCaller,\n args.maxFee,\n args.minFinalityThreshold,\n FORWARDING_SERVICE_HOOK_DATA,\n ],\n }),\n value: 0n,\n fallbackGas: CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS,\n })\n return steps\n}\n\nexport async function buildEvmMultisignBodyCctpBurnBatch(args: {\n keyGen: KeyGenSubsetForPermit\n /** Source chain EIP-155 id (where burn executes). */\n sourceChainId: number\n destChainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n transferAmountHuman: string\n /** Recipient on destination chain (defaults to executor). */\n mintRecipient?: Address\n executorAddress: Address\n purposeText: string\n maxFee?: bigint\n feeTier?: CctpFeeTier\n minFinalityThreshold?: number\n /** Skip Iris fetch when caller already quoted (e.g. MCP feeSnapshot). */\n proposalMaxFee?: bigint\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const src = cctpChainConfig(args.sourceChainId)\n const dst = cctpChainConfig(args.destChainId)\n if (!src || !dst) throw new Error('Unsupported CCTP source or destination chain.')\n const executor = getAddress(args.executorAddress)\n const mintRecipient = getAddress(args.mintRecipient ?? executor)\n const minFinality = args.minFinalityThreshold ?? CCTP_DEFAULT_MIN_FINALITY_THRESHOLD\n const transferAmountForFee = parseUnits(args.transferAmountHuman.trim(), CCTP_USDC_DECIMALS)\n if (transferAmountForFee <= 0n) throw new Error('Transfer amount must be greater than zero.')\n\n let maxFee = args.maxFee\n let proposalMaxFee = args.proposalMaxFee ?? maxFee\n if (maxFee == null) {\n const fees = await fetchCctpBurnFees({\n sourceChainId: args.sourceChainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n feeTier: args.feeTier,\n transferAmount: transferAmountForFee,\n minFinalityThreshold: minFinality,\n })\n maxFee = fees.maxFee\n proposalMaxFee = fees.maxFee\n } else if (proposalMaxFee == null) {\n proposalMaxFee = maxFee\n }\n\n const { transferAmount } = await cctpAssertBurnPreconditions({\n sourceChainId: args.sourceChainId,\n destChainId: args.destChainId,\n transferAmountHuman: args.transferAmountHuman,\n maxFee,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n })\n\n /** Canonical 2-leg batch (approve + burn) so Get Sig rebuild matches leg count. */\n const steps = buildCctpBurnSteps({\n sourceChainId: args.sourceChainId,\n destChainId: args.destChainId,\n executorAddress: executor,\n mintRecipient,\n transferAmount,\n maxFee,\n minFinalityThreshold: minFinality,\n currentAllowance: 0n,\n })\n\n const cctpBurn = buildCctpBurnExtraJSON({\n sourceChainId: args.sourceChainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n destChainId: dst.chainId,\n transferAmount,\n maxFee,\n mintRecipient,\n burnToken: getAddress(src.usdc),\n tokenMessenger: getAddress(src.tokenMessenger),\n minFinalityThreshold: minFinality,\n proposalMaxFee,\n feeTier: args.feeTier ?? 'med',\n })\n\n const transferHuman = args.transferAmountHuman.trim()\n const totalBurn = transferAmount + maxFee\n const purposeSuffix = `CCTP (Forwarding Service): ${transferHuman} USDC ${src.label} → ${dst.label}.`\n\n const firstDataNo0x = steps[0]!.data.startsWith('0x') ? steps[0]!.data.slice(2) : steps[0]!.data\n\n const result = await buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.sourceChainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n buildBatchMeta: ({ step }) => {\n const s = step as CctpStep\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'CircleCCTP',\n name: 'USDC.approve',\n spender: src.tokenMessenger,\n amount: totalBurn.toString(),\n }),\n evm: { type: 'cctp_erc20_approve', version: 1, chainId: String(args.sourceChainId) },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'CircleCCTP',\n name: 'TokenMessengerV2.depositForBurnWithHook',\n destDomain: dst.domain,\n destChainId: dst.chainId,\n mintRecipient,\n transferAmount: transferAmount.toString(),\n maxFee: maxFee.toString(),\n }),\n evm: { type: 'cctp_deposit_for_burn_forward', version: 1, chainId: String(args.sourceChainId) },\n }\n },\n })\n\n const body = result.bodyForSign\n const existingExtra =\n typeof body.extraJSON === 'string'\n ? (JSON.parse(body.extraJSON) as Record<string, unknown>)\n : ((body.extraJSON as Record<string, unknown>) ?? {})\n body.extraJSON = JSON.stringify({ ...existingExtra, cctpBurn })\n return result\n}\n\n/** MCP / app entry: sourceChainId via chainId field. */\nexport async function buildEvmMultisignBodyCctpBurnBatchFromMcp(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n destChainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n transferAmountHuman: string\n mintRecipient?: string\n executorAddress: Address\n purposeText: string\n feeTier?: CctpFeeTier\n minFinalityThreshold?: number\n feeSnapshot?: Record<string, unknown>\n}) {\n const src = cctpChainConfig(args.chainId)\n const dst = cctpChainConfig(args.destChainId)\n if (!src || !dst) throw new Error('Unsupported CCTP source or destination chain.')\n const transferAmount = parseUnits(args.transferAmountHuman.trim(), CCTP_USDC_DECIMALS)\n const fees = await fetchCctpBurnFees({\n sourceChainId: args.chainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n feeTier: args.feeTier,\n transferAmount,\n minFinalityThreshold: args.minFinalityThreshold,\n })\n // A feeSnapshot cannot undercut the live quote. A higher snapshot is kept as an agreed cap.\n let maxFee = fees.maxFee\n if (args.feeSnapshot?.maxFee != null) {\n const snapshotMaxFee = BigInt(String(args.feeSnapshot.maxFee))\n if (snapshotMaxFee > maxFee) maxFee = snapshotMaxFee\n }\n return buildEvmMultisignBodyCctpBurnBatch({\n keyGen: args.keyGen,\n sourceChainId: args.chainId,\n destChainId: args.destChainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n transferAmountHuman: args.transferAmountHuman,\n mintRecipient: args.mintRecipient ? getAddress(args.mintRecipient) : undefined,\n executorAddress: args.executorAddress,\n purposeText: args.purposeText,\n maxFee,\n proposalMaxFee: maxFee,\n feeTier: args.feeTier,\n minFinalityThreshold: args.minFinalityThreshold,\n })\n}\n","import { type Address, getAddress } from 'viem'\nimport {\n CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS,\n CCTP_ERC20_APPROVE_FALLBACK_GAS,\n FORWARDING_SERVICE_HOOK_DATA,\n} from './constants.js'\nimport { buildCctpBurnSteps } from './multisign.js'\nimport type { CctpBurnExtra } from './types.js'\n\nexport type { CctpBurnExtra } from './types.js'\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nexport function parseCctpBurnExtraJSON(detail: Record<string, unknown> | null | undefined): CctpBurnExtra | null {\n const ex = parseExtraJsonObject(detail)\n const raw = ex?.cctpBurn\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null\n const c = raw as Record<string, unknown>\n if (c.useForwardingService !== true) return null\n const version = Number(c.version ?? 0)\n if (version !== 1) return null\n return {\n version: 1,\n sourceChainId: Number(c.sourceChainId ?? 0),\n sourceDomain: Number(c.sourceDomain),\n destDomain: Number(c.destDomain),\n destChainId: Number(c.destChainId),\n transferAmount: String(c.transferAmount ?? ''),\n mintRecipient: String(c.mintRecipient ?? ''),\n burnToken: String(c.burnToken ?? ''),\n tokenMessenger: String(c.tokenMessenger ?? ''),\n useForwardingService: true,\n forwardingHookData: String(c.forwardingHookData ?? FORWARDING_SERVICE_HOOK_DATA),\n minFinalityThreshold: Number(c.minFinalityThreshold ?? 1000),\n proposalMaxFee: String(c.proposalMaxFee ?? '0'),\n feeTier:\n c.feeTier === 'low' || c.feeTier === 'high' || c.feeTier === 'med' ? c.feeTier : undefined,\n }\n}\n\nexport function isCctpBurnEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n if (parseCctpBurnExtraJSON(detail)) return true\n const ex = parseExtraJsonObject(detail)\n if (batchIndex != null && batchIndex >= 0 && ex) {\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[batchIndex] && typeof bm[batchIndex] === 'object' && !Array.isArray(bm[batchIndex])) {\n const evm0 = (bm[batchIndex] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n const t = String((evm0 as Record<string, unknown>).type ?? '')\n return t === 'cctp_deposit_for_burn_forward' || t === 'cctp_erc20_approve'\n }\n }\n }\n const evm = ex?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n const t = String((evm as Record<string, unknown>).type ?? '')\n return t === 'cctp_deposit_for_burn_forward'\n}\n\nexport function isCctpErc20ApproveEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n const bm = ex?.batchMeta\n if (Array.isArray(bm) && bm[index] && typeof bm[index] === 'object' && !Array.isArray(bm[index])) {\n const evm0 = (bm[index] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n return String((evm0 as Record<string, unknown>).type ?? '') === 'cctp_erc20_approve'\n }\n }\n return false\n}\n\nexport function resolveCctpBatchStepGasFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): bigint | null {\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n if (isCctpErc20ApproveEvmSignRequest(detail, index)) return CCTP_ERC20_APPROVE_FALLBACK_GAS\n if (isCctpBurnEvmSignRequest(detail, index)) return CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS\n return null\n}\n\nexport function rebuildCctpBurnCalldataAtGetSig(args: {\n cctpBurn: CctpBurnExtra\n freshMaxFee: bigint\n executorAddress: Address\n /** When true, always include approve legs (Get Sig cannot rely on live allowance). */\n forceApprove?: boolean\n}): Array<{ to: Address; data: `0x${string}` }> {\n const transferAmount = BigInt(args.cctpBurn.transferAmount)\n const mintRecipient = cctpMintRecipientAddressFromExtra(args.cctpBurn)\n const steps = buildCctpBurnSteps({\n sourceChainId: args.cctpBurn.sourceChainId,\n destChainId: args.cctpBurn.destChainId,\n executorAddress: args.executorAddress,\n mintRecipient,\n transferAmount,\n maxFee: args.freshMaxFee,\n minFinalityThreshold: args.cctpBurn.minFinalityThreshold,\n currentAllowance: args.forceApprove ? 0n : undefined,\n })\n return steps.map((s) => ({ to: s.to, data: s.data }))\n}\n\n/** Resolve mint recipient EVM address from bytes32 in extraJSON. */\nexport function cctpMintRecipientAddressFromExtra(cctpBurn: CctpBurnExtra): Address {\n const hex = cctpBurn.mintRecipient.startsWith('0x') ? cctpBurn.mintRecipient.slice(2) : cctpBurn.mintRecipient\n return getAddress(`0x${hex.slice(-40)}`)\n}\n\nexport { CCTP_ERC20_APPROVE_FALLBACK_GAS, CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS }\n","import { createPublicClient, defineChain, getAddress, parseAbi, parseUnits } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { CCTP_USDC_DECIMALS } from './constants.js'\nimport { cctpChainConfig, cctpSupportedRoutes, irisApiBaseForChainId } from './support.js'\nimport type { CctpNetworkKind } from './constants.js'\nimport { fetchCctpBurnFees } from './fees.js'\nimport { formatCctpUsdcHuman } from './format.js'\nimport { parseCctpBurnExtraJSON } from './executeHelpers.js'\n\nconst erc20BalanceAbi = parseAbi(['function balanceOf(address account) view returns (uint256)'])\n\nexport async function cctpFetchSupportedRoutes(args?: { network?: CctpNetworkKind }) {\n return { routes: cctpSupportedRoutes(args?.network) }\n}\n\nexport type CctpMcpFeeFields = {\n feeTierUsed: import('./constants.js').CctpFeeTier\n maxFee: string\n maxFeeHuman: string\n /** Iris forwarding component only. maxFee adds the protocol fee on top. */\n forwardFeeLow: string\n forwardFeeLowHuman: string\n forwardFeeMed: string\n forwardFeeMedHuman: string\n forwardFeeHigh: string\n forwardFeeHighHuman: string\n /** forwardFee tier + protocol fee. Present on a live Iris quote. */\n maxFeeLow?: string\n maxFeeLowHuman?: string\n maxFeeMed?: string\n maxFeeMedHuman?: string\n maxFeeHigh?: string\n maxFeeHighHuman?: string\n minimumFeeBps?: number\n protocolFee?: string\n protocolFeeHuman?: string\n finalityThreshold?: number\n transferAmount?: string\n transferAmountHuman?: string\n totalBurn?: string\n totalBurnHuman?: string\n feeSummary: string\n}\n\nfunction buildCctpMcpFeeFields(args: {\n fees: Awaited<ReturnType<typeof fetchCctpBurnFees>>\n transferAmount?: bigint\n transferAmountHuman?: string\n}): CctpMcpFeeFields {\n const { fees, transferAmount, transferAmountHuman } = args\n const maxFeeHuman = formatCctpUsdcHuman(fees.maxFee)\n const forwardFeeLowHuman = formatCctpUsdcHuman(fees.forwardFeeLow)\n const forwardFeeMedHuman = formatCctpUsdcHuman(fees.forwardFeeMed)\n const forwardFeeHighHuman = formatCctpUsdcHuman(fees.forwardFeeHigh)\n const protocolFeeHuman = formatCctpUsdcHuman(fees.protocolFee)\n let totalBurn: bigint | undefined\n let totalBurnHuman: string | undefined\n if (transferAmount != null && transferAmount > 0n) {\n totalBurn = transferAmount + fees.maxFee\n totalBurnHuman = formatCctpUsdcHuman(totalBurn)\n }\n const recipientPart =\n transferAmountHuman != null && totalBurnHuman != null\n ? ` Recipient receives ${transferAmountHuman} USDC; wallet burns ${totalBurnHuman} USDC total (transfer + max fee).`\n : ' Pass transferAmountHuman so maxFee includes the fast-transfer protocol fee.'\n const feeSummary = `CCTP max fee (${fees.feeTierUsed} tier): ${maxFeeHuman} USDC = forwarding ${formatCctpUsdcHuman(fees.feeTierUsed === 'low' ? fees.forwardFeeLow : fees.feeTierUsed === 'high' ? fees.forwardFeeHigh : fees.forwardFeeMed)} + protocol ${protocolFeeHuman} (${fees.minimumFeeBps} bps, finality ${fees.finalityThreshold}).${recipientPart} Combined tiers — low: ${formatCctpUsdcHuman(fees.maxFeeLow)}, med: ${formatCctpUsdcHuman(fees.maxFeeMed)}, high: ${formatCctpUsdcHuman(fees.maxFeeHigh)} USDC. Fees refresh again at Get Sig.`\n return {\n feeTierUsed: fees.feeTierUsed,\n maxFee: fees.maxFee.toString(),\n maxFeeHuman,\n forwardFeeLow: fees.forwardFeeLow.toString(),\n forwardFeeLowHuman,\n forwardFeeMed: fees.forwardFeeMed.toString(),\n forwardFeeMedHuman,\n forwardFeeHigh: fees.forwardFeeHigh.toString(),\n forwardFeeHighHuman,\n maxFeeLow: fees.maxFeeLow.toString(),\n maxFeeLowHuman: formatCctpUsdcHuman(fees.maxFeeLow),\n maxFeeMed: fees.maxFeeMed.toString(),\n maxFeeMedHuman: formatCctpUsdcHuman(fees.maxFeeMed),\n maxFeeHigh: fees.maxFeeHigh.toString(),\n maxFeeHighHuman: formatCctpUsdcHuman(fees.maxFeeHigh),\n minimumFeeBps: fees.minimumFeeBps,\n protocolFee: fees.protocolFee.toString(),\n protocolFeeHuman,\n finalityThreshold: fees.finalityThreshold,\n ...(transferAmount != null ? { transferAmount: transferAmount.toString() } : {}),\n ...(transferAmountHuman != null ? { transferAmountHuman } : {}),\n ...(totalBurn != null ? { totalBurn: totalBurn.toString() } : {}),\n ...(totalBurnHuman != null ? { totalBurnHuman } : {}),\n feeSummary,\n }\n}\n\n/** Fee summary for MCP build tool results (from bodyForSign.extraJSON.cctpBurn). */\nexport function cctpFeeSummaryFromBodyForSign(bodyForSign: Record<string, unknown>): CctpMcpFeeFields | null {\n const cctpBurn = parseCctpBurnExtraJSON(bodyForSign)\n if (!cctpBurn) return null\n const transferAmount = BigInt(cctpBurn.transferAmount)\n const maxFee = BigInt(cctpBurn.proposalMaxFee)\n const totalBurn = transferAmount + maxFee\n const transferAmountHuman = formatCctpUsdcHuman(transferAmount)\n const maxFeeHuman = formatCctpUsdcHuman(maxFee)\n const totalBurnHuman = formatCctpUsdcHuman(totalBurn)\n const tier = cctpBurn.feeTier ?? 'med'\n const src = cctpChainConfig(cctpBurn.sourceChainId)\n const dst = cctpChainConfig(cctpBurn.destChainId)\n const routePart =\n src && dst ? ` Route: ${src.label} → ${dst.label}.` : ''\n return {\n feeTierUsed: tier,\n maxFee: maxFee.toString(),\n maxFeeHuman,\n forwardFeeLow: maxFee.toString(),\n forwardFeeLowHuman: maxFeeHuman,\n forwardFeeMed: maxFee.toString(),\n forwardFeeMedHuman: maxFeeHuman,\n forwardFeeHigh: maxFee.toString(),\n forwardFeeHighHuman: maxFeeHuman,\n transferAmount: transferAmount.toString(),\n transferAmountHuman,\n totalBurn: totalBurn.toString(),\n totalBurnHuman,\n feeSummary: `Proposed CCTP burn.${routePart} Recipient receives ${transferAmountHuman} USDC; proposal max fee (${tier} tier): ${maxFeeHuman} USDC; total burn ${totalBurnHuman} USDC. Max fee refreshes at Get Sig.`,\n }\n}\n\nexport async function cctpFetchUsdcBalance(args: {\n chainId: number\n executorAddress: string\n rpcUrl: string\n transferAmountHuman?: string\n feeSnapshot?: { maxFee?: string | number | bigint }\n}) {\n const cfg = cctpChainConfig(args.chainId)\n if (!cfg) throw new Error(`Chain ${args.chainId} is not CCTP-supported.`)\n const ch = defineChain({\n id: args.chainId,\n name: cfg.label,\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl.trim()] } },\n })\n const client = createPublicClient({ chain: ch, transport: defiEvmTransport(args.rpcUrl.trim()) })\n const owner = getAddress(args.executorAddress)\n const balanceRaw = await client.readContract({\n address: getAddress(cfg.usdc),\n abi: erc20BalanceAbi,\n functionName: 'balanceOf',\n args: [owner],\n })\n const out: Record<string, unknown> = {\n balanceRaw: balanceRaw.toString(),\n balanceUsdcHuman: formatCctpUsdcHuman(balanceRaw),\n usdcAddress: cfg.usdc,\n }\n const transferHuman = args.transferAmountHuman?.trim()\n const maxFeeRaw = args.feeSnapshot?.maxFee\n if (transferHuman && maxFeeRaw != null) {\n const transferAmount = parseUnits(transferHuman, CCTP_USDC_DECIMALS)\n const maxFee = BigInt(String(maxFeeRaw))\n const totalRequired = transferAmount + maxFee\n out.requiredTotalBurnRaw = totalRequired.toString()\n out.requiredTotalBurnHuman = formatCctpUsdcHuman(totalRequired)\n out.sufficientForTransfer = balanceRaw >= totalRequired\n out.feeSummary = `Wallet holds ${out.balanceUsdcHuman} USDC; transfer requires ${formatCctpUsdcHuman(totalRequired)} USDC (${transferHuman} + ${formatCctpUsdcHuman(maxFee)} max fee).`\n }\n return out\n}\n\nexport async function cctpFetchTransferStatus(args: {\n sourceChainId: number\n sourceDomain: number\n burnTxHash: string\n}) {\n const base = irisApiBaseForChainId(args.sourceChainId)\n const hash = args.burnTxHash.trim().replace(/^0x/, '')\n const url = `${base}/v2/messages/${args.sourceDomain}?transactionHash=0x${hash}`\n const res = await fetch(url, { headers: { Accept: 'application/json' } })\n if (!res.ok) {\n const text = await res.text().catch(() => '')\n throw new Error(`Iris message lookup failed (${res.status}): ${text.slice(0, 200)}`)\n }\n const json = (await res.json()) as Record<string, unknown>\n const messages = (json.messages ?? json.data ?? []) as unknown[]\n const first = (messages[0] ?? json) as Record<string, unknown>\n return {\n status: String(first.status ?? 'unknown'),\n attestation: typeof first.attestation === 'string' ? first.attestation : undefined,\n message: first.message,\n eventNonce: first.eventNonce,\n }\n}\n\nexport async function cctpFetchBurnFeesForRoute(args: {\n sourceChainId: number\n destChainId: number\n transferAmountHuman?: string\n feeTier?: import('./constants.js').CctpFeeTier\n minFinalityThreshold?: number\n}) {\n const src = cctpChainConfig(args.sourceChainId)\n const dst = cctpChainConfig(args.destChainId)\n if (!src || !dst) throw new Error('Unsupported source or destination chain for CCTP.')\n if (src.network !== dst.network) throw new Error('Source and destination must be on the same network (mainnet or testnet).')\n if (src.chainId === dst.chainId) throw new Error('Source and destination must differ.')\n const transferHuman = args.transferAmountHuman?.trim()\n const transferAmount = transferHuman ? parseUnits(transferHuman, CCTP_USDC_DECIMALS) : undefined\n const fees = await fetchCctpBurnFees({\n sourceChainId: args.sourceChainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n feeTier: args.feeTier,\n transferAmount,\n minFinalityThreshold: args.minFinalityThreshold,\n })\n const feeFields = buildCctpMcpFeeFields({\n fees,\n transferAmount,\n transferAmountHuman: transferHuman || undefined,\n })\n return {\n sourceChainId: args.sourceChainId,\n destChainId: args.destChainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n sourceLabel: src.label,\n destLabel: dst.label,\n network: src.network,\n fees: feeFields,\n ...feeFields,\n }\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { CIRCLE_CCTP_PROTOCOL_ID } from './constants.js'\nimport { isCctpSourceChainSupported } from './support.js'\n\nexport * from './constants.js'\nexport * from './support.js'\nexport * from './fees.js'\nexport * from './format.js'\nexport * from './reads.js'\nexport * from './prechecks.js'\nexport * from './multisign.js'\nexport * from './executeHelpers.js'\nexport * from './types.js'\n\nexport const circleCctpProtocolModule: ProtocolModule = {\n id: CIRCLE_CCTP_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isCctpSourceChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n {\n id: 'circle-cctp.fetch-routes',\n protocolId: CIRCLE_CCTP_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'List supported CCTP Forwarding Service routes (EVM)',\n commonParams: [],\n params: {\n network: { type: 'string', required: false, description: 'mainnet | testnet' },\n },\n },\n {\n id: 'circle-cctp.fetch-fees',\n protocolId: CIRCLE_CCTP_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Quote Iris forwarding fee plus fast-transfer protocol fee for a route',\n commonParams: [],\n params: {\n sourceChainId: { type: 'number', required: true, description: 'Source EIP-155 chain id' },\n destChainId: { type: 'number', required: true, description: 'Destination EIP-155 chain id' },\n transferAmountHuman: { type: 'string', required: true, description: 'USDC amount recipient receives' },\n },\n },\n {\n id: 'circle-cctp.burn-forward',\n protocolId: CIRCLE_CCTP_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Burn USDC on source chain via CCTP Forwarding Service (approve + depositForBurnWithHook batch)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n sourceChainId: { type: 'number', required: true, description: 'Source EIP-155 chain id' },\n destChainId: { type: 'number', required: true, description: 'Destination EIP-155 chain id' },\n transferAmountHuman: { type: 'string', required: true, description: 'USDC amount recipient receives' },\n mintRecipient: { type: 'address', required: false, description: 'Destination mint recipient (default executor)' },\n },\n },\n ],\n}\n\nregisterProtocolModule(circleCctpProtocolModule)\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/protocols/evm/circle-cctp/constants.ts","../../../../src/protocols/evm/circle-cctp/support.ts","../../../../src/protocols/evm/circle-cctp/fees.ts","../../../../src/protocols/evm/circle-cctp/format.ts","../../../../src/core/defiEvmClient.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/circle-cctp/prechecks.ts","../../../../src/protocols/evm/circle-cctp/multisign.ts","../../../../src/protocols/evm/circle-cctp/executeHelpers.ts","../../../../src/protocols/evm/circle-cctp/reads.ts","../../../../src/protocols/evm/circle-cctp/index.ts"],"names":["n","getAddress","formatUnits","http","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","parseAbi","parseUnits","pad","encodeFunctionData","t","erc20BalanceAbi"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** Circle CCTP V2 + Forwarding Service — shared constants. */\n\nexport const CIRCLE_CCTP_PROTOCOL_ID = 'circle-cctp'\n\nexport const IRIS_API_MAINNET = 'https://iris-api.circle.com'\nexport const IRIS_API_SANDBOX = 'https://iris-api-sandbox.circle.com'\n\n/** EVM mainnet TokenMessengerV2 (most chains). */\nexport const TOKEN_MESSENGER_V2_MAINNET = '0x28b5a0e9C621a5BadaA536219b3a228C8168cf5d' as const\n/** EVM testnet TokenMessengerV2. */\nexport const TOKEN_MESSENGER_V2_TESTNET = '0x8FE6B999Dc680CcFDD5Bf7EB0974218be2542DAA' as const\n\n/**\n * Forwarding Service hook: magic \"cctp-forward\" + version 0 + additional length 0.\n * @see https://developers.circle.com/cctp/concepts/forwarding-service\n */\nexport const FORWARDING_SERVICE_HOOK_DATA =\n '0x636374702d666f72776172640000000000000000000000000000000000000000' as const\n\n/** Fast Transfer finality threshold (Circle docs use 1000). */\nexport const CCTP_DEFAULT_MIN_FINALITY_THRESHOLD = 1000\n\nexport const CCTP_USDC_DECIMALS = 6\n\nexport const CCTP_ERC20_APPROVE_FALLBACK_GAS = 100_000n\nexport const CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS = 350_000n\n\nexport type CctpNetworkKind = 'mainnet' | 'testnet'\n\nexport type CctpChainConfig = {\n chainId: number\n domain: number\n network: CctpNetworkKind\n usdc: `0x${string}`\n tokenMessenger: `0x${string}`\n label: string\n}\n\n/** Supported CCTP EVM chains (source or destination). */\nexport const CCTP_EVM_CHAINS: readonly CctpChainConfig[] = [\n {\n chainId: 1,\n domain: 0,\n network: 'mainnet',\n usdc: '0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Ethereum',\n },\n {\n chainId: 43114,\n domain: 1,\n network: 'mainnet',\n usdc: '0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Avalanche',\n },\n {\n chainId: 10,\n domain: 2,\n network: 'mainnet',\n usdc: '0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'OP Mainnet',\n },\n {\n chainId: 42161,\n domain: 3,\n network: 'mainnet',\n usdc: '0xaf88d065e77c8cC2239327C5EDb3A432268e5831',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Arbitrum',\n },\n {\n chainId: 8453,\n domain: 6,\n network: 'mainnet',\n usdc: '0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Base',\n },\n {\n chainId: 137,\n domain: 7,\n network: 'mainnet',\n usdc: '0x3c499c542cEF5E3811e1192ce70d8cC03d5c3359',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Polygon PoS',\n },\n {\n chainId: 11155111,\n domain: 0,\n network: 'testnet',\n usdc: '0x1c7D4B196Cb0C7B01d743Fbc6116a902379C7238',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Ethereum Sepolia',\n },\n {\n chainId: 43113,\n domain: 1,\n network: 'testnet',\n usdc: '0x5425890298aed601595a70AB815c96711a31Bc65',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Avalanche Fuji',\n },\n {\n chainId: 11155420,\n domain: 2,\n network: 'testnet',\n usdc: '0x5fd84259d66Cd46123540766Be93DFE6D43130D7',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'OP Sepolia',\n },\n {\n chainId: 421614,\n domain: 3,\n network: 'testnet',\n usdc: '0x75faf114eafb1BDbe2F0316DF893fd58CE46AA4d',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Arbitrum Sepolia',\n },\n {\n chainId: 84532,\n domain: 6,\n network: 'testnet',\n usdc: '0x036CbD53842c5426634e7929541eC2318f3dCF7e',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Base Sepolia',\n },\n {\n chainId: 80002,\n domain: 7,\n network: 'testnet',\n usdc: '0x41E94Eb019C0762f9Bfcf9Fb1E58725BfB0e7582',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Polygon Amoy',\n },\n {\n chainId: 5042,\n domain: 26,\n network: 'mainnet',\n usdc: '0x3600000000000000000000000000000000000000',\n tokenMessenger: TOKEN_MESSENGER_V2_MAINNET,\n label: 'Arc',\n },\n {\n chainId: 5042002,\n domain: 26,\n network: 'testnet',\n usdc: '0x3600000000000000000000000000000000000000',\n tokenMessenger: TOKEN_MESSENGER_V2_TESTNET,\n label: 'Arc Testnet',\n },\n] as const\n\nexport type CctpFeeTier = 'low' | 'med' | 'high'\n\n/** Iris forwarding tier used when a quote or proposal omits `feeTier`. */\nexport const CCTP_DEFAULT_FEE_TIER: CctpFeeTier = 'high'\n","import { getAddress } from 'viem'\nimport {\n CCTP_EVM_CHAINS,\n IRIS_API_MAINNET,\n IRIS_API_SANDBOX,\n type CctpChainConfig,\n type CctpNetworkKind,\n} from './constants.js'\n\nexport function cctpChainConfig(chainId: number): CctpChainConfig | null {\n return CCTP_EVM_CHAINS.find((c) => c.chainId === chainId) ?? null\n}\n\n/** Parse EIP-155 / decimal / 0x hex chain id for CCTP lookups. */\nexport function parseCctpEvmChainId(chainId: number | string): number {\n if (typeof chainId === 'number') {\n return Number.isFinite(chainId) ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const n = Number.parseInt(t.slice('eip155:'.length).trim(), 10)\n return Number.isFinite(n) ? n : Number.NaN\n }\n if (low.startsWith('0x')) {\n const n = Number.parseInt(t, 16)\n return Number.isFinite(n) ? n : Number.NaN\n }\n const n = Number.parseInt(t, 10)\n return Number.isFinite(n) ? n : Number.NaN\n}\n\nexport function isCctpSourceChainSupported(chainId: number | string): boolean {\n const n = parseCctpEvmChainId(chainId)\n return Number.isFinite(n) && cctpChainConfig(n) != null\n}\n\nexport function cctpCanonicalUsdcAddress(chainId: number | string): `0x${string}` | null {\n const n = parseCctpEvmChainId(chainId)\n if (!Number.isFinite(n)) return null\n const raw = cctpChainConfig(n)?.usdc\n if (!raw) return null\n try {\n return getAddress(raw)\n } catch {\n return null\n }\n}\n\n/** True when `contractAddress` is native Circle USDC on a supported CCTP source chain. */\nexport function isCctpCanonicalUsdcRow(chainId: number | string, contractAddress: string): boolean {\n const n = parseCctpEvmChainId(chainId)\n if (!Number.isFinite(n)) return false\n const canonical = cctpCanonicalUsdcAddress(n)\n if (!canonical) return false\n try {\n return getAddress(contractAddress as `0x${string}`).toLowerCase() === canonical.toLowerCase()\n } catch {\n return false\n }\n}\n\nexport function chainIdToDomain(chainId: number): number | null {\n return cctpChainConfig(chainId)?.domain ?? null\n}\n\nexport function domainToChainId(domain: number, network: CctpNetworkKind): number | null {\n const row = CCTP_EVM_CHAINS.find((c) => c.domain === domain && c.network === network)\n return row?.chainId ?? null\n}\n\nexport function isCctpRouteSupported(sourceChainId: number, destChainId: number): boolean {\n const src = cctpChainConfig(sourceChainId)\n const dst = cctpChainConfig(destChainId)\n if (!src || !dst) return false\n if (src.network !== dst.network) return false\n if (src.chainId === dst.chainId) return false\n return true\n}\n\nexport function irisApiBaseForChainId(chainId: number): string {\n const cfg = cctpChainConfig(chainId)\n if (!cfg) throw new Error(`Chain ${chainId} is not a supported CCTP EVM chain.`)\n return cfg.network === 'mainnet' ? IRIS_API_MAINNET : IRIS_API_SANDBOX\n}\n\nexport function cctpSupportedRoutes(network?: CctpNetworkKind): Array<{\n sourceChainId: number\n destChainId: number\n sourceDomain: number\n destDomain: number\n sourceLabel: string\n destLabel: string\n network: CctpNetworkKind\n}> {\n const chains = network ? CCTP_EVM_CHAINS.filter((c) => c.network === network) : [...CCTP_EVM_CHAINS]\n const out: Array<{\n sourceChainId: number\n destChainId: number\n sourceDomain: number\n destDomain: number\n sourceLabel: string\n destLabel: string\n network: CctpNetworkKind\n }> = []\n for (const src of chains) {\n for (const dst of chains) {\n if (src.chainId === dst.chainId) continue\n if (src.network !== dst.network) continue\n out.push({\n sourceChainId: src.chainId,\n destChainId: dst.chainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n sourceLabel: src.label,\n destLabel: dst.label,\n network: src.network,\n })\n }\n }\n return out\n}\n","import { CCTP_DEFAULT_FEE_TIER, CCTP_DEFAULT_MIN_FINALITY_THRESHOLD, type CctpFeeTier } from './constants.js'\nimport { irisApiBaseForChainId } from './support.js'\n\nexport type CctpBurnFeesResult = {\n sourceDomain: number\n destDomain: number\n /** Iris row used for this quote (1000 = fast transfer, 2000 = standard). */\n finalityThreshold: number\n /** Fast-transfer protocol fee rate from that row, in basis points. May be fractional (for example 1.3). */\n minimumFeeBps: number\n /** Protocol fee in USDC base units for `transferAmount`. Zero when no amount was supplied. */\n protocolFee: bigint\n /**\n * `forwardFee[tier] + protocolFee`. This is the `maxFee` for `depositForBurnWithHook`.\n * Without `transferAmount`, this is the forwarding fee only.\n */\n maxFee: bigint\n forwardFeeLow: bigint\n forwardFeeMed: bigint\n forwardFeeHigh: bigint\n maxFeeLow: bigint\n maxFeeMed: bigint\n maxFeeHigh: bigint\n feeTierUsed: CctpFeeTier\n}\n\n/**\n * CCTP fast-transfer protocol fee.\n * `minimumFee` from Iris is basis points of the amount the recipient receives.\n * Matches Circle's reference: `(amount * round(bps * 100)) / 1_000_000`.\n */\nexport function cctpProtocolFeeBaseUnits(transferAmount: bigint, minimumFeeBps: number): bigint {\n if (transferAmount <= 0n || !Number.isFinite(minimumFeeBps) || minimumFeeBps <= 0) return 0n\n const scaledBps = BigInt(Math.round(minimumFeeBps * 100))\n if (scaledBps <= 0n) return 0n\n return (transferAmount * scaledBps) / 1_000_000n\n}\n\nfunction pickForwardFeeTier(row: Record<string, unknown>, tier: CctpFeeTier): bigint {\n const forwardFee = row.forwardFee as Record<string, unknown> | undefined\n if (forwardFee && typeof forwardFee === 'object') {\n const key = tier === 'low' ? 'low' : tier === 'high' ? 'high' : 'med'\n const v = forwardFee[key]\n if (v != null) return BigInt(String(v))\n }\n const maxFee = row.maximumFee ?? row.maxFee ?? row.forwardFee\n if (maxFee != null && typeof maxFee !== 'object') return BigInt(String(maxFee))\n throw new Error('Iris fee response missing forwardFee tiers.')\n}\n\nfunction feeRows(json: unknown): Record<string, unknown>[] {\n if (Array.isArray(json)) return json.filter((row) => row && typeof row === 'object') as Record<string, unknown>[]\n if (json && typeof json === 'object') {\n const data = (json as Record<string, unknown>).data\n if (Array.isArray(data)) return data.filter((row) => row && typeof row === 'object') as Record<string, unknown>[]\n return [json as Record<string, unknown>]\n }\n return []\n}\n\n/** Prefer the Iris row for the burn's finality threshold (fast = 1000). */\nexport function selectCctpIrisFeeRow(\n rows: Record<string, unknown>[],\n finalityThreshold: number,\n): Record<string, unknown> {\n const match = rows.find((row) => Number(row.finalityThreshold) === finalityThreshold)\n return match ?? rows[0] ?? {}\n}\n\n/**\n * Fetch CCTP Forwarding Service burn fees from Circle Iris (`?forward=true`).\n * `maxFee` is the selected forwarding tier plus the protocol fee for `transferAmount`.\n */\nexport async function fetchCctpBurnFees(args: {\n sourceChainId: number\n sourceDomain: number\n destDomain: number\n feeTier?: CctpFeeTier\n /** USDC base units the recipient receives. Required for a maxFee that covers the protocol fee. */\n transferAmount?: bigint\n /** Iris fee row. Defaults to fast transfer (1000). */\n minFinalityThreshold?: number\n}): Promise<CctpBurnFeesResult> {\n const tier = args.feeTier ?? CCTP_DEFAULT_FEE_TIER\n const finalityThreshold = args.minFinalityThreshold ?? CCTP_DEFAULT_MIN_FINALITY_THRESHOLD\n const base = irisApiBaseForChainId(args.sourceChainId)\n const url = `${base}/v2/burn/USDC/fees/${args.sourceDomain}/${args.destDomain}?forward=true`\n const res = await fetch(url, { headers: { Accept: 'application/json' } })\n if (!res.ok) {\n const text = await res.text().catch(() => '')\n throw new Error(`Iris fee quote failed (${res.status}): ${text.slice(0, 200)}`)\n }\n const row = selectCctpIrisFeeRow(feeRows(await res.json()), finalityThreshold)\n const low = pickForwardFeeTier(row, 'low')\n const med = pickForwardFeeTier(row, 'med')\n const high = pickForwardFeeTier(row, 'high')\n const minimumFeeRaw = row.minimumFee\n const minimumFeeBps = typeof minimumFeeRaw === 'number' ? minimumFeeRaw : Number(minimumFeeRaw ?? 0)\n const transferAmount = args.transferAmount ?? 0n\n const protocolFee = cctpProtocolFeeBaseUnits(transferAmount, minimumFeeBps)\n const forwardForTier = tier === 'low' ? low : tier === 'high' ? high : med\n return {\n sourceDomain: args.sourceDomain,\n destDomain: args.destDomain,\n finalityThreshold: Number(row.finalityThreshold ?? finalityThreshold),\n minimumFeeBps: Number.isFinite(minimumFeeBps) ? minimumFeeBps : 0,\n protocolFee,\n maxFee: forwardForTier + protocolFee,\n forwardFeeLow: low,\n forwardFeeMed: med,\n forwardFeeHigh: high,\n maxFeeLow: low + protocolFee,\n maxFeeMed: med + protocolFee,\n maxFeeHigh: high + protocolFee,\n feeTierUsed: tier,\n }\n}\n","import { formatUnits } from 'viem'\nimport { CCTP_USDC_DECIMALS } from './constants.js'\n\n/** Trim trailing zeros from a USDC human amount (6 decimals). */\nexport function formatCctpUsdcHuman(wei: bigint): string {\n const raw = formatUnits(wei, CCTP_USDC_DECIMALS)\n if (!raw.includes('.')) return raw\n return raw.replace(/\\.?0+$/, '') || '0'\n}\n","import { http, type Transport } from 'viem'\n\n/**\n * Optional browser transport for protocol `eth_*` reads (allowance, decimals, spoke views).\n * Node / MCP leave this unset and use viem `http(rpcUrl)`.\n */\nlet evmRpcTransportFactory: ((rpcUrl: string) => Transport) | undefined\n\nexport function setDefiEvmRpcTransportFactory(factory: ((rpcUrl: string) => Transport) | undefined): void {\n evmRpcTransportFactory = factory\n}\n\nexport function getDefiEvmRpcTransportFactory(): ((rpcUrl: string) => Transport) | undefined {\n return evmRpcTransportFactory\n}\n\n/** Same-origin proxy in the browser when the app has called {@link setDefiEvmRpcTransportFactory}. */\nexport function defiEvmTransport(rpcUrl: string, opts?: Parameters<typeof http>[1]): Transport {\n const url = rpcUrl.trim()\n return evmRpcTransportFactory?.(url) ?? http(url, opts)\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n /** Unix seconds (UTC) for mpc-auth multiSignRequest expiryDate. */\n expiryDate?: number\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload, (_, v) => (typeof v === 'bigint' ? v.toString() : v))\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n if (input.expiryDate != null && input.expiryDate > 0) {\n bodyForSign.expiryDate = Math.floor(input.expiryDate)\n }\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import { keccak256, createPublicClient, defineChain, serializeTransaction, getAddress, parseGwei, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../core/defiEvmClient.js'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: defiEvmTransport(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n expiryDate: context.expiryDate,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import { createPublicClient, defineChain, getAddress, parseAbi, parseUnits } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { CCTP_USDC_DECIMALS } from './constants.js'\nimport { cctpChainConfig, isCctpRouteSupported } from './support.js'\n\nconst erc20BalanceAbi = parseAbi(['function balanceOf(address account) view returns (uint256)'])\n\nexport async function cctpAssertBurnPreconditions(args: {\n sourceChainId: number\n destChainId: number\n transferAmountHuman: string\n maxFee: bigint\n rpcUrl: string\n executorAddress: string\n}): Promise<{ transferAmount: bigint; totalBurn: bigint }> {\n if (!isCctpRouteSupported(args.sourceChainId, args.destChainId)) {\n throw new Error('CCTP route is not supported for the selected source and destination chains.')\n }\n const src = cctpChainConfig(args.sourceChainId)\n if (!src) throw new Error('Unsupported CCTP source chain.')\n const transferAmount = parseUnits(args.transferAmountHuman.trim(), CCTP_USDC_DECIMALS)\n if (transferAmount <= 0n) throw new Error('Transfer amount must be greater than zero.')\n const totalBurn = transferAmount + args.maxFee\n const ch = defineChain({\n id: args.sourceChainId,\n name: src.label,\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl.trim()] } },\n })\n const client = createPublicClient({ chain: ch, transport: defiEvmTransport(args.rpcUrl.trim()) })\n const owner = getAddress(args.executorAddress)\n const balance = await client.readContract({\n address: getAddress(src.usdc),\n abi: erc20BalanceAbi,\n functionName: 'balanceOf',\n args: [owner],\n })\n if (balance < totalBurn) {\n throw new Error(\n `Insufficient USDC on source chain: need ${totalBurn.toString()} (transfer + maxFee), have ${balance.toString()}.`,\n )\n }\n return { transferAmount, totalBurn }\n}\n","import {\n type Address,\n encodeFunctionData,\n getAddress,\n pad,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport type { EvmChainDetail, EvmTxStep } from '../../../chains/evm/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport {\n CCTP_DEFAULT_FEE_TIER,\n CCTP_DEFAULT_MIN_FINALITY_THRESHOLD,\n CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS,\n CCTP_ERC20_APPROVE_FALLBACK_GAS,\n CCTP_USDC_DECIMALS,\n FORWARDING_SERVICE_HOOK_DATA,\n type CctpFeeTier,\n} from './constants.js'\nimport { cctpChainConfig } from './support.js'\nimport { cctpAssertBurnPreconditions } from './prechecks.js'\nimport { fetchCctpBurnFees } from './fees.js'\nimport type { CctpBurnExtra } from './types.js'\n\ntype CctpStepKind = 'approve' | 'depositForBurnWithHook'\ntype CctpStep = EvmTxStep & { kind: CctpStepKind; fallbackGas?: bigint }\n\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\nconst tokenMessengerAbi = parseAbi([\n 'function depositForBurnWithHook(uint256 amount, uint32 destinationDomain, bytes32 mintRecipient, address burnToken, bytes32 destinationCaller, uint256 maxFee, uint32 minFinalityThreshold, bytes hookData)',\n])\n\nexport function buildCctpBurnExtraJSON(args: {\n sourceChainId: number\n sourceDomain: number\n destDomain: number\n destChainId: number\n transferAmount: bigint\n maxFee: bigint\n mintRecipient: Address\n burnToken: Address\n tokenMessenger: Address\n minFinalityThreshold: number\n proposalMaxFee: bigint\n feeTier?: CctpFeeTier\n}): CctpBurnExtra {\n return {\n version: 1,\n sourceChainId: args.sourceChainId,\n sourceDomain: args.sourceDomain,\n destDomain: args.destDomain,\n destChainId: args.destChainId,\n transferAmount: args.transferAmount.toString(),\n mintRecipient: pad(args.mintRecipient, { size: 32 }),\n burnToken: args.burnToken,\n tokenMessenger: args.tokenMessenger,\n useForwardingService: true,\n forwardingHookData: FORWARDING_SERVICE_HOOK_DATA,\n minFinalityThreshold: args.minFinalityThreshold,\n proposalMaxFee: args.proposalMaxFee.toString(),\n feeTier: args.feeTier,\n }\n}\n\nexport function buildCctpBurnSteps(args: {\n sourceChainId: number\n destChainId: number\n executorAddress: Address\n mintRecipient: Address\n transferAmount: bigint\n maxFee: bigint\n minFinalityThreshold: number\n currentAllowance?: bigint\n}): CctpStep[] {\n const src = cctpChainConfig(args.sourceChainId)\n const dst = cctpChainConfig(args.destChainId)\n if (!src || !dst) throw new Error('Unsupported CCTP source or destination chain.')\n const usdc = getAddress(src.usdc)\n const tokenMessenger = getAddress(src.tokenMessenger)\n const totalBurn = args.transferAmount + args.maxFee\n const mintRecipientBytes32 = pad(args.mintRecipient, { size: 32 })\n const destinationCaller = pad('0x', { size: 32 })\n\n const steps: CctpStep[] = []\n const allowance = args.currentAllowance ?? 0n\n if (allowance < totalBurn) {\n if (allowance > 0n) {\n steps.push({\n kind: 'approve',\n to: usdc,\n data: encodeFunctionData({ abi: erc20ApproveAbi, functionName: 'approve', args: [tokenMessenger, 0n] }),\n value: 0n,\n fallbackGas: CCTP_ERC20_APPROVE_FALLBACK_GAS,\n })\n }\n steps.push({\n kind: 'approve',\n to: usdc,\n data: encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [tokenMessenger, totalBurn],\n }),\n value: 0n,\n fallbackGas: CCTP_ERC20_APPROVE_FALLBACK_GAS,\n })\n }\n\n steps.push({\n kind: 'depositForBurnWithHook',\n to: tokenMessenger,\n data: encodeFunctionData({\n abi: tokenMessengerAbi,\n functionName: 'depositForBurnWithHook',\n args: [\n totalBurn,\n dst.domain,\n mintRecipientBytes32,\n usdc,\n destinationCaller,\n args.maxFee,\n args.minFinalityThreshold,\n FORWARDING_SERVICE_HOOK_DATA,\n ],\n }),\n value: 0n,\n fallbackGas: CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS,\n })\n return steps\n}\n\nexport async function buildEvmMultisignBodyCctpBurnBatch(args: {\n keyGen: KeyGenSubsetForPermit\n /** Source chain EIP-155 id (where burn executes). */\n sourceChainId: number\n destChainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n transferAmountHuman: string\n /** Recipient on destination chain (defaults to executor). */\n mintRecipient?: Address\n executorAddress: Address\n purposeText: string\n maxFee?: bigint\n feeTier?: CctpFeeTier\n minFinalityThreshold?: number\n /** Skip Iris fetch when caller already quoted (e.g. MCP feeSnapshot). */\n proposalMaxFee?: bigint\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const src = cctpChainConfig(args.sourceChainId)\n const dst = cctpChainConfig(args.destChainId)\n if (!src || !dst) throw new Error('Unsupported CCTP source or destination chain.')\n const executor = getAddress(args.executorAddress)\n const mintRecipient = getAddress(args.mintRecipient ?? executor)\n const minFinality = args.minFinalityThreshold ?? CCTP_DEFAULT_MIN_FINALITY_THRESHOLD\n const transferAmountForFee = parseUnits(args.transferAmountHuman.trim(), CCTP_USDC_DECIMALS)\n if (transferAmountForFee <= 0n) throw new Error('Transfer amount must be greater than zero.')\n\n let maxFee = args.maxFee\n let proposalMaxFee = args.proposalMaxFee ?? maxFee\n if (maxFee == null) {\n const fees = await fetchCctpBurnFees({\n sourceChainId: args.sourceChainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n feeTier: args.feeTier,\n transferAmount: transferAmountForFee,\n minFinalityThreshold: minFinality,\n })\n maxFee = fees.maxFee\n proposalMaxFee = fees.maxFee\n } else if (proposalMaxFee == null) {\n proposalMaxFee = maxFee\n }\n\n const { transferAmount } = await cctpAssertBurnPreconditions({\n sourceChainId: args.sourceChainId,\n destChainId: args.destChainId,\n transferAmountHuman: args.transferAmountHuman,\n maxFee,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n })\n\n /** Canonical 2-leg batch (approve + burn) so Get Sig rebuild matches leg count. */\n const steps = buildCctpBurnSteps({\n sourceChainId: args.sourceChainId,\n destChainId: args.destChainId,\n executorAddress: executor,\n mintRecipient,\n transferAmount,\n maxFee,\n minFinalityThreshold: minFinality,\n currentAllowance: 0n,\n })\n\n const cctpBurn = buildCctpBurnExtraJSON({\n sourceChainId: args.sourceChainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n destChainId: dst.chainId,\n transferAmount,\n maxFee,\n mintRecipient,\n burnToken: getAddress(src.usdc),\n tokenMessenger: getAddress(src.tokenMessenger),\n minFinalityThreshold: minFinality,\n proposalMaxFee,\n feeTier: args.feeTier ?? CCTP_DEFAULT_FEE_TIER,\n })\n\n const transferHuman = args.transferAmountHuman.trim()\n const totalBurn = transferAmount + maxFee\n const purposeSuffix = `CCTP (Forwarding Service): ${transferHuman} USDC ${src.label} → ${dst.label}.`\n\n const firstDataNo0x = steps[0]!.data.startsWith('0x') ? steps[0]!.data.slice(2) : steps[0]!.data\n\n const result = await buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.sourceChainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n buildBatchMeta: ({ step }) => {\n const s = step as CctpStep\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'CircleCCTP',\n name: 'USDC.approve',\n spender: src.tokenMessenger,\n amount: totalBurn.toString(),\n }),\n evm: { type: 'cctp_erc20_approve', version: 1, chainId: String(args.sourceChainId) },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'CircleCCTP',\n name: 'TokenMessengerV2.depositForBurnWithHook',\n destDomain: dst.domain,\n destChainId: dst.chainId,\n mintRecipient,\n transferAmount: transferAmount.toString(),\n maxFee: maxFee.toString(),\n }),\n evm: { type: 'cctp_deposit_for_burn_forward', version: 1, chainId: String(args.sourceChainId) },\n }\n },\n })\n\n const body = result.bodyForSign\n const existingExtra =\n typeof body.extraJSON === 'string'\n ? (JSON.parse(body.extraJSON) as Record<string, unknown>)\n : ((body.extraJSON as Record<string, unknown>) ?? {})\n body.extraJSON = JSON.stringify({ ...existingExtra, cctpBurn })\n return result\n}\n\n/** MCP / app entry: sourceChainId via chainId field. */\nexport async function buildEvmMultisignBodyCctpBurnBatchFromMcp(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n destChainId: number\n rpcUrl: string\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n transferAmountHuman: string\n mintRecipient?: string\n executorAddress: Address\n purposeText: string\n feeTier?: CctpFeeTier\n minFinalityThreshold?: number\n feeSnapshot?: Record<string, unknown>\n}) {\n const src = cctpChainConfig(args.chainId)\n const dst = cctpChainConfig(args.destChainId)\n if (!src || !dst) throw new Error('Unsupported CCTP source or destination chain.')\n const transferAmount = parseUnits(args.transferAmountHuman.trim(), CCTP_USDC_DECIMALS)\n const fees = await fetchCctpBurnFees({\n sourceChainId: args.chainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n feeTier: args.feeTier,\n transferAmount,\n minFinalityThreshold: args.minFinalityThreshold,\n })\n // A feeSnapshot cannot undercut the live quote. A higher snapshot is kept as an agreed cap.\n let maxFee = fees.maxFee\n if (args.feeSnapshot?.maxFee != null) {\n const snapshotMaxFee = BigInt(String(args.feeSnapshot.maxFee))\n if (snapshotMaxFee > maxFee) maxFee = snapshotMaxFee\n }\n return buildEvmMultisignBodyCctpBurnBatch({\n keyGen: args.keyGen,\n sourceChainId: args.chainId,\n destChainId: args.destChainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n transferAmountHuman: args.transferAmountHuman,\n mintRecipient: args.mintRecipient ? getAddress(args.mintRecipient) : undefined,\n executorAddress: args.executorAddress,\n purposeText: args.purposeText,\n maxFee,\n proposalMaxFee: maxFee,\n feeTier: args.feeTier,\n minFinalityThreshold: args.minFinalityThreshold,\n })\n}\n","import { type Address, getAddress } from 'viem'\nimport {\n CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS,\n CCTP_ERC20_APPROVE_FALLBACK_GAS,\n FORWARDING_SERVICE_HOOK_DATA,\n} from './constants.js'\nimport { buildCctpBurnSteps } from './multisign.js'\nimport type { CctpBurnExtra } from './types.js'\n\nexport type { CctpBurnExtra } from './types.js'\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nexport function parseCctpBurnExtraJSON(detail: Record<string, unknown> | null | undefined): CctpBurnExtra | null {\n const ex = parseExtraJsonObject(detail)\n const raw = ex?.cctpBurn\n if (!raw || typeof raw !== 'object' || Array.isArray(raw)) return null\n const c = raw as Record<string, unknown>\n if (c.useForwardingService !== true) return null\n const version = Number(c.version ?? 0)\n if (version !== 1) return null\n return {\n version: 1,\n sourceChainId: Number(c.sourceChainId ?? 0),\n sourceDomain: Number(c.sourceDomain),\n destDomain: Number(c.destDomain),\n destChainId: Number(c.destChainId),\n transferAmount: String(c.transferAmount ?? ''),\n mintRecipient: String(c.mintRecipient ?? ''),\n burnToken: String(c.burnToken ?? ''),\n tokenMessenger: String(c.tokenMessenger ?? ''),\n useForwardingService: true,\n forwardingHookData: String(c.forwardingHookData ?? FORWARDING_SERVICE_HOOK_DATA),\n minFinalityThreshold: Number(c.minFinalityThreshold ?? 1000),\n proposalMaxFee: String(c.proposalMaxFee ?? '0'),\n feeTier:\n c.feeTier === 'low' || c.feeTier === 'high' || c.feeTier === 'med' ? c.feeTier : undefined,\n }\n}\n\nexport function isCctpBurnEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n if (parseCctpBurnExtraJSON(detail)) return true\n const ex = parseExtraJsonObject(detail)\n if (batchIndex != null && batchIndex >= 0 && ex) {\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[batchIndex] && typeof bm[batchIndex] === 'object' && !Array.isArray(bm[batchIndex])) {\n const evm0 = (bm[batchIndex] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n const t = String((evm0 as Record<string, unknown>).type ?? '')\n return t === 'cctp_deposit_for_burn_forward' || t === 'cctp_erc20_approve'\n }\n }\n }\n const evm = ex?.evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return false\n const t = String((evm as Record<string, unknown>).type ?? '')\n return t === 'cctp_deposit_for_burn_forward'\n}\n\nexport function isCctpErc20ApproveEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n const bm = ex?.batchMeta\n if (Array.isArray(bm) && bm[index] && typeof bm[index] === 'object' && !Array.isArray(bm[index])) {\n const evm0 = (bm[index] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n return String((evm0 as Record<string, unknown>).type ?? '') === 'cctp_erc20_approve'\n }\n }\n return false\n}\n\nexport function resolveCctpBatchStepGasFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): bigint | null {\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n if (isCctpErc20ApproveEvmSignRequest(detail, index)) return CCTP_ERC20_APPROVE_FALLBACK_GAS\n if (isCctpBurnEvmSignRequest(detail, index)) return CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS\n return null\n}\n\nexport function rebuildCctpBurnCalldataAtGetSig(args: {\n cctpBurn: CctpBurnExtra\n freshMaxFee: bigint\n executorAddress: Address\n /** When true, always include approve legs (Get Sig cannot rely on live allowance). */\n forceApprove?: boolean\n}): Array<{ to: Address; data: `0x${string}` }> {\n const transferAmount = BigInt(args.cctpBurn.transferAmount)\n const mintRecipient = cctpMintRecipientAddressFromExtra(args.cctpBurn)\n const steps = buildCctpBurnSteps({\n sourceChainId: args.cctpBurn.sourceChainId,\n destChainId: args.cctpBurn.destChainId,\n executorAddress: args.executorAddress,\n mintRecipient,\n transferAmount,\n maxFee: args.freshMaxFee,\n minFinalityThreshold: args.cctpBurn.minFinalityThreshold,\n currentAllowance: args.forceApprove ? 0n : undefined,\n })\n return steps.map((s) => ({ to: s.to, data: s.data }))\n}\n\n/** Resolve mint recipient EVM address from bytes32 in extraJSON. */\nexport function cctpMintRecipientAddressFromExtra(cctpBurn: CctpBurnExtra): Address {\n const hex = cctpBurn.mintRecipient.startsWith('0x') ? cctpBurn.mintRecipient.slice(2) : cctpBurn.mintRecipient\n return getAddress(`0x${hex.slice(-40)}`)\n}\n\nexport { CCTP_ERC20_APPROVE_FALLBACK_GAS, CCTP_DEPOSIT_FOR_BURN_FALLBACK_GAS }\n","import { createPublicClient, defineChain, getAddress, parseAbi, parseUnits } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { CCTP_DEFAULT_FEE_TIER, CCTP_USDC_DECIMALS } from './constants.js'\nimport { cctpChainConfig, cctpSupportedRoutes, irisApiBaseForChainId } from './support.js'\nimport type { CctpNetworkKind } from './constants.js'\nimport { fetchCctpBurnFees } from './fees.js'\nimport { formatCctpUsdcHuman } from './format.js'\nimport { parseCctpBurnExtraJSON } from './executeHelpers.js'\n\nconst erc20BalanceAbi = parseAbi(['function balanceOf(address account) view returns (uint256)'])\n\nexport async function cctpFetchSupportedRoutes(args?: { network?: CctpNetworkKind }) {\n return { routes: cctpSupportedRoutes(args?.network) }\n}\n\nexport type CctpMcpFeeFields = {\n feeTierUsed: import('./constants.js').CctpFeeTier\n maxFee: string\n maxFeeHuman: string\n /** Iris forwarding component only. maxFee adds the protocol fee on top. */\n forwardFeeLow: string\n forwardFeeLowHuman: string\n forwardFeeMed: string\n forwardFeeMedHuman: string\n forwardFeeHigh: string\n forwardFeeHighHuman: string\n /** forwardFee tier + protocol fee. Present on a live Iris quote. */\n maxFeeLow?: string\n maxFeeLowHuman?: string\n maxFeeMed?: string\n maxFeeMedHuman?: string\n maxFeeHigh?: string\n maxFeeHighHuman?: string\n minimumFeeBps?: number\n protocolFee?: string\n protocolFeeHuman?: string\n finalityThreshold?: number\n transferAmount?: string\n transferAmountHuman?: string\n totalBurn?: string\n totalBurnHuman?: string\n feeSummary: string\n}\n\nfunction buildCctpMcpFeeFields(args: {\n fees: Awaited<ReturnType<typeof fetchCctpBurnFees>>\n transferAmount?: bigint\n transferAmountHuman?: string\n}): CctpMcpFeeFields {\n const { fees, transferAmount, transferAmountHuman } = args\n const maxFeeHuman = formatCctpUsdcHuman(fees.maxFee)\n const forwardFeeLowHuman = formatCctpUsdcHuman(fees.forwardFeeLow)\n const forwardFeeMedHuman = formatCctpUsdcHuman(fees.forwardFeeMed)\n const forwardFeeHighHuman = formatCctpUsdcHuman(fees.forwardFeeHigh)\n const protocolFeeHuman = formatCctpUsdcHuman(fees.protocolFee)\n let totalBurn: bigint | undefined\n let totalBurnHuman: string | undefined\n if (transferAmount != null && transferAmount > 0n) {\n totalBurn = transferAmount + fees.maxFee\n totalBurnHuman = formatCctpUsdcHuman(totalBurn)\n }\n const recipientPart =\n transferAmountHuman != null && totalBurnHuman != null\n ? ` Recipient receives ${transferAmountHuman} USDC; wallet burns ${totalBurnHuman} USDC total (transfer + max fee).`\n : ' Pass transferAmountHuman so maxFee includes the fast-transfer protocol fee.'\n const feeSummary = `CCTP max fee (${fees.feeTierUsed} tier): ${maxFeeHuman} USDC = forwarding ${formatCctpUsdcHuman(fees.feeTierUsed === 'low' ? fees.forwardFeeLow : fees.feeTierUsed === 'high' ? fees.forwardFeeHigh : fees.forwardFeeMed)} + protocol ${protocolFeeHuman} (${fees.minimumFeeBps} bps, finality ${fees.finalityThreshold}).${recipientPart} Combined tiers — low: ${formatCctpUsdcHuman(fees.maxFeeLow)}, med: ${formatCctpUsdcHuman(fees.maxFeeMed)}, high: ${formatCctpUsdcHuman(fees.maxFeeHigh)} USDC. Fees refresh again at Get Sig.`\n return {\n feeTierUsed: fees.feeTierUsed,\n maxFee: fees.maxFee.toString(),\n maxFeeHuman,\n forwardFeeLow: fees.forwardFeeLow.toString(),\n forwardFeeLowHuman,\n forwardFeeMed: fees.forwardFeeMed.toString(),\n forwardFeeMedHuman,\n forwardFeeHigh: fees.forwardFeeHigh.toString(),\n forwardFeeHighHuman,\n maxFeeLow: fees.maxFeeLow.toString(),\n maxFeeLowHuman: formatCctpUsdcHuman(fees.maxFeeLow),\n maxFeeMed: fees.maxFeeMed.toString(),\n maxFeeMedHuman: formatCctpUsdcHuman(fees.maxFeeMed),\n maxFeeHigh: fees.maxFeeHigh.toString(),\n maxFeeHighHuman: formatCctpUsdcHuman(fees.maxFeeHigh),\n minimumFeeBps: fees.minimumFeeBps,\n protocolFee: fees.protocolFee.toString(),\n protocolFeeHuman,\n finalityThreshold: fees.finalityThreshold,\n ...(transferAmount != null ? { transferAmount: transferAmount.toString() } : {}),\n ...(transferAmountHuman != null ? { transferAmountHuman } : {}),\n ...(totalBurn != null ? { totalBurn: totalBurn.toString() } : {}),\n ...(totalBurnHuman != null ? { totalBurnHuman } : {}),\n feeSummary,\n }\n}\n\n/** Fee summary for MCP build tool results (from bodyForSign.extraJSON.cctpBurn). */\nexport function cctpFeeSummaryFromBodyForSign(bodyForSign: Record<string, unknown>): CctpMcpFeeFields | null {\n const cctpBurn = parseCctpBurnExtraJSON(bodyForSign)\n if (!cctpBurn) return null\n const transferAmount = BigInt(cctpBurn.transferAmount)\n const maxFee = BigInt(cctpBurn.proposalMaxFee)\n const totalBurn = transferAmount + maxFee\n const transferAmountHuman = formatCctpUsdcHuman(transferAmount)\n const maxFeeHuman = formatCctpUsdcHuman(maxFee)\n const totalBurnHuman = formatCctpUsdcHuman(totalBurn)\n const tier = cctpBurn.feeTier ?? CCTP_DEFAULT_FEE_TIER\n const src = cctpChainConfig(cctpBurn.sourceChainId)\n const dst = cctpChainConfig(cctpBurn.destChainId)\n const routePart =\n src && dst ? ` Route: ${src.label} → ${dst.label}.` : ''\n return {\n feeTierUsed: tier,\n maxFee: maxFee.toString(),\n maxFeeHuman,\n forwardFeeLow: maxFee.toString(),\n forwardFeeLowHuman: maxFeeHuman,\n forwardFeeMed: maxFee.toString(),\n forwardFeeMedHuman: maxFeeHuman,\n forwardFeeHigh: maxFee.toString(),\n forwardFeeHighHuman: maxFeeHuman,\n transferAmount: transferAmount.toString(),\n transferAmountHuman,\n totalBurn: totalBurn.toString(),\n totalBurnHuman,\n feeSummary: `Proposed CCTP burn.${routePart} Recipient receives ${transferAmountHuman} USDC; proposal max fee (${tier} tier): ${maxFeeHuman} USDC; total burn ${totalBurnHuman} USDC. Max fee refreshes at Get Sig.`,\n }\n}\n\nexport async function cctpFetchUsdcBalance(args: {\n chainId: number\n executorAddress: string\n rpcUrl: string\n transferAmountHuman?: string\n feeSnapshot?: { maxFee?: string | number | bigint }\n}) {\n const cfg = cctpChainConfig(args.chainId)\n if (!cfg) throw new Error(`Chain ${args.chainId} is not CCTP-supported.`)\n const ch = defineChain({\n id: args.chainId,\n name: cfg.label,\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl.trim()] } },\n })\n const client = createPublicClient({ chain: ch, transport: defiEvmTransport(args.rpcUrl.trim()) })\n const owner = getAddress(args.executorAddress)\n const balanceRaw = await client.readContract({\n address: getAddress(cfg.usdc),\n abi: erc20BalanceAbi,\n functionName: 'balanceOf',\n args: [owner],\n })\n const out: Record<string, unknown> = {\n balanceRaw: balanceRaw.toString(),\n balanceUsdcHuman: formatCctpUsdcHuman(balanceRaw),\n usdcAddress: cfg.usdc,\n }\n const transferHuman = args.transferAmountHuman?.trim()\n const maxFeeRaw = args.feeSnapshot?.maxFee\n if (transferHuman && maxFeeRaw != null) {\n const transferAmount = parseUnits(transferHuman, CCTP_USDC_DECIMALS)\n const maxFee = BigInt(String(maxFeeRaw))\n const totalRequired = transferAmount + maxFee\n out.requiredTotalBurnRaw = totalRequired.toString()\n out.requiredTotalBurnHuman = formatCctpUsdcHuman(totalRequired)\n out.sufficientForTransfer = balanceRaw >= totalRequired\n out.feeSummary = `Wallet holds ${out.balanceUsdcHuman} USDC; transfer requires ${formatCctpUsdcHuman(totalRequired)} USDC (${transferHuman} + ${formatCctpUsdcHuman(maxFee)} max fee).`\n }\n return out\n}\n\nexport async function cctpFetchTransferStatus(args: {\n sourceChainId: number\n sourceDomain: number\n burnTxHash: string\n}) {\n const base = irisApiBaseForChainId(args.sourceChainId)\n const hash = args.burnTxHash.trim().replace(/^0x/, '')\n const url = `${base}/v2/messages/${args.sourceDomain}?transactionHash=0x${hash}`\n const res = await fetch(url, { headers: { Accept: 'application/json' } })\n if (!res.ok) {\n const text = await res.text().catch(() => '')\n throw new Error(`Iris message lookup failed (${res.status}): ${text.slice(0, 200)}`)\n }\n const json = (await res.json()) as Record<string, unknown>\n const messages = (json.messages ?? json.data ?? []) as unknown[]\n const first = (messages[0] ?? json) as Record<string, unknown>\n return {\n status: String(first.status ?? 'unknown'),\n attestation: typeof first.attestation === 'string' ? first.attestation : undefined,\n message: first.message,\n eventNonce: first.eventNonce,\n }\n}\n\nexport async function cctpFetchBurnFeesForRoute(args: {\n sourceChainId: number\n destChainId: number\n transferAmountHuman?: string\n feeTier?: import('./constants.js').CctpFeeTier\n minFinalityThreshold?: number\n}) {\n const src = cctpChainConfig(args.sourceChainId)\n const dst = cctpChainConfig(args.destChainId)\n if (!src || !dst) throw new Error('Unsupported source or destination chain for CCTP.')\n if (src.network !== dst.network) throw new Error('Source and destination must be on the same network (mainnet or testnet).')\n if (src.chainId === dst.chainId) throw new Error('Source and destination must differ.')\n const transferHuman = args.transferAmountHuman?.trim()\n const transferAmount = transferHuman ? parseUnits(transferHuman, CCTP_USDC_DECIMALS) : undefined\n const fees = await fetchCctpBurnFees({\n sourceChainId: args.sourceChainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n feeTier: args.feeTier,\n transferAmount,\n minFinalityThreshold: args.minFinalityThreshold,\n })\n const feeFields = buildCctpMcpFeeFields({\n fees,\n transferAmount,\n transferAmountHuman: transferHuman || undefined,\n })\n return {\n sourceChainId: args.sourceChainId,\n destChainId: args.destChainId,\n sourceDomain: src.domain,\n destDomain: dst.domain,\n sourceLabel: src.label,\n destLabel: dst.label,\n network: src.network,\n fees: feeFields,\n ...feeFields,\n }\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { CIRCLE_CCTP_PROTOCOL_ID } from './constants.js'\nimport { isCctpSourceChainSupported } from './support.js'\n\nexport * from './constants.js'\nexport * from './support.js'\nexport * from './fees.js'\nexport * from './format.js'\nexport * from './reads.js'\nexport * from './prechecks.js'\nexport * from './multisign.js'\nexport * from './executeHelpers.js'\nexport * from './types.js'\n\nexport const circleCctpProtocolModule: ProtocolModule = {\n id: CIRCLE_CCTP_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isCctpSourceChainSupported(ctx.chainId)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n {\n id: 'circle-cctp.fetch-routes',\n protocolId: CIRCLE_CCTP_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'List supported CCTP Forwarding Service routes (EVM)',\n commonParams: [],\n params: {\n network: { type: 'string', required: false, description: 'mainnet | testnet' },\n },\n },\n {\n id: 'circle-cctp.fetch-fees',\n protocolId: CIRCLE_CCTP_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Quote Iris forwarding fee plus fast-transfer protocol fee for a route',\n commonParams: [],\n params: {\n sourceChainId: { type: 'number', required: true, description: 'Source EIP-155 chain id' },\n destChainId: { type: 'number', required: true, description: 'Destination EIP-155 chain id' },\n transferAmountHuman: { type: 'string', required: true, description: 'USDC amount recipient receives' },\n },\n },\n {\n id: 'circle-cctp.burn-forward',\n protocolId: CIRCLE_CCTP_PROTOCOL_ID,\n chainCategory: 'evm',\n description: 'Burn USDC on source chain via CCTP Forwarding Service (approve + depositForBurnWithHook batch)',\n commonParams: ['keyGen', 'purposeText', 'useCustomGas'],\n params: {\n sourceChainId: { type: 'number', required: true, description: 'Source EIP-155 chain id' },\n destChainId: { type: 'number', required: true, description: 'Destination EIP-155 chain id' },\n transferAmountHuman: { type: 'string', required: true, description: 'USDC amount recipient receives' },\n mintRecipient: { type: 'address', required: false, description: 'Destination mint recipient (default executor)' },\n },\n },\n ],\n}\n\nregisterProtocolModule(circleCctpProtocolModule)\n"]}
|