@continuumdao/ctm-mpc-defi 0.1.4 → 0.2.0
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 +878 -141
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.cts +756 -12
- package/dist/agent/catalog.d.ts +756 -12
- package/dist/agent/catalog.js +829 -142
- package/dist/agent/catalog.js.map +1 -1
- package/dist/chains/evm/index.cjs +13 -0
- package/dist/chains/evm/index.cjs.map +1 -1
- package/dist/chains/evm/index.d.cts +3 -1
- package/dist/chains/evm/index.d.ts +3 -1
- package/dist/chains/evm/index.js +13 -1
- package/dist/chains/evm/index.js.map +1 -1
- package/dist/index.cjs +825 -141
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +825 -142
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs +1987 -0
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -0
- package/dist/protocols/evm/aave-v4/index.d.cts +500 -0
- package/dist/protocols/evm/aave-v4/index.d.ts +500 -0
- package/dist/protocols/evm/aave-v4/index.js +1943 -0
- package/dist/protocols/evm/aave-v4/index.js.map +1 -0
- package/dist/protocols/evm/ethena/index.cjs +965 -0
- package/dist/protocols/evm/ethena/index.cjs.map +1 -0
- package/dist/protocols/evm/ethena/index.d.cts +161 -0
- package/dist/protocols/evm/ethena/index.d.ts +161 -0
- package/dist/protocols/evm/ethena/index.js +943 -0
- package/dist/protocols/evm/ethena/index.js.map +1 -0
- package/dist/protocols/evm/euler-v2/index.cjs +2263 -0
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -0
- package/dist/protocols/evm/euler-v2/index.d.cts +317 -0
- package/dist/protocols/evm/euler-v2/index.d.ts +317 -0
- package/dist/protocols/evm/euler-v2/index.js +2238 -0
- package/dist/protocols/evm/euler-v2/index.js.map +1 -0
- package/dist/protocols/evm/lido/index.cjs +834 -0
- package/dist/protocols/evm/lido/index.cjs.map +1 -0
- package/dist/protocols/evm/lido/index.d.cts +120 -0
- package/dist/protocols/evm/lido/index.d.ts +120 -0
- package/dist/protocols/evm/lido/index.js +809 -0
- package/dist/protocols/evm/lido/index.js.map +1 -0
- package/dist/protocols/evm/maple/index.cjs +707 -0
- package/dist/protocols/evm/maple/index.cjs.map +1 -0
- package/dist/protocols/evm/maple/index.d.cts +109 -0
- package/dist/protocols/evm/maple/index.d.ts +109 -0
- package/dist/protocols/evm/maple/index.js +693 -0
- package/dist/protocols/evm/maple/index.js.map +1 -0
- package/dist/protocols/evm/sky/index.cjs +1254 -0
- package/dist/protocols/evm/sky/index.cjs.map +1 -0
- package/dist/protocols/evm/sky/index.d.cts +218 -0
- package/dist/protocols/evm/sky/index.d.ts +218 -0
- package/dist/protocols/evm/sky/index.js +1229 -0
- package/dist/protocols/evm/sky/index.js.map +1 -0
- package/package.json +37 -3
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/ethena/constants.ts","../../../../src/core/keygen.ts","../../../../src/chains/evm/txParams.ts","../../../../src/chains/evm/fees/chainFees.ts","../../../../src/chains/evm/fees/eip1559Align.ts","../../../../src/protocols/evm/ethena/multisign.ts","../../../../src/protocols/evm/ethena/index.ts"],"names":["gasPriceGwei","defineChain","createPublicClient","http","getAddress","parseGwei"],"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","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","/**\n * Ethena USDe (synthetic USD) — published contract addresses and EVM chain coverage.\n * @see https://docs.ethena.fi/solution-design/key-addresses\n */\nimport { getAddress } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nexport const ETHENA_LABS_GITHUB = 'https://github.com/ethena-labs'\nexport const ETHENA_KEY_ADDRESSES_DOC = 'https://docs.ethena.fi/solution-design/key-addresses'\n\nexport const USDE_ETHEREUM_MAINNET = '0x4c9edd5852cd905f086c759e8383e09bff1e68b3' as const\n/** sUSDe (StakedUSDe / ERC-4626 vault share) on Ethereum mainnet. @see Ethena key addresses */\nexport const SUSDE_ETHEREUM_MAINNET = '0x9d39a5de30e57443bff2a8307a4256c8797a3497' as const\n/** “Most L2s” in Ethena’s key-addresses table (same bytecode address on many networks). */\nexport const USDE_MOST_L2S = '0x5d3a1Ff2b6BAb83b63cd9AD0787074081a52ef34' as const\nexport const USDE_ZKSYNC_ERA = '0x39Fe7a0DACcE31Bd90418e3e659fb0b5f0B3Db0d' as const\n\nconst L2_SAME_ADDRESS_CHAIN_IDS: ReadonlySet<number> = new Set([\n 42161, // Arbitrum One\n 10, // Optimism\n 8453, // Base\n 56, // BNB Chain\n 59144, // Linea\n 5000, // Mantle\n 81457, // Blast\n 169, // Manta Pacific\n 534352, // Scroll\n 252, // Fraxtal\n 34443, // Mode\n 196, // X Layer\n 1088, // Metis\n 80084, // Berachain\n 2222, // Kava\n 2818, // Morph\n 1923, // Swell\n 48900, // Zircuit\n])\n\n/** Human-readable default label when the node’s chain list has no name for that id. */\nconst FALLBACK_NAME_BY_ID: Readonly<Record<number, string>> = {\n 1: 'Ethereum',\n 42161: 'Arbitrum One',\n 10: 'Optimism',\n 8453: 'Base',\n 56: 'BNB Chain',\n 59144: 'Linea',\n 5000: 'Mantle',\n 81457: 'Blast',\n 169: 'Manta Pacific',\n 534352: 'Scroll',\n 252: 'Fraxtal',\n 34443: 'Mode',\n 196: 'X Layer',\n 1088: 'Metis',\n 80084: 'Berachain',\n 2222: 'Kava',\n 2818: 'Morph',\n 1923: 'Swell',\n 48900: 'Zircuit',\n 324: 'ZKSync Era',\n}\n\n/**\n * USDe address on a chain, or `null` if we do not model USDe for that EVM id (e.g. testnets / unlisted L2s).\n */\nexport function usdeTokenAddressOnEvmChain(chainId: number): `0x${string}` | null {\n if (chainId === 1) return USDE_ETHEREUM_MAINNET\n if (chainId === 324) return USDE_ZKSYNC_ERA\n if (L2_SAME_ADDRESS_CHAIN_IDS.has(chainId)) return USDE_MOST_L2S\n return null\n}\n\nexport function isEthenaUsdeOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = usdeTokenAddressOnEvmChain(n)\n if (!expected) return false\n try {\n return getAddress(contractAddress) === getAddress(expected)\n } catch {\n return false\n }\n}\n\nexport type EthenaUsdeEvmNetworkRow = {\n chainId: number\n /** Static fallback; UI may prefer a name from the node’s chain list. */\n label: string\n usde: `0x${string}`\n}\n\n/**\n * EVM mainnets with a known USDe deployment for the “networks” table in the Ethena dialog.\n * ZKSync uses a different address; all other listed L2s here share `USDE_MOST_L2S`.\n */\nexport function listEthenaUsdeEvmNetworkRows(): EthenaUsdeEvmNetworkRow[] {\n const rows: EthenaUsdeEvmNetworkRow[] = [\n { chainId: 1, label: FALLBACK_NAME_BY_ID[1]!, usde: USDE_ETHEREUM_MAINNET },\n ]\n const l2 = [...L2_SAME_ADDRESS_CHAIN_IDS].sort((a, b) => a - b)\n for (const id of l2) {\n rows.push({\n chainId: id,\n label: FALLBACK_NAME_BY_ID[id] ?? `Chain ${id}`,\n usde: USDE_MOST_L2S,\n })\n }\n rows.push({ chainId: 324, label: FALLBACK_NAME_BY_ID[324]!, usde: USDE_ZKSYNC_ERA })\n return rows.sort((a, b) => {\n if (a.chainId === 1) return -1\n if (b.chainId === 1) return 1\n return a.chainId - b.chainId\n })\n}\n\nexport function isEvmChainInEthenaUsdeList(chainId: number): boolean {\n return usdeTokenAddressOnEvmChain(chainId) != null\n}\n","import type { KeyGenSubset } from './types.js'\n\nexport type { KeyGenSubset }\n\n/** App-compatible alias used by existing multisign builders. */\nexport type KeyGenSubsetForPermit = KeyGenSubset\n\nexport function firstClientIdFromKeyGen(data: KeyGenSubset | null | undefined): string | null {\n const map = data?.ClientKeys\n if (!map || typeof map !== 'object') return null\n for (const v of Object.values(map)) {\n if (typeof v === 'string' && v.trim()) return v.trim()\n }\n return null\n}\n\nexport function requirePubKeyHex(keyGen: KeyGenSubset): string {\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n return ph\n}\n\nexport function keyListFromKeyGen(keyGen: KeyGenSubset): string[] {\n return keyGen.keylist ?? []\n}\n","/**\n * Proposal-time EVM fields for POST /multiSignRequest (mpc-auth).\n * Same shape as trigger txParams and GET /getSignRequestById?tx_params=1.\n */\n\nexport type ProposalTxParams = {\n nonce: number\n gasLimit: string\n txType: 'eip1559' | 'legacy'\n maxFeePerGas?: string\n maxPriorityFeePerGas?: string\n gasPrice?: string\n}\n\nexport function gasLimitFromEstimateAndChainConfig(\n estimatedGas: bigint,\n chainGasLimit?: number,\n): bigint {\n if (chainGasLimit == null || !Number.isFinite(chainGasLimit) || chainGasLimit <= 0) {\n return estimatedGas\n }\n const cfg = BigInt(Math.floor(chainGasLimit))\n return cfg > estimatedGas ? cfg : estimatedGas\n}\n\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n\nexport function composeFeePayloadToTxParams(\n p: Record<string, unknown>,\n legacy: boolean,\n): ProposalTxParams | undefined {\n const gl = p.txGasLimit ?? p.txgaslimit\n if (gl == null || String(gl).trim() === '') return undefined\n const n = p.txNonce ?? p.txnonce\n let nonce = 0\n if (typeof n === 'bigint') nonce = Number(n)\n else if (typeof n === 'number') nonce = n\n else if (n != null) nonce = parseInt(String(n), 10)\n if (!Number.isFinite(nonce)) nonce = 0\n const gasLimit = String(gl)\n if (legacy) {\n const gp = p.txGasPrice ?? p.txgasprice\n return {\n nonce,\n gasLimit,\n txType: 'legacy',\n gasPrice: gp != null ? String(gp) : '0',\n }\n }\n return {\n nonce,\n gasLimit,\n txType: 'eip1559',\n maxFeePerGas: String(p.txMaxFeePerGas ?? ''),\n maxPriorityFeePerGas: String(p.txMaxPriorityFeePerGas ?? ''),\n }\n}\n\nexport function triggerTxParamsFromComposeBody(body: Record<string, unknown>): ProposalTxParams {\n const existing = body.txParams\n if (existing && typeof existing === 'object' && !Array.isArray(existing)) {\n const o = existing as ProposalTxParams & { gasLimit?: string }\n if (String(o.gasLimit ?? '').trim() !== '') {\n return { ...o }\n }\n }\n const pb = body.proposalTxParams\n if (Array.isArray(pb) && pb.length > 0 && typeof pb[0] === 'object' && pb[0] !== null) {\n const first = pb[0] as ProposalTxParams & { gasLimit?: string }\n if (String(first.gasLimit ?? '').trim() !== '') {\n return { ...first }\n }\n }\n const fromSnapshot = composeFeePayloadToTxParams(\n body,\n body.txMaxFeePerGas == null && body.txMaxPriorityFeePerGas == null,\n )\n if (fromSnapshot) return fromSnapshot\n return {\n nonce: 0,\n gasLimit: '',\n txType: 'legacy',\n gasPrice: '0',\n }\n}\n\nexport function proposalTxParamsToFeeSnapshot(\n params: ProposalTxParams,\n): Record<string, unknown> {\n if (params.txType === 'legacy') {\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txGasPrice: params.gasPrice ?? '0',\n }\n }\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txMaxFeePerGas: params.maxFeePerGas ?? '',\n txMaxPriorityFeePerGas: params.maxPriorityFeePerGas ?? '',\n }\n}\n","import { createPublicClient, http, defineChain, formatUnits } from 'viem'\n\nexport interface ChainFeeParams {\n isEip1559: boolean\n baseFeeGwei?: number\n priorityFeeGwei?: number\n gasPriceGwei?: number\n}\n\nexport async function fetchChainFeeParams(\n rpcUrl: string,\n chainId: number | string,\n): Promise<ChainFeeParams> {\n const url = rpcUrl.trim()\n if (!url) return { isEip1559: false }\n\n const chainIdNum = typeof chainId === 'string' ? parseInt(chainId, 10) : chainId\n if (Number.isNaN(chainIdNum)) return { isEip1559: false }\n\n const chain = defineChain({\n id: chainIdNum,\n name: 'Discovery',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [url] } },\n })\n\n const publicClient = createPublicClient({\n chain,\n transport: http(url),\n })\n\n const getGasPriceGwei = async (): Promise<number> => {\n const gasPriceWei = await publicClient.getGasPrice()\n return parseFloat(formatUnits(gasPriceWei, 9))\n }\n\n try {\n const block = await publicClient.getBlock({ blockTag: 'latest' })\n const baseFeePerGas = block?.baseFeePerGas\n if (baseFeePerGas == null || baseFeePerGas === undefined) {\n const gasPriceGwei = await getGasPriceGwei()\n return { isEip1559: false, gasPriceGwei }\n }\n\n const baseFeeGwei = parseFloat(formatUnits(baseFeePerGas, 9))\n\n let priorityFeeGwei: number | undefined\n try {\n const priorityWei = await publicClient.estimateMaxPriorityFeePerGas()\n priorityFeeGwei = parseFloat(formatUnits(priorityWei, 9))\n } catch {\n /* chain may not support eth_maxPriorityFeePerGas */\n }\n\n const gasPriceGwei = await getGasPriceGwei()\n return {\n isEip1559: true,\n baseFeeGwei,\n priorityFeeGwei,\n gasPriceGwei,\n }\n } catch {\n try {\n const gasPriceWei = await publicClient.getGasPrice()\n const gasPriceGwei = parseFloat(formatUnits(gasPriceWei, 9))\n return { isEip1559: false, gasPriceGwei }\n } catch {\n return { isEip1559: false }\n }\n }\n}\n","import { parseGwei } from 'viem'\n\nexport type ResolvedEip1559Fees = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\n\nfunction finalizeEip1559Fees(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n floor: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint } | null | undefined,\n baseWei: bigint,\n): ResolvedEip1559Fees {\n let maxP = maxPriorityFeePerGas\n let maxF = maxFeePerGas\n if (floor) {\n if (maxP < floor.maxPriorityFeePerGas) maxP = floor.maxPriorityFeePerGas\n if (maxF < floor.maxFeePerGas) maxF = floor.maxFeePerGas\n }\n if (baseWei > 0n && maxF < baseWei + maxP) {\n maxF = baseWei + maxP + parseGwei('0.001')\n }\n if (maxF < maxP) {\n maxF = baseWei > 0n ? baseWei + maxP + parseGwei('0.001') : maxP * 2n\n }\n return { maxFeePerGas: maxF, maxPriorityFeePerGas: maxP }\n}\n\n/** Align EIP-1559 fees with the latest head base fee (same rules as Get Sig). */\nexport function alignEip1559FeesWithLatestBase(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n latestBlockBaseFeeWei: bigint,\n): ResolvedEip1559Fees {\n return finalizeEip1559Fees(maxFeePerGas, maxPriorityFeePerGas, null, latestBlockBaseFeeWei)\n}\n\nexport function gweiToDecimalString(n: number): string {\n if (!Number.isFinite(n)) return '0'\n if (n === 0) return '0'\n const s = String(n)\n if (s.indexOf('e') !== -1 || s.indexOf('E') !== -1) return n.toFixed(9).replace(/\\.?0+$/, '') || '0'\n return s\n}\n","/**\n * Ethena: stake USDe → sUSDe (`deposit`) and exit sUSDe on Ethereum mainnet.\n * Stake: batches `approve(USDe → vault, amount)` when needed, then `deposit(assets, receiver)`.\n * Unstake when `cooldownDuration == 0`: `redeem`. When cooldown is on: `cooldownShares`, then `unstake` to claim.\n */\nimport {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n keccak256,\n parseAbi,\n parseGwei,\n parseUnits,\n serializeTransaction,\n} from 'viem'\nimport { SUSDE_ETHEREUM_MAINNET, USDE_ETHEREUM_MAINNET } from './constants.js'\nimport { firstClientIdFromKeyGen, type KeyGenSubsetForPermit } from '../../../core/keygen.js'\nimport { gasLimitFromEstimateAndChainConfig, type ProposalTxParams } from '../../../chains/evm/txParams.js'\nimport { fetchChainFeeParams } from '../../../chains/evm/fees/chainFees.js'\nimport { alignEip1559FeesWithLatestBase } from '../../../chains/evm/fees/eip1559Align.js'\n\nconst AAVE_ERC20_APPROVE_FALLBACK = 100_000n\n/**\n * StakedUSDe `deposit` gas when estimate is skipped or reverts.\n * Off-chain `eth_estimateGas` cannot apply a prior same-batch `approve`, so deposit often reverts with\n * \"ERC20: insufficient allowance\" when simulated in isolation (e.g. Batch Get Sigs).\n */\nexport const ETHENA_SUSDE_DEPOSIT_GET_SIG_GAS_FALLBACK = 1_200_000n\nconst ETHENA_SUSDE_DEPOSIT_FALLBACK = ETHENA_SUSDE_DEPOSIT_GET_SIG_GAS_FALLBACK\nconst ETHENA_SUSDE_REDEEM_FALLBACK = 1_200_000n\n\nfunction gweiToDecimalString(n: number): string {\n if (!Number.isFinite(n)) return '0'\n if (n === 0) return '0'\n const s = String(n)\n if (s.indexOf('e') !== -1 || s.indexOf('E') !== -1) return n.toFixed(9).replace(/\\.?0+$/, '') || '0'\n return s\n}\n\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 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 susdeErc4626Abi = parseAbi([\n 'function deposit(uint256 assets, address receiver) returns (uint256 shares)',\n 'function previewDeposit(uint256 assets) view returns (uint256 shares)',\n 'function previewRedeem(uint256 shares) view returns (uint256 assets)',\n 'function redeem(uint256 shares, address receiver, address owner) returns (uint256 assets)',\n 'function decimals() view returns (uint8)',\n])\n/** StakedUSDeV2: when cooldown is on, `redeem` is disabled; use `cooldownShares`, then `unstake` after the period. */\nconst stakedUsdeV2UnstakeAbi = parseAbi([\n 'function cooldownShares(uint256 shares, address owner) returns (uint256 assets)',\n 'function unstake(address receiver)',\n])\n\ntype EthenaStep = { kind: 'approve' | 'deposit'; to: Address; data: `0x${string}`; value: bigint }\n\n/**\n * sUSDe shares for a given USDe `assets` amount (on-chain, same block rules as `deposit`).\n */\nexport async function readEthenaStakePreviewShares(args: { rpcUrl: string; usdeAmountWei: bigint }): Promise<bigint> {\n const { rpcUrl, usdeAmountWei } = args\n if (usdeAmountWei <= 0n) return 0n\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl.trim()] } },\n })\n const client = createPublicClient({ chain: ch, transport: http(rpcUrl.trim()) })\n const vault = getAddress(SUSDE_ETHEREUM_MAINNET)\n return client.readContract({\n address: vault,\n abi: susdeErc4626Abi,\n functionName: 'previewDeposit',\n args: [usdeAmountWei],\n })\n}\n\n/**\n * USDe you would get when redeeming a given sUSDe `shares` amount (on-chain `previewRedeem`).\n */\nexport async function readEthenaUnstakePreviewUsde(args: { rpcUrl: string; susdeSharesWei: bigint }): Promise<bigint> {\n const { rpcUrl, susdeSharesWei } = args\n if (susdeSharesWei <= 0n) return 0n\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl.trim()] } },\n })\n const client = createPublicClient({ chain: ch, transport: http(rpcUrl.trim()) })\n const vault = getAddress(SUSDE_ETHEREUM_MAINNET)\n return client.readContract({\n address: vault,\n abi: susdeErc4626Abi,\n functionName: 'previewRedeem',\n args: [susdeSharesWei],\n })\n}\n\nexport async function buildEvmMultisignBodyEthenaUsdeStakeToSusde(args: {\n keyGen: KeyGenSubsetForPermit\n /** Must be 1 (mainnet) — sUSDe staking is on Ethereum. */\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n usde: Address\n /** StakedUSDe (ERC-4626 vault) — defaults to mainnet constant. */\n susdeVault?: Address\n amountHuman: string\n /** Receives minted sUSDe shares. */\n receiver: Address\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== 1) {\n throw new Error('Ethena USDe → sUSDe stake is only supported on Ethereum mainnet (chain id 1).')\n }\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n const usde = getAddress(args.usde)\n const mainnetUsde = getAddress(USDE_ETHEREUM_MAINNET)\n if (usde.toLowerCase() !== mainnetUsde.toLowerCase()) {\n throw new Error('Token in must be mainnet USDe for this flow.')\n }\n const susde = getAddress(args.susdeVault ?? SUSDE_ETHEREUM_MAINNET)\n const executor = getAddress(args.executorAddress)\n const receiver = getAddress(args.receiver)\n if (getAddress(SUSDE_ETHEREUM_MAINNET).toLowerCase() !== susde.toLowerCase()) {\n throw new Error('sUSDe vault address mismatch.')\n }\n\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl.trim()] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl.trim()) })\n const dec = await publicClient.readContract({\n address: usde,\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: EthenaStep[] = []\n const currentAllowance = await publicClient.readContract({\n address: usde,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, susde],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [susde, 0n],\n })\n steps.push({ kind: 'approve', to: usde, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [susde, amountWei],\n })\n steps.push({ kind: 'approve', to: usde, data: dataApprove, value: 0n })\n }\n\n const depositData = encodeFunctionData({\n abi: susdeErc4626Abi,\n functionName: 'deposit',\n args: [amountWei, receiver],\n })\n steps.push({ kind: 'deposit', to: susde, data: depositData, value: 0n })\n\n const feeParams = await fetchChainFeeParams(args.rpcUrl, 1)\n const legacy = Boolean(args.chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei =\n !legacy ? (await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n : 0n\n const useCustomGas = args.useCustomGas\n const gasLimitConfig =\n useCustomGas && args.chainDetail?.gasLimit != null ? Number(args.chainDetail.gasLimit) : undefined\n const gasFeeMultiplier =\n useCustomGas && args.chainDetail?.gasMultiplier != null ? Number(args.chainDetail.gasMultiplier) : undefined\n\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n const messageHashes: string[] = []\n const messageRawBatch: string[] = []\n const proposalTxParamsBatch: ProposalTxParams[] = []\n const batchMeta: Record<string, unknown>[] = []\n let firstTxFeePayload: Record<string, unknown> = {}\n let firstDataNo0x = ''\n\n for (let i = 0; i < steps.length; i++) {\n const s = steps[i]!\n const currentNonce = baseNonce + i\n let estimatedGas: bigint\n /** `deposit` after `approve` in the same batch — isolated `estimateGas` cannot see the approval. */\n const skipDepositEstimateBecausePriorApproves = s.kind === 'deposit' && i > 0\n if (skipDepositEstimateBecausePriorApproves) {\n estimatedGas = ETHENA_SUSDE_DEPOSIT_FALLBACK\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: s.to,\n data: s.data,\n value: s.value,\n account: executor,\n })\n } catch {\n estimatedGas = s.kind === 'approve' ? AAVE_ERC20_APPROVE_FALLBACK : ETHENA_SUSDE_DEPOSIT_FALLBACK\n }\n }\n const gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\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 && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n const ser = serializeTransaction({\n type: 'legacy',\n to: s.to,\n data: s.data,\n value: s.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId: 1,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n })\n if (i === 0) {\n firstTxFeePayload = { txNonce: currentNonce, txGasLimit: gasLimitI.toString(), txGasPrice: gasPriceWei.toString() }\n firstDataNo0x = s.data.startsWith('0x') ? s.data.slice(2) : s.data\n }\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0 ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei)) : 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 const ser = serializeTransaction({\n type: 'eip1559',\n to: s.to,\n data: s.data,\n value: s.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId: 1,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n })\n if (i === 0) {\n firstTxFeePayload = {\n txNonce: currentNonce,\n txGasLimit: gasLimitI.toString(),\n txMaxFeePerGas: maxFeePerGas.toString(),\n txMaxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n firstDataNo0x = s.data.startsWith('0x') ? s.data.slice(2) : s.data\n }\n }\n\n if (s.kind === 'approve') {\n batchMeta.push({\n destinationAddress: usde,\n signatureText: JSON.stringify({\n kind: 'Ethena',\n name: 'ERC20.approve',\n to: 'sUSDe vault',\n function: 'approve(address spender, uint256 amount)',\n spender: susde,\n amountHuman: args.amountHuman,\n note: 'Allowance to stake this USDe amount (not unlimited).',\n }),\n evm: { type: 'ethena_erc20_approve', version: 1, chainId: '1' },\n ethena: { step: 'approve_usde', susde },\n })\n } else {\n batchMeta.push({\n destinationAddress: susde,\n signatureText: JSON.stringify({\n kind: 'Ethena',\n name: 'StakedUSDe (ERC-4626).deposit',\n function: 'deposit(uint256 assets, address receiver)',\n assets: amountWei.toString(),\n receiver,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'ethena_susde_deposit', version: 1, chainId: '1' },\n ethena: { step: 'deposit', vault: susde, gasBuildDeposit: { baseGasUnits: gasLimitI.toString() } },\n })\n }\n }\n\n const extraPayload: Record<string, unknown> = { batchMeta }\n if (useCustomGas && args.customGasChainDetails && Object.keys(args.customGasChainDetails).length > 0) {\n extraPayload.customGasChainDetails = args.customGasChainDetails\n }\n const extraJSON = JSON.stringify(extraPayload)\n const firstSigText = (batchMeta[0] as { signatureText: string }).signatureText\n const n = steps.length\n const purposeSuffix =\n n === 1\n ? 'Ethena: 1-tx — deposit USDe to sUSDe (allowance already set).'\n : `Ethena: ${n}-tx batch — approve USDe to sUSDe vault, then deposit.`\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: firstDataNo0x,\n messageHashes,\n messageRawBatch,\n destinationChainID: '1',\n destinationAddress: steps[0]!.to,\n extraJSON,\n signatureText: firstSigText,\n purpose: (() => {\n const t = args.purposeText.trim()\n return (t ? `${t}\\n\\n` : '') + purposeSuffix\n })(),\n ...firstTxFeePayload,\n proposalTxParams: proposalTxParamsBatch,\n }\n if (clientId) bodyForSign.clientId = clientId\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\ntype EthenaRedeemBuildStep = { to: Address; data: `0x${string}`; value: bigint }\n\nconst ETHENA_SUSDE_COOLDOWN_SHARES_FALLBACK = 1_200_000n\nconst ETHENA_SUSDE_UNSTAKE_CLAIM_FALLBACK = 500_000n\n\nasync function buildEthenaStakedUsdeOneTxMultisignBody(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n susde: Address\n executor: Address\n step: EthenaRedeemBuildStep\n purposeText: string\n purposeSuffix: string\n gasFallback: bigint\n makeBatchMeta: (p: { gasLimitI: bigint }) => Record<string, unknown>\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== 1) {\n throw new Error('Ethena sUSDe exit is only supported on Ethereum mainnet (chain id 1).')\n }\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n const { executor } = args\n const steps = [args.step]\n const feeParams = await fetchChainFeeParams(args.rpcUrl, 1)\n const legacy = Boolean(args.chainDetail?.legacy) || !feeParams.isEip1559\n const useCustomGas = args.useCustomGas\n const gasLimitConfig =\n useCustomGas && args.chainDetail?.gasLimit != null ? Number(args.chainDetail.gasLimit) : undefined\n const gasFeeMultiplier =\n useCustomGas && args.chainDetail?.gasMultiplier != null ? Number(args.chainDetail.gasMultiplier) : undefined\n\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl.trim()] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl.trim()) })\n const latestBaseFeeWei =\n !legacy ? (await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n : 0n\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n const messageHashes: string[] = []\n const messageRawBatch: string[] = []\n const proposalTxParamsBatch: ProposalTxParams[] = []\n const batchMeta: Record<string, unknown>[] = []\n let firstTxFeePayload: Record<string, unknown> = {}\n let firstDataNo0x = ''\n\n for (let i = 0; i < steps.length; i++) {\n const s = steps[i]!\n const currentNonce = baseNonce + i\n let estimatedGas: bigint\n try {\n estimatedGas = await publicClient.estimateGas({\n to: s.to,\n data: s.data,\n value: s.value,\n account: executor,\n })\n } catch {\n estimatedGas = args.gasFallback\n }\n const gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\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 && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n const ser = serializeTransaction({\n type: 'legacy',\n to: s.to,\n data: s.data,\n value: s.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId: 1,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n })\n if (i === 0) {\n firstTxFeePayload = { txNonce: currentNonce, txGasLimit: gasLimitI.toString(), txGasPrice: gasPriceWei.toString() }\n firstDataNo0x = s.data.startsWith('0x') ? s.data.slice(2) : s.data\n }\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0 ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei)) : 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 const ser = serializeTransaction({\n type: 'eip1559',\n to: s.to,\n data: s.data,\n value: s.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId: 1,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n })\n if (i === 0) {\n firstTxFeePayload = {\n txNonce: currentNonce,\n txGasLimit: gasLimitI.toString(),\n txMaxFeePerGas: maxFeePerGas.toString(),\n txMaxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n firstDataNo0x = s.data.startsWith('0x') ? s.data.slice(2) : s.data\n }\n }\n\n batchMeta.push(args.makeBatchMeta({ gasLimitI }))\n }\n\n const extraPayload: Record<string, unknown> = { batchMeta }\n if (useCustomGas && args.customGasChainDetails && Object.keys(args.customGasChainDetails).length > 0) {\n extraPayload.customGasChainDetails = args.customGasChainDetails\n }\n const extraJSON = JSON.stringify(extraPayload)\n const firstSigText = (batchMeta[0] as { signatureText: string }).signatureText\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: firstDataNo0x,\n messageHashes,\n messageRawBatch,\n destinationChainID: '1',\n destinationAddress: steps[0]!.to,\n extraJSON,\n signatureText: firstSigText,\n purpose: (() => {\n const t = args.purposeText.trim()\n return (t ? `${t}\\n\\n` : '') + args.purposeSuffix\n })(),\n ...firstTxFeePayload,\n proposalTxParams: proposalTxParamsBatch,\n }\n if (clientId) bodyForSign.clientId = clientId\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\n/**\n * sUSDe → USDe: ERC-4626 `redeem` on the StakedUSDe vault (shares in, USDe to receiver; executor = owner of shares).\n * **Only when `cooldownDuration` is 0** on the vault; otherwise use {@link buildEvmMultisignBodyEthenaSusdeCooldownShares}.\n */\nexport async function buildEvmMultisignBodyEthenaSusdeRedeemToUsde(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n /** StakedUSDe (ERC-4626 vault) — must match StakedUSDe; defaults to mainnet. */\n susdeVault?: Address\n /** Human amount of sUSDe shares to burn (uses vault / share decimals on-chain). */\n sharesHuman: string\n /** Receives USDe assets. */\n receiver: Address\n /** Signs txs and is `owner` in `redeem` (must hold the shares). */\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== 1) {\n throw new Error('Ethena sUSDe → USDe redeem is only supported on Ethereum mainnet (chain id 1).')\n }\n const susde = getAddress(args.susdeVault ?? SUSDE_ETHEREUM_MAINNET)\n if (getAddress(SUSDE_ETHEREUM_MAINNET).toLowerCase() !== susde.toLowerCase()) {\n throw new Error('sUSDe vault address mismatch.')\n }\n const executor = getAddress(args.executorAddress)\n const receiver = getAddress(args.receiver)\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl.trim()] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl.trim()) })\n const dec = await publicClient.readContract({\n address: susde,\n abi: susdeErc4626Abi,\n functionName: 'decimals',\n })\n const sharesWei = parseUnits(args.sharesHuman, Number(dec))\n if (sharesWei === 0n) throw new Error('Amount is zero after converting with share decimals.')\n const redeemData = encodeFunctionData({\n abi: susdeErc4626Abi,\n functionName: 'redeem',\n args: [sharesWei, receiver, executor],\n })\n const step: EthenaRedeemBuildStep = { to: susde, data: redeemData, value: 0n }\n const purposeSuffix = 'Ethena: 1-tx — redeem sUSDe shares to USDe (ERC-4626; no cooldown).'\n return buildEthenaStakedUsdeOneTxMultisignBody({\n keyGen: args.keyGen,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n susde,\n executor,\n step,\n purposeText: args.purposeText,\n purposeSuffix,\n gasFallback: ETHENA_SUSDE_REDEEM_FALLBACK,\n makeBatchMeta: ({ gasLimitI }) => ({\n destinationAddress: susde,\n signatureText: JSON.stringify({\n kind: 'Ethena',\n name: 'StakedUSDe (ERC-4626).redeem',\n function: 'redeem(uint256 shares, address receiver, address owner)',\n shares: sharesWei.toString(),\n receiver,\n owner: executor,\n amountHuman: args.sharesHuman,\n }),\n evm: { type: 'ethena_susde_redeem', version: 1, chainId: '1' },\n ethena: { step: 'redeem', vault: susde, gasBuildRedeem: { baseGasUnits: gasLimitI.toString() } },\n }),\n })\n}\n\n/**\n * StakedUSDeV2 `cooldownShares` when `cooldownDuration > 0` (redeem/withdraw are disabled on-chain). Starts withdrawal cooldown; use {@link buildEvmMultisignBodyEthenaUnstakeClaim} after `cooldownEnd`.\n */\nexport async function buildEvmMultisignBodyEthenaSusdeCooldownShares(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n susdeVault?: Address\n sharesHuman: string\n /** Signs txs; must hold the shares. */\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== 1) {\n throw new Error('Ethena sUSDe cooldown is only supported on Ethereum mainnet (chain id 1).')\n }\n const susde = getAddress(args.susdeVault ?? SUSDE_ETHEREUM_MAINNET)\n if (getAddress(SUSDE_ETHEREUM_MAINNET).toLowerCase() !== susde.toLowerCase()) {\n throw new Error('sUSDe vault address mismatch.')\n }\n const executor = getAddress(args.executorAddress)\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl.trim()] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl.trim()) })\n const dec = await publicClient.readContract({\n address: susde,\n abi: susdeErc4626Abi,\n functionName: 'decimals',\n })\n const sharesWei = parseUnits(args.sharesHuman, Number(dec))\n if (sharesWei === 0n) throw new Error('Amount is zero after converting with share decimals.')\n const data = encodeFunctionData({\n abi: stakedUsdeV2UnstakeAbi,\n functionName: 'cooldownShares',\n args: [sharesWei, executor],\n })\n const step: EthenaRedeemBuildStep = { to: susde, data, value: 0n }\n const purposeSuffix = 'Ethena: 1-tx — cooldownShares (sUSDe → silo, claim USDe in Unlock after cooldown).'\n return buildEthenaStakedUsdeOneTxMultisignBody({\n keyGen: args.keyGen,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n susde,\n executor,\n step,\n purposeText: args.purposeText,\n purposeSuffix,\n gasFallback: ETHENA_SUSDE_COOLDOWN_SHARES_FALLBACK,\n makeBatchMeta: ({ gasLimitI }) => ({\n destinationAddress: susde,\n signatureText: JSON.stringify({\n kind: 'Ethena',\n name: 'StakedUSDeV2.cooldownShares',\n function: 'cooldownShares(uint256 shares, address owner)',\n shares: sharesWei.toString(),\n owner: executor,\n amountHuman: args.sharesHuman,\n }),\n evm: { type: 'ethena_susde_cooldown_shares', version: 1, chainId: '1' },\n ethena: { step: 'cooldown_shares', vault: susde, gasBuildCooldown: { baseGasUnits: gasLimitI.toString() } },\n }),\n })\n}\n\n/**\n * StakedUSDeV2 `unstake` — after cooldown ended, move USDe from silo to `receiver`.\n */\nexport async function buildEvmMultisignBodyEthenaUnstakeClaim(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n susdeVault?: Address\n /** USDe is sent to this address (e.g. key’s Ethereum address). */\n receiver: Address\n /** Signs txs and must be the same account that holds the silo position to claim. */\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== 1) {\n throw new Error('Ethena unstake claim is only supported on Ethereum mainnet (chain id 1).')\n }\n const susde = getAddress(args.susdeVault ?? SUSDE_ETHEREUM_MAINNET)\n if (getAddress(SUSDE_ETHEREUM_MAINNET).toLowerCase() !== susde.toLowerCase()) {\n throw new Error('sUSDe vault address mismatch.')\n }\n const executor = getAddress(args.executorAddress)\n const receiver = getAddress(args.receiver)\n const data = encodeFunctionData({\n abi: stakedUsdeV2UnstakeAbi,\n functionName: 'unstake',\n args: [receiver],\n })\n const step: EthenaRedeemBuildStep = { to: susde, data, value: 0n }\n const purposeSuffix = 'Ethena: 1-tx — unstake (claim USDe after cooldown).'\n return buildEthenaStakedUsdeOneTxMultisignBody({\n keyGen: args.keyGen,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n susde,\n executor,\n step,\n purposeText: args.purposeText,\n purposeSuffix,\n gasFallback: ETHENA_SUSDE_UNSTAKE_CLAIM_FALLBACK,\n makeBatchMeta: ({ gasLimitI }) => ({\n destinationAddress: susde,\n signatureText: JSON.stringify({\n kind: 'Ethena',\n name: 'StakedUSDeV2.unstake',\n function: 'unstake(address receiver)',\n receiver,\n }),\n evm: { type: 'ethena_susde_unstake', version: 1, chainId: '1' },\n ethena: { step: 'unstake', vault: susde, gasBuildUnstake: { baseGasUnits: gasLimitI.toString() } },\n }),\n })\n}\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nfunction parseOptionalGasLimitString(raw: string | number | undefined): bigint | null {\n if (raw == null) return null\n const s = String(raw).trim()\n if (!s) return null\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s)\n } catch {\n return null\n }\n}\n\n/**\n * True when `batchMeta[batchIndex]` is StakedUSDe `deposit` (USDe stake batch step that follows `approve`).\n */\nexport function isEthenaSusdeDepositBatchStep(detail: Record<string, unknown> | null | undefined, batchIndex: number): boolean {\n if (batchIndex < 0) return false\n const ex = parseExtraJsonObject(detail)\n const bm = ex?.batchMeta\n if (!Array.isArray(bm) || !bm[batchIndex] || typeof bm[batchIndex] !== 'object' || Array.isArray(bm[batchIndex])) {\n return false\n }\n const evm = (bm[batchIndex] as Record<string, unknown>).evm as Record<string, unknown> | undefined\n return String(evm?.type ?? '') === 'ethena_susde_deposit'\n}\n\n/**\n * Prefer `proposalTxParams[i]` / `batchMeta[i].ethena.gasBuildDeposit` when `eth_estimateGas` reverts on deposit.\n */\nexport function resolveEthenaBatchStepGasFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex: number,\n): bigint | null {\n if (!detail || batchIndex < 0) return null\n const propBatch = (detail.proposal_tx_params ?? detail.proposalTxParams ?? detail.ProposalTxParams) as unknown\n if (Array.isArray(propBatch) && propBatch.length > batchIndex) {\n const row = propBatch[batchIndex]\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n const gl = parseOptionalGasLimitString((row as Record<string, unknown>).gasLimit as string | number | undefined)\n if (gl != null && gl > 0n) return gl\n }\n }\n const ex = parseExtraJsonObject(detail)\n const bm = ex?.batchMeta\n if (!Array.isArray(bm) || !bm[batchIndex] || typeof bm[batchIndex] !== 'object' || Array.isArray(bm[batchIndex])) {\n return null\n }\n const ethena = (bm[batchIndex] as Record<string, unknown>).ethena as Record<string, unknown> | undefined\n if (!ethena || typeof ethena !== 'object') return null\n for (const key of ['gasBuildDeposit', 'gasBuildCooldown', 'gasBuildUnstake', 'gasBuildRedeem'] as const) {\n const g = (ethena as Record<string, unknown>)[key] as { baseGasUnits?: string | number } | undefined\n if (g && typeof g === 'object') {\n const p = parseOptionalGasLimitString(g.baseGasUnits)\n if (p != null && p > 0n) return p\n }\n }\n return null\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isEvmChainInEthenaUsdeList } from './constants.js'\n\nexport * from './constants.js'\nexport * from './multisign.js'\n\nexport const ETHENA_PROTOCOL_ID = 'ethena'\n\nexport const ethenaProtocolModule: ProtocolModule = {\n id: ETHENA_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n const n = typeof ctx.chainId === 'number' ? ctx.chainId : Number.parseInt(String(ctx.chainId), 10)\n return isEvmChainInEthenaUsdeList(n)\n },\n isTokenSupported(token) {\n return token.category === 'evm' && token.kind === 'erc20'\n },\n actions: [\n { id: 'ethena.stake-usde', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Stake USDe → sUSDe', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: { amountHuman: { type: 'string', required: true, description: 'USDe amount' } } },\n { id: 'ethena.redeem-susde', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Redeem sUSDe → USDe (no cooldown)', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'ethena.cooldown-shares', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Start sUSDe cooldown', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'ethena.claim-unstake', protocolId: ETHENA_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim after cooldown', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(ethenaProtocolModule)\n"]}
|