@continuumdao/ctm-mpc-defi 0.2.13 → 0.2.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/catalog.cjs +1149 -287
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +1655 -306
- package/dist/agent/catalog.js +1144 -288
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/_shared/multisign-mcp-gas.md +7 -4
- package/dist/agent/skills/circle-cctp/SKILL.md +63 -0
- package/dist/chains/evm/index.cjs +75 -0
- package/dist/chains/evm/index.cjs.map +1 -1
- package/dist/chains/evm/index.d.ts +31 -1
- package/dist/chains/evm/index.js +73 -2
- package/dist/chains/evm/index.js.map +1 -1
- package/dist/index.cjs +140 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +138 -34
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.cjs +1067 -0
- package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -0
- package/dist/protocols/evm/circle-cctp/index.d.ts +281 -0
- package/dist/protocols/evm/circle-cctp/index.js +1026 -0
- package/dist/protocols/evm/circle-cctp/index.js.map +1 -0
- package/dist/protocols/evm/euler-v2/index.cjs +29 -2
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.d.ts +23 -1
- package/dist/protocols/evm/euler-v2/index.js +29 -3
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/gmx/index.cjs +42 -8
- package/dist/protocols/evm/gmx/index.cjs.map +1 -1
- package/dist/protocols/evm/gmx/index.d.ts +20 -4
- package/dist/protocols/evm/gmx/index.js +42 -9
- package/dist/protocols/evm/gmx/index.js.map +1 -1
- package/dist/protocols/evm/maple/index.cjs +9 -1
- package/dist/protocols/evm/maple/index.cjs.map +1 -1
- package/dist/protocols/evm/maple/index.d.ts +2 -1
- package/dist/protocols/evm/maple/index.js +9 -1
- package/dist/protocols/evm/maple/index.js.map +1 -1
- package/dist/protocols/evm/morpho/index.cjs +56 -0
- package/dist/protocols/evm/morpho/index.cjs.map +1 -1
- package/dist/protocols/evm/morpho/index.d.ts +28 -1
- package/dist/protocols/evm/morpho/index.js +56 -1
- package/dist/protocols/evm/morpho/index.js.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.cjs +98 -26
- package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.js +99 -27
- package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
- package/package.json +6 -1
|
@@ -1 +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/core/defiProxy.ts","../../../../src/protocols/evm/aave-v4/api.ts","../../../../src/protocols/evm/euler-v2/eulerV2VaultCapsOnChain.ts","../../../../src/protocols/evm/euler-v2/eulerV2Subgraph.ts","../../../../src/protocols/evm/euler-v2/eulerLabelsProducts.ts","../../../../src/protocols/evm/euler-v2/eulerV2LendMarkets.ts","../../../../src/protocols/evm/euler-v2/eulerV2EarnMarkets.ts","../../../../src/protocols/evm/euler-v2/eulerV2BorrowRiskOnChain.ts","../../../../src/protocols/evm/euler-v2/eulerV2BorrowPositionsLoad.ts","../../../../src/protocols/evm/euler-v2/eulerV2LendSupplyPositionsLoad.ts","../../../../src/protocols/evm/euler-v2/eulerReulVestingOnChain.ts","../../../../src/chains/evm/coingecko.ts","../../../../src/protocols/evm/euler-v2/eulerV2PortfolioUsd.ts","../../../../src/protocols/evm/euler-v2/loadEulerV2SupportedChainIds.ts","../../../../src/protocols/evm/euler-v2/index.ts"],"names":["publicClient","getAddress","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","http","erc4626WithdrawAbi","parseAbi","encodeFunctionData","parseUnits","EULER_ERC20_APPROVE_FALLBACK","EULER_WETH_DEPOSIT_FALLBACK","wethDepositAbi","erc20AllowanceAbi","erc20ApproveAbi","erc4626DepositAbi","evcAbi","r","isAddress","formatUnits","UINT256_MAX","checksumHex","erc20DecimalsAbi","erc4626MaxWithdrawAbi","metaClient","VAULTS_FOR_EVAULTS","vaultSupplyAbi","debtOfAbi","readSupplyUnderlyingWei"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","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 | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\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","/**\n * Optional browser → Next.js API proxy paths for DeFi upstream calls.\n * Set once from continuumdao-node-app client bootstrap.\n */\n\nlet aaveGraphqlProxyUrl: string | undefined\nlet eulerGraphqlProxyUrl: string | undefined\nlet mapleGraphqlProxyUrl: string | undefined\nlet morphoGraphqlProxyUrl: string | undefined\nlet coingeckoProxyUrl: string | undefined\n\nexport function setAaveGraphqlProxyUrl(url: string | undefined): void {\n aaveGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getAaveGraphqlProxyUrl(): string | undefined {\n return aaveGraphqlProxyUrl\n}\n\nexport function setEulerGraphqlProxyUrl(url: string | undefined): void {\n eulerGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getEulerGraphqlProxyUrl(): string | undefined {\n return eulerGraphqlProxyUrl\n}\n\nexport function setMapleGraphqlProxyUrl(url: string | undefined): void {\n mapleGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMapleGraphqlProxyUrl(): string | undefined {\n return mapleGraphqlProxyUrl\n}\n\nexport function setMorphoGraphqlProxyUrl(url: string | undefined): void {\n morphoGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoGraphqlProxyUrl(): string | undefined {\n return morphoGraphqlProxyUrl\n}\n\nexport function setCoingeckoProxyUrl(url: string | undefined): void {\n coingeckoProxyUrl = url?.trim() || undefined\n}\n\nexport function getCoingeckoProxyUrl(): string | undefined {\n return coingeckoProxyUrl\n}\n\nexport async function postJsonViaOptionalProxy<T>(args: {\n directUrl: string\n body: unknown\n proxyUrl?: string\n proxyEnvelope?: unknown\n}): Promise<T> {\n const proxy = args.proxyUrl?.trim()\n if (proxy) {\n const r = await fetch(proxy, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.proxyEnvelope ?? args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `Proxy HTTP ${r.status}: ${t.slice(0, 200)}` : `Proxy HTTP ${r.status}`)\n }\n return (await r.json()) as T\n }\n const r = await fetch(args.directUrl, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `HTTP ${r.status}: ${t.slice(0, 200)}` : `HTTP ${r.status}`)\n }\n return (await r.json()) as T\n}\n","import { getAddress, isAddress } from 'viem'\nimport { getAaveGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\n\nexport const AAVE_V4_GRAPHQL_URL = 'https://api.v4.aave.com/graphql'\n\ntype GqlError = { message?: string }\n\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nexport async function aaveV4Gql<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n const body = { query, variables: variables ?? {} }\n const j = await postJsonViaOptionalProxy<GqlData<T> & { errors?: GqlError[] }>({\n directUrl: AAVE_V4_GRAPHQL_URL,\n body,\n proxyUrl: getAaveGraphqlProxyUrl(),\n proxyEnvelope: body,\n })\n if (j.errors?.length) {\n const msg = j.errors.map((e) => e.message ?? 'Unknown').join('; ')\n throw new Error(msg)\n }\n if (j.data == null) {\n throw new Error('Aave V4 API: empty response')\n }\n return j.data\n}\n\ntype ChainRowV4 = { chainId: number; name?: string | null; nativeWrappedToken?: string | null }\n\nexport async function fetchAaveV4Chains(): Promise<readonly ChainRowV4[]> {\n const d = await aaveV4Gql<{ chains: ChainRowV4[] }>(`\n query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }\n `, { c: { query: { filter: 'ALL' } } })\n return d.chains ?? []\n}\n\n/**\n * Aave v4: supported EVM chain IDs (from {@link fetchAaveV4Chains}).\n */\nexport async function loadAaveV4SupportedChainIdsFromV4Api(): Promise<ReadonlySet<number>> {\n const rows = await fetchAaveV4Chains()\n const s = new Set<number>()\n for (const c of rows) s.add(c.chainId)\n return s\n}\n\nconst RESERVES_ADDRESS_FRAGMENT = `\n asset { underlying { address } }\n`\n\nexport type V4ReservesListRow = {\n id: string\n onChainId?: string | null\n spoke?: {\n address: string\n name?: string | null\n liquidationConfig?: { targetHealthFactor: string; healthFactorForMaxBonus: string } | null\n } | null\n summary: {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n }\n userState: {\n balance: { amount: { value: string; decimals: number } } | null\n borrowable?: { amount: { value: string; decimals: number } } | null\n } | null\n}\n\nexport function aggregateV4SupplyDisplay(\n symbolForDisplay: string,\n rows: readonly V4ReservesListRow[],\n): {\n depositedAmount: string\n apy: string\n totalDeposits: string\n availableLiquidity: string\n} {\n const sym = (symbolForDisplay ?? '').trim()\n const withSuffix = (n: string) => (n === '—' ? '—' : sym ? `${n} ${sym}` : n)\n\n if (!rows.length) {\n return { depositedAmount: '—', apy: '—', totalDeposits: '—', availableLiquidity: '—' }\n }\n\n const apy = formatV4SupplyApy(rows)\n\n const sumKey = (key: 'supplied' | 'borrowed') =>\n sumNumberValues(\n rows.map((r) => {\n const v = key === 'supplied' ? r.summary?.supplied?.amount : r.summary?.borrowed?.amount\n return (v?.value ?? '').trim()\n }),\n )\n\n const totalSupN = sumKey('supplied')\n const totalBorN = sumKey('borrowed')\n const totalDeposits =\n totalSupN == null ? '—' : withSuffix(formatAaveV4TokenAmount(totalSupN))\n\n const availableLiquidity = (() => {\n if (totalSupN == null || totalBorN == null) return '—'\n const a = totalSupN - totalBorN\n if (!Number.isFinite(a)) return '—'\n return withSuffix(formatAaveV4TokenAmount(a < 0 ? 0 : a))\n })()\n\n const userN = userSupplyBalanceNumber(rows)\n const depositedAmount = userN == null ? '—' : withSuffix(formatAaveV4TokenAmount(userN))\n\n return { depositedAmount, apy, totalDeposits, availableLiquidity }\n}\n\nfunction sumNumberValues(values: ReadonlyArray<string>): number | null {\n if (!values.length) return null\n let s = 0\n for (const v of values) {\n const n = parseFloat(v)\n if (Number.isFinite(n)) s += n\n }\n return s\n}\n\n/**\n * Formats a token notional for display: uses k (≥1k) and M (≥1M) with a few decimal places, otherwise limited decimals.\n * Safe to reuse outside the Aave V4 dialog (e.g. tables, tooltips).\n */\nexport function formatAaveV4TokenAmount(n: number): string {\n if (!Number.isFinite(n)) return '—'\n if (n === 0) return '0'\n const sign = n < 0 ? '-' : ''\n const a = Math.abs(n)\n const strip = (s: string) => s.replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, '')\n\n if (a >= 1_000_000) {\n return sign + strip((a / 1_000_000).toFixed(2)) + 'M'\n }\n if (a >= 1000) {\n const k = a / 1000\n const d = k >= 100 ? 1 : 2\n return sign + strip(k.toFixed(d)) + 'k'\n }\n if (a >= 1) {\n return sign + strip(a.toFixed(2))\n }\n if (a >= 0.0001) {\n return sign + strip(a.toFixed(4))\n }\n return sign + a.toExponential(2)\n}\n\n/**\n * Human-readable notional for Aave v4 API decimal strings (reserve amounts, user debt, etc.).\n * Use this for all “display from GraphQL `value`” paths so formatting stays consistent.\n */\nexport function formatAaveV4AmountHumanFromApiString(raw: string | null | undefined): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = parseFloat(s)\n if (!Number.isFinite(n)) return '—'\n return formatAaveV4TokenAmount(n)\n}\n\n/**\n * Unnamed reserve liquidity: supplied − borrowed (both API decimal strings, same unit).\n */\nexport function formatAaveV4ReserveLiquidityFromSummary(args: {\n suppliedValue: string | null | undefined\n borrowedValue: string | null | undefined\n}): string {\n const a = parseFloat(String(args.suppliedValue ?? '').trim())\n const b = parseFloat(String(args.borrowedValue ?? '').trim())\n if (!Number.isFinite(a) || !Number.isFinite(b)) return '—'\n return formatAaveV4TokenAmount(Math.max(0, a - b))\n}\n\nfunction userSupplyBalanceNumber(rows: readonly V4ReservesListRow[]): number | null {\n const vals = rows\n .map((r) => (r.userState?.balance?.amount?.value ?? '').trim())\n .filter((v) => v.length > 0)\n if (!vals.length) return null\n const u = new Set(vals)\n if (u.size === 1) {\n const n = parseFloat(vals[0]!)\n return Number.isFinite(n) ? n : null\n }\n const sum = vals.reduce((acc, b) => acc + (parseFloat(b) || 0), 0)\n return Number.isFinite(sum) ? sum : null\n}\n\nfunction formatV4SupplyApy(rows: readonly V4ReservesListRow[]): string {\n if (!rows.length) return '—'\n const weighted: { w: number; apy: number }[] = []\n for (const r of rows) {\n const sup = parseFloat((r.summary?.supplied?.amount?.value ?? '').trim())\n const norm = (r.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(norm)\n if (Number.isFinite(n) && Number.isFinite(sup) && sup > 0) {\n weighted.push({ w: sup, apy: n })\n }\n }\n if (weighted.length) {\n const tw = weighted.reduce((a, x) => a + x.w, 0)\n if (tw > 0) {\n const x = weighted.reduce((a, x) => a + x.w * x.apy, 0) / tw\n if (x >= 0.01) return `${x.toFixed(2)}%`\n if (x > 0) return `${x.toFixed(4)}%`\n return '0%'\n }\n }\n const any = (rows[0]?.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(any)\n if (!Number.isFinite(n)) return '—'\n if (n >= 0.01) return `${n.toFixed(2)}%`\n if (n > 0) return `${n.toFixed(4)}%`\n return '0%'\n}\n\nexport async function fetchAaveV4NativeWrappedToken(chainId: number): Promise<string | null> {\n const all = await fetchAaveV4Chains()\n const c = all.find((x) => x.chainId === chainId)\n const t = (c?.nativeWrappedToken ?? '').trim()\n if (t && isAddress(t)) return getAddress(t)\n return null\n}\n\n/**\n * All underlying token addresses (lowercased checksummed form for lookup: store lowercase) listed as reserves on the chain.\n */\nexport async function fetchAaveV4SupportedUnderlyingAddressSet(chainId: number): Promise<ReadonlySet<string>> {\n const d = await aaveV4Gql<{\n reserves: ReadonlyArray<{ asset: { underlying: { address: string } } }>\n }>(\n `\n query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }\n `,\n {\n r: {\n query: { chainIds: [chainId] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n const s = new Set<string>()\n for (const r of d.reserves ?? []) {\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (a && isAddress(a)) s.add(a.toLowerCase())\n }\n return s\n}\n\nfunction erc20Input(address: `0x${string}`, chainId: number) {\n return { address, chainId }\n}\n\nexport async function fetchAaveV4ReservesForUnderlying(args: {\n chainId: number\n underlying: `0x${string}`\n user?: `0x${string}` | null\n}): Promise<readonly V4ReservesListRow[]> {\n const d = await aaveV4Gql<{ reserves: V4ReservesListRow[] }>(\n `\n query S($r: ReservesRequest!) {\n reserves(request: $r) {\n id\n onChainId\n spoke { address name liquidationConfig { targetHealthFactor healthFactorForMaxBonus } }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n }\n userState {\n balance { amount { value decimals } }\n borrowable { amount { value decimals } }\n }\n }\n }\n `,\n {\n r: {\n query: { tokens: [erc20Input(args.underlying, args.chainId)] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n ...(args.user ? { user: args.user } : {}),\n },\n },\n )\n return d.reserves ?? []\n}\n\n/**\n * Reserve row for a hub asset on the same Aave v4 **Spoke** as the user’s collateral (same as {@link useAaveV4DepositCollateralInfo}’s `collateralForAsset`).\n * Needed so borrow/repay multi-sign uses the same spoke as the user’s position.\n */\nexport function pickAaveV4ReserveRowForSpoke(\n rows: readonly V4ReservesListRow[],\n spokeAddress: `0x${string}`,\n): V4ReservesListRow | null {\n const want = getAddress(spokeAddress).toLowerCase()\n for (const r of rows) {\n const a = (r.spoke?.address ?? '').trim()\n if (!a) continue\n try {\n if (getAddress(a as `0x${string}`).toLowerCase() === want) return r\n } catch {\n continue\n }\n }\n return null\n}\n\nexport function aaveV4KeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n\ntype AaveV4ChainTokenCache = {\n supportedUnderlying: ReadonlySet<string>\n nativeWrapped: string | null\n}\n\nconst aaveV4ChainTokenCache = new Map<number, Promise<AaveV4ChainTokenCache>>()\n\n/**\n * Fetches and caches (per process) the list of Aave v4 underlying addresses on a chain and the wrapped native token.\n */\nexport function ensureAaveV4ChainTokenCache(chainId: number): Promise<AaveV4ChainTokenCache> {\n const hit = aaveV4ChainTokenCache.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const [nativeWrapped, supportedUnderlying] = await Promise.all([\n fetchAaveV4NativeWrappedToken(chainId),\n fetchAaveV4SupportedUnderlyingAddressSet(chainId),\n ])\n return { supportedUnderlying, nativeWrapped }\n })()\n aaveV4ChainTokenCache.set(chainId, p)\n return p\n}\n\n// —— Hubs, collateral, borrowable (per UI “market” / Aave v4 pool) ——————————————\n\n/** UI market segment; maps to Aave v4 `Hub` by name (e.g. Plus ≈ “Main”, Core, Prime ≈ “Bluechip”). */\nexport type AaveV4UiMarketId = 'main' | 'core' | 'bluechip'\n\nexport type AaveV4Hub = {\n name: string\n address: `0x${string}`\n chain: { chainId: number; name?: string | null }\n}\n\n/** `summary` is included for hub `reserves` (market borrow/supply TVL, APYs). */\nexport type AaveV4HubReserveSummary = {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n borrowApy: { normalized: string; value: string }\n}\n\nexport type AaveV4HubReserve = {\n canBorrow: boolean\n canUseAsCollateral: boolean\n canSupply: boolean\n /** Spoke contract to call for `supply` on this reserve. */\n spoke: { address: string } | null\n settings: {\n borrowable: boolean\n collateral: boolean\n collateralFactor: { normalized: string; value: string }\n collateralRisk: { normalized: string; value: string }\n }\n asset: {\n underlying: {\n address: string\n info: { name: string; symbol: string; icon: string | null } | null\n }\n }\n /** Present when using the extended hub reserves query (borrow tab, market TVL). */\n summary?: AaveV4HubReserveSummary | null\n}\n\nconst aaveV4HubsByChain = new Map<number, Promise<readonly AaveV4Hub[]>>()\nconst aaveV4HubReserves = new Map<string, Promise<readonly AaveV4HubReserve[]>>()\n\nfunction hubReservesKey(chainId: number, hub: `0x${string}`) {\n return `v3spoke+summary:${chainId}:${hub.toLowerCase()}`\n}\n\nexport async function fetchAaveV4HubsForChain(chainId: number): Promise<readonly AaveV4Hub[]> {\n const hit = aaveV4HubsByChain.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ hubs: AaveV4Hub[] }>(\n `query F($h: HubsRequest!) { hubs(request: $h) { name address chain { chainId name } } }`,\n { h: { query: { chainIds: [chainId] } } },\n )\n const out = (d.hubs ?? []).map((h) => ({\n name: h.name,\n address: getAddress((h.address ?? '').trim() as `0x${string}`) as `0x${string}`,\n chain: h.chain,\n }))\n return out\n })()\n aaveV4HubsByChain.set(chainId, p)\n return p\n}\n\n/**\n * Resolves which Aave v4 hub (Core / Plus / Prime, etc.) a UI “market” refers to.\n * Main → Plus, Core → Core, Bluechip → Prime.\n */\nexport function resolveAaveV4HubForUiMarket(\n hubs: readonly AaveV4Hub[],\n market: AaveV4UiMarketId,\n chainId: number,\n): AaveV4Hub | null {\n const on = hubs.filter((h) => h.chain.chainId === chainId)\n if (!on.length) return null\n const find = (names: string[]) => {\n const set = new Set(names.map((n) => n.toLowerCase()))\n return on.find((h) => set.has((h.name ?? '').trim().toLowerCase())) ?? null\n }\n if (market === 'core') return find(['core'])\n if (market === 'bluechip') return find(['prime', 'bluechip', 'institutional'])\n // main: prefer Plus; fall back to common names, then first hub\n return find(['plus', 'main', 'default']) ?? on[0] ?? null\n}\n\n/**\n * Inverse of {@link resolveAaveV4HubForUiMarket} label mapping, for switching UI market when a hub is chosen by\n * “first hub on chain that lists this underlying”.\n */\nexport function aaveV4UiMarketIdForHubName(hubName: string): AaveV4UiMarketId {\n const n = (hubName ?? '').trim().toLowerCase()\n if (n === 'core') return 'core'\n if (n === 'plus' || n === 'main' || n === 'default') return 'main'\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 'bluechip'\n return 'main'\n}\n\n/**\n * When more than one hub lists the same underlying, the ideal hub is the one that matches the user’s *actual*\n * position (supply/debt on that hub’s Spoke). We don’t have that signal here, so we use a **deterministic** order after\n * {@link aaveV4UiMarketIdForHubName}: Core → Main/Plus → Bluechip/Prime (then name) so the choice is not tied to\n * GraphQL list order. Callers with wallet/user data can later prefer a hub whose Spoke appears in\n * `fetchAaveV4ReservesForUnderlying` with non-zero `userState`.\n */\nfunction aaveV4HubAutoPickTiebreakOrder(a: AaveV4Hub, b: AaveV4Hub): number {\n const rank = (name: string) => {\n const n = (name ?? '').trim().toLowerCase()\n if (n === 'core') return 0\n if (n === 'plus' || n === 'main' || n === 'default') return 1\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 2\n return 3\n }\n const ra = rank(a.name)\n const rb = rank(b.name)\n if (ra !== rb) return ra - rb\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n}\n\ntype AaveV4HubCollateralCandidate = {\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n}\n\n/**\n * Sort key for “which borrow is cheaper” on a **debt** reserve row. Lower is better; missing data sorts last.\n */\nfunction aaveV4HubReserveBorrowApyForSort(r: AaveV4HubReserve | null | undefined): number {\n if (!r) return Number.POSITIVE_INFINITY\n const norm = parseFloat((r.summary?.borrowApy?.normalized ?? '').trim())\n if (Number.isFinite(norm) && norm >= 0) return norm\n const v = parseFloat((r.summary?.borrowApy?.value ?? '').trim())\n if (Number.isFinite(v) && v >= 0) {\n if (v > 0 && v <= 1) return v * 100\n return v\n }\n return Number.POSITIVE_INFINITY\n}\n\n/**\n * `summary.suppliable` on a reserve is pool liquidity for borrowing that asset (human-notional, same units as\n * {@link formatAaveV4AmountHumanFromApiString}).\n */\nfunction aaveV4SuppliableHumanFromHubReserve(r: AaveV4HubReserve | null | undefined): number | null {\n if (!r) return null\n const n = parseFloat((r.summary?.suppliable?.amount?.value ?? '').trim())\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\n/**\n * The selected UI market maps to a single hub, but a token may only be listed in another hub (e.g. WETH in Core, not\n * Plus on Ethereum). Returns a hub on this chain where this underlying appears in hub reserves, so Spoke and\n * collateral can be resolved.\n *\n * **When no debt hint:** `preferHub` is tried first, then other hubs in {@link aaveV4HubAutoPickTiebreakOrder} order.\n *\n * **When `debtUnderlying` is set (user chose a debt asset on the borrow flow):** among hubs that list **both** the\n * **collateral** and that **debt** as borrowable, the hub with the **lowest debt borrow APY** is chosen. If\n * `debtBorrowAmountHumanForLiquidity` is a positive number string, we **prefer** hubs where `suppliable` on the debt\n * reserve is at least that amount; if none satisfy that, the lowest-APY hub among all debt-backed candidates is\n * used anyway.\n */\nexport async function findAaveV4HubReserveForChainUnderlying(args: {\n chainId: number\n hubs: readonly AaveV4Hub[]\n underlying: `0x${string}`\n /** Tried first; if the asset is not listed here, other hubs on the same chain are scanned. */\n preferHub: AaveV4Hub\n /** If set, disambiguate using this debt asset’s `borrowAPY` (and optional liquidity) per hub. */\n debtUnderlying?: `0x${string}` | null\n /**\n * When set, used with `debtUnderlying` to prefer hubs with enough `suppliable` on the debt line for a borrow\n * of that size (human amount; commas may be included).\n */\n debtBorrowAmountHumanForLiquidity?: string | null\n}): Promise<{\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n} | null> {\n const onChain = args.hubs.filter((h) => h.chain.chainId === args.chainId)\n if (!onChain.length) return null\n const prefer = getAddress(args.preferHub.address) as `0x${string}`\n const order = (() => {\n const rest = onChain\n .filter((h) => getAddress(h.address) !== prefer)\n .sort(aaveV4HubAutoPickTiebreakOrder)\n const first = onChain.find((h) => getAddress(h.address) === prefer)\n return first ? [first, ...rest] : rest\n })()\n\n const candidates: AaveV4HubCollateralCandidate[] = []\n for (const h of order) {\n const rows = await fetchAaveV4HubReserves({ chainId: args.chainId, hubAddress: h.address as `0x${string}` })\n const c = findHubReserveForUnderlying(rows, args.underlying)\n if (c) candidates.push({ hub: h, hubReserves: rows, reserve: c })\n }\n if (!candidates.length) return null\n\n const noDebt = (): AaveV4HubCollateralCandidate => candidates[0]!\n\n const rawDebt = (args.debtUnderlying ?? '').trim()\n if (!rawDebt || !isAddress(rawDebt)) {\n return noDebt()\n }\n const debtU = getAddress(rawDebt) as `0x${string}`\n\n const withDebt = candidates\n .map((c) => {\n const dr = findHubReserveForUnderlying(c.hubReserves, debtU)\n return { ...c, debtReserve: dr }\n })\n .filter(\n (x): x is AaveV4HubCollateralCandidate & { debtReserve: AaveV4HubReserve } =>\n x.debtReserve != null &&\n x.debtReserve.canBorrow === true &&\n x.debtReserve.settings?.borrowable === true,\n )\n if (!withDebt.length) {\n return noDebt()\n }\n\n const amountRaw = (args.debtBorrowAmountHumanForLiquidity ?? '')\n .trim()\n .replace(/,/g, '')\n const wantN = amountRaw && parseFloat(amountRaw) > 0 ? parseFloat(amountRaw) : null\n\n const sortKey = (a: (typeof withDebt)[0], b: (typeof withDebt)[0]): number => {\n const d = aaveV4HubReserveBorrowApyForSort(a.debtReserve) - aaveV4HubReserveBorrowApyForSort(b.debtReserve)\n if (d !== 0) return d\n const pa = getAddress(a.hub.address) === prefer ? 0 : 1\n const pb = getAddress(b.hub.address) === prefer ? 0 : 1\n if (pa !== pb) return pa - pb\n return aaveV4HubAutoPickTiebreakOrder(a.hub, b.hub)\n }\n\n if (wantN == null) {\n withDebt.sort(sortKey)\n const x = withDebt[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n }\n\n const sufficient = withDebt.filter((c) => {\n const s = aaveV4SuppliableHumanFromHubReserve(c.debtReserve)\n return s != null && s + 1e-9 >= wantN\n })\n const pool = sufficient.length ? sufficient : withDebt\n pool.sort(sortKey)\n const x = pool[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n}\n\nexport async function fetchAaveV4HubReserves(args: { chainId: number; hubAddress: `0x${string}` }): Promise<readonly AaveV4HubReserve[]> {\n const h = getAddress(args.hubAddress) as `0x${string}`\n const k = hubReservesKey(args.chainId, h)\n const hit = aaveV4HubReserves.get(k)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ reserves: AaveV4HubReserve[] }>(\n `query R($r: ReservesRequest!) {\n reserves(request: $r) {\n canBorrow\n canSupply\n canUseAsCollateral\n spoke { address }\n settings {\n borrowable\n collateral\n collateralFactor { normalized value }\n collateralRisk { normalized value }\n }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n borrowApy { normalized value }\n }\n asset { underlying { address info { name symbol icon } } }\n }\n }`,\n {\n r: {\n query: { hub: { address: h, chainId: args.chainId } },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n return d.reserves ?? []\n })()\n aaveV4HubReserves.set(k, p)\n return p\n}\n\n/**\n * LTV you can borrow against a unit of this asset, e.g. \"90%\".\n */\nexport function formatAaveV4PercentDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = (normalized ?? '').trim()\n if (n) {\n const f = parseFloat(n)\n if (!Number.isFinite(f)) return '—'\n if (f === 0) return '—'\n if (f % 1 === 0) return `${f.toFixed(0)}%`\n return `${f >= 10 ? f.toFixed(0) : f >= 1 ? f.toFixed(1).replace(/\\.0$/, '') : f.toFixed(2).replace(/\\.?0+$/, '')}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${Math.round(v * 100)}%`\n }\n return '—'\n}\n\n/**\n * Collateral / protocol risk on the same 0–100 style scale as the API, or a plain label if zero/empty.\n */\nexport function formatAaveV4RiskDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = parseFloat((normalized ?? '').trim())\n if (Number.isFinite(n) && n > 0) {\n return n >= 0.01 ? `${n.toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%` : `${n.toFixed(4)}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${(v * 100).toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%`\n }\n return 'Low'\n}\n\nexport function findHubReserveForUnderlying(\n list: readonly AaveV4HubReserve[],\n underlying: `0x${string}`,\n): AaveV4HubReserve | null {\n const t = getAddress(underlying).toLowerCase()\n return list.find((r) => (r.asset?.underlying?.address ?? '').toLowerCase() === t) ?? null\n}\n\nexport type AaveV4BorrowableDisplay = {\n address: string\n symbol: string\n name: string\n icon: string | null\n}\n\n/**\n * De-duplicated borrowable debt assets in a hub (what users can borrow there).\n */\nexport function borrowableAssetsFromHubReserves(rows: readonly AaveV4HubReserve[]): AaveV4BorrowableDisplay[] {\n const seen = new Set<string>()\n const out: AaveV4BorrowableDisplay[] = []\n for (const r of rows) {\n if (!r.canBorrow || !r.settings?.borrowable) continue\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (!a || !isAddress(a)) continue\n const lo = a.toLowerCase()\n if (seen.has(lo)) continue\n seen.add(lo)\n const info = r.asset?.underlying?.info\n out.push({\n address: getAddress(a as `0x${string}`),\n symbol: (info?.symbol ?? '—').trim() || '—',\n name: (info?.name ?? '').trim() || '—',\n icon: (info?.icon ?? '').trim() || null,\n })\n }\n out.sort((p, q) => p.symbol.localeCompare(q.symbol, undefined, { sensitivity: 'base' }))\n return out\n}\n\nconst USER_BORROWS_HUB = `\n query AaveV4UserBorrowsHub($r: UserBorrowsRequest!) {\n userBorrows(request: $r) {\n debt { amount { value } }\n reserve {\n asset { underlying { address } }\n }\n }\n }\n`\n\n/**\n * Current variable-debt balance per underlying token for this user in the given hub (one entry per asset).\n * Values are API decimal strings; format with {@link formatAaveV4AmountHumanFromApiString}.\n */\nexport async function fetchAaveV4UserBorrowsDebtByUnderlyingForHub(args: {\n user: `0x${string}`\n chainId: number\n hubAddress: `0x${string}`\n}): Promise<ReadonlyMap<string, string>> {\n const u = getAddress(args.user)\n const h = getAddress(args.hubAddress) as `0x${string}`\n const d = await aaveV4Gql<{\n userBorrows: {\n debt: { amount: { value: string } } | null\n reserve: { asset: { underlying: { address: string } } } | null\n }[]\n }>(USER_BORROWS_HUB, {\n r: {\n query: {\n userHub: {\n user: u,\n hub: { input: { address: h, chainId: args.chainId } },\n },\n },\n orderBy: { amount: 'DESC' },\n includeZeroBalances: false,\n },\n })\n const m = new Map<string, string>()\n for (const row of d.userBorrows ?? []) {\n const addr = (row?.reserve?.asset?.underlying?.address ?? '').trim()\n if (!addr) continue\n const lo = getAddress(addr as `0x${string}`).toLowerCase()\n const v = (row?.debt?.amount?.value ?? '').trim()\n if (!v) continue\n const n = parseFloat(v)\n if (!Number.isFinite(n) || n === 0) continue\n const prev = m.get(lo)\n if (prev) {\n const p = parseFloat(prev)\n m.set(lo, String((Number.isFinite(p) ? p : 0) + n))\n } else {\n m.set(lo, v)\n }\n }\n return m\n}\n\nexport type AaveV4BorrowTableRow = {\n address: string\n symbol: string\n name: string\n icon: string | null\n yourBorrowedDisplay: string\n baseBorrowApyDisplay: string\n totalBorrowsDisplay: string\n liquidityDisplay: string\n}\n\n/**\n * One row per borrowable asset in the hub, using shared human-readable formatters.\n */\nexport function buildAaveV4BorrowTableRowsFromHub(\n borrowable: readonly AaveV4BorrowableDisplay[],\n hubReserves: readonly AaveV4HubReserve[] | null,\n /** `undefined` = not loaded or no wallet (show em dash for “your” column). */\n debtByUnderlying: ReadonlyMap<string, string> | undefined,\n): AaveV4BorrowTableRow[] {\n if (!hubReserves?.length) {\n return borrowable.map((b) => ({\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: debtByUnderlying === undefined ? '—' : `0${b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''}`,\n baseBorrowApyDisplay: '—',\n totalBorrowsDisplay: '—',\n liquidityDisplay: '—',\n }))\n }\n return borrowable.map((b) => {\n const lo = b.address.toLowerCase()\n const r = hubReserves.find((x) => (x.asset?.underlying?.address ?? '').toLowerCase() === lo) ?? null\n const s = r?.summary\n const debtRaw = debtByUnderlying?.get(lo) ?? null\n const symSuffix = b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''\n return {\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: (() => {\n if (debtByUnderlying === undefined) return '—'\n if (debtRaw == null || !String(debtRaw).trim()) return `0${symSuffix}`\n const n = parseFloat(String(debtRaw).trim())\n if (!Number.isFinite(n) || n === 0) return `0${symSuffix}`\n return `${formatAaveV4AmountHumanFromApiString(debtRaw)}${symSuffix}`\n })(),\n baseBorrowApyDisplay: formatAaveV4PercentDisplay(\n s?.borrowApy?.normalized,\n s?.borrowApy?.value,\n ),\n totalBorrowsDisplay: s\n ? `${formatAaveV4AmountHumanFromApiString(s.borrowed?.amount?.value)}${symSuffix}`\n : '—',\n liquidityDisplay: s\n ? `${formatAaveV4ReserveLiquidityFromSummary({\n suppliedValue: s.supplied?.amount?.value,\n borrowedValue: s.borrowed?.amount?.value,\n })}${symSuffix}`\n : '—',\n }\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n parseAbi,\n} from 'viem'\n\n/** Resolved cap when EVK `AmountCap` raw word is 0 (“not set”). */\nexport const EULER_EVAULT_CAP_UNLIMITED_WEI = (1n << 256n) - 1n\n\nconst UINT256_MAX = EULER_EVAULT_CAP_UNLIMITED_WEI\n\n/** @deprecated Use {@link EULER_EVAULT_CAP_UNLIMITED_WEI}. */\nexport const EULER_EVAULT_SUPPLY_CAP_UNLIMITED_WEI = EULER_EVAULT_CAP_UNLIMITED_WEI\n\n/**\n * When `true`, {@link fetchEulerVaultOnChainLendMetricsForVaults} drives Lend/Borrow vault gates and UI fields.\n * When `false`, the app uses Goldsky subgraph `eulerVaults` caps and `state` (cash / totalBorrows) instead.\n */\nexport const EULER_V2_PREFER_ON_CHAIN_LEND_METRICS = false\n\nconst eulerVaultLendAbi = parseAbi([\n 'function caps() view returns (uint16 supplyCap, uint16 borrowCap)',\n 'function cash() view returns (uint256)',\n 'function totalBorrows() view returns (uint256)',\n 'function totalAssets() view returns (uint256)',\n])\n\n/**\n * EVK `AmountCap`: raw uint16 0 ⇒ “not set” ⇒ unlimited ({@link UINT256_MAX} wei).\n * See `AmountCapLib.resolve` in euler-vault-kit.\n */\nexport function resolveEulerAmountCapToWei(rawCap16: number | bigint): bigint {\n const amountCap = BigInt(rawCap16) & 0xffffn\n if (amountCap === 0n) return UINT256_MAX\n const exp = amountCap & 63n\n const mantissa = amountCap >> 6n\n return (10n ** exp * mantissa) / 100n\n}\n\n/** @deprecated Use {@link resolveEulerAmountCapToWei}. */\nexport const resolveEulerAmountCapToSupplyWei = resolveEulerAmountCapToWei\n\n/**\n * Goldsky `eulerVaults.supplyCap` / `borrowCap` are the **uint16 AmountCap** words from `caps()`,\n * not resolved underlying wei. Values ≤ `0xffff` must use {@link resolveEulerAmountCapToWei}.\n * Larger values are treated as already-resolved wei.\n */\nexport function eulerSubgraphVaultCapToUnderlyingWei(raw: string | undefined | null): bigint {\n try {\n const v = BigInt((raw ?? '').trim() || '0')\n if (v >= UINT256_MAX - 3n) return v\n if (v <= 0xffffn) return resolveEulerAmountCapToWei(v)\n return v\n } catch {\n return 0n\n }\n}\n\nexport type EulerVaultOnChainLendMetrics = {\n rawSupplyCap16: number\n rawBorrowCap16: number\n supplyCapWei: bigint\n borrowCapWei: bigint\n /** Idle underlying in the vault (matches subgraph `state.cash`). */\n cashWei: bigint\n totalBorrowsWei: bigint\n /** ERC-4626 total assets; used with {@link supplyCapWei} for max new supply. */\n totalAssetsWei: bigint\n}\n\n/**\n * Subgraph caps + `state` fields shaped like {@link fetchEulerVaultOnChainLendMetrics}.\n * Uses `cashWei + totalBorrowsWei` for {@link totalAssetsWei} (same decomposition as the EVK balance sheet the indexer tracks).\n */\nexport function eulerVaultLendMetricsFromIndexerVaultState(args: {\n supplyCapRaw: string | null | undefined\n borrowCapRaw: string | null | undefined\n cashWei: bigint\n totalBorrowsWei: bigint\n totalAssetsWei: bigint\n}): EulerVaultOnChainLendMetrics {\n let rawSupplyCap16 = 0\n let rawBorrowCap16 = 0\n try {\n rawSupplyCap16 = Number(BigInt((args.supplyCapRaw ?? '').trim() || '0') & 0xffffn)\n } catch {\n rawSupplyCap16 = 0\n }\n try {\n rawBorrowCap16 = Number(BigInt((args.borrowCapRaw ?? '').trim() || '0') & 0xffffn)\n } catch {\n rawBorrowCap16 = 0\n }\n return {\n rawSupplyCap16,\n rawBorrowCap16,\n supplyCapWei: eulerSubgraphVaultCapToUnderlyingWei(args.supplyCapRaw),\n borrowCapWei: eulerSubgraphVaultCapToUnderlyingWei(args.borrowCapRaw),\n cashWei: args.cashWei,\n totalBorrowsWei: args.totalBorrowsWei,\n totalAssetsWei: args.totalAssetsWei,\n }\n}\n\nexport function formatEulerResolvedCapOrCashForUi(wei: bigint, decimals: number, symbolSuffix: string): string {\n if (wei >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return 'Unlimited'\n if (wei === 0n) return symbolSuffix ? `0 ${symbolSuffix}` : '0'\n try {\n const s = formatUnits(wei, decimals)\n const n = Number(s)\n if (Number.isFinite(n) && Math.abs(n) >= 1e9) return `${n.toExponential(2)}${symbolSuffix ? ` ${symbolSuffix}` : ''}`\n return symbolSuffix ? `${s} ${symbolSuffix}` : s\n } catch {\n return wei.toString()\n }\n}\n\n/** Max new supply (deposit) wei: headroom under resolved supply cap using on-chain `totalAssets`. */\nexport function eulerVaultMaxNewSupplyWei(metrics: EulerVaultOnChainLendMetrics): bigint {\n const { supplyCapWei, totalAssetsWei } = metrics\n if (supplyCapWei === 0n) return 0n\n if (supplyCapWei >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return EULER_EVAULT_CAP_UNLIMITED_WEI\n if (totalAssetsWei >= supplyCapWei) return 0n\n return supplyCapWei - totalAssetsWei\n}\n\n/** Upper bound for a new borrow: min(cash, borrowCap − totalBorrows) when the borrow cap is finite; `borrowCapWei === 0` disables borrowing. */\nexport function eulerVaultMaxNewBorrowWei(metrics: EulerVaultOnChainLendMetrics): bigint {\n const { cashWei, borrowCapWei, totalBorrowsWei } = metrics\n if (borrowCapWei === 0n) return 0n\n if (borrowCapWei >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return cashWei\n const capLeft = borrowCapWei > totalBorrowsWei ? borrowCapWei - totalBorrowsWei : 0n\n return cashWei < capLeft ? cashWei : capLeft\n}\n\nexport async function fetchEulerVaultOnChainLendMetrics(args: {\n rpcUrl: string\n chainId: number\n evault: Address\n}): Promise<EulerVaultOnChainLendMetrics> {\n const ch = defineChain({\n id: args.chainId,\n name: 'EulerVaultRead',\n nativeCurrency: { decimals: 18, name: 'x', symbol: 'x' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const client = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const addr = getAddress(args.evault)\n const [[supplyRaw, borrowRaw], cashWei, totalBorrowsWei, totalAssetsWei] = await Promise.all([\n client.readContract({\n address: addr,\n abi: eulerVaultLendAbi,\n functionName: 'caps',\n }),\n client.readContract({\n address: addr,\n abi: eulerVaultLendAbi,\n functionName: 'cash',\n }),\n client.readContract({\n address: addr,\n abi: eulerVaultLendAbi,\n functionName: 'totalBorrows',\n }),\n client.readContract({\n address: addr,\n abi: eulerVaultLendAbi,\n functionName: 'totalAssets',\n }),\n ])\n const rs = Number(supplyRaw)\n const rb = Number(borrowRaw)\n return {\n rawSupplyCap16: rs,\n rawBorrowCap16: rb,\n supplyCapWei: resolveEulerAmountCapToWei(rs),\n borrowCapWei: resolveEulerAmountCapToWei(rb),\n cashWei,\n totalBorrowsWei,\n totalAssetsWei,\n }\n}\n\nexport type EulerVaultOnChainLendMetricsResult =\n | { ok: true; data: EulerVaultOnChainLendMetrics }\n | { ok: false; message: string }\n\n/** Batch with bounded concurrency (RPC friendly). */\nexport async function fetchEulerVaultOnChainLendMetricsForVaults(args: {\n rpcUrl: string\n chainId: number\n vaults: readonly { key: string; evault: string }[]\n}): Promise<ReadonlyMap<string, EulerVaultOnChainLendMetricsResult>> {\n const rpc = (args.rpcUrl ?? '').trim()\n const out = new Map<string, EulerVaultOnChainLendMetricsResult>()\n if (!rpc || !args.vaults.length) return out\n\n const concurrency = 8\n let idx = 0\n const list = [...args.vaults]\n async function worker() {\n while (idx < list.length) {\n const i = idx++\n const row = list[i]!\n try {\n const ev = getAddress(row.evault.trim() as `0x${string}`)\n const data = await fetchEulerVaultOnChainLendMetrics({\n rpcUrl: rpc,\n chainId: args.chainId,\n evault: ev,\n })\n out.set(row.key, { ok: true, data })\n } catch (e) {\n out.set(row.key, {\n ok: false,\n message: e instanceof Error ? e.message : 'On-chain read failed',\n })\n }\n }\n }\n await Promise.all(Array.from({ length: Math.min(concurrency, list.length) }, () => worker()))\n return out\n}\n","import { getAddress, isAddress, type Address } from 'viem'\nimport { fetchAaveV4NativeWrappedToken } from '../aave-v4/api.js'\nimport { getEulerGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\nimport { EULER_EVAULT_CAP_UNLIMITED_WEI, eulerSubgraphVaultCapToUnderlyingWei } from './eulerV2VaultCapsOnChain'\n\n/** Goldsky GraphQL endpoints from Euler docs (single hosted project). */\nexport const EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID: Readonly<Record<number, string>> = {\n 1: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-mainnet/latest/gn',\n 8453: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-base/latest/gn',\n 1923: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-swell/latest/gn',\n 146: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-sonic/latest/gn',\n 60808: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-bob/latest/gn',\n 80094: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-berachain/latest/gn',\n 43114: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-avalanche/latest/gn',\n 42161: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-arbitrum/latest/gn',\n 130: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-unichain/latest/gn',\n 57073: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-ink/latest/gn',\n 56: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-bsc/latest/gn',\n 999: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-hyperevm/latest/gn',\n 10: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-optimism/latest/gn',\n 100: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-gnosis/latest/gn',\n 480: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-worldchain/latest/gn',\n 239: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-tac/latest/gn',\n 9745: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-plasma/latest/gn',\n 5000: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-mantle/latest/gn',\n}\n\n/**\n * When Aave v4 does not list `nativeWrappedToken` for a chain, we use this canonical wrapped\n * **gas** token (WETH-style, WHYPE, WMNT, WBERA, etc.) for mapping the node’s native row (`0x0`).\n * Must cover every `EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID` key; see assert below.\n */\nconst WRAPPED_NATIVE_FALLBACK: Readonly<Record<number, `0x${string}`>> = {\n 1: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n 10: '0x4200000000000000000000000000000000000006',\n 56: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n 100: '0xe91d153e0b41518a2ce8dd3d7944fa863463a97d',\n 130: '0x4200000000000000000000000000000000000006',\n 146: '0x03980325872071166574bcd94670450917897468',\n 239: '0xB63B9f0eb4A6E6f191529D71d4D88cc8900Df2C9', // TAC: WTAC (https://docs.tac.build/ecosystem/token-list)\n 480: '0x4200000000000000000000000000000000000006',\n 999: '0x5555555555555555555555555555555555555555', // HyperEVM: WHYPE (Hyperliquid docs)\n 1923: '0x4200000000000000000000000000000000000006',\n 42161: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n 43114: '0xB31f66AA3C1e785363F0875A1B74D27b85FE0459',\n 5000: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8', // Mantle: WMNT\n 57073: '0x4200000000000000000000000000000000000006',\n 60808: '0x4200000000000000000000000000000000000006',\n 80094: '0x6969696969696969696969696969696969696969', // Berachain: WBERA (https://docs.berachain.com)\n 8453: '0x4200000000000000000000000000000000000006',\n 9745: '0x6100E367285b01F48D07953803A2d8dCA5D19873', // Plasma: WXPL\n}\n\nfor (const id of Object.keys(EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID).map(Number)) {\n if (WRAPPED_NATIVE_FALLBACK[id] == null) {\n throw new Error(`eulerV2Subgraph: add WRAPPED_NATIVE_FALLBACK for Euler Goldsky chain ${id}`)\n }\n}\n\nexport type EulerV2AssetModes = {\n lend: boolean\n borrow: boolean\n earn: boolean\n}\n\nexport function eulerV2GoldskyUrlForChain(chainId: number): string | undefined {\n return EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID[chainId]\n}\n\nexport async function resolveEulerWrappedNativeToken(chainId: number): Promise<string | null> {\n try {\n const fromAave = await fetchAaveV4NativeWrappedToken(chainId)\n if (fromAave) return fromAave\n } catch {\n /* ignore */\n }\n const fb = WRAPPED_NATIVE_FALLBACK[chainId]\n if (fb && isAddress(fb)) return getAddress(fb)\n return null\n}\n\n/** Wrapped gas-token contracts for this chain (Aave + Euler fallbacks); lowercased. Use to fix bad `decimals()` on WETH-class assets. */\nexport async function eulerWrappedGasTokenAliasesLower(chainId: number): Promise<ReadonlySet<string>> {\n const s = new Set<string>()\n const fb = WRAPPED_NATIVE_FALLBACK[chainId as keyof typeof WRAPPED_NATIVE_FALLBACK]\n if (fb && isAddress(fb)) {\n try {\n s.add(getAddress(fb).toLowerCase())\n } catch {\n /* ignore */\n }\n }\n try {\n const aave = await fetchAaveV4NativeWrappedToken(chainId)\n if (aave && isAddress(aave)) s.add(getAddress(aave).toLowerCase())\n } catch {\n /* ignore */\n }\n return s\n}\n\n/** Maps native gas row (`0x000…0`) to wrapped ERC20 for Euler underlying lookups. */\nexport function eulerV2KeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n\ntype GqlError = { message?: string }\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nasync function eulerSubgraphGql<T>(\n endpoint: string,\n query: string,\n variables?: Record<string, unknown>,\n chainId?: number,\n): Promise<T> {\n const body = { query, variables: variables ?? {} }\n const proxy = getEulerGraphqlProxyUrl()\n const j = await postJsonViaOptionalProxy<GqlData<T>>({\n directUrl: endpoint,\n body,\n proxyUrl: proxy,\n proxyEnvelope: chainId != null ? { chainId, query, variables: variables ?? {} } : body,\n })\n if (j.errors?.length) {\n throw new Error(j.errors.map((e) => e.message ?? 'Unknown').join('; '))\n }\n if (j.data == null) throw new Error('Euler subgraph: empty response')\n return j.data\n}\n\n/** GraphQL POST to the Euler Goldsky subgraph for `chainId`. */\nexport async function eulerV2QueryGraphQl<T>(\n chainId: number,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<T> {\n const endpoint = eulerV2GoldskyUrlForChain(chainId)\n if (!endpoint) {\n throw new Error(`Euler v2 subgraph is not configured for chain ${chainId}`)\n }\n return eulerSubgraphGql<T>(endpoint, query, variables, chainId)\n}\n\nconst EULER_TRACKING_DEPOSITS_GQL = `\nquery EulerTrackingDeposits($id: Bytes!) {\n trackingActiveAccount(id: $id) {\n deposits\n }\n}`\n\n/** Goldsky `trackingActiveAccount.deposits` (encoded like borrows: 0x + 40-hex sub + 40-hex eVault). */\nexport async function fetchEulerV2TrackingDepositEntries(args: {\n chainId: number\n mainAddress: Address\n}): Promise<readonly string[]> {\n if (!eulerV2GoldskyUrlForChain(args.chainId)) return []\n const id = args.mainAddress.toLowerCase()\n const data = await eulerV2QueryGraphQl<{ trackingActiveAccount?: { deposits?: readonly string[] | null } | null }>(\n args.chainId,\n EULER_TRACKING_DEPOSITS_GQL,\n { id },\n )\n const raw = data.trackingActiveAccount?.deposits ?? []\n return raw.filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n}\n\nfunction normAssetAddr(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s || !isAddress(s)) return null\n return getAddress(s as `0x${string}`).toLowerCase()\n}\n\n/**\n * Borrow tab: hide only when resolved borrow cap is zero and there are no borrows.\n * Subgraph `borrowCap` is the uint16 AmountCap word (`0` = not set = unlimited on-chain).\n */\nfunction vaultShowsBorrowTab(borrowCap: string, totalBorrows: string): boolean {\n let borrows = 0n\n try {\n borrows = BigInt((totalBorrows ?? '').trim() || '0')\n } catch {\n borrows = 0n\n }\n if (borrows > 0n) return true\n const w = eulerSubgraphVaultCapToUnderlyingWei(borrowCap)\n if (w >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return true\n return w > 0n\n}\n\nconst VAULT_PAGE = `\nquery V($first: Int!, $skip: Int!) {\n eulerVaults(first: $first, skip: $skip) {\n asset\n borrowCap\n state { totalBorrows }\n }\n}\n`\n\nconst EARN_PAGE = `\nquery E($first: Int!, $skip: Int!) {\n eulerEarnVaults(first: $first, skip: $skip) {\n asset\n }\n}\n`\n\nasync function paginateEulerVaultRows(\n endpoint: string,\n): Promise<readonly { asset: string | null; borrowCap: string; totalBorrows: string }[]> {\n const out: { asset: string | null; borrowCap: string; totalBorrows: string }[] = []\n let skip = 0\n const first = 1000\n while (true) {\n const d = await eulerSubgraphGql<{\n eulerVaults: ReadonlyArray<{ asset?: string | null; borrowCap: string; state?: { totalBorrows?: string | null } | null }>\n }>(endpoint, VAULT_PAGE, { first, skip })\n const rows = d.eulerVaults ?? []\n if (!rows.length) break\n for (const r of rows) {\n const tb = (r.state?.totalBorrows ?? '0').toString()\n out.push({ asset: r.asset ?? null, borrowCap: r.borrowCap, totalBorrows: tb })\n }\n if (rows.length < first) break\n skip += first\n }\n return out\n}\n\nasync function paginateEulerEarnAssets(endpoint: string): Promise<readonly string[]> {\n const assets: string[] = []\n let skip = 0\n const first = 1000\n while (true) {\n const d = await eulerSubgraphGql<{ eulerEarnVaults: ReadonlyArray<{ asset?: string | null }> }>(endpoint, EARN_PAGE, {\n first,\n skip,\n })\n const rows = d.eulerEarnVaults ?? []\n if (!rows.length) break\n for (const r of rows) {\n const a = normAssetAddr(r.asset ?? undefined)\n if (a) assets.push(a)\n }\n if (rows.length < first) break\n skip += first\n }\n return assets\n}\n\nexport type EulerV2ChainAssetCache = {\n nativeWrapped: string | null\n /** Lowercase address → EVK / Earn modes */\n modesByUnderlying: ReadonlyMap<string, EulerV2AssetModes>\n}\n\nconst eulerV2ChainAssetCache = new Map<number, Promise<EulerV2ChainAssetCache>>()\n\nexport async function fetchEulerV2ChainAssetCache(chainId: number): Promise<EulerV2ChainAssetCache> {\n const endpoint = eulerV2GoldskyUrlForChain(chainId)\n if (!endpoint) {\n return { nativeWrapped: null, modesByUnderlying: new Map() }\n }\n const [nativeWrapped, vaultRows, earnAssets] = await Promise.all([\n resolveEulerWrappedNativeToken(chainId),\n paginateEulerVaultRows(endpoint),\n paginateEulerEarnAssets(endpoint),\n ])\n const modes = new Map<string, EulerV2AssetModes>()\n const bump = (addr: string, patch: Partial<EulerV2AssetModes>) => {\n const cur = modes.get(addr) ?? { lend: false, borrow: false, earn: false }\n modes.set(addr, {\n lend: cur.lend || !!patch.lend,\n borrow: cur.borrow || !!patch.borrow,\n earn: cur.earn || !!patch.earn,\n })\n }\n for (const e of earnAssets) bump(e, { earn: true })\n for (const row of vaultRows) {\n const a = normAssetAddr(row.asset)\n if (!a) continue\n bump(a, {\n lend: true,\n borrow: vaultShowsBorrowTab(row.borrowCap, row.totalBorrows),\n })\n }\n return { nativeWrapped, modesByUnderlying: modes }\n}\n\n/** Cached per chain id for the lifetime of the JS realm (same pattern as Aave v4 token cache). */\nexport function ensureEulerV2ChainAssetCache(chainId: number): Promise<EulerV2ChainAssetCache> {\n const hit = eulerV2ChainAssetCache.get(chainId)\n if (hit) return hit\n const p = fetchEulerV2ChainAssetCache(chainId)\n eulerV2ChainAssetCache.set(chainId, p)\n return p\n}\n","import { getAddress } from 'viem'\n\nconst LABELS_PRODUCTS_URL = (chainId: number) =>\n `https://raw.githubusercontent.com/euler-xyz/euler-labels/master/${chainId}/products.json`\n\ntype EulerLabelsVaultOverride = {\n name?: string\n}\n\ntype EulerLabelsProduct = {\n name?: string\n vaults?: string[]\n vaultOverrides?: Record<string, EulerLabelsVaultOverride>\n}\n\nfunction normAddrKey(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s) return null\n try {\n return getAddress((s.startsWith('0x') ? s : `0x${s}`) as `0x${string}`).toLowerCase()\n } catch {\n return null\n }\n}\n\n/** If `base` already mentions the asset symbol, don’t append it again. */\nexport function eulerLabelsAppendUnderlyingIfDistinct(base: string, underlyingSymbol: string): string {\n const b = (base ?? '').trim()\n const sym = (underlyingSymbol ?? '').trim()\n if (!b) return '—'\n if (!sym) return b\n if (b.toLowerCase().includes(sym.toLowerCase())) return b\n return `${b} ${sym}`\n}\n\nconst labelMapCache = new Map<number, Promise<ReadonlyMap<string, string>>>()\n\n/**\n * Map lowercase eVault address → Euler dApp label base (product name or vault override name).\n * Returns empty map on HTTP/parse errors (caller keeps subgraph names).\n */\nexport function fetchEulerLabelsVaultNameMap(chainId: number): Promise<ReadonlyMap<string, string>> {\n let hit = labelMapCache.get(chainId)\n if (!hit) {\n hit = (async (): Promise<ReadonlyMap<string, string>> => {\n const m = new Map<string, string>()\n try {\n const res = await fetch(LABELS_PRODUCTS_URL(chainId), { cache: 'force-cache' })\n if (!res.ok) return m\n const j = (await res.json()) as Record<string, EulerLabelsProduct>\n if (!j || typeof j !== 'object') return m\n for (const prod of Object.values(j)) {\n const productName = (prod?.name ?? '').trim()\n const vaults = prod?.vaults ?? []\n const overrides = prod?.vaultOverrides ?? {}\n const overrideNameByVault = new Map<string, string>()\n for (const [addr, ov] of Object.entries(overrides)) {\n const k = normAddrKey(addr)\n const n = (ov?.name ?? '').trim()\n if (k && n) overrideNameByVault.set(k, n)\n }\n for (const vAddr of vaults) {\n const k = normAddrKey(vAddr)\n if (!k) continue\n const overrideName = overrideNameByVault.get(k)\n const base = overrideName || productName\n if (!base) continue\n m.set(k, base)\n }\n }\n } catch {\n /* keep empty */\n }\n return m\n })()\n labelMapCache.set(chainId, hit)\n }\n return hit\n}\n\nexport function eulerLabelsLookupLabelForVault(\n labelMap: ReadonlyMap<string, string>,\n evaultAddress: string,\n): string | undefined {\n const k = normAddrKey(evaultAddress)\n if (!k) return undefined\n const v = labelMap.get(k)\n return typeof v === 'string' && v.trim() ? v.trim() : undefined\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n isAddress,\n parseAbi,\n type Address,\n type PublicClient,\n} from 'viem'\nimport {\n eulerV2QueryGraphQl,\n ensureEulerV2ChainAssetCache,\n eulerV2KeyForNodeAssetRow,\n} from './eulerV2Subgraph'\nimport {\n eulerLabelsAppendUnderlyingIfDistinct,\n eulerLabelsLookupLabelForVault,\n fetchEulerLabelsVaultNameMap,\n} from './eulerLabelsProducts'\nimport {\n EULER_EVAULT_CAP_UNLIMITED_WEI,\n eulerSubgraphVaultCapToUnderlyingWei,\n eulerVaultLendMetricsFromIndexerVaultState,\n type EulerVaultOnChainLendMetrics,\n} from './eulerV2VaultCapsOnChain'\n\nconst erc20StringMetaAbi = parseAbi([\n 'function name() view returns (string)',\n 'function symbol() view returns (string)',\n])\n\nconst LEND_VAULT_PAGE = `\nquery EulerLendVaults($first: Int!, $skip: Int!, $asset: Bytes!) {\n eulerVaults(\n first: $first\n skip: $skip\n where: { asset: $asset }\n orderBy: state__supplyApy\n orderDirection: desc\n ) {\n id\n evc\n evault\n name\n symbol\n asset\n decimals\n supplyCap\n borrowCap\n interestFee\n perspectives\n collaterals\n oracle\n unitOfAccount\n governonAdmin\n state {\n cash\n totalBorrows\n totalShares\n supplyApy\n borrowApy\n timestamp\n }\n }\n}\n`\n\nconst COLLATERAL_META = `\nquery EulerCollateralVaults($first: Int!, $ids: [Bytes!]!) {\n eulerVaults(first: $first, where: { id_in: $ids }) {\n id\n evault\n name\n symbol\n asset\n decimals\n state {\n supplyApy\n }\n }\n}\n`\n\ntype GqlVaultRow = {\n id?: string | null\n evc?: string | null\n evault?: string | null\n name?: string | null\n symbol?: string | null\n asset?: string | null\n decimals?: string | null\n supplyCap?: string | null\n borrowCap?: string | null\n interestFee?: string | null\n perspectives?: ReadonlyArray<string | null> | null\n collaterals?: ReadonlyArray<string | null> | null\n oracle?: string | null\n unitOfAccount?: string | null\n governonAdmin?: string | null\n state?: {\n cash?: string | null\n totalBorrows?: string | null\n totalShares?: string | null\n supplyApy?: string | null\n borrowApy?: string | null\n timestamp?: string | null\n } | null\n}\n\nfunction normId(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim().toLowerCase()\n return s.length ? s : null\n}\n\nfunction normAssetLower(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s || !isAddress(s)) return null\n return getAddress(s as `0x${string}`).toLowerCase()\n}\n\nfunction checksumHex(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s || !isAddress(s)) return null\n try {\n return getAddress(s as Address)\n } catch {\n return null\n }\n}\n\nfunction eulerMetaPublicClient(chainId: number, rpcUrl: string): PublicClient {\n const chain = defineChain({\n id: chainId,\n name: 'EulerCollateralMeta',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain, transport: http(rpcUrl) })\n}\n\nasync function readErc20StringMeta(client: PublicClient, addrLower: string): Promise<{ name: string; symbol: string } | null> {\n try {\n const addr = getAddress(addrLower as Address)\n const [nameResult, symbolResult] = await Promise.all([\n client.readContract({ address: addr, abi: erc20StringMetaAbi, functionName: 'name' }),\n client.readContract({ address: addr, abi: erc20StringMetaAbi, functionName: 'symbol' }),\n ])\n return {\n name: typeof nameResult === 'string' ? nameResult.trim() : String(nameResult ?? '').trim(),\n symbol: typeof symbolResult === 'string' ? symbolResult.trim() : String(symbolResult ?? '').trim(),\n }\n } catch {\n return null\n }\n}\n\nasync function resolveUnderlyingTokenLabels(args: {\n chainId: number\n rpcUrl: string | undefined\n nodeErc20ByAddress: ReadonlyMap<string, { name: string; symbol: string }> | undefined\n assetAddresses: readonly string[]\n}): Promise<Map<string, { name: string; symbol: string }>> {\n const out = new Map<string, { name: string; symbol: string }>()\n const uniq = [...new Set(args.assetAddresses.map((a) => normAssetLower(a)).filter(Boolean) as string[])]\n const missingFromNode: string[] = []\n const node = args.nodeErc20ByAddress\n for (const low of uniq) {\n const hit = node?.get(low)\n if (hit && ((hit.symbol ?? '').trim() || (hit.name ?? '').trim())) {\n out.set(low, { name: (hit.name ?? '').trim(), symbol: (hit.symbol ?? '').trim() })\n } else {\n missingFromNode.push(low)\n }\n }\n const rpc = (args.rpcUrl ?? '').trim()\n if (!missingFromNode.length || !rpc) return out\n\n const client = eulerMetaPublicClient(args.chainId, rpc)\n const batchSize = 10\n for (let i = 0; i < missingFromNode.length; i += batchSize) {\n const chunk = missingFromNode.slice(i, i + batchSize)\n const settled = await Promise.all(chunk.map((low) => readErc20StringMeta(client, low)))\n chunk.forEach((low, j) => {\n const m = settled[j]\n if (m && (m.symbol || m.name)) out.set(low, m)\n })\n }\n return out\n}\n\n/** Annual APY stored as a ray (1e27); supply or borrow from subgraph state. */\nexport function formatEulerRayApyPercent(apyRay: bigint): string {\n if (apyRay === 0n) return '0.00%'\n const r = Number(formatUnits(apyRay, 27))\n if (!Number.isFinite(r)) return '—'\n const pct = r * 100\n if (pct >= 100) return `${pct.toFixed(1)}%`\n if (pct >= 10) return `${pct.toFixed(2)}%`\n return `${pct.toFixed(2)}%`\n}\n\n/** @deprecated Use {@link formatEulerRayApyPercent}. */\nexport const formatEulerRaySupplyApyPercent = formatEulerRayApyPercent\n\nfunction formatUnderlyingAmount(raw: string, decimals: number): string {\n try {\n const v = BigInt((raw ?? '').trim() || '0')\n const s = formatUnits(v, decimals)\n const n = Number(s)\n if (!Number.isFinite(n)) return s\n if (n === 0) return '0'\n const abs = Math.abs(n)\n if (abs >= 1e9) return n.toExponential(2)\n if (abs >= 1e6) return n.toLocaleString(undefined, { maximumFractionDigits: 0 })\n if (abs >= 1) return n.toLocaleString(undefined, { maximumFractionDigits: 2 })\n return n.toLocaleString(undefined, { maximumFractionDigits: 6 })\n } catch {\n return '—'\n }\n}\n\n/** Subgraph caps are uint16 AmountCap words; see {@link eulerSubgraphVaultCapToUnderlyingWei}. */\nfunction formatEulerVaultCapDisplay(raw: string | undefined | null, decimals: number): string {\n try {\n const wei = eulerSubgraphVaultCapToUnderlyingWei(raw)\n if (wei >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return 'Unlimited'\n if (wei === 0n) return '0'\n return formatUnderlyingAmount(wei.toString(), decimals)\n } catch {\n return '—'\n }\n}\n\n/** Interest fee from subgraph (basis points over 10_000 → APY-style percentage points). */\nfunction formatEulerInterestFee(raw: string | undefined | null): string {\n try {\n const fee = BigInt((raw ?? '').trim() || '0')\n if (fee === 0n) return '0%'\n const pct = Number(fee) / 100\n return `${pct.toFixed(2)}%`\n } catch {\n return '—'\n }\n}\n\nfunction formatEulerIndexedTimestamp(raw: string | undefined | null): string {\n try {\n const sec = BigInt((raw ?? '').trim() || '0')\n const n = Number(sec)\n if (!Number.isFinite(n) || n <= 0) return '—'\n return new Date(n * 1000).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })\n } catch {\n return '—'\n }\n}\n\nfunction utilizationPercentLabel(cash: bigint, borrows: bigint): string {\n const denom = cash + borrows\n if (denom === 0n) return '0.00%'\n const scaled = (borrows * 1000000n) / denom\n const pct = Number(scaled) / 10000\n return `${pct.toFixed(2)}%`\n}\n\nfunction collateralLabelFromVault(name: string | undefined, symbol: string | undefined, id: string): string {\n const n = (name ?? '').trim()\n const sym = (symbol ?? '').trim()\n if (n && sym && n.toLowerCase() !== sym.toLowerCase()) return `${n} (${sym})`\n if (n) return n\n if (sym) return sym\n return id.slice(0, 10)\n}\n\n/** Subgraph `name` is sometimes empty while `symbol` is set; fall back before showing a shortened address. */\nfunction marketLabelFromSubgraphRow(r: GqlVaultRow, evaultChecksum: string): string {\n const n = (r.name ?? '').trim()\n if (n) return n\n const sym = (r.symbol ?? '').trim()\n if (sym) return sym\n const addr = (evaultChecksum ?? '').trim()\n if (addr.startsWith('0x') && addr.length >= 14) return `${addr.slice(0, 8)}…${addr.slice(-6)}`\n return addr || '—'\n}\n\nfunction normalizePerspectives(raw: ReadonlyArray<string | null> | null | undefined): readonly string[] {\n const out: string[] = []\n for (const p of raw ?? []) {\n const s = (p ?? '').trim()\n if (s) out.push(s)\n }\n return out\n}\n\n/** Raw APY rays from subgraph state (0 = indexer reports no yield). */\nfunction vaultSupplyBorrowApyRays(r: GqlVaultRow): { supplyApyRay: bigint; borrowApyRay: bigint } {\n let supplyApyRay = 0n\n let borrowApyRay = 0n\n try {\n supplyApyRay = BigInt((r.state?.supplyApy ?? '0').toString().trim() || '0')\n } catch {\n supplyApyRay = 0n\n }\n try {\n borrowApyRay = BigInt((r.state?.borrowApy ?? '0').toString().trim() || '0')\n } catch {\n borrowApyRay = 0n\n }\n return { supplyApyRay, borrowApyRay }\n}\n\nfunction vaultCashAndBorrows(r: GqlVaultRow): { cash: bigint; borrows: bigint } {\n let cash = 0n\n let borrows = 0n\n try {\n cash = BigInt((r.state?.cash ?? '0').toString().trim() || '0')\n } catch {\n cash = 0n\n }\n try {\n borrows = BigInt((r.state?.totalBorrows ?? '0').toString().trim() || '0')\n } catch {\n borrows = 0n\n }\n return { cash, borrows }\n}\n\nasync function paginateLendVaultRows(chainId: number, assetLower: string): Promise<readonly GqlVaultRow[]> {\n const out: GqlVaultRow[] = []\n let skip = 0\n const first = 500\n while (true) {\n const d = await eulerV2QueryGraphQl<{ eulerVaults: readonly GqlVaultRow[] }>(chainId, LEND_VAULT_PAGE, {\n first,\n skip,\n asset: assetLower,\n })\n const rows = d.eulerVaults ?? []\n if (!rows.length) break\n out.push(...rows)\n if (rows.length < first) break\n skip += first\n }\n return out\n}\n\nasync function fetchCollateralVaultMeta(\n chainId: number,\n collateralIds: readonly string[],\n): Promise<\n ReadonlyMap<\n string,\n {\n name: string\n symbol: string\n assetLower: string | null\n evaultChecksum: string | null\n decimals: number\n supplyApyRay: bigint\n }\n >\n> {\n const map = new Map<\n string,\n {\n name: string\n symbol: string\n assetLower: string | null\n evaultChecksum: string | null\n decimals: number\n supplyApyRay: bigint\n }\n >()\n const uniq = [...new Set(collateralIds.map((x) => x.toLowerCase()))].filter(Boolean)\n const chunkSize = 400\n for (let i = 0; i < uniq.length; i += chunkSize) {\n const chunk = uniq.slice(i, i + chunkSize)\n const d = await eulerV2QueryGraphQl<{\n eulerVaults: ReadonlyArray<{\n id?: string | null\n evault?: string | null\n name?: string | null\n symbol?: string | null\n asset?: string | null\n decimals?: string | null\n state?: { supplyApy?: string | null } | null\n }>\n }>(chainId, COLLATERAL_META, { first: chunk.length, ids: chunk })\n for (const r of d.eulerVaults ?? []) {\n const id = normId(r.id ?? undefined)\n if (!id) continue\n let dec = 18\n try {\n dec = Number.parseInt((r.decimals ?? '18').trim(), 10)\n if (!Number.isFinite(dec) || dec < 0 || dec > 36) dec = 18\n } catch {\n dec = 18\n }\n let supplyApyRay = 0n\n try {\n supplyApyRay = BigInt((r.state?.supplyApy ?? '0').toString().trim() || '0')\n } catch {\n supplyApyRay = 0n\n }\n map.set(id, {\n name: (r.name ?? '').trim(),\n symbol: (r.symbol ?? '').trim(),\n assetLower: normAssetLower(r.asset ?? undefined),\n evaultChecksum: checksumHex(r.evault ?? undefined) ?? checksumHex(r.id ?? undefined),\n decimals: dec,\n supplyApyRay,\n })\n }\n }\n return map\n}\n\nexport type EulerV2IsolatedLendMarketRow = {\n vaultId: string\n /** Checksummed eVault address for explorers / copy. */\n evaultAddress: string\n marketName: string\n decimals: number\n cash: bigint\n totalBorrows: bigint\n supplyApyPercentLabel: string\n borrowApyPercentLabel: string\n totalSupplyFormatted: string\n availableLiquidityFormatted: string\n utilizationPercentLabel: string\n supplyCapFormatted: string\n borrowCapFormatted: string\n interestFeeLabel: string\n stateIndexedDisplay: string\n perspectives: readonly string[]\n /** Ethereum Vault Connector (EVC) contract for `batch(...)`. */\n evcAddress: string | null\n oracleAddress: string | null\n unitOfAccountAddress: string | null\n borrowAssetAddressLower: string | null\n governonAdminChecksum: string | null\n borrowApyRay: bigint\n /** Caps, cash, borrows, and total-assets proxy from Goldsky (same shape as on-chain reads). */\n indexerLendMetrics: EulerVaultOnChainLendMetrics\n collateralTokens: readonly {\n vaultId: string\n /** Collateral eVault (checksummed) for on-chain LTV + deposit target. */\n collateralEvaultAddress: string | null\n collateralDecimals: number\n collateralAssetAddressLower: string | null\n collateralSupplyApyPercentLabel: string\n underlyingSymbol: string\n underlyingName: string | null\n vaultMarketLabel: string\n }[]\n}\n\n/** One borrow-vault × collateral-vault pair (flattened from {@link EulerV2IsolatedLendMarketRow}). */\nexport type EulerV2BorrowCollateralRow = {\n pairKey: string\n borrowVaultId: string\n borrowEvaultAddress: string\n borrowMarketName: string\n borrowDecimals: number\n borrowApyPercentLabel: string\n borrowCash: bigint\n borrowTotalBorrows: bigint\n netApyPercentLabel: string\n utilizationPercentLabel: string\n availableLiquidityFormatted: string\n evcAddress: string | null\n oracleAddress: string | null\n unitOfAccountAddress: string | null\n borrowAssetAddressLower: string | null\n governonAdminChecksum: string | null\n collateralVaultId: string\n collateralEvaultAddress: string | null\n collateralSymbol: string\n collateralName: string | null\n collateralVaultLabel: string\n collateralDecimals: number\n collateralAssetAddressLower: string | null\n collateralSupplyApyPercentLabel: string\n borrowIndexerLendMetrics: EulerVaultOnChainLendMetrics\n}\n\nexport function flattenEulerV2BorrowCollateralRows(markets: readonly EulerV2IsolatedLendMarketRow[]): EulerV2BorrowCollateralRow[] {\n const out: EulerV2BorrowCollateralRow[] = []\n for (const m of markets) {\n if (m.borrowApyRay === 0n) continue\n const borrowNum = Number.parseFloat(m.borrowApyPercentLabel.replace(/%/g, '').trim()) || 0\n for (const c of m.collateralTokens) {\n if (!c.collateralEvaultAddress) continue\n const supplyNum = Number.parseFloat(c.collateralSupplyApyPercentLabel.replace(/%/g, '').trim()) || 0\n const net = supplyNum - borrowNum\n const netLabel = `${net.toFixed(2)}%`\n out.push({\n pairKey: `${m.vaultId}:${c.vaultId}`,\n borrowVaultId: m.vaultId,\n borrowEvaultAddress: m.evaultAddress,\n borrowMarketName: m.marketName,\n borrowDecimals: m.decimals,\n borrowApyPercentLabel: m.borrowApyPercentLabel,\n borrowCash: m.cash,\n borrowTotalBorrows: m.totalBorrows,\n netApyPercentLabel: netLabel,\n utilizationPercentLabel: m.utilizationPercentLabel,\n availableLiquidityFormatted: m.availableLiquidityFormatted,\n evcAddress: m.evcAddress,\n oracleAddress: m.oracleAddress,\n unitOfAccountAddress: m.unitOfAccountAddress,\n borrowAssetAddressLower: m.borrowAssetAddressLower,\n governonAdminChecksum: m.governonAdminChecksum,\n collateralVaultId: c.vaultId,\n collateralEvaultAddress: c.collateralEvaultAddress,\n collateralSymbol: c.underlyingSymbol,\n collateralName: c.underlyingName,\n collateralVaultLabel: c.vaultMarketLabel,\n collateralDecimals: c.collateralDecimals,\n collateralAssetAddressLower: c.collateralAssetAddressLower,\n collateralSupplyApyPercentLabel: c.collateralSupplyApyPercentLabel,\n borrowIndexerLendMetrics: m.indexerLendMetrics,\n })\n }\n }\n return out\n}\n\nexport async function fetchEulerV2IsolatedLendMarketsForRowAsset(args: {\n chainId: number\n /** Assets panel contract address (native row mapped via Euler cache). */\n contractAddress: string\n rpcUrl?: string | undefined\n nodeErc20ByAddress?: ReadonlyMap<string, { name: string; symbol: string }> | undefined\n /** Shown asset symbol (helps match Euler app-style “Product SYMBOL” titles). */\n suppliedAssetSymbol?: string | undefined\n}): Promise<EulerV2IsolatedLendMarketRow[]> {\n const cache = await ensureEulerV2ChainAssetCache(args.chainId)\n const underlying = eulerV2KeyForNodeAssetRow({\n contractAddress: args.contractAddress,\n nativeWrapped: cache.nativeWrapped,\n })\n if (!underlying) return []\n\n const [gqlRows, labelMap] = await Promise.all([\n paginateLendVaultRows(args.chainId, underlying),\n fetchEulerLabelsVaultNameMap(args.chainId),\n ])\n /** Discovery list: hide idle vaults (no APY signal and/or zero indexed TVL). Positions UI is separate. */\n const eligibleRows = gqlRows.filter((r) => {\n const { supplyApyRay, borrowApyRay } = vaultSupplyBorrowApyRays(r)\n if (supplyApyRay === 0n && borrowApyRay === 0n) return false\n const { cash, borrows } = vaultCashAndBorrows(r)\n return cash + borrows !== 0n\n })\n\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'development') {\n let matched = 0\n for (const r of eligibleRows) {\n const evRaw = checksumHex(r.evault ?? undefined) ?? checksumHex(r.id ?? undefined)\n if (!evRaw) continue\n if (eulerLabelsLookupLabelForVault(labelMap, evRaw)) matched += 1\n }\n console.debug('[Euler labels]', {\n chainId: args.chainId,\n matchedEligibleVaults: matched,\n eligibleVaults: eligibleRows.length,\n labelMapEntries: labelMap.size,\n })\n }\n\n const collateralIds: string[] = []\n for (const r of eligibleRows) {\n for (const c of r.collaterals ?? []) {\n const id = normId(c ?? undefined)\n if (id) collateralIds.push(id)\n }\n }\n const collateralMeta = await fetchCollateralVaultMeta(args.chainId, collateralIds)\n const underlyingAssetAddrs: string[] = []\n for (const m of collateralMeta.values()) {\n if (m.assetLower) underlyingAssetAddrs.push(m.assetLower)\n }\n const underlyingLabels = await resolveUnderlyingTokenLabels({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n nodeErc20ByAddress: args.nodeErc20ByAddress,\n assetAddresses: underlyingAssetAddrs,\n })\n\n const rows: EulerV2IsolatedLendMarketRow[] = []\n for (const r of eligibleRows) {\n const vaultId = normId(r.id ?? undefined)\n if (!vaultId) continue\n const evaultAddress =\n checksumHex(r.evault ?? undefined) ?? checksumHex(r.id ?? undefined) ?? vaultId\n const subgraphTitle = marketLabelFromSubgraphRow(r, evaultAddress)\n const labelBase = eulerLabelsLookupLabelForVault(labelMap, evaultAddress)\n const assetSym = (args.suppliedAssetSymbol ?? '').trim()\n const marketName = labelBase ? eulerLabelsAppendUnderlyingIfDistinct(labelBase, assetSym) : subgraphTitle\n let dec = 18\n try {\n dec = Number.parseInt((r.decimals ?? '18').trim(), 10)\n if (!Number.isFinite(dec) || dec < 0 || dec > 36) dec = 18\n } catch {\n dec = 18\n }\n const { cash, borrows } = vaultCashAndBorrows(r)\n const { supplyApyRay, borrowApyRay } = vaultSupplyBorrowApyRays(r)\n\n const total = cash + borrows\n const cIds = [...new Set((r.collaterals ?? []).map((x) => normId(x ?? undefined)).filter(Boolean) as string[])]\n const collateralTokens = cIds.map((cid) => {\n const vm = collateralMeta.get(cid)\n const vaultMarketLabel = vm ? collateralLabelFromVault(vm.name, vm.symbol, cid) : cid.slice(0, 10)\n const assetLow = vm?.assetLower ?? null\n const und = assetLow ? underlyingLabels.get(assetLow) : undefined\n const sym = (und?.symbol ?? '').trim()\n const nam = (und?.name ?? '').trim()\n let underlyingSymbol: string\n let underlyingName: string | null\n if (sym || nam) {\n underlyingSymbol = sym || nam\n underlyingName = sym && nam && nam.toLowerCase() !== sym.toLowerCase() ? nam : null\n } else {\n underlyingSymbol = vaultMarketLabel\n underlyingName = null\n }\n const collSupplyRay = vm?.supplyApyRay ?? 0n\n return {\n vaultId: cid,\n collateralEvaultAddress: vm?.evaultChecksum ?? null,\n collateralDecimals: vm?.decimals ?? 18,\n collateralAssetAddressLower: assetLow,\n collateralSupplyApyPercentLabel: formatEulerRayApyPercent(collSupplyRay),\n underlyingSymbol,\n underlyingName,\n vaultMarketLabel,\n }\n })\n\n const indexerLendMetrics = eulerVaultLendMetricsFromIndexerVaultState({\n supplyCapRaw: r.supplyCap,\n borrowCapRaw: r.borrowCap,\n cashWei: cash,\n totalBorrowsWei: borrows,\n totalAssetsWei: total,\n })\n\n rows.push({\n vaultId,\n evaultAddress,\n marketName,\n decimals: dec,\n cash,\n totalBorrows: borrows,\n supplyApyPercentLabel: formatEulerRayApyPercent(supplyApyRay),\n borrowApyPercentLabel: formatEulerRayApyPercent(borrowApyRay),\n totalSupplyFormatted: formatUnderlyingAmount(total.toString(), dec),\n availableLiquidityFormatted: formatUnderlyingAmount(cash.toString(), dec),\n utilizationPercentLabel: utilizationPercentLabel(cash, borrows),\n supplyCapFormatted: formatEulerVaultCapDisplay(r.supplyCap, dec),\n borrowCapFormatted: formatEulerVaultCapDisplay(r.borrowCap, dec),\n interestFeeLabel: formatEulerInterestFee(r.interestFee),\n stateIndexedDisplay: formatEulerIndexedTimestamp(r.state?.timestamp),\n perspectives: normalizePerspectives(r.perspectives),\n evcAddress: checksumHex(r.evc ?? undefined),\n oracleAddress: checksumHex(r.oracle ?? undefined),\n unitOfAccountAddress: checksumHex(r.unitOfAccount ?? undefined),\n borrowAssetAddressLower: normAssetLower(r.asset ?? undefined),\n governonAdminChecksum: checksumHex(r.governonAdmin ?? undefined),\n borrowApyRay,\n indexerLendMetrics,\n collateralTokens,\n })\n }\n\n return rows\n}\n","import { formatUnits, getAddress, isAddress } from 'viem'\nimport {\n eulerV2QueryGraphQl,\n eulerV2KeyForNodeAssetRow,\n ensureEulerV2ChainAssetCache,\n} from './eulerV2Subgraph'\nimport { formatEulerRayApyPercent } from './eulerV2LendMarkets'\n\nconst UINT256_MAX = (1n << 256n) - 1n\n\n/**\n * Goldsky `eulerEarnVaults` subgraph stores this constant in `currentAllocationCap` for strategies\n * with no cap (not token wei — formatting it with underlying decimals yields bogus huge numbers).\n */\nconst EARN_STRATEGY_ALLOC_CAP_SUBGRAPH_UNBOUNDED = 87112285931760246646623899502532662132735n\n\nconst EARN_VAULTS_QUERY = `\nquery EulerEarnForAsset($asset: Bytes!, $ids: [Bytes!]!) {\n eulerEarnVaults(first: 500, where: { asset: $asset, id_in: $ids }) {\n id\n name\n curator\n performanceFee\n totalAssets\n totalAllocated\n asset\n strategies(first: 200) {\n strategy\n allocatedAssets\n availableAssets\n currentAllocationCap\n }\n }\n}\n`\n\nconst STRATEGY_VAULT_APY = `\nquery EulerStrategyVaults($ids: [Bytes!]!) {\n eulerVaults(first: 500, where: { id_in: $ids }) {\n id\n asset\n symbol\n state {\n supplyApy\n }\n }\n}\n`\n\ntype GqlEarnRow = {\n id?: string | null\n name?: string | null\n curator?: string | null\n performanceFee?: string | null\n totalAssets?: string | null\n totalAllocated?: string | null\n asset?: string | null\n strategies?: ReadonlyArray<{\n strategy?: string | null\n allocatedAssets?: string | null\n availableAssets?: string | null\n currentAllocationCap?: string | null\n }> | null\n}\n\ntype GqlVaultApyRow = {\n id?: string | null\n asset?: string | null\n symbol?: string | null\n state?: { supplyApy?: string | null } | null\n}\n\nfunction normLowerId(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim().toLowerCase()\n if (!s.startsWith('0x') || s.length < 4) return null\n return s\n}\n\nfunction big(raw: string | null | undefined): bigint {\n try {\n return BigInt((raw ?? '0').toString().trim() || '0')\n } catch {\n return 0n\n }\n}\n\n/** Curated earn vault addresses from euler-labels (non-deprecated only). */\nexport async function fetchEulerLabelsEarnVaultAllowlist(chainId: number): Promise<ReadonlySet<string>> {\n const url = `https://raw.githubusercontent.com/euler-xyz/euler-labels/master/${chainId}/earn-vaults.json`\n const r = await fetch(url, { cache: 'no-store' })\n if (!r.ok) return new Set()\n let j: unknown\n try {\n j = (await r.json()) as unknown\n } catch {\n return new Set()\n }\n const out = new Set<string>()\n if (!Array.isArray(j)) return out\n for (const entry of j) {\n if (typeof entry === 'string') {\n const lo = normLowerId(entry)\n if (lo) out.add(lo)\n continue\n }\n if (entry && typeof entry === 'object' && !Array.isArray(entry)) {\n const o = entry as Record<string, unknown>\n if (o.deprecated === true) continue\n const addr = typeof o.address === 'string' ? o.address : typeof o.id === 'string' ? o.id : null\n const lo = normLowerId(addr)\n if (lo) out.add(lo)\n }\n }\n return out\n}\n\n/** Map lowercase address → entity display name from entities.json. */\nexport async function fetchEulerLabelsEntityNameByAddress(chainId: number): Promise<ReadonlyMap<string, string>> {\n const url = `https://raw.githubusercontent.com/euler-xyz/euler-labels/master/${chainId}/entities.json`\n const r = await fetch(url, { cache: 'no-store' })\n const m = new Map<string, string>()\n if (!r.ok) return m\n let j: unknown\n try {\n j = (await r.json()) as unknown\n } catch {\n return m\n }\n if (!j || typeof j !== 'object') return m\n for (const ent of Object.values(j as Record<string, unknown>)) {\n if (!ent || typeof ent !== 'object') continue\n const name = (ent as { name?: unknown }).name\n const groupName = typeof name === 'string' && name.trim() ? name.trim() : null\n if (!groupName) continue\n const addrs = (ent as { addresses?: unknown }).addresses\n if (!addrs || typeof addrs !== 'object') continue\n for (const k of Object.keys(addrs as Record<string, unknown>)) {\n const lo = normLowerId(k)\n if (lo) m.set(lo, groupName)\n }\n }\n return m\n}\n\n/** Dialog focus metadata: which Earn vault the deposit batch targets (mirrors lend flow vault meta). */\nexport type EulerV2EarnFlowVaultMeta = {\n earnVaultIdLower: string\n evaultAddress: string\n vaultMarketLabel: string\n curatorDisplayName: string\n}\n\nexport type EulerV2EarnStrategyRow = {\n strategyVaultIdLower: string\n strategySymbol: string\n supplyApyPercentLabel: string\n allocatedAssetsWei: bigint\n allocatedHumanLabel: string\n /** Share of vault total assets (TVL). */\n allocationPercentOfTvlLabel: string\n allocationCapHumanLabel: string\n /** True when cap is unbounded (uint256 max in-contract, or Goldsky subgraph no-cap sentinel). */\n allocationCapUnlimited: boolean\n}\n\nexport type EulerV2EarnOfferingRow = {\n vaultIdLower: string\n evaultAddress: string\n vaultName: string\n curatorDisplayName: string\n strategyCount: number\n supplyApyPercentLabel: string\n totalAssetsWei: bigint\n totalAssetsHumanLabel: string\n availableLiquidityWei: bigint\n availableLiquidityHumanLabel: string\n performanceFeePercentLabel: string\n underlyingDecimals: number\n strategies: readonly EulerV2EarnStrategyRow[]\n}\n\nfunction formatPerformanceFeePercent(feeWad: bigint): string {\n if (feeWad === 0n) return '0%'\n const x = Number(formatUnits(feeWad, 18))\n if (!Number.isFinite(x)) return '—'\n const pct = x * 100\n if (pct >= 10) return `${pct.toFixed(1)}%`\n if (pct >= 1) return `${pct.toFixed(2)}%`\n return `${pct.toFixed(2)}%`\n}\n\nfunction isMaxUintCap(cap: bigint): boolean {\n return cap >= UINT256_MAX - 3n\n}\n\nfunction isUnboundedEarnStrategyAllocationCap(cap: bigint): boolean {\n return isMaxUintCap(cap) || cap === EARN_STRATEGY_ALLOC_CAP_SUBGRAPH_UNBOUNDED\n}\n\nexport async function fetchEulerV2EarnOfferingsForRowAsset(args: {\n chainId: number\n contractAddress: string\n underlyingDecimals: number\n suppliedAssetSymbol?: string | undefined\n}): Promise<EulerV2EarnOfferingRow[]> {\n const { chainId, underlyingDecimals } = args\n const cache = await ensureEulerV2ChainAssetCache(chainId)\n const key = eulerV2KeyForNodeAssetRow({\n contractAddress: args.contractAddress,\n nativeWrapped: cache.nativeWrapped,\n })\n if (!key) return []\n\n const [allowlist, entityByAddr] = await Promise.all([\n fetchEulerLabelsEarnVaultAllowlist(chainId),\n fetchEulerLabelsEntityNameByAddress(chainId),\n ])\n if (!allowlist.size) return []\n\n const assetBytes = key\n const ids = [...allowlist]\n\n const data = await eulerV2QueryGraphQl<{ eulerEarnVaults: GqlEarnRow[] }>(chainId, EARN_VAULTS_QUERY, {\n asset: assetBytes,\n ids,\n })\n const rawRows = data.eulerEarnVaults ?? []\n\n const strategyIds = new Set<string>()\n for (const v of rawRows) {\n for (const s of v.strategies ?? []) {\n const sid = normLowerId(s.strategy ?? undefined)\n if (sid) strategyIds.add(sid)\n }\n }\n\n const apyByVault = new Map<\n string,\n { apyRay: bigint; symbol: string; assetLower: string | null }\n >()\n const sidList = [...strategyIds]\n const batch = 200\n for (let i = 0; i < sidList.length; i += batch) {\n const chunk = sidList.slice(i, i + batch)\n const d2 = await eulerV2QueryGraphQl<{ eulerVaults: GqlVaultApyRow[] }>(chainId, STRATEGY_VAULT_APY, {\n ids: chunk,\n })\n for (const row of d2.eulerVaults ?? []) {\n const id = normLowerId(row.id ?? undefined)\n if (!id) continue\n const ray = big(row.state?.supplyApy ?? '0')\n const sym = (row.symbol ?? '').trim() || '—'\n const al = normLowerId(row.asset ?? undefined)\n apyByVault.set(id, { apyRay: ray, symbol: sym, assetLower: al })\n }\n }\n\n const dec = Math.max(0, Math.min(36, Math.floor(underlyingDecimals)))\n const tic = (args.suppliedAssetSymbol ?? '').trim()\n\n const out: EulerV2EarnOfferingRow[] = []\n\n for (const v of rawRows) {\n const vid = normLowerId(v.id ?? undefined)\n if (!vid || !allowlist.has(vid)) continue\n\n const curatorLo = normLowerId(v.curator ?? undefined)\n const curatorName =\n curatorLo && entityByAddr.has(curatorLo)\n ? entityByAddr.get(curatorLo)!\n : curatorLo\n ? `${curatorLo.slice(0, 6)}…${curatorLo.slice(-4)}`\n : '—'\n\n const strategiesRaw = [...(v.strategies ?? [])]\n const sumStratAlloc = strategiesRaw.reduce((a, s) => a + big(s.allocatedAssets), 0n)\n const totalAssets = big(v.totalAssets)\n const totalAllocatedField = big(v.totalAllocated)\n\n let denomForApy = sumStratAlloc\n if (denomForApy === 0n) denomForApy = totalAllocatedField\n\n let weightedApyRay = 0n\n if (denomForApy > 0n) {\n let acc = 0n\n for (const s of strategiesRaw) {\n const alloc = big(s.allocatedAssets)\n const sid = normLowerId(s.strategy ?? undefined)\n const meta = sid ? apyByVault.get(sid) : undefined\n const ray = meta?.apyRay ?? 0n\n acc += ray * alloc\n }\n weightedApyRay = acc / denomForApy\n }\n\n const supplyApyPercentLabel =\n denomForApy > 0n\n ? formatEulerRayApyPercent(weightedApyRay)\n : '0.00%'\n\n const deployedForLiquidity =\n sumStratAlloc > 0n ? sumStratAlloc : totalAllocatedField > 0n ? totalAllocatedField : 0n\n const availableWei = totalAssets > deployedForLiquidity ? totalAssets - deployedForLiquidity : 0n\n\n const performanceFee = big(v.performanceFee)\n const performanceFeePercentLabel = formatPerformanceFeePercent(performanceFee)\n\n const vaultName = (v.name ?? '').trim() || 'Euler Earn'\n\n const stratRows: EulerV2EarnStrategyRow[] = strategiesRaw.map((s) => {\n const sid = normLowerId(s.strategy ?? undefined) ?? ''\n const meta = sid ? apyByVault.get(sid) : undefined\n const alloc = big(s.allocatedAssets)\n const cap = big(s.currentAllocationCap)\n const pctOfTotal =\n totalAssets > 0n ? `${(Number((alloc * 10000n) / totalAssets) / 100).toFixed(1)}%` : '0.0%'\n\n const capUnlimited = isUnboundedEarnStrategyAllocationCap(cap)\n let capLabel: string\n if (capUnlimited) {\n capLabel = '∞'\n } else if (cap === 0n) {\n capLabel = `0${tic ? ` ${tic}` : ''}`\n } else {\n try {\n capLabel = `${formatUnits(cap, dec)}${tic ? ` ${tic}` : ''}`\n } catch {\n capLabel = cap.toString()\n }\n }\n\n let allocHuman: string\n try {\n allocHuman = `${formatUnits(alloc, dec)}${tic ? ` ${tic}` : ''}`\n } catch {\n allocHuman = alloc.toString()\n }\n\n return {\n strategyVaultIdLower: sid,\n strategySymbol: meta?.symbol ?? '—',\n supplyApyPercentLabel: meta ? formatEulerRayApyPercent(meta.apyRay) : '—',\n allocatedAssetsWei: alloc,\n allocatedHumanLabel: allocHuman,\n allocationPercentOfTvlLabel: pctOfTotal,\n allocationCapHumanLabel: capLabel,\n allocationCapUnlimited: capUnlimited,\n }\n })\n\n const cs = checksumHex(v.id)\n if (!cs) continue\n\n let totalHuman: string\n let availHuman: string\n try {\n totalHuman = `${formatUnits(totalAssets, dec)}${tic ? ` ${tic}` : ''}`\n availHuman = `${formatUnits(availableWei, dec)}${tic ? ` ${tic}` : ''}`\n } catch {\n totalHuman = totalAssets.toString()\n availHuman = availableWei.toString()\n }\n\n out.push({\n vaultIdLower: vid,\n evaultAddress: cs,\n vaultName,\n curatorDisplayName: curatorName,\n strategyCount: strategiesRaw.length,\n supplyApyPercentLabel,\n totalAssetsWei: totalAssets,\n totalAssetsHumanLabel: totalHuman,\n availableLiquidityWei: availableWei,\n availableLiquidityHumanLabel: availHuman,\n performanceFeePercentLabel,\n underlyingDecimals: dec,\n strategies: stratRows,\n })\n }\n\n out.sort((a, b) => {\n const ap = Number.parseFloat(a.supplyApyPercentLabel.replace('%', '')) || 0\n const bp = Number.parseFloat(b.supplyApyPercentLabel.replace('%', '')) || 0\n if (bp !== ap) return bp - ap\n return a.vaultName.localeCompare(b.vaultName)\n })\n\n return out\n}\n\nfunction checksumHex(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s || !isAddress(s)) return null\n try {\n return getAddress(s as `0x${string}`)\n } catch {\n return null\n }\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n isAddress,\n parseAbi,\n parseUnits,\n type Address,\n type PublicClient,\n} from 'viem'\n\nconst eulerVaultRiskAbi = parseAbi([\n 'function LTVBorrow(address collateral) view returns (uint16)',\n 'function LTVLiquidation(address collateral) view returns (uint16)',\n])\n\nconst priceOracleAbi = parseAbi([\n 'function getQuote(uint256 inAmount, address base, address quote) view returns (uint256 outAmount)',\n])\n\nfunction metaClient(chainId: number, rpcUrl: string): PublicClient {\n const chain = defineChain({\n id: chainId,\n name: 'EulerBorrowRisk',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain, transport: http(rpcUrl) })\n}\n\nexport type EulerV2BorrowPairRisk = {\n maxLtvBps: number\n liquidationLtvBps: number\n}\n\n/**\n * Read borrow / liquidation LTV from the liability eVault for a collateral eVault address.\n */\nexport async function fetchEulerV2BorrowPairLtvs(args: {\n chainId: number\n rpcUrl: string\n borrowEvault: Address\n collateralEvault: Address\n}): Promise<EulerV2BorrowPairRisk | null> {\n const rpc = (args.rpcUrl ?? '').trim()\n if (!rpc) return null\n try {\n const client = metaClient(args.chainId, rpc)\n const coll = getAddress(args.collateralEvault)\n const bor = getAddress(args.borrowEvault)\n const [maxLt, liqLt] = await Promise.all([\n client.readContract({ address: bor, abi: eulerVaultRiskAbi, functionName: 'LTVBorrow', args: [coll] }),\n client.readContract({ address: bor, abi: eulerVaultRiskAbi, functionName: 'LTVLiquidation', args: [coll] }),\n ])\n return { maxLtvBps: Number(maxLt), liquidationLtvBps: Number(liqLt) }\n } catch {\n return null\n }\n}\n\nexport type EulerV2BorrowOracleQuoteSnapshot = {\n /** UoA out for `10^borrowDecimals` wei of borrow asset (one full token if decimals match). */\n oneBorrowUnitUoAWei: bigint\n /** UoA out for `collateralAmountHuman` of collateral (human → wei using collateralDecimals). */\n collateralUoAWei: bigint\n}\n\n/**\n * Uses the liability vault’s oracle (same oracle address the vault uses for account health).\n */\nexport async function fetchEulerV2BorrowOracleQuoteSnapshot(args: {\n chainId: number\n rpcUrl: string\n oracle: Address\n unitOfAccount: Address\n borrowAsset: Address\n borrowDecimals: number\n collateralAsset: Address\n collateralDecimals: number\n collateralAmountHuman: string\n}): Promise<EulerV2BorrowOracleQuoteSnapshot | null> {\n const rpc = (args.rpcUrl ?? '').trim()\n if (!rpc) return null\n if (!isAddress(args.oracle) || !isAddress(args.unitOfAccount)) return null\n try {\n const client = metaClient(args.chainId, rpc)\n const oracle = getAddress(args.oracle)\n const uoa = getAddress(args.unitOfAccount)\n const bAss = getAddress(args.borrowAsset)\n const cAss = getAddress(args.collateralAsset)\n const oneBorrow = parseUnits('1', args.borrowDecimals)\n const collWei = parseUnits(args.collateralAmountHuman, args.collateralDecimals)\n const [oneBorrowUnitUoAWei, collateralUoAWei] = await Promise.all([\n client.readContract({\n address: oracle,\n abi: priceOracleAbi,\n functionName: 'getQuote',\n args: [oneBorrow, bAss, uoa],\n }),\n collWei > 0n\n ? client.readContract({\n address: oracle,\n abi: priceOracleAbi,\n functionName: 'getQuote',\n args: [collWei, cAss, uoa],\n })\n : Promise.resolve(0n),\n ])\n return { oneBorrowUnitUoAWei, collateralUoAWei }\n } catch {\n return null\n }\n}\n\n/** `borrowHuman ≈ collateralUoA * (ltvPct/100) / oneBorrowUnitUoA` with BigInt rounding down. */\nexport function estimateBorrowHumanFromLtv(args: {\n collateralUoAWei: bigint\n oneBorrowUnitUoAWei: bigint\n ltvPercent: number\n borrowDecimals: number\n}): string {\n if (args.collateralUoAWei <= 0n || args.oneBorrowUnitUoAWei <= 0n || !(args.ltvPercent > 0)) return '0'\n const bps = Math.min(10000, Math.max(0, Math.round(args.ltvPercent * 100)))\n const debtUoA = (args.collateralUoAWei * BigInt(bps)) / 10000n\n const borrowWei = (debtUoA * parseUnits('1', args.borrowDecimals)) / args.oneBorrowUnitUoAWei\n if (borrowWei <= 0n) return '0'\n return formatUnits(borrowWei, args.borrowDecimals)\n}\n\n/**\n * Max collateral wei such that borrow at `ltvPercent` is ≤ `maxBorrowWei`, capped by wallet.\n * Uses oracle UoA at **full wallet balance**; assumes `getQuote` scales linearly in collateral amount.\n */\nexport function maxCollateralWeiCappedByBorrowLiquidity(args: {\n walletBalWei: bigint\n maxBorrowWei: bigint\n collateralFullUoAWei: bigint\n oneBorrowUnitUoAWei: bigint\n ltvPercent: number\n borrowDecimals: number\n}): bigint {\n const { walletBalWei, maxBorrowWei, collateralFullUoAWei, oneBorrowUnitUoAWei, ltvPercent, borrowDecimals } = args\n if (walletBalWei <= 0n) return 0n\n if (maxBorrowWei <= 0n) return 0n\n if (!(ltvPercent > 0)) return walletBalWei\n if (collateralFullUoAWei <= 0n || oneBorrowUnitUoAWei <= 0n) return walletBalWei\n\n const bps = Math.min(10000, Math.max(0, Math.round(ltvPercent * 100)))\n const debtUoA = (collateralFullUoAWei * BigInt(bps)) / 10000n\n const borrowWeiFull = (debtUoA * parseUnits('1', borrowDecimals)) / oneBorrowUnitUoAWei\n if (borrowWeiFull <= 0n) return walletBalWei\n if (borrowWeiFull <= maxBorrowWei) return walletBalWei\n return (walletBalWei * maxBorrowWei) / borrowWeiFull\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n isAddress,\n parseAbi,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { EulerV2LendUiPosition } from './eulerV2LendUi'\nimport { eulerV2QueryGraphQl, fetchEulerV2TrackingDepositEntries } from './eulerV2Subgraph'\nimport { fetchEulerV2BorrowPairLtvs } from './eulerV2BorrowRiskOnChain'\n\nconst TRACKING_BORROWS = `\nquery EulerTrackingBorrows($id: Bytes!) {\n trackingActiveAccount(id: $id) {\n borrows\n }\n}`\n\nconst VAULTS_FOR_EVAULTS = `\nquery EulerVaultsForBorrows($ids: [ID!]!) {\n eulerVaults(where: { id_in: $ids }) {\n id\n evault\n evc\n name\n symbol\n asset\n decimals\n collaterals\n }\n}`\n\nconst erc20DecimalsAbi = parseAbi(['function decimals() view returns (uint8)'])\nconst erc4626BalanceAbi = parseAbi(['function balanceOf(address account) view returns (uint256)'])\nconst erc4626MaxWithdrawAbi = parseAbi(['function maxWithdraw(address owner) view returns (uint256)'])\nconst eulerRiskLtAbi = parseAbi(['function LTVBorrow(address collateral) view returns (uint16)'])\nconst eulerLiquidityAbi = parseAbi([\n 'function accountLiquidity(address account, bool liquidation) view returns (uint256 collateralValue, uint256 liabilityValue)',\n])\n\nfunction metaClient(chainId: number, rpcUrl: string): PublicClient {\n const chain = defineChain({\n id: chainId,\n name: 'EulerBorrowPos',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain, transport: http(rpcUrl) })\n}\n\n/** Parse `trackingActiveAccount.borrows` entry: 0x + 40-hex subaccount + 40-hex vault. */\nexport function parseEulerTrackingBorrowEntry(entry: string): { subAccount: Address; borrowVault: Address } | null {\n const s = (entry ?? '').trim().toLowerCase()\n if (!s.startsWith('0x')) return null\n const hex = s.slice(2)\n if (hex.length < 80) return null\n try {\n const subAccount = getAddress(`0x${hex.slice(0, 40)}` as `0x${string}`)\n const borrowVault = getAddress(`0x${hex.slice(40, 80)}` as `0x${string}`)\n return { subAccount, borrowVault }\n } catch {\n return null\n }\n}\n\nexport async function fetchEulerV2TrackingBorrowEntries(args: {\n chainId: number\n mainAddress: Address\n}): Promise<readonly string[]> {\n const id = args.mainAddress.toLowerCase()\n const data = await eulerV2QueryGraphQl<{ trackingActiveAccount?: { borrows?: readonly string[] | null } | null }>(\n args.chainId,\n TRACKING_BORROWS,\n { id },\n )\n const raw = data.trackingActiveAccount?.borrows ?? []\n return raw.filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n}\n\nasync function pickCollateralEvault(args: {\n client: PublicClient\n borrowVault: Address\n subAccount: Address\n collaterals: readonly (string | null | undefined)[] | null | undefined\n}): Promise<Address | null> {\n const cands = (args.collaterals ?? [])\n .map((c) => (c ?? '').trim().toLowerCase())\n .filter((c) => c.startsWith('0x') && isAddress(c)) as string[]\n const uniq = [...new Set(cands)]\n for (const low of uniq) {\n try {\n const coll = getAddress(low as `0x${string}`)\n const lt = await args.client.readContract({\n address: args.borrowVault,\n abi: eulerRiskLtAbi,\n functionName: 'LTVBorrow',\n args: [coll],\n })\n if (Number(lt) === 0) continue\n const bal = await args.client.readContract({\n address: coll,\n abi: erc4626BalanceAbi,\n functionName: 'balanceOf',\n args: [args.subAccount],\n })\n if (bal > 0n) return coll\n } catch {\n /* next */\n }\n }\n for (const low of uniq) {\n try {\n const coll = getAddress(low as `0x${string}`)\n const lt = await args.client.readContract({\n address: args.borrowVault,\n abi: eulerRiskLtAbi,\n functionName: 'LTVBorrow',\n args: [coll],\n })\n if (Number(lt) > 0) return coll\n } catch {\n /* next */\n }\n }\n if (uniq.length) {\n try {\n return getAddress(uniq[0]! as `0x${string}`)\n } catch {\n return null\n }\n }\n return null\n}\n\n/**\n * Load borrow vault rows for `mainAddress` from the Euler tracking subgraph (`borrows`) plus RPC, and supplement\n * pairs from `deposits` + on-chain `debtOf` when the indexer lags. Rows with zero debt are kept when the\n * sub-account still has collateral to withdraw (`maxWithdraw` or vault shares).\n */\nexport async function loadEulerV2BorrowPositionsForOwner(args: {\n chainId: number\n rpcUrl: string\n mainAddress: Address\n}): Promise<EulerV2LendUiPosition[]> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) return []\n\n const [entries, depositEntries] = await Promise.all([\n fetchEulerV2TrackingBorrowEntries({ chainId: args.chainId, mainAddress: args.mainAddress }),\n fetchEulerV2TrackingDepositEntries({ chainId: args.chainId, mainAddress: args.mainAddress }),\n ])\n\n const pairKey = (sub: Address, vault: Address) => `${sub.toLowerCase()}-${vault.toLowerCase()}`\n const seenPairs = new Set<string>()\n const pairs: { subAccount: Address; borrowVault: Address }[] = []\n const pushPair = (sub: Address, vault: Address) => {\n const k = pairKey(sub, vault)\n if (seenPairs.has(k)) return\n seenPairs.add(k)\n pairs.push({ subAccount: sub, borrowVault: vault })\n }\n for (const e of entries) {\n const p = parseEulerTrackingBorrowEntry(e)\n if (p) pushPair(p.subAccount, p.borrowVault)\n }\n\n const client = metaClient(args.chainId, rpc)\n const debtAbi = parseAbi(['function debtOf(address account) view returns (uint256)'])\n /** Goldsky `borrows` can lag; pick up liability vaults from `deposits` + on-chain `debtOf`. */\n for (const e of depositEntries) {\n const p = parseEulerTrackingBorrowEntry(e)\n if (!p) continue\n if (seenPairs.has(pairKey(p.subAccount, p.borrowVault))) continue\n let debtWei = 0n\n try {\n debtWei = await client.readContract({\n address: p.borrowVault,\n abi: debtAbi,\n functionName: 'debtOf',\n args: [p.subAccount],\n })\n } catch {\n continue\n }\n if (debtWei === 0n) continue\n pushPair(p.subAccount, p.borrowVault)\n }\n\n if (!pairs.length) return []\n\n const vaultIds = [...new Set(pairs.map((x) => x.borrowVault.toLowerCase()))]\n const vaultData = await eulerV2QueryGraphQl<{\n eulerVaults: ReadonlyArray<{\n id?: string | null\n evault?: string | null\n evc?: string | null\n name?: string | null\n symbol?: string | null\n asset?: string | null\n decimals?: string | null\n collaterals?: ReadonlyArray<string | null> | null }>\n }>(args.chainId, VAULTS_FOR_EVAULTS, { ids: vaultIds })\n\n const byEvault = new Map<string, (typeof vaultData.eulerVaults)[number]>()\n for (const v of vaultData.eulerVaults ?? []) {\n const ev = (v.evault ?? '').trim().toLowerCase()\n if (ev) byEvault.set(ev, v)\n }\n\n const evcAbi = parseAbi(['function EVC() view returns (address)'])\n\n const out: EulerV2LendUiPosition[] = []\n const t = Date.now()\n\n for (const { subAccount, borrowVault } of pairs) {\n let debtWei = 0n\n try {\n debtWei = await client.readContract({\n address: borrowVault,\n abi: debtAbi,\n functionName: 'debtOf',\n args: [subAccount],\n })\n } catch {\n /* skip if vault read fails */\n }\n\n const vrow = byEvault.get(borrowVault.toLowerCase())\n const decRaw = Number((vrow?.decimals ?? '18').toString().trim() || '18')\n const decimals = Number.isFinite(decRaw) && decRaw >= 0 && decRaw <= 36 ? decRaw : 18\n let assetLow = (vrow?.asset ?? '').trim().toLowerCase()\n if (!assetLow || !isAddress(assetLow)) {\n try {\n const a = await client.readContract({\n address: borrowVault,\n abi: parseAbi(['function asset() view returns (address)']),\n functionName: 'asset',\n })\n assetLow = getAddress(a).toLowerCase()\n } catch {\n assetLow = ''\n }\n }\n let decFinal = decimals\n if (assetLow && isAddress(assetLow)) {\n try {\n const d = await client.readContract({\n address: getAddress(assetLow as `0x${string}`),\n abi: erc20DecimalsAbi,\n functionName: 'decimals',\n })\n const n = Number(d)\n if (Number.isFinite(n) && n >= 0 && n <= 36) decFinal = n\n } catch {\n /* keep */\n }\n }\n\n const debtHuman = formatUnits(debtWei, decFinal)\n const collateralVault = await pickCollateralEvault({\n client,\n borrowVault,\n subAccount,\n collaterals: vrow?.collaterals ?? null,\n })\n\n if (debtWei === 0n) {\n if (!collateralVault) continue\n let maxWithdrawLeft = 0n\n try {\n maxWithdrawLeft = await client.readContract({\n address: collateralVault,\n abi: erc4626MaxWithdrawAbi,\n functionName: 'maxWithdraw',\n args: [subAccount],\n })\n } catch {\n maxWithdrawLeft = 0n\n }\n let collateralShares = 0n\n if (maxWithdrawLeft === 0n) {\n try {\n collateralShares = await client.readContract({\n address: collateralVault,\n abi: erc4626BalanceAbi,\n functionName: 'balanceOf',\n args: [subAccount],\n })\n } catch {\n collateralShares = 0n\n }\n }\n if (maxWithdrawLeft === 0n && collateralShares === 0n) continue\n }\n\n let collateralAssetAddressLower: string | null = null\n let collateralAssetDecimals: number | undefined\n let collateralUnderlyingSymbol: string | null = null\n if (collateralVault) {\n try {\n const assetAddr = await client.readContract({\n address: collateralVault,\n abi: parseAbi(['function asset() view returns (address)']),\n functionName: 'asset',\n })\n const cLow = getAddress(assetAddr).toLowerCase()\n collateralAssetAddressLower = cLow\n const cd = await client.readContract({\n address: getAddress(cLow as `0x${string}`),\n abi: erc20DecimalsAbi,\n functionName: 'decimals',\n })\n const cn = Number(cd)\n if (Number.isFinite(cn) && cn >= 0 && cn <= 36) collateralAssetDecimals = cn\n try {\n const sym = await client.readContract({\n address: getAddress(cLow as `0x${string}`),\n abi: parseAbi(['function symbol() view returns (string)']),\n functionName: 'symbol',\n })\n const s = typeof sym === 'string' ? sym.trim() : ''\n if (s) collateralUnderlyingSymbol = s\n } catch {\n /* optional */\n }\n } catch {\n /* optional */\n }\n }\n\n let maxLtvBps: number | null = null\n let liquidationLtvBps: number | null = null\n if (collateralVault) {\n const risk = await fetchEulerV2BorrowPairLtvs({\n chainId: args.chainId,\n rpcUrl: rpc,\n borrowEvault: borrowVault,\n collateralEvault: collateralVault,\n })\n if (risk) {\n maxLtvBps = risk.maxLtvBps\n liquidationLtvBps = risk.liquidationLtvBps\n }\n }\n\n let currentLtvPercent: number | null = null\n try {\n const [collV, liabV] = await client.readContract({\n address: borrowVault,\n abi: eulerLiquidityAbi,\n functionName: 'accountLiquidity',\n args: [subAccount, false],\n })\n if (collV > 0n && liabV > 0n) {\n currentLtvPercent = Number((liabV * 10000n) / collV) / 100\n }\n } catch {\n /* optional */\n }\n\n let evc: string | null = (vrow?.evc ?? '').trim() ? getAddress(vrow!.evc!.trim() as `0x${string}`) : null\n if (!evc) {\n try {\n const e = await client.readContract({\n address: borrowVault,\n abi: evcAbi,\n functionName: 'EVC',\n })\n evc = getAddress(e)\n } catch {\n evc = null\n }\n }\n\n const marketName =\n [(vrow?.symbol ?? '').trim(), (vrow?.name ?? '').trim()].filter(Boolean).join(' · ') ||\n `Borrow ${borrowVault.slice(0, 10)}…`\n\n out.push({\n id: `borrow-${args.chainId}-${subAccount.toLowerCase()}-${borrowVault.toLowerCase()}`,\n chainId: args.chainId,\n vaultId: (vrow?.id ?? borrowVault).toString(),\n evaultAddress: borrowVault,\n marketName,\n underlyingSymbol: (vrow?.symbol ?? '—').toString().trim() || '—',\n amountHuman: debtHuman,\n createdAtMs: t,\n signRequestId: null,\n positionKind: 'borrow',\n subAccountAddress: subAccount,\n collateralEvaultAddress: collateralVault,\n evcAddress: evc,\n borrowAssetAddressLower: assetLow || null,\n borrowAssetDecimals: decFinal,\n borrowDebtHuman: debtHuman,\n collateralAssetAddressLower,\n collateralAssetDecimals,\n collateralUnderlyingSymbol,\n currentLtvPercent,\n maxLtvBps,\n liquidationLtvBps,\n })\n }\n\n return out.sort((a, b) => (a.marketName || '').localeCompare(b.marketName || ''))\n}\n\n/** Live liability vault debt for repay max button / validation. */\nexport async function fetchEulerV2BorrowDebtWei(args: {\n chainId: number\n rpcUrl: string\n borrowVault: Address\n subAccount: Address\n}): Promise<bigint> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) return 0n\n const client = metaClient(args.chainId, rpc)\n const debtAbi = parseAbi(['function debtOf(address account) view returns (uint256)'])\n try {\n return await client.readContract({\n address: args.borrowVault,\n abi: debtAbi,\n functionName: 'debtOf',\n args: [args.subAccount],\n })\n } catch {\n return 0n\n }\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n parseAbi,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { EulerV2LendUiPosition } from './eulerV2LendUi'\nimport { fetchEulerLabelsEarnVaultAllowlist } from './eulerV2EarnMarkets'\nimport { eulerV2GoldskyUrlForChain, eulerV2QueryGraphQl, eulerWrappedGasTokenAliasesLower, fetchEulerV2TrackingDepositEntries } from './eulerV2Subgraph'\nimport { parseEulerTrackingBorrowEntry } from './eulerV2BorrowPositionsLoad'\nimport {\n clampEulerUnderlyingDecimalsForEulerUi,\n fetchEulerVaultUnderlyingMeta,\n} from './vaultWithdrawMultisign.js'\n\nconst VAULTS_FOR_EVAULTS = `\nquery EulerVaultsForSupply($ids: [ID!]!) {\n eulerVaults(where: { id_in: $ids }) {\n id\n evault\n name\n symbol\n asset\n decimals\n }\n}`\n\nconst vaultSupplyAbi = parseAbi([\n 'function balanceOf(address account) view returns (uint256)',\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function asset() view returns (address)',\n])\nconst debtOfAbi = parseAbi(['function debtOf(address account) view returns (uint256)'])\n\nfunction metaClient(chainId: number, rpcUrl: string): PublicClient {\n const chain = defineChain({\n id: chainId,\n name: 'EulerLendSupply',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain, transport: http(rpcUrl) })\n}\n\nasync function readSupplyUnderlyingWei(\n client: PublicClient,\n vault: Address,\n shareOwner: Address,\n): Promise<{ asset: Address; wei: bigint } | null> {\n try {\n const shares = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'balanceOf',\n args: [shareOwner],\n })\n if (shares === 0n) return null\n const assets = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'convertToAssets',\n args: [shares],\n })\n if (assets === 0n) return null\n const asset = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'asset',\n })\n return { asset: getAddress(asset), wei: assets }\n } catch {\n return null\n }\n}\n\n/**\n * On-chain lend / earn vault positions: Goldsky `trackingActiveAccount.deposits` + RPC share balances and `convertToAssets`.\n * Encoding matches borrow tracking entries: `0x` + 40-hex sub-account + 40-hex eVault (see portfolio aggregation).\n */\nexport async function loadEulerV2LendSupplyPositionsForOwner(args: {\n chainId: number\n rpcUrl: string\n mainAddress: Address\n}): Promise<EulerV2LendUiPosition[]> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) return []\n if (!eulerV2GoldskyUrlForChain(args.chainId)) return []\n\n const [entries, earnVaultAllowlist, gasAliases] = await Promise.all([\n fetchEulerV2TrackingDepositEntries({ chainId: args.chainId, mainAddress: args.mainAddress }),\n fetchEulerLabelsEarnVaultAllowlist(args.chainId),\n eulerWrappedGasTokenAliasesLower(args.chainId),\n ])\n const pairs: { subAccount: Address; evault: Address }[] = []\n for (const e of entries) {\n const p = parseEulerTrackingBorrowEntry(e)\n if (p) pairs.push({ subAccount: p.subAccount, evault: p.borrowVault })\n }\n if (!pairs.length) return []\n\n const vaultIds = [...new Set(pairs.map((x) => x.evault.toLowerCase()))]\n const vaultData = await eulerV2QueryGraphQl<{\n eulerVaults: ReadonlyArray<{\n id?: string | null\n evault?: string | null\n name?: string | null\n symbol?: string | null\n asset?: string | null\n decimals?: string | null\n }>\n }>(args.chainId, VAULTS_FOR_EVAULTS, { ids: vaultIds })\n\n const byEvault = new Map<string, (typeof vaultData.eulerVaults)[number]>()\n for (const v of vaultData.eulerVaults ?? []) {\n const ev = (v.evault ?? '').trim().toLowerCase()\n if (ev) byEvault.set(ev, v)\n }\n\n const client = metaClient(args.chainId, rpc)\n const t = Date.now()\n const out: EulerV2LendUiPosition[] = []\n const seenPair = new Set<string>()\n\n for (const { subAccount, evault } of pairs) {\n const pairKey = `${subAccount.toLowerCase()}-${evault.toLowerCase()}`\n if (seenPair.has(pairKey)) continue\n seenPair.add(pairKey)\n\n const supply = await readSupplyUnderlyingWei(client, evault, subAccount)\n if (!supply) continue\n\n let liabilityDebtWei = 0n\n try {\n liabilityDebtWei = await client.readContract({\n address: evault,\n abi: debtOfAbi,\n functionName: 'debtOf',\n args: [subAccount],\n })\n } catch {\n liabilityDebtWei = 0n\n }\n /** Liability balances belong in BORROW rows (`borrows` / deposit+debtOf), not LEND supply. */\n if (liabilityDebtWei > 0n) continue\n\n const vrow = byEvault.get(evault.toLowerCase())\n\n const isEarn = earnVaultAllowlist.has(evault.toLowerCase())\n const positionKind = isEarn ? 'earn' : 'lend'\n const underlyingSymbol = (vrow?.symbol ?? '—').toString().trim() || '—'\n const marketName =\n [(vrow?.symbol ?? '').trim(), (vrow?.name ?? '').trim()].filter(Boolean).join(' · ') ||\n `${isEarn ? 'Earn' : 'Lend'} ${evault.slice(0, 10)}…`\n\n let evChecksummed: Address\n try {\n evChecksummed = getAddress(evault as `0x${string}`)\n } catch {\n continue\n }\n\n let vaultMeta: { asset: Address; decimals: number }\n try {\n vaultMeta = await fetchEulerVaultUnderlyingMeta({\n rpcUrl: rpc,\n chainId: args.chainId,\n evault: evChecksummed,\n })\n } catch {\n continue\n }\n\n const decimals = clampEulerUnderlyingDecimalsForEulerUi({\n fetchedDecimals: vaultMeta.decimals,\n underlyingAssetLower: vaultMeta.asset.toLowerCase(),\n marketName,\n underlyingSymbol,\n wrappedGasAliasesLower: gasAliases,\n })\n\n const amountHuman = formatUnits(supply.wei, decimals)\n\n out.push({\n id: `${positionKind}-supply-${args.chainId}-${subAccount.toLowerCase()}-${evault.toLowerCase()}`,\n chainId: args.chainId,\n vaultId: (vrow?.id ?? evault).toString(),\n evaultAddress: evault,\n marketName,\n underlyingSymbol,\n amountHuman,\n underlyingAssetsWei: supply.wei.toString(),\n underlyingAssetAddressLower: vaultMeta.asset.toLowerCase(),\n createdAtMs: t,\n signRequestId: null,\n positionKind,\n subAccountAddress: subAccount,\n underlyingAssetDecimals: decimals,\n })\n }\n\n return out.sort((a, b) => (a.marketName || '').localeCompare(b.marketName || ''))\n}\n\n/** Prefer indexer+RPC supply rows over session duplicates (same vault / kind / share holder). */\nexport function mergeEulerV2PositionsTabRows(args: {\n borrow: readonly EulerV2LendUiPosition[]\n chainSupply: readonly EulerV2LendUiPosition[]\n session: readonly EulerV2LendUiPosition[]\n mainAddressLower: string\n}): EulerV2LendUiPosition[] {\n const main = args.mainAddressLower.trim().toLowerCase()\n const keyOf = (p: EulerV2LendUiPosition): string => {\n const kind = p.positionKind ?? 'lend'\n if (kind === 'borrow') return p.id\n const ev = p.evaultAddress.trim().toLowerCase()\n const sub = (p.subAccountAddress ?? main).trim().toLowerCase()\n /** Same vault + share holder for Lend / Earn; avoid duplicate session “earn” row vs chain “lend” row. */\n return `supply|${ev}|${sub}`\n }\n const chainKeys = new Set(args.chainSupply.map(keyOf))\n const sessionFiltered = args.session.filter((s) => !chainKeys.has(keyOf(s)))\n return [...args.borrow, ...args.chainSupply, ...sessionFiltered]\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n} from 'viem'\n\n/** Matches `RewardToken` / `ERC20WrapperLocked.LOCK_NORMALIZATION_FACTOR`. */\nexport const REUL_LOCK_DAY_SEC = 86_400n\n/** Matches `RewardToken` linear vesting: 180 days from lock timestamp. */\nexport const REUL_FULL_VEST_SEC = 180n * REUL_LOCK_DAY_SEC\n\nconst rewardTokenReadAbi = parseAbi([\n 'function getLockedAmounts(address account) view returns (uint256[] lockTimestamps, uint256[] amounts)',\n 'function getWithdrawAmountsByLockTimestamp(address account, uint256 lockTimestamp) view returns (uint256 accountAmount, uint256 remainderAmount)',\n])\n\nexport const eulerReulUnlockAbi = parseAbi([\n 'function withdrawToByLockTimestamps(address account, uint256[] lockTimestamps, bool allowRemainderLoss) returns (bool)',\n])\n\nexport type EulerReulVestingTranche = {\n reulToken: Address\n lockTimestampSec: bigint\n lockedAmountWei: bigint\n /** EUL (underlying) to wallet if unlocking now. */\n unlockToWalletWei: bigint\n /** EUL sent to remainder receiver when unlocking early (forfeiture). */\n remainderWei: bigint\n /** Unix second when this tranche can be fully unlocked with no remainder. */\n fullVestTimestampSec: bigint\n /** Same as `remainderWei === 0n`. */\n isFullyVested: boolean\n}\n\nexport async function fetchEulerReulVestingTranches(args: {\n rpcUrl: string\n chainId: number\n reulToken: Address\n user: Address\n}): Promise<readonly EulerReulVestingTranche[]> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) return []\n const reul = getAddress(args.reulToken)\n const user = getAddress(args.user)\n const ch = defineChain({\n id: args.chainId,\n name: 'ReulVest',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpc] } },\n })\n const client = createPublicClient({ chain: ch, transport: http(rpc) })\n const [timestamps, amounts] = await client.readContract({\n address: reul,\n abi: rewardTokenReadAbi,\n functionName: 'getLockedAmounts',\n args: [user],\n })\n const out: EulerReulVestingTranche[] = []\n for (let i = 0; i < timestamps.length; i++) {\n const lockTs = timestamps[i]!\n const lockedAmt = amounts[i]!\n if (lockedAmt === 0n) continue\n const [unlockToWalletWei, remainderWei] = await client.readContract({\n address: reul,\n abi: rewardTokenReadAbi,\n functionName: 'getWithdrawAmountsByLockTimestamp',\n args: [user, lockTs],\n })\n out.push({\n reulToken: reul,\n lockTimestampSec: lockTs,\n lockedAmountWei: lockedAmt,\n unlockToWalletWei,\n remainderWei,\n fullVestTimestampSec: lockTs + REUL_FULL_VEST_SEC,\n isFullyVested: remainderWei === 0n,\n })\n }\n return out\n}\n\nexport function encodeEulerReulWithdrawToByLockTimestampsData(args: {\n recipient: Address\n lockTimestampsSec: readonly bigint[]\n allowRemainderLoss: boolean\n}): `0x${string}` {\n const recipient = getAddress(args.recipient)\n if (args.lockTimestampsSec.length === 0) throw new Error('No rEUL lock timestamps to unlock.')\n return encodeFunctionData({\n abi: eulerReulUnlockAbi,\n functionName: 'withdrawToByLockTimestamps',\n args: [recipient, [...args.lockTimestampsSec], args.allowRemainderLoss],\n })\n}\n\n/** Gas fallback for `withdrawToByLockTimestamps` (batch). */\nexport const EULER_REUL_UNLOCK_GAS_FALLBACK = 500_000n\n","/** CoinGecko asset platform id by mainnet chainId (contract price endpoint). */\nexport const COINGECKO_PLATFORM_BY_CHAIN_ID: Record<string, string> = {\n '1': 'ethereum',\n '56': 'binance-smart-chain',\n '137': 'polygon-pos',\n '42161': 'arbitrum-one',\n '10': 'optimistic-ethereum',\n '43114': 'avalanche',\n '8453': 'base',\n '324': 'zk-sync-era',\n '42220': 'celo',\n '250': 'fantom',\n '100': 'gnosis',\n '204': 'op-bnb',\n '534352': 'scroll',\n '5000': 'mantle',\n '169': 'manta-pacific',\n '1116': 'core',\n '30': 'rootstock',\n '288': 'boba',\n '1088': 'metis-andromeda',\n '34443': 'mode',\n '80084': 'berachain',\n '146': 'sonic',\n '60808': 'bob-network',\n '80094': 'berachain',\n '130': 'unichain',\n '57073': 'ink',\n '999': 'hyperevm',\n '239': 'tac',\n '9745': 'plasma',\n '1923': 'swellchain',\n '59144': 'linea',\n '81457': 'blast',\n '7777777': 'zora',\n}\n\nexport function coingeckoPlatformForChainId(chainId: string | number): string | undefined {\n return COINGECKO_PLATFORM_BY_CHAIN_ID[String(chainId).trim()]\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n isAddress,\n parseAbi,\n type Address,\n} from 'viem'\nimport { eulerV2GoldskyUrlForChain, eulerV2QueryGraphQl } from './eulerV2Subgraph'\nimport { parseEulerTrackingBorrowEntry } from './eulerV2BorrowPositionsLoad'\nimport { COINGECKO_PLATFORM_BY_CHAIN_ID } from '../../../chains/evm/coingecko.js'\nimport { getCoingeckoProxyUrl } from '../../../core/defiProxy.js'\n\nconst TRACKING_ACCOUNT = `\nquery EulerTrackingAccount($id: Bytes!) {\n trackingActiveAccount(id: $id) {\n deposits\n borrows\n }\n}`\n\nconst vaultSupplyAbi = parseAbi([\n 'function balanceOf(address account) view returns (uint256)',\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function asset() view returns (address)',\n])\n\nconst erc20DecimalsAbi = parseAbi(['function decimals() view returns (uint8)'])\nconst debtOfAbi = parseAbi(['function debtOf(address account) view returns (uint256)'])\n\ntype GqlTracking = {\n trackingActiveAccount?: {\n deposits?: readonly (string | null)[] | null\n borrows?: readonly (string | null)[] | null\n } | null\n}\n\nfunction publicClient(chainId: number, rpcUrl: string) {\n const ch = defineChain({\n id: chainId,\n name: 'EulerPortfolio',\n nativeCurrency: { decimals: 18, name: 'x', symbol: 'x' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain: ch, transport: http(rpcUrl) })\n}\n\nasync function gqlTrackingAccount(chainId: number, mainLower: string): Promise<{\n deposits: string[]\n borrows: string[]\n}> {\n if (!eulerV2GoldskyUrlForChain(chainId)) {\n return { deposits: [], borrows: [] }\n }\n const data = await eulerV2QueryGraphQl<GqlTracking>(chainId, TRACKING_ACCOUNT, { id: mainLower })\n const a = data.trackingActiveAccount\n const dep = (a?.deposits ?? []).filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n const bor = (a?.borrows ?? []).filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n return { deposits: dep, borrows: bor }\n}\n\nasync function decimalsForAsset(\n client: ReturnType<typeof publicClient>,\n asset: Address,\n): Promise<number> {\n try {\n const d = await client.readContract({\n address: asset,\n abi: erc20DecimalsAbi,\n functionName: 'decimals',\n })\n const n = Number(d)\n if (Number.isFinite(n) && n >= 0 && n <= 36) return n\n } catch {\n /* ignore */\n }\n return 18\n}\n\nasync function readSupplyUnderlyingWei(\n client: ReturnType<typeof publicClient>,\n vault: Address,\n subAccount: Address,\n): Promise<{ asset: Address; wei: bigint } | null> {\n try {\n const shares = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'balanceOf',\n args: [subAccount],\n })\n if (shares === 0n) return null\n const assets = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'convertToAssets',\n args: [shares],\n })\n if (assets === 0n) return null\n const asset = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'asset',\n })\n return { asset: getAddress(asset), wei: assets }\n } catch {\n return null\n }\n}\n\nasync function readBorrowDebtWei(\n client: ReturnType<typeof publicClient>,\n borrowVault: Address,\n subAccount: Address,\n): Promise<{ asset: Address; wei: bigint } | null> {\n try {\n const debt = await client.readContract({\n address: borrowVault,\n abi: debtOfAbi,\n functionName: 'debtOf',\n args: [subAccount],\n })\n if (debt === 0n) return null\n const asset = await client.readContract({\n address: borrowVault,\n abi: vaultSupplyAbi,\n functionName: 'asset',\n })\n return { asset: getAddress(asset), wei: debt }\n } catch {\n return null\n }\n}\n\nfunction mergeWei(into: Map<string, bigint>, asset: Address, wei: bigint) {\n const k = asset.toLowerCase()\n into.set(k, (into.get(k) ?? 0n) + wei)\n}\n\n/** When `simple/token_price` omits contracts (rate limits, fresh listings), try per-token contract endpoint. */\nasync function fetchCoingeckoContractUsdFromDetail(args: {\n platform: string\n contractAddressLower: string\n}): Promise<number | null> {\n const a = args.contractAddressLower.trim().toLowerCase()\n if (!a.startsWith('0x')) return null\n const url = `https://api.coingecko.com/api/v3/coins/${encodeURIComponent(args.platform)}/contract/${a}`\n try {\n const r = await fetch(url, { cache: 'no-store' })\n if (!r.ok) return null\n const j = (await r.json()) as { market_data?: { current_price?: { usd?: number } } }\n const u = j.market_data?.current_price?.usd\n if (typeof u !== 'number' || !Number.isFinite(u) || u < 0) return null\n return u\n } catch {\n return null\n }\n}\n\nasync function augmentMissingTokenPrices(args: {\n platform: string\n addressesLower: readonly string[]\n prices: Map<string, number>\n}): Promise<void> {\n const missing = args.addressesLower\n .map((x) => x.trim().toLowerCase())\n .filter((x) => x.startsWith('0x') && !args.prices.has(x))\n /** Serial: avoid CoinGecko burst limits; typically 1–4 tokens. */\n for (const addr of missing.slice(0, 12)) {\n const u = await fetchCoingeckoContractUsdFromDetail({ platform: args.platform, contractAddressLower: addr })\n if (u != null) args.prices.set(addr, u)\n }\n}\n\nconst COINGECKO_CHUNK = 45\n\n/** CoinGecko `usd` per 1 token, keyed by lowercase contract address. */\nexport async function fetchCoingeckoTokenUsdByContract(args: {\n chainId: number\n contractAddressesLower: readonly string[]\n}): Promise<Map<string, number>> {\n const platform = COINGECKO_PLATFORM_BY_CHAIN_ID[String(args.chainId)]\n const out = new Map<string, number>()\n if (!platform || args.contractAddressesLower.length === 0) return out\n\n const uniq = [...new Set(args.contractAddressesLower.map((a) => a.trim().toLowerCase()).filter((a) => a.startsWith('0x')))]\n for (let i = 0; i < uniq.length; i += COINGECKO_CHUNK) {\n const chunk = uniq.slice(i, i + COINGECKO_CHUNK)\n const url = `https://api.coingecko.com/api/v3/simple/token_price/${encodeURIComponent(platform)}?contract_addresses=${chunk.join(',')}&vs_currencies=usd`\n try {\n const proxy = getCoingeckoProxyUrl()\n const r = proxy\n ? await fetch(proxy, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify({platform, contractAddresses: chunk}),\n })\n : await fetch(url, {cache: 'no-store'})\n if (!r.ok) continue\n const j = (await r.json()) as Record<string, { usd?: number } | undefined>\n for (const [addr, row] of Object.entries(j)) {\n const u = row?.usd\n if (typeof u === 'number' && Number.isFinite(u) && u >= 0) out.set(addr.toLowerCase(), u)\n }\n } catch {\n /* ignore */\n }\n }\n return out\n}\n\nexport type EulerV2PortfolioUsdSnapshot = {\n totalSuppliedUsd: number | null\n totalBorrowedUsd: number | null\n netAssetValueUsd: number | null\n /** True when any non-zero position lacked a CoinGecko USD price. */\n partialPricing: boolean\n /** No CoinGecko `platform` mapping for this chain — USD not available. */\n pricingUnavailable: boolean\n error: string | null\n}\n\nfunction sumSideUsd(args: {\n byAssetWei: Map<string, bigint>\n decimalsByAsset: Map<string, number>\n prices: Map<string, number>\n}): { usd: number | null; partial: boolean } {\n let partial = false\n let total = 0\n let anyPriced = false\n let anyUnpricedNonZero = false\n\n /** Non-zero wei entries only; keys with permanent 0 wei pollute Maps and wrongly drove “all unpriced” null before. */\n const entries = [...args.byAssetWei.entries()].filter(([, w]) => w > 0n)\n if (entries.length === 0) return { usd: 0, partial: false }\n\n for (const [assetLow, wei] of entries) {\n const dec = args.decimalsByAsset.get(assetLow) ?? 18\n const p = args.prices.get(assetLow)\n if (p == null) {\n partial = true\n anyUnpricedNonZero = true\n continue\n }\n let humanAmt: number\n try {\n humanAmt = Number.parseFloat(formatUnits(wei, dec))\n } catch {\n partial = true\n anyUnpricedNonZero = true\n continue\n }\n const slice = humanAmt * p\n if (!Number.isFinite(humanAmt) || !Number.isFinite(p) || !Number.isFinite(slice)) {\n partial = true\n anyUnpricedNonZero = true\n continue\n }\n anyPriced = true\n total += slice\n }\n\n if (anyUnpricedNonZero && !anyPriced) return { usd: null, partial: true }\n if (anyUnpricedNonZero) partial = true\n if (!Number.isFinite(total)) return { usd: null, partial: true }\n return { usd: total, partial }\n}\n\n/**\n * Supplied (deposit vault shares → assets), borrowed (`debtOf`), and NAV in USD via CoinGecko token prices.\n * Best-effort: chains without CoinGecko platform mapping return `pricingUnavailable`.\n */\nexport async function loadEulerV2PortfolioUsdSnapshot(args: {\n chainId: number\n rpcUrl: string\n mainAddress: Address\n}): Promise<EulerV2PortfolioUsdSnapshot> {\n const rpc = args.rpcUrl.trim()\n const empty: EulerV2PortfolioUsdSnapshot = {\n totalSuppliedUsd: null,\n totalBorrowedUsd: null,\n netAssetValueUsd: null,\n partialPricing: false,\n pricingUnavailable: false,\n error: null,\n }\n if (!rpc) {\n return { ...empty, error: 'No RPC URL.' }\n }\n\n const platform = COINGECKO_PLATFORM_BY_CHAIN_ID[String(args.chainId)]\n\n try {\n const mainLower = args.mainAddress.toLowerCase()\n const { deposits, borrows } = await gqlTrackingAccount(args.chainId, mainLower)\n const client = publicClient(args.chainId, rpc)\n\n const suppliedWeiByAsset = new Map<string, bigint>()\n const borrowedWeiByAsset = new Map<string, bigint>()\n\n type Pair = { subAccount: Address; vault: Address }\n const borrowPairSeen = new Set<string>()\n const borrowPairs: Pair[] = []\n const pushBorrowPair = (sub: Address, vault: Address) => {\n const k = `${sub.toLowerCase()}-${vault.toLowerCase()}`\n if (borrowPairSeen.has(k)) return\n borrowPairSeen.add(k)\n borrowPairs.push({ subAccount: sub, vault })\n }\n\n const supplyReads: Promise<void>[] = []\n for (const entry of deposits) {\n const p = parseEulerTrackingBorrowEntry(entry)\n if (!p) continue\n pushBorrowPair(p.subAccount, p.borrowVault)\n supplyReads.push(\n (async () => {\n const r = await readSupplyUnderlyingWei(client, p.borrowVault, p.subAccount)\n if (!r) return\n mergeWei(suppliedWeiByAsset, r.asset, r.wei)\n })(),\n )\n }\n for (const entry of borrows) {\n const p = parseEulerTrackingBorrowEntry(entry)\n if (!p) continue\n pushBorrowPair(p.subAccount, p.borrowVault)\n }\n\n const borrowReads: Promise<void>[] = borrowPairs.map(\n ({ subAccount, vault }) =>\n (async () => {\n const r = await readBorrowDebtWei(client, vault, subAccount)\n if (!r) return\n mergeWei(borrowedWeiByAsset, r.asset, r.wei)\n })(),\n )\n\n await Promise.all([...supplyReads, ...borrowReads])\n\n /** Price / decimals only assets with non-zero supply or borrowed wei (avoids junk keys). */\n const allAssets = new Set<string>()\n for (const [a, w] of suppliedWeiByAsset) if (w > 0n) allAssets.add(a.toLowerCase())\n for (const [a, w] of borrowedWeiByAsset) if (w > 0n) allAssets.add(a.toLowerCase())\n const decimalsByAsset = new Map<string, number>()\n for (const low of allAssets) {\n if (!isAddress(low)) continue\n const dec = await decimalsForAsset(client, getAddress(low as `0x${string}`))\n decimalsByAsset.set(low.toLowerCase(), dec)\n }\n\n const prices =\n platform != null\n ? await fetchCoingeckoTokenUsdByContract({\n chainId: args.chainId,\n contractAddressesLower: [...allAssets],\n })\n : new Map<string, number>()\n\n if (platform != null && allAssets.size > 0) {\n await augmentMissingTokenPrices({\n platform,\n addressesLower: [...allAssets],\n prices,\n })\n }\n\n const s = sumSideUsd({ byAssetWei: suppliedWeiByAsset, decimalsByAsset, prices })\n const b = sumSideUsd({ byAssetWei: borrowedWeiByAsset, decimalsByAsset, prices })\n\n const sUsd = s.usd != null && Number.isFinite(s.usd) ? s.usd : null\n const bUsd = b.usd != null && Number.isFinite(b.usd) ? b.usd : null\n\n let nav: number | null = null\n if (sUsd != null && bUsd != null) nav = sUsd - bUsd\n else if (sUsd != null && (borrowedWeiByAsset.size === 0 || [...borrowedWeiByAsset.values()].every((w) => w === 0n))) {\n nav = sUsd\n } else if (\n bUsd != null &&\n (suppliedWeiByAsset.size === 0 || [...suppliedWeiByAsset.values()].every((w) => w === 0n))\n ) {\n nav = -bUsd\n }\n if (nav != null && !Number.isFinite(nav)) nav = null\n\n const hasAnyPosition = [...suppliedWeiByAsset.values(), ...borrowedWeiByAsset.values()].some((w) => w > 0n)\n const partialPricing = s.partial || b.partial\n const pricingUnavailable = platform == null && hasAnyPosition\n\n return {\n totalSuppliedUsd: sUsd,\n totalBorrowedUsd: bUsd,\n netAssetValueUsd: nav,\n partialPricing: platform != null && partialPricing,\n pricingUnavailable,\n error: null,\n }\n } catch (e) {\n return {\n ...empty,\n error: e instanceof Error ? e.message : 'Could not load portfolio.',\n }\n }\n}\n","import { EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID } from './eulerV2Subgraph'\n\nlet cached: ReadonlySet<number> | null = null\n\n/**\n * Euler V2: EVM chain IDs that have a Goldsky subgraph endpoint listed in Euler docs.\n * @see https://docs.euler.finance/developers/data-querying/subgraphs\n */\nexport function loadEulerV2SupportedChainIds(): Promise<ReadonlySet<number>> {\n if (cached) return Promise.resolve(cached)\n cached = new Set(Object.keys(EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID).map((k) => Number(k)))\n return Promise.resolve(cached)\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'\nexport * from './eulerV2Subgraph.js'\nexport * from './eulerV2LendMarkets.js'\nexport * from './eulerV2EarnMarkets.js'\nexport * from './eulerV2BorrowPositionsLoad.js'\nexport * from './eulerV2LendSupplyPositionsLoad.js'\nexport * from './eulerV2BorrowRiskOnChain.js'\nexport * from './eulerV2VaultCapsOnChain.js'\nexport * from './eulerReulVestingOnChain.js'\nexport * from './eulerLabelsProducts.js'\nexport * from './eulerV2PortfolioUsd.js'\nexport * from './loadEulerV2SupportedChainIds.js'\nexport * from './eulerV2LendUi.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"]}
|
|
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/core/defiProxy.ts","../../../../src/protocols/evm/aave-v4/api.ts","../../../../src/protocols/evm/euler-v2/eulerV2VaultCapsOnChain.ts","../../../../src/protocols/evm/euler-v2/eulerV2Subgraph.ts","../../../../src/protocols/evm/euler-v2/eulerLabelsProducts.ts","../../../../src/protocols/evm/euler-v2/eulerV2LendMarkets.ts","../../../../src/protocols/evm/euler-v2/eulerV2Discovery.ts","../../../../src/protocols/evm/euler-v2/eulerV2EarnMarkets.ts","../../../../src/protocols/evm/euler-v2/eulerV2BorrowRiskOnChain.ts","../../../../src/protocols/evm/euler-v2/eulerV2BorrowPositionsLoad.ts","../../../../src/protocols/evm/euler-v2/eulerV2LendSupplyPositionsLoad.ts","../../../../src/protocols/evm/euler-v2/eulerReulVestingOnChain.ts","../../../../src/chains/evm/coingecko.ts","../../../../src/protocols/evm/euler-v2/eulerV2PortfolioUsd.ts","../../../../src/protocols/evm/euler-v2/loadEulerV2SupportedChainIds.ts","../../../../src/protocols/evm/euler-v2/index.ts"],"names":["publicClient","getAddress","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","http","erc4626WithdrawAbi","parseAbi","encodeFunctionData","parseUnits","EULER_ERC20_APPROVE_FALLBACK","EULER_WETH_DEPOSIT_FALLBACK","wethDepositAbi","erc20AllowanceAbi","erc20ApproveAbi","erc4626DepositAbi","evcAbi","r","isAddress","formatUnits","UINT256_MAX","checksumHex","erc20DecimalsAbi","erc4626MaxWithdrawAbi","metaClient","VAULTS_FOR_EVAULTS","vaultSupplyAbi","debtOfAbi","readSupplyUnderlyingWei"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","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 | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\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 registryHint =\n typeof (args as { _registryUnderlyingDecimals?: number })._registryUnderlyingDecimals === 'number'\n ? (args as { _registryUnderlyingDecimals?: number })._registryUnderlyingDecimals\n : undefined\n const onChainDec = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const dec = Number(onChainDec)\n if (registryHint != null && registryHint !== dec) {\n /* token registry hint validated against on-chain decimals */\n }\n const amountWei = parseUnits(args.amountHuman, dec)\n if (amountWei === 0n) throw new Error('Amount is zero after converting with token decimals.')\n\n const 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","/**\n * Optional browser → Next.js API proxy paths for DeFi upstream calls.\n * Set once from continuumdao-node-app client bootstrap.\n */\n\nlet aaveGraphqlProxyUrl: string | undefined\nlet eulerGraphqlProxyUrl: string | undefined\nlet mapleGraphqlProxyUrl: string | undefined\nlet morphoGraphqlProxyUrl: string | undefined\nlet coingeckoProxyUrl: string | undefined\n\nexport function setAaveGraphqlProxyUrl(url: string | undefined): void {\n aaveGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getAaveGraphqlProxyUrl(): string | undefined {\n return aaveGraphqlProxyUrl\n}\n\nexport function setEulerGraphqlProxyUrl(url: string | undefined): void {\n eulerGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getEulerGraphqlProxyUrl(): string | undefined {\n return eulerGraphqlProxyUrl\n}\n\nexport function setMapleGraphqlProxyUrl(url: string | undefined): void {\n mapleGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMapleGraphqlProxyUrl(): string | undefined {\n return mapleGraphqlProxyUrl\n}\n\nexport function setMorphoGraphqlProxyUrl(url: string | undefined): void {\n morphoGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoGraphqlProxyUrl(): string | undefined {\n return morphoGraphqlProxyUrl\n}\n\nexport function setCoingeckoProxyUrl(url: string | undefined): void {\n coingeckoProxyUrl = url?.trim() || undefined\n}\n\nexport function getCoingeckoProxyUrl(): string | undefined {\n return coingeckoProxyUrl\n}\n\nexport async function postJsonViaOptionalProxy<T>(args: {\n directUrl: string\n body: unknown\n proxyUrl?: string\n proxyEnvelope?: unknown\n}): Promise<T> {\n const proxy = args.proxyUrl?.trim()\n if (proxy) {\n const r = await fetch(proxy, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.proxyEnvelope ?? args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `Proxy HTTP ${r.status}: ${t.slice(0, 200)}` : `Proxy HTTP ${r.status}`)\n }\n return (await r.json()) as T\n }\n const r = await fetch(args.directUrl, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `HTTP ${r.status}: ${t.slice(0, 200)}` : `HTTP ${r.status}`)\n }\n return (await r.json()) as T\n}\n","import { getAddress, isAddress } from 'viem'\nimport { getAaveGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\n\nexport const AAVE_V4_GRAPHQL_URL = 'https://api.v4.aave.com/graphql'\n\ntype GqlError = { message?: string }\n\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nexport async function aaveV4Gql<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n const body = { query, variables: variables ?? {} }\n const j = await postJsonViaOptionalProxy<GqlData<T> & { errors?: GqlError[] }>({\n directUrl: AAVE_V4_GRAPHQL_URL,\n body,\n proxyUrl: getAaveGraphqlProxyUrl(),\n proxyEnvelope: body,\n })\n if (j.errors?.length) {\n const msg = j.errors.map((e) => e.message ?? 'Unknown').join('; ')\n throw new Error(msg)\n }\n if (j.data == null) {\n throw new Error('Aave V4 API: empty response')\n }\n return j.data\n}\n\ntype ChainRowV4 = { chainId: number; name?: string | null; nativeWrappedToken?: string | null }\n\nexport async function fetchAaveV4Chains(): Promise<readonly ChainRowV4[]> {\n const d = await aaveV4Gql<{ chains: ChainRowV4[] }>(`\n query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }\n `, { c: { query: { filter: 'ALL' } } })\n return d.chains ?? []\n}\n\n/**\n * Aave v4: supported EVM chain IDs (from {@link fetchAaveV4Chains}).\n */\nexport async function loadAaveV4SupportedChainIdsFromV4Api(): Promise<ReadonlySet<number>> {\n const rows = await fetchAaveV4Chains()\n const s = new Set<number>()\n for (const c of rows) s.add(c.chainId)\n return s\n}\n\nconst RESERVES_ADDRESS_FRAGMENT = `\n asset { underlying { address } }\n`\n\nexport type V4ReservesListRow = {\n id: string\n onChainId?: string | null\n spoke?: {\n address: string\n name?: string | null\n liquidationConfig?: { targetHealthFactor: string; healthFactorForMaxBonus: string } | null\n } | null\n summary: {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n }\n userState: {\n balance: { amount: { value: string; decimals: number } } | null\n borrowable?: { amount: { value: string; decimals: number } } | null\n } | null\n}\n\nexport function aggregateV4SupplyDisplay(\n symbolForDisplay: string,\n rows: readonly V4ReservesListRow[],\n): {\n depositedAmount: string\n apy: string\n totalDeposits: string\n availableLiquidity: string\n} {\n const sym = (symbolForDisplay ?? '').trim()\n const withSuffix = (n: string) => (n === '—' ? '—' : sym ? `${n} ${sym}` : n)\n\n if (!rows.length) {\n return { depositedAmount: '—', apy: '—', totalDeposits: '—', availableLiquidity: '—' }\n }\n\n const apy = formatV4SupplyApy(rows)\n\n const sumKey = (key: 'supplied' | 'borrowed') =>\n sumNumberValues(\n rows.map((r) => {\n const v = key === 'supplied' ? r.summary?.supplied?.amount : r.summary?.borrowed?.amount\n return (v?.value ?? '').trim()\n }),\n )\n\n const totalSupN = sumKey('supplied')\n const totalBorN = sumKey('borrowed')\n const totalDeposits =\n totalSupN == null ? '—' : withSuffix(formatAaveV4TokenAmount(totalSupN))\n\n const availableLiquidity = (() => {\n if (totalSupN == null || totalBorN == null) return '—'\n const a = totalSupN - totalBorN\n if (!Number.isFinite(a)) return '—'\n return withSuffix(formatAaveV4TokenAmount(a < 0 ? 0 : a))\n })()\n\n const userN = userSupplyBalanceNumber(rows)\n const depositedAmount = userN == null ? '—' : withSuffix(formatAaveV4TokenAmount(userN))\n\n return { depositedAmount, apy, totalDeposits, availableLiquidity }\n}\n\nfunction sumNumberValues(values: ReadonlyArray<string>): number | null {\n if (!values.length) return null\n let s = 0\n for (const v of values) {\n const n = parseFloat(v)\n if (Number.isFinite(n)) s += n\n }\n return s\n}\n\n/**\n * Formats a token notional for display: uses k (≥1k) and M (≥1M) with a few decimal places, otherwise limited decimals.\n * Safe to reuse outside the Aave V4 dialog (e.g. tables, tooltips).\n */\nexport function formatAaveV4TokenAmount(n: number): string {\n if (!Number.isFinite(n)) return '—'\n if (n === 0) return '0'\n const sign = n < 0 ? '-' : ''\n const a = Math.abs(n)\n const strip = (s: string) => s.replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, '')\n\n if (a >= 1_000_000) {\n return sign + strip((a / 1_000_000).toFixed(2)) + 'M'\n }\n if (a >= 1000) {\n const k = a / 1000\n const d = k >= 100 ? 1 : 2\n return sign + strip(k.toFixed(d)) + 'k'\n }\n if (a >= 1) {\n return sign + strip(a.toFixed(2))\n }\n if (a >= 0.0001) {\n return sign + strip(a.toFixed(4))\n }\n return sign + a.toExponential(2)\n}\n\n/**\n * Human-readable notional for Aave v4 API decimal strings (reserve amounts, user debt, etc.).\n * Use this for all “display from GraphQL `value`” paths so formatting stays consistent.\n */\nexport function formatAaveV4AmountHumanFromApiString(raw: string | null | undefined): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = parseFloat(s)\n if (!Number.isFinite(n)) return '—'\n return formatAaveV4TokenAmount(n)\n}\n\n/**\n * Unnamed reserve liquidity: supplied − borrowed (both API decimal strings, same unit).\n */\nexport function formatAaveV4ReserveLiquidityFromSummary(args: {\n suppliedValue: string | null | undefined\n borrowedValue: string | null | undefined\n}): string {\n const a = parseFloat(String(args.suppliedValue ?? '').trim())\n const b = parseFloat(String(args.borrowedValue ?? '').trim())\n if (!Number.isFinite(a) || !Number.isFinite(b)) return '—'\n return formatAaveV4TokenAmount(Math.max(0, a - b))\n}\n\nfunction userSupplyBalanceNumber(rows: readonly V4ReservesListRow[]): number | null {\n const vals = rows\n .map((r) => (r.userState?.balance?.amount?.value ?? '').trim())\n .filter((v) => v.length > 0)\n if (!vals.length) return null\n const u = new Set(vals)\n if (u.size === 1) {\n const n = parseFloat(vals[0]!)\n return Number.isFinite(n) ? n : null\n }\n const sum = vals.reduce((acc, b) => acc + (parseFloat(b) || 0), 0)\n return Number.isFinite(sum) ? sum : null\n}\n\nfunction formatV4SupplyApy(rows: readonly V4ReservesListRow[]): string {\n if (!rows.length) return '—'\n const weighted: { w: number; apy: number }[] = []\n for (const r of rows) {\n const sup = parseFloat((r.summary?.supplied?.amount?.value ?? '').trim())\n const norm = (r.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(norm)\n if (Number.isFinite(n) && Number.isFinite(sup) && sup > 0) {\n weighted.push({ w: sup, apy: n })\n }\n }\n if (weighted.length) {\n const tw = weighted.reduce((a, x) => a + x.w, 0)\n if (tw > 0) {\n const x = weighted.reduce((a, x) => a + x.w * x.apy, 0) / tw\n if (x >= 0.01) return `${x.toFixed(2)}%`\n if (x > 0) return `${x.toFixed(4)}%`\n return '0%'\n }\n }\n const any = (rows[0]?.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(any)\n if (!Number.isFinite(n)) return '—'\n if (n >= 0.01) return `${n.toFixed(2)}%`\n if (n > 0) return `${n.toFixed(4)}%`\n return '0%'\n}\n\nexport async function fetchAaveV4NativeWrappedToken(chainId: number): Promise<string | null> {\n const all = await fetchAaveV4Chains()\n const c = all.find((x) => x.chainId === chainId)\n const t = (c?.nativeWrappedToken ?? '').trim()\n if (t && isAddress(t)) return getAddress(t)\n return null\n}\n\n/**\n * All underlying token addresses (lowercased checksummed form for lookup: store lowercase) listed as reserves on the chain.\n */\nexport async function fetchAaveV4SupportedUnderlyingAddressSet(chainId: number): Promise<ReadonlySet<string>> {\n const d = await aaveV4Gql<{\n reserves: ReadonlyArray<{ asset: { underlying: { address: string } } }>\n }>(\n `\n query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }\n `,\n {\n r: {\n query: { chainIds: [chainId] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n const s = new Set<string>()\n for (const r of d.reserves ?? []) {\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (a && isAddress(a)) s.add(a.toLowerCase())\n }\n return s\n}\n\nfunction erc20Input(address: `0x${string}`, chainId: number) {\n return { address, chainId }\n}\n\nexport async function fetchAaveV4ReservesForUnderlying(args: {\n chainId: number\n underlying: `0x${string}`\n user?: `0x${string}` | null\n}): Promise<readonly V4ReservesListRow[]> {\n const d = await aaveV4Gql<{ reserves: V4ReservesListRow[] }>(\n `\n query S($r: ReservesRequest!) {\n reserves(request: $r) {\n id\n onChainId\n spoke { address name liquidationConfig { targetHealthFactor healthFactorForMaxBonus } }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n }\n userState {\n balance { amount { value decimals } }\n borrowable { amount { value decimals } }\n }\n }\n }\n `,\n {\n r: {\n query: { tokens: [erc20Input(args.underlying, args.chainId)] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n ...(args.user ? { user: args.user } : {}),\n },\n },\n )\n return d.reserves ?? []\n}\n\n/**\n * Reserve row for a hub asset on the same Aave v4 **Spoke** as the user’s collateral (same as {@link useAaveV4DepositCollateralInfo}’s `collateralForAsset`).\n * Needed so borrow/repay multi-sign uses the same spoke as the user’s position.\n */\nexport function pickAaveV4ReserveRowForSpoke(\n rows: readonly V4ReservesListRow[],\n spokeAddress: `0x${string}`,\n): V4ReservesListRow | null {\n const want = getAddress(spokeAddress).toLowerCase()\n for (const r of rows) {\n const a = (r.spoke?.address ?? '').trim()\n if (!a) continue\n try {\n if (getAddress(a as `0x${string}`).toLowerCase() === want) return r\n } catch {\n continue\n }\n }\n return null\n}\n\nexport function aaveV4KeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n\ntype AaveV4ChainTokenCache = {\n supportedUnderlying: ReadonlySet<string>\n nativeWrapped: string | null\n}\n\nconst aaveV4ChainTokenCache = new Map<number, Promise<AaveV4ChainTokenCache>>()\n\n/**\n * Fetches and caches (per process) the list of Aave v4 underlying addresses on a chain and the wrapped native token.\n */\nexport function ensureAaveV4ChainTokenCache(chainId: number): Promise<AaveV4ChainTokenCache> {\n const hit = aaveV4ChainTokenCache.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const [nativeWrapped, supportedUnderlying] = await Promise.all([\n fetchAaveV4NativeWrappedToken(chainId),\n fetchAaveV4SupportedUnderlyingAddressSet(chainId),\n ])\n return { supportedUnderlying, nativeWrapped }\n })()\n aaveV4ChainTokenCache.set(chainId, p)\n return p\n}\n\n// —— Hubs, collateral, borrowable (per UI “market” / Aave v4 pool) ——————————————\n\n/** UI market segment; maps to Aave v4 `Hub` by name (e.g. Plus ≈ “Main”, Core, Prime ≈ “Bluechip”). */\nexport type AaveV4UiMarketId = 'main' | 'core' | 'bluechip'\n\nexport type AaveV4Hub = {\n name: string\n address: `0x${string}`\n chain: { chainId: number; name?: string | null }\n}\n\n/** `summary` is included for hub `reserves` (market borrow/supply TVL, APYs). */\nexport type AaveV4HubReserveSummary = {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n borrowApy: { normalized: string; value: string }\n}\n\nexport type AaveV4HubReserve = {\n canBorrow: boolean\n canUseAsCollateral: boolean\n canSupply: boolean\n /** Spoke contract to call for `supply` on this reserve. */\n spoke: { address: string } | null\n settings: {\n borrowable: boolean\n collateral: boolean\n collateralFactor: { normalized: string; value: string }\n collateralRisk: { normalized: string; value: string }\n }\n asset: {\n underlying: {\n address: string\n info: { name: string; symbol: string; icon: string | null } | null\n }\n }\n /** Present when using the extended hub reserves query (borrow tab, market TVL). */\n summary?: AaveV4HubReserveSummary | null\n}\n\nconst aaveV4HubsByChain = new Map<number, Promise<readonly AaveV4Hub[]>>()\nconst aaveV4HubReserves = new Map<string, Promise<readonly AaveV4HubReserve[]>>()\n\nfunction hubReservesKey(chainId: number, hub: `0x${string}`) {\n return `v3spoke+summary:${chainId}:${hub.toLowerCase()}`\n}\n\nexport async function fetchAaveV4HubsForChain(chainId: number): Promise<readonly AaveV4Hub[]> {\n const hit = aaveV4HubsByChain.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ hubs: AaveV4Hub[] }>(\n `query F($h: HubsRequest!) { hubs(request: $h) { name address chain { chainId name } } }`,\n { h: { query: { chainIds: [chainId] } } },\n )\n const out = (d.hubs ?? []).map((h) => ({\n name: h.name,\n address: getAddress((h.address ?? '').trim() as `0x${string}`) as `0x${string}`,\n chain: h.chain,\n }))\n return out\n })()\n aaveV4HubsByChain.set(chainId, p)\n return p\n}\n\n/**\n * Resolves which Aave v4 hub (Core / Plus / Prime, etc.) a UI “market” refers to.\n * Main → Plus, Core → Core, Bluechip → Prime.\n */\nexport function resolveAaveV4HubForUiMarket(\n hubs: readonly AaveV4Hub[],\n market: AaveV4UiMarketId,\n chainId: number,\n): AaveV4Hub | null {\n const on = hubs.filter((h) => h.chain.chainId === chainId)\n if (!on.length) return null\n const find = (names: string[]) => {\n const set = new Set(names.map((n) => n.toLowerCase()))\n return on.find((h) => set.has((h.name ?? '').trim().toLowerCase())) ?? null\n }\n if (market === 'core') return find(['core'])\n if (market === 'bluechip') return find(['prime', 'bluechip', 'institutional'])\n // main: prefer Plus; fall back to common names, then first hub\n return find(['plus', 'main', 'default']) ?? on[0] ?? null\n}\n\n/**\n * Inverse of {@link resolveAaveV4HubForUiMarket} label mapping, for switching UI market when a hub is chosen by\n * “first hub on chain that lists this underlying”.\n */\nexport function aaveV4UiMarketIdForHubName(hubName: string): AaveV4UiMarketId {\n const n = (hubName ?? '').trim().toLowerCase()\n if (n === 'core') return 'core'\n if (n === 'plus' || n === 'main' || n === 'default') return 'main'\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 'bluechip'\n return 'main'\n}\n\n/**\n * When more than one hub lists the same underlying, the ideal hub is the one that matches the user’s *actual*\n * position (supply/debt on that hub’s Spoke). We don’t have that signal here, so we use a **deterministic** order after\n * {@link aaveV4UiMarketIdForHubName}: Core → Main/Plus → Bluechip/Prime (then name) so the choice is not tied to\n * GraphQL list order. Callers with wallet/user data can later prefer a hub whose Spoke appears in\n * `fetchAaveV4ReservesForUnderlying` with non-zero `userState`.\n */\nfunction aaveV4HubAutoPickTiebreakOrder(a: AaveV4Hub, b: AaveV4Hub): number {\n const rank = (name: string) => {\n const n = (name ?? '').trim().toLowerCase()\n if (n === 'core') return 0\n if (n === 'plus' || n === 'main' || n === 'default') return 1\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 2\n return 3\n }\n const ra = rank(a.name)\n const rb = rank(b.name)\n if (ra !== rb) return ra - rb\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n}\n\ntype AaveV4HubCollateralCandidate = {\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n}\n\n/**\n * Sort key for “which borrow is cheaper” on a **debt** reserve row. Lower is better; missing data sorts last.\n */\nfunction aaveV4HubReserveBorrowApyForSort(r: AaveV4HubReserve | null | undefined): number {\n if (!r) return Number.POSITIVE_INFINITY\n const norm = parseFloat((r.summary?.borrowApy?.normalized ?? '').trim())\n if (Number.isFinite(norm) && norm >= 0) return norm\n const v = parseFloat((r.summary?.borrowApy?.value ?? '').trim())\n if (Number.isFinite(v) && v >= 0) {\n if (v > 0 && v <= 1) return v * 100\n return v\n }\n return Number.POSITIVE_INFINITY\n}\n\n/**\n * `summary.suppliable` on a reserve is pool liquidity for borrowing that asset (human-notional, same units as\n * {@link formatAaveV4AmountHumanFromApiString}).\n */\nfunction aaveV4SuppliableHumanFromHubReserve(r: AaveV4HubReserve | null | undefined): number | null {\n if (!r) return null\n const n = parseFloat((r.summary?.suppliable?.amount?.value ?? '').trim())\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\n/**\n * The selected UI market maps to a single hub, but a token may only be listed in another hub (e.g. WETH in Core, not\n * Plus on Ethereum). Returns a hub on this chain where this underlying appears in hub reserves, so Spoke and\n * collateral can be resolved.\n *\n * **When no debt hint:** `preferHub` is tried first, then other hubs in {@link aaveV4HubAutoPickTiebreakOrder} order.\n *\n * **When `debtUnderlying` is set (user chose a debt asset on the borrow flow):** among hubs that list **both** the\n * **collateral** and that **debt** as borrowable, the hub with the **lowest debt borrow APY** is chosen. If\n * `debtBorrowAmountHumanForLiquidity` is a positive number string, we **prefer** hubs where `suppliable` on the debt\n * reserve is at least that amount; if none satisfy that, the lowest-APY hub among all debt-backed candidates is\n * used anyway.\n */\nexport async function findAaveV4HubReserveForChainUnderlying(args: {\n chainId: number\n hubs: readonly AaveV4Hub[]\n underlying: `0x${string}`\n /** Tried first; if the asset is not listed here, other hubs on the same chain are scanned. */\n preferHub: AaveV4Hub\n /** If set, disambiguate using this debt asset’s `borrowAPY` (and optional liquidity) per hub. */\n debtUnderlying?: `0x${string}` | null\n /**\n * When set, used with `debtUnderlying` to prefer hubs with enough `suppliable` on the debt line for a borrow\n * of that size (human amount; commas may be included).\n */\n debtBorrowAmountHumanForLiquidity?: string | null\n}): Promise<{\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n} | null> {\n const onChain = args.hubs.filter((h) => h.chain.chainId === args.chainId)\n if (!onChain.length) return null\n const prefer = getAddress(args.preferHub.address) as `0x${string}`\n const order = (() => {\n const rest = onChain\n .filter((h) => getAddress(h.address) !== prefer)\n .sort(aaveV4HubAutoPickTiebreakOrder)\n const first = onChain.find((h) => getAddress(h.address) === prefer)\n return first ? [first, ...rest] : rest\n })()\n\n const candidates: AaveV4HubCollateralCandidate[] = []\n for (const h of order) {\n const rows = await fetchAaveV4HubReserves({ chainId: args.chainId, hubAddress: h.address as `0x${string}` })\n const c = findHubReserveForUnderlying(rows, args.underlying)\n if (c) candidates.push({ hub: h, hubReserves: rows, reserve: c })\n }\n if (!candidates.length) return null\n\n const noDebt = (): AaveV4HubCollateralCandidate => candidates[0]!\n\n const rawDebt = (args.debtUnderlying ?? '').trim()\n if (!rawDebt || !isAddress(rawDebt)) {\n return noDebt()\n }\n const debtU = getAddress(rawDebt) as `0x${string}`\n\n const withDebt = candidates\n .map((c) => {\n const dr = findHubReserveForUnderlying(c.hubReserves, debtU)\n return { ...c, debtReserve: dr }\n })\n .filter(\n (x): x is AaveV4HubCollateralCandidate & { debtReserve: AaveV4HubReserve } =>\n x.debtReserve != null &&\n x.debtReserve.canBorrow === true &&\n x.debtReserve.settings?.borrowable === true,\n )\n if (!withDebt.length) {\n return noDebt()\n }\n\n const amountRaw = (args.debtBorrowAmountHumanForLiquidity ?? '')\n .trim()\n .replace(/,/g, '')\n const wantN = amountRaw && parseFloat(amountRaw) > 0 ? parseFloat(amountRaw) : null\n\n const sortKey = (a: (typeof withDebt)[0], b: (typeof withDebt)[0]): number => {\n const d = aaveV4HubReserveBorrowApyForSort(a.debtReserve) - aaveV4HubReserveBorrowApyForSort(b.debtReserve)\n if (d !== 0) return d\n const pa = getAddress(a.hub.address) === prefer ? 0 : 1\n const pb = getAddress(b.hub.address) === prefer ? 0 : 1\n if (pa !== pb) return pa - pb\n return aaveV4HubAutoPickTiebreakOrder(a.hub, b.hub)\n }\n\n if (wantN == null) {\n withDebt.sort(sortKey)\n const x = withDebt[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n }\n\n const sufficient = withDebt.filter((c) => {\n const s = aaveV4SuppliableHumanFromHubReserve(c.debtReserve)\n return s != null && s + 1e-9 >= wantN\n })\n const pool = sufficient.length ? sufficient : withDebt\n pool.sort(sortKey)\n const x = pool[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n}\n\nexport async function fetchAaveV4HubReserves(args: { chainId: number; hubAddress: `0x${string}` }): Promise<readonly AaveV4HubReserve[]> {\n const h = getAddress(args.hubAddress) as `0x${string}`\n const k = hubReservesKey(args.chainId, h)\n const hit = aaveV4HubReserves.get(k)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ reserves: AaveV4HubReserve[] }>(\n `query R($r: ReservesRequest!) {\n reserves(request: $r) {\n canBorrow\n canSupply\n canUseAsCollateral\n spoke { address }\n settings {\n borrowable\n collateral\n collateralFactor { normalized value }\n collateralRisk { normalized value }\n }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n borrowApy { normalized value }\n }\n asset { underlying { address info { name symbol icon } } }\n }\n }`,\n {\n r: {\n query: { hub: { address: h, chainId: args.chainId } },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n return d.reserves ?? []\n })()\n aaveV4HubReserves.set(k, p)\n return p\n}\n\n/**\n * LTV you can borrow against a unit of this asset, e.g. \"90%\".\n */\nexport function formatAaveV4PercentDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = (normalized ?? '').trim()\n if (n) {\n const f = parseFloat(n)\n if (!Number.isFinite(f)) return '—'\n if (f === 0) return '—'\n if (f % 1 === 0) return `${f.toFixed(0)}%`\n return `${f >= 10 ? f.toFixed(0) : f >= 1 ? f.toFixed(1).replace(/\\.0$/, '') : f.toFixed(2).replace(/\\.?0+$/, '')}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${Math.round(v * 100)}%`\n }\n return '—'\n}\n\n/**\n * Collateral / protocol risk on the same 0–100 style scale as the API, or a plain label if zero/empty.\n */\nexport function formatAaveV4RiskDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = parseFloat((normalized ?? '').trim())\n if (Number.isFinite(n) && n > 0) {\n return n >= 0.01 ? `${n.toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%` : `${n.toFixed(4)}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${(v * 100).toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%`\n }\n return 'Low'\n}\n\nexport function findHubReserveForUnderlying(\n list: readonly AaveV4HubReserve[],\n underlying: `0x${string}`,\n): AaveV4HubReserve | null {\n const t = getAddress(underlying).toLowerCase()\n return list.find((r) => (r.asset?.underlying?.address ?? '').toLowerCase() === t) ?? null\n}\n\nexport type AaveV4BorrowableDisplay = {\n address: string\n symbol: string\n name: string\n icon: string | null\n}\n\n/**\n * De-duplicated borrowable debt assets in a hub (what users can borrow there).\n */\nexport function borrowableAssetsFromHubReserves(rows: readonly AaveV4HubReserve[]): AaveV4BorrowableDisplay[] {\n const seen = new Set<string>()\n const out: AaveV4BorrowableDisplay[] = []\n for (const r of rows) {\n if (!r.canBorrow || !r.settings?.borrowable) continue\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (!a || !isAddress(a)) continue\n const lo = a.toLowerCase()\n if (seen.has(lo)) continue\n seen.add(lo)\n const info = r.asset?.underlying?.info\n out.push({\n address: getAddress(a as `0x${string}`),\n symbol: (info?.symbol ?? '—').trim() || '—',\n name: (info?.name ?? '').trim() || '—',\n icon: (info?.icon ?? '').trim() || null,\n })\n }\n out.sort((p, q) => p.symbol.localeCompare(q.symbol, undefined, { sensitivity: 'base' }))\n return out\n}\n\nconst USER_BORROWS_HUB = `\n query AaveV4UserBorrowsHub($r: UserBorrowsRequest!) {\n userBorrows(request: $r) {\n debt { amount { value } }\n reserve {\n asset { underlying { address } }\n }\n }\n }\n`\n\n/**\n * Current variable-debt balance per underlying token for this user in the given hub (one entry per asset).\n * Values are API decimal strings; format with {@link formatAaveV4AmountHumanFromApiString}.\n */\nexport async function fetchAaveV4UserBorrowsDebtByUnderlyingForHub(args: {\n user: `0x${string}`\n chainId: number\n hubAddress: `0x${string}`\n}): Promise<ReadonlyMap<string, string>> {\n const u = getAddress(args.user)\n const h = getAddress(args.hubAddress) as `0x${string}`\n const d = await aaveV4Gql<{\n userBorrows: {\n debt: { amount: { value: string } } | null\n reserve: { asset: { underlying: { address: string } } } | null\n }[]\n }>(USER_BORROWS_HUB, {\n r: {\n query: {\n userHub: {\n user: u,\n hub: { input: { address: h, chainId: args.chainId } },\n },\n },\n orderBy: { amount: 'DESC' },\n includeZeroBalances: false,\n },\n })\n const m = new Map<string, string>()\n for (const row of d.userBorrows ?? []) {\n const addr = (row?.reserve?.asset?.underlying?.address ?? '').trim()\n if (!addr) continue\n const lo = getAddress(addr as `0x${string}`).toLowerCase()\n const v = (row?.debt?.amount?.value ?? '').trim()\n if (!v) continue\n const n = parseFloat(v)\n if (!Number.isFinite(n) || n === 0) continue\n const prev = m.get(lo)\n if (prev) {\n const p = parseFloat(prev)\n m.set(lo, String((Number.isFinite(p) ? p : 0) + n))\n } else {\n m.set(lo, v)\n }\n }\n return m\n}\n\nexport type AaveV4BorrowTableRow = {\n address: string\n symbol: string\n name: string\n icon: string | null\n yourBorrowedDisplay: string\n baseBorrowApyDisplay: string\n totalBorrowsDisplay: string\n liquidityDisplay: string\n}\n\n/**\n * One row per borrowable asset in the hub, using shared human-readable formatters.\n */\nexport function buildAaveV4BorrowTableRowsFromHub(\n borrowable: readonly AaveV4BorrowableDisplay[],\n hubReserves: readonly AaveV4HubReserve[] | null,\n /** `undefined` = not loaded or no wallet (show em dash for “your” column). */\n debtByUnderlying: ReadonlyMap<string, string> | undefined,\n): AaveV4BorrowTableRow[] {\n if (!hubReserves?.length) {\n return borrowable.map((b) => ({\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: debtByUnderlying === undefined ? '—' : `0${b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''}`,\n baseBorrowApyDisplay: '—',\n totalBorrowsDisplay: '—',\n liquidityDisplay: '—',\n }))\n }\n return borrowable.map((b) => {\n const lo = b.address.toLowerCase()\n const r = hubReserves.find((x) => (x.asset?.underlying?.address ?? '').toLowerCase() === lo) ?? null\n const s = r?.summary\n const debtRaw = debtByUnderlying?.get(lo) ?? null\n const symSuffix = b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''\n return {\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: (() => {\n if (debtByUnderlying === undefined) return '—'\n if (debtRaw == null || !String(debtRaw).trim()) return `0${symSuffix}`\n const n = parseFloat(String(debtRaw).trim())\n if (!Number.isFinite(n) || n === 0) return `0${symSuffix}`\n return `${formatAaveV4AmountHumanFromApiString(debtRaw)}${symSuffix}`\n })(),\n baseBorrowApyDisplay: formatAaveV4PercentDisplay(\n s?.borrowApy?.normalized,\n s?.borrowApy?.value,\n ),\n totalBorrowsDisplay: s\n ? `${formatAaveV4AmountHumanFromApiString(s.borrowed?.amount?.value)}${symSuffix}`\n : '—',\n liquidityDisplay: s\n ? `${formatAaveV4ReserveLiquidityFromSummary({\n suppliedValue: s.supplied?.amount?.value,\n borrowedValue: s.borrowed?.amount?.value,\n })}${symSuffix}`\n : '—',\n }\n })\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n parseAbi,\n} from 'viem'\n\n/** Resolved cap when EVK `AmountCap` raw word is 0 (“not set”). */\nexport const EULER_EVAULT_CAP_UNLIMITED_WEI = (1n << 256n) - 1n\n\nconst UINT256_MAX = EULER_EVAULT_CAP_UNLIMITED_WEI\n\n/** @deprecated Use {@link EULER_EVAULT_CAP_UNLIMITED_WEI}. */\nexport const EULER_EVAULT_SUPPLY_CAP_UNLIMITED_WEI = EULER_EVAULT_CAP_UNLIMITED_WEI\n\n/**\n * When `true`, {@link fetchEulerVaultOnChainLendMetricsForVaults} drives Lend/Borrow vault gates and UI fields.\n * When `false`, the app uses Goldsky subgraph `eulerVaults` caps and `state` (cash / totalBorrows) instead.\n */\nexport const EULER_V2_PREFER_ON_CHAIN_LEND_METRICS = false\n\nconst eulerVaultLendAbi = parseAbi([\n 'function caps() view returns (uint16 supplyCap, uint16 borrowCap)',\n 'function cash() view returns (uint256)',\n 'function totalBorrows() view returns (uint256)',\n 'function totalAssets() view returns (uint256)',\n])\n\n/**\n * EVK `AmountCap`: raw uint16 0 ⇒ “not set” ⇒ unlimited ({@link UINT256_MAX} wei).\n * See `AmountCapLib.resolve` in euler-vault-kit.\n */\nexport function resolveEulerAmountCapToWei(rawCap16: number | bigint): bigint {\n const amountCap = BigInt(rawCap16) & 0xffffn\n if (amountCap === 0n) return UINT256_MAX\n const exp = amountCap & 63n\n const mantissa = amountCap >> 6n\n return (10n ** exp * mantissa) / 100n\n}\n\n/** @deprecated Use {@link resolveEulerAmountCapToWei}. */\nexport const resolveEulerAmountCapToSupplyWei = resolveEulerAmountCapToWei\n\n/**\n * Goldsky `eulerVaults.supplyCap` / `borrowCap` are the **uint16 AmountCap** words from `caps()`,\n * not resolved underlying wei. Values ≤ `0xffff` must use {@link resolveEulerAmountCapToWei}.\n * Larger values are treated as already-resolved wei.\n */\nexport function eulerSubgraphVaultCapToUnderlyingWei(raw: string | undefined | null): bigint {\n try {\n const v = BigInt((raw ?? '').trim() || '0')\n if (v >= UINT256_MAX - 3n) return v\n if (v <= 0xffffn) return resolveEulerAmountCapToWei(v)\n return v\n } catch {\n return 0n\n }\n}\n\nexport type EulerVaultOnChainLendMetrics = {\n rawSupplyCap16: number\n rawBorrowCap16: number\n supplyCapWei: bigint\n borrowCapWei: bigint\n /** Idle underlying in the vault (matches subgraph `state.cash`). */\n cashWei: bigint\n totalBorrowsWei: bigint\n /** ERC-4626 total assets; used with {@link supplyCapWei} for max new supply. */\n totalAssetsWei: bigint\n}\n\n/**\n * Subgraph caps + `state` fields shaped like {@link fetchEulerVaultOnChainLendMetrics}.\n * Uses `cashWei + totalBorrowsWei` for {@link totalAssetsWei} (same decomposition as the EVK balance sheet the indexer tracks).\n */\nexport function eulerVaultLendMetricsFromIndexerVaultState(args: {\n supplyCapRaw: string | null | undefined\n borrowCapRaw: string | null | undefined\n cashWei: bigint\n totalBorrowsWei: bigint\n totalAssetsWei: bigint\n}): EulerVaultOnChainLendMetrics {\n let rawSupplyCap16 = 0\n let rawBorrowCap16 = 0\n try {\n rawSupplyCap16 = Number(BigInt((args.supplyCapRaw ?? '').trim() || '0') & 0xffffn)\n } catch {\n rawSupplyCap16 = 0\n }\n try {\n rawBorrowCap16 = Number(BigInt((args.borrowCapRaw ?? '').trim() || '0') & 0xffffn)\n } catch {\n rawBorrowCap16 = 0\n }\n return {\n rawSupplyCap16,\n rawBorrowCap16,\n supplyCapWei: eulerSubgraphVaultCapToUnderlyingWei(args.supplyCapRaw),\n borrowCapWei: eulerSubgraphVaultCapToUnderlyingWei(args.borrowCapRaw),\n cashWei: args.cashWei,\n totalBorrowsWei: args.totalBorrowsWei,\n totalAssetsWei: args.totalAssetsWei,\n }\n}\n\nexport function formatEulerResolvedCapOrCashForUi(wei: bigint, decimals: number, symbolSuffix: string): string {\n if (wei >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return 'Unlimited'\n if (wei === 0n) return symbolSuffix ? `0 ${symbolSuffix}` : '0'\n try {\n const s = formatUnits(wei, decimals)\n const n = Number(s)\n if (Number.isFinite(n) && Math.abs(n) >= 1e9) return `${n.toExponential(2)}${symbolSuffix ? ` ${symbolSuffix}` : ''}`\n return symbolSuffix ? `${s} ${symbolSuffix}` : s\n } catch {\n return wei.toString()\n }\n}\n\n/** Max new supply (deposit) wei: headroom under resolved supply cap using on-chain `totalAssets`. */\nexport function eulerVaultMaxNewSupplyWei(metrics: EulerVaultOnChainLendMetrics): bigint {\n const { supplyCapWei, totalAssetsWei } = metrics\n if (supplyCapWei === 0n) return 0n\n if (supplyCapWei >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return EULER_EVAULT_CAP_UNLIMITED_WEI\n if (totalAssetsWei >= supplyCapWei) return 0n\n return supplyCapWei - totalAssetsWei\n}\n\n/** Upper bound for a new borrow: min(cash, borrowCap − totalBorrows) when the borrow cap is finite; `borrowCapWei === 0` disables borrowing. */\nexport function eulerVaultMaxNewBorrowWei(metrics: EulerVaultOnChainLendMetrics): bigint {\n const { cashWei, borrowCapWei, totalBorrowsWei } = metrics\n if (borrowCapWei === 0n) return 0n\n if (borrowCapWei >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return cashWei\n const capLeft = borrowCapWei > totalBorrowsWei ? borrowCapWei - totalBorrowsWei : 0n\n return cashWei < capLeft ? cashWei : capLeft\n}\n\nexport async function fetchEulerVaultOnChainLendMetrics(args: {\n rpcUrl: string\n chainId: number\n evault: Address\n}): Promise<EulerVaultOnChainLendMetrics> {\n const ch = defineChain({\n id: args.chainId,\n name: 'EulerVaultRead',\n nativeCurrency: { decimals: 18, name: 'x', symbol: 'x' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const client = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const addr = getAddress(args.evault)\n const [[supplyRaw, borrowRaw], cashWei, totalBorrowsWei, totalAssetsWei] = await Promise.all([\n client.readContract({\n address: addr,\n abi: eulerVaultLendAbi,\n functionName: 'caps',\n }),\n client.readContract({\n address: addr,\n abi: eulerVaultLendAbi,\n functionName: 'cash',\n }),\n client.readContract({\n address: addr,\n abi: eulerVaultLendAbi,\n functionName: 'totalBorrows',\n }),\n client.readContract({\n address: addr,\n abi: eulerVaultLendAbi,\n functionName: 'totalAssets',\n }),\n ])\n const rs = Number(supplyRaw)\n const rb = Number(borrowRaw)\n return {\n rawSupplyCap16: rs,\n rawBorrowCap16: rb,\n supplyCapWei: resolveEulerAmountCapToWei(rs),\n borrowCapWei: resolveEulerAmountCapToWei(rb),\n cashWei,\n totalBorrowsWei,\n totalAssetsWei,\n }\n}\n\nexport type EulerVaultOnChainLendMetricsResult =\n | { ok: true; data: EulerVaultOnChainLendMetrics }\n | { ok: false; message: string }\n\n/** Batch with bounded concurrency (RPC friendly). */\nexport async function fetchEulerVaultOnChainLendMetricsForVaults(args: {\n rpcUrl: string\n chainId: number\n vaults: readonly { key: string; evault: string }[]\n}): Promise<ReadonlyMap<string, EulerVaultOnChainLendMetricsResult>> {\n const rpc = (args.rpcUrl ?? '').trim()\n const out = new Map<string, EulerVaultOnChainLendMetricsResult>()\n if (!rpc || !args.vaults.length) return out\n\n const concurrency = 8\n let idx = 0\n const list = [...args.vaults]\n async function worker() {\n while (idx < list.length) {\n const i = idx++\n const row = list[i]!\n try {\n const ev = getAddress(row.evault.trim() as `0x${string}`)\n const data = await fetchEulerVaultOnChainLendMetrics({\n rpcUrl: rpc,\n chainId: args.chainId,\n evault: ev,\n })\n out.set(row.key, { ok: true, data })\n } catch (e) {\n out.set(row.key, {\n ok: false,\n message: e instanceof Error ? e.message : 'On-chain read failed',\n })\n }\n }\n }\n await Promise.all(Array.from({ length: Math.min(concurrency, list.length) }, () => worker()))\n return out\n}\n","import { getAddress, isAddress, type Address } from 'viem'\nimport { fetchAaveV4NativeWrappedToken } from '../aave-v4/api.js'\nimport { getEulerGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\nimport { EULER_EVAULT_CAP_UNLIMITED_WEI, eulerSubgraphVaultCapToUnderlyingWei } from './eulerV2VaultCapsOnChain'\n\n/** Goldsky GraphQL endpoints from Euler docs (single hosted project). */\nexport const EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID: Readonly<Record<number, string>> = {\n 1: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-mainnet/latest/gn',\n 8453: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-base/latest/gn',\n 1923: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-swell/latest/gn',\n 146: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-sonic/latest/gn',\n 60808: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-bob/latest/gn',\n 80094: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-berachain/latest/gn',\n 43114: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-avalanche/latest/gn',\n 42161: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-arbitrum/latest/gn',\n 130: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-unichain/latest/gn',\n 57073: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-ink/latest/gn',\n 56: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-bsc/latest/gn',\n 999: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-hyperevm/latest/gn',\n 10: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-optimism/latest/gn',\n 100: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-gnosis/latest/gn',\n 480: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-worldchain/latest/gn',\n 239: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-tac/latest/gn',\n 9745: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-plasma/latest/gn',\n 5000: 'https://api.goldsky.com/api/public/project_cm4iagnemt1wp01xn4gh1agft/subgraphs/euler-v2-mantle/latest/gn',\n}\n\n/**\n * When Aave v4 does not list `nativeWrappedToken` for a chain, we use this canonical wrapped\n * **gas** token (WETH-style, WHYPE, WMNT, WBERA, etc.) for mapping the node’s native row (`0x0`).\n * Must cover every `EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID` key; see assert below.\n */\nconst WRAPPED_NATIVE_FALLBACK: Readonly<Record<number, `0x${string}`>> = {\n 1: '0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2',\n 10: '0x4200000000000000000000000000000000000006',\n 56: '0xbb4CdB9CBd36B01bD1cBaEBF2De08d9173bc095c',\n 100: '0xe91d153e0b41518a2ce8dd3d7944fa863463a97d',\n 130: '0x4200000000000000000000000000000000000006',\n 146: '0x03980325872071166574bcd94670450917897468',\n 239: '0xB63B9f0eb4A6E6f191529D71d4D88cc8900Df2C9', // TAC: WTAC (https://docs.tac.build/ecosystem/token-list)\n 480: '0x4200000000000000000000000000000000000006',\n 999: '0x5555555555555555555555555555555555555555', // HyperEVM: WHYPE (Hyperliquid docs)\n 1923: '0x4200000000000000000000000000000000000006',\n 42161: '0x82aF49447D8a07e3bd95BD0d56f35241523fBab1',\n 43114: '0xB31f66AA3C1e785363F0875A1B74D27b85FE0459',\n 5000: '0x78c1b0C915c4FAA5FffA6CAbf0219DA63d7f4cb8', // Mantle: WMNT\n 57073: '0x4200000000000000000000000000000000000006',\n 60808: '0x4200000000000000000000000000000000000006',\n 80094: '0x6969696969696969696969696969696969696969', // Berachain: WBERA (https://docs.berachain.com)\n 8453: '0x4200000000000000000000000000000000000006',\n 9745: '0x6100E367285b01F48D07953803A2d8dCA5D19873', // Plasma: WXPL\n}\n\nfor (const id of Object.keys(EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID).map(Number)) {\n if (WRAPPED_NATIVE_FALLBACK[id] == null) {\n throw new Error(`eulerV2Subgraph: add WRAPPED_NATIVE_FALLBACK for Euler Goldsky chain ${id}`)\n }\n}\n\nexport type EulerV2AssetModes = {\n lend: boolean\n borrow: boolean\n earn: boolean\n}\n\nexport function eulerV2GoldskyUrlForChain(chainId: number): string | undefined {\n return EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID[chainId]\n}\n\nexport async function resolveEulerWrappedNativeToken(chainId: number): Promise<string | null> {\n try {\n const fromAave = await fetchAaveV4NativeWrappedToken(chainId)\n if (fromAave) return fromAave\n } catch {\n /* ignore */\n }\n const fb = WRAPPED_NATIVE_FALLBACK[chainId]\n if (fb && isAddress(fb)) return getAddress(fb)\n return null\n}\n\n/** Wrapped gas-token contracts for this chain (Aave + Euler fallbacks); lowercased. Use to fix bad `decimals()` on WETH-class assets. */\nexport async function eulerWrappedGasTokenAliasesLower(chainId: number): Promise<ReadonlySet<string>> {\n const s = new Set<string>()\n const fb = WRAPPED_NATIVE_FALLBACK[chainId as keyof typeof WRAPPED_NATIVE_FALLBACK]\n if (fb && isAddress(fb)) {\n try {\n s.add(getAddress(fb).toLowerCase())\n } catch {\n /* ignore */\n }\n }\n try {\n const aave = await fetchAaveV4NativeWrappedToken(chainId)\n if (aave && isAddress(aave)) s.add(getAddress(aave).toLowerCase())\n } catch {\n /* ignore */\n }\n return s\n}\n\n/** Maps native gas row (`0x000…0`) to wrapped ERC20 for Euler underlying lookups. */\nexport function eulerV2KeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n\ntype GqlError = { message?: string }\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nasync function eulerSubgraphGql<T>(\n endpoint: string,\n query: string,\n variables?: Record<string, unknown>,\n chainId?: number,\n): Promise<T> {\n const body = { query, variables: variables ?? {} }\n const proxy = getEulerGraphqlProxyUrl()\n const j = await postJsonViaOptionalProxy<GqlData<T>>({\n directUrl: endpoint,\n body,\n proxyUrl: proxy,\n proxyEnvelope: chainId != null ? { chainId, query, variables: variables ?? {} } : body,\n })\n if (j.errors?.length) {\n throw new Error(j.errors.map((e) => e.message ?? 'Unknown').join('; '))\n }\n if (j.data == null) throw new Error('Euler subgraph: empty response')\n return j.data\n}\n\n/** GraphQL POST to the Euler Goldsky subgraph for `chainId`. */\nexport async function eulerV2QueryGraphQl<T>(\n chainId: number,\n query: string,\n variables?: Record<string, unknown>,\n): Promise<T> {\n const endpoint = eulerV2GoldskyUrlForChain(chainId)\n if (!endpoint) {\n throw new Error(`Euler v2 subgraph is not configured for chain ${chainId}`)\n }\n return eulerSubgraphGql<T>(endpoint, query, variables, chainId)\n}\n\nconst EULER_TRACKING_DEPOSITS_GQL = `\nquery EulerTrackingDeposits($id: Bytes!) {\n trackingActiveAccount(id: $id) {\n deposits\n }\n}`\n\n/** Goldsky `trackingActiveAccount.deposits` (encoded like borrows: 0x + 40-hex sub + 40-hex eVault). */\nexport async function fetchEulerV2TrackingDepositEntries(args: {\n chainId: number\n mainAddress: Address\n}): Promise<readonly string[]> {\n if (!eulerV2GoldskyUrlForChain(args.chainId)) return []\n const id = args.mainAddress.toLowerCase()\n const data = await eulerV2QueryGraphQl<{ trackingActiveAccount?: { deposits?: readonly string[] | null } | null }>(\n args.chainId,\n EULER_TRACKING_DEPOSITS_GQL,\n { id },\n )\n const raw = data.trackingActiveAccount?.deposits ?? []\n return raw.filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n}\n\nfunction normAssetAddr(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s || !isAddress(s)) return null\n return getAddress(s as `0x${string}`).toLowerCase()\n}\n\n/**\n * Borrow tab: hide only when resolved borrow cap is zero and there are no borrows.\n * Subgraph `borrowCap` is the uint16 AmountCap word (`0` = not set = unlimited on-chain).\n */\nfunction vaultShowsBorrowTab(borrowCap: string, totalBorrows: string): boolean {\n let borrows = 0n\n try {\n borrows = BigInt((totalBorrows ?? '').trim() || '0')\n } catch {\n borrows = 0n\n }\n if (borrows > 0n) return true\n const w = eulerSubgraphVaultCapToUnderlyingWei(borrowCap)\n if (w >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return true\n return w > 0n\n}\n\nconst VAULT_PAGE = `\nquery V($first: Int!, $skip: Int!) {\n eulerVaults(first: $first, skip: $skip) {\n asset\n borrowCap\n state { totalBorrows }\n }\n}\n`\n\nconst EARN_PAGE = `\nquery E($first: Int!, $skip: Int!) {\n eulerEarnVaults(first: $first, skip: $skip) {\n asset\n }\n}\n`\n\nasync function paginateEulerVaultRows(\n endpoint: string,\n): Promise<readonly { asset: string | null; borrowCap: string; totalBorrows: string }[]> {\n const out: { asset: string | null; borrowCap: string; totalBorrows: string }[] = []\n let skip = 0\n const first = 1000\n while (true) {\n const d = await eulerSubgraphGql<{\n eulerVaults: ReadonlyArray<{ asset?: string | null; borrowCap: string; state?: { totalBorrows?: string | null } | null }>\n }>(endpoint, VAULT_PAGE, { first, skip })\n const rows = d.eulerVaults ?? []\n if (!rows.length) break\n for (const r of rows) {\n const tb = (r.state?.totalBorrows ?? '0').toString()\n out.push({ asset: r.asset ?? null, borrowCap: r.borrowCap, totalBorrows: tb })\n }\n if (rows.length < first) break\n skip += first\n }\n return out\n}\n\nasync function paginateEulerEarnAssets(endpoint: string): Promise<readonly string[]> {\n const assets: string[] = []\n let skip = 0\n const first = 1000\n while (true) {\n const d = await eulerSubgraphGql<{ eulerEarnVaults: ReadonlyArray<{ asset?: string | null }> }>(endpoint, EARN_PAGE, {\n first,\n skip,\n })\n const rows = d.eulerEarnVaults ?? []\n if (!rows.length) break\n for (const r of rows) {\n const a = normAssetAddr(r.asset ?? undefined)\n if (a) assets.push(a)\n }\n if (rows.length < first) break\n skip += first\n }\n return assets\n}\n\nexport type EulerV2ChainAssetCache = {\n nativeWrapped: string | null\n /** Lowercase address → EVK / Earn modes */\n modesByUnderlying: ReadonlyMap<string, EulerV2AssetModes>\n}\n\nconst eulerV2ChainAssetCache = new Map<number, Promise<EulerV2ChainAssetCache>>()\n\nexport async function fetchEulerV2ChainAssetCache(chainId: number): Promise<EulerV2ChainAssetCache> {\n const endpoint = eulerV2GoldskyUrlForChain(chainId)\n if (!endpoint) {\n return { nativeWrapped: null, modesByUnderlying: new Map() }\n }\n const [nativeWrapped, vaultRows, earnAssets] = await Promise.all([\n resolveEulerWrappedNativeToken(chainId),\n paginateEulerVaultRows(endpoint),\n paginateEulerEarnAssets(endpoint),\n ])\n const modes = new Map<string, EulerV2AssetModes>()\n const bump = (addr: string, patch: Partial<EulerV2AssetModes>) => {\n const cur = modes.get(addr) ?? { lend: false, borrow: false, earn: false }\n modes.set(addr, {\n lend: cur.lend || !!patch.lend,\n borrow: cur.borrow || !!patch.borrow,\n earn: cur.earn || !!patch.earn,\n })\n }\n for (const e of earnAssets) bump(e, { earn: true })\n for (const row of vaultRows) {\n const a = normAssetAddr(row.asset)\n if (!a) continue\n bump(a, {\n lend: true,\n borrow: vaultShowsBorrowTab(row.borrowCap, row.totalBorrows),\n })\n }\n return { nativeWrapped, modesByUnderlying: modes }\n}\n\n/** Cached per chain id for the lifetime of the JS realm (same pattern as Aave v4 token cache). */\nexport function ensureEulerV2ChainAssetCache(chainId: number): Promise<EulerV2ChainAssetCache> {\n const hit = eulerV2ChainAssetCache.get(chainId)\n if (hit) return hit\n const p = fetchEulerV2ChainAssetCache(chainId)\n eulerV2ChainAssetCache.set(chainId, p)\n return p\n}\n","import { getAddress } from 'viem'\n\nconst LABELS_PRODUCTS_URL = (chainId: number) =>\n `https://raw.githubusercontent.com/euler-xyz/euler-labels/master/${chainId}/products.json`\n\ntype EulerLabelsVaultOverride = {\n name?: string\n}\n\ntype EulerLabelsProduct = {\n name?: string\n vaults?: string[]\n vaultOverrides?: Record<string, EulerLabelsVaultOverride>\n}\n\nfunction normAddrKey(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s) return null\n try {\n return getAddress((s.startsWith('0x') ? s : `0x${s}`) as `0x${string}`).toLowerCase()\n } catch {\n return null\n }\n}\n\n/** If `base` already mentions the asset symbol, don’t append it again. */\nexport function eulerLabelsAppendUnderlyingIfDistinct(base: string, underlyingSymbol: string): string {\n const b = (base ?? '').trim()\n const sym = (underlyingSymbol ?? '').trim()\n if (!b) return '—'\n if (!sym) return b\n if (b.toLowerCase().includes(sym.toLowerCase())) return b\n return `${b} ${sym}`\n}\n\nconst labelMapCache = new Map<number, Promise<ReadonlyMap<string, string>>>()\n\n/**\n * Map lowercase eVault address → Euler dApp label base (product name or vault override name).\n * Returns empty map on HTTP/parse errors (caller keeps subgraph names).\n */\nexport function fetchEulerLabelsVaultNameMap(chainId: number): Promise<ReadonlyMap<string, string>> {\n let hit = labelMapCache.get(chainId)\n if (!hit) {\n hit = (async (): Promise<ReadonlyMap<string, string>> => {\n const m = new Map<string, string>()\n try {\n const res = await fetch(LABELS_PRODUCTS_URL(chainId), { cache: 'force-cache' })\n if (!res.ok) return m\n const j = (await res.json()) as Record<string, EulerLabelsProduct>\n if (!j || typeof j !== 'object') return m\n for (const prod of Object.values(j)) {\n const productName = (prod?.name ?? '').trim()\n const vaults = prod?.vaults ?? []\n const overrides = prod?.vaultOverrides ?? {}\n const overrideNameByVault = new Map<string, string>()\n for (const [addr, ov] of Object.entries(overrides)) {\n const k = normAddrKey(addr)\n const n = (ov?.name ?? '').trim()\n if (k && n) overrideNameByVault.set(k, n)\n }\n for (const vAddr of vaults) {\n const k = normAddrKey(vAddr)\n if (!k) continue\n const overrideName = overrideNameByVault.get(k)\n const base = overrideName || productName\n if (!base) continue\n m.set(k, base)\n }\n }\n } catch {\n /* keep empty */\n }\n return m\n })()\n labelMapCache.set(chainId, hit)\n }\n return hit\n}\n\nexport function eulerLabelsLookupLabelForVault(\n labelMap: ReadonlyMap<string, string>,\n evaultAddress: string,\n): string | undefined {\n const k = normAddrKey(evaultAddress)\n if (!k) return undefined\n const v = labelMap.get(k)\n return typeof v === 'string' && v.trim() ? v.trim() : undefined\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n isAddress,\n parseAbi,\n type Address,\n type PublicClient,\n} from 'viem'\nimport {\n eulerV2QueryGraphQl,\n ensureEulerV2ChainAssetCache,\n eulerV2KeyForNodeAssetRow,\n} from './eulerV2Subgraph'\nimport {\n eulerLabelsAppendUnderlyingIfDistinct,\n eulerLabelsLookupLabelForVault,\n fetchEulerLabelsVaultNameMap,\n} from './eulerLabelsProducts'\nimport {\n EULER_EVAULT_CAP_UNLIMITED_WEI,\n eulerSubgraphVaultCapToUnderlyingWei,\n eulerVaultLendMetricsFromIndexerVaultState,\n type EulerVaultOnChainLendMetrics,\n} from './eulerV2VaultCapsOnChain'\n\nconst erc20StringMetaAbi = parseAbi([\n 'function name() view returns (string)',\n 'function symbol() view returns (string)',\n])\n\nconst LEND_VAULT_PAGE = `\nquery EulerLendVaults($first: Int!, $skip: Int!, $asset: Bytes!) {\n eulerVaults(\n first: $first\n skip: $skip\n where: { asset: $asset }\n orderBy: state__supplyApy\n orderDirection: desc\n ) {\n id\n evc\n evault\n name\n symbol\n asset\n decimals\n supplyCap\n borrowCap\n interestFee\n perspectives\n collaterals\n oracle\n unitOfAccount\n governonAdmin\n state {\n cash\n totalBorrows\n totalShares\n supplyApy\n borrowApy\n timestamp\n }\n }\n}\n`\n\nconst COLLATERAL_META = `\nquery EulerCollateralVaults($first: Int!, $ids: [Bytes!]!) {\n eulerVaults(first: $first, where: { id_in: $ids }) {\n id\n evault\n name\n symbol\n asset\n decimals\n state {\n supplyApy\n }\n }\n}\n`\n\ntype GqlVaultRow = {\n id?: string | null\n evc?: string | null\n evault?: string | null\n name?: string | null\n symbol?: string | null\n asset?: string | null\n decimals?: string | null\n supplyCap?: string | null\n borrowCap?: string | null\n interestFee?: string | null\n perspectives?: ReadonlyArray<string | null> | null\n collaterals?: ReadonlyArray<string | null> | null\n oracle?: string | null\n unitOfAccount?: string | null\n governonAdmin?: string | null\n state?: {\n cash?: string | null\n totalBorrows?: string | null\n totalShares?: string | null\n supplyApy?: string | null\n borrowApy?: string | null\n timestamp?: string | null\n } | null\n}\n\nfunction normId(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim().toLowerCase()\n return s.length ? s : null\n}\n\nfunction normAssetLower(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s || !isAddress(s)) return null\n return getAddress(s as `0x${string}`).toLowerCase()\n}\n\nfunction checksumHex(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s || !isAddress(s)) return null\n try {\n return getAddress(s as Address)\n } catch {\n return null\n }\n}\n\nfunction eulerMetaPublicClient(chainId: number, rpcUrl: string): PublicClient {\n const chain = defineChain({\n id: chainId,\n name: 'EulerCollateralMeta',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain, transport: http(rpcUrl) })\n}\n\nasync function readErc20StringMeta(client: PublicClient, addrLower: string): Promise<{ name: string; symbol: string } | null> {\n try {\n const addr = getAddress(addrLower as Address)\n const [nameResult, symbolResult] = await Promise.all([\n client.readContract({ address: addr, abi: erc20StringMetaAbi, functionName: 'name' }),\n client.readContract({ address: addr, abi: erc20StringMetaAbi, functionName: 'symbol' }),\n ])\n return {\n name: typeof nameResult === 'string' ? nameResult.trim() : String(nameResult ?? '').trim(),\n symbol: typeof symbolResult === 'string' ? symbolResult.trim() : String(symbolResult ?? '').trim(),\n }\n } catch {\n return null\n }\n}\n\nasync function resolveUnderlyingTokenLabels(args: {\n chainId: number\n rpcUrl: string | undefined\n nodeErc20ByAddress: ReadonlyMap<string, { name: string; symbol: string }> | undefined\n assetAddresses: readonly string[]\n}): Promise<Map<string, { name: string; symbol: string }>> {\n const out = new Map<string, { name: string; symbol: string }>()\n const uniq = [...new Set(args.assetAddresses.map((a) => normAssetLower(a)).filter(Boolean) as string[])]\n const missingFromNode: string[] = []\n const node = args.nodeErc20ByAddress\n for (const low of uniq) {\n const hit = node?.get(low)\n if (hit && ((hit.symbol ?? '').trim() || (hit.name ?? '').trim())) {\n out.set(low, { name: (hit.name ?? '').trim(), symbol: (hit.symbol ?? '').trim() })\n } else {\n missingFromNode.push(low)\n }\n }\n const rpc = (args.rpcUrl ?? '').trim()\n if (!missingFromNode.length || !rpc) return out\n\n const client = eulerMetaPublicClient(args.chainId, rpc)\n const batchSize = 10\n for (let i = 0; i < missingFromNode.length; i += batchSize) {\n const chunk = missingFromNode.slice(i, i + batchSize)\n const settled = await Promise.all(chunk.map((low) => readErc20StringMeta(client, low)))\n chunk.forEach((low, j) => {\n const m = settled[j]\n if (m && (m.symbol || m.name)) out.set(low, m)\n })\n }\n return out\n}\n\n/** Annual APY stored as a ray (1e27); supply or borrow from subgraph state. */\nexport function formatEulerRayApyPercent(apyRay: bigint): string {\n if (apyRay === 0n) return '0.00%'\n const r = Number(formatUnits(apyRay, 27))\n if (!Number.isFinite(r)) return '—'\n const pct = r * 100\n if (pct >= 100) return `${pct.toFixed(1)}%`\n if (pct >= 10) return `${pct.toFixed(2)}%`\n return `${pct.toFixed(2)}%`\n}\n\n/** @deprecated Use {@link formatEulerRayApyPercent}. */\nexport const formatEulerRaySupplyApyPercent = formatEulerRayApyPercent\n\nfunction formatUnderlyingAmount(raw: string, decimals: number): string {\n try {\n const v = BigInt((raw ?? '').trim() || '0')\n const s = formatUnits(v, decimals)\n const n = Number(s)\n if (!Number.isFinite(n)) return s\n if (n === 0) return '0'\n const abs = Math.abs(n)\n if (abs >= 1e9) return n.toExponential(2)\n if (abs >= 1e6) return n.toLocaleString(undefined, { maximumFractionDigits: 0 })\n if (abs >= 1) return n.toLocaleString(undefined, { maximumFractionDigits: 2 })\n return n.toLocaleString(undefined, { maximumFractionDigits: 6 })\n } catch {\n return '—'\n }\n}\n\n/** Subgraph caps are uint16 AmountCap words; see {@link eulerSubgraphVaultCapToUnderlyingWei}. */\nfunction formatEulerVaultCapDisplay(raw: string | undefined | null, decimals: number): string {\n try {\n const wei = eulerSubgraphVaultCapToUnderlyingWei(raw)\n if (wei >= EULER_EVAULT_CAP_UNLIMITED_WEI - 3n) return 'Unlimited'\n if (wei === 0n) return '0'\n return formatUnderlyingAmount(wei.toString(), decimals)\n } catch {\n return '—'\n }\n}\n\n/** Interest fee from subgraph (basis points over 10_000 → APY-style percentage points). */\nfunction formatEulerInterestFee(raw: string | undefined | null): string {\n try {\n const fee = BigInt((raw ?? '').trim() || '0')\n if (fee === 0n) return '0%'\n const pct = Number(fee) / 100\n return `${pct.toFixed(2)}%`\n } catch {\n return '—'\n }\n}\n\nfunction formatEulerIndexedTimestamp(raw: string | undefined | null): string {\n try {\n const sec = BigInt((raw ?? '').trim() || '0')\n const n = Number(sec)\n if (!Number.isFinite(n) || n <= 0) return '—'\n return new Date(n * 1000).toLocaleString(undefined, {\n dateStyle: 'medium',\n timeStyle: 'short',\n })\n } catch {\n return '—'\n }\n}\n\nfunction utilizationPercentLabel(cash: bigint, borrows: bigint): string {\n const denom = cash + borrows\n if (denom === 0n) return '0.00%'\n const scaled = (borrows * 1000000n) / denom\n const pct = Number(scaled) / 10000\n return `${pct.toFixed(2)}%`\n}\n\nfunction collateralLabelFromVault(name: string | undefined, symbol: string | undefined, id: string): string {\n const n = (name ?? '').trim()\n const sym = (symbol ?? '').trim()\n if (n && sym && n.toLowerCase() !== sym.toLowerCase()) return `${n} (${sym})`\n if (n) return n\n if (sym) return sym\n return id.slice(0, 10)\n}\n\n/** Subgraph `name` is sometimes empty while `symbol` is set; fall back before showing a shortened address. */\nfunction marketLabelFromSubgraphRow(r: GqlVaultRow, evaultChecksum: string): string {\n const n = (r.name ?? '').trim()\n if (n) return n\n const sym = (r.symbol ?? '').trim()\n if (sym) return sym\n const addr = (evaultChecksum ?? '').trim()\n if (addr.startsWith('0x') && addr.length >= 14) return `${addr.slice(0, 8)}…${addr.slice(-6)}`\n return addr || '—'\n}\n\nfunction normalizePerspectives(raw: ReadonlyArray<string | null> | null | undefined): readonly string[] {\n const out: string[] = []\n for (const p of raw ?? []) {\n const s = (p ?? '').trim()\n if (s) out.push(s)\n }\n return out\n}\n\n/** Raw APY rays from subgraph state (0 = indexer reports no yield). */\nfunction vaultSupplyBorrowApyRays(r: GqlVaultRow): { supplyApyRay: bigint; borrowApyRay: bigint } {\n let supplyApyRay = 0n\n let borrowApyRay = 0n\n try {\n supplyApyRay = BigInt((r.state?.supplyApy ?? '0').toString().trim() || '0')\n } catch {\n supplyApyRay = 0n\n }\n try {\n borrowApyRay = BigInt((r.state?.borrowApy ?? '0').toString().trim() || '0')\n } catch {\n borrowApyRay = 0n\n }\n return { supplyApyRay, borrowApyRay }\n}\n\nfunction vaultCashAndBorrows(r: GqlVaultRow): { cash: bigint; borrows: bigint } {\n let cash = 0n\n let borrows = 0n\n try {\n cash = BigInt((r.state?.cash ?? '0').toString().trim() || '0')\n } catch {\n cash = 0n\n }\n try {\n borrows = BigInt((r.state?.totalBorrows ?? '0').toString().trim() || '0')\n } catch {\n borrows = 0n\n }\n return { cash, borrows }\n}\n\nasync function paginateLendVaultRows(chainId: number, assetLower: string): Promise<readonly GqlVaultRow[]> {\n const out: GqlVaultRow[] = []\n let skip = 0\n const first = 500\n while (true) {\n const d = await eulerV2QueryGraphQl<{ eulerVaults: readonly GqlVaultRow[] }>(chainId, LEND_VAULT_PAGE, {\n first,\n skip,\n asset: assetLower,\n })\n const rows = d.eulerVaults ?? []\n if (!rows.length) break\n out.push(...rows)\n if (rows.length < first) break\n skip += first\n }\n return out\n}\n\nasync function fetchCollateralVaultMeta(\n chainId: number,\n collateralIds: readonly string[],\n): Promise<\n ReadonlyMap<\n string,\n {\n name: string\n symbol: string\n assetLower: string | null\n evaultChecksum: string | null\n decimals: number\n supplyApyRay: bigint\n }\n >\n> {\n const map = new Map<\n string,\n {\n name: string\n symbol: string\n assetLower: string | null\n evaultChecksum: string | null\n decimals: number\n supplyApyRay: bigint\n }\n >()\n const uniq = [...new Set(collateralIds.map((x) => x.toLowerCase()))].filter(Boolean)\n const chunkSize = 400\n for (let i = 0; i < uniq.length; i += chunkSize) {\n const chunk = uniq.slice(i, i + chunkSize)\n const d = await eulerV2QueryGraphQl<{\n eulerVaults: ReadonlyArray<{\n id?: string | null\n evault?: string | null\n name?: string | null\n symbol?: string | null\n asset?: string | null\n decimals?: string | null\n state?: { supplyApy?: string | null } | null\n }>\n }>(chainId, COLLATERAL_META, { first: chunk.length, ids: chunk })\n for (const r of d.eulerVaults ?? []) {\n const id = normId(r.id ?? undefined)\n if (!id) continue\n let dec = 18\n try {\n dec = Number.parseInt((r.decimals ?? '18').trim(), 10)\n if (!Number.isFinite(dec) || dec < 0 || dec > 36) dec = 18\n } catch {\n dec = 18\n }\n let supplyApyRay = 0n\n try {\n supplyApyRay = BigInt((r.state?.supplyApy ?? '0').toString().trim() || '0')\n } catch {\n supplyApyRay = 0n\n }\n map.set(id, {\n name: (r.name ?? '').trim(),\n symbol: (r.symbol ?? '').trim(),\n assetLower: normAssetLower(r.asset ?? undefined),\n evaultChecksum: checksumHex(r.evault ?? undefined) ?? checksumHex(r.id ?? undefined),\n decimals: dec,\n supplyApyRay,\n })\n }\n }\n return map\n}\n\nexport type EulerV2IsolatedLendMarketRow = {\n vaultId: string\n /** Checksummed eVault address for explorers / copy. */\n evaultAddress: string\n marketName: string\n decimals: number\n cash: bigint\n totalBorrows: bigint\n supplyApyPercentLabel: string\n borrowApyPercentLabel: string\n totalSupplyFormatted: string\n availableLiquidityFormatted: string\n utilizationPercentLabel: string\n supplyCapFormatted: string\n borrowCapFormatted: string\n interestFeeLabel: string\n stateIndexedDisplay: string\n perspectives: readonly string[]\n /** Ethereum Vault Connector (EVC) contract for `batch(...)`. */\n evcAddress: string | null\n oracleAddress: string | null\n unitOfAccountAddress: string | null\n borrowAssetAddressLower: string | null\n governonAdminChecksum: string | null\n borrowApyRay: bigint\n /** Caps, cash, borrows, and total-assets proxy from Goldsky (same shape as on-chain reads). */\n indexerLendMetrics: EulerVaultOnChainLendMetrics\n collateralTokens: readonly {\n vaultId: string\n /** Collateral eVault (checksummed) for on-chain LTV + deposit target. */\n collateralEvaultAddress: string | null\n collateralDecimals: number\n collateralAssetAddressLower: string | null\n collateralSupplyApyPercentLabel: string\n underlyingSymbol: string\n underlyingName: string | null\n vaultMarketLabel: string\n }[]\n}\n\n/** One borrow-vault × collateral-vault pair (flattened from {@link EulerV2IsolatedLendMarketRow}). */\nexport type EulerV2BorrowCollateralRow = {\n pairKey: string\n borrowVaultId: string\n borrowEvaultAddress: string\n borrowMarketName: string\n borrowDecimals: number\n borrowApyPercentLabel: string\n borrowCash: bigint\n borrowTotalBorrows: bigint\n netApyPercentLabel: string\n utilizationPercentLabel: string\n availableLiquidityFormatted: string\n evcAddress: string | null\n oracleAddress: string | null\n unitOfAccountAddress: string | null\n borrowAssetAddressLower: string | null\n governonAdminChecksum: string | null\n collateralVaultId: string\n collateralEvaultAddress: string | null\n collateralSymbol: string\n collateralName: string | null\n collateralVaultLabel: string\n collateralDecimals: number\n collateralAssetAddressLower: string | null\n collateralSupplyApyPercentLabel: string\n borrowIndexerLendMetrics: EulerVaultOnChainLendMetrics\n}\n\nexport function flattenEulerV2BorrowCollateralRows(markets: readonly EulerV2IsolatedLendMarketRow[]): EulerV2BorrowCollateralRow[] {\n const out: EulerV2BorrowCollateralRow[] = []\n for (const m of markets) {\n if (m.borrowApyRay === 0n) continue\n const borrowNum = Number.parseFloat(m.borrowApyPercentLabel.replace(/%/g, '').trim()) || 0\n for (const c of m.collateralTokens) {\n if (!c.collateralEvaultAddress) continue\n const supplyNum = Number.parseFloat(c.collateralSupplyApyPercentLabel.replace(/%/g, '').trim()) || 0\n const net = supplyNum - borrowNum\n const netLabel = `${net.toFixed(2)}%`\n out.push({\n pairKey: `${m.vaultId}:${c.vaultId}`,\n borrowVaultId: m.vaultId,\n borrowEvaultAddress: m.evaultAddress,\n borrowMarketName: m.marketName,\n borrowDecimals: m.decimals,\n borrowApyPercentLabel: m.borrowApyPercentLabel,\n borrowCash: m.cash,\n borrowTotalBorrows: m.totalBorrows,\n netApyPercentLabel: netLabel,\n utilizationPercentLabel: m.utilizationPercentLabel,\n availableLiquidityFormatted: m.availableLiquidityFormatted,\n evcAddress: m.evcAddress,\n oracleAddress: m.oracleAddress,\n unitOfAccountAddress: m.unitOfAccountAddress,\n borrowAssetAddressLower: m.borrowAssetAddressLower,\n governonAdminChecksum: m.governonAdminChecksum,\n collateralVaultId: c.vaultId,\n collateralEvaultAddress: c.collateralEvaultAddress,\n collateralSymbol: c.underlyingSymbol,\n collateralName: c.underlyingName,\n collateralVaultLabel: c.vaultMarketLabel,\n collateralDecimals: c.collateralDecimals,\n collateralAssetAddressLower: c.collateralAssetAddressLower,\n collateralSupplyApyPercentLabel: c.collateralSupplyApyPercentLabel,\n borrowIndexerLendMetrics: m.indexerLendMetrics,\n })\n }\n }\n return out\n}\n\nexport async function fetchEulerV2IsolatedLendMarketsForRowAsset(args: {\n chainId: number\n /** Assets panel contract address (native row mapped via Euler cache). */\n contractAddress: string\n rpcUrl?: string | undefined\n nodeErc20ByAddress?: ReadonlyMap<string, { name: string; symbol: string }> | undefined\n /** Shown asset symbol (helps match Euler app-style “Product SYMBOL” titles). */\n suppliedAssetSymbol?: string | undefined\n}): Promise<EulerV2IsolatedLendMarketRow[]> {\n const cache = await ensureEulerV2ChainAssetCache(args.chainId)\n const underlying = eulerV2KeyForNodeAssetRow({\n contractAddress: args.contractAddress,\n nativeWrapped: cache.nativeWrapped,\n })\n if (!underlying) return []\n\n const [gqlRows, labelMap] = await Promise.all([\n paginateLendVaultRows(args.chainId, underlying),\n fetchEulerLabelsVaultNameMap(args.chainId),\n ])\n /** Discovery list: hide idle vaults (no APY signal and/or zero indexed TVL). Positions UI is separate. */\n const eligibleRows = gqlRows.filter((r) => {\n const { supplyApyRay, borrowApyRay } = vaultSupplyBorrowApyRays(r)\n if (supplyApyRay === 0n && borrowApyRay === 0n) return false\n const { cash, borrows } = vaultCashAndBorrows(r)\n return cash + borrows !== 0n\n })\n\n if (typeof process !== 'undefined' && process.env.NODE_ENV === 'development') {\n let matched = 0\n for (const r of eligibleRows) {\n const evRaw = checksumHex(r.evault ?? undefined) ?? checksumHex(r.id ?? undefined)\n if (!evRaw) continue\n if (eulerLabelsLookupLabelForVault(labelMap, evRaw)) matched += 1\n }\n console.debug('[Euler labels]', {\n chainId: args.chainId,\n matchedEligibleVaults: matched,\n eligibleVaults: eligibleRows.length,\n labelMapEntries: labelMap.size,\n })\n }\n\n const collateralIds: string[] = []\n for (const r of eligibleRows) {\n for (const c of r.collaterals ?? []) {\n const id = normId(c ?? undefined)\n if (id) collateralIds.push(id)\n }\n }\n const collateralMeta = await fetchCollateralVaultMeta(args.chainId, collateralIds)\n const underlyingAssetAddrs: string[] = []\n for (const m of collateralMeta.values()) {\n if (m.assetLower) underlyingAssetAddrs.push(m.assetLower)\n }\n const underlyingLabels = await resolveUnderlyingTokenLabels({\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n nodeErc20ByAddress: args.nodeErc20ByAddress,\n assetAddresses: underlyingAssetAddrs,\n })\n\n const rows: EulerV2IsolatedLendMarketRow[] = []\n for (const r of eligibleRows) {\n const vaultId = normId(r.id ?? undefined)\n if (!vaultId) continue\n const evaultAddress =\n checksumHex(r.evault ?? undefined) ?? checksumHex(r.id ?? undefined) ?? vaultId\n const subgraphTitle = marketLabelFromSubgraphRow(r, evaultAddress)\n const labelBase = eulerLabelsLookupLabelForVault(labelMap, evaultAddress)\n const assetSym = (args.suppliedAssetSymbol ?? '').trim()\n const marketName = labelBase ? eulerLabelsAppendUnderlyingIfDistinct(labelBase, assetSym) : subgraphTitle\n let dec = 18\n try {\n dec = Number.parseInt((r.decimals ?? '18').trim(), 10)\n if (!Number.isFinite(dec) || dec < 0 || dec > 36) dec = 18\n } catch {\n dec = 18\n }\n const { cash, borrows } = vaultCashAndBorrows(r)\n const { supplyApyRay, borrowApyRay } = vaultSupplyBorrowApyRays(r)\n\n const total = cash + borrows\n const cIds = [...new Set((r.collaterals ?? []).map((x) => normId(x ?? undefined)).filter(Boolean) as string[])]\n const collateralTokens = cIds.map((cid) => {\n const vm = collateralMeta.get(cid)\n const vaultMarketLabel = vm ? collateralLabelFromVault(vm.name, vm.symbol, cid) : cid.slice(0, 10)\n const assetLow = vm?.assetLower ?? null\n const und = assetLow ? underlyingLabels.get(assetLow) : undefined\n const sym = (und?.symbol ?? '').trim()\n const nam = (und?.name ?? '').trim()\n let underlyingSymbol: string\n let underlyingName: string | null\n if (sym || nam) {\n underlyingSymbol = sym || nam\n underlyingName = sym && nam && nam.toLowerCase() !== sym.toLowerCase() ? nam : null\n } else {\n underlyingSymbol = vaultMarketLabel\n underlyingName = null\n }\n const collSupplyRay = vm?.supplyApyRay ?? 0n\n return {\n vaultId: cid,\n collateralEvaultAddress: vm?.evaultChecksum ?? null,\n collateralDecimals: vm?.decimals ?? 18,\n collateralAssetAddressLower: assetLow,\n collateralSupplyApyPercentLabel: formatEulerRayApyPercent(collSupplyRay),\n underlyingSymbol,\n underlyingName,\n vaultMarketLabel,\n }\n })\n\n const indexerLendMetrics = eulerVaultLendMetricsFromIndexerVaultState({\n supplyCapRaw: r.supplyCap,\n borrowCapRaw: r.borrowCap,\n cashWei: cash,\n totalBorrowsWei: borrows,\n totalAssetsWei: total,\n })\n\n rows.push({\n vaultId,\n evaultAddress,\n marketName,\n decimals: dec,\n cash,\n totalBorrows: borrows,\n supplyApyPercentLabel: formatEulerRayApyPercent(supplyApyRay),\n borrowApyPercentLabel: formatEulerRayApyPercent(borrowApyRay),\n totalSupplyFormatted: formatUnderlyingAmount(total.toString(), dec),\n availableLiquidityFormatted: formatUnderlyingAmount(cash.toString(), dec),\n utilizationPercentLabel: utilizationPercentLabel(cash, borrows),\n supplyCapFormatted: formatEulerVaultCapDisplay(r.supplyCap, dec),\n borrowCapFormatted: formatEulerVaultCapDisplay(r.borrowCap, dec),\n interestFeeLabel: formatEulerInterestFee(r.interestFee),\n stateIndexedDisplay: formatEulerIndexedTimestamp(r.state?.timestamp),\n perspectives: normalizePerspectives(r.perspectives),\n evcAddress: checksumHex(r.evc ?? undefined),\n oracleAddress: checksumHex(r.oracle ?? undefined),\n unitOfAccountAddress: checksumHex(r.unitOfAccount ?? undefined),\n borrowAssetAddressLower: normAssetLower(r.asset ?? undefined),\n governonAdminChecksum: checksumHex(r.governonAdmin ?? undefined),\n borrowApyRay,\n indexerLendMetrics,\n collateralTokens,\n })\n }\n\n return rows\n}\n","import { getAddress, isAddress } from 'viem'\nimport { fetchEulerV2IsolatedLendMarketsForRowAsset } from './eulerV2LendMarkets.js'\n\nexport type EulerV2LendVaultDiscoveryRow = {\n evaultAddress: string\n marketName: string\n underlyingAddress: string\n underlyingDecimals: number\n supplyApyPercentLabel: string\n borrowApyPercentLabel: string\n availableLiquidityFormatted: string\n totalSupplyFormatted: string\n evcAddress: string | null\n}\n\n/** MCP: discover Euler v2 isolated lend vaults for an underlying asset. */\nexport async function eulerV2FetchLendVaultsSummary(args: {\n chainId: number\n /** Underlying ERC-20 address (copy from get_defi_protocol_supported_tokens). */\n underlyingAddress: string\n rpcUrl?: string\n limit?: number\n}): Promise<{ vaults: EulerV2LendVaultDiscoveryRow[] }> {\n const addr = args.underlyingAddress.trim()\n if (!isAddress(addr)) {\n throw new Error('underlyingAddress must be a valid ERC-20 address.')\n }\n const limit = Math.min(Math.max(args.limit ?? 30, 1), 100)\n const markets = await fetchEulerV2IsolatedLendMarketsForRowAsset({\n chainId: args.chainId,\n contractAddress: getAddress(addr),\n rpcUrl: args.rpcUrl,\n })\n const vaults: EulerV2LendVaultDiscoveryRow[] = markets.slice(0, limit).map((m) => ({\n evaultAddress: m.evaultAddress,\n marketName: m.marketName,\n underlyingAddress: m.borrowAssetAddressLower\n ? getAddress(m.borrowAssetAddressLower)\n : getAddress(addr),\n underlyingDecimals: m.decimals,\n supplyApyPercentLabel: m.supplyApyPercentLabel,\n borrowApyPercentLabel: m.borrowApyPercentLabel,\n availableLiquidityFormatted: m.availableLiquidityFormatted,\n totalSupplyFormatted: m.totalSupplyFormatted,\n evcAddress: m.evcAddress,\n }))\n return { vaults }\n}\n","import { formatUnits, getAddress, isAddress } from 'viem'\nimport {\n eulerV2QueryGraphQl,\n eulerV2KeyForNodeAssetRow,\n ensureEulerV2ChainAssetCache,\n} from './eulerV2Subgraph'\nimport { formatEulerRayApyPercent } from './eulerV2LendMarkets'\n\nconst UINT256_MAX = (1n << 256n) - 1n\n\n/**\n * Goldsky `eulerEarnVaults` subgraph stores this constant in `currentAllocationCap` for strategies\n * with no cap (not token wei — formatting it with underlying decimals yields bogus huge numbers).\n */\nconst EARN_STRATEGY_ALLOC_CAP_SUBGRAPH_UNBOUNDED = 87112285931760246646623899502532662132735n\n\nconst EARN_VAULTS_QUERY = `\nquery EulerEarnForAsset($asset: Bytes!, $ids: [Bytes!]!) {\n eulerEarnVaults(first: 500, where: { asset: $asset, id_in: $ids }) {\n id\n name\n curator\n performanceFee\n totalAssets\n totalAllocated\n asset\n strategies(first: 200) {\n strategy\n allocatedAssets\n availableAssets\n currentAllocationCap\n }\n }\n}\n`\n\nconst STRATEGY_VAULT_APY = `\nquery EulerStrategyVaults($ids: [Bytes!]!) {\n eulerVaults(first: 500, where: { id_in: $ids }) {\n id\n asset\n symbol\n state {\n supplyApy\n }\n }\n}\n`\n\ntype GqlEarnRow = {\n id?: string | null\n name?: string | null\n curator?: string | null\n performanceFee?: string | null\n totalAssets?: string | null\n totalAllocated?: string | null\n asset?: string | null\n strategies?: ReadonlyArray<{\n strategy?: string | null\n allocatedAssets?: string | null\n availableAssets?: string | null\n currentAllocationCap?: string | null\n }> | null\n}\n\ntype GqlVaultApyRow = {\n id?: string | null\n asset?: string | null\n symbol?: string | null\n state?: { supplyApy?: string | null } | null\n}\n\nfunction normLowerId(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim().toLowerCase()\n if (!s.startsWith('0x') || s.length < 4) return null\n return s\n}\n\nfunction big(raw: string | null | undefined): bigint {\n try {\n return BigInt((raw ?? '0').toString().trim() || '0')\n } catch {\n return 0n\n }\n}\n\n/** Curated earn vault addresses from euler-labels (non-deprecated only). */\nexport async function fetchEulerLabelsEarnVaultAllowlist(chainId: number): Promise<ReadonlySet<string>> {\n const url = `https://raw.githubusercontent.com/euler-xyz/euler-labels/master/${chainId}/earn-vaults.json`\n const r = await fetch(url, { cache: 'no-store' })\n if (!r.ok) return new Set()\n let j: unknown\n try {\n j = (await r.json()) as unknown\n } catch {\n return new Set()\n }\n const out = new Set<string>()\n if (!Array.isArray(j)) return out\n for (const entry of j) {\n if (typeof entry === 'string') {\n const lo = normLowerId(entry)\n if (lo) out.add(lo)\n continue\n }\n if (entry && typeof entry === 'object' && !Array.isArray(entry)) {\n const o = entry as Record<string, unknown>\n if (o.deprecated === true) continue\n const addr = typeof o.address === 'string' ? o.address : typeof o.id === 'string' ? o.id : null\n const lo = normLowerId(addr)\n if (lo) out.add(lo)\n }\n }\n return out\n}\n\n/** Map lowercase address → entity display name from entities.json. */\nexport async function fetchEulerLabelsEntityNameByAddress(chainId: number): Promise<ReadonlyMap<string, string>> {\n const url = `https://raw.githubusercontent.com/euler-xyz/euler-labels/master/${chainId}/entities.json`\n const r = await fetch(url, { cache: 'no-store' })\n const m = new Map<string, string>()\n if (!r.ok) return m\n let j: unknown\n try {\n j = (await r.json()) as unknown\n } catch {\n return m\n }\n if (!j || typeof j !== 'object') return m\n for (const ent of Object.values(j as Record<string, unknown>)) {\n if (!ent || typeof ent !== 'object') continue\n const name = (ent as { name?: unknown }).name\n const groupName = typeof name === 'string' && name.trim() ? name.trim() : null\n if (!groupName) continue\n const addrs = (ent as { addresses?: unknown }).addresses\n if (!addrs || typeof addrs !== 'object') continue\n for (const k of Object.keys(addrs as Record<string, unknown>)) {\n const lo = normLowerId(k)\n if (lo) m.set(lo, groupName)\n }\n }\n return m\n}\n\n/** Dialog focus metadata: which Earn vault the deposit batch targets (mirrors lend flow vault meta). */\nexport type EulerV2EarnFlowVaultMeta = {\n earnVaultIdLower: string\n evaultAddress: string\n vaultMarketLabel: string\n curatorDisplayName: string\n}\n\nexport type EulerV2EarnStrategyRow = {\n strategyVaultIdLower: string\n strategySymbol: string\n supplyApyPercentLabel: string\n allocatedAssetsWei: bigint\n allocatedHumanLabel: string\n /** Share of vault total assets (TVL). */\n allocationPercentOfTvlLabel: string\n allocationCapHumanLabel: string\n /** True when cap is unbounded (uint256 max in-contract, or Goldsky subgraph no-cap sentinel). */\n allocationCapUnlimited: boolean\n}\n\nexport type EulerV2EarnOfferingRow = {\n vaultIdLower: string\n evaultAddress: string\n vaultName: string\n curatorDisplayName: string\n strategyCount: number\n supplyApyPercentLabel: string\n totalAssetsWei: bigint\n totalAssetsHumanLabel: string\n availableLiquidityWei: bigint\n availableLiquidityHumanLabel: string\n performanceFeePercentLabel: string\n underlyingDecimals: number\n strategies: readonly EulerV2EarnStrategyRow[]\n}\n\nfunction formatPerformanceFeePercent(feeWad: bigint): string {\n if (feeWad === 0n) return '0%'\n const x = Number(formatUnits(feeWad, 18))\n if (!Number.isFinite(x)) return '—'\n const pct = x * 100\n if (pct >= 10) return `${pct.toFixed(1)}%`\n if (pct >= 1) return `${pct.toFixed(2)}%`\n return `${pct.toFixed(2)}%`\n}\n\nfunction isMaxUintCap(cap: bigint): boolean {\n return cap >= UINT256_MAX - 3n\n}\n\nfunction isUnboundedEarnStrategyAllocationCap(cap: bigint): boolean {\n return isMaxUintCap(cap) || cap === EARN_STRATEGY_ALLOC_CAP_SUBGRAPH_UNBOUNDED\n}\n\nexport async function fetchEulerV2EarnOfferingsForRowAsset(args: {\n chainId: number\n contractAddress: string\n underlyingDecimals: number\n suppliedAssetSymbol?: string | undefined\n}): Promise<EulerV2EarnOfferingRow[]> {\n const { chainId, underlyingDecimals } = args\n const cache = await ensureEulerV2ChainAssetCache(chainId)\n const key = eulerV2KeyForNodeAssetRow({\n contractAddress: args.contractAddress,\n nativeWrapped: cache.nativeWrapped,\n })\n if (!key) return []\n\n const [allowlist, entityByAddr] = await Promise.all([\n fetchEulerLabelsEarnVaultAllowlist(chainId),\n fetchEulerLabelsEntityNameByAddress(chainId),\n ])\n if (!allowlist.size) return []\n\n const assetBytes = key\n const ids = [...allowlist]\n\n const data = await eulerV2QueryGraphQl<{ eulerEarnVaults: GqlEarnRow[] }>(chainId, EARN_VAULTS_QUERY, {\n asset: assetBytes,\n ids,\n })\n const rawRows = data.eulerEarnVaults ?? []\n\n const strategyIds = new Set<string>()\n for (const v of rawRows) {\n for (const s of v.strategies ?? []) {\n const sid = normLowerId(s.strategy ?? undefined)\n if (sid) strategyIds.add(sid)\n }\n }\n\n const apyByVault = new Map<\n string,\n { apyRay: bigint; symbol: string; assetLower: string | null }\n >()\n const sidList = [...strategyIds]\n const batch = 200\n for (let i = 0; i < sidList.length; i += batch) {\n const chunk = sidList.slice(i, i + batch)\n const d2 = await eulerV2QueryGraphQl<{ eulerVaults: GqlVaultApyRow[] }>(chainId, STRATEGY_VAULT_APY, {\n ids: chunk,\n })\n for (const row of d2.eulerVaults ?? []) {\n const id = normLowerId(row.id ?? undefined)\n if (!id) continue\n const ray = big(row.state?.supplyApy ?? '0')\n const sym = (row.symbol ?? '').trim() || '—'\n const al = normLowerId(row.asset ?? undefined)\n apyByVault.set(id, { apyRay: ray, symbol: sym, assetLower: al })\n }\n }\n\n const dec = Math.max(0, Math.min(36, Math.floor(underlyingDecimals)))\n const tic = (args.suppliedAssetSymbol ?? '').trim()\n\n const out: EulerV2EarnOfferingRow[] = []\n\n for (const v of rawRows) {\n const vid = normLowerId(v.id ?? undefined)\n if (!vid || !allowlist.has(vid)) continue\n\n const curatorLo = normLowerId(v.curator ?? undefined)\n const curatorName =\n curatorLo && entityByAddr.has(curatorLo)\n ? entityByAddr.get(curatorLo)!\n : curatorLo\n ? `${curatorLo.slice(0, 6)}…${curatorLo.slice(-4)}`\n : '—'\n\n const strategiesRaw = [...(v.strategies ?? [])]\n const sumStratAlloc = strategiesRaw.reduce((a, s) => a + big(s.allocatedAssets), 0n)\n const totalAssets = big(v.totalAssets)\n const totalAllocatedField = big(v.totalAllocated)\n\n let denomForApy = sumStratAlloc\n if (denomForApy === 0n) denomForApy = totalAllocatedField\n\n let weightedApyRay = 0n\n if (denomForApy > 0n) {\n let acc = 0n\n for (const s of strategiesRaw) {\n const alloc = big(s.allocatedAssets)\n const sid = normLowerId(s.strategy ?? undefined)\n const meta = sid ? apyByVault.get(sid) : undefined\n const ray = meta?.apyRay ?? 0n\n acc += ray * alloc\n }\n weightedApyRay = acc / denomForApy\n }\n\n const supplyApyPercentLabel =\n denomForApy > 0n\n ? formatEulerRayApyPercent(weightedApyRay)\n : '0.00%'\n\n const deployedForLiquidity =\n sumStratAlloc > 0n ? sumStratAlloc : totalAllocatedField > 0n ? totalAllocatedField : 0n\n const availableWei = totalAssets > deployedForLiquidity ? totalAssets - deployedForLiquidity : 0n\n\n const performanceFee = big(v.performanceFee)\n const performanceFeePercentLabel = formatPerformanceFeePercent(performanceFee)\n\n const vaultName = (v.name ?? '').trim() || 'Euler Earn'\n\n const stratRows: EulerV2EarnStrategyRow[] = strategiesRaw.map((s) => {\n const sid = normLowerId(s.strategy ?? undefined) ?? ''\n const meta = sid ? apyByVault.get(sid) : undefined\n const alloc = big(s.allocatedAssets)\n const cap = big(s.currentAllocationCap)\n const pctOfTotal =\n totalAssets > 0n ? `${(Number((alloc * 10000n) / totalAssets) / 100).toFixed(1)}%` : '0.0%'\n\n const capUnlimited = isUnboundedEarnStrategyAllocationCap(cap)\n let capLabel: string\n if (capUnlimited) {\n capLabel = '∞'\n } else if (cap === 0n) {\n capLabel = `0${tic ? ` ${tic}` : ''}`\n } else {\n try {\n capLabel = `${formatUnits(cap, dec)}${tic ? ` ${tic}` : ''}`\n } catch {\n capLabel = cap.toString()\n }\n }\n\n let allocHuman: string\n try {\n allocHuman = `${formatUnits(alloc, dec)}${tic ? ` ${tic}` : ''}`\n } catch {\n allocHuman = alloc.toString()\n }\n\n return {\n strategyVaultIdLower: sid,\n strategySymbol: meta?.symbol ?? '—',\n supplyApyPercentLabel: meta ? formatEulerRayApyPercent(meta.apyRay) : '—',\n allocatedAssetsWei: alloc,\n allocatedHumanLabel: allocHuman,\n allocationPercentOfTvlLabel: pctOfTotal,\n allocationCapHumanLabel: capLabel,\n allocationCapUnlimited: capUnlimited,\n }\n })\n\n const cs = checksumHex(v.id)\n if (!cs) continue\n\n let totalHuman: string\n let availHuman: string\n try {\n totalHuman = `${formatUnits(totalAssets, dec)}${tic ? ` ${tic}` : ''}`\n availHuman = `${formatUnits(availableWei, dec)}${tic ? ` ${tic}` : ''}`\n } catch {\n totalHuman = totalAssets.toString()\n availHuman = availableWei.toString()\n }\n\n out.push({\n vaultIdLower: vid,\n evaultAddress: cs,\n vaultName,\n curatorDisplayName: curatorName,\n strategyCount: strategiesRaw.length,\n supplyApyPercentLabel,\n totalAssetsWei: totalAssets,\n totalAssetsHumanLabel: totalHuman,\n availableLiquidityWei: availableWei,\n availableLiquidityHumanLabel: availHuman,\n performanceFeePercentLabel,\n underlyingDecimals: dec,\n strategies: stratRows,\n })\n }\n\n out.sort((a, b) => {\n const ap = Number.parseFloat(a.supplyApyPercentLabel.replace('%', '')) || 0\n const bp = Number.parseFloat(b.supplyApyPercentLabel.replace('%', '')) || 0\n if (bp !== ap) return bp - ap\n return a.vaultName.localeCompare(b.vaultName)\n })\n\n return out\n}\n\nfunction checksumHex(raw: string | null | undefined): string | null {\n const s = (raw ?? '').trim()\n if (!s || !isAddress(s)) return null\n try {\n return getAddress(s as `0x${string}`)\n } catch {\n return null\n }\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n isAddress,\n parseAbi,\n parseUnits,\n type Address,\n type PublicClient,\n} from 'viem'\n\nconst eulerVaultRiskAbi = parseAbi([\n 'function LTVBorrow(address collateral) view returns (uint16)',\n 'function LTVLiquidation(address collateral) view returns (uint16)',\n])\n\nconst priceOracleAbi = parseAbi([\n 'function getQuote(uint256 inAmount, address base, address quote) view returns (uint256 outAmount)',\n])\n\nfunction metaClient(chainId: number, rpcUrl: string): PublicClient {\n const chain = defineChain({\n id: chainId,\n name: 'EulerBorrowRisk',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain, transport: http(rpcUrl) })\n}\n\nexport type EulerV2BorrowPairRisk = {\n maxLtvBps: number\n liquidationLtvBps: number\n}\n\n/**\n * Read borrow / liquidation LTV from the liability eVault for a collateral eVault address.\n */\nexport async function fetchEulerV2BorrowPairLtvs(args: {\n chainId: number\n rpcUrl: string\n borrowEvault: Address\n collateralEvault: Address\n}): Promise<EulerV2BorrowPairRisk | null> {\n const rpc = (args.rpcUrl ?? '').trim()\n if (!rpc) return null\n try {\n const client = metaClient(args.chainId, rpc)\n const coll = getAddress(args.collateralEvault)\n const bor = getAddress(args.borrowEvault)\n const [maxLt, liqLt] = await Promise.all([\n client.readContract({ address: bor, abi: eulerVaultRiskAbi, functionName: 'LTVBorrow', args: [coll] }),\n client.readContract({ address: bor, abi: eulerVaultRiskAbi, functionName: 'LTVLiquidation', args: [coll] }),\n ])\n return { maxLtvBps: Number(maxLt), liquidationLtvBps: Number(liqLt) }\n } catch {\n return null\n }\n}\n\nexport type EulerV2BorrowOracleQuoteSnapshot = {\n /** UoA out for `10^borrowDecimals` wei of borrow asset (one full token if decimals match). */\n oneBorrowUnitUoAWei: bigint\n /** UoA out for `collateralAmountHuman` of collateral (human → wei using collateralDecimals). */\n collateralUoAWei: bigint\n}\n\n/**\n * Uses the liability vault’s oracle (same oracle address the vault uses for account health).\n */\nexport async function fetchEulerV2BorrowOracleQuoteSnapshot(args: {\n chainId: number\n rpcUrl: string\n oracle: Address\n unitOfAccount: Address\n borrowAsset: Address\n borrowDecimals: number\n collateralAsset: Address\n collateralDecimals: number\n collateralAmountHuman: string\n}): Promise<EulerV2BorrowOracleQuoteSnapshot | null> {\n const rpc = (args.rpcUrl ?? '').trim()\n if (!rpc) return null\n if (!isAddress(args.oracle) || !isAddress(args.unitOfAccount)) return null\n try {\n const client = metaClient(args.chainId, rpc)\n const oracle = getAddress(args.oracle)\n const uoa = getAddress(args.unitOfAccount)\n const bAss = getAddress(args.borrowAsset)\n const cAss = getAddress(args.collateralAsset)\n const oneBorrow = parseUnits('1', args.borrowDecimals)\n const collWei = parseUnits(args.collateralAmountHuman, args.collateralDecimals)\n const [oneBorrowUnitUoAWei, collateralUoAWei] = await Promise.all([\n client.readContract({\n address: oracle,\n abi: priceOracleAbi,\n functionName: 'getQuote',\n args: [oneBorrow, bAss, uoa],\n }),\n collWei > 0n\n ? client.readContract({\n address: oracle,\n abi: priceOracleAbi,\n functionName: 'getQuote',\n args: [collWei, cAss, uoa],\n })\n : Promise.resolve(0n),\n ])\n return { oneBorrowUnitUoAWei, collateralUoAWei }\n } catch {\n return null\n }\n}\n\n/** `borrowHuman ≈ collateralUoA * (ltvPct/100) / oneBorrowUnitUoA` with BigInt rounding down. */\nexport function estimateBorrowHumanFromLtv(args: {\n collateralUoAWei: bigint\n oneBorrowUnitUoAWei: bigint\n ltvPercent: number\n borrowDecimals: number\n}): string {\n if (args.collateralUoAWei <= 0n || args.oneBorrowUnitUoAWei <= 0n || !(args.ltvPercent > 0)) return '0'\n const bps = Math.min(10000, Math.max(0, Math.round(args.ltvPercent * 100)))\n const debtUoA = (args.collateralUoAWei * BigInt(bps)) / 10000n\n const borrowWei = (debtUoA * parseUnits('1', args.borrowDecimals)) / args.oneBorrowUnitUoAWei\n if (borrowWei <= 0n) return '0'\n return formatUnits(borrowWei, args.borrowDecimals)\n}\n\n/**\n * Max collateral wei such that borrow at `ltvPercent` is ≤ `maxBorrowWei`, capped by wallet.\n * Uses oracle UoA at **full wallet balance**; assumes `getQuote` scales linearly in collateral amount.\n */\nexport function maxCollateralWeiCappedByBorrowLiquidity(args: {\n walletBalWei: bigint\n maxBorrowWei: bigint\n collateralFullUoAWei: bigint\n oneBorrowUnitUoAWei: bigint\n ltvPercent: number\n borrowDecimals: number\n}): bigint {\n const { walletBalWei, maxBorrowWei, collateralFullUoAWei, oneBorrowUnitUoAWei, ltvPercent, borrowDecimals } = args\n if (walletBalWei <= 0n) return 0n\n if (maxBorrowWei <= 0n) return 0n\n if (!(ltvPercent > 0)) return walletBalWei\n if (collateralFullUoAWei <= 0n || oneBorrowUnitUoAWei <= 0n) return walletBalWei\n\n const bps = Math.min(10000, Math.max(0, Math.round(ltvPercent * 100)))\n const debtUoA = (collateralFullUoAWei * BigInt(bps)) / 10000n\n const borrowWeiFull = (debtUoA * parseUnits('1', borrowDecimals)) / oneBorrowUnitUoAWei\n if (borrowWeiFull <= 0n) return walletBalWei\n if (borrowWeiFull <= maxBorrowWei) return walletBalWei\n return (walletBalWei * maxBorrowWei) / borrowWeiFull\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n isAddress,\n parseAbi,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { EulerV2LendUiPosition } from './eulerV2LendUi'\nimport { eulerV2QueryGraphQl, fetchEulerV2TrackingDepositEntries } from './eulerV2Subgraph'\nimport { fetchEulerV2BorrowPairLtvs } from './eulerV2BorrowRiskOnChain'\n\nconst TRACKING_BORROWS = `\nquery EulerTrackingBorrows($id: Bytes!) {\n trackingActiveAccount(id: $id) {\n borrows\n }\n}`\n\nconst VAULTS_FOR_EVAULTS = `\nquery EulerVaultsForBorrows($ids: [ID!]!) {\n eulerVaults(where: { id_in: $ids }) {\n id\n evault\n evc\n name\n symbol\n asset\n decimals\n collaterals\n }\n}`\n\nconst erc20DecimalsAbi = parseAbi(['function decimals() view returns (uint8)'])\nconst erc4626BalanceAbi = parseAbi(['function balanceOf(address account) view returns (uint256)'])\nconst erc4626MaxWithdrawAbi = parseAbi(['function maxWithdraw(address owner) view returns (uint256)'])\nconst eulerRiskLtAbi = parseAbi(['function LTVBorrow(address collateral) view returns (uint16)'])\nconst eulerLiquidityAbi = parseAbi([\n 'function accountLiquidity(address account, bool liquidation) view returns (uint256 collateralValue, uint256 liabilityValue)',\n])\n\nfunction metaClient(chainId: number, rpcUrl: string): PublicClient {\n const chain = defineChain({\n id: chainId,\n name: 'EulerBorrowPos',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain, transport: http(rpcUrl) })\n}\n\n/** Parse `trackingActiveAccount.borrows` entry: 0x + 40-hex subaccount + 40-hex vault. */\nexport function parseEulerTrackingBorrowEntry(entry: string): { subAccount: Address; borrowVault: Address } | null {\n const s = (entry ?? '').trim().toLowerCase()\n if (!s.startsWith('0x')) return null\n const hex = s.slice(2)\n if (hex.length < 80) return null\n try {\n const subAccount = getAddress(`0x${hex.slice(0, 40)}` as `0x${string}`)\n const borrowVault = getAddress(`0x${hex.slice(40, 80)}` as `0x${string}`)\n return { subAccount, borrowVault }\n } catch {\n return null\n }\n}\n\nexport async function fetchEulerV2TrackingBorrowEntries(args: {\n chainId: number\n mainAddress: Address\n}): Promise<readonly string[]> {\n const id = args.mainAddress.toLowerCase()\n const data = await eulerV2QueryGraphQl<{ trackingActiveAccount?: { borrows?: readonly string[] | null } | null }>(\n args.chainId,\n TRACKING_BORROWS,\n { id },\n )\n const raw = data.trackingActiveAccount?.borrows ?? []\n return raw.filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n}\n\nasync function pickCollateralEvault(args: {\n client: PublicClient\n borrowVault: Address\n subAccount: Address\n collaterals: readonly (string | null | undefined)[] | null | undefined\n}): Promise<Address | null> {\n const cands = (args.collaterals ?? [])\n .map((c) => (c ?? '').trim().toLowerCase())\n .filter((c) => c.startsWith('0x') && isAddress(c)) as string[]\n const uniq = [...new Set(cands)]\n for (const low of uniq) {\n try {\n const coll = getAddress(low as `0x${string}`)\n const lt = await args.client.readContract({\n address: args.borrowVault,\n abi: eulerRiskLtAbi,\n functionName: 'LTVBorrow',\n args: [coll],\n })\n if (Number(lt) === 0) continue\n const bal = await args.client.readContract({\n address: coll,\n abi: erc4626BalanceAbi,\n functionName: 'balanceOf',\n args: [args.subAccount],\n })\n if (bal > 0n) return coll\n } catch {\n /* next */\n }\n }\n for (const low of uniq) {\n try {\n const coll = getAddress(low as `0x${string}`)\n const lt = await args.client.readContract({\n address: args.borrowVault,\n abi: eulerRiskLtAbi,\n functionName: 'LTVBorrow',\n args: [coll],\n })\n if (Number(lt) > 0) return coll\n } catch {\n /* next */\n }\n }\n if (uniq.length) {\n try {\n return getAddress(uniq[0]! as `0x${string}`)\n } catch {\n return null\n }\n }\n return null\n}\n\n/**\n * Load borrow vault rows for `mainAddress` from the Euler tracking subgraph (`borrows`) plus RPC, and supplement\n * pairs from `deposits` + on-chain `debtOf` when the indexer lags. Rows with zero debt are kept when the\n * sub-account still has collateral to withdraw (`maxWithdraw` or vault shares).\n */\nexport async function loadEulerV2BorrowPositionsForOwner(args: {\n chainId: number\n rpcUrl: string\n mainAddress: Address\n}): Promise<EulerV2LendUiPosition[]> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) return []\n\n const [entries, depositEntries] = await Promise.all([\n fetchEulerV2TrackingBorrowEntries({ chainId: args.chainId, mainAddress: args.mainAddress }),\n fetchEulerV2TrackingDepositEntries({ chainId: args.chainId, mainAddress: args.mainAddress }),\n ])\n\n const pairKey = (sub: Address, vault: Address) => `${sub.toLowerCase()}-${vault.toLowerCase()}`\n const seenPairs = new Set<string>()\n const pairs: { subAccount: Address; borrowVault: Address }[] = []\n const pushPair = (sub: Address, vault: Address) => {\n const k = pairKey(sub, vault)\n if (seenPairs.has(k)) return\n seenPairs.add(k)\n pairs.push({ subAccount: sub, borrowVault: vault })\n }\n for (const e of entries) {\n const p = parseEulerTrackingBorrowEntry(e)\n if (p) pushPair(p.subAccount, p.borrowVault)\n }\n\n const client = metaClient(args.chainId, rpc)\n const debtAbi = parseAbi(['function debtOf(address account) view returns (uint256)'])\n /** Goldsky `borrows` can lag; pick up liability vaults from `deposits` + on-chain `debtOf`. */\n for (const e of depositEntries) {\n const p = parseEulerTrackingBorrowEntry(e)\n if (!p) continue\n if (seenPairs.has(pairKey(p.subAccount, p.borrowVault))) continue\n let debtWei = 0n\n try {\n debtWei = await client.readContract({\n address: p.borrowVault,\n abi: debtAbi,\n functionName: 'debtOf',\n args: [p.subAccount],\n })\n } catch {\n continue\n }\n if (debtWei === 0n) continue\n pushPair(p.subAccount, p.borrowVault)\n }\n\n if (!pairs.length) return []\n\n const vaultIds = [...new Set(pairs.map((x) => x.borrowVault.toLowerCase()))]\n const vaultData = await eulerV2QueryGraphQl<{\n eulerVaults: ReadonlyArray<{\n id?: string | null\n evault?: string | null\n evc?: string | null\n name?: string | null\n symbol?: string | null\n asset?: string | null\n decimals?: string | null\n collaterals?: ReadonlyArray<string | null> | null }>\n }>(args.chainId, VAULTS_FOR_EVAULTS, { ids: vaultIds })\n\n const byEvault = new Map<string, (typeof vaultData.eulerVaults)[number]>()\n for (const v of vaultData.eulerVaults ?? []) {\n const ev = (v.evault ?? '').trim().toLowerCase()\n if (ev) byEvault.set(ev, v)\n }\n\n const evcAbi = parseAbi(['function EVC() view returns (address)'])\n\n const out: EulerV2LendUiPosition[] = []\n const t = Date.now()\n\n for (const { subAccount, borrowVault } of pairs) {\n let debtWei = 0n\n try {\n debtWei = await client.readContract({\n address: borrowVault,\n abi: debtAbi,\n functionName: 'debtOf',\n args: [subAccount],\n })\n } catch {\n /* skip if vault read fails */\n }\n\n const vrow = byEvault.get(borrowVault.toLowerCase())\n const decRaw = Number((vrow?.decimals ?? '18').toString().trim() || '18')\n const decimals = Number.isFinite(decRaw) && decRaw >= 0 && decRaw <= 36 ? decRaw : 18\n let assetLow = (vrow?.asset ?? '').trim().toLowerCase()\n if (!assetLow || !isAddress(assetLow)) {\n try {\n const a = await client.readContract({\n address: borrowVault,\n abi: parseAbi(['function asset() view returns (address)']),\n functionName: 'asset',\n })\n assetLow = getAddress(a).toLowerCase()\n } catch {\n assetLow = ''\n }\n }\n let decFinal = decimals\n if (assetLow && isAddress(assetLow)) {\n try {\n const d = await client.readContract({\n address: getAddress(assetLow as `0x${string}`),\n abi: erc20DecimalsAbi,\n functionName: 'decimals',\n })\n const n = Number(d)\n if (Number.isFinite(n) && n >= 0 && n <= 36) decFinal = n\n } catch {\n /* keep */\n }\n }\n\n const debtHuman = formatUnits(debtWei, decFinal)\n const collateralVault = await pickCollateralEvault({\n client,\n borrowVault,\n subAccount,\n collaterals: vrow?.collaterals ?? null,\n })\n\n if (debtWei === 0n) {\n if (!collateralVault) continue\n let maxWithdrawLeft = 0n\n try {\n maxWithdrawLeft = await client.readContract({\n address: collateralVault,\n abi: erc4626MaxWithdrawAbi,\n functionName: 'maxWithdraw',\n args: [subAccount],\n })\n } catch {\n maxWithdrawLeft = 0n\n }\n let collateralShares = 0n\n if (maxWithdrawLeft === 0n) {\n try {\n collateralShares = await client.readContract({\n address: collateralVault,\n abi: erc4626BalanceAbi,\n functionName: 'balanceOf',\n args: [subAccount],\n })\n } catch {\n collateralShares = 0n\n }\n }\n if (maxWithdrawLeft === 0n && collateralShares === 0n) continue\n }\n\n let collateralAssetAddressLower: string | null = null\n let collateralAssetDecimals: number | undefined\n let collateralUnderlyingSymbol: string | null = null\n if (collateralVault) {\n try {\n const assetAddr = await client.readContract({\n address: collateralVault,\n abi: parseAbi(['function asset() view returns (address)']),\n functionName: 'asset',\n })\n const cLow = getAddress(assetAddr).toLowerCase()\n collateralAssetAddressLower = cLow\n const cd = await client.readContract({\n address: getAddress(cLow as `0x${string}`),\n abi: erc20DecimalsAbi,\n functionName: 'decimals',\n })\n const cn = Number(cd)\n if (Number.isFinite(cn) && cn >= 0 && cn <= 36) collateralAssetDecimals = cn\n try {\n const sym = await client.readContract({\n address: getAddress(cLow as `0x${string}`),\n abi: parseAbi(['function symbol() view returns (string)']),\n functionName: 'symbol',\n })\n const s = typeof sym === 'string' ? sym.trim() : ''\n if (s) collateralUnderlyingSymbol = s\n } catch {\n /* optional */\n }\n } catch {\n /* optional */\n }\n }\n\n let maxLtvBps: number | null = null\n let liquidationLtvBps: number | null = null\n if (collateralVault) {\n const risk = await fetchEulerV2BorrowPairLtvs({\n chainId: args.chainId,\n rpcUrl: rpc,\n borrowEvault: borrowVault,\n collateralEvault: collateralVault,\n })\n if (risk) {\n maxLtvBps = risk.maxLtvBps\n liquidationLtvBps = risk.liquidationLtvBps\n }\n }\n\n let currentLtvPercent: number | null = null\n try {\n const [collV, liabV] = await client.readContract({\n address: borrowVault,\n abi: eulerLiquidityAbi,\n functionName: 'accountLiquidity',\n args: [subAccount, false],\n })\n if (collV > 0n && liabV > 0n) {\n currentLtvPercent = Number((liabV * 10000n) / collV) / 100\n }\n } catch {\n /* optional */\n }\n\n let evc: string | null = (vrow?.evc ?? '').trim() ? getAddress(vrow!.evc!.trim() as `0x${string}`) : null\n if (!evc) {\n try {\n const e = await client.readContract({\n address: borrowVault,\n abi: evcAbi,\n functionName: 'EVC',\n })\n evc = getAddress(e)\n } catch {\n evc = null\n }\n }\n\n const marketName =\n [(vrow?.symbol ?? '').trim(), (vrow?.name ?? '').trim()].filter(Boolean).join(' · ') ||\n `Borrow ${borrowVault.slice(0, 10)}…`\n\n out.push({\n id: `borrow-${args.chainId}-${subAccount.toLowerCase()}-${borrowVault.toLowerCase()}`,\n chainId: args.chainId,\n vaultId: (vrow?.id ?? borrowVault).toString(),\n evaultAddress: borrowVault,\n marketName,\n underlyingSymbol: (vrow?.symbol ?? '—').toString().trim() || '—',\n amountHuman: debtHuman,\n createdAtMs: t,\n signRequestId: null,\n positionKind: 'borrow',\n subAccountAddress: subAccount,\n collateralEvaultAddress: collateralVault,\n evcAddress: evc,\n borrowAssetAddressLower: assetLow || null,\n borrowAssetDecimals: decFinal,\n borrowDebtHuman: debtHuman,\n collateralAssetAddressLower,\n collateralAssetDecimals,\n collateralUnderlyingSymbol,\n currentLtvPercent,\n maxLtvBps,\n liquidationLtvBps,\n })\n }\n\n return out.sort((a, b) => (a.marketName || '').localeCompare(b.marketName || ''))\n}\n\n/** Live liability vault debt for repay max button / validation. */\nexport async function fetchEulerV2BorrowDebtWei(args: {\n chainId: number\n rpcUrl: string\n borrowVault: Address\n subAccount: Address\n}): Promise<bigint> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) return 0n\n const client = metaClient(args.chainId, rpc)\n const debtAbi = parseAbi(['function debtOf(address account) view returns (uint256)'])\n try {\n return await client.readContract({\n address: args.borrowVault,\n abi: debtAbi,\n functionName: 'debtOf',\n args: [args.subAccount],\n })\n } catch {\n return 0n\n }\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n parseAbi,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { EulerV2LendUiPosition } from './eulerV2LendUi'\nimport { fetchEulerLabelsEarnVaultAllowlist } from './eulerV2EarnMarkets'\nimport { eulerV2GoldskyUrlForChain, eulerV2QueryGraphQl, eulerWrappedGasTokenAliasesLower, fetchEulerV2TrackingDepositEntries } from './eulerV2Subgraph'\nimport { parseEulerTrackingBorrowEntry } from './eulerV2BorrowPositionsLoad'\nimport {\n clampEulerUnderlyingDecimalsForEulerUi,\n fetchEulerVaultUnderlyingMeta,\n} from './vaultWithdrawMultisign.js'\n\nconst VAULTS_FOR_EVAULTS = `\nquery EulerVaultsForSupply($ids: [ID!]!) {\n eulerVaults(where: { id_in: $ids }) {\n id\n evault\n name\n symbol\n asset\n decimals\n }\n}`\n\nconst vaultSupplyAbi = parseAbi([\n 'function balanceOf(address account) view returns (uint256)',\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function asset() view returns (address)',\n])\nconst debtOfAbi = parseAbi(['function debtOf(address account) view returns (uint256)'])\n\nfunction metaClient(chainId: number, rpcUrl: string): PublicClient {\n const chain = defineChain({\n id: chainId,\n name: 'EulerLendSupply',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain, transport: http(rpcUrl) })\n}\n\nasync function readSupplyUnderlyingWei(\n client: PublicClient,\n vault: Address,\n shareOwner: Address,\n): Promise<{ asset: Address; wei: bigint } | null> {\n try {\n const shares = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'balanceOf',\n args: [shareOwner],\n })\n if (shares === 0n) return null\n const assets = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'convertToAssets',\n args: [shares],\n })\n if (assets === 0n) return null\n const asset = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'asset',\n })\n return { asset: getAddress(asset), wei: assets }\n } catch {\n return null\n }\n}\n\n/**\n * On-chain lend / earn vault positions: Goldsky `trackingActiveAccount.deposits` + RPC share balances and `convertToAssets`.\n * Encoding matches borrow tracking entries: `0x` + 40-hex sub-account + 40-hex eVault (see portfolio aggregation).\n */\nexport async function loadEulerV2LendSupplyPositionsForOwner(args: {\n chainId: number\n rpcUrl: string\n mainAddress: Address\n}): Promise<EulerV2LendUiPosition[]> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) return []\n if (!eulerV2GoldskyUrlForChain(args.chainId)) return []\n\n const [entries, earnVaultAllowlist, gasAliases] = await Promise.all([\n fetchEulerV2TrackingDepositEntries({ chainId: args.chainId, mainAddress: args.mainAddress }),\n fetchEulerLabelsEarnVaultAllowlist(args.chainId),\n eulerWrappedGasTokenAliasesLower(args.chainId),\n ])\n const pairs: { subAccount: Address; evault: Address }[] = []\n for (const e of entries) {\n const p = parseEulerTrackingBorrowEntry(e)\n if (p) pairs.push({ subAccount: p.subAccount, evault: p.borrowVault })\n }\n if (!pairs.length) return []\n\n const vaultIds = [...new Set(pairs.map((x) => x.evault.toLowerCase()))]\n const vaultData = await eulerV2QueryGraphQl<{\n eulerVaults: ReadonlyArray<{\n id?: string | null\n evault?: string | null\n name?: string | null\n symbol?: string | null\n asset?: string | null\n decimals?: string | null\n }>\n }>(args.chainId, VAULTS_FOR_EVAULTS, { ids: vaultIds })\n\n const byEvault = new Map<string, (typeof vaultData.eulerVaults)[number]>()\n for (const v of vaultData.eulerVaults ?? []) {\n const ev = (v.evault ?? '').trim().toLowerCase()\n if (ev) byEvault.set(ev, v)\n }\n\n const client = metaClient(args.chainId, rpc)\n const t = Date.now()\n const out: EulerV2LendUiPosition[] = []\n const seenPair = new Set<string>()\n\n for (const { subAccount, evault } of pairs) {\n const pairKey = `${subAccount.toLowerCase()}-${evault.toLowerCase()}`\n if (seenPair.has(pairKey)) continue\n seenPair.add(pairKey)\n\n const supply = await readSupplyUnderlyingWei(client, evault, subAccount)\n if (!supply) continue\n\n let liabilityDebtWei = 0n\n try {\n liabilityDebtWei = await client.readContract({\n address: evault,\n abi: debtOfAbi,\n functionName: 'debtOf',\n args: [subAccount],\n })\n } catch {\n liabilityDebtWei = 0n\n }\n /** Liability balances belong in BORROW rows (`borrows` / deposit+debtOf), not LEND supply. */\n if (liabilityDebtWei > 0n) continue\n\n const vrow = byEvault.get(evault.toLowerCase())\n\n const isEarn = earnVaultAllowlist.has(evault.toLowerCase())\n const positionKind = isEarn ? 'earn' : 'lend'\n const underlyingSymbol = (vrow?.symbol ?? '—').toString().trim() || '—'\n const marketName =\n [(vrow?.symbol ?? '').trim(), (vrow?.name ?? '').trim()].filter(Boolean).join(' · ') ||\n `${isEarn ? 'Earn' : 'Lend'} ${evault.slice(0, 10)}…`\n\n let evChecksummed: Address\n try {\n evChecksummed = getAddress(evault as `0x${string}`)\n } catch {\n continue\n }\n\n let vaultMeta: { asset: Address; decimals: number }\n try {\n vaultMeta = await fetchEulerVaultUnderlyingMeta({\n rpcUrl: rpc,\n chainId: args.chainId,\n evault: evChecksummed,\n })\n } catch {\n continue\n }\n\n const decimals = clampEulerUnderlyingDecimalsForEulerUi({\n fetchedDecimals: vaultMeta.decimals,\n underlyingAssetLower: vaultMeta.asset.toLowerCase(),\n marketName,\n underlyingSymbol,\n wrappedGasAliasesLower: gasAliases,\n })\n\n const amountHuman = formatUnits(supply.wei, decimals)\n\n out.push({\n id: `${positionKind}-supply-${args.chainId}-${subAccount.toLowerCase()}-${evault.toLowerCase()}`,\n chainId: args.chainId,\n vaultId: (vrow?.id ?? evault).toString(),\n evaultAddress: evault,\n marketName,\n underlyingSymbol,\n amountHuman,\n underlyingAssetsWei: supply.wei.toString(),\n underlyingAssetAddressLower: vaultMeta.asset.toLowerCase(),\n createdAtMs: t,\n signRequestId: null,\n positionKind,\n subAccountAddress: subAccount,\n underlyingAssetDecimals: decimals,\n })\n }\n\n return out.sort((a, b) => (a.marketName || '').localeCompare(b.marketName || ''))\n}\n\n/** Prefer indexer+RPC supply rows over session duplicates (same vault / kind / share holder). */\nexport function mergeEulerV2PositionsTabRows(args: {\n borrow: readonly EulerV2LendUiPosition[]\n chainSupply: readonly EulerV2LendUiPosition[]\n session: readonly EulerV2LendUiPosition[]\n mainAddressLower: string\n}): EulerV2LendUiPosition[] {\n const main = args.mainAddressLower.trim().toLowerCase()\n const keyOf = (p: EulerV2LendUiPosition): string => {\n const kind = p.positionKind ?? 'lend'\n if (kind === 'borrow') return p.id\n const ev = p.evaultAddress.trim().toLowerCase()\n const sub = (p.subAccountAddress ?? main).trim().toLowerCase()\n /** Same vault + share holder for Lend / Earn; avoid duplicate session “earn” row vs chain “lend” row. */\n return `supply|${ev}|${sub}`\n }\n const chainKeys = new Set(args.chainSupply.map(keyOf))\n const sessionFiltered = args.session.filter((s) => !chainKeys.has(keyOf(s)))\n return [...args.borrow, ...args.chainSupply, ...sessionFiltered]\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n} from 'viem'\n\n/** Matches `RewardToken` / `ERC20WrapperLocked.LOCK_NORMALIZATION_FACTOR`. */\nexport const REUL_LOCK_DAY_SEC = 86_400n\n/** Matches `RewardToken` linear vesting: 180 days from lock timestamp. */\nexport const REUL_FULL_VEST_SEC = 180n * REUL_LOCK_DAY_SEC\n\nconst rewardTokenReadAbi = parseAbi([\n 'function getLockedAmounts(address account) view returns (uint256[] lockTimestamps, uint256[] amounts)',\n 'function getWithdrawAmountsByLockTimestamp(address account, uint256 lockTimestamp) view returns (uint256 accountAmount, uint256 remainderAmount)',\n])\n\nexport const eulerReulUnlockAbi = parseAbi([\n 'function withdrawToByLockTimestamps(address account, uint256[] lockTimestamps, bool allowRemainderLoss) returns (bool)',\n])\n\nexport type EulerReulVestingTranche = {\n reulToken: Address\n lockTimestampSec: bigint\n lockedAmountWei: bigint\n /** EUL (underlying) to wallet if unlocking now. */\n unlockToWalletWei: bigint\n /** EUL sent to remainder receiver when unlocking early (forfeiture). */\n remainderWei: bigint\n /** Unix second when this tranche can be fully unlocked with no remainder. */\n fullVestTimestampSec: bigint\n /** Same as `remainderWei === 0n`. */\n isFullyVested: boolean\n}\n\nexport async function fetchEulerReulVestingTranches(args: {\n rpcUrl: string\n chainId: number\n reulToken: Address\n user: Address\n}): Promise<readonly EulerReulVestingTranche[]> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) return []\n const reul = getAddress(args.reulToken)\n const user = getAddress(args.user)\n const ch = defineChain({\n id: args.chainId,\n name: 'ReulVest',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpc] } },\n })\n const client = createPublicClient({ chain: ch, transport: http(rpc) })\n const [timestamps, amounts] = await client.readContract({\n address: reul,\n abi: rewardTokenReadAbi,\n functionName: 'getLockedAmounts',\n args: [user],\n })\n const out: EulerReulVestingTranche[] = []\n for (let i = 0; i < timestamps.length; i++) {\n const lockTs = timestamps[i]!\n const lockedAmt = amounts[i]!\n if (lockedAmt === 0n) continue\n const [unlockToWalletWei, remainderWei] = await client.readContract({\n address: reul,\n abi: rewardTokenReadAbi,\n functionName: 'getWithdrawAmountsByLockTimestamp',\n args: [user, lockTs],\n })\n out.push({\n reulToken: reul,\n lockTimestampSec: lockTs,\n lockedAmountWei: lockedAmt,\n unlockToWalletWei,\n remainderWei,\n fullVestTimestampSec: lockTs + REUL_FULL_VEST_SEC,\n isFullyVested: remainderWei === 0n,\n })\n }\n return out\n}\n\nexport function encodeEulerReulWithdrawToByLockTimestampsData(args: {\n recipient: Address\n lockTimestampsSec: readonly bigint[]\n allowRemainderLoss: boolean\n}): `0x${string}` {\n const recipient = getAddress(args.recipient)\n if (args.lockTimestampsSec.length === 0) throw new Error('No rEUL lock timestamps to unlock.')\n return encodeFunctionData({\n abi: eulerReulUnlockAbi,\n functionName: 'withdrawToByLockTimestamps',\n args: [recipient, [...args.lockTimestampsSec], args.allowRemainderLoss],\n })\n}\n\n/** Gas fallback for `withdrawToByLockTimestamps` (batch). */\nexport const EULER_REUL_UNLOCK_GAS_FALLBACK = 500_000n\n","/** CoinGecko asset platform id by mainnet chainId (contract price endpoint). */\nexport const COINGECKO_PLATFORM_BY_CHAIN_ID: Record<string, string> = {\n '1': 'ethereum',\n '56': 'binance-smart-chain',\n '137': 'polygon-pos',\n '42161': 'arbitrum-one',\n '10': 'optimistic-ethereum',\n '43114': 'avalanche',\n '8453': 'base',\n '324': 'zk-sync-era',\n '42220': 'celo',\n '250': 'fantom',\n '100': 'gnosis',\n '204': 'op-bnb',\n '534352': 'scroll',\n '5000': 'mantle',\n '169': 'manta-pacific',\n '1116': 'core',\n '30': 'rootstock',\n '288': 'boba',\n '1088': 'metis-andromeda',\n '34443': 'mode',\n '80084': 'berachain',\n '146': 'sonic',\n '60808': 'bob-network',\n '80094': 'berachain',\n '130': 'unichain',\n '57073': 'ink',\n '999': 'hyperevm',\n '239': 'tac',\n '9745': 'plasma',\n '1923': 'swellchain',\n '59144': 'linea',\n '81457': 'blast',\n '7777777': 'zora',\n}\n\nexport function coingeckoPlatformForChainId(chainId: string | number): string | undefined {\n return COINGECKO_PLATFORM_BY_CHAIN_ID[String(chainId).trim()]\n}\n","import {\n createPublicClient,\n defineChain,\n formatUnits,\n getAddress,\n http,\n isAddress,\n parseAbi,\n type Address,\n} from 'viem'\nimport { eulerV2GoldskyUrlForChain, eulerV2QueryGraphQl } from './eulerV2Subgraph'\nimport { parseEulerTrackingBorrowEntry } from './eulerV2BorrowPositionsLoad'\nimport { COINGECKO_PLATFORM_BY_CHAIN_ID } from '../../../chains/evm/coingecko.js'\nimport { getCoingeckoProxyUrl } from '../../../core/defiProxy.js'\n\nconst TRACKING_ACCOUNT = `\nquery EulerTrackingAccount($id: Bytes!) {\n trackingActiveAccount(id: $id) {\n deposits\n borrows\n }\n}`\n\nconst vaultSupplyAbi = parseAbi([\n 'function balanceOf(address account) view returns (uint256)',\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function asset() view returns (address)',\n])\n\nconst erc20DecimalsAbi = parseAbi(['function decimals() view returns (uint8)'])\nconst debtOfAbi = parseAbi(['function debtOf(address account) view returns (uint256)'])\n\ntype GqlTracking = {\n trackingActiveAccount?: {\n deposits?: readonly (string | null)[] | null\n borrows?: readonly (string | null)[] | null\n } | null\n}\n\nfunction publicClient(chainId: number, rpcUrl: string) {\n const ch = defineChain({\n id: chainId,\n name: 'EulerPortfolio',\n nativeCurrency: { decimals: 18, name: 'x', symbol: 'x' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n return createPublicClient({ chain: ch, transport: http(rpcUrl) })\n}\n\nasync function gqlTrackingAccount(chainId: number, mainLower: string): Promise<{\n deposits: string[]\n borrows: string[]\n}> {\n if (!eulerV2GoldskyUrlForChain(chainId)) {\n return { deposits: [], borrows: [] }\n }\n const data = await eulerV2QueryGraphQl<GqlTracking>(chainId, TRACKING_ACCOUNT, { id: mainLower })\n const a = data.trackingActiveAccount\n const dep = (a?.deposits ?? []).filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n const bor = (a?.borrows ?? []).filter((x): x is string => typeof x === 'string' && x.trim().length > 0)\n return { deposits: dep, borrows: bor }\n}\n\nasync function decimalsForAsset(\n client: ReturnType<typeof publicClient>,\n asset: Address,\n): Promise<number> {\n try {\n const d = await client.readContract({\n address: asset,\n abi: erc20DecimalsAbi,\n functionName: 'decimals',\n })\n const n = Number(d)\n if (Number.isFinite(n) && n >= 0 && n <= 36) return n\n } catch {\n /* ignore */\n }\n return 18\n}\n\nasync function readSupplyUnderlyingWei(\n client: ReturnType<typeof publicClient>,\n vault: Address,\n subAccount: Address,\n): Promise<{ asset: Address; wei: bigint } | null> {\n try {\n const shares = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'balanceOf',\n args: [subAccount],\n })\n if (shares === 0n) return null\n const assets = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'convertToAssets',\n args: [shares],\n })\n if (assets === 0n) return null\n const asset = await client.readContract({\n address: vault,\n abi: vaultSupplyAbi,\n functionName: 'asset',\n })\n return { asset: getAddress(asset), wei: assets }\n } catch {\n return null\n }\n}\n\nasync function readBorrowDebtWei(\n client: ReturnType<typeof publicClient>,\n borrowVault: Address,\n subAccount: Address,\n): Promise<{ asset: Address; wei: bigint } | null> {\n try {\n const debt = await client.readContract({\n address: borrowVault,\n abi: debtOfAbi,\n functionName: 'debtOf',\n args: [subAccount],\n })\n if (debt === 0n) return null\n const asset = await client.readContract({\n address: borrowVault,\n abi: vaultSupplyAbi,\n functionName: 'asset',\n })\n return { asset: getAddress(asset), wei: debt }\n } catch {\n return null\n }\n}\n\nfunction mergeWei(into: Map<string, bigint>, asset: Address, wei: bigint) {\n const k = asset.toLowerCase()\n into.set(k, (into.get(k) ?? 0n) + wei)\n}\n\n/** When `simple/token_price` omits contracts (rate limits, fresh listings), try per-token contract endpoint. */\nasync function fetchCoingeckoContractUsdFromDetail(args: {\n platform: string\n contractAddressLower: string\n}): Promise<number | null> {\n const a = args.contractAddressLower.trim().toLowerCase()\n if (!a.startsWith('0x')) return null\n const url = `https://api.coingecko.com/api/v3/coins/${encodeURIComponent(args.platform)}/contract/${a}`\n try {\n const r = await fetch(url, { cache: 'no-store' })\n if (!r.ok) return null\n const j = (await r.json()) as { market_data?: { current_price?: { usd?: number } } }\n const u = j.market_data?.current_price?.usd\n if (typeof u !== 'number' || !Number.isFinite(u) || u < 0) return null\n return u\n } catch {\n return null\n }\n}\n\nasync function augmentMissingTokenPrices(args: {\n platform: string\n addressesLower: readonly string[]\n prices: Map<string, number>\n}): Promise<void> {\n const missing = args.addressesLower\n .map((x) => x.trim().toLowerCase())\n .filter((x) => x.startsWith('0x') && !args.prices.has(x))\n /** Serial: avoid CoinGecko burst limits; typically 1–4 tokens. */\n for (const addr of missing.slice(0, 12)) {\n const u = await fetchCoingeckoContractUsdFromDetail({ platform: args.platform, contractAddressLower: addr })\n if (u != null) args.prices.set(addr, u)\n }\n}\n\nconst COINGECKO_CHUNK = 45\n\n/** CoinGecko `usd` per 1 token, keyed by lowercase contract address. */\nexport async function fetchCoingeckoTokenUsdByContract(args: {\n chainId: number\n contractAddressesLower: readonly string[]\n}): Promise<Map<string, number>> {\n const platform = COINGECKO_PLATFORM_BY_CHAIN_ID[String(args.chainId)]\n const out = new Map<string, number>()\n if (!platform || args.contractAddressesLower.length === 0) return out\n\n const uniq = [...new Set(args.contractAddressesLower.map((a) => a.trim().toLowerCase()).filter((a) => a.startsWith('0x')))]\n for (let i = 0; i < uniq.length; i += COINGECKO_CHUNK) {\n const chunk = uniq.slice(i, i + COINGECKO_CHUNK)\n const url = `https://api.coingecko.com/api/v3/simple/token_price/${encodeURIComponent(platform)}?contract_addresses=${chunk.join(',')}&vs_currencies=usd`\n try {\n const proxy = getCoingeckoProxyUrl()\n const r = proxy\n ? await fetch(proxy, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify({platform, contractAddresses: chunk}),\n })\n : await fetch(url, {cache: 'no-store'})\n if (!r.ok) continue\n const j = (await r.json()) as Record<string, { usd?: number } | undefined>\n for (const [addr, row] of Object.entries(j)) {\n const u = row?.usd\n if (typeof u === 'number' && Number.isFinite(u) && u >= 0) out.set(addr.toLowerCase(), u)\n }\n } catch {\n /* ignore */\n }\n }\n return out\n}\n\nexport type EulerV2PortfolioUsdSnapshot = {\n totalSuppliedUsd: number | null\n totalBorrowedUsd: number | null\n netAssetValueUsd: number | null\n /** True when any non-zero position lacked a CoinGecko USD price. */\n partialPricing: boolean\n /** No CoinGecko `platform` mapping for this chain — USD not available. */\n pricingUnavailable: boolean\n error: string | null\n}\n\nfunction sumSideUsd(args: {\n byAssetWei: Map<string, bigint>\n decimalsByAsset: Map<string, number>\n prices: Map<string, number>\n}): { usd: number | null; partial: boolean } {\n let partial = false\n let total = 0\n let anyPriced = false\n let anyUnpricedNonZero = false\n\n /** Non-zero wei entries only; keys with permanent 0 wei pollute Maps and wrongly drove “all unpriced” null before. */\n const entries = [...args.byAssetWei.entries()].filter(([, w]) => w > 0n)\n if (entries.length === 0) return { usd: 0, partial: false }\n\n for (const [assetLow, wei] of entries) {\n const dec = args.decimalsByAsset.get(assetLow) ?? 18\n const p = args.prices.get(assetLow)\n if (p == null) {\n partial = true\n anyUnpricedNonZero = true\n continue\n }\n let humanAmt: number\n try {\n humanAmt = Number.parseFloat(formatUnits(wei, dec))\n } catch {\n partial = true\n anyUnpricedNonZero = true\n continue\n }\n const slice = humanAmt * p\n if (!Number.isFinite(humanAmt) || !Number.isFinite(p) || !Number.isFinite(slice)) {\n partial = true\n anyUnpricedNonZero = true\n continue\n }\n anyPriced = true\n total += slice\n }\n\n if (anyUnpricedNonZero && !anyPriced) return { usd: null, partial: true }\n if (anyUnpricedNonZero) partial = true\n if (!Number.isFinite(total)) return { usd: null, partial: true }\n return { usd: total, partial }\n}\n\n/**\n * Supplied (deposit vault shares → assets), borrowed (`debtOf`), and NAV in USD via CoinGecko token prices.\n * Best-effort: chains without CoinGecko platform mapping return `pricingUnavailable`.\n */\nexport async function loadEulerV2PortfolioUsdSnapshot(args: {\n chainId: number\n rpcUrl: string\n mainAddress: Address\n}): Promise<EulerV2PortfolioUsdSnapshot> {\n const rpc = args.rpcUrl.trim()\n const empty: EulerV2PortfolioUsdSnapshot = {\n totalSuppliedUsd: null,\n totalBorrowedUsd: null,\n netAssetValueUsd: null,\n partialPricing: false,\n pricingUnavailable: false,\n error: null,\n }\n if (!rpc) {\n return { ...empty, error: 'No RPC URL.' }\n }\n\n const platform = COINGECKO_PLATFORM_BY_CHAIN_ID[String(args.chainId)]\n\n try {\n const mainLower = args.mainAddress.toLowerCase()\n const { deposits, borrows } = await gqlTrackingAccount(args.chainId, mainLower)\n const client = publicClient(args.chainId, rpc)\n\n const suppliedWeiByAsset = new Map<string, bigint>()\n const borrowedWeiByAsset = new Map<string, bigint>()\n\n type Pair = { subAccount: Address; vault: Address }\n const borrowPairSeen = new Set<string>()\n const borrowPairs: Pair[] = []\n const pushBorrowPair = (sub: Address, vault: Address) => {\n const k = `${sub.toLowerCase()}-${vault.toLowerCase()}`\n if (borrowPairSeen.has(k)) return\n borrowPairSeen.add(k)\n borrowPairs.push({ subAccount: sub, vault })\n }\n\n const supplyReads: Promise<void>[] = []\n for (const entry of deposits) {\n const p = parseEulerTrackingBorrowEntry(entry)\n if (!p) continue\n pushBorrowPair(p.subAccount, p.borrowVault)\n supplyReads.push(\n (async () => {\n const r = await readSupplyUnderlyingWei(client, p.borrowVault, p.subAccount)\n if (!r) return\n mergeWei(suppliedWeiByAsset, r.asset, r.wei)\n })(),\n )\n }\n for (const entry of borrows) {\n const p = parseEulerTrackingBorrowEntry(entry)\n if (!p) continue\n pushBorrowPair(p.subAccount, p.borrowVault)\n }\n\n const borrowReads: Promise<void>[] = borrowPairs.map(\n ({ subAccount, vault }) =>\n (async () => {\n const r = await readBorrowDebtWei(client, vault, subAccount)\n if (!r) return\n mergeWei(borrowedWeiByAsset, r.asset, r.wei)\n })(),\n )\n\n await Promise.all([...supplyReads, ...borrowReads])\n\n /** Price / decimals only assets with non-zero supply or borrowed wei (avoids junk keys). */\n const allAssets = new Set<string>()\n for (const [a, w] of suppliedWeiByAsset) if (w > 0n) allAssets.add(a.toLowerCase())\n for (const [a, w] of borrowedWeiByAsset) if (w > 0n) allAssets.add(a.toLowerCase())\n const decimalsByAsset = new Map<string, number>()\n for (const low of allAssets) {\n if (!isAddress(low)) continue\n const dec = await decimalsForAsset(client, getAddress(low as `0x${string}`))\n decimalsByAsset.set(low.toLowerCase(), dec)\n }\n\n const prices =\n platform != null\n ? await fetchCoingeckoTokenUsdByContract({\n chainId: args.chainId,\n contractAddressesLower: [...allAssets],\n })\n : new Map<string, number>()\n\n if (platform != null && allAssets.size > 0) {\n await augmentMissingTokenPrices({\n platform,\n addressesLower: [...allAssets],\n prices,\n })\n }\n\n const s = sumSideUsd({ byAssetWei: suppliedWeiByAsset, decimalsByAsset, prices })\n const b = sumSideUsd({ byAssetWei: borrowedWeiByAsset, decimalsByAsset, prices })\n\n const sUsd = s.usd != null && Number.isFinite(s.usd) ? s.usd : null\n const bUsd = b.usd != null && Number.isFinite(b.usd) ? b.usd : null\n\n let nav: number | null = null\n if (sUsd != null && bUsd != null) nav = sUsd - bUsd\n else if (sUsd != null && (borrowedWeiByAsset.size === 0 || [...borrowedWeiByAsset.values()].every((w) => w === 0n))) {\n nav = sUsd\n } else if (\n bUsd != null &&\n (suppliedWeiByAsset.size === 0 || [...suppliedWeiByAsset.values()].every((w) => w === 0n))\n ) {\n nav = -bUsd\n }\n if (nav != null && !Number.isFinite(nav)) nav = null\n\n const hasAnyPosition = [...suppliedWeiByAsset.values(), ...borrowedWeiByAsset.values()].some((w) => w > 0n)\n const partialPricing = s.partial || b.partial\n const pricingUnavailable = platform == null && hasAnyPosition\n\n return {\n totalSuppliedUsd: sUsd,\n totalBorrowedUsd: bUsd,\n netAssetValueUsd: nav,\n partialPricing: platform != null && partialPricing,\n pricingUnavailable,\n error: null,\n }\n } catch (e) {\n return {\n ...empty,\n error: e instanceof Error ? e.message : 'Could not load portfolio.',\n }\n }\n}\n","import { EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID } from './eulerV2Subgraph'\n\nlet cached: ReadonlySet<number> | null = null\n\n/**\n * Euler V2: EVM chain IDs that have a Goldsky subgraph endpoint listed in Euler docs.\n * @see https://docs.euler.finance/developers/data-querying/subgraphs\n */\nexport function loadEulerV2SupportedChainIds(): Promise<ReadonlySet<number>> {\n if (cached) return Promise.resolve(cached)\n cached = new Set(Object.keys(EULER_V2_GOLDSKY_SUBGRAPH_URL_BY_CHAIN_ID).map((k) => Number(k)))\n return Promise.resolve(cached)\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'\nexport * from './eulerV2Subgraph.js'\nexport * from './eulerV2LendMarkets.js'\nexport * from './eulerV2Discovery.js'\nexport * from './eulerV2EarnMarkets.js'\nexport * from './eulerV2BorrowPositionsLoad.js'\nexport * from './eulerV2LendSupplyPositionsLoad.js'\nexport * from './eulerV2BorrowRiskOnChain.js'\nexport * from './eulerV2VaultCapsOnChain.js'\nexport * from './eulerReulVestingOnChain.js'\nexport * from './eulerLabelsProducts.js'\nexport * from './eulerV2PortfolioUsd.js'\nexport * from './loadEulerV2SupportedChainIds.js'\nexport * from './eulerV2LendUi.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"]}
|