@continuumdao/ctm-mpc-defi 0.2.0 → 0.2.2

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.
Files changed (100) hide show
  1. package/README.md +20 -78
  2. package/dist/agent/catalog.cjs +563 -5
  3. package/dist/agent/catalog.cjs.map +1 -1
  4. package/dist/agent/catalog.d.ts +166 -20
  5. package/dist/agent/catalog.js +551 -7
  6. package/dist/agent/catalog.js.map +1 -1
  7. package/dist/agent/skills/aave-v4/SKILL.md +43 -0
  8. package/dist/agent/skills/curve-dao/SKILL.md +13 -0
  9. package/dist/agent/skills/ethena/SKILL.md +10 -0
  10. package/dist/agent/skills/euler-v2/SKILL.md +10 -0
  11. package/dist/agent/skills/lido/SKILL.md +22 -0
  12. package/dist/agent/skills/maple-syrup/SKILL.md +10 -0
  13. package/dist/agent/skills/sky/SKILL.md +10 -0
  14. package/dist/agent/skills/uniswap-v4/SKILL.md +22 -0
  15. package/dist/chains/evm/index.cjs +79 -224
  16. package/dist/chains/evm/index.cjs.map +1 -1
  17. package/dist/chains/evm/index.d.ts +26 -26
  18. package/dist/chains/evm/index.js +69 -209
  19. package/dist/chains/evm/index.js.map +1 -1
  20. package/dist/chains/near/index.d.ts +1 -1
  21. package/dist/chains/solana/index.d.ts +1 -1
  22. package/dist/core/index.cjs +68 -106
  23. package/dist/core/index.cjs.map +1 -1
  24. package/dist/core/index.d.ts +21 -36
  25. package/dist/core/index.js +57 -96
  26. package/dist/core/index.js.map +1 -1
  27. package/dist/{envelope-CcE5Cz_q.d.ts → envelope-CpBUh9eP.d.ts} +1 -1
  28. package/dist/index.cjs +356 -1855
  29. package/dist/index.cjs.map +1 -1
  30. package/dist/index.d.ts +7 -11
  31. package/dist/index.js +332 -1826
  32. package/dist/index.js.map +1 -1
  33. package/dist/protocols/evm/aave-v4/index.cjs +1152 -669
  34. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  35. package/dist/protocols/evm/aave-v4/index.d.ts +418 -3
  36. package/dist/protocols/evm/aave-v4/index.js +1126 -670
  37. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  38. package/dist/protocols/evm/curve-dao/index.cjs +257 -131
  39. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  40. package/dist/protocols/evm/curve-dao/index.d.ts +69 -5
  41. package/dist/protocols/evm/curve-dao/index.js +242 -124
  42. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  43. package/dist/protocols/evm/ethena/index.cjs +394 -402
  44. package/dist/protocols/evm/ethena/index.cjs.map +1 -1
  45. package/dist/protocols/evm/ethena/index.d.ts +47 -3
  46. package/dist/protocols/evm/ethena/index.js +390 -404
  47. package/dist/protocols/evm/ethena/index.js.map +1 -1
  48. package/dist/protocols/evm/euler-v2/index.cjs +2810 -1191
  49. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  50. package/dist/protocols/evm/euler-v2/index.d.ts +465 -3
  51. package/dist/protocols/evm/euler-v2/index.js +2761 -1192
  52. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  53. package/dist/protocols/evm/lido/index.cjs +351 -236
  54. package/dist/protocols/evm/lido/index.cjs.map +1 -1
  55. package/dist/protocols/evm/lido/index.d.ts +34 -4
  56. package/dist/protocols/evm/lido/index.js +348 -238
  57. package/dist/protocols/evm/lido/index.js.map +1 -1
  58. package/dist/protocols/evm/maple/index.cjs +390 -395
  59. package/dist/protocols/evm/maple/index.cjs.map +1 -1
  60. package/dist/protocols/evm/maple/index.d.ts +23 -3
  61. package/dist/protocols/evm/maple/index.js +390 -397
  62. package/dist/protocols/evm/maple/index.js.map +1 -1
  63. package/dist/protocols/evm/sky/index.cjs +454 -232
  64. package/dist/protocols/evm/sky/index.cjs.map +1 -1
  65. package/dist/protocols/evm/sky/index.d.ts +57 -3
  66. package/dist/protocols/evm/sky/index.js +444 -231
  67. package/dist/protocols/evm/sky/index.js.map +1 -1
  68. package/dist/protocols/evm/uniswap-v4/index.cjs +423 -658
  69. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  70. package/dist/protocols/evm/uniswap-v4/index.d.ts +3 -4
  71. package/dist/protocols/evm/uniswap-v4/index.js +422 -657
  72. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  73. package/dist/{registry-oMKlO_5z.d.ts → registry-Bv5o37_w.d.ts} +1 -1
  74. package/dist/{types-Ce2qNHai.d.cts → types-BfjWdw1j.d.ts} +3 -1
  75. package/dist/{types-5u863Fd9.d.ts → types-DUeNJLr9.d.ts} +1 -1
  76. package/package.json +7 -6
  77. package/dist/agent/catalog.d.cts +0 -939
  78. package/dist/chains/evm/index.d.cts +0 -64
  79. package/dist/chains/near/index.d.cts +0 -37
  80. package/dist/chains/solana/index.d.cts +0 -40
  81. package/dist/core/index.d.cts +0 -43
  82. package/dist/envelope-DYDPnrHZ.d.cts +0 -35
  83. package/dist/index.d.cts +0 -16
  84. package/dist/keygen-CfNp8yKJ.d.cts +0 -9
  85. package/dist/keygen-DsINazx8.d.ts +0 -9
  86. package/dist/nodeRead-BnmSaMGO.d.cts +0 -8
  87. package/dist/nodeRead-BnmSaMGO.d.ts +0 -8
  88. package/dist/protocols/evm/aave-v4/index.d.cts +0 -500
  89. package/dist/protocols/evm/curve-dao/index.d.cts +0 -147
  90. package/dist/protocols/evm/ethena/index.d.cts +0 -161
  91. package/dist/protocols/evm/euler-v2/index.d.cts +0 -317
  92. package/dist/protocols/evm/lido/index.d.cts +0 -120
  93. package/dist/protocols/evm/maple/index.d.cts +0 -109
  94. package/dist/protocols/evm/sky/index.d.cts +0 -218
  95. package/dist/protocols/evm/uniswap-v4/index.d.cts +0 -324
  96. package/dist/registry-BwZoE668.d.cts +0 -8
  97. package/dist/txParams-BC7ogvdR.d.cts +0 -19
  98. package/dist/txParams-BC7ogvdR.d.ts +0 -19
  99. package/dist/types-B8idm_gu.d.cts +0 -34
  100. package/dist/types-Ce2qNHai.d.ts +0 -57
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/chains/evm/types.ts","../../../src/chains/evm/txParams.ts","../../../src/core/keygen.ts","../../../src/core/purpose.ts","../../../src/core/envelope.ts","../../../src/chains/evm/fees/chainFees.ts","../../../src/chains/evm/fees/eip1559Align.ts","../../../src/chains/evm/buildBatch.ts","../../../src/chains/evm/fees/customGas.ts","../../../src/chains/evm/chainIdParse.ts","../../../src/chains/evm/rpcUrl.ts"],"names":["getAddress","zeroAddress","defineChain","createPublicClient","http","formatUnits","gasPriceGwei","parseGwei","serializeTransaction","keccak256"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EvmTokenKind, MultisignCommonArgs } from '../../core/types.js'\nimport { getAddress, zeroAddress, type Address } from 'viem'\n\nexport type EvmChainDetail = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nexport interface EvmProtocolContext extends MultisignCommonArgs {\n chainCategory: 'evm'\n chainId: number\n rpcUrl: string\n executorAddress: Address\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n}\n\nexport type EvmTxStep = {\n to: Address\n data: `0x${string}`\n value: bigint\n /** Fallback when estimateGas reverts */\n fallbackGas?: bigint\n /** When set, use routerSwapGasLimitFromEstimate instead of plain estimate */\n routerSwap?: boolean\n}\n\nexport function isEvmNativeToken(address: string): boolean {\n try {\n return getAddress(address as `0x${string}`) === zeroAddress\n } catch {\n return address.toLowerCase() === zeroAddress\n }\n}\n\nexport function matchEvmTokenKind(\n kind: EvmTokenKind,\n address: string,\n): boolean {\n if (kind === 'native') return isEvmNativeToken(address)\n if (kind === 'erc20' || kind === 'ctmerc20' || kind === 'ctmrwa1') {\n return !isEvmNativeToken(address)\n }\n return true\n}\n","/**\n * Proposal-time EVM fields for POST /multiSignRequest (mpc-auth).\n * Same shape as trigger txParams and GET /getSignRequestById?tx_params=1.\n */\n\nexport type ProposalTxParams = {\n nonce: number\n gasLimit: string\n txType: 'eip1559' | 'legacy'\n maxFeePerGas?: string\n maxPriorityFeePerGas?: string\n gasPrice?: string\n}\n\nexport function gasLimitFromEstimateAndChainConfig(\n estimatedGas: bigint,\n chainGasLimit?: number,\n): bigint {\n if (chainGasLimit == null || !Number.isFinite(chainGasLimit) || chainGasLimit <= 0) {\n return estimatedGas\n }\n const cfg = BigInt(Math.floor(chainGasLimit))\n return cfg > estimatedGas ? cfg : estimatedGas\n}\n\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\nexport function composeFeePayloadToTxParams(\n p: Record<string, unknown>,\n legacy: boolean,\n): ProposalTxParams | undefined {\n const gl = p.txGasLimit ?? p.txgaslimit\n if (gl == null || String(gl).trim() === '') return undefined\n const n = p.txNonce ?? p.txnonce\n let nonce = 0\n if (typeof n === 'bigint') nonce = Number(n)\n else if (typeof n === 'number') nonce = n\n else if (n != null) nonce = parseInt(String(n), 10)\n if (!Number.isFinite(nonce)) nonce = 0\n const gasLimit = String(gl)\n if (legacy) {\n const gp = p.txGasPrice ?? p.txgasprice\n return {\n nonce,\n gasLimit,\n txType: 'legacy',\n gasPrice: gp != null ? String(gp) : '0',\n }\n }\n return {\n nonce,\n gasLimit,\n txType: 'eip1559',\n maxFeePerGas: String(p.txMaxFeePerGas ?? ''),\n maxPriorityFeePerGas: String(p.txMaxPriorityFeePerGas ?? ''),\n }\n}\n\nexport function triggerTxParamsFromComposeBody(body: Record<string, unknown>): ProposalTxParams {\n const existing = body.txParams\n if (existing && typeof existing === 'object' && !Array.isArray(existing)) {\n const o = existing as ProposalTxParams & { gasLimit?: string }\n if (String(o.gasLimit ?? '').trim() !== '') {\n return { ...o }\n }\n }\n const pb = body.proposalTxParams\n if (Array.isArray(pb) && pb.length > 0 && typeof pb[0] === 'object' && pb[0] !== null) {\n const first = pb[0] as ProposalTxParams & { gasLimit?: string }\n if (String(first.gasLimit ?? '').trim() !== '') {\n return { ...first }\n }\n }\n const fromSnapshot = composeFeePayloadToTxParams(\n body,\n body.txMaxFeePerGas == null && body.txMaxPriorityFeePerGas == null,\n )\n if (fromSnapshot) return fromSnapshot\n return {\n nonce: 0,\n gasLimit: '',\n txType: 'legacy',\n gasPrice: '0',\n }\n}\n\nexport function proposalTxParamsToFeeSnapshot(\n params: ProposalTxParams,\n): Record<string, unknown> {\n if (params.txType === 'legacy') {\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txGasPrice: params.gasPrice ?? '0',\n }\n }\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txMaxFeePerGas: params.maxFeePerGas ?? '',\n txMaxPriorityFeePerGas: params.maxPriorityFeePerGas ?? '',\n }\n}\n","import type { KeyGenSubset } from './types.js'\n\nexport type { KeyGenSubset }\n\n/** App-compatible alias used by existing multisign builders. */\nexport type KeyGenSubsetForPermit = KeyGenSubset\n\nexport function firstClientIdFromKeyGen(data: KeyGenSubset | null | undefined): string | null {\n const map = data?.ClientKeys\n if (!map || typeof map !== 'object') return null\n for (const v of Object.values(map)) {\n if (typeof v === 'string' && v.trim()) return v.trim()\n }\n return null\n}\n\nexport function requirePubKeyHex(keyGen: KeyGenSubset): string {\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n return ph\n}\n\nexport function keyListFromKeyGen(keyGen: KeyGenSubset): string[] {\n return keyGen.keylist ?? []\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, 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 } from './types.js'\nimport type { KeyGenSubset } from './keygen.js'\nimport { firstClientIdFromKeyGen } from './keygen.js'\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}\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 = firstClientIdFromKeyGen(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)\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 return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { createPublicClient, http, defineChain, formatUnits } from 'viem'\n\nexport interface ChainFeeParams {\n isEip1559: boolean\n baseFeeGwei?: number\n priorityFeeGwei?: number\n gasPriceGwei?: number\n}\n\nexport async function fetchChainFeeParams(\n rpcUrl: string,\n chainId: number | string,\n): Promise<ChainFeeParams> {\n const url = rpcUrl.trim()\n if (!url) return { isEip1559: false }\n\n const chainIdNum = typeof chainId === 'string' ? parseInt(chainId, 10) : chainId\n if (Number.isNaN(chainIdNum)) return { isEip1559: false }\n\n const chain = defineChain({\n id: chainIdNum,\n name: 'Discovery',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [url] } },\n })\n\n const publicClient = createPublicClient({\n chain,\n transport: http(url),\n })\n\n const getGasPriceGwei = async (): Promise<number> => {\n const gasPriceWei = await publicClient.getGasPrice()\n return parseFloat(formatUnits(gasPriceWei, 9))\n }\n\n try {\n const block = await publicClient.getBlock({ blockTag: 'latest' })\n const baseFeePerGas = block?.baseFeePerGas\n if (baseFeePerGas == null || baseFeePerGas === undefined) {\n const gasPriceGwei = await getGasPriceGwei()\n return { isEip1559: false, gasPriceGwei }\n }\n\n const baseFeeGwei = parseFloat(formatUnits(baseFeePerGas, 9))\n\n let priorityFeeGwei: number | undefined\n try {\n const priorityWei = await publicClient.estimateMaxPriorityFeePerGas()\n priorityFeeGwei = parseFloat(formatUnits(priorityWei, 9))\n } catch {\n /* chain may not support eth_maxPriorityFeePerGas */\n }\n\n const gasPriceGwei = await getGasPriceGwei()\n return {\n isEip1559: true,\n baseFeeGwei,\n priorityFeeGwei,\n gasPriceGwei,\n }\n } catch {\n try {\n const gasPriceWei = await publicClient.getGasPrice()\n const gasPriceGwei = parseFloat(formatUnits(gasPriceWei, 9))\n return { isEip1559: false, gasPriceGwei }\n } catch {\n return { isEip1559: false }\n }\n }\n}\n","import { parseGwei } from 'viem'\n\nexport type ResolvedEip1559Fees = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\n\nfunction finalizeEip1559Fees(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n floor: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint } | null | undefined,\n baseWei: bigint,\n): ResolvedEip1559Fees {\n let maxP = maxPriorityFeePerGas\n let maxF = maxFeePerGas\n if (floor) {\n if (maxP < floor.maxPriorityFeePerGas) maxP = floor.maxPriorityFeePerGas\n if (maxF < floor.maxFeePerGas) maxF = floor.maxFeePerGas\n }\n if (baseWei > 0n && maxF < baseWei + maxP) {\n maxF = baseWei + maxP + parseGwei('0.001')\n }\n if (maxF < maxP) {\n maxF = baseWei > 0n ? baseWei + maxP + parseGwei('0.001') : maxP * 2n\n }\n return { maxFeePerGas: maxF, maxPriorityFeePerGas: maxP }\n}\n\n/** Align EIP-1559 fees with the latest head base fee (same rules as Get Sig). */\nexport function alignEip1559FeesWithLatestBase(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n latestBlockBaseFeeWei: bigint,\n): ResolvedEip1559Fees {\n return finalizeEip1559Fees(maxFeePerGas, maxPriorityFeePerGas, null, latestBlockBaseFeeWei)\n}\n\nexport function gweiToDecimalString(n: number): string {\n if (!Number.isFinite(n)) return '0'\n if (n === 0) return '0'\n const s = String(n)\n if (s.indexOf('e') !== -1 || s.indexOf('E') !== -1) return n.toFixed(9).replace(/\\.?0+$/, '') || '0'\n return s\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/keygen.js'\nimport { fetchChainFeeParams } from './fees/chainFees.js'\nimport { alignEip1559FeesWithLatestBase, gweiToDecimalString } from './fees/eip1559Align.js'\nimport {\n gasLimitFromEstimateAndChainConfig,\n routerSwapGasLimitFromEstimate,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from './txParams.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}\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: http(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 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 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 })\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 type { EvmChainDetail } from '../types.js'\n\n/** Snapshot chain gas config for extraJSON when Use Custom Gas is on. */\nexport function chainSnapshotForCustomGasExtraJSON(chainDetail: EvmChainDetail): Record<string, unknown> {\n const lr = chainDetail.legacy as boolean | string | undefined\n const legacy = lr === true || (typeof lr === 'string' && lr.toLowerCase() === 'true')\n\n const push = (o: Record<string, unknown>, key: string, v: unknown) => {\n if (v === undefined || v === null) return\n if (typeof v === 'string' && v.trim() === '') return\n o[key] = v\n }\n\n const fields: Record<string, unknown> = {}\n push(fields, 'gasLimit', chainDetail.gasLimit)\n if (legacy) {\n push(fields, 'gasMultiplier', chainDetail.gasMultiplier)\n push(fields, 'gasPrice', chainDetail.gasPrice)\n } else {\n push(fields, 'gasMultiplier', chainDetail.gasMultiplier)\n push(fields, 'baseFee', chainDetail.baseFee)\n push(fields, 'priorityFee', chainDetail.priorityFee)\n push(fields, 'baseFeeMultiplier', chainDetail.baseFeeMultiplier)\n }\n push(fields, 'legacy', legacy)\n return fields\n}\n","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? 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 rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","export function isValidRpcUrl(url: string): boolean {\n const t = url.trim()\n if (!t) return false\n try {\n const u = new URL(t)\n return u.protocol === 'http:' || u.protocol === 'https:'\n } catch {\n return false\n }\n}\n"]}
1
+ {"version":3,"sources":["../../../src/chains/evm/types.ts","../../../src/core/purpose.ts","../../../src/core/envelope.ts","../../../src/chains/evm/routerSwapGas.ts","../../../src/chains/evm/buildBatch.ts","../../../src/chains/evm/chainIdParse.ts","../../../src/chains/evm/normalizeAmount.ts","../../../src/chains/evm/coingecko.ts"],"names":["getAddress","zeroAddress","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","http","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","parseUnits","formatUnits"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { EvmTokenKind, MultisignCommonArgs } from '../../core/types.js'\nimport { getAddress, zeroAddress, type Address } from 'viem'\n\nexport type EvmChainDetail = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nexport interface EvmProtocolContext extends MultisignCommonArgs {\n chainCategory: 'evm'\n chainId: number\n rpcUrl: string\n executorAddress: Address\n chainDetail: EvmChainDetail\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n}\n\nexport type EvmTxStep = {\n to: Address\n data: `0x${string}`\n value: bigint\n /** Fallback when estimateGas reverts */\n fallbackGas?: bigint\n /** When set, use routerSwapGasLimitFromEstimate instead of plain estimate */\n routerSwap?: boolean\n}\n\nexport function isEvmNativeToken(address: string): boolean {\n try {\n return getAddress(address as `0x${string}`) === zeroAddress\n } catch {\n return address.toLowerCase() === zeroAddress\n }\n}\n\nexport function matchEvmTokenKind(\n kind: EvmTokenKind,\n address: string,\n): boolean {\n if (kind === 'native') return isEvmNativeToken(address)\n if (kind === 'erc20' || kind === 'ctmerc20' || kind === 'ctmrwa1') {\n return !isEvmNativeToken(address)\n }\n return true\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, 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}\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)\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 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 {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\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: http(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 })\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","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? 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 rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { formatUnits, parseUnits } from 'viem'\n\n/**\n * Canonical human decimal string for a token amount (truncate to token decimals via wei round-trip).\n * Used by Curve router and multisign dialogs across protocols.\n */\nexport function normalizeHumanDecimalAmount(raw: string, tokenDecimals: number): string {\n const t = raw.trim().replace(/,/g, '')\n if (!t) return ''\n if (!Number.isInteger(tokenDecimals) || tokenDecimals < 0 || tokenDecimals > 18) {\n throw new Error('Invalid token decimals for amount normalization.')\n }\n const wei = parseUnits(t, tokenDecimals)\n return formatUnits(wei, tokenDecimals)\n}\n\n/** @deprecated Prefer normalizeHumanDecimalAmount; kept for Curve router parity. */\nexport const normalizeCurveRouterAmountString = normalizeHumanDecimalAmount\n","/** CoinGecko asset platform id by mainnet chainId (contract price endpoint). */\nexport const COINGECKO_PLATFORM_BY_CHAIN_ID: Record<string, string> = {\n '1': 'ethereum',\n '56': 'binance-smart-chain',\n '137': 'polygon-pos',\n '42161': 'arbitrum-one',\n '10': 'optimistic-ethereum',\n '43114': 'avalanche',\n '8453': 'base',\n '324': 'zk-sync-era',\n '42220': 'celo',\n '250': 'fantom',\n '100': 'gnosis',\n '204': 'op-bnb',\n '534352': 'scroll',\n '5000': 'mantle',\n '169': 'manta-pacific',\n '1116': 'core',\n '30': 'rootstock',\n '288': 'boba',\n '1088': 'metis-andromeda',\n '34443': 'mode',\n '80084': 'berachain',\n '146': 'sonic',\n '60808': 'bob-network',\n '80094': 'berachain',\n '130': 'unichain',\n '57073': 'ink',\n '999': 'hyperevm',\n '239': 'tac',\n '9745': 'plasma',\n '1923': 'swellchain',\n '59144': 'linea',\n '81457': 'blast',\n '7777777': 'zora',\n}\n\nexport function coingeckoPlatformForChainId(chainId: string | number): string | undefined {\n return COINGECKO_PLATFORM_BY_CHAIN_ID[String(chainId).trim()]\n}\n"]}
@@ -1,9 +1,8 @@
1
- import { b as EvmTxStep, a as EvmProtocolContext, E as EvmChainDetail } from '../../types-5u863Fd9.js';
2
- export { i as isEvmNativeToken, m as matchEvmTokenKind } from '../../types-5u863Fd9.js';
3
- export { P as ProposalTxParams, c as composeFeePayloadToTxParams, g as gasLimitFromEstimateAndChainConfig, p as proposalTxParamsToFeeSnapshot, r as routerSwapGasLimitFromEstimate, t as triggerTxParamsFromComposeBody } from '../../txParams-BC7ogvdR.js';
1
+ import { b as EvmTxStep, a as EvmProtocolContext } from '../../types-DUeNJLr9.js';
2
+ export { E as EvmChainDetail, i as isEvmNativeToken, m as matchEvmTokenKind } from '../../types-DUeNJLr9.js';
4
3
  import { Address, PublicClient } from 'viem';
5
- import { M as MultisignBuildResult } from '../../types-Ce2qNHai.js';
6
- import { f as finalizeMultisign } from '../../envelope-CcE5Cz_q.js';
4
+ import { M as MultisignBuildResult } from '../../types-BfjWdw1j.js';
5
+ import { f as finalizeMultisign } from '../../envelope-CpBUh9eP.js';
7
6
 
8
7
  type EvmBatchMetaBuilder = (args: {
9
8
  step: EvmTxStep;
@@ -26,6 +25,13 @@ type EvmBuildBatchArgs = {
26
25
  estimatedGas: bigint;
27
26
  publicClient: PublicClient;
28
27
  }) => Promise<bigint> | bigint;
28
+ /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */
29
+ estimateGasForStep?: (args: {
30
+ step: EvmTxStep;
31
+ index: number;
32
+ publicClient: PublicClient;
33
+ executor: Address;
34
+ }) => Promise<bigint> | bigint;
29
35
  };
30
36
  /**
31
37
  * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.
@@ -37,28 +43,22 @@ declare const evmChainCategoryModule: {
37
43
  buildEvmMultisignBatch: typeof buildEvmMultisignBatch;
38
44
  };
39
45
 
40
- interface ChainFeeParams {
41
- isEip1559: boolean;
42
- baseFeeGwei?: number;
43
- priorityFeeGwei?: number;
44
- gasPriceGwei?: number;
45
- }
46
- declare function fetchChainFeeParams(rpcUrl: string, chainId: number | string): Promise<ChainFeeParams>;
47
-
48
- type ResolvedEip1559Fees = {
49
- maxFeePerGas: bigint;
50
- maxPriorityFeePerGas: bigint;
51
- };
52
- /** Align EIP-1559 fees with the latest head base fee (same rules as Get Sig). */
53
- declare function alignEip1559FeesWithLatestBase(maxFeePerGas: bigint, maxPriorityFeePerGas: bigint, latestBlockBaseFeeWei: bigint): ResolvedEip1559Fees;
54
- declare function gweiToDecimalString(n: number): string;
55
-
56
- /** Snapshot chain gas config for extraJSON when Use Custom Gas is on. */
57
- declare function chainSnapshotForCustomGasExtraJSON(chainDetail: EvmChainDetail): Record<string, unknown>;
58
-
59
46
  /** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */
60
47
  declare function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number;
61
48
 
62
- declare function isValidRpcUrl(url: string): boolean;
49
+ /**
50
+ * Canonical human decimal string for a token amount (truncate to token decimals via wei round-trip).
51
+ * Used by Curve router and multisign dialogs across protocols.
52
+ */
53
+ declare function normalizeHumanDecimalAmount(raw: string, tokenDecimals: number): string;
54
+ /** @deprecated Prefer normalizeHumanDecimalAmount; kept for Curve router parity. */
55
+ declare const normalizeCurveRouterAmountString: typeof normalizeHumanDecimalAmount;
56
+
57
+ /** CoinGecko asset platform id by mainnet chainId (contract price endpoint). */
58
+ declare const COINGECKO_PLATFORM_BY_CHAIN_ID: Record<string, string>;
59
+ declare function coingeckoPlatformForChainId(chainId: string | number): string | undefined;
60
+
61
+ /** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */
62
+ declare function routerSwapGasLimitFromEstimate(estimatedGas: bigint, chainGasLimit?: number | null): bigint;
63
63
 
64
- export { type ChainFeeParams, type EvmBatchMetaBuilder, type EvmBuildBatchArgs, EvmChainDetail, EvmProtocolContext, EvmTxStep, type ResolvedEip1559Fees, alignEip1559FeesWithLatestBase, buildEvmMultisignBatch, chainSnapshotForCustomGasExtraJSON, evmChainCategoryModule, fetchChainFeeParams, gweiToDecimalString, isValidRpcUrl, parseEvmChainIdToNumber };
64
+ export { COINGECKO_PLATFORM_BY_CHAIN_ID, type EvmBatchMetaBuilder, type EvmBuildBatchArgs, EvmProtocolContext, EvmTxStep, buildEvmMultisignBatch, coingeckoPlatformForChainId, evmChainCategoryModule, normalizeCurveRouterAmountString, normalizeHumanDecimalAmount, parseEvmChainIdToNumber, routerSwapGasLimitFromEstimate };
@@ -1,4 +1,5 @@
1
- import { getAddress, zeroAddress, defineChain, createPublicClient, http, formatUnits, parseGwei, serializeTransaction, keccak256 } from 'viem';
1
+ import { getAddress, zeroAddress, defineChain, createPublicClient, http, parseGwei, serializeTransaction, keccak256, parseUnits, formatUnits } from 'viem';
2
+ import { getClientIdFromKeyGenResult, gasLimitFromEstimateAndChainConfig, fetchChainFeeParams, gweiToDecimalString, proposalTxParamsToFeeSnapshot, alignEip1559FeesWithLatestBase } from '@continuumdao/continuum-node-sdk';
2
3
 
3
4
  // src/chains/evm/types.ts
4
5
  function isEvmNativeToken(address) {
@@ -16,100 +17,6 @@ function matchEvmTokenKind(kind, address) {
16
17
  return true;
17
18
  }
18
19
 
19
- // src/chains/evm/txParams.ts
20
- function gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit) {
21
- if (chainGasLimit == null || !Number.isFinite(chainGasLimit) || chainGasLimit <= 0) {
22
- return estimatedGas;
23
- }
24
- const cfg = BigInt(Math.floor(chainGasLimit));
25
- return cfg > estimatedGas ? cfg : estimatedGas;
26
- }
27
- function routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimit) {
28
- if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {
29
- return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit);
30
- }
31
- return (estimatedGas * 12n + 9n) / 10n;
32
- }
33
- function composeFeePayloadToTxParams(p, legacy) {
34
- const gl = p.txGasLimit ?? p.txgaslimit;
35
- if (gl == null || String(gl).trim() === "") return void 0;
36
- const n = p.txNonce ?? p.txnonce;
37
- let nonce = 0;
38
- if (typeof n === "bigint") nonce = Number(n);
39
- else if (typeof n === "number") nonce = n;
40
- else if (n != null) nonce = parseInt(String(n), 10);
41
- if (!Number.isFinite(nonce)) nonce = 0;
42
- const gasLimit = String(gl);
43
- if (legacy) {
44
- const gp = p.txGasPrice ?? p.txgasprice;
45
- return {
46
- nonce,
47
- gasLimit,
48
- txType: "legacy",
49
- gasPrice: gp != null ? String(gp) : "0"
50
- };
51
- }
52
- return {
53
- nonce,
54
- gasLimit,
55
- txType: "eip1559",
56
- maxFeePerGas: String(p.txMaxFeePerGas ?? ""),
57
- maxPriorityFeePerGas: String(p.txMaxPriorityFeePerGas ?? "")
58
- };
59
- }
60
- function triggerTxParamsFromComposeBody(body) {
61
- const existing = body.txParams;
62
- if (existing && typeof existing === "object" && !Array.isArray(existing)) {
63
- const o = existing;
64
- if (String(o.gasLimit ?? "").trim() !== "") {
65
- return { ...o };
66
- }
67
- }
68
- const pb = body.proposalTxParams;
69
- if (Array.isArray(pb) && pb.length > 0 && typeof pb[0] === "object" && pb[0] !== null) {
70
- const first = pb[0];
71
- if (String(first.gasLimit ?? "").trim() !== "") {
72
- return { ...first };
73
- }
74
- }
75
- const fromSnapshot = composeFeePayloadToTxParams(
76
- body,
77
- body.txMaxFeePerGas == null && body.txMaxPriorityFeePerGas == null
78
- );
79
- if (fromSnapshot) return fromSnapshot;
80
- return {
81
- nonce: 0,
82
- gasLimit: "",
83
- txType: "legacy",
84
- gasPrice: "0"
85
- };
86
- }
87
- function proposalTxParamsToFeeSnapshot(params) {
88
- if (params.txType === "legacy") {
89
- return {
90
- txNonce: params.nonce,
91
- txGasLimit: params.gasLimit,
92
- txGasPrice: params.gasPrice ?? "0"
93
- };
94
- }
95
- return {
96
- txNonce: params.nonce,
97
- txGasLimit: params.gasLimit,
98
- txMaxFeePerGas: params.maxFeePerGas ?? "",
99
- txMaxPriorityFeePerGas: params.maxPriorityFeePerGas ?? ""
100
- };
101
- }
102
-
103
- // src/core/keygen.ts
104
- function firstClientIdFromKeyGen(data) {
105
- const map = data?.ClientKeys;
106
- if (!map || typeof map !== "object") return null;
107
- for (const v of Object.values(map)) {
108
- if (typeof v === "string" && v.trim()) return v.trim();
109
- }
110
- return null;
111
- }
112
-
113
20
  // src/core/purpose.ts
114
21
  function mergePurposeText(purposeText, purposeSuffix) {
115
22
  const t = purposeText.trim();
@@ -129,7 +36,7 @@ function finalizeMultisign(input) {
129
36
  const ph = (keyGen.pubkeyhex ?? "").trim();
130
37
  if (!ph) throw new Error("keyGen pubKey (pubkeyhex) is required");
131
38
  const keyList = keyGen.keylist ?? [];
132
- const clientId = firstClientIdFromKeyGen(keyGen);
39
+ const clientId = getClientIdFromKeyGenResult(keyGen);
133
40
  const first = legs[0];
134
41
  const messageHashes = legs.map((l) => l.msgHash);
135
42
  const messageRawBatch = legs.map((l) => l.msgRaw);
@@ -170,76 +77,11 @@ function finalizeMultisign(input) {
170
77
  if (clientId) bodyForSign.clientId = clientId;
171
78
  return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) };
172
79
  }
173
- async function fetchChainFeeParams(rpcUrl, chainId) {
174
- const url = rpcUrl.trim();
175
- if (!url) return { isEip1559: false };
176
- const chainIdNum = typeof chainId === "string" ? parseInt(chainId, 10) : chainId;
177
- if (Number.isNaN(chainIdNum)) return { isEip1559: false };
178
- const chain = defineChain({
179
- id: chainIdNum,
180
- name: "Discovery",
181
- nativeCurrency: { decimals: 18, name: "Ether", symbol: "ETH" },
182
- rpcUrls: { default: { http: [url] } }
183
- });
184
- const publicClient = createPublicClient({
185
- chain,
186
- transport: http(url)
187
- });
188
- const getGasPriceGwei = async () => {
189
- const gasPriceWei = await publicClient.getGasPrice();
190
- return parseFloat(formatUnits(gasPriceWei, 9));
191
- };
192
- try {
193
- const block = await publicClient.getBlock({ blockTag: "latest" });
194
- const baseFeePerGas = block?.baseFeePerGas;
195
- if (baseFeePerGas == null || baseFeePerGas === void 0) {
196
- const gasPriceGwei2 = await getGasPriceGwei();
197
- return { isEip1559: false, gasPriceGwei: gasPriceGwei2 };
198
- }
199
- const baseFeeGwei = parseFloat(formatUnits(baseFeePerGas, 9));
200
- let priorityFeeGwei;
201
- try {
202
- const priorityWei = await publicClient.estimateMaxPriorityFeePerGas();
203
- priorityFeeGwei = parseFloat(formatUnits(priorityWei, 9));
204
- } catch {
205
- }
206
- const gasPriceGwei = await getGasPriceGwei();
207
- return {
208
- isEip1559: true,
209
- baseFeeGwei,
210
- priorityFeeGwei,
211
- gasPriceGwei
212
- };
213
- } catch {
214
- try {
215
- const gasPriceWei = await publicClient.getGasPrice();
216
- const gasPriceGwei = parseFloat(formatUnits(gasPriceWei, 9));
217
- return { isEip1559: false, gasPriceGwei };
218
- } catch {
219
- return { isEip1559: false };
220
- }
221
- }
222
- }
223
- function finalizeEip1559Fees(maxFeePerGas, maxPriorityFeePerGas, floor, baseWei) {
224
- let maxP = maxPriorityFeePerGas;
225
- let maxF = maxFeePerGas;
226
- if (baseWei > 0n && maxF < baseWei + maxP) {
227
- maxF = baseWei + maxP + parseGwei("0.001");
228
- }
229
- if (maxF < maxP) {
230
- maxF = baseWei > 0n ? baseWei + maxP + parseGwei("0.001") : maxP * 2n;
80
+ function routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimit) {
81
+ if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {
82
+ return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit);
231
83
  }
232
- return { maxFeePerGas: maxF, maxPriorityFeePerGas: maxP };
233
- }
234
- function alignEip1559FeesWithLatestBase(maxFeePerGas, maxPriorityFeePerGas, latestBlockBaseFeeWei) {
235
- return finalizeEip1559Fees(maxFeePerGas, maxPriorityFeePerGas, null, latestBlockBaseFeeWei);
236
- }
237
- function gweiToDecimalString(n) {
238
- if (!Number.isFinite(n)) return "0";
239
- if (n === 0) return "0";
240
- const s = String(n);
241
- if (s.indexOf("e") !== -1 || s.indexOf("E") !== -1) return n.toFixed(9).replace(/\.?0+$/, "") || "0";
242
- return s;
84
+ return (estimatedGas * 12n + 9n) / 10n;
243
85
  }
244
86
 
245
87
  // src/chains/evm/buildBatch.ts
@@ -276,15 +118,19 @@ async function buildEvmMultisignBatch(args) {
276
118
  const step = steps[i];
277
119
  const currentNonce = baseNonce + i;
278
120
  let estimatedGas;
279
- try {
280
- estimatedGas = await publicClient.estimateGas({
281
- to: step.to,
282
- data: step.data,
283
- value: step.value,
284
- account: executor
285
- });
286
- } catch {
287
- estimatedGas = step.fallbackGas ?? 100000n;
121
+ if (args.estimateGasForStep) {
122
+ estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor });
123
+ } else {
124
+ try {
125
+ estimatedGas = await publicClient.estimateGas({
126
+ to: step.to,
127
+ data: step.data,
128
+ value: step.value,
129
+ account: executor
130
+ });
131
+ } catch {
132
+ estimatedGas = step.fallbackGas ?? 100000n;
133
+ }
288
134
  }
289
135
  let gasLimitI;
290
136
  if (args.resolveGasLimit) {
@@ -406,30 +252,6 @@ var evmChainCategoryModule = {
406
252
  buildEvmMultisignBatch
407
253
  };
408
254
 
409
- // src/chains/evm/fees/customGas.ts
410
- function chainSnapshotForCustomGasExtraJSON(chainDetail) {
411
- const lr = chainDetail.legacy;
412
- const legacy = lr === true || typeof lr === "string" && lr.toLowerCase() === "true";
413
- const push = (o, key, v) => {
414
- if (v === void 0 || v === null) return;
415
- if (typeof v === "string" && v.trim() === "") return;
416
- o[key] = v;
417
- };
418
- const fields = {};
419
- push(fields, "gasLimit", chainDetail.gasLimit);
420
- if (legacy) {
421
- push(fields, "gasMultiplier", chainDetail.gasMultiplier);
422
- push(fields, "gasPrice", chainDetail.gasPrice);
423
- } else {
424
- push(fields, "gasMultiplier", chainDetail.gasMultiplier);
425
- push(fields, "baseFee", chainDetail.baseFee);
426
- push(fields, "priorityFee", chainDetail.priorityFee);
427
- push(fields, "baseFeeMultiplier", chainDetail.baseFeeMultiplier);
428
- }
429
- push(fields, "legacy", legacy);
430
- return fields;
431
- }
432
-
433
255
  // src/chains/evm/chainIdParse.ts
434
256
  function parseEvmChainIdToNumber(chainId) {
435
257
  if (chainId == null) return Number.NaN;
@@ -453,19 +275,57 @@ function parseEvmChainIdToNumber(chainId) {
453
275
  }
454
276
  return Number.parseInt(t, 10);
455
277
  }
456
-
457
- // src/chains/evm/rpcUrl.ts
458
- function isValidRpcUrl(url) {
459
- const t = url.trim();
460
- if (!t) return false;
461
- try {
462
- const u = new URL(t);
463
- return u.protocol === "http:" || u.protocol === "https:";
464
- } catch {
465
- return false;
278
+ function normalizeHumanDecimalAmount(raw, tokenDecimals) {
279
+ const t = raw.trim().replace(/,/g, "");
280
+ if (!t) return "";
281
+ if (!Number.isInteger(tokenDecimals) || tokenDecimals < 0 || tokenDecimals > 18) {
282
+ throw new Error("Invalid token decimals for amount normalization.");
466
283
  }
284
+ const wei = parseUnits(t, tokenDecimals);
285
+ return formatUnits(wei, tokenDecimals);
286
+ }
287
+ var normalizeCurveRouterAmountString = normalizeHumanDecimalAmount;
288
+
289
+ // src/chains/evm/coingecko.ts
290
+ var COINGECKO_PLATFORM_BY_CHAIN_ID = {
291
+ "1": "ethereum",
292
+ "56": "binance-smart-chain",
293
+ "137": "polygon-pos",
294
+ "42161": "arbitrum-one",
295
+ "10": "optimistic-ethereum",
296
+ "43114": "avalanche",
297
+ "8453": "base",
298
+ "324": "zk-sync-era",
299
+ "42220": "celo",
300
+ "250": "fantom",
301
+ "100": "gnosis",
302
+ "204": "op-bnb",
303
+ "534352": "scroll",
304
+ "5000": "mantle",
305
+ "169": "manta-pacific",
306
+ "1116": "core",
307
+ "30": "rootstock",
308
+ "288": "boba",
309
+ "1088": "metis-andromeda",
310
+ "34443": "mode",
311
+ "80084": "berachain",
312
+ "146": "sonic",
313
+ "60808": "bob-network",
314
+ "80094": "berachain",
315
+ "130": "unichain",
316
+ "57073": "ink",
317
+ "999": "hyperevm",
318
+ "239": "tac",
319
+ "9745": "plasma",
320
+ "1923": "swellchain",
321
+ "59144": "linea",
322
+ "81457": "blast",
323
+ "7777777": "zora"
324
+ };
325
+ function coingeckoPlatformForChainId(chainId) {
326
+ return COINGECKO_PLATFORM_BY_CHAIN_ID[String(chainId).trim()];
467
327
  }
468
328
 
469
- export { alignEip1559FeesWithLatestBase, buildEvmMultisignBatch, chainSnapshotForCustomGasExtraJSON, composeFeePayloadToTxParams, evmChainCategoryModule, fetchChainFeeParams, gasLimitFromEstimateAndChainConfig, gweiToDecimalString, isEvmNativeToken, isValidRpcUrl, matchEvmTokenKind, parseEvmChainIdToNumber, proposalTxParamsToFeeSnapshot, routerSwapGasLimitFromEstimate, triggerTxParamsFromComposeBody };
329
+ export { COINGECKO_PLATFORM_BY_CHAIN_ID, buildEvmMultisignBatch, coingeckoPlatformForChainId, evmChainCategoryModule, isEvmNativeToken, matchEvmTokenKind, normalizeCurveRouterAmountString, normalizeHumanDecimalAmount, parseEvmChainIdToNumber, routerSwapGasLimitFromEstimate };
470
330
  //# sourceMappingURL=index.js.map
471
331
  //# sourceMappingURL=index.js.map