@continuumdao/ctm-mpc-defi 0.1.4 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +20 -78
- package/dist/agent/catalog.cjs +1388 -144
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +881 -17
- package/dist/agent/catalog.js +1327 -145
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/aave-v4/SKILL.md +43 -0
- package/dist/agent/skills/curve-dao/SKILL.md +12 -0
- package/dist/agent/skills/ethena/SKILL.md +10 -0
- package/dist/agent/skills/euler-v2/SKILL.md +10 -0
- package/dist/agent/skills/lido/SKILL.md +22 -0
- package/dist/agent/skills/maple-syrup/SKILL.md +10 -0
- package/dist/agent/skills/sky/SKILL.md +10 -0
- package/dist/agent/skills/uniswap-v4/SKILL.md +22 -0
- package/dist/chains/evm/index.cjs +27 -213
- package/dist/chains/evm/index.cjs.map +1 -1
- package/dist/chains/evm/index.d.ts +15 -25
- package/dist/chains/evm/index.js +21 -199
- package/dist/chains/evm/index.js.map +1 -1
- package/dist/chains/near/index.d.ts +1 -1
- package/dist/chains/solana/index.d.ts +1 -1
- package/dist/core/index.cjs +8 -110
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +5 -39
- package/dist/core/index.js +6 -100
- package/dist/core/index.js.map +1 -1
- package/dist/{envelope-CcE5Cz_q.d.ts → envelope-CpBUh9eP.d.ts} +1 -1
- package/dist/index.cjs +238 -1184
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +7 -10
- package/dist/index.js +227 -1156
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs +1710 -0
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -0
- package/dist/protocols/evm/aave-v4/index.d.ts +499 -0
- package/dist/protocols/evm/aave-v4/index.js +1666 -0
- package/dist/protocols/evm/aave-v4/index.js.map +1 -0
- package/dist/protocols/evm/curve-dao/index.cjs +24 -124
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/curve-dao/index.d.ts +3 -4
- package/dist/protocols/evm/curve-dao/index.js +15 -115
- package/dist/protocols/evm/curve-dao/index.js.map +1 -1
- package/dist/protocols/evm/ethena/index.cjs +853 -0
- package/dist/protocols/evm/ethena/index.cjs.map +1 -0
- package/dist/protocols/evm/ethena/index.d.ts +160 -0
- package/dist/protocols/evm/ethena/index.js +831 -0
- package/dist/protocols/evm/ethena/index.js.map +1 -0
- package/dist/protocols/evm/euler-v2/index.cjs +1585 -0
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -0
- package/dist/protocols/evm/euler-v2/index.d.ts +316 -0
- package/dist/protocols/evm/euler-v2/index.js +1560 -0
- package/dist/protocols/evm/euler-v2/index.js.map +1 -0
- package/dist/protocols/evm/lido/index.cjs +839 -0
- package/dist/protocols/evm/lido/index.cjs.map +1 -0
- package/dist/protocols/evm/lido/index.d.ts +119 -0
- package/dist/protocols/evm/lido/index.js +814 -0
- package/dist/protocols/evm/lido/index.js.map +1 -0
- package/dist/protocols/evm/maple/index.cjs +619 -0
- package/dist/protocols/evm/maple/index.cjs.map +1 -0
- package/dist/protocols/evm/maple/index.d.ts +108 -0
- package/dist/protocols/evm/maple/index.js +605 -0
- package/dist/protocols/evm/maple/index.js.map +1 -0
- package/dist/protocols/evm/sky/index.cjs +1259 -0
- package/dist/protocols/evm/sky/index.cjs.map +1 -0
- package/dist/protocols/evm/sky/index.d.ts +217 -0
- package/dist/protocols/evm/sky/index.js +1234 -0
- package/dist/protocols/evm/sky/index.js.map +1 -0
- package/dist/protocols/evm/uniswap-v4/index.cjs +423 -658
- package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.d.ts +3 -4
- package/dist/protocols/evm/uniswap-v4/index.js +422 -657
- package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
- package/dist/{registry-oMKlO_5z.d.ts → registry-Bv5o37_w.d.ts} +1 -1
- package/dist/{types-Ce2qNHai.d.cts → types-BfjWdw1j.d.ts} +3 -1
- package/dist/{types-5u863Fd9.d.ts → types-DUeNJLr9.d.ts} +1 -1
- package/package.json +43 -8
- package/dist/agent/catalog.d.cts +0 -195
- package/dist/chains/evm/index.d.cts +0 -62
- package/dist/chains/near/index.d.cts +0 -37
- package/dist/chains/solana/index.d.cts +0 -40
- package/dist/core/index.d.cts +0 -43
- package/dist/envelope-DYDPnrHZ.d.cts +0 -35
- package/dist/index.d.cts +0 -15
- package/dist/keygen-CfNp8yKJ.d.cts +0 -9
- package/dist/keygen-DsINazx8.d.ts +0 -9
- package/dist/nodeRead-BnmSaMGO.d.cts +0 -8
- package/dist/nodeRead-BnmSaMGO.d.ts +0 -8
- package/dist/protocols/evm/curve-dao/index.d.cts +0 -147
- package/dist/protocols/evm/uniswap-v4/index.d.cts +0 -324
- package/dist/registry-BwZoE668.d.cts +0 -8
- package/dist/txParams-BC7ogvdR.d.cts +0 -19
- package/dist/txParams-BC7ogvdR.d.ts +0 -19
- package/dist/types-B8idm_gu.d.cts +0 -34
- package/dist/types-Ce2qNHai.d.ts +0 -57
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/protocols/evm/euler-v2/sameAssetBorrowLoop.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/euler-v2/vaultWithdrawMultisign.ts","../../../../src/protocols/evm/euler-v2/borrowCollateralMaxWithdrawWei.ts","../../../../src/protocols/evm/euler-v2/isolatedLendMultisign.ts","../../../../src/protocols/evm/euler-v2/isolatedBorrowMultisign.ts","../../../../src/protocols/evm/euler-v2/borrowRepayMultisign.ts","../../../../src/protocols/evm/euler-v2/borrowCollateralDepositMultisign.ts","../../../../src/protocols/evm/euler-v2/borrowCollateralWithdrawMultisign.ts","../../../../src/protocols/evm/euler-v2/index.ts"],"names":["getAddress","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","http","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","parseAbi","encodeFunctionData","parseUnits","erc4626WithdrawAbi","EULER_ERC20_APPROVE_FALLBACK","EULER_WETH_DEPOSIT_FALLBACK","wethDepositAbi","erc20AllowanceAbi","erc20ApproveAbi","erc4626DepositAbi","zeroAddress","evcAbi","maxUint256"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","import { getAddress, type Address } from 'viem'\n\n/** Stay below on-chain max borrow LTV when computing per-round headroom (basis points). */\nexport const EULER_SAME_ASSET_BORROW_PROTOCOL_HEADROOM_BPS = 50n\n\n/** Extra allowance on total collateral deposits: `total * (1 + bps/10000)` plus one wei. */\nexport const EULER_SAME_ASSET_BORROW_APPROVAL_BUFFER_BPS = 100n\n\nexport const EULER_SAME_ASSET_BORROW_MAX_ROUNDS = 48\n\n/** Stop iterating when current LTV is within this many bps of target (0.15%). */\nexport const EULER_SAME_ASSET_BORROW_RATIO_STOP_EPS_BPS = 15n\n\nexport function eulerBorrowAndCollateralSameAsset(row: {\n collateralAssetAddressLower?: string | null | undefined\n borrowAssetAddressLower?: string | null | undefined\n}): boolean {\n const c = (row.collateralAssetAddressLower ?? '').trim().toLowerCase()\n const b = (row.borrowAssetAddressLower ?? '').trim().toLowerCase()\n if (!c.startsWith('0x') || !b.startsWith('0x')) return false\n try {\n return getAddress(c as Address).toLowerCase() === getAddress(b as Address).toLowerCase()\n } catch {\n return false\n }\n}\n\n/**\n * Plan iterative borrow → re-deposit rounds so final debt/collateral (UoA) approaches `targetLtvBps`,\n * without exceeding a capped max LTV (vault max minus protocol headroom). Same borrow/collateral asset only.\n */\nexport function planSameAssetLeveragedBorrows(args: {\n initialCollateralWei: bigint\n oneBorrowUnitUoAWei: bigint\n borrowDecimals: number\n targetLtvBps: number\n maxLtvBps: number\n maxNewBorrowWei: bigint\n}): { borrowWeis: readonly bigint[]; totalBorrowWei: bigint; projectedFinalLtvBps: bigint } | null {\n const { initialCollateralWei: C0wei, oneBorrowUnitUoAWei, borrowDecimals, maxNewBorrowWei } = args\n const targetRaw = Number(args.targetLtvBps)\n const maxLtvBps = Number(args.maxLtvBps)\n\n if (C0wei <= 0n || oneBorrowUnitUoAWei <= 0n || maxNewBorrowWei <= 0n) return null\n if (!Number.isFinite(targetRaw) || !(targetRaw > 0) || targetRaw >= 10000) return null\n if (!Number.isFinite(maxLtvBps) || !(maxLtvBps > 0) || maxLtvBps > 10000) return null\n\n const unit = 10n ** BigInt(borrowDecimals)\n\n const effectiveMax = maxLtvBps > Number(EULER_SAME_ASSET_BORROW_PROTOCOL_HEADROOM_BPS)\n ? maxLtvBps - Number(EULER_SAME_ASSET_BORROW_PROTOCOL_HEADROOM_BPS)\n : maxLtvBps\n let targetBps = Math.min(targetRaw, effectiveMax)\n if (targetBps <= 0) return null\n // Final ratio stop slightly below working ceiling so rounding does not brush the limit.\n const workingCeiling = Math.max(1, effectiveMax - Number(EULER_SAME_ASSET_BORROW_RATIO_STOP_EPS_BPS))\n\n targetBps = Math.min(targetBps, workingCeiling)\n\n const uoaFromBorrowWei = (w: bigint): bigint => {\n if (w <= 0n) return 0n\n return (w * oneBorrowUnitUoAWei) / unit\n }\n\n let C = uoaFromBorrowWei(C0wei)\n let D = 0n\n if (C <= 0n) return null\n\n const borrowWeis: bigint[] = []\n let liquidityLeft = maxNewBorrowWei\n const targetBn = BigInt(targetBps)\n const stopBn = targetBn - BigInt(Number(EULER_SAME_ASSET_BORROW_RATIO_STOP_EPS_BPS))\n const capBn = BigInt(effectiveMax)\n\n for (let i = 0; i < EULER_SAME_ASSET_BORROW_MAX_ROUNDS; i++) {\n if (C <= 0n) break\n const ratioBps = (D * 10000n) / C\n if (ratioBps >= stopBn) break\n\n const headroomUoa = (capBn * C) / 10000n - D\n if (headroomUoa <= 0n) break\n\n const den = 10000n - targetBn\n if (den <= 0n) break\n\n let bUoa = (targetBn * C - 10000n * D) / den\n if (bUoa <= 0n) break\n if (bUoa > headroomUoa) bUoa = headroomUoa\n\n let borrowWei = (bUoa * unit) / oneBorrowUnitUoAWei\n if (borrowWei <= 0n) break\n if (borrowWei > liquidityLeft) borrowWei = liquidityLeft\n if (borrowWei <= 0n) break\n\n const bUoaActual = uoaFromBorrowWei(borrowWei)\n borrowWeis.push(borrowWei)\n D += bUoaActual\n C += bUoaActual\n liquidityLeft -= borrowWei\n }\n\n if (borrowWeis.length === 0) return null\n\n const totalBorrowWei = borrowWeis.reduce((a, w) => a + w, 0n)\n const projectedFinalLtvBps = C > 0n ? (D * 10000n) / C : 0n\n return { borrowWeis, totalBorrowWei, projectedFinalLtvBps }\n}\n\n/** Total ERC-20 allowance target for collateral vault: deposits plus buffer. */\nexport function eulerSameAssetTotalCollateralPullWei(args: {\n initialCollateralWei: bigint\n loopBorrowWeis: readonly bigint[]\n}): bigint {\n let s = args.initialCollateralWei\n for (const w of args.loopBorrowWeis) s += w\n return s\n}\n\nexport function eulerSameAssetApproveAmountWithBuffer(args: { totalPullWei: bigint }): bigint {\n const extra = (args.totalPullWei * EULER_SAME_ASSET_BORROW_APPROVAL_BUFFER_BPS) / 10000n\n return args.totalPullWei + extra + 1n\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, purposeSuffix?: string): string {\n const t = purposeText.trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\n\nexport const EULER_V2_VAULT_WITHDRAW_FALLBACK_GAS = 900_000n\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\nconst erc20DecimalsAbi = parseAbi(['function decimals() view returns (uint8)'])\nconst erc4626AssetAbi = parseAbi(['function asset() view returns (address)'])\nconst erc4626MaxWithdrawAbi = parseAbi(['function maxWithdraw(address owner) view returns (uint256)'])\nconst erc4626WithdrawAbi = parseAbi([\n 'function withdraw(uint256 assets, address receiver, address owner) returns (uint256 shares)',\n])\n\nexport async function fetchEulerVaultUnderlyingMeta(args: {\n rpcUrl: string\n chainId: number\n evault: Address\n}): Promise<{ asset: Address; decimals: number }> {\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const assetAddrRaw = await publicClient.readContract({\n address: args.evault,\n abi: erc4626AssetAbi,\n functionName: 'asset',\n })\n const assetAddr = getAddress(assetAddrRaw)\n const d = await publicClient.readContract({\n address: assetAddr,\n abi: erc20DecimalsAbi,\n functionName: 'decimals',\n })\n const n = typeof d === 'bigint' ? Number(d) : Number(d)\n const decimals = !Number.isFinite(n) || n < 0 || n > 36 ? 18 : n\n return { asset: assetAddr, decimals }\n}\n\n/**\n * Some RPCs/indexers report too-low underlying `decimals` (~15) for WETH-class assets, inflating formatted amounts ~1000×.\n * Prefer wrapped-gas alias match, then Euler ETH-style vault labels, then raw chain `decimals`.\n */\nexport function clampEulerUnderlyingDecimalsForEulerUi(args: {\n fetchedDecimals: number\n underlyingAssetLower: string\n marketName: string\n underlyingSymbol: string\n wrappedGasAliasesLower: ReadonlySet<string>\n}): number {\n const a = args.underlyingAssetLower.trim().toLowerCase()\n let d = args.fetchedDecimals\n if (args.wrappedGasAliasesLower.has(a)) {\n return Math.max(d, 18)\n }\n if (d >= 18) return d\n const label = `${args.underlyingSymbol} ${args.marketName}`\n const ethish =\n /\\b(WETH|wstETH|stETH|rETH|weETH|eETH)\\b/i.test(label) ||\n /(^|[^A-Z0-9])ETH([^A-Z0-9]|$)/i.test(label)\n if (ethish) return 18\n return d\n}\n\nexport async function fetchEulerVaultAssetDecimals(args: {\n rpcUrl: string\n chainId: number\n evault: Address\n}): Promise<number> {\n const m = await fetchEulerVaultUnderlyingMeta(args)\n return m.decimals\n}\n\n/** Max underlying assets redeemable via `withdraw` for `owner` (ERC-4626 `maxWithdraw`). */\nexport async function fetchEulerVaultMaxWithdrawWei(args: {\n rpcUrl: string\n chainId: number\n evault: Address\n owner: Address\n}): Promise<bigint> {\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n return publicClient.readContract({\n address: args.evault,\n abi: erc4626MaxWithdrawAbi,\n functionName: 'maxWithdraw',\n args: [args.owner],\n })\n}\n\nconst eulerVaultSharesCashAbi = parseAbi([\n 'function balanceOf(address account) view returns (uint256)',\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function cash() view returns (uint256)',\n])\n\nasync function eulerDirectWithdrawSimulatesOk(args: {\n publicClient: ReturnType<typeof createPublicClient>\n evault: Address\n vaultShareOwner: Address\n receiver: Address\n txSender: Address\n assetsWei: bigint\n}): Promise<boolean> {\n const withdrawData = encodeFunctionData({\n abi: erc4626WithdrawAbi,\n functionName: 'withdraw',\n args: [args.assetsWei, args.receiver, args.vaultShareOwner],\n })\n try {\n await args.publicClient.call({\n account: args.txSender,\n to: args.evault,\n data: withdrawData,\n gas: 8_000_000n,\n })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Lend/Earn multisign redeems via direct `withdraw(assets, receiver, owner)`. When EVC/controller is enabled\n * on the vault share holder, Euler still returns ERC-4626 `maxWithdraw == 0` (vault pessimism — same mechanism\n * as borrow collateral). Simulate `withdraw` with the real multisign tx sender (`txSender`).\n */\nasync function eulerLendEarnEffectiveMaxWeiBySimulation(args: {\n rpcUrl: string\n chainId: number\n evault: Address\n vaultShareOwner: Address\n receiver: Address\n txSender: Address\n}): Promise<bigint> {\n const ch = defineChain({\n id: args.chainId,\n name: 'EulerLendRedeem',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n let shareBal: bigint\n let vaultCash: bigint\n try {\n ;[shareBal, vaultCash] = await Promise.all([\n publicClient.readContract({\n address: args.evault,\n abi: eulerVaultSharesCashAbi,\n functionName: 'balanceOf',\n args: [args.vaultShareOwner],\n }),\n publicClient.readContract({\n address: args.evault,\n abi: eulerVaultSharesCashAbi,\n functionName: 'cash',\n }),\n ])\n } catch {\n return 0n\n }\n if (shareBal === 0n) return 0n\n\n let assetsOwned: bigint\n try {\n assetsOwned = await publicClient.readContract({\n address: args.evault,\n abi: eulerVaultSharesCashAbi,\n functionName: 'convertToAssets',\n args: [shareBal],\n })\n } catch {\n return 0n\n }\n\n const hi =\n vaultCash <= 0n ? 0n : vaultCash <= assetsOwned ? vaultCash : assetsOwned\n if (hi === 0n) return 0n\n\n let lo = 0n\n let hiProbe = hi\n let best = 0n\n while (lo <= hiProbe) {\n const mid = lo + (hiProbe - lo) / 2n\n const ok = await eulerDirectWithdrawSimulatesOk({\n publicClient,\n evault: args.evault,\n vaultShareOwner: args.vaultShareOwner,\n receiver: args.receiver,\n txSender: args.txSender,\n assetsWei: mid,\n })\n if (ok) {\n best = mid\n lo = mid + 1n\n } else {\n hiProbe = mid - 1n\n }\n }\n return best\n}\n\n/** Use for LEND/EARN redeem UX + validation: merges ERC-4626 `maxWithdraw` with withdraw simulation when it is pessimistically zero. */\nexport async function fetchEulerLendEarnVaultEffectiveMaxWithdrawWei(args: {\n rpcUrl: string\n chainId: number\n evault: Address\n vaultShareOwner: Address\n /** Must match multisign redeem `receiver` and `executor` (key Ethereum address). */\n txSender: Address\n}): Promise<bigint> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) return 0n\n const evault = getAddress(args.evault)\n const vaultShareOwner = getAddress(args.vaultShareOwner)\n const txSender = getAddress(args.txSender)\n const receiver = txSender\n\n const std = await fetchEulerVaultMaxWithdrawWei({\n rpcUrl: rpc,\n chainId: args.chainId,\n evault,\n owner: vaultShareOwner,\n })\n if (std > 0n) return std\n\n return eulerLendEarnEffectiveMaxWeiBySimulation({\n rpcUrl: rpc,\n chainId: args.chainId,\n evault,\n vaultShareOwner,\n receiver,\n txSender,\n })\n}\n\n/**\n * Single ERC-4626 `withdraw(assets, receiver, owner)` on an Euler isolated eVault — no unwrap batch.\n */\nexport async function buildEvmMultisignBodyEulerV2VaultWithdraw(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n evault: Address\n /** Underlying asset amount (human decimal string); capped by `fetchEulerLendEarnVaultEffectiveMaxWithdrawWei`. */\n amountHuman: string\n /** Receiver of underlying (usually the key address). */\n owner: Address\n /** Address whose eVault shares are redeemed (ERC-4626 `owner`); defaults to `owner` when omitted. */\n vaultShareOwner?: Address\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const evault = getAddress(args.evault)\n const receiver = getAddress(args.owner)\n const shareOwner = getAddress(args.vaultShareOwner ?? args.owner)\n const executor = getAddress(args.executorAddress)\n const dec = await fetchEulerVaultAssetDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, evault })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Withdraw amount is zero after converting with token decimals.')\n\n const maxW = await fetchEulerLendEarnVaultEffectiveMaxWithdrawWei({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n evault,\n vaultShareOwner: shareOwner,\n txSender: executor,\n })\n if (amountWei > maxW) {\n throw new Error('Withdraw amount exceeds simulated max redeem for this vault (LTV / vault cash). Try a smaller amount.')\n }\n\n const withdrawData = encodeFunctionData({\n abi: erc4626WithdrawAbi,\n functionName: 'withdraw',\n args: [amountWei, receiver, shareOwner],\n })\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Euler vault'\n const purposeSuffix = `Euler v2: 1-tx — eVault.withdraw (${args.amountHuman} underlying) from isolated vault \"${vaultLabel}\" (ERC-4626).`\n\n const evmSteps: EvmTxStep[] = [\n {\n to: evault,\n data: withdrawData,\n value: 0n,\n fallbackGas: EULER_V2_VAULT_WITHDRAW_FALLBACK_GAS,\n },\n ]\n const firstDataNo0x = withdrawData.startsWith('0x') ? withdrawData.slice(2) : withdrawData\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: evault,\n buildBatchMeta: ({ gasLimit }) => ({\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'EVault.withdraw',\n function: 'withdraw(uint256 assets, address receiver, address owner)',\n evault,\n receiver,\n owner: shareOwner,\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'euler_v2_vault_withdraw', version: 1, chainId: String(args.chainId) },\n eulerV2: {\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n evault,\n owner: shareOwner,\n gasBuildWithdraw: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n}\n","import {\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n type Address,\n} from 'viem'\nimport { fetchEulerVaultMaxWithdrawWei } from './vaultWithdrawMultisign.js'\n\nconst erc4626WithdrawAbi = parseAbi([\n 'function withdraw(uint256 assets, address receiver, address owner) returns (uint256 shares)',\n])\nconst evcBatchAbi = parseAbi([\n 'function batch((address targetContract, address onBehalfOfAccount, uint256 value, bytes data)[])',\n])\n\nconst eulerCollateralVaultReadAbi = parseAbi([\n 'function balanceOf(address account) view returns (uint256)',\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function cash() view returns (uint256)',\n])\n\nasync function evcWithdrawSimulatesOk(args: {\n publicClient: ReturnType<typeof createPublicClient>\n evc: Address\n collateralVault: Address\n subAccount: Address\n caller: Address\n assetsWei: bigint\n}): Promise<boolean> {\n const withdrawData = encodeFunctionData({\n abi: erc4626WithdrawAbi,\n functionName: 'withdraw',\n args: [args.assetsWei, args.caller, args.subAccount],\n })\n const batchData = encodeFunctionData({\n abi: evcBatchAbi,\n functionName: 'batch',\n args: [\n [\n {\n targetContract: args.collateralVault,\n onBehalfOfAccount: args.subAccount,\n value: 0n,\n data: withdrawData as `0x${string}`,\n },\n ],\n ],\n })\n try {\n await args.publicClient.call({\n account: args.caller,\n to: args.evc,\n data: batchData,\n gas: 8_000_000n,\n })\n return true\n } catch {\n return false\n }\n}\n\n/**\n * Euler eVault intentionally returns ERC-4626 `maxWithdraw == 0` when the account has an EVC controller\n * (borrow sub-accounts always do — see euler-vault-kit `Vault.sol` / `maxRedeemInternal`).\n * Integrators must use other mechanisms; we binary-search withdraw amounts via `eth_call` on EVC.batch.\n */\nasync function collateralMaxWithdrawBySimulation(args: {\n rpcUrl: string\n chainId: number\n evc: Address\n collateralVault: Address\n subAccount: Address\n caller: Address\n}): Promise<bigint> {\n const ch = defineChain({\n id: args.chainId,\n name: 'EulerColMaxW',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n let shareBal: bigint\n let assetsOwned: bigint\n let vaultCash: bigint\n try {\n ;[shareBal, vaultCash] = await Promise.all([\n publicClient.readContract({\n address: args.collateralVault,\n abi: eulerCollateralVaultReadAbi,\n functionName: 'balanceOf',\n args: [args.subAccount],\n }),\n publicClient.readContract({\n address: args.collateralVault,\n abi: eulerCollateralVaultReadAbi,\n functionName: 'cash',\n }),\n ])\n } catch {\n return 0n\n }\n if (shareBal === 0n) return 0n\n\n try {\n assetsOwned = await publicClient.readContract({\n address: args.collateralVault,\n abi: eulerCollateralVaultReadAbi,\n functionName: 'convertToAssets',\n args: [shareBal],\n })\n } catch {\n return 0n\n }\n\n const hi =\n vaultCash <= 0n ? 0n : vaultCash <= assetsOwned ? vaultCash : assetsOwned\n if (hi === 0n) return 0n\n\n /** Monotonic: if withdrawing X succeeds, amounts ≤ X succeed (Euler health constraint). Max on [0, hi]. */\n let lo = 0n\n let hiProbe = hi\n let best = 0n\n while (lo <= hiProbe) {\n const mid = lo + (hiProbe - lo) / 2n\n const ok = await evcWithdrawSimulatesOk({\n publicClient,\n evc: args.evc,\n collateralVault: args.collateralVault,\n subAccount: args.subAccount,\n caller: args.caller,\n assetsWei: mid,\n })\n if (ok) {\n best = mid\n lo = mid + 1n\n } else {\n hiProbe = mid - 1n\n }\n }\n return best\n}\n\n/**\n * Maximum collateral underlying (asset wei) safely withdrawable for a borrow position’s collateral eVault,\n * matching how the app submits `EVC.batch` → `withdraw(assets, receiver, owner=subAccount)`.\n *\n * Prefer ERC-4626 `maxWithdraw` when non-zero (no controller shortcut). Otherwise simulate via RPC.\n */\nexport async function fetchEulerBorrowCollateralMaxWithdrawAssetsWei(args: {\n rpcUrl: string\n chainId: number\n evc: Address\n collateralVault: Address\n subAccount: Address\n /** Address that submits the multisign tx (must match multisign executor / receiver). */\n caller: Address\n}): Promise<bigint> {\n const rpcUrl = args.rpcUrl.trim()\n if (!rpcUrl) return 0n\n\n const evc = getAddress(args.evc)\n const collateralVault = getAddress(args.collateralVault)\n const subAccount = getAddress(args.subAccount)\n const caller = getAddress(args.caller)\n\n const stdMax = await fetchEulerVaultMaxWithdrawWei({\n rpcUrl,\n chainId: args.chainId,\n evault: collateralVault,\n owner: subAccount,\n })\n if (stdMax > 0n) return stdMax\n\n return collateralMaxWithdrawBySimulation({\n rpcUrl,\n chainId: args.chainId,\n evc,\n collateralVault,\n subAccount,\n caller,\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\n\n/** Conservative fallback when `estimateGas` fails on Euler eVault `deposit`. */\nexport const EULER_V2_ISOLATED_VAULT_DEPOSIT_FALLBACK_GAS = 950_000n\nconst EULER_VAULT_DEPOSIT_ESTIMATE_FALLBACK = EULER_V2_ISOLATED_VAULT_DEPOSIT_FALLBACK_GAS\nconst EULER_ERC20_APPROVE_FALLBACK = 100_000n\nconst EULER_WETH_DEPOSIT_FALLBACK = 120_000n\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\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\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)'])\nconst erc4626DepositAbi = parseAbi([\n 'function deposit(uint256 assets, address receiver) returns (uint256 shares)',\n])\n\ntype EulerBuildStep = {\n kind: 'weth_deposit' | 'approve' | 'vault_deposit'\n to: Address\n data: `0x${string}`\n value: bigint\n}\n\n/**\n * Euler v2 isolated lending: wrap native → WETH when needed, `approve(eVault, amount)` if required,\n * then `eVault.deposit(assets, receiver)` (ERC-4626).\n */\nexport async function buildEvmMultisignBodyEulerV2IsolatedLendDepositBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n /** Euler eVault (checksummed). */\n evault: Address\n /** Underlying ERC-20 passed to `deposit` (WETH when user chose native gas token row). */\n underlying: Address\n isNativeIn: boolean\n nativeWrapped: Address\n amountHuman: string\n receiver: Address\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const asset = getAddress(args.underlying)\n const evault = getAddress(args.evault)\n const weth = getAddress(args.nativeWrapped)\n const executor = getAddress(args.executorAddress)\n const receiver = getAddress(args.receiver)\n if (args.isNativeIn && asset.toLowerCase() !== weth.toLowerCase()) {\n throw new Error('Native lend path: underlying asset must match the chain wrapped native token.')\n }\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const dec = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const amountWei = parseUnits(args.amountHuman, Number(dec))\n if (amountWei === 0n) throw new Error('Amount is zero after converting with token decimals.')\n\n const steps: EulerBuildStep[] = []\n\n if (args.isNativeIn) {\n const dataDeposit = encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit', args: [] })\n steps.push({ kind: 'weth_deposit', to: weth, data: dataDeposit, value: amountWei })\n const wethAllowance = await publicClient.readContract({\n address: weth,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, evault],\n })\n if (wethAllowance < amountWei) {\n if (wethAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [evault, 0n],\n })\n steps.push({ kind: 'approve', to: weth, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [evault, amountWei],\n })\n steps.push({ kind: 'approve', to: weth, data: dataApprove, value: 0n })\n }\n } else {\n const currentAllowance = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, evault],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [evault, 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: [evault, amountWei],\n })\n steps.push({ kind: 'approve', to: asset, data: dataApprove, value: 0n })\n }\n }\n\n const depositData = encodeFunctionData({\n abi: erc4626DepositAbi,\n functionName: 'deposit',\n args: [amountWei, receiver],\n })\n steps.push({ kind: 'vault_deposit', to: evault, data: depositData, value: 0n })\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Euler vault'\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit'\n ? EULER_WETH_DEPOSIT_FALLBACK\n : s.kind === 'approve'\n ? EULER_ERC20_APPROVE_FALLBACK\n : EULER_VAULT_DEPOSIT_ESTIMATE_FALLBACK,\n }))\n\n const n = steps.length\n const hasWrap = args.isNativeIn\n const purposeSuffix = (() => {\n if (hasWrap) {\n return `Euler v2: ${n}-tx batch — wrap native to WETH (if needed), approve eVault for the exact amount, then ERC-4626 deposit into isolated vault \"${vaultLabel}\".`\n }\n if (n === 1) {\n return `Euler v2: 1-tx — eVault.deposit (allowance already sufficient) into \"${vaultLabel}\".`\n }\n return `Euler v2: ${n}-tx batch — approve eVault for the exact amount, then ERC-4626 deposit into \"${vaultLabel}\".`\n })()\n\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 buildBatchMeta: ({ index, gasLimit }) => {\n const s = steps[index]!\n if (s.kind === 'weth_deposit') {\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'WETH.deposit',\n function: 'deposit()',\n valueWei: amountWei.toString(),\n vaultMarket: vaultLabel,\n note: 'Wrap native for Euler v2 isolated vault deposit (same batch).',\n }),\n evm: { type: 'euler_v2_weth_deposit', version: 1, chainId: String(args.chainId) },\n eulerV2: {\n step: 'weth_deposit',\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n evault,\n underlying: asset,\n },\n }\n }\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'ERC20.approve',\n to: 'Euler eVault',\n function: 'approve(address spender, uint256 amount)',\n evault,\n amountHuman: args.amountHuman,\n note: 'Allowance for this deposit amount only (not unlimited).',\n }),\n evm: { type: 'euler_v2_erc20_approve', version: 1, chainId: String(args.chainId) },\n eulerV2: { vaultMarket: vaultLabel, amountHuman: args.amountHuman, evault, underlying: asset },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'EVault.deposit',\n function: 'deposit(uint256 assets, address receiver)',\n evault,\n underlying: asset,\n receiver,\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'euler_v2_vault_deposit', version: 1, chainId: String(args.chainId) },\n eulerV2: {\n vaultMarket: vaultLabel,\n amountHuman: args.amountHuman,\n evault,\n underlying: asset,\n receiver,\n gasBuildDeposit: { baseGasUnits: gasLimit.toString() },\n },\n }\n },\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n zeroAddress,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { eulerSameAssetApproveAmountWithBuffer, eulerSameAssetTotalCollateralPullWei } from './sameAssetBorrowLoop.js'\n\nconst EULER_BORROW_BATCH_FALLBACK_GAS = 2_500_000n\nconst EULER_BORROW_BATCH_FALLBACK_GAS_PER_ROUND = 350_000n\nconst EULER_ERC20_APPROVE_FALLBACK = 100_000n\nconst EULER_WETH_DEPOSIT_FALLBACK = 120_000n\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\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)'])\nconst erc4626DepositAbi = parseAbi([\n 'function deposit(uint256 assets, address receiver) returns (uint256 shares)',\n])\nconst evaultBorrowAbi = parseAbi(['function borrow(uint256 amount, address receiver) returns (uint256)'])\n\nconst evcAbi = parseAbi([\n 'function batch((address targetContract, address onBehalfOfAccount, uint256 value, bytes data)[])',\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\ntype EulerBorrowBuildStep = {\n kind: 'weth_deposit' | 'approve' | 'evc_batch'\n to: Address\n data: `0x${string}`\n value: bigint\n}\n\n/**\n * Collateral deposit + enable collateral + enable borrow controller + borrow, batched on EVC (after wrap/approve).\n * When {@link args.redepositBorrowedToCollateral} is true (borrow asset === collateral asset), each borrow is followed\n * by a collateral deposit of the same size inside the same EVC batch (leverage loop).\n */\nexport async function buildEvmMultisignBodyEulerV2IsolatedBorrowBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n evc: Address\n borrowVault: Address\n collateralVault: Address\n collateralUnderlying: Address\n borrowUnderlying: Address\n isNativeCollateralIn: boolean\n nativeWrapped: Address\n collateralAmountHuman: string\n borrowAmountHuman: string\n /** Each round: `borrow(amount)` then optional `deposit(amount)` when redepositing. */\n loopBorrowWeis: readonly bigint[]\n redepositBorrowedToCollateral: boolean\n receiver: Address\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const evc = getAddress(args.evc)\n const borrowVault = getAddress(args.borrowVault)\n const collateralVault = getAddress(args.collateralVault)\n const collateralAsset = getAddress(args.collateralUnderlying)\n const borrowAsset = getAddress(args.borrowUnderlying)\n const weth = getAddress(args.nativeWrapped)\n const executor = getAddress(args.executorAddress)\n const receiver = getAddress(args.receiver)\n\n if (args.isNativeCollateralIn && collateralAsset.toLowerCase() !== weth.toLowerCase()) {\n throw new Error('Native collateral path: collateral underlying must be the chain wrapped native token.')\n }\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const cDecRaw = await publicClient.readContract({\n address: collateralAsset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const collateralDecimals = Number(cDecRaw)\n const collateralWei = parseUnits(args.collateralAmountHuman, collateralDecimals)\n if (collateralWei === 0n) throw new Error('Collateral amount is zero after converting with token decimals.')\n\n await publicClient.readContract({\n address: borrowAsset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const loops = [...args.loopBorrowWeis]\n if (loops.length === 0) throw new Error('At least one borrow round is required.')\n for (const w of loops) {\n if (w <= 0n) throw new Error('Each borrow round must be positive.')\n }\n if (!args.redepositBorrowedToCollateral && loops.length !== 1) {\n throw new Error('Multiple borrow rounds require redepositBorrowedToCollateral (same borrow and collateral asset).')\n }\n const borrowWeiTotal = loops.reduce((a, w) => a + w, 0n)\n\n const totalPullWei = eulerSameAssetTotalCollateralPullWei({\n initialCollateralWei: collateralWei,\n loopBorrowWeis: args.redepositBorrowedToCollateral ? loops : [],\n })\n const approveTargetWei = eulerSameAssetApproveAmountWithBuffer({ totalPullWei })\n\n const steps: EulerBorrowBuildStep[] = []\n\n if (args.isNativeCollateralIn) {\n const dataDeposit = encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit', args: [] })\n steps.push({ kind: 'weth_deposit', to: weth, data: dataDeposit, value: collateralWei })\n const wethAllowance = await publicClient.readContract({\n address: weth,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, collateralVault],\n })\n if (wethAllowance < approveTargetWei) {\n if (wethAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [collateralVault, 0n],\n })\n steps.push({ kind: 'approve', to: weth, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [collateralVault, approveTargetWei],\n })\n steps.push({ kind: 'approve', to: weth, data: dataApprove, value: 0n })\n }\n } else {\n const currentAllowance = await publicClient.readContract({\n address: collateralAsset,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, collateralVault],\n })\n if (currentAllowance < approveTargetWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [collateralVault, 0n],\n })\n steps.push({ kind: 'approve', to: collateralAsset, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [collateralVault, approveTargetWei],\n })\n steps.push({ kind: 'approve', to: collateralAsset, data: dataApprove, value: 0n })\n }\n }\n\n const depositData = encodeFunctionData({\n abi: erc4626DepositAbi,\n functionName: 'deposit',\n args: [collateralWei, receiver],\n })\n const enableCollData = encodeFunctionData({\n abi: parseAbi(['function enableCollateral(address account, address vault)']),\n functionName: 'enableCollateral',\n args: [receiver, collateralVault],\n })\n const enableCtrlData = encodeFunctionData({\n abi: parseAbi(['function enableController(address account, address vault)']),\n functionName: 'enableController',\n args: [receiver, borrowVault],\n })\n type BatchLine = {\n targetContract: Address\n onBehalfOfAccount: Address\n value: bigint\n data: `0x${string}`\n }\n\n const batchItems: BatchLine[] = [\n { targetContract: collateralVault, onBehalfOfAccount: receiver, value: 0n, data: depositData as `0x${string}` },\n { targetContract: evc, onBehalfOfAccount: zeroAddress, value: 0n, data: enableCollData as `0x${string}` },\n { targetContract: evc, onBehalfOfAccount: zeroAddress, value: 0n, data: enableCtrlData as `0x${string}` },\n ]\n\n for (const bw of loops) {\n const borrowData = encodeFunctionData({\n abi: evaultBorrowAbi,\n functionName: 'borrow',\n args: [bw, receiver],\n })\n batchItems.push({\n targetContract: borrowVault,\n onBehalfOfAccount: receiver,\n value: 0n,\n data: borrowData as `0x${string}`,\n })\n if (args.redepositBorrowedToCollateral) {\n const redepositData = encodeFunctionData({\n abi: erc4626DepositAbi,\n functionName: 'deposit',\n args: [bw, receiver],\n })\n batchItems.push({\n targetContract: collateralVault,\n onBehalfOfAccount: receiver,\n value: 0n,\n data: redepositData as `0x${string}`,\n })\n }\n }\n\n const batchData = encodeFunctionData({\n abi: evcAbi,\n functionName: 'batch',\n args: [batchItems],\n })\n steps.push({ kind: 'evc_batch', to: evc, data: batchData, value: 0n })\n\n const borrowRoundsExtraGas =\n EULER_BORROW_BATCH_FALLBACK_GAS_PER_ROUND * BigInt(Math.max(0, loops.length - 1 + (args.redepositBorrowedToCollateral ? loops.length : 0)))\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Euler vault'\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit'\n ? EULER_WETH_DEPOSIT_FALLBACK\n : s.kind === 'approve'\n ? EULER_ERC20_APPROVE_FALLBACK\n : EULER_BORROW_BATCH_FALLBACK_GAS + borrowRoundsExtraGas,\n }))\n\n const n = steps.length\n const hasWrap = args.isNativeCollateralIn\n const purposeSuffix = (() => {\n const tail = args.redepositBorrowedToCollateral\n ? `deposit collateral, enableCollateral, enableController, then ${loops.length}× borrow+redeposit on \"${vaultLabel}\" (same-asset target LTV loop).`\n : `deposit collateral, enableCollateral, enableController, borrow from \"${vaultLabel}\".`\n if (hasWrap) {\n return `Euler v2: ${n}-tx batch — wrap native collateral (if needed), approve collateral eVault (buffered for all deposits), then EVC batch: ${tail}`\n }\n return `Euler v2: ${n}-tx batch — approve collateral (if needed) with buffer for all deposits, then EVC batch: ${tail}`\n })()\n\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 buildBatchMeta: ({ index }) => {\n const s = steps[index]!\n if (s.kind === 'weth_deposit') {\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'WETH.deposit',\n function: 'deposit()',\n valueWei: collateralWei.toString(),\n vaultMarket: vaultLabel,\n note: 'Wrap native for Euler v2 isolated borrow collateral (same batch as borrow flow).',\n }),\n evm: { type: 'euler_v2_weth_deposit', version: 1, chainId: String(args.chainId) },\n eulerV2: { step: 'weth_deposit', vaultMarket: vaultLabel, flow: 'borrow' },\n }\n }\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'ERC20.approve',\n to: 'Euler collateral eVault',\n function: 'approve(address spender, uint256 amount)',\n collateralVault,\n amountHuman: args.collateralAmountHuman,\n note: 'Allowance for initial and follow-on collateral deposits (buffered).',\n approveTotalWei: approveTargetWei.toString(),\n }),\n evm: { type: 'euler_v2_erc20_approve', version: 1, chainId: String(args.chainId) },\n eulerV2: { vaultMarket: vaultLabel, flow: 'borrow_collateral_approve' },\n }\n }\n const borrowNote = args.redepositBorrowedToCollateral\n ? `Same-asset leverage: ${loops.length} borrow→deposit round(s); total borrow wei ${borrowWeiTotal.toString()}.`\n : 'Deposit collateral, enableCollateral, enableController, borrow in one EVC batch.'\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'EVC.batch',\n function: 'batch(BatchItem[])',\n evc,\n borrowVault,\n collateralVault,\n collateralAmountHuman: args.collateralAmountHuman,\n borrowAmountHuman: args.borrowAmountHuman,\n vaultMarket: vaultLabel,\n loopBorrowRounds: loops.length,\n redepositBorrowedToCollateral: args.redepositBorrowedToCollateral,\n borrowWeiTotal: borrowWeiTotal.toString(),\n note: borrowNote,\n }),\n evm: { type: 'euler_v2_evc_borrow_batch', version: 1, chainId: String(args.chainId) },\n eulerV2: {\n flow: 'borrow_batch',\n vaultMarket: vaultLabel,\n borrowVault,\n collateralVault,\n collateralAmountHuman: args.collateralAmountHuman,\n borrowAmountHuman: args.borrowAmountHuman,\n loopBorrowRounds: loops.length,\n redepositBorrowedToCollateral: args.redepositBorrowedToCollateral,\n borrowWeiTotal: borrowWeiTotal.toString(),\n },\n }\n },\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n maxUint256,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\n\nconst EULER_REPAY_BATCH_FALLBACK = 1_200_000n\nconst EULER_ERC20_APPROVE_FALLBACK = 100_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)'])\nconst evaultRepayAbi = parseAbi(['function repay(uint256 amount, address receiver) returns (uint256)'])\nconst evcAbi = parseAbi([\n 'function batch((address targetContract, address onBehalfOfAccount, uint256 value, bytes data)[])',\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\ntype StepKind = 'approve' | 'evc_batch'\n\ntype EulerRepayStep = {\n kind: StepKind\n to: Address\n data: `0x${string}`\n value: bigint\n}\n\n/**\n * ERC-20 approve (if needed) + EVC batch with liability vault `repay` for `subAccount`’s debt.\n */\nexport async function buildEvmMultisignBodyEulerV2BorrowRepayBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n evc: Address\n borrowVault: Address\n borrowUnderlying: Address\n subAccount: Address\n /** Human decimal string; full repay when `repayAll` or amount ≥ on-chain debt. */\n amountHuman: string\n /** When true, encodes `repay(type(uint256).max, receiver)`. */\n repayAll: boolean\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const evc = getAddress(args.evc)\n const borrowVault = getAddress(args.borrowVault)\n const borrowAsset = getAddress(args.borrowUnderlying)\n const subAccount = getAddress(args.subAccount)\n const executor = getAddress(args.executorAddress)\n\n const ch = defineChain({\n id: args.chainId,\n name: 'EulerRepay',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const bDecRaw = await publicClient.readContract({\n address: borrowAsset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const borrowDecimals = Number(bDecRaw)\n\n const debtAbi = parseAbi(['function debtOf(address account) view returns (uint256)'])\n const owed = await publicClient.readContract({\n address: borrowVault,\n abi: debtAbi,\n functionName: 'debtOf',\n args: [subAccount],\n })\n\n let repayWei: bigint\n if (args.repayAll) {\n repayWei = maxUint256\n } else {\n repayWei = parseUnits(args.amountHuman, borrowDecimals)\n if (repayWei === 0n) throw new Error('Repay amount is zero after converting with token decimals.')\n if (repayWei > owed) {\n repayWei = owed\n }\n }\n\n const steps: EulerRepayStep[] = []\n\n const allowanceTarget = repayWei === maxUint256 ? owed : repayWei\n const currentAllowance = await publicClient.readContract({\n address: borrowAsset,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, borrowVault],\n })\n if (currentAllowance < allowanceTarget) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [borrowVault, 0n],\n })\n steps.push({ kind: 'approve', to: borrowAsset, data: dataReset, value: 0n })\n }\n const approveAmt = repayWei === maxUint256 ? maxUint256 : repayWei\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [borrowVault, approveAmt],\n })\n steps.push({ kind: 'approve', to: borrowAsset, data: dataApprove, value: 0n })\n }\n\n const repayData = encodeFunctionData({\n abi: evaultRepayAbi,\n functionName: 'repay',\n args: [repayWei, subAccount],\n })\n const batchItems = [\n { targetContract: borrowVault, onBehalfOfAccount: subAccount, value: 0n, data: repayData as `0x${string}` },\n ]\n const batchData = encodeFunctionData({\n abi: evcAbi,\n functionName: 'batch',\n args: [batchItems],\n })\n steps.push({ kind: 'evc_batch', to: evc, data: batchData, value: 0n })\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Euler vault'\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'approve' ? EULER_ERC20_APPROVE_FALLBACK : EULER_REPAY_BATCH_FALLBACK,\n }))\n const n = steps.length\n const purposeSuffix = `Euler v2: ${n}-tx batch — repay borrow on \"${vaultLabel}\" (approve if needed, then EVC repay).`\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 buildBatchMeta: ({ index }) => {\n const s = steps[index]!\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'ERC20.approve',\n function: 'approve(address spender, uint256 amount)',\n spender: borrowVault,\n borrowUnderlying: borrowAsset,\n note: 'Allow Euler liability vault to pull assets for repay.',\n }),\n evm: { type: 'euler_v2_erc20_approve', version: 1, chainId: String(args.chainId) },\n eulerV2: { vaultMarket: vaultLabel, flow: 'borrow_repay_approve' },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'EVC.batch',\n function: 'batch(BatchItem[]) — repay',\n evc,\n borrowVault,\n subAccount,\n amountHuman: args.repayAll ? 'max' : args.amountHuman,\n vaultMarket: vaultLabel,\n note: 'Repay borrow on Euler v2 liability vault via EVC.',\n }),\n evm: { type: 'euler_v2_borrow_repay_batch', version: 1, chainId: String(args.chainId) },\n eulerV2: {\n flow: 'borrow_repay',\n vaultMarket: vaultLabel,\n borrowVault,\n subAccount,\n repayAll: args.repayAll,\n amountHuman: args.amountHuman,\n },\n }\n },\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { fetchEulerVaultAssetDecimals } from './vaultWithdrawMultisign.js'\n\nconst EULER_COLLATERAL_DEPOSIT_BATCH_FALLBACK = 1_600_000n\nconst EULER_ERC20_APPROVE_FALLBACK = 100_000n\n\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\nconst erc4626DepositAbi = parseAbi([\n 'function deposit(uint256 assets, address receiver) returns (uint256 shares)',\n])\nconst evcAbi = parseAbi([\n 'function batch((address targetContract, address onBehalfOfAccount, uint256 value, bytes data)[])',\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\ntype StepKind = 'approve' | 'evc_batch'\n\ntype ColDepositStep = {\n kind: StepKind\n to: Address\n data: `0x${string}`\n value: bigint\n}\n\n/**\n * ERC-20 approve (if needed) + EVC batch: collateral eVault `deposit(assets, receiver=subAccount)` on behalf of the sub-account.\n * Uses the key EOA as token source (`executor` approves the collateral vault).\n */\nexport async function buildEvmMultisignBodyEulerV2BorrowCollateralDepositBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n evc: Address\n collateralVault: Address\n collateralUnderlying: Address\n subAccount: Address\n amountHuman: string\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const evc = getAddress(args.evc)\n const collateralVault = getAddress(args.collateralVault)\n const collateralAsset = getAddress(args.collateralUnderlying)\n const subAccount = getAddress(args.subAccount)\n const executor = getAddress(args.executorAddress)\n\n const ch = defineChain({\n id: args.chainId,\n name: 'EulerColDeposit',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const dec = await fetchEulerVaultAssetDecimals({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n evault: collateralVault,\n })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Deposit amount is zero after converting with token decimals.')\n\n const steps: ColDepositStep[] = []\n\n const currentAllowance = await publicClient.readContract({\n address: collateralAsset,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, collateralVault],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [collateralVault, 0n],\n })\n steps.push({ kind: 'approve', to: collateralAsset, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [collateralVault, amountWei],\n })\n steps.push({ kind: 'approve', to: collateralAsset, data: dataApprove, value: 0n })\n }\n\n const depositData = encodeFunctionData({\n abi: erc4626DepositAbi,\n functionName: 'deposit',\n args: [amountWei, subAccount],\n })\n const batchItems = [\n {\n targetContract: collateralVault,\n onBehalfOfAccount: subAccount,\n value: 0n,\n data: depositData as `0x${string}`,\n },\n ]\n const batchData = encodeFunctionData({\n abi: evcAbi,\n functionName: 'batch',\n args: [batchItems],\n })\n steps.push({ kind: 'evc_batch', to: evc, data: batchData, value: 0n })\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Euler vault'\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'approve' ? EULER_ERC20_APPROVE_FALLBACK : EULER_COLLATERAL_DEPOSIT_BATCH_FALLBACK,\n }))\n const n = steps.length\n const purposeSuffix = `Euler v2: ${n}-tx batch — deposit ${args.amountHuman} collateral into \"${vaultLabel}\" (approve if needed, then EVC deposit).`\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 buildBatchMeta: ({ index }) => {\n const s = steps[index]!\n if (s.kind === 'approve') {\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'ERC20.approve',\n function: 'approve(address spender, uint256 amount)',\n spender: collateralVault,\n collateralUnderlying: collateralAsset,\n note: 'Allow Euler collateral eVault to pull assets for collateral deposit.',\n }),\n evm: { type: 'euler_v2_erc20_approve', version: 1, chainId: String(args.chainId) },\n eulerV2: { vaultMarket: vaultLabel, flow: 'borrow_collateral_deposit_approve' },\n }\n }\n return {\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'EVC.batch',\n function: 'batch(BatchItem[]) — collateral deposit',\n evc,\n collateralVault,\n subAccount,\n amountHuman: args.amountHuman,\n vaultMarket: vaultLabel,\n note: 'Deposit collateral into Euler v2 collateral eVault via EVC (reduces LTV).',\n }),\n evm: { type: 'euler_v2_borrow_collateral_deposit_batch', version: 1, chainId: String(args.chainId) },\n eulerV2: {\n flow: 'borrow_collateral_deposit',\n vaultMarket: vaultLabel,\n collateralVault,\n subAccount,\n amountHuman: args.amountHuman,\n },\n }\n },\n })\n}\n","import {\n type Address,\n encodeFunctionData,\n getAddress,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { fetchEulerBorrowCollateralMaxWithdrawAssetsWei } from './borrowCollateralMaxWithdrawWei.js'\nimport { fetchEulerVaultAssetDecimals } from './vaultWithdrawMultisign.js'\n\nconst EULER_COLLATERAL_WITHDRAW_BATCH_FALLBACK = 1_400_000n\n\nconst erc4626WithdrawAbi = parseAbi([\n 'function withdraw(uint256 assets, address receiver, address owner) returns (uint256 shares)',\n])\nconst evcAbi = parseAbi([\n 'function batch((address targetContract, address onBehalfOfAccount, uint256 value, bytes data)[])',\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\ntype ColWithdrawStep = {\n kind: 'evc_batch'\n to: Address\n data: `0x${string}`\n value: bigint\n}\n\n/**\n * EVC batch: collateral eVault `withdraw(assets, receiver, owner=subAccount)` on behalf of the sub-account.\n * Amount is capped by `fetchEulerBorrowCollateralMaxWithdrawAssetsWei` (ERC-4626 `maxWithdraw` is 0 while EVC controls the account).\n */\nexport async function buildEvmMultisignBodyEulerV2BorrowCollateralWithdrawBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n evc: Address\n collateralVault: Address\n subAccount: Address\n /** Receives underlying collateral tokens (typically the key EOA). */\n receiver: Address\n amountHuman: string\n executorAddress: Address\n purposeText: string\n vaultMarketLabel: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const evc = getAddress(args.evc)\n const collateralVault = getAddress(args.collateralVault)\n const subAccount = getAddress(args.subAccount)\n const receiver = getAddress(args.receiver)\n const executor = getAddress(args.executorAddress)\n\n const dec = await fetchEulerVaultAssetDecimals({ rpcUrl: args.rpcUrl, chainId: args.chainId, evault: collateralVault })\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Withdraw amount is zero after converting with token decimals.')\n\n const maxW = await fetchEulerBorrowCollateralMaxWithdrawAssetsWei({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n evc,\n collateralVault,\n subAccount,\n caller: executor,\n })\n if (amountWei > maxW) {\n throw new Error(\n 'Withdraw amount exceeds simulated max for this collateral vault (LTV cap, vault cash, or health check). Try a smaller amount.',\n )\n }\n\n const withdrawData = encodeFunctionData({\n abi: erc4626WithdrawAbi,\n functionName: 'withdraw',\n args: [amountWei, receiver, subAccount],\n })\n const batchItems = [\n {\n targetContract: collateralVault,\n onBehalfOfAccount: subAccount,\n value: 0n,\n data: withdrawData as `0x${string}`,\n },\n ]\n const batchData = encodeFunctionData({\n abi: evcAbi,\n functionName: 'batch',\n args: [batchItems],\n })\n\n const steps: ColWithdrawStep[] = [{ kind: 'evc_batch', to: evc, data: batchData, value: 0n }]\n\n const vaultLabel = (args.vaultMarketLabel ?? '').trim() || 'Euler vault'\n const purposeSuffix = `Euler v2: 1-tx — withdraw ${args.amountHuman} collateral from \"${vaultLabel}\" via EVC (sub-account).`\n const firstDataNo0x = batchData.startsWith('0x') ? batchData.slice(2) : batchData\n const evmSteps: EvmTxStep[] = [\n { to: evc, data: batchData, value: 0n, fallbackGas: EULER_COLLATERAL_WITHDRAW_BATCH_FALLBACK },\n ]\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 buildBatchMeta: () => ({\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'EVC.batch',\n function: 'batch — collateral withdraw',\n evc,\n collateralVault,\n subAccount,\n receiver,\n amountHuman: args.amountHuman,\n vaultMarket: vaultLabel,\n note: 'Withdraw collateral from Euler v2 eVault via EVC (max from RPC simulate + LTV / vault cash).',\n }),\n evm: { type: 'euler_v2_borrow_collateral_withdraw_batch', version: 1, chainId: String(args.chainId) },\n eulerV2: {\n flow: 'borrow_collateral_withdraw',\n vaultMarket: vaultLabel,\n collateralVault,\n subAccount,\n receiver,\n amountHuman: args.amountHuman,\n },\n }),\n })\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\n\nexport * from './sameAssetBorrowLoop.js'\nexport * from './borrowCollateralMaxWithdrawWei.js'\nexport * from './vaultWithdrawMultisign.js'\nexport * from './isolatedLendMultisign.js'\nexport * from './isolatedBorrowMultisign.js'\nexport * from './borrowRepayMultisign.js'\nexport * from './borrowCollateralDepositMultisign.js'\nexport * from './borrowCollateralWithdrawMultisign.js'\n\nexport const EULER_V2_PROTOCOL_ID = 'euler-v2'\n\nexport const eulerV2ProtocolModule: ProtocolModule = {\n id: EULER_V2_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n return ctx.chainCategory === 'evm'\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'euler-v2.isolated-lend', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit into Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.isolated-borrow', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow from Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.vault-withdraw', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw from Euler vault', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.borrow-repay', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Euler borrow', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.collateral-deposit', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Deposit borrow collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'euler-v2.collateral-withdraw', protocolId: EULER_V2_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw borrow collateral', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(eulerV2ProtocolModule)\n"]}
|
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
import { b as KeyGenSubsetForPermit, e as ProtocolModule } from '../../../types-BfjWdw1j.js';
|
|
2
|
+
import { Address } from 'viem';
|
|
3
|
+
|
|
4
|
+
/** Stay below on-chain max borrow LTV when computing per-round headroom (basis points). */
|
|
5
|
+
declare const EULER_SAME_ASSET_BORROW_PROTOCOL_HEADROOM_BPS = 50n;
|
|
6
|
+
/** Extra allowance on total collateral deposits: `total * (1 + bps/10000)` plus one wei. */
|
|
7
|
+
declare const EULER_SAME_ASSET_BORROW_APPROVAL_BUFFER_BPS = 100n;
|
|
8
|
+
declare const EULER_SAME_ASSET_BORROW_MAX_ROUNDS = 48;
|
|
9
|
+
/** Stop iterating when current LTV is within this many bps of target (0.15%). */
|
|
10
|
+
declare const EULER_SAME_ASSET_BORROW_RATIO_STOP_EPS_BPS = 15n;
|
|
11
|
+
declare function eulerBorrowAndCollateralSameAsset(row: {
|
|
12
|
+
collateralAssetAddressLower?: string | null | undefined;
|
|
13
|
+
borrowAssetAddressLower?: string | null | undefined;
|
|
14
|
+
}): boolean;
|
|
15
|
+
/**
|
|
16
|
+
* Plan iterative borrow → re-deposit rounds so final debt/collateral (UoA) approaches `targetLtvBps`,
|
|
17
|
+
* without exceeding a capped max LTV (vault max minus protocol headroom). Same borrow/collateral asset only.
|
|
18
|
+
*/
|
|
19
|
+
declare function planSameAssetLeveragedBorrows(args: {
|
|
20
|
+
initialCollateralWei: bigint;
|
|
21
|
+
oneBorrowUnitUoAWei: bigint;
|
|
22
|
+
borrowDecimals: number;
|
|
23
|
+
targetLtvBps: number;
|
|
24
|
+
maxLtvBps: number;
|
|
25
|
+
maxNewBorrowWei: bigint;
|
|
26
|
+
}): {
|
|
27
|
+
borrowWeis: readonly bigint[];
|
|
28
|
+
totalBorrowWei: bigint;
|
|
29
|
+
projectedFinalLtvBps: bigint;
|
|
30
|
+
} | null;
|
|
31
|
+
/** Total ERC-20 allowance target for collateral vault: deposits plus buffer. */
|
|
32
|
+
declare function eulerSameAssetTotalCollateralPullWei(args: {
|
|
33
|
+
initialCollateralWei: bigint;
|
|
34
|
+
loopBorrowWeis: readonly bigint[];
|
|
35
|
+
}): bigint;
|
|
36
|
+
declare function eulerSameAssetApproveAmountWithBuffer(args: {
|
|
37
|
+
totalPullWei: bigint;
|
|
38
|
+
}): bigint;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Maximum collateral underlying (asset wei) safely withdrawable for a borrow position’s collateral eVault,
|
|
42
|
+
* matching how the app submits `EVC.batch` → `withdraw(assets, receiver, owner=subAccount)`.
|
|
43
|
+
*
|
|
44
|
+
* Prefer ERC-4626 `maxWithdraw` when non-zero (no controller shortcut). Otherwise simulate via RPC.
|
|
45
|
+
*/
|
|
46
|
+
declare function fetchEulerBorrowCollateralMaxWithdrawAssetsWei(args: {
|
|
47
|
+
rpcUrl: string;
|
|
48
|
+
chainId: number;
|
|
49
|
+
evc: Address;
|
|
50
|
+
collateralVault: Address;
|
|
51
|
+
subAccount: Address;
|
|
52
|
+
/** Address that submits the multisign tx (must match multisign executor / receiver). */
|
|
53
|
+
caller: Address;
|
|
54
|
+
}): Promise<bigint>;
|
|
55
|
+
|
|
56
|
+
declare const EULER_V2_VAULT_WITHDRAW_FALLBACK_GAS = 900000n;
|
|
57
|
+
type ChainRow$5 = {
|
|
58
|
+
legacy?: boolean;
|
|
59
|
+
gasLimit?: number;
|
|
60
|
+
gasMultiplier?: number;
|
|
61
|
+
gasPrice?: number;
|
|
62
|
+
baseFee?: number;
|
|
63
|
+
priorityFee?: number;
|
|
64
|
+
baseFeeMultiplier?: number;
|
|
65
|
+
};
|
|
66
|
+
declare function fetchEulerVaultUnderlyingMeta(args: {
|
|
67
|
+
rpcUrl: string;
|
|
68
|
+
chainId: number;
|
|
69
|
+
evault: Address;
|
|
70
|
+
}): Promise<{
|
|
71
|
+
asset: Address;
|
|
72
|
+
decimals: number;
|
|
73
|
+
}>;
|
|
74
|
+
/**
|
|
75
|
+
* Some RPCs/indexers report too-low underlying `decimals` (~15) for WETH-class assets, inflating formatted amounts ~1000×.
|
|
76
|
+
* Prefer wrapped-gas alias match, then Euler ETH-style vault labels, then raw chain `decimals`.
|
|
77
|
+
*/
|
|
78
|
+
declare function clampEulerUnderlyingDecimalsForEulerUi(args: {
|
|
79
|
+
fetchedDecimals: number;
|
|
80
|
+
underlyingAssetLower: string;
|
|
81
|
+
marketName: string;
|
|
82
|
+
underlyingSymbol: string;
|
|
83
|
+
wrappedGasAliasesLower: ReadonlySet<string>;
|
|
84
|
+
}): number;
|
|
85
|
+
declare function fetchEulerVaultAssetDecimals(args: {
|
|
86
|
+
rpcUrl: string;
|
|
87
|
+
chainId: number;
|
|
88
|
+
evault: Address;
|
|
89
|
+
}): Promise<number>;
|
|
90
|
+
/** Max underlying assets redeemable via `withdraw` for `owner` (ERC-4626 `maxWithdraw`). */
|
|
91
|
+
declare function fetchEulerVaultMaxWithdrawWei(args: {
|
|
92
|
+
rpcUrl: string;
|
|
93
|
+
chainId: number;
|
|
94
|
+
evault: Address;
|
|
95
|
+
owner: Address;
|
|
96
|
+
}): Promise<bigint>;
|
|
97
|
+
/** Use for LEND/EARN redeem UX + validation: merges ERC-4626 `maxWithdraw` with withdraw simulation when it is pessimistically zero. */
|
|
98
|
+
declare function fetchEulerLendEarnVaultEffectiveMaxWithdrawWei(args: {
|
|
99
|
+
rpcUrl: string;
|
|
100
|
+
chainId: number;
|
|
101
|
+
evault: Address;
|
|
102
|
+
vaultShareOwner: Address;
|
|
103
|
+
/** Must match multisign redeem `receiver` and `executor` (key Ethereum address). */
|
|
104
|
+
txSender: Address;
|
|
105
|
+
}): Promise<bigint>;
|
|
106
|
+
/**
|
|
107
|
+
* Single ERC-4626 `withdraw(assets, receiver, owner)` on an Euler isolated eVault — no unwrap batch.
|
|
108
|
+
*/
|
|
109
|
+
declare function buildEvmMultisignBodyEulerV2VaultWithdraw(args: {
|
|
110
|
+
keyGen: KeyGenSubsetForPermit;
|
|
111
|
+
chainId: number;
|
|
112
|
+
rpcUrl: string;
|
|
113
|
+
chainDetail: ChainRow$5;
|
|
114
|
+
useCustomGas: boolean;
|
|
115
|
+
customGasChainDetails?: Record<string, unknown> | null;
|
|
116
|
+
evault: Address;
|
|
117
|
+
/** Underlying asset amount (human decimal string); capped by `fetchEulerLendEarnVaultEffectiveMaxWithdrawWei`. */
|
|
118
|
+
amountHuman: string;
|
|
119
|
+
/** Receiver of underlying (usually the key address). */
|
|
120
|
+
owner: Address;
|
|
121
|
+
/** Address whose eVault shares are redeemed (ERC-4626 `owner`); defaults to `owner` when omitted. */
|
|
122
|
+
vaultShareOwner?: Address;
|
|
123
|
+
executorAddress: Address;
|
|
124
|
+
purposeText: string;
|
|
125
|
+
vaultMarketLabel: string;
|
|
126
|
+
}): Promise<{
|
|
127
|
+
bodyForSign: Record<string, unknown>;
|
|
128
|
+
messageToSign: string;
|
|
129
|
+
}>;
|
|
130
|
+
|
|
131
|
+
/** Conservative fallback when `estimateGas` fails on Euler eVault `deposit`. */
|
|
132
|
+
declare const EULER_V2_ISOLATED_VAULT_DEPOSIT_FALLBACK_GAS = 950000n;
|
|
133
|
+
type ChainRow$4 = {
|
|
134
|
+
legacy?: boolean;
|
|
135
|
+
gasLimit?: number;
|
|
136
|
+
gasMultiplier?: number;
|
|
137
|
+
gasPrice?: number;
|
|
138
|
+
baseFee?: number;
|
|
139
|
+
priorityFee?: number;
|
|
140
|
+
baseFeeMultiplier?: number;
|
|
141
|
+
};
|
|
142
|
+
/**
|
|
143
|
+
* Euler v2 isolated lending: wrap native → WETH when needed, `approve(eVault, amount)` if required,
|
|
144
|
+
* then `eVault.deposit(assets, receiver)` (ERC-4626).
|
|
145
|
+
*/
|
|
146
|
+
declare function buildEvmMultisignBodyEulerV2IsolatedLendDepositBatch(args: {
|
|
147
|
+
keyGen: KeyGenSubsetForPermit;
|
|
148
|
+
chainId: number;
|
|
149
|
+
rpcUrl: string;
|
|
150
|
+
chainDetail: ChainRow$4;
|
|
151
|
+
useCustomGas: boolean;
|
|
152
|
+
customGasChainDetails?: Record<string, unknown> | null;
|
|
153
|
+
/** Euler eVault (checksummed). */
|
|
154
|
+
evault: Address;
|
|
155
|
+
/** Underlying ERC-20 passed to `deposit` (WETH when user chose native gas token row). */
|
|
156
|
+
underlying: Address;
|
|
157
|
+
isNativeIn: boolean;
|
|
158
|
+
nativeWrapped: Address;
|
|
159
|
+
amountHuman: string;
|
|
160
|
+
receiver: Address;
|
|
161
|
+
executorAddress: Address;
|
|
162
|
+
purposeText: string;
|
|
163
|
+
vaultMarketLabel: string;
|
|
164
|
+
}): Promise<{
|
|
165
|
+
bodyForSign: Record<string, unknown>;
|
|
166
|
+
messageToSign: string;
|
|
167
|
+
}>;
|
|
168
|
+
|
|
169
|
+
type ChainRow$3 = {
|
|
170
|
+
legacy?: boolean;
|
|
171
|
+
gasLimit?: number;
|
|
172
|
+
gasMultiplier?: number;
|
|
173
|
+
gasPrice?: number;
|
|
174
|
+
baseFee?: number;
|
|
175
|
+
priorityFee?: number;
|
|
176
|
+
baseFeeMultiplier?: number;
|
|
177
|
+
};
|
|
178
|
+
/**
|
|
179
|
+
* Collateral deposit + enable collateral + enable borrow controller + borrow, batched on EVC (after wrap/approve).
|
|
180
|
+
* When {@link args.redepositBorrowedToCollateral} is true (borrow asset === collateral asset), each borrow is followed
|
|
181
|
+
* by a collateral deposit of the same size inside the same EVC batch (leverage loop).
|
|
182
|
+
*/
|
|
183
|
+
declare function buildEvmMultisignBodyEulerV2IsolatedBorrowBatch(args: {
|
|
184
|
+
keyGen: KeyGenSubsetForPermit;
|
|
185
|
+
chainId: number;
|
|
186
|
+
rpcUrl: string;
|
|
187
|
+
chainDetail: ChainRow$3;
|
|
188
|
+
useCustomGas: boolean;
|
|
189
|
+
customGasChainDetails?: Record<string, unknown> | null;
|
|
190
|
+
evc: Address;
|
|
191
|
+
borrowVault: Address;
|
|
192
|
+
collateralVault: Address;
|
|
193
|
+
collateralUnderlying: Address;
|
|
194
|
+
borrowUnderlying: Address;
|
|
195
|
+
isNativeCollateralIn: boolean;
|
|
196
|
+
nativeWrapped: Address;
|
|
197
|
+
collateralAmountHuman: string;
|
|
198
|
+
borrowAmountHuman: string;
|
|
199
|
+
/** Each round: `borrow(amount)` then optional `deposit(amount)` when redepositing. */
|
|
200
|
+
loopBorrowWeis: readonly bigint[];
|
|
201
|
+
redepositBorrowedToCollateral: boolean;
|
|
202
|
+
receiver: Address;
|
|
203
|
+
executorAddress: Address;
|
|
204
|
+
purposeText: string;
|
|
205
|
+
vaultMarketLabel: string;
|
|
206
|
+
}): Promise<{
|
|
207
|
+
bodyForSign: Record<string, unknown>;
|
|
208
|
+
messageToSign: string;
|
|
209
|
+
}>;
|
|
210
|
+
|
|
211
|
+
type ChainRow$2 = {
|
|
212
|
+
legacy?: boolean;
|
|
213
|
+
gasLimit?: number;
|
|
214
|
+
gasMultiplier?: number;
|
|
215
|
+
gasPrice?: number;
|
|
216
|
+
baseFee?: number;
|
|
217
|
+
priorityFee?: number;
|
|
218
|
+
baseFeeMultiplier?: number;
|
|
219
|
+
};
|
|
220
|
+
/**
|
|
221
|
+
* ERC-20 approve (if needed) + EVC batch with liability vault `repay` for `subAccount`’s debt.
|
|
222
|
+
*/
|
|
223
|
+
declare function buildEvmMultisignBodyEulerV2BorrowRepayBatch(args: {
|
|
224
|
+
keyGen: KeyGenSubsetForPermit;
|
|
225
|
+
chainId: number;
|
|
226
|
+
rpcUrl: string;
|
|
227
|
+
chainDetail: ChainRow$2;
|
|
228
|
+
useCustomGas: boolean;
|
|
229
|
+
customGasChainDetails?: Record<string, unknown> | null;
|
|
230
|
+
evc: Address;
|
|
231
|
+
borrowVault: Address;
|
|
232
|
+
borrowUnderlying: Address;
|
|
233
|
+
subAccount: Address;
|
|
234
|
+
/** Human decimal string; full repay when `repayAll` or amount ≥ on-chain debt. */
|
|
235
|
+
amountHuman: string;
|
|
236
|
+
/** When true, encodes `repay(type(uint256).max, receiver)`. */
|
|
237
|
+
repayAll: boolean;
|
|
238
|
+
executorAddress: Address;
|
|
239
|
+
purposeText: string;
|
|
240
|
+
vaultMarketLabel: string;
|
|
241
|
+
}): Promise<{
|
|
242
|
+
bodyForSign: Record<string, unknown>;
|
|
243
|
+
messageToSign: string;
|
|
244
|
+
}>;
|
|
245
|
+
|
|
246
|
+
type ChainRow$1 = {
|
|
247
|
+
legacy?: boolean;
|
|
248
|
+
gasLimit?: number;
|
|
249
|
+
gasMultiplier?: number;
|
|
250
|
+
gasPrice?: number;
|
|
251
|
+
baseFee?: number;
|
|
252
|
+
priorityFee?: number;
|
|
253
|
+
baseFeeMultiplier?: number;
|
|
254
|
+
};
|
|
255
|
+
/**
|
|
256
|
+
* ERC-20 approve (if needed) + EVC batch: collateral eVault `deposit(assets, receiver=subAccount)` on behalf of the sub-account.
|
|
257
|
+
* Uses the key EOA as token source (`executor` approves the collateral vault).
|
|
258
|
+
*/
|
|
259
|
+
declare function buildEvmMultisignBodyEulerV2BorrowCollateralDepositBatch(args: {
|
|
260
|
+
keyGen: KeyGenSubsetForPermit;
|
|
261
|
+
chainId: number;
|
|
262
|
+
rpcUrl: string;
|
|
263
|
+
chainDetail: ChainRow$1;
|
|
264
|
+
useCustomGas: boolean;
|
|
265
|
+
customGasChainDetails?: Record<string, unknown> | null;
|
|
266
|
+
evc: Address;
|
|
267
|
+
collateralVault: Address;
|
|
268
|
+
collateralUnderlying: Address;
|
|
269
|
+
subAccount: Address;
|
|
270
|
+
amountHuman: string;
|
|
271
|
+
executorAddress: Address;
|
|
272
|
+
purposeText: string;
|
|
273
|
+
vaultMarketLabel: string;
|
|
274
|
+
}): Promise<{
|
|
275
|
+
bodyForSign: Record<string, unknown>;
|
|
276
|
+
messageToSign: string;
|
|
277
|
+
}>;
|
|
278
|
+
|
|
279
|
+
type ChainRow = {
|
|
280
|
+
legacy?: boolean;
|
|
281
|
+
gasLimit?: number;
|
|
282
|
+
gasMultiplier?: number;
|
|
283
|
+
gasPrice?: number;
|
|
284
|
+
baseFee?: number;
|
|
285
|
+
priorityFee?: number;
|
|
286
|
+
baseFeeMultiplier?: number;
|
|
287
|
+
};
|
|
288
|
+
/**
|
|
289
|
+
* EVC batch: collateral eVault `withdraw(assets, receiver, owner=subAccount)` on behalf of the sub-account.
|
|
290
|
+
* Amount is capped by `fetchEulerBorrowCollateralMaxWithdrawAssetsWei` (ERC-4626 `maxWithdraw` is 0 while EVC controls the account).
|
|
291
|
+
*/
|
|
292
|
+
declare function buildEvmMultisignBodyEulerV2BorrowCollateralWithdrawBatch(args: {
|
|
293
|
+
keyGen: KeyGenSubsetForPermit;
|
|
294
|
+
chainId: number;
|
|
295
|
+
rpcUrl: string;
|
|
296
|
+
chainDetail: ChainRow;
|
|
297
|
+
useCustomGas: boolean;
|
|
298
|
+
customGasChainDetails?: Record<string, unknown> | null;
|
|
299
|
+
evc: Address;
|
|
300
|
+
collateralVault: Address;
|
|
301
|
+
subAccount: Address;
|
|
302
|
+
/** Receives underlying collateral tokens (typically the key EOA). */
|
|
303
|
+
receiver: Address;
|
|
304
|
+
amountHuman: string;
|
|
305
|
+
executorAddress: Address;
|
|
306
|
+
purposeText: string;
|
|
307
|
+
vaultMarketLabel: string;
|
|
308
|
+
}): Promise<{
|
|
309
|
+
bodyForSign: Record<string, unknown>;
|
|
310
|
+
messageToSign: string;
|
|
311
|
+
}>;
|
|
312
|
+
|
|
313
|
+
declare const EULER_V2_PROTOCOL_ID = "euler-v2";
|
|
314
|
+
declare const eulerV2ProtocolModule: ProtocolModule;
|
|
315
|
+
|
|
316
|
+
export { EULER_SAME_ASSET_BORROW_APPROVAL_BUFFER_BPS, EULER_SAME_ASSET_BORROW_MAX_ROUNDS, EULER_SAME_ASSET_BORROW_PROTOCOL_HEADROOM_BPS, EULER_SAME_ASSET_BORROW_RATIO_STOP_EPS_BPS, EULER_V2_ISOLATED_VAULT_DEPOSIT_FALLBACK_GAS, EULER_V2_PROTOCOL_ID, EULER_V2_VAULT_WITHDRAW_FALLBACK_GAS, buildEvmMultisignBodyEulerV2BorrowCollateralDepositBatch, buildEvmMultisignBodyEulerV2BorrowCollateralWithdrawBatch, buildEvmMultisignBodyEulerV2BorrowRepayBatch, buildEvmMultisignBodyEulerV2IsolatedBorrowBatch, buildEvmMultisignBodyEulerV2IsolatedLendDepositBatch, buildEvmMultisignBodyEulerV2VaultWithdraw, clampEulerUnderlyingDecimalsForEulerUi, eulerBorrowAndCollateralSameAsset, eulerSameAssetApproveAmountWithBuffer, eulerSameAssetTotalCollateralPullWei, eulerV2ProtocolModule, fetchEulerBorrowCollateralMaxWithdrawAssetsWei, fetchEulerLendEarnVaultEffectiveMaxWithdrawWei, fetchEulerVaultAssetDecimals, fetchEulerVaultMaxWithdrawWei, fetchEulerVaultUnderlyingMeta, planSameAssetLeveragedBorrows };
|