@continuumdao/ctm-mpc-defi 0.2.64 → 0.2.66
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 +1227 -2928
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +1620 -1631
- package/dist/agent/catalog.js +1226 -2929
- package/dist/agent/catalog.js.map +1 -1
- package/dist/chains/evm/index.cjs +22 -15
- package/dist/chains/evm/index.cjs.map +1 -1
- package/dist/chains/evm/index.d.ts +13 -2
- package/dist/chains/evm/index.js +12 -6
- package/dist/chains/evm/index.js.map +1 -1
- package/dist/core/index.cjs +3 -3
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/index.cjs +25 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +15 -4
- package/dist/index.js +14 -7
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs +22 -16
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/aave-v4/index.js +11 -5
- package/dist/protocols/evm/aave-v4/index.js.map +1 -1
- package/dist/protocols/evm/aerodrome/index.cjs +21 -15
- package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
- package/dist/protocols/evm/aerodrome/index.d.ts +5 -1
- package/dist/protocols/evm/aerodrome/index.js +11 -5
- package/dist/protocols/evm/aerodrome/index.js.map +1 -1
- package/dist/protocols/evm/arcus/index.cjs +21 -15
- package/dist/protocols/evm/arcus/index.cjs.map +1 -1
- package/dist/protocols/evm/arcus/index.js +11 -5
- package/dist/protocols/evm/arcus/index.js.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.cjs +21 -15
- package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.js +11 -5
- package/dist/protocols/evm/circle-cctp/index.js.map +1 -1
- package/dist/protocols/evm/compound-v3/index.cjs +21 -15
- package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
- package/dist/protocols/evm/compound-v3/index.js +11 -5
- package/dist/protocols/evm/compound-v3/index.js.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.cjs +37 -18
- package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.d.ts +3 -1
- package/dist/protocols/evm/continuum-dao/index.js +27 -9
- package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
- package/dist/protocols/evm/curve-dao/index.cjs +21 -15
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/curve-dao/index.d.ts +1 -1
- package/dist/protocols/evm/curve-dao/index.js +11 -5
- package/dist/protocols/evm/curve-dao/index.js.map +1 -1
- package/dist/protocols/evm/derive/index.cjs +24 -18
- package/dist/protocols/evm/derive/index.cjs.map +1 -1
- package/dist/protocols/evm/derive/index.js +11 -5
- package/dist/protocols/evm/derive/index.js.map +1 -1
- package/dist/protocols/evm/ethena/index.cjs +22 -16
- package/dist/protocols/evm/ethena/index.cjs.map +1 -1
- package/dist/protocols/evm/ethena/index.js +11 -5
- package/dist/protocols/evm/ethena/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs +21 -15
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.js +11 -5
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/gmx/index.cjs +21 -15
- package/dist/protocols/evm/gmx/index.cjs.map +1 -1
- package/dist/protocols/evm/gmx/index.js +11 -5
- package/dist/protocols/evm/gmx/index.js.map +1 -1
- package/dist/protocols/evm/hyperliquid/index.cjs +21 -15
- package/dist/protocols/evm/hyperliquid/index.cjs.map +1 -1
- package/dist/protocols/evm/hyperliquid/index.js +11 -5
- package/dist/protocols/evm/hyperliquid/index.js.map +1 -1
- package/dist/protocols/evm/hyperliquidOutcome/index.cjs +2 -2
- package/dist/protocols/evm/hyperliquidOutcome/index.cjs.map +1 -1
- package/dist/protocols/evm/hyperliquidOutcome/index.js +1 -1
- package/dist/protocols/evm/hyperliquidOutcome/index.js.map +1 -1
- package/dist/protocols/evm/lido/index.cjs +21 -15
- package/dist/protocols/evm/lido/index.cjs.map +1 -1
- package/dist/protocols/evm/lido/index.js +11 -5
- package/dist/protocols/evm/lido/index.js.map +1 -1
- package/dist/protocols/evm/maple/index.cjs +21 -15
- package/dist/protocols/evm/maple/index.cjs.map +1 -1
- package/dist/protocols/evm/maple/index.js +11 -5
- package/dist/protocols/evm/maple/index.js.map +1 -1
- package/dist/protocols/evm/morpho/index.cjs +21 -15
- package/dist/protocols/evm/morpho/index.cjs.map +1 -1
- package/dist/protocols/evm/morpho/index.js +11 -5
- package/dist/protocols/evm/morpho/index.js.map +1 -1
- package/dist/protocols/evm/pendle/index.cjs +21 -15
- package/dist/protocols/evm/pendle/index.cjs.map +1 -1
- package/dist/protocols/evm/pendle/index.d.ts +5 -1
- package/dist/protocols/evm/pendle/index.js +11 -5
- package/dist/protocols/evm/pendle/index.js.map +1 -1
- package/dist/protocols/evm/permit2/index.cjs +2 -2
- package/dist/protocols/evm/permit2/index.cjs.map +1 -1
- package/dist/protocols/evm/permit2/index.js +1 -1
- package/dist/protocols/evm/permit2/index.js.map +1 -1
- package/dist/protocols/evm/railgun/index.cjs +21 -15
- package/dist/protocols/evm/railgun/index.cjs.map +1 -1
- package/dist/protocols/evm/railgun/index.js +11 -5
- package/dist/protocols/evm/railgun/index.js.map +1 -1
- package/dist/protocols/evm/sky/index.cjs +21 -15
- package/dist/protocols/evm/sky/index.cjs.map +1 -1
- package/dist/protocols/evm/sky/index.js +11 -5
- package/dist/protocols/evm/sky/index.js.map +1 -1
- package/dist/protocols/evm/trueo/index.cjs +21 -15
- package/dist/protocols/evm/trueo/index.cjs.map +1 -1
- package/dist/protocols/evm/trueo/index.js +11 -5
- package/dist/protocols/evm/trueo/index.js.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.cjs +23 -16
- package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.d.ts +1 -1
- package/dist/protocols/evm/uniswap-v4/index.js +12 -5
- package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
- package/dist/protocols/evm/venice/index.cjs +22 -16
- package/dist/protocols/evm/venice/index.cjs.map +1 -1
- package/dist/protocols/evm/venice/index.js +11 -5
- package/dist/protocols/evm/venice/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/protocols/evm/maple/constants.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/maple/multisign.ts","../../../../src/core/defiProxy.ts","../../../../src/protocols/evm/maple/graphql.ts","../../../../src/agent/support/assetFilter.ts","../../../../src/protocols/evm/maple/reads.ts","../../../../src/protocols/evm/maple/index.ts"],"names":["gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","getAddress","publicClient","isAddress"],"mappings":"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","file":"index.js","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","/** Public Maple Syrup (PoolV2 + SyrupRouter) integration constants. */\n\n/** Attributed deposits per Maple partner guidance (`bytes32` string label). */\nexport const MAPLE_SYRUP_DEPOSIT_DATA_ASCII = '0:continuumdao'\n\nexport const MAPLE_INTEGRATION_DOCS_URL =\n 'https://docs.maple.finance/integrate/ethereum-mainnet/frontend-integration'\n\nexport function mapleGraphqlEndpointForChain(chainId: number): string | null {\n if (chainId === 1) return 'https://api.maple.finance/v2/graphql'\n if (chainId === 11155111) return 'https://sepolia.api.maple.finance/v2/graphql'\n return null\n}\n\nexport function isMapleSyrupSupportedChain(chainId: number): boolean {\n return chainId === 1 || chainId === 11155111\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","/**\n * Maple Syrup: stake underlying into PoolV2 via `SyrupRouter.deposit`, exit with `PoolV2.requestRedeem`.\n * Chains: Ethereum mainnet and Sepolia (router + pool addresses from Maple GraphQL).\n */\nimport { type Address, createPublicClient, defineChain, encodeFunctionData, getAddress, parseAbi, parseUnits, stringToBytes, toHex } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { type KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { MAPLE_SYRUP_DEPOSIT_DATA_ASCII } from './constants.js'\n\nconst AAVE_ERC20_APPROVE_FALLBACK = 100_000n\nexport const MAPLE_SYRUP_DEPOSIT_GAS_FALLBACK = 1_500_000n\nconst MAPLE_SYRUP_DEPOSIT_FALLBACK = MAPLE_SYRUP_DEPOSIT_GAS_FALLBACK\nconst MAPLE_REQUEST_REDEEM_FALLBACK = 1_200_000n\n\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\nconst syrupRouterAbi = parseAbi([\n 'function deposit(uint256 assets, bytes32 depositData)',\n 'function authorizeAndDeposit(uint256 bitmap,uint256 deadline,uint8 auth_v,bytes32 auth_r,bytes32 auth_s,uint256 amount,bytes32 depositData)',\n])\n\nconst poolV2ExitAbi = parseAbi([\n 'function previewDeposit(uint256 assets) view returns (uint256 shares)',\n 'function convertToExitShares(uint256 assets_) view returns (uint256 shares_)',\n 'function requestRedeem(uint256 shares, address receiver) returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\n\nfunction formatBytes32DataLabel(s: string): `0x${string}` {\n const b = stringToBytes(s)\n if (b.length > 32) throw new Error('Maple depositData label is too long for bytes32.')\n const padded = new Uint8Array(32)\n padded.set(b)\n return toHex(padded)\n}\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nfunction publicClientForChain(chainId: number, rpcUrl: string) {\n const rpc = rpcUrl.trim()\n if (chainId === 1) {\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpc] } },\n })\n return createPublicClient({ chain: ch, transport: defiEvmTransport(rpc) })\n }\n if (chainId === 11155111) {\n const ch = defineChain({\n id: 11155111,\n name: 'Sepolia',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpc] } },\n })\n return createPublicClient({ chain: ch, transport: defiEvmTransport(rpc) })\n }\n throw new Error(`Maple Syrup multisign: unsupported chain id ${chainId}.`)\n}\n\nexport async function readMaplePoolShareDecimals(args: { rpcUrl: string; chainId: number; pool: Address }): Promise<number> {\n const client = publicClientForChain(args.chainId, args.rpcUrl)\n const d = await client.readContract({\n address: getAddress(args.pool),\n abi: poolV2ExitAbi,\n functionName: 'decimals',\n })\n return Number(d)\n}\n\nexport async function readMapleStakePreviewShares(args: {\n rpcUrl: string\n chainId: number\n pool: Address\n assetAmountWei: bigint\n}): Promise<bigint> {\n if (args.assetAmountWei <= 0n) return 0n\n const client = publicClientForChain(args.chainId, args.rpcUrl)\n return client.readContract({\n address: getAddress(args.pool),\n abi: poolV2ExitAbi,\n functionName: 'previewDeposit',\n args: [args.assetAmountWei],\n })\n}\n\nexport async function readMapleUnstakeExitSharesForAssets(args: {\n rpcUrl: string\n chainId: number\n pool: Address\n assetAmountWei: bigint\n}): Promise<bigint> {\n if (args.assetAmountWei <= 0n) return 0n\n const client = publicClientForChain(args.chainId, args.rpcUrl)\n return client.readContract({\n address: getAddress(args.pool),\n abi: poolV2ExitAbi,\n functionName: 'convertToExitShares',\n args: [args.assetAmountWei],\n })\n}\n\ntype MapleStakeStep = { kind: 'approve' | 'deposit' | 'authorizeAndDeposit'; to: Address; data: `0x${string}`; value: bigint }\n\n/** ECDSA v/r/s + bitmap + deadline from Maple for `SyrupRouter.authorizeAndDeposit`. */\nexport type MapleSyrupAuthorizeSig = {\n bitmap: bigint\n deadline: bigint\n v: number\n r: `0x${string}`\n s: `0x${string}`\n}\n\n/** Parse UI fields for first-time Syrup deposit (`authorizeAndDeposit`). */\nexport function parseMapleStakeAuthInputs(args: {\n bitmap: string\n deadline: string\n v: string\n r: string\n s: string\n}): { ok: true; sig: MapleSyrupAuthorizeSig } | { ok: false; message: string } {\n const bitmapT = args.bitmap.trim()\n let bitmap: bigint\n if (!bitmapT) return { ok: false, message: 'Enter authorization bitmap (uint256).' }\n try {\n bitmap = bitmapT.startsWith('0x') || bitmapT.startsWith('0X') ? BigInt(bitmapT) : BigInt(bitmapT)\n } catch {\n return { ok: false, message: 'Bitmap must be a decimal or 0x-prefixed integer.' }\n }\n const deadlineT = args.deadline.trim()\n if (!deadlineT || !/^\\d+$/.test(deadlineT)) {\n return { ok: false, message: 'Deadline must be a Unix timestamp (seconds), decimal digits only.' }\n }\n const deadline = BigInt(deadlineT)\n if (deadline <= 0n) return { ok: false, message: 'Deadline must be positive.' }\n const vT = args.v.trim()\n if (!/^\\d+$/.test(vT)) return { ok: false, message: 'v must be an integer 0–255 (often 27 or 28).' }\n const v = Number(vT)\n if (!Number.isFinite(v) || v < 0 || v > 255) return { ok: false, message: 'v must be between 0 and 255.' }\n let r = args.r.trim()\n let s = args.s.trim()\n if (!r.startsWith('0x')) r = '0x' + r\n if (!s.startsWith('0x')) s = '0x' + s\n if (!/^0x[0-9a-fA-F]{64}$/.test(r)) return { ok: false, message: 'r must be 32 bytes (64 hex chars), optional 0x.' }\n if (!/^0x[0-9a-fA-F]{64}$/.test(s)) return { ok: false, message: 's must be 32 bytes (64 hex chars), optional 0x.' }\n return { ok: true, sig: { bitmap, deadline, v, r: r as `0x${string}`, s: s as `0x${string}` } }\n}\n\nexport async function buildEvmMultisignBodyMapleSyrupDeposit(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n /** Underlying USDC / USDT (must match the pool’s asset). */\n asset: Address\n syrupRouter: Address\n pool: Address\n amountHuman: string\n /** Omit to read decimals on-chain (or pass from token registry). */\n assetDecimals?: number\n executorAddress: Address\n purposeText: string\n /** Default `deposit`. Use `authorizeAndDeposit` with Maple-issued {@link authorizeSig} for first-time lenders. */\n stakeMethod?: 'deposit' | 'authorizeAndDeposit'\n authorizeSig?: MapleSyrupAuthorizeSig\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== 1 && args.chainId !== 11155111) {\n throw new Error('Maple Syrup deposit is only supported on Ethereum mainnet or Sepolia.')\n }\n const asset = getAddress(args.asset)\n const router = getAddress(args.syrupRouter)\n const pool = getAddress(args.pool)\n const executor = getAddress(args.executorAddress)\n const depositData = formatBytes32DataLabel(MAPLE_SYRUP_DEPOSIT_DATA_ASCII)\n\n const publicClient = publicClientForChain(args.chainId, args.rpcUrl)\n\n let dec = args.assetDecimals\n if (dec == null || !Number.isFinite(dec)) {\n const onChain = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n dec = Number(onChain)\n }\n if (!Number.isFinite(dec) || dec < 0 || dec > 255) throw new Error('Invalid asset decimals.')\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Amount is zero after converting with token decimals.')\n\n const stakeMethod = args.stakeMethod ?? 'deposit'\n if (stakeMethod === 'authorizeAndDeposit') {\n const a = args.authorizeSig\n if (!a) throw new Error('authorizeSig is required for authorizeAndDeposit.')\n if (a.v < 0 || a.v > 255) throw new Error('Invalid authorization v (must be 0–255).')\n }\n\n const steps: MapleStakeStep[] = []\n const currentAllowance = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, router],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [router, 0n],\n })\n steps.push({ kind: 'approve', to: asset, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [router, amountWei],\n })\n steps.push({ kind: 'approve', to: asset, data: dataApprove, value: 0n })\n }\n\n if (stakeMethod === 'authorizeAndDeposit') {\n const a = args.authorizeSig!\n const authCalldata = encodeFunctionData({\n abi: syrupRouterAbi,\n functionName: 'authorizeAndDeposit',\n args: [a.bitmap, a.deadline, a.v, a.r, a.s, amountWei, depositData],\n })\n steps.push({ kind: 'authorizeAndDeposit', to: router, data: authCalldata, value: 0n })\n } else {\n const depositCalldata = encodeFunctionData({\n abi: syrupRouterAbi,\n functionName: 'deposit',\n args: [amountWei, depositData],\n })\n steps.push({ kind: 'deposit', to: router, data: depositCalldata, value: 0n })\n }\n\n const chainIdStr = String(args.chainId)\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'approve' ? AAVE_ERC20_APPROVE_FALLBACK : MAPLE_SYRUP_DEPOSIT_FALLBACK,\n }))\n const n = steps.length\n const finalVerb =\n stakeMethod === 'authorizeAndDeposit' ? 'authorizeAndDeposit (permission + deposit)' : 'deposit'\n const purposeSuffix =\n n === 1\n ? `Maple Syrup: 1-tx — ${finalVerb} via SyrupRouter (allowance already set).`\n : `Maple Syrup: ${n}-tx batch — approve asset for SyrupRouter, then ${finalVerb}.`\n const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n estimateGasForStep: async ({ step, index, publicClient, executor: exec }) => {\n const s = steps[index]!\n if ((s.kind === 'deposit' || s.kind === 'authorizeAndDeposit') && index > 0) {\n return MAPLE_SYRUP_DEPOSIT_FALLBACK\n }\n try {\n return await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: exec,\n })\n } catch (e) {\n if (s.kind === 'deposit' || s.kind === 'authorizeAndDeposit') {\n const msg = e instanceof Error ? e.message : String(e)\n if (/NOT_AUTHORIZED|SR:D:NOT_AUTHORIZED/i.test(msg)) {\n throw new Error(\n stakeMethod === 'authorizeAndDeposit'\n ? 'Maple SyrupRouter rejected authorizeAndDeposit (SR:D:NOT_AUTHORIZED). Check the authorization signature, deadline, and bitmap from Maple; they must match this chain, router, and owner.'\n : 'Maple SyrupRouter rejected deposit (SR:D:NOT_AUTHORIZED): this executor is not allowlisted as a Syrup lender on-chain. ' +\n 'Use authorizeAndDeposit with a Maple-issued signature for the first deposit, or ask Maple to allowlist this address.',\n )\n }\n }\n return s.kind === 'approve' ? AAVE_ERC20_APPROVE_FALLBACK : MAPLE_SYRUP_DEPOSIT_FALLBACK\n }\n },\n buildBatchMeta: ({ index, gasLimit }) => {\n const s = steps[index]!\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'MapleSyrup',\n name: 'ERC20.approve',\n note: 'Allow SyrupRouter to pull this deposit amount.',\n spender: router,\n asset,\n pool,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'maple_syrup_erc20_approve', version: 1, chainId: chainIdStr },\n maple: { step: 'approve_asset', router, pool, asset },\n }\n }\n if (s.kind === 'deposit') {\n return {\n signatureText: JSON.stringify({\n kind: 'MapleSyrup',\n name: 'SyrupRouter.deposit',\n function: 'deposit(uint256 assets, bytes32 depositData)',\n assets: amountWei.toString(),\n pool,\n router,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'maple_syrup_router_deposit', version: 1, chainId: chainIdStr },\n maple: { step: 'deposit', router, pool, gasBuildDeposit: { baseGasUnits: gasLimit.toString() } },\n }\n }\n const a = args.authorizeSig!\n return {\n signatureText: JSON.stringify({\n kind: 'MapleSyrup',\n name: 'SyrupRouter.authorizeAndDeposit',\n function:\n 'authorizeAndDeposit(uint256 bitmap,uint256 deadline,uint8 auth_v,bytes32 auth_r,bytes32 auth_s,uint256 amount,bytes32 depositData)',\n bitmap: a.bitmap.toString(),\n deadline: a.deadline.toString(),\n auth_v: a.v,\n assets: amountWei.toString(),\n pool,\n router,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'maple_syrup_router_authorize_and_deposit', version: 1, chainId: chainIdStr },\n maple: { step: 'authorize_and_deposit', router, pool, gasBuildDeposit: { baseGasUnits: gasLimit.toString() } },\n }\n },\n })\n}\n\nexport async function buildEvmMultisignBodyMaplePoolRequestRedeem(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n pool: Address\n /** Human amount in **underlying** units (e.g. USDC). */\n underlyingAmountHuman: string\n underlyingDecimals: number\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== 1 && args.chainId !== 11155111) {\n throw new Error('Maple Syrup redeem request is only supported on Ethereum mainnet or Sepolia.')\n }\n const pool = getAddress(args.pool)\n const executor = getAddress(args.executorAddress)\n const receiver = executor\n\n const ud = args.underlyingDecimals\n if (!Number.isFinite(ud) || ud < 0 || ud > 255) throw new Error('Invalid underlying decimals.')\n const assetWei = parseUnits(args.underlyingAmountHuman, ud)\n if (assetWei === 0n) throw new Error('Amount is zero after converting with token decimals.')\n\n const publicClient = publicClientForChain(args.chainId, args.rpcUrl)\n const exitShares = await publicClient.readContract({\n address: pool,\n abi: poolV2ExitAbi,\n functionName: 'convertToExitShares',\n args: [assetWei],\n })\n if (exitShares === 0n) throw new Error('Exit shares are zero for this amount; check pool liquidity and amount.')\n\n const data = encodeFunctionData({\n abi: poolV2ExitAbi,\n functionName: 'requestRedeem',\n args: [exitShares, receiver],\n })\n\n const chainIdStr = String(args.chainId)\n const firstDataNo0x = data.startsWith('0x') ? data.slice(2) : data\n const purposeSuffix = 'Maple Syrup: 1-tx — request redeem (queue withdrawal of underlying from pool shares).'\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: [{ to: pool, data, value: 0n, fallbackGas: MAPLE_REQUEST_REDEEM_FALLBACK }],\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: pool,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'MapleSyrup',\n name: 'PoolV2.requestRedeem',\n function: 'requestRedeem(uint256 shares, address receiver)',\n shares: exitShares.toString(),\n underlyingAmountHuman: args.underlyingAmountHuman,\n receiver,\n pool,\n }),\n evm: { type: 'maple_pool_v2_request_redeem', version: 1, chainId: chainIdStr },\n maple: { step: 'request_redeem', pool, gasBuildRedeem: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n","/**\n * Optional browser → Next.js API proxy paths for DeFi upstream calls.\n * Set once from continuumdao-node-app client bootstrap.\n */\n\nlet aaveGraphqlProxyUrl: string | undefined\nlet eulerGraphqlProxyUrl: string | undefined\nlet mapleGraphqlProxyUrl: string | undefined\nlet morphoGraphqlProxyUrl: string | undefined\nlet coingeckoProxyUrl: string | undefined\n\nexport function setAaveGraphqlProxyUrl(url: string | undefined): void {\n aaveGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getAaveGraphqlProxyUrl(): string | undefined {\n return aaveGraphqlProxyUrl\n}\n\nexport function setEulerGraphqlProxyUrl(url: string | undefined): void {\n eulerGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getEulerGraphqlProxyUrl(): string | undefined {\n return eulerGraphqlProxyUrl\n}\n\n/** Browser → Next.js base path for Euler V3 REST (`/v3/evk/vaults`, …). */\nlet eulerV3ApiProxyBase: string | undefined\n\nexport function setEulerV3ApiProxyBase(url: string | undefined): void {\n eulerV3ApiProxyBase = url?.trim().replace(/\\/$/, '') || undefined\n}\n\nexport function getEulerV3ApiProxyBase(): string | undefined {\n return eulerV3ApiProxyBase\n}\n\nexport function setMapleGraphqlProxyUrl(url: string | undefined): void {\n mapleGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMapleGraphqlProxyUrl(): string | undefined {\n return mapleGraphqlProxyUrl\n}\n\nexport function setMorphoGraphqlProxyUrl(url: string | undefined): void {\n morphoGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoGraphqlProxyUrl(): string | undefined {\n return morphoGraphqlProxyUrl\n}\n\n/** Browser → Next.js base path for Morpho Midnight REST (replaces api.morpho.org/v0/midnight). */\nlet morphoMidnightRestProxyUrl: string | undefined\n\nexport function setMorphoMidnightRestProxyUrl(url: string | undefined): void {\n morphoMidnightRestProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoMidnightRestProxyUrl(): string | undefined {\n return morphoMidnightRestProxyUrl\n}\n\nexport function setCoingeckoProxyUrl(url: string | undefined): void {\n coingeckoProxyUrl = url?.trim() || undefined\n}\n\nexport function getCoingeckoProxyUrl(): string | undefined {\n return coingeckoProxyUrl\n}\n\nexport async function postJsonViaOptionalProxy<T>(args: {\n directUrl: string\n body: unknown\n proxyUrl?: string\n proxyEnvelope?: unknown\n}): Promise<T> {\n const proxy = args.proxyUrl?.trim()\n if (proxy) {\n const r = await fetch(proxy, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.proxyEnvelope ?? args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `Proxy HTTP ${r.status}: ${t.slice(0, 200)}` : `Proxy HTTP ${r.status}`)\n }\n return (await r.json()) as T\n }\n const r = await fetch(args.directUrl, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `HTTP ${r.status}: ${t.slice(0, 200)}` : `HTTP ${r.status}`)\n }\n return (await r.json()) as T\n}\n\nexport async function getJsonViaOptionalProxy<T>(args: {\n directUrl: string\n /** When set, GET this URL instead of directUrl (same path semantics as caller built). */\n proxyUrl?: string\n}): Promise<T> {\n const url = args.proxyUrl?.trim() || args.directUrl\n const r = await fetch(url, { method: 'GET', headers: { accept: 'application/json' } })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `HTTP ${r.status}: ${t.slice(0, 200)}` : `HTTP ${r.status}`)\n }\n return (await r.json()) as T\n}\n","import { getAddress, type Address } from 'viem'\nimport { getMapleGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\nimport { mapleGraphqlEndpointForChain } from './constants.js'\n\nexport type MapleSyrupPoolFromApi = {\n id: Address\n name: string\n asset: { id: Address; symbol: string; decimals: number }\n syrupRouter: { id: Address }\n weeklyApy: string\n monthlyApy: string\n totalAssets: string\n}\n\ntype PoolsQuery = { poolV2S: MapleSyrupPoolFromApi[] }\n\nconst POOLS_GQL = `\n query MapleSyrupPools {\n poolV2S(where: { syrupRouter_not: null }) {\n id\n name\n weeklyApy\n monthlyApy\n totalAssets\n asset {\n id\n symbol\n decimals\n }\n syrupRouter {\n id\n }\n }\n }\n`\n\nfunction normalizePool(p: MapleSyrupPoolFromApi): MapleSyrupPoolFromApi {\n return {\n id: getAddress(p.id as `0x${string}`),\n name: (p.name ?? '').trim(),\n asset: {\n id: getAddress(p.asset.id as `0x${string}`),\n symbol: (p.asset.symbol ?? '').trim(),\n decimals: Number(p.asset.decimals),\n },\n syrupRouter: { id: getAddress(p.syrupRouter.id as `0x${string}`) },\n weeklyApy: String(p.weeklyApy ?? '').trim(),\n monthlyApy: String(p.monthlyApy ?? '').trim(),\n totalAssets: String(p.totalAssets ?? '').trim(),\n }\n}\n\nasync function mapleGraphqlPost<T>(args: {\n chainId: number\n query: string\n variables?: Record<string, unknown>\n}): Promise<{ data?: T; errors?: { message?: string }[] }> {\n const endpoint = mapleGraphqlEndpointForChain(args.chainId)\n if (!endpoint) throw new Error(`Maple GraphQL is not configured for chain ${args.chainId}`)\n const body = { query: args.query, variables: args.variables ?? {} }\n return postJsonViaOptionalProxy<{ data?: T; errors?: { message?: string }[] }>({\n directUrl: endpoint,\n body,\n proxyUrl: getMapleGraphqlProxyUrl(),\n proxyEnvelope: { chainId: args.chainId, query: args.query, variables: args.variables ?? {} },\n })\n}\n\n/**\n * Fetch Syrup-enabled PoolV2 rows (share token = pool contract `id`) for Ethereum or Sepolia.\n */\nexport async function fetchMapleSyrupPools(chainId: number): Promise<MapleSyrupPoolFromApi[]> {\n const raw = await mapleGraphqlPost<PoolsQuery>({ chainId, query: POOLS_GQL })\n if (raw.errors?.length) {\n throw new Error(raw.errors.map((e) => e.message ?? 'GraphQL error').join('; '))\n }\n const rows = raw.data?.poolV2S ?? []\n return rows.map(normalizePool)\n}\n\ntype AccountQuery = { account: { isSyrupLender: boolean } | null }\n\nconst ACCOUNT_GQL = `\n query MapleAccount($accountId: ID!) {\n account(id: $accountId) {\n isSyrupLender\n }\n }\n`\n\nexport async function fetchMapleAccountIsSyrupLender(args: {\n chainId: number\n account: Address\n}): Promise<boolean | null> {\n try {\n const raw = await mapleGraphqlPost<AccountQuery>({\n chainId: args.chainId,\n query: ACCOUNT_GQL,\n variables: { accountId: args.account.toLowerCase() },\n })\n const acct = raw.data?.account\n if (!acct) return null\n return Boolean(acct.isSyrupLender)\n } catch {\n return null\n }\n}\n","import { getAddress, isAddress } from 'viem'\n\n/** Match an optional fetch filter that is either an ERC-20 address or a ticker (USDT). */\nexport function matchesAssetFilter(opts: {\n address?: string\n symbol?: string\n filter?: string\n}): boolean {\n const f = (opts.filter ?? '').trim()\n if (!f) return true\n const addr = (opts.address ?? '').trim()\n if (isAddress(f) && isAddress(addr)) {\n return getAddress(addr) === getAddress(f)\n }\n const sym = (opts.symbol ?? '').trim()\n if (!sym) return false\n return sym.toLowerCase() === f.toLowerCase()\n}\n","import { formatUnits, getAddress, isAddress } from 'viem'\nimport { matchesAssetFilter } from '../../../agent/support/assetFilter.js'\nimport { isMapleSyrupSupportedChain } from './constants.js'\nimport { fetchMapleSyrupPools, type MapleSyrupPoolFromApi } from './graphql.js'\n\nexport type MapleSyrupMarketSummaryRow = {\n chainId: number\n name: string\n pool: string\n syrupRouter: string\n asset: string\n assetSymbol: string\n assetDecimals: number\n weeklyApyPercent: string\n monthlyApyPercent: string\n totalAssets: string\n}\n\n/** Maple GraphQL APY: percent = raw / 1e28 (official frontend-integration docs). */\nexport function parseMapleApyPercent(raw: string | null | undefined): number | null {\n const t = (raw ?? '').trim()\n if (!t || !/^\\d+$/.test(t)) return null\n const n = Number(BigInt(t)) / 1e28\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\nexport function formatMapleApyPercentLabel(raw: string | null | undefined): string {\n const n = parseMapleApyPercent(raw)\n if (n == null) return '—'\n return `${n.toFixed(2)}%`\n}\n\nexport function formatMapleTotalAssetsLabel(raw: string | null | undefined, decimals: number): string {\n const t = (raw ?? '').trim()\n if (!t || !/^\\d+$/.test(t) || !Number.isFinite(decimals) || decimals < 0) return '—'\n try {\n const n = Number(formatUnits(BigInt(t), decimals))\n if (!Number.isFinite(n)) return '—'\n if (n === 0) return '0'\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(2).replace(/\\.?0+$/, '')}M`\n if (n >= 1000) return `${(n / 1000).toFixed(2).replace(/\\.?0+$/, '')}k`\n return n.toFixed(2).replace(/\\.?0+$/, '')\n } catch {\n return '—'\n }\n}\n\nexport function isMapleSyrupPoolActive(pool: MapleSyrupPoolFromApi): boolean {\n const assets = (pool.totalAssets ?? '').trim()\n if (!assets || !/^\\d+$/.test(assets)) return false\n return BigInt(assets) > 0n\n}\n\nexport function mapleSyrupMarketRowFromPool(args: {\n chainId: number\n pool: MapleSyrupPoolFromApi\n}): MapleSyrupMarketSummaryRow {\n return {\n chainId: args.chainId,\n name: args.pool.name || '—',\n pool: getAddress(args.pool.id),\n syrupRouter: getAddress(args.pool.syrupRouter.id),\n asset: getAddress(args.pool.asset.id),\n assetSymbol: args.pool.asset.symbol || '—',\n assetDecimals: args.pool.asset.decimals,\n weeklyApyPercent: formatMapleApyPercentLabel(args.pool.weeklyApy),\n monthlyApyPercent: formatMapleApyPercentLabel(args.pool.monthlyApy),\n totalAssets: formatMapleTotalAssetsLabel(args.pool.totalAssets, args.pool.asset.decimals),\n }\n}\n\nfunction sortByMonthlyApyDesc(a: MapleSyrupMarketSummaryRow, b: MapleSyrupMarketSummaryRow): number {\n const pa = parseFloat(a.monthlyApyPercent)\n const pb = parseFloat(b.monthlyApyPercent)\n const na = Number.isFinite(pa) ? pa : -1\n const nb = Number.isFinite(pb) ? pb : -1\n if (nb !== na) return nb - na\n return a.assetSymbol.localeCompare(b.assetSymbol, undefined, { sensitivity: 'base' })\n}\n\n/** MCP: list Syrup pools with live weekly/monthly APY. GraphQL only — no RPC. */\nexport async function mapleSyrupFetchMarketsSummary(args: {\n chainId: number\n underlying?: string\n}): Promise<{ chainId: number; markets: MapleSyrupMarketSummaryRow[]; notes: string }> {\n if (!isMapleSyrupSupportedChain(args.chainId)) {\n return {\n chainId: args.chainId,\n markets: [],\n notes: `Maple Syrup is not deployed on chain ${args.chainId}. Supported: Ethereum (1), Sepolia (11155111).`,\n }\n }\n const pools = (await fetchMapleSyrupPools(args.chainId)).filter(isMapleSyrupPoolActive)\n let markets = pools.map((pool) => mapleSyrupMarketRowFromPool({ chainId: args.chainId, pool }))\n const rawUnderlying = (args.underlying ?? '').trim()\n if (rawUnderlying) {\n markets = markets.filter((m) =>\n matchesAssetFilter({ address: m.asset, symbol: m.assetSymbol, filter: rawUnderlying }),\n )\n }\n markets.sort(sortByMonthlyApyDesc)\n return {\n chainId: args.chainId,\n markets,\n notes:\n 'Weekly/monthly APY from Maple GraphQL (api.maple.finance). APY % = raw / 1e28. Unused zero-TVL pools omitted. ' +\n 'Copy pool + syrupRouter + asset for build_deposit_multisign / build_request_redeem_multisign. Do not web-search Maple rates.',\n }\n}\n\n/** MCP: one Syrup pool by pool address or underlying. */\nexport async function mapleSyrupFetchMarketSummary(args: {\n chainId: number\n pool?: string\n underlying?: string\n}): Promise<{ chainId: number; markets: MapleSyrupMarketSummaryRow[]; notes: string }> {\n const poolAddr = (args.pool ?? '').trim()\n const und = (args.underlying ?? '').trim()\n if (!poolAddr && !und) {\n throw new Error('pass pool or underlying.')\n }\n if (poolAddr && !isAddress(poolAddr)) {\n throw new Error('pool must be a valid pool (share token) address.')\n }\n const out = await mapleSyrupFetchMarketsSummary({\n chainId: args.chainId,\n underlying: und || undefined,\n })\n let markets = out.markets\n if (poolAddr) {\n const want = getAddress(poolAddr).toLowerCase()\n markets = markets.filter((m) => m.pool.toLowerCase() === want)\n }\n if (!markets.length) {\n return {\n ...out,\n markets,\n notes:\n out.notes +\n ` No live Syrup pool matched` +\n (poolAddr ? ` pool ${getAddress(poolAddr)}` : '') +\n (und ? ` underlying ${isAddress(und) ? getAddress(und) : und}` : '') +\n ` on chain ${args.chainId}.`,\n }\n }\n return { ...out, markets }\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isMapleSyrupSupportedChain } from './constants.js'\n\nexport * from './constants.js'\nexport * from './multisign.js'\nexport * from './graphql.js'\nexport * from './reads.js'\n\nexport const MAPLE_PROTOCOL_ID = 'maple-syrup'\n\nexport const mapleProtocolModule: ProtocolModule = {\n id: MAPLE_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n return isMapleSyrupSupportedChain(n)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'maple-syrup.deposit', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Maple Syrup pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'maple-syrup.request-redeem', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Request redeem from pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(mapleProtocolModule)\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/protocols/evm/maple/constants.ts","../../../../src/core/defiEvmClient.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/unsignedMessageRaw.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/maple/multisign.ts","../../../../src/core/defiProxy.ts","../../../../src/protocols/evm/maple/graphql.ts","../../../../src/agent/support/assetFilter.ts","../../../../src/protocols/evm/maple/reads.ts","../../../../src/protocols/evm/maple/index.ts"],"names":["gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","getAddress","publicClient","isAddress"],"mappings":"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","file":"index.js","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","/** Public Maple Syrup (PoolV2 + SyrupRouter) integration constants. */\n\n/** Attributed deposits per Maple partner guidance (`bytes32` string label). */\nexport const MAPLE_SYRUP_DEPOSIT_DATA_ASCII = '0:continuumdao'\n\nexport const MAPLE_INTEGRATION_DOCS_URL =\n 'https://docs.maple.finance/integrate/ethereum-mainnet/frontend-integration'\n\nexport function mapleGraphqlEndpointForChain(chainId: number): string | null {\n if (chainId === 1) return 'https://api.maple.finance/v2/graphql'\n if (chainId === 11155111) return 'https://sepolia.api.maple.finance/v2/graphql'\n return null\n}\n\nexport function isMapleSyrupSupportedChain(chainId: number): boolean {\n return chainId === 1 || chainId === 11155111\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/dist/evm/rpc-utils.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 /** 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/dist/evm/tx-params.js'\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","/**\n * Hex of a serialized unsigned transaction, without a 0x prefix.\n * Get Sig refreshes the gas fee and nonce only when MessageRaw decodes as this transaction.\n * Destination, amount, and calldata stay inside the serialized bytes.\n */\nexport function evmUnsignedMessageRaw(serialized: `0x${string}`): string {\n return serialized.startsWith('0x') ? serialized.slice(2) : serialized\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 { fetchChainFeeParams } from '@continuumdao/continuum-node-sdk/dist/evm/chain-fees.js'\nimport { alignEip1559FeesWithLatestBase } from '@continuumdao/continuum-node-sdk/dist/evm/get-sig-fee-speed.js'\nimport { gweiToDecimalString } from '@continuumdao/continuum-node-sdk/dist/evm/gwei.js'\nimport {\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk/dist/evm/tx-params.js'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport { evmUnsignedMessageRaw } from './unsignedMessageRaw.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 /**\n * Ignored. MessageRaw is the serialized unsigned transaction (no 0x prefix).\n * Calldata-only MessageRaw cannot survive Get Sig: only the gas fee or nonce\n * may change, and the updated transaction must be included.\n */\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: evmUnsignedMessageRaw(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\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","/**\n * Maple Syrup: stake underlying into PoolV2 via `SyrupRouter.deposit`, exit with `PoolV2.requestRedeem`.\n * Chains: Ethereum mainnet and Sepolia (router + pool addresses from Maple GraphQL).\n */\nimport { type Address, createPublicClient, defineChain, encodeFunctionData, getAddress, parseAbi, parseUnits, stringToBytes, toHex } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { type KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { MAPLE_SYRUP_DEPOSIT_DATA_ASCII } from './constants.js'\n\nconst AAVE_ERC20_APPROVE_FALLBACK = 100_000n\nexport const MAPLE_SYRUP_DEPOSIT_GAS_FALLBACK = 1_500_000n\nconst MAPLE_SYRUP_DEPOSIT_FALLBACK = MAPLE_SYRUP_DEPOSIT_GAS_FALLBACK\nconst MAPLE_REQUEST_REDEEM_FALLBACK = 1_200_000n\n\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n\nconst syrupRouterAbi = parseAbi([\n 'function deposit(uint256 assets, bytes32 depositData)',\n 'function authorizeAndDeposit(uint256 bitmap,uint256 deadline,uint8 auth_v,bytes32 auth_r,bytes32 auth_s,uint256 amount,bytes32 depositData)',\n])\n\nconst poolV2ExitAbi = parseAbi([\n 'function previewDeposit(uint256 assets) view returns (uint256 shares)',\n 'function convertToExitShares(uint256 assets_) view returns (uint256 shares_)',\n 'function requestRedeem(uint256 shares, address receiver) returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\n\nfunction formatBytes32DataLabel(s: string): `0x${string}` {\n const b = stringToBytes(s)\n if (b.length > 32) throw new Error('Maple depositData label is too long for bytes32.')\n const padded = new Uint8Array(32)\n padded.set(b)\n return toHex(padded)\n}\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nfunction publicClientForChain(chainId: number, rpcUrl: string) {\n const rpc = rpcUrl.trim()\n if (chainId === 1) {\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpc] } },\n })\n return createPublicClient({ chain: ch, transport: defiEvmTransport(rpc) })\n }\n if (chainId === 11155111) {\n const ch = defineChain({\n id: 11155111,\n name: 'Sepolia',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpc] } },\n })\n return createPublicClient({ chain: ch, transport: defiEvmTransport(rpc) })\n }\n throw new Error(`Maple Syrup multisign: unsupported chain id ${chainId}.`)\n}\n\nexport async function readMaplePoolShareDecimals(args: { rpcUrl: string; chainId: number; pool: Address }): Promise<number> {\n const client = publicClientForChain(args.chainId, args.rpcUrl)\n const d = await client.readContract({\n address: getAddress(args.pool),\n abi: poolV2ExitAbi,\n functionName: 'decimals',\n })\n return Number(d)\n}\n\nexport async function readMapleStakePreviewShares(args: {\n rpcUrl: string\n chainId: number\n pool: Address\n assetAmountWei: bigint\n}): Promise<bigint> {\n if (args.assetAmountWei <= 0n) return 0n\n const client = publicClientForChain(args.chainId, args.rpcUrl)\n return client.readContract({\n address: getAddress(args.pool),\n abi: poolV2ExitAbi,\n functionName: 'previewDeposit',\n args: [args.assetAmountWei],\n })\n}\n\nexport async function readMapleUnstakeExitSharesForAssets(args: {\n rpcUrl: string\n chainId: number\n pool: Address\n assetAmountWei: bigint\n}): Promise<bigint> {\n if (args.assetAmountWei <= 0n) return 0n\n const client = publicClientForChain(args.chainId, args.rpcUrl)\n return client.readContract({\n address: getAddress(args.pool),\n abi: poolV2ExitAbi,\n functionName: 'convertToExitShares',\n args: [args.assetAmountWei],\n })\n}\n\ntype MapleStakeStep = { kind: 'approve' | 'deposit' | 'authorizeAndDeposit'; to: Address; data: `0x${string}`; value: bigint }\n\n/** ECDSA v/r/s + bitmap + deadline from Maple for `SyrupRouter.authorizeAndDeposit`. */\nexport type MapleSyrupAuthorizeSig = {\n bitmap: bigint\n deadline: bigint\n v: number\n r: `0x${string}`\n s: `0x${string}`\n}\n\n/** Parse UI fields for first-time Syrup deposit (`authorizeAndDeposit`). */\nexport function parseMapleStakeAuthInputs(args: {\n bitmap: string\n deadline: string\n v: string\n r: string\n s: string\n}): { ok: true; sig: MapleSyrupAuthorizeSig } | { ok: false; message: string } {\n const bitmapT = args.bitmap.trim()\n let bitmap: bigint\n if (!bitmapT) return { ok: false, message: 'Enter authorization bitmap (uint256).' }\n try {\n bitmap = bitmapT.startsWith('0x') || bitmapT.startsWith('0X') ? BigInt(bitmapT) : BigInt(bitmapT)\n } catch {\n return { ok: false, message: 'Bitmap must be a decimal or 0x-prefixed integer.' }\n }\n const deadlineT = args.deadline.trim()\n if (!deadlineT || !/^\\d+$/.test(deadlineT)) {\n return { ok: false, message: 'Deadline must be a Unix timestamp (seconds), decimal digits only.' }\n }\n const deadline = BigInt(deadlineT)\n if (deadline <= 0n) return { ok: false, message: 'Deadline must be positive.' }\n const vT = args.v.trim()\n if (!/^\\d+$/.test(vT)) return { ok: false, message: 'v must be an integer 0–255 (often 27 or 28).' }\n const v = Number(vT)\n if (!Number.isFinite(v) || v < 0 || v > 255) return { ok: false, message: 'v must be between 0 and 255.' }\n let r = args.r.trim()\n let s = args.s.trim()\n if (!r.startsWith('0x')) r = '0x' + r\n if (!s.startsWith('0x')) s = '0x' + s\n if (!/^0x[0-9a-fA-F]{64}$/.test(r)) return { ok: false, message: 'r must be 32 bytes (64 hex chars), optional 0x.' }\n if (!/^0x[0-9a-fA-F]{64}$/.test(s)) return { ok: false, message: 's must be 32 bytes (64 hex chars), optional 0x.' }\n return { ok: true, sig: { bitmap, deadline, v, r: r as `0x${string}`, s: s as `0x${string}` } }\n}\n\nexport async function buildEvmMultisignBodyMapleSyrupDeposit(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n /** Underlying USDC / USDT (must match the pool’s asset). */\n asset: Address\n syrupRouter: Address\n pool: Address\n amountHuman: string\n /** Omit to read decimals on-chain (or pass from token registry). */\n assetDecimals?: number\n executorAddress: Address\n purposeText: string\n /** Default `deposit`. Use `authorizeAndDeposit` with Maple-issued {@link authorizeSig} for first-time lenders. */\n stakeMethod?: 'deposit' | 'authorizeAndDeposit'\n authorizeSig?: MapleSyrupAuthorizeSig\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== 1 && args.chainId !== 11155111) {\n throw new Error('Maple Syrup deposit is only supported on Ethereum mainnet or Sepolia.')\n }\n const asset = getAddress(args.asset)\n const router = getAddress(args.syrupRouter)\n const pool = getAddress(args.pool)\n const executor = getAddress(args.executorAddress)\n const depositData = formatBytes32DataLabel(MAPLE_SYRUP_DEPOSIT_DATA_ASCII)\n\n const publicClient = publicClientForChain(args.chainId, args.rpcUrl)\n\n let dec = args.assetDecimals\n if (dec == null || !Number.isFinite(dec)) {\n const onChain = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n dec = Number(onChain)\n }\n if (!Number.isFinite(dec) || dec < 0 || dec > 255) throw new Error('Invalid asset decimals.')\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Amount is zero after converting with token decimals.')\n\n const stakeMethod = args.stakeMethod ?? 'deposit'\n if (stakeMethod === 'authorizeAndDeposit') {\n const a = args.authorizeSig\n if (!a) throw new Error('authorizeSig is required for authorizeAndDeposit.')\n if (a.v < 0 || a.v > 255) throw new Error('Invalid authorization v (must be 0–255).')\n }\n\n const steps: MapleStakeStep[] = []\n const currentAllowance = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, router],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [router, 0n],\n })\n steps.push({ kind: 'approve', to: asset, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [router, amountWei],\n })\n steps.push({ kind: 'approve', to: asset, data: dataApprove, value: 0n })\n }\n\n if (stakeMethod === 'authorizeAndDeposit') {\n const a = args.authorizeSig!\n const authCalldata = encodeFunctionData({\n abi: syrupRouterAbi,\n functionName: 'authorizeAndDeposit',\n args: [a.bitmap, a.deadline, a.v, a.r, a.s, amountWei, depositData],\n })\n steps.push({ kind: 'authorizeAndDeposit', to: router, data: authCalldata, value: 0n })\n } else {\n const depositCalldata = encodeFunctionData({\n abi: syrupRouterAbi,\n functionName: 'deposit',\n args: [amountWei, depositData],\n })\n steps.push({ kind: 'deposit', to: router, data: depositCalldata, value: 0n })\n }\n\n const chainIdStr = String(args.chainId)\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'approve' ? AAVE_ERC20_APPROVE_FALLBACK : MAPLE_SYRUP_DEPOSIT_FALLBACK,\n }))\n const n = steps.length\n const finalVerb =\n stakeMethod === 'authorizeAndDeposit' ? 'authorizeAndDeposit (permission + deposit)' : 'deposit'\n const purposeSuffix =\n n === 1\n ? `Maple Syrup: 1-tx — ${finalVerb} via SyrupRouter (allowance already set).`\n : `Maple Syrup: ${n}-tx batch — approve asset for SyrupRouter, then ${finalVerb}.`\n const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n estimateGasForStep: async ({ step, index, publicClient, executor: exec }) => {\n const s = steps[index]!\n if ((s.kind === 'deposit' || s.kind === 'authorizeAndDeposit') && index > 0) {\n return MAPLE_SYRUP_DEPOSIT_FALLBACK\n }\n try {\n return await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: exec,\n })\n } catch (e) {\n if (s.kind === 'deposit' || s.kind === 'authorizeAndDeposit') {\n const msg = e instanceof Error ? e.message : String(e)\n if (/NOT_AUTHORIZED|SR:D:NOT_AUTHORIZED/i.test(msg)) {\n throw new Error(\n stakeMethod === 'authorizeAndDeposit'\n ? 'Maple SyrupRouter rejected authorizeAndDeposit (SR:D:NOT_AUTHORIZED). Check the authorization signature, deadline, and bitmap from Maple; they must match this chain, router, and owner.'\n : 'Maple SyrupRouter rejected deposit (SR:D:NOT_AUTHORIZED): this executor is not allowlisted as a Syrup lender on-chain. ' +\n 'Use authorizeAndDeposit with a Maple-issued signature for the first deposit, or ask Maple to allowlist this address.',\n )\n }\n }\n return s.kind === 'approve' ? AAVE_ERC20_APPROVE_FALLBACK : MAPLE_SYRUP_DEPOSIT_FALLBACK\n }\n },\n buildBatchMeta: ({ index, gasLimit }) => {\n const s = steps[index]!\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'MapleSyrup',\n name: 'ERC20.approve',\n note: 'Allow SyrupRouter to pull this deposit amount.',\n spender: router,\n asset,\n pool,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'maple_syrup_erc20_approve', version: 1, chainId: chainIdStr },\n maple: { step: 'approve_asset', router, pool, asset },\n }\n }\n if (s.kind === 'deposit') {\n return {\n signatureText: JSON.stringify({\n kind: 'MapleSyrup',\n name: 'SyrupRouter.deposit',\n function: 'deposit(uint256 assets, bytes32 depositData)',\n assets: amountWei.toString(),\n pool,\n router,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'maple_syrup_router_deposit', version: 1, chainId: chainIdStr },\n maple: { step: 'deposit', router, pool, gasBuildDeposit: { baseGasUnits: gasLimit.toString() } },\n }\n }\n const a = args.authorizeSig!\n return {\n signatureText: JSON.stringify({\n kind: 'MapleSyrup',\n name: 'SyrupRouter.authorizeAndDeposit',\n function:\n 'authorizeAndDeposit(uint256 bitmap,uint256 deadline,uint8 auth_v,bytes32 auth_r,bytes32 auth_s,uint256 amount,bytes32 depositData)',\n bitmap: a.bitmap.toString(),\n deadline: a.deadline.toString(),\n auth_v: a.v,\n assets: amountWei.toString(),\n pool,\n router,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'maple_syrup_router_authorize_and_deposit', version: 1, chainId: chainIdStr },\n maple: { step: 'authorize_and_deposit', router, pool, gasBuildDeposit: { baseGasUnits: gasLimit.toString() } },\n }\n },\n })\n}\n\nexport async function buildEvmMultisignBodyMaplePoolRequestRedeem(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n pool: Address\n /** Human amount in **underlying** units (e.g. USDC). */\n underlyingAmountHuman: string\n underlyingDecimals: number\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== 1 && args.chainId !== 11155111) {\n throw new Error('Maple Syrup redeem request is only supported on Ethereum mainnet or Sepolia.')\n }\n const pool = getAddress(args.pool)\n const executor = getAddress(args.executorAddress)\n const receiver = executor\n\n const ud = args.underlyingDecimals\n if (!Number.isFinite(ud) || ud < 0 || ud > 255) throw new Error('Invalid underlying decimals.')\n const assetWei = parseUnits(args.underlyingAmountHuman, ud)\n if (assetWei === 0n) throw new Error('Amount is zero after converting with token decimals.')\n\n const publicClient = publicClientForChain(args.chainId, args.rpcUrl)\n const exitShares = await publicClient.readContract({\n address: pool,\n abi: poolV2ExitAbi,\n functionName: 'convertToExitShares',\n args: [assetWei],\n })\n if (exitShares === 0n) throw new Error('Exit shares are zero for this amount; check pool liquidity and amount.')\n\n const data = encodeFunctionData({\n abi: poolV2ExitAbi,\n functionName: 'requestRedeem',\n args: [exitShares, receiver],\n })\n\n const chainIdStr = String(args.chainId)\n const firstDataNo0x = data.startsWith('0x') ? data.slice(2) : data\n const purposeSuffix = 'Maple Syrup: 1-tx — request redeem (queue withdrawal of underlying from pool shares).'\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: [{ to: pool, data, value: 0n, fallbackGas: MAPLE_REQUEST_REDEEM_FALLBACK }],\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: pool,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'MapleSyrup',\n name: 'PoolV2.requestRedeem',\n function: 'requestRedeem(uint256 shares, address receiver)',\n shares: exitShares.toString(),\n underlyingAmountHuman: args.underlyingAmountHuman,\n receiver,\n pool,\n }),\n evm: { type: 'maple_pool_v2_request_redeem', version: 1, chainId: chainIdStr },\n maple: { step: 'request_redeem', pool, gasBuildRedeem: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n}\n","/**\n * Optional browser → Next.js API proxy paths for DeFi upstream calls.\n * Set once from continuumdao-node-app client bootstrap.\n */\n\nlet aaveGraphqlProxyUrl: string | undefined\nlet eulerGraphqlProxyUrl: string | undefined\nlet mapleGraphqlProxyUrl: string | undefined\nlet morphoGraphqlProxyUrl: string | undefined\nlet coingeckoProxyUrl: string | undefined\n\nexport function setAaveGraphqlProxyUrl(url: string | undefined): void {\n aaveGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getAaveGraphqlProxyUrl(): string | undefined {\n return aaveGraphqlProxyUrl\n}\n\nexport function setEulerGraphqlProxyUrl(url: string | undefined): void {\n eulerGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getEulerGraphqlProxyUrl(): string | undefined {\n return eulerGraphqlProxyUrl\n}\n\n/** Browser → Next.js base path for Euler V3 REST (`/v3/evk/vaults`, …). */\nlet eulerV3ApiProxyBase: string | undefined\n\nexport function setEulerV3ApiProxyBase(url: string | undefined): void {\n eulerV3ApiProxyBase = url?.trim().replace(/\\/$/, '') || undefined\n}\n\nexport function getEulerV3ApiProxyBase(): string | undefined {\n return eulerV3ApiProxyBase\n}\n\nexport function setMapleGraphqlProxyUrl(url: string | undefined): void {\n mapleGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMapleGraphqlProxyUrl(): string | undefined {\n return mapleGraphqlProxyUrl\n}\n\nexport function setMorphoGraphqlProxyUrl(url: string | undefined): void {\n morphoGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoGraphqlProxyUrl(): string | undefined {\n return morphoGraphqlProxyUrl\n}\n\n/** Browser → Next.js base path for Morpho Midnight REST (replaces api.morpho.org/v0/midnight). */\nlet morphoMidnightRestProxyUrl: string | undefined\n\nexport function setMorphoMidnightRestProxyUrl(url: string | undefined): void {\n morphoMidnightRestProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoMidnightRestProxyUrl(): string | undefined {\n return morphoMidnightRestProxyUrl\n}\n\nexport function setCoingeckoProxyUrl(url: string | undefined): void {\n coingeckoProxyUrl = url?.trim() || undefined\n}\n\nexport function getCoingeckoProxyUrl(): string | undefined {\n return coingeckoProxyUrl\n}\n\nexport async function postJsonViaOptionalProxy<T>(args: {\n directUrl: string\n body: unknown\n proxyUrl?: string\n proxyEnvelope?: unknown\n}): Promise<T> {\n const proxy = args.proxyUrl?.trim()\n if (proxy) {\n const r = await fetch(proxy, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.proxyEnvelope ?? args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `Proxy HTTP ${r.status}: ${t.slice(0, 200)}` : `Proxy HTTP ${r.status}`)\n }\n return (await r.json()) as T\n }\n const r = await fetch(args.directUrl, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `HTTP ${r.status}: ${t.slice(0, 200)}` : `HTTP ${r.status}`)\n }\n return (await r.json()) as T\n}\n\nexport async function getJsonViaOptionalProxy<T>(args: {\n directUrl: string\n /** When set, GET this URL instead of directUrl (same path semantics as caller built). */\n proxyUrl?: string\n}): Promise<T> {\n const url = args.proxyUrl?.trim() || args.directUrl\n const r = await fetch(url, { method: 'GET', headers: { accept: 'application/json' } })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `HTTP ${r.status}: ${t.slice(0, 200)}` : `HTTP ${r.status}`)\n }\n return (await r.json()) as T\n}\n","import { getAddress, type Address } from 'viem'\nimport { getMapleGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\nimport { mapleGraphqlEndpointForChain } from './constants.js'\n\nexport type MapleSyrupPoolFromApi = {\n id: Address\n name: string\n asset: { id: Address; symbol: string; decimals: number }\n syrupRouter: { id: Address }\n weeklyApy: string\n monthlyApy: string\n totalAssets: string\n}\n\ntype PoolsQuery = { poolV2S: MapleSyrupPoolFromApi[] }\n\nconst POOLS_GQL = `\n query MapleSyrupPools {\n poolV2S(where: { syrupRouter_not: null }) {\n id\n name\n weeklyApy\n monthlyApy\n totalAssets\n asset {\n id\n symbol\n decimals\n }\n syrupRouter {\n id\n }\n }\n }\n`\n\nfunction normalizePool(p: MapleSyrupPoolFromApi): MapleSyrupPoolFromApi {\n return {\n id: getAddress(p.id as `0x${string}`),\n name: (p.name ?? '').trim(),\n asset: {\n id: getAddress(p.asset.id as `0x${string}`),\n symbol: (p.asset.symbol ?? '').trim(),\n decimals: Number(p.asset.decimals),\n },\n syrupRouter: { id: getAddress(p.syrupRouter.id as `0x${string}`) },\n weeklyApy: String(p.weeklyApy ?? '').trim(),\n monthlyApy: String(p.monthlyApy ?? '').trim(),\n totalAssets: String(p.totalAssets ?? '').trim(),\n }\n}\n\nasync function mapleGraphqlPost<T>(args: {\n chainId: number\n query: string\n variables?: Record<string, unknown>\n}): Promise<{ data?: T; errors?: { message?: string }[] }> {\n const endpoint = mapleGraphqlEndpointForChain(args.chainId)\n if (!endpoint) throw new Error(`Maple GraphQL is not configured for chain ${args.chainId}`)\n const body = { query: args.query, variables: args.variables ?? {} }\n return postJsonViaOptionalProxy<{ data?: T; errors?: { message?: string }[] }>({\n directUrl: endpoint,\n body,\n proxyUrl: getMapleGraphqlProxyUrl(),\n proxyEnvelope: { chainId: args.chainId, query: args.query, variables: args.variables ?? {} },\n })\n}\n\n/**\n * Fetch Syrup-enabled PoolV2 rows (share token = pool contract `id`) for Ethereum or Sepolia.\n */\nexport async function fetchMapleSyrupPools(chainId: number): Promise<MapleSyrupPoolFromApi[]> {\n const raw = await mapleGraphqlPost<PoolsQuery>({ chainId, query: POOLS_GQL })\n if (raw.errors?.length) {\n throw new Error(raw.errors.map((e) => e.message ?? 'GraphQL error').join('; '))\n }\n const rows = raw.data?.poolV2S ?? []\n return rows.map(normalizePool)\n}\n\ntype AccountQuery = { account: { isSyrupLender: boolean } | null }\n\nconst ACCOUNT_GQL = `\n query MapleAccount($accountId: ID!) {\n account(id: $accountId) {\n isSyrupLender\n }\n }\n`\n\nexport async function fetchMapleAccountIsSyrupLender(args: {\n chainId: number\n account: Address\n}): Promise<boolean | null> {\n try {\n const raw = await mapleGraphqlPost<AccountQuery>({\n chainId: args.chainId,\n query: ACCOUNT_GQL,\n variables: { accountId: args.account.toLowerCase() },\n })\n const acct = raw.data?.account\n if (!acct) return null\n return Boolean(acct.isSyrupLender)\n } catch {\n return null\n }\n}\n","import { getAddress, isAddress } from 'viem'\n\n/** Match an optional fetch filter that is either an ERC-20 address or a ticker (USDT). */\nexport function matchesAssetFilter(opts: {\n address?: string\n symbol?: string\n filter?: string\n}): boolean {\n const f = (opts.filter ?? '').trim()\n if (!f) return true\n const addr = (opts.address ?? '').trim()\n if (isAddress(f) && isAddress(addr)) {\n return getAddress(addr) === getAddress(f)\n }\n const sym = (opts.symbol ?? '').trim()\n if (!sym) return false\n return sym.toLowerCase() === f.toLowerCase()\n}\n","import { formatUnits, getAddress, isAddress } from 'viem'\nimport { matchesAssetFilter } from '../../../agent/support/assetFilter.js'\nimport { isMapleSyrupSupportedChain } from './constants.js'\nimport { fetchMapleSyrupPools, type MapleSyrupPoolFromApi } from './graphql.js'\n\nexport type MapleSyrupMarketSummaryRow = {\n chainId: number\n name: string\n pool: string\n syrupRouter: string\n asset: string\n assetSymbol: string\n assetDecimals: number\n weeklyApyPercent: string\n monthlyApyPercent: string\n totalAssets: string\n}\n\n/** Maple GraphQL APY: percent = raw / 1e28 (official frontend-integration docs). */\nexport function parseMapleApyPercent(raw: string | null | undefined): number | null {\n const t = (raw ?? '').trim()\n if (!t || !/^\\d+$/.test(t)) return null\n const n = Number(BigInt(t)) / 1e28\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\nexport function formatMapleApyPercentLabel(raw: string | null | undefined): string {\n const n = parseMapleApyPercent(raw)\n if (n == null) return '—'\n return `${n.toFixed(2)}%`\n}\n\nexport function formatMapleTotalAssetsLabel(raw: string | null | undefined, decimals: number): string {\n const t = (raw ?? '').trim()\n if (!t || !/^\\d+$/.test(t) || !Number.isFinite(decimals) || decimals < 0) return '—'\n try {\n const n = Number(formatUnits(BigInt(t), decimals))\n if (!Number.isFinite(n)) return '—'\n if (n === 0) return '0'\n if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(2).replace(/\\.?0+$/, '')}M`\n if (n >= 1000) return `${(n / 1000).toFixed(2).replace(/\\.?0+$/, '')}k`\n return n.toFixed(2).replace(/\\.?0+$/, '')\n } catch {\n return '—'\n }\n}\n\nexport function isMapleSyrupPoolActive(pool: MapleSyrupPoolFromApi): boolean {\n const assets = (pool.totalAssets ?? '').trim()\n if (!assets || !/^\\d+$/.test(assets)) return false\n return BigInt(assets) > 0n\n}\n\nexport function mapleSyrupMarketRowFromPool(args: {\n chainId: number\n pool: MapleSyrupPoolFromApi\n}): MapleSyrupMarketSummaryRow {\n return {\n chainId: args.chainId,\n name: args.pool.name || '—',\n pool: getAddress(args.pool.id),\n syrupRouter: getAddress(args.pool.syrupRouter.id),\n asset: getAddress(args.pool.asset.id),\n assetSymbol: args.pool.asset.symbol || '—',\n assetDecimals: args.pool.asset.decimals,\n weeklyApyPercent: formatMapleApyPercentLabel(args.pool.weeklyApy),\n monthlyApyPercent: formatMapleApyPercentLabel(args.pool.monthlyApy),\n totalAssets: formatMapleTotalAssetsLabel(args.pool.totalAssets, args.pool.asset.decimals),\n }\n}\n\nfunction sortByMonthlyApyDesc(a: MapleSyrupMarketSummaryRow, b: MapleSyrupMarketSummaryRow): number {\n const pa = parseFloat(a.monthlyApyPercent)\n const pb = parseFloat(b.monthlyApyPercent)\n const na = Number.isFinite(pa) ? pa : -1\n const nb = Number.isFinite(pb) ? pb : -1\n if (nb !== na) return nb - na\n return a.assetSymbol.localeCompare(b.assetSymbol, undefined, { sensitivity: 'base' })\n}\n\n/** MCP: list Syrup pools with live weekly/monthly APY. GraphQL only — no RPC. */\nexport async function mapleSyrupFetchMarketsSummary(args: {\n chainId: number\n underlying?: string\n}): Promise<{ chainId: number; markets: MapleSyrupMarketSummaryRow[]; notes: string }> {\n if (!isMapleSyrupSupportedChain(args.chainId)) {\n return {\n chainId: args.chainId,\n markets: [],\n notes: `Maple Syrup is not deployed on chain ${args.chainId}. Supported: Ethereum (1), Sepolia (11155111).`,\n }\n }\n const pools = (await fetchMapleSyrupPools(args.chainId)).filter(isMapleSyrupPoolActive)\n let markets = pools.map((pool) => mapleSyrupMarketRowFromPool({ chainId: args.chainId, pool }))\n const rawUnderlying = (args.underlying ?? '').trim()\n if (rawUnderlying) {\n markets = markets.filter((m) =>\n matchesAssetFilter({ address: m.asset, symbol: m.assetSymbol, filter: rawUnderlying }),\n )\n }\n markets.sort(sortByMonthlyApyDesc)\n return {\n chainId: args.chainId,\n markets,\n notes:\n 'Weekly/monthly APY from Maple GraphQL (api.maple.finance). APY % = raw / 1e28. Unused zero-TVL pools omitted. ' +\n 'Copy pool + syrupRouter + asset for build_deposit_multisign / build_request_redeem_multisign. Do not web-search Maple rates.',\n }\n}\n\n/** MCP: one Syrup pool by pool address or underlying. */\nexport async function mapleSyrupFetchMarketSummary(args: {\n chainId: number\n pool?: string\n underlying?: string\n}): Promise<{ chainId: number; markets: MapleSyrupMarketSummaryRow[]; notes: string }> {\n const poolAddr = (args.pool ?? '').trim()\n const und = (args.underlying ?? '').trim()\n if (!poolAddr && !und) {\n throw new Error('pass pool or underlying.')\n }\n if (poolAddr && !isAddress(poolAddr)) {\n throw new Error('pool must be a valid pool (share token) address.')\n }\n const out = await mapleSyrupFetchMarketsSummary({\n chainId: args.chainId,\n underlying: und || undefined,\n })\n let markets = out.markets\n if (poolAddr) {\n const want = getAddress(poolAddr).toLowerCase()\n markets = markets.filter((m) => m.pool.toLowerCase() === want)\n }\n if (!markets.length) {\n return {\n ...out,\n markets,\n notes:\n out.notes +\n ` No live Syrup pool matched` +\n (poolAddr ? ` pool ${getAddress(poolAddr)}` : '') +\n (und ? ` underlying ${isAddress(und) ? getAddress(und) : und}` : '') +\n ` on chain ${args.chainId}.`,\n }\n }\n return { ...out, markets }\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isMapleSyrupSupportedChain } from './constants.js'\n\nexport * from './constants.js'\nexport * from './multisign.js'\nexport * from './graphql.js'\nexport * from './reads.js'\n\nexport const MAPLE_PROTOCOL_ID = 'maple-syrup'\n\nexport const mapleProtocolModule: ProtocolModule = {\n id: MAPLE_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n return isMapleSyrupSupportedChain(n)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'maple-syrup.deposit', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Maple Syrup pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'maple-syrup.request-redeem', protocolId: MAPLE_PROTOCOL_ID, chainCategory: 'evm', description: 'Request redeem from pool', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(mapleProtocolModule)\n"]}
|
|
@@ -3,7 +3,11 @@
|
|
|
3
3
|
var viem = require('viem');
|
|
4
4
|
var api = require('@morpho-org/midnight-sdk/api');
|
|
5
5
|
var midnightSdk = require('@morpho-org/midnight-sdk');
|
|
6
|
-
var
|
|
6
|
+
var rpcUtils_js = require('@continuumdao/continuum-node-sdk/dist/evm/rpc-utils.js');
|
|
7
|
+
var chainFees_js = require('@continuumdao/continuum-node-sdk/dist/evm/chain-fees.js');
|
|
8
|
+
var getSigFeeSpeed_js = require('@continuumdao/continuum-node-sdk/dist/evm/get-sig-fee-speed.js');
|
|
9
|
+
var gwei_js = require('@continuumdao/continuum-node-sdk/dist/evm/gwei.js');
|
|
10
|
+
var txParams_js = require('@continuumdao/continuum-node-sdk/dist/evm/tx-params.js');
|
|
7
11
|
|
|
8
12
|
var __defProp = Object.defineProperty;
|
|
9
13
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
@@ -2276,7 +2280,7 @@ function finalizeMultisign(input) {
|
|
|
2276
2280
|
const ph = (keyGen.pubkeyhex ?? "").trim();
|
|
2277
2281
|
if (!ph) throw new Error("keyGen pubKey (pubkeyhex) is required");
|
|
2278
2282
|
const keyList = keyGen.keylist ?? [];
|
|
2279
|
-
const clientId =
|
|
2283
|
+
const clientId = rpcUtils_js.getClientIdFromKeyGenResult(keyGen);
|
|
2280
2284
|
const first = legs[0];
|
|
2281
2285
|
const messageHashes = legs.map((l) => l.msgHash);
|
|
2282
2286
|
const messageRawBatch = legs.map((l) => l.msgRaw);
|
|
@@ -2322,11 +2326,16 @@ function finalizeMultisign(input) {
|
|
|
2322
2326
|
}
|
|
2323
2327
|
function routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimit) {
|
|
2324
2328
|
if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {
|
|
2325
|
-
return
|
|
2329
|
+
return txParams_js.gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit);
|
|
2326
2330
|
}
|
|
2327
2331
|
return (estimatedGas * 12n + 9n) / 10n;
|
|
2328
2332
|
}
|
|
2329
2333
|
|
|
2334
|
+
// src/chains/evm/unsignedMessageRaw.ts
|
|
2335
|
+
function evmUnsignedMessageRaw(serialized) {
|
|
2336
|
+
return serialized.startsWith("0x") ? serialized.slice(2) : serialized;
|
|
2337
|
+
}
|
|
2338
|
+
|
|
2330
2339
|
// src/chains/evm/buildBatch.ts
|
|
2331
2340
|
async function buildEvmMultisignBatch(args) {
|
|
2332
2341
|
const { context, steps } = args;
|
|
@@ -2348,7 +2357,7 @@ async function buildEvmMultisignBatch(args) {
|
|
|
2348
2357
|
rpcUrls: { default: { http: [rpcUrl] } }
|
|
2349
2358
|
});
|
|
2350
2359
|
const publicClient = viem.createPublicClient({ chain: ch, transport: defiEvmTransport(rpcUrl) });
|
|
2351
|
-
const feeParams = await
|
|
2360
|
+
const feeParams = await chainFees_js.fetchChainFeeParams(rpcUrl, chainId);
|
|
2352
2361
|
const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559;
|
|
2353
2362
|
const latestBaseFeeWei = !legacy ? (await publicClient.getBlock({ blockTag: "latest" })).baseFeePerGas ?? 0n : 0n;
|
|
2354
2363
|
const gasLimitConfig = useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : void 0;
|
|
@@ -2381,7 +2390,7 @@ async function buildEvmMultisignBatch(args) {
|
|
|
2381
2390
|
} else if (step.routerSwap) {
|
|
2382
2391
|
gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter);
|
|
2383
2392
|
} else {
|
|
2384
|
-
gasLimitI = useCustomGas ?
|
|
2393
|
+
gasLimitI = useCustomGas ? txParams_js.gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig) : estimatedGas;
|
|
2385
2394
|
}
|
|
2386
2395
|
let proposalTxParams;
|
|
2387
2396
|
let feeSnapshot;
|
|
@@ -2392,7 +2401,7 @@ async function buildEvmMultisignBatch(args) {
|
|
|
2392
2401
|
gasPriceWei = gasPriceWei * BigInt(100 + gasFeeMultiplier) / 100n;
|
|
2393
2402
|
}
|
|
2394
2403
|
if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {
|
|
2395
|
-
const configured = viem.parseGwei(
|
|
2404
|
+
const configured = viem.parseGwei(gwei_js.gweiToDecimalString(Number(chainDetail.gasPrice)));
|
|
2396
2405
|
if (configured > gasPriceWei) gasPriceWei = configured;
|
|
2397
2406
|
}
|
|
2398
2407
|
serialized = viem.serializeTransaction({
|
|
@@ -2411,7 +2420,7 @@ async function buildEvmMultisignBatch(args) {
|
|
|
2411
2420
|
txType: "legacy",
|
|
2412
2421
|
gasPrice: gasPriceWei.toString()
|
|
2413
2422
|
};
|
|
2414
|
-
feeSnapshot =
|
|
2423
|
+
feeSnapshot = txParams_js.proposalTxParamsToFeeSnapshot(proposalTxParams);
|
|
2415
2424
|
} else {
|
|
2416
2425
|
const fetchedBase = feeParams.baseFeeGwei ?? 0;
|
|
2417
2426
|
const fetchedPriority = feeParams.priorityFeeGwei ?? 0;
|
|
@@ -2422,13 +2431,13 @@ async function buildEvmMultisignBatch(args) {
|
|
|
2422
2431
|
const baseFeeMultiplierPct = useCustomGas && chainDetail?.baseFeeMultiplier != null ? Math.max(100, Number(chainDetail.baseFeeMultiplier)) : 100;
|
|
2423
2432
|
const baseComponentGwei = effectiveBaseFeeGwei * baseFeeMultiplierPct / 100;
|
|
2424
2433
|
const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei;
|
|
2425
|
-
let maxPriorityFeePerGas = effectivePriorityFeeGwei > 0 ? viem.parseGwei(
|
|
2426
|
-
let maxFeePerGas = viem.parseGwei(
|
|
2434
|
+
let maxPriorityFeePerGas = effectivePriorityFeeGwei > 0 ? viem.parseGwei(gwei_js.gweiToDecimalString(effectivePriorityFeeGwei)) : viem.parseGwei("1");
|
|
2435
|
+
let maxFeePerGas = viem.parseGwei(gwei_js.gweiToDecimalString(maxFeePerGasGwei));
|
|
2427
2436
|
if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {
|
|
2428
2437
|
maxPriorityFeePerGas = maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier) / 100n;
|
|
2429
2438
|
maxFeePerGas = maxFeePerGas * BigInt(100 + gasFeeMultiplier) / 100n;
|
|
2430
2439
|
}
|
|
2431
|
-
({ maxFeePerGas, maxPriorityFeePerGas } =
|
|
2440
|
+
({ maxFeePerGas, maxPriorityFeePerGas } = getSigFeeSpeed_js.alignEip1559FeesWithLatestBase(
|
|
2432
2441
|
maxFeePerGas,
|
|
2433
2442
|
maxPriorityFeePerGas,
|
|
2434
2443
|
latestBaseFeeWei
|
|
@@ -2451,14 +2460,14 @@ async function buildEvmMultisignBatch(args) {
|
|
|
2451
2460
|
maxFeePerGas: maxFeePerGas.toString(),
|
|
2452
2461
|
maxPriorityFeePerGas: maxPriorityFeePerGas.toString()
|
|
2453
2462
|
};
|
|
2454
|
-
feeSnapshot = i === 0 ?
|
|
2463
|
+
feeSnapshot = i === 0 ? txParams_js.proposalTxParamsToFeeSnapshot(proposalTxParams) : {};
|
|
2455
2464
|
}
|
|
2456
2465
|
const h = viem.keccak256(serialized);
|
|
2457
2466
|
const msgHash = h.startsWith("0x") ? h.slice(2) : h;
|
|
2458
2467
|
const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI });
|
|
2459
2468
|
legs.push({
|
|
2460
2469
|
msgHash,
|
|
2461
|
-
msgRaw:
|
|
2470
|
+
msgRaw: evmUnsignedMessageRaw(serialized),
|
|
2462
2471
|
destinationAddress: step.to,
|
|
2463
2472
|
signatureText: typeof batchMetaExtra.signatureText === "string" ? batchMetaExtra.signatureText : JSON.stringify(batchMetaExtra.signatureText ?? {}),
|
|
2464
2473
|
audit: batchMetaExtra,
|
|
@@ -2466,9 +2475,6 @@ async function buildEvmMultisignBatch(args) {
|
|
|
2466
2475
|
proposalTxParams,
|
|
2467
2476
|
valueWei: i === 0 ? step.value : void 0
|
|
2468
2477
|
});
|
|
2469
|
-
if (i === 0 && args.firstMsgRawNo0x != null) {
|
|
2470
|
-
legs[0].msgRaw = args.firstMsgRawNo0x;
|
|
2471
|
-
}
|
|
2472
2478
|
}
|
|
2473
2479
|
const extraJSON = {};
|
|
2474
2480
|
if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {
|