@continuumdao/ctm-mpc-defi 0.2.64 → 0.2.66

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/dist/agent/catalog.cjs +1227 -2928
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +1620 -1631
  4. package/dist/agent/catalog.js +1226 -2929
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/chains/evm/index.cjs +22 -15
  7. package/dist/chains/evm/index.cjs.map +1 -1
  8. package/dist/chains/evm/index.d.ts +13 -2
  9. package/dist/chains/evm/index.js +12 -6
  10. package/dist/chains/evm/index.js.map +1 -1
  11. package/dist/core/index.cjs +3 -3
  12. package/dist/core/index.cjs.map +1 -1
  13. package/dist/core/index.d.ts +1 -1
  14. package/dist/core/index.js +2 -2
  15. package/dist/core/index.js.map +1 -1
  16. package/dist/index.cjs +25 -17
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.d.ts +15 -4
  19. package/dist/index.js +14 -7
  20. package/dist/index.js.map +1 -1
  21. package/dist/protocols/evm/aave-v4/index.cjs +22 -16
  22. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  23. package/dist/protocols/evm/aave-v4/index.js +11 -5
  24. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  25. package/dist/protocols/evm/aerodrome/index.cjs +21 -15
  26. package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
  27. package/dist/protocols/evm/aerodrome/index.d.ts +5 -1
  28. package/dist/protocols/evm/aerodrome/index.js +11 -5
  29. package/dist/protocols/evm/aerodrome/index.js.map +1 -1
  30. package/dist/protocols/evm/arcus/index.cjs +21 -15
  31. package/dist/protocols/evm/arcus/index.cjs.map +1 -1
  32. package/dist/protocols/evm/arcus/index.js +11 -5
  33. package/dist/protocols/evm/arcus/index.js.map +1 -1
  34. package/dist/protocols/evm/circle-cctp/index.cjs +21 -15
  35. package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
  36. package/dist/protocols/evm/circle-cctp/index.js +11 -5
  37. package/dist/protocols/evm/circle-cctp/index.js.map +1 -1
  38. package/dist/protocols/evm/compound-v3/index.cjs +21 -15
  39. package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
  40. package/dist/protocols/evm/compound-v3/index.js +11 -5
  41. package/dist/protocols/evm/compound-v3/index.js.map +1 -1
  42. package/dist/protocols/evm/continuum-dao/index.cjs +37 -18
  43. package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
  44. package/dist/protocols/evm/continuum-dao/index.d.ts +3 -1
  45. package/dist/protocols/evm/continuum-dao/index.js +27 -9
  46. package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
  47. package/dist/protocols/evm/curve-dao/index.cjs +21 -15
  48. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  49. package/dist/protocols/evm/curve-dao/index.d.ts +1 -1
  50. package/dist/protocols/evm/curve-dao/index.js +11 -5
  51. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  52. package/dist/protocols/evm/derive/index.cjs +24 -18
  53. package/dist/protocols/evm/derive/index.cjs.map +1 -1
  54. package/dist/protocols/evm/derive/index.js +11 -5
  55. package/dist/protocols/evm/derive/index.js.map +1 -1
  56. package/dist/protocols/evm/ethena/index.cjs +22 -16
  57. package/dist/protocols/evm/ethena/index.cjs.map +1 -1
  58. package/dist/protocols/evm/ethena/index.js +11 -5
  59. package/dist/protocols/evm/ethena/index.js.map +1 -1
  60. package/dist/protocols/evm/euler-v2/index.cjs +21 -15
  61. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  62. package/dist/protocols/evm/euler-v2/index.js +11 -5
  63. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  64. package/dist/protocols/evm/gmx/index.cjs +21 -15
  65. package/dist/protocols/evm/gmx/index.cjs.map +1 -1
  66. package/dist/protocols/evm/gmx/index.js +11 -5
  67. package/dist/protocols/evm/gmx/index.js.map +1 -1
  68. package/dist/protocols/evm/hyperliquid/index.cjs +21 -15
  69. package/dist/protocols/evm/hyperliquid/index.cjs.map +1 -1
  70. package/dist/protocols/evm/hyperliquid/index.js +11 -5
  71. package/dist/protocols/evm/hyperliquid/index.js.map +1 -1
  72. package/dist/protocols/evm/hyperliquidOutcome/index.cjs +2 -2
  73. package/dist/protocols/evm/hyperliquidOutcome/index.cjs.map +1 -1
  74. package/dist/protocols/evm/hyperliquidOutcome/index.js +1 -1
  75. package/dist/protocols/evm/hyperliquidOutcome/index.js.map +1 -1
  76. package/dist/protocols/evm/lido/index.cjs +21 -15
  77. package/dist/protocols/evm/lido/index.cjs.map +1 -1
  78. package/dist/protocols/evm/lido/index.js +11 -5
  79. package/dist/protocols/evm/lido/index.js.map +1 -1
  80. package/dist/protocols/evm/maple/index.cjs +21 -15
  81. package/dist/protocols/evm/maple/index.cjs.map +1 -1
  82. package/dist/protocols/evm/maple/index.js +11 -5
  83. package/dist/protocols/evm/maple/index.js.map +1 -1
  84. package/dist/protocols/evm/morpho/index.cjs +21 -15
  85. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  86. package/dist/protocols/evm/morpho/index.js +11 -5
  87. package/dist/protocols/evm/morpho/index.js.map +1 -1
  88. package/dist/protocols/evm/pendle/index.cjs +21 -15
  89. package/dist/protocols/evm/pendle/index.cjs.map +1 -1
  90. package/dist/protocols/evm/pendle/index.d.ts +5 -1
  91. package/dist/protocols/evm/pendle/index.js +11 -5
  92. package/dist/protocols/evm/pendle/index.js.map +1 -1
  93. package/dist/protocols/evm/permit2/index.cjs +2 -2
  94. package/dist/protocols/evm/permit2/index.cjs.map +1 -1
  95. package/dist/protocols/evm/permit2/index.js +1 -1
  96. package/dist/protocols/evm/permit2/index.js.map +1 -1
  97. package/dist/protocols/evm/railgun/index.cjs +21 -15
  98. package/dist/protocols/evm/railgun/index.cjs.map +1 -1
  99. package/dist/protocols/evm/railgun/index.js +11 -5
  100. package/dist/protocols/evm/railgun/index.js.map +1 -1
  101. package/dist/protocols/evm/sky/index.cjs +21 -15
  102. package/dist/protocols/evm/sky/index.cjs.map +1 -1
  103. package/dist/protocols/evm/sky/index.js +11 -5
  104. package/dist/protocols/evm/sky/index.js.map +1 -1
  105. package/dist/protocols/evm/trueo/index.cjs +21 -15
  106. package/dist/protocols/evm/trueo/index.cjs.map +1 -1
  107. package/dist/protocols/evm/trueo/index.js +11 -5
  108. package/dist/protocols/evm/trueo/index.js.map +1 -1
  109. package/dist/protocols/evm/uniswap-v4/index.cjs +23 -16
  110. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  111. package/dist/protocols/evm/uniswap-v4/index.d.ts +1 -1
  112. package/dist/protocols/evm/uniswap-v4/index.js +12 -5
  113. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  114. package/dist/protocols/evm/venice/index.cjs +22 -16
  115. package/dist/protocols/evm/venice/index.cjs.map +1 -1
  116. package/dist/protocols/evm/venice/index.js +11 -5
  117. package/dist/protocols/evm/venice/index.js.map +1 -1
  118. package/package.json +2 -2
@@ -1,7 +1,11 @@
1
1
  'use strict';
2
2
 
3
3
  var viem = require('viem');
4
- var continuumNodeSdk = require('@continuumdao/continuum-node-sdk');
4
+ var rpcUtils_js = require('@continuumdao/continuum-node-sdk/dist/evm/rpc-utils.js');
5
+ var chainFees_js = require('@continuumdao/continuum-node-sdk/dist/evm/chain-fees.js');
6
+ var getSigFeeSpeed_js = require('@continuumdao/continuum-node-sdk/dist/evm/get-sig-fee-speed.js');
7
+ var gwei_js = require('@continuumdao/continuum-node-sdk/dist/evm/gwei.js');
8
+ var txParams_js = require('@continuumdao/continuum-node-sdk/dist/evm/tx-params.js');
5
9
  var chains = require('viem/chains');
6
10
 
7
11
  // src/core/registry.ts
@@ -202,7 +206,7 @@ function finalizeMultisign(input) {
202
206
  const ph = (keyGen.pubkeyhex ?? "").trim();
203
207
  if (!ph) throw new Error("keyGen pubKey (pubkeyhex) is required");
204
208
  const keyList = keyGen.keylist ?? [];
205
- const clientId = continuumNodeSdk.getClientIdFromKeyGenResult(keyGen);
209
+ const clientId = rpcUtils_js.getClientIdFromKeyGenResult(keyGen);
206
210
  const first = legs[0];
207
211
  const messageHashes = legs.map((l) => l.msgHash);
208
212
  const messageRawBatch = legs.map((l) => l.msgRaw);
@@ -248,11 +252,16 @@ function finalizeMultisign(input) {
248
252
  }
249
253
  function routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimit) {
250
254
  if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {
251
- return continuumNodeSdk.gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit);
255
+ return txParams_js.gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit);
252
256
  }
253
257
  return (estimatedGas * 12n + 9n) / 10n;
254
258
  }
255
259
 
260
+ // src/chains/evm/unsignedMessageRaw.ts
261
+ function evmUnsignedMessageRaw(serialized) {
262
+ return serialized.startsWith("0x") ? serialized.slice(2) : serialized;
263
+ }
264
+
256
265
  // src/chains/evm/buildBatch.ts
257
266
  async function buildEvmMultisignBatch(args) {
258
267
  const { context, steps } = args;
@@ -274,7 +283,7 @@ async function buildEvmMultisignBatch(args) {
274
283
  rpcUrls: { default: { http: [rpcUrl] } }
275
284
  });
276
285
  const publicClient = viem.createPublicClient({ chain: ch, transport: defiEvmTransport(rpcUrl) });
277
- const feeParams = await continuumNodeSdk.fetchChainFeeParams(rpcUrl, chainId);
286
+ const feeParams = await chainFees_js.fetchChainFeeParams(rpcUrl, chainId);
278
287
  const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559;
279
288
  const latestBaseFeeWei = !legacy ? (await publicClient.getBlock({ blockTag: "latest" })).baseFeePerGas ?? 0n : 0n;
280
289
  const gasLimitConfig = useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : void 0;
@@ -307,7 +316,7 @@ async function buildEvmMultisignBatch(args) {
307
316
  } else if (step.routerSwap) {
308
317
  gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter);
309
318
  } else {
310
- gasLimitI = useCustomGas ? continuumNodeSdk.gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig) : estimatedGas;
319
+ gasLimitI = useCustomGas ? txParams_js.gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig) : estimatedGas;
311
320
  }
312
321
  let proposalTxParams;
313
322
  let feeSnapshot;
@@ -318,7 +327,7 @@ async function buildEvmMultisignBatch(args) {
318
327
  gasPriceWei = gasPriceWei * BigInt(100 + gasFeeMultiplier) / 100n;
319
328
  }
320
329
  if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {
321
- const configured = viem.parseGwei(continuumNodeSdk.gweiToDecimalString(Number(chainDetail.gasPrice)));
330
+ const configured = viem.parseGwei(gwei_js.gweiToDecimalString(Number(chainDetail.gasPrice)));
322
331
  if (configured > gasPriceWei) gasPriceWei = configured;
323
332
  }
324
333
  serialized = viem.serializeTransaction({
@@ -337,7 +346,7 @@ async function buildEvmMultisignBatch(args) {
337
346
  txType: "legacy",
338
347
  gasPrice: gasPriceWei.toString()
339
348
  };
340
- feeSnapshot = continuumNodeSdk.proposalTxParamsToFeeSnapshot(proposalTxParams);
349
+ feeSnapshot = txParams_js.proposalTxParamsToFeeSnapshot(proposalTxParams);
341
350
  } else {
342
351
  const fetchedBase = feeParams.baseFeeGwei ?? 0;
343
352
  const fetchedPriority = feeParams.priorityFeeGwei ?? 0;
@@ -348,13 +357,13 @@ async function buildEvmMultisignBatch(args) {
348
357
  const baseFeeMultiplierPct = useCustomGas && chainDetail?.baseFeeMultiplier != null ? Math.max(100, Number(chainDetail.baseFeeMultiplier)) : 100;
349
358
  const baseComponentGwei = effectiveBaseFeeGwei * baseFeeMultiplierPct / 100;
350
359
  const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei;
351
- let maxPriorityFeePerGas = effectivePriorityFeeGwei > 0 ? viem.parseGwei(continuumNodeSdk.gweiToDecimalString(effectivePriorityFeeGwei)) : viem.parseGwei("1");
352
- let maxFeePerGas = viem.parseGwei(continuumNodeSdk.gweiToDecimalString(maxFeePerGasGwei));
360
+ let maxPriorityFeePerGas = effectivePriorityFeeGwei > 0 ? viem.parseGwei(gwei_js.gweiToDecimalString(effectivePriorityFeeGwei)) : viem.parseGwei("1");
361
+ let maxFeePerGas = viem.parseGwei(gwei_js.gweiToDecimalString(maxFeePerGasGwei));
353
362
  if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {
354
363
  maxPriorityFeePerGas = maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier) / 100n;
355
364
  maxFeePerGas = maxFeePerGas * BigInt(100 + gasFeeMultiplier) / 100n;
356
365
  }
357
- ({ maxFeePerGas, maxPriorityFeePerGas } = continuumNodeSdk.alignEip1559FeesWithLatestBase(
366
+ ({ maxFeePerGas, maxPriorityFeePerGas } = getSigFeeSpeed_js.alignEip1559FeesWithLatestBase(
358
367
  maxFeePerGas,
359
368
  maxPriorityFeePerGas,
360
369
  latestBaseFeeWei
@@ -377,14 +386,14 @@ async function buildEvmMultisignBatch(args) {
377
386
  maxFeePerGas: maxFeePerGas.toString(),
378
387
  maxPriorityFeePerGas: maxPriorityFeePerGas.toString()
379
388
  };
380
- feeSnapshot = i === 0 ? continuumNodeSdk.proposalTxParamsToFeeSnapshot(proposalTxParams) : {};
389
+ feeSnapshot = i === 0 ? txParams_js.proposalTxParamsToFeeSnapshot(proposalTxParams) : {};
381
390
  }
382
391
  const h = viem.keccak256(serialized);
383
392
  const msgHash = h.startsWith("0x") ? h.slice(2) : h;
384
393
  const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI });
385
394
  legs.push({
386
395
  msgHash,
387
- msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,
396
+ msgRaw: evmUnsignedMessageRaw(serialized),
388
397
  destinationAddress: step.to,
389
398
  signatureText: typeof batchMetaExtra.signatureText === "string" ? batchMetaExtra.signatureText : JSON.stringify(batchMetaExtra.signatureText ?? {}),
390
399
  audit: batchMetaExtra,
@@ -392,9 +401,6 @@ async function buildEvmMultisignBatch(args) {
392
401
  proposalTxParams,
393
402
  valueWei: i === 0 ? step.value : void 0
394
403
  });
395
- if (i === 0 && args.firstMsgRawNo0x != null) {
396
- legs[0].msgRaw = args.firstMsgRawNo0x;
397
- }
398
404
  }
399
405
  const extraJSON = {};
400
406
  if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {
@@ -560,7 +566,7 @@ async function buildEvmMultisignBodyEthenaUsdeStakeToSusde(args) {
560
566
  const s = steps[index];
561
567
  if (s.kind === "deposit" && index > 0) {
562
568
  const gas = ETHENA_SUSDE_DEPOSIT_FALLBACK;
563
- return args.useCustomGas ? continuumNodeSdk.gasLimitFromEstimateAndChainConfig(gas, gasLimitConfig) : gas;
569
+ return args.useCustomGas ? txParams_js.gasLimitFromEstimateAndChainConfig(gas, gasLimitConfig) : gas;
564
570
  }
565
571
  return estimatedGas;
566
572
  },
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/ethena/constants.ts","../../../../src/core/defiEvmClient.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/ethena/multisign.ts","../../../../src/protocols/evm/ethena/mintingRead.ts","../../../../src/protocols/evm/ethena/stakedUsdeRead.ts","../../../../src/protocols/evm/ethena/apyApi.ts","../../../../src/protocols/evm/ethena/index.ts"],"names":["getAddress","http","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","parseAbi","parseUnits","encodeFunctionData","mainnet","formatUnits"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** 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\n/** sUSDe on most L2s (same address table as USDe “Most L2s”). */\nexport const SUSDE_MOST_L2S = '0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2' as const\nexport const USDE_ZKSYNC_ERA = '0x39Fe7a0DACcE31Bd90418e3e659fb0b5f0B3Db0d' as const\nexport const SUSDE_ZKSYNC_ERA = '0xAD17Da2f6Ac76746EF261E835C50b2651ce36DA8' 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 4663, // Robinhood Chain\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 4663: 'Robinhood Chain',\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\n/**\n * sUSDe address on a chain, or `null` if we do not model sUSDe for that EVM id.\n * Stake/redeem MCP tools remain Ethereum mainnet only; L2 rows are for asset recognition / transfers.\n */\nexport function susdeTokenAddressOnEvmChain(chainId: number): `0x${string}` | null {\n if (chainId === 1) return SUSDE_ETHEREUM_MAINNET\n if (chainId === 324) return SUSDE_ZKSYNC_ERA\n if (L2_SAME_ADDRESS_CHAIN_IDS.has(chainId)) return SUSDE_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 function isEthenaSusdeOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = susdeTokenAddressOnEvmChain(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 susde: `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` / `SUSDE_MOST_L2S`.\n */\nexport function listEthenaUsdeEvmNetworkRows(): EthenaUsdeEvmNetworkRow[] {\n const rows: EthenaUsdeEvmNetworkRow[] = [\n {\n chainId: 1,\n label: FALLBACK_NAME_BY_ID[1]!,\n usde: USDE_ETHEREUM_MAINNET,\n susde: SUSDE_ETHEREUM_MAINNET,\n },\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 susde: SUSDE_MOST_L2S,\n })\n }\n rows.push({\n chainId: 324,\n label: FALLBACK_NAME_BY_ID[324]!,\n usde: USDE_ZKSYNC_ERA,\n susde: SUSDE_ZKSYNC_ERA,\n })\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 { http, type Transport } from 'viem'\n\n/**\n * Optional browser transport for protocol `eth_*` reads (allowance, decimals, spoke views).\n * Node / MCP leave this unset and use viem `http(rpcUrl)`.\n */\nlet evmRpcTransportFactory: ((rpcUrl: string) => Transport) | undefined\n\nexport function setDefiEvmRpcTransportFactory(factory: ((rpcUrl: string) => Transport) | undefined): void {\n evmRpcTransportFactory = factory\n}\n\nexport function getDefiEvmRpcTransportFactory(): ((rpcUrl: string) => Transport) | undefined {\n return evmRpcTransportFactory\n}\n\n/** Same-origin proxy in the browser when the app has called {@link setDefiEvmRpcTransportFactory}. */\nexport function defiEvmTransport(rpcUrl: string, opts?: Parameters<typeof http>[1]): Transport {\n const url = rpcUrl.trim()\n return evmRpcTransportFactory?.(url) ?? http(url, opts)\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n /** Unix seconds (UTC) for mpc-auth multiSignRequest expiryDate. */\n expiryDate?: number\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload, (_, v) => (typeof v === 'bigint' ? v.toString() : v))\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n if (input.expiryDate != null && input.expiryDate > 0) {\n bodyForSign.expiryDate = Math.floor(input.expiryDate)\n }\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import { keccak256, createPublicClient, defineChain, serializeTransaction, getAddress, parseGwei, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../core/defiEvmClient.js'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: defiEvmTransport(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n expiryDate: context.expiryDate,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","/**\n * 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 { type Address, createPublicClient, defineChain, encodeFunctionData, getAddress, parseAbi, parseUnits } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { SUSDE_ETHEREUM_MAINNET, USDE_ETHEREUM_MAINNET } from './constants.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\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\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: defiEvmTransport(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: defiEvmTransport(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 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: defiEvmTransport(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 evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'approve' ? AAVE_ERC20_APPROVE_FALLBACK : ETHENA_SUSDE_DEPOSIT_FALLBACK,\n }))\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 const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n const gasLimitConfig =\n args.useCustomGas && args.chainDetail?.gasLimit != null ? Number(args.chainDetail.gasLimit) : undefined\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: 1,\n rpcUrl: args.rpcUrl.trim(),\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 resolveGasLimit: ({ index, estimatedGas }) => {\n const s = steps[index]!\n if (s.kind === 'deposit' && index > 0) {\n const gas = ETHENA_SUSDE_DEPOSIT_FALLBACK\n return args.useCustomGas ? gasLimitFromEstimateAndChainConfig(gas, gasLimitConfig) : gas\n }\n return estimatedGas\n },\n buildBatchMeta: ({ index, gasLimit }) => {\n const s = steps[index]!\n if (s.kind === 'approve') {\n return {\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 }\n return {\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: gasLimit.toString() } },\n }\n },\n })\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 step = args.step\n const evmSteps: EvmTxStep[] = [{ to: step.to, data: step.data, value: step.value, fallbackGas: args.gasFallback }]\n const firstDataNo0x = step.data.startsWith('0x') ? step.data.slice(2) : step.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: 1,\n rpcUrl: args.rpcUrl.trim(),\n executorAddress: args.executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: args.purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: step.to,\n buildBatchMeta: ({ gasLimit }) => args.makeBatchMeta({ gasLimitI: gasLimit }),\n })\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: defiEvmTransport(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: defiEvmTransport(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","/**\n * Ethena Mint and Redeem V2 — read supported assets from `isSupportedAsset` on Ethereum mainnet.\n * @see https://docs.ethena.fi/solution-design/key-addresses\n */\nimport { createPublicClient, getAddress, parseAbi, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { mainnet } from 'viem/chains'\n\n/** Ethena: Mint and Redeem Contract V2 (mainnet) */\nexport const ETHENA_MINTING_V2_MAINNET: Address = '0xe3490297a08d6fC8Da46Edb7B6142E4F461b62D3'\n\nconst ETHENA_MINTING_READ_ABI = parseAbi([\n 'function isSupportedAsset(address asset) view returns (bool)',\n])\n\nlet cachedClient: { rpc: string; client: PublicClient } | null = null\n\nfunction publicClientForMainnetRpc(rpcUrl: string): PublicClient {\n if (cachedClient && cachedClient.rpc === rpcUrl) return cachedClient.client\n const c = createPublicClient({ chain: mainnet, transport: defiEvmTransport(rpcUrl.trim(), { batch: { batchSize: 64 } }) })\n cachedClient = { rpc: rpcUrl, client: c }\n return c\n}\n\n/**\n * Batched on-chain `isSupportedAsset` checks. Keys in the result map are checksummed.\n * Empty `contractAddresses` returns an empty map without RPC.\n */\nexport async function fetchEthenaMintingIsSupportedMap(\n rpcUrl: string,\n contractAddresses: readonly string[],\n): Promise<Map<Address, boolean>> {\n const out = new Map<Address, boolean>()\n if (!rpcUrl.trim()) return out\n\n const unique: Address[] = []\n const seen = new Set<string>()\n for (const raw of contractAddresses) {\n try {\n const a = getAddress(raw as `0x${string}`)\n const k = a.toLowerCase()\n if (seen.has(k)) continue\n seen.add(k)\n unique.push(a)\n } catch {\n /* skip */\n }\n }\n if (unique.length === 0) return out\n\n const client = publicClientForMainnetRpc(rpcUrl)\n const res = await client.multicall({\n contracts: unique.map((asset) => ({\n address: ETHENA_MINTING_V2_MAINNET,\n abi: ETHENA_MINTING_READ_ABI,\n functionName: 'isSupportedAsset',\n args: [asset],\n })),\n allowFailure: true,\n })\n\n for (let i = 0; i < unique.length; i++) {\n const row = res[i]\n if (row.status !== 'success') continue\n if (row.result === true) out.set(unique[i], true)\n }\n return out\n}\n","/**\n * StakedUSDeV2 view reads (cooldown) on Ethereum mainnet.\n * @see StakedUSDeV2: when cooldownDuration > 0, use cooldownShares; after delay, unstake. When 0, ERC-4626 redeem.\n */\nimport { createPublicClient, getAddress, parseAbi, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { SUSDE_ETHEREUM_MAINNET } from './constants.js'\n\nconst STAKED_USDE_V2_VIEWS_ABI = parseAbi([\n 'function cooldownDuration() view returns (uint24)',\n 'function cooldowns(address account) view returns (uint104 cooldownEnd, uint152 underlyingAmount)',\n])\n\nfunction publicClientForMainnet(rpcUrl: string): PublicClient {\n return createPublicClient({\n chain: { id: 1, name: 'Ethereum', nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 }, rpcUrls: { default: { http: [rpcUrl.trim()] } } },\n transport: defiEvmTransport(rpcUrl.trim()),\n })\n}\n\nexport type EthenaStakedUserCooldown = {\n cooldownEnd: bigint\n /** USDe (wei) in silo for this key after cooldown request(s). */\n underlyingAmount: bigint\n}\n\n/**\n * `cooldownDuration` in seconds. `0` means standard ERC-4626 redeem/withdraw; non-zero means cooldown path.\n */\nexport async function readEthenaStakedUsdeCooldownDuration(args: {\n rpcUrl: string\n vault?: Address\n}): Promise<bigint> {\n const v = getAddress(args.vault ?? SUSDE_ETHEREUM_MAINNET)\n const c = publicClientForMainnet(args.rpcUrl)\n const d = await c.readContract({\n address: v,\n abi: STAKED_USDE_V2_VIEWS_ABI,\n functionName: 'cooldownDuration',\n })\n return BigInt(d as bigint | number | string)\n}\n\n/**\n * Per-account cooldown state (claim after `cooldownEnd` via `unstake`).\n */\nexport async function readEthenaStakedUsdeUserCooldown(args: {\n rpcUrl: string\n account: Address\n vault?: Address\n}): Promise<EthenaStakedUserCooldown> {\n const v = getAddress(args.vault ?? SUSDE_ETHEREUM_MAINNET)\n const c = publicClientForMainnet(args.rpcUrl)\n const r = await c.readContract({\n address: v,\n abi: STAKED_USDE_V2_VIEWS_ABI,\n functionName: 'cooldowns',\n args: [getAddress(args.account)],\n })\n const tuple = r as readonly [bigint | number | string, bigint | number | string]\n return {\n cooldownEnd: BigInt(tuple[0]),\n underlyingAmount: BigInt(tuple[1]),\n }\n}\n\n/**\n * Chain `latest` block timestamp (seconds) for unlock eligibility.\n */\nexport async function readEthenaMainnetBlockTimestamp(rpcUrl: string): Promise<bigint> {\n const c = publicClientForMainnet(rpcUrl)\n const b = await c.getBlock({ blockTag: 'latest' })\n return b.timestamp\n}\n\n/** Human label for a duration in seconds (for UI, e.g. \"7 days\" or \"7 days, 3 hours\"). */\nexport function formatEthenaCooldownDurationLabel(totalSec: bigint): string {\n if (totalSec <= 0n) return '0 seconds'\n const d = totalSec / 86400n\n const h = (totalSec % 86400n) / 3600n\n const m = (totalSec % 3600n) / 60n\n const s = totalSec % 60n\n const parts: string[] = []\n if (d > 0n) parts.push(`${d} day${d === 1n ? '' : 's'}`)\n if (h > 0n) parts.push(`${h} hour${h === 1n ? '' : 's'}`)\n if (m > 0n) parts.push(`${m} min`)\n if (s > 0n) parts.push(`${s} sec`)\n return parts.join(', ')\n}\n","import { createPublicClient, defineChain, formatUnits, getAddress, parseAbi } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { SUSDE_ETHEREUM_MAINNET, USDE_ETHEREUM_MAINNET } from './constants.js'\n\nconst susdeAbi = parseAbi([\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function cooldownDuration() view returns (uint24)',\n])\n\nconst ETHENA_YIELD_URLS = [\n 'https://app.ethena.fi/api/yields',\n 'https://app.ethena.fi/api/solvency/yield',\n] as const\n\nfunction pickApyFromUnknown(j: unknown): number | null {\n if (j == null || typeof j !== 'object') return null\n const rec = j as Record<string, unknown>\n const candidates = [\n rec.sUSDeApy,\n rec.susdeApy,\n rec.stakingApy,\n rec.apy,\n rec.currentApy,\n rec.sevenDayApy,\n rec.sUSDe,\n rec.yield,\n ]\n for (const c of candidates) {\n if (typeof c === 'number' && Number.isFinite(c) && c >= 0) {\n return c > 1 && c < 200 ? c : c <= 1 ? c * 100 : c\n }\n if (typeof c === 'string') {\n const n = parseFloat(c.replace('%', ''))\n if (Number.isFinite(n) && n >= 0) return n\n }\n if (c && typeof c === 'object') {\n const nested = pickApyFromUnknown(c)\n if (nested != null) return nested\n }\n }\n return null\n}\n\nasync function fetchOfficialSusdeApyPercent(): Promise<number | null> {\n for (const url of ETHENA_YIELD_URLS) {\n try {\n const res = await fetch(url, { cache: 'no-store' })\n if (!res.ok) continue\n const j = await res.json()\n const n = pickApyFromUnknown(j)\n if (n != null) return n\n } catch {\n /* try next official URL */\n }\n }\n return null\n}\n\nexport function formatEthenaApyPercentLabel(pct: number | null): string {\n if (pct == null) return '—'\n return `${pct.toFixed(2)}%`\n}\n\nexport async function ethenaFetchSusdeApySummary(args: { rpcUrl: string }): Promise<{\n chainId: number\n product: string\n asset: string\n assetSymbol: string\n share: string\n apyPercent: string\n apy: number | null\n usdePerSusde: string\n cooldownDurationSec: number | null\n notes: string\n}> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) throw new Error('rpcUrl is required.')\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpc] } },\n })\n const client = createPublicClient({ chain: ch, transport: defiEvmTransport(rpc) })\n const share = getAddress(SUSDE_ETHEREUM_MAINNET)\n const [assets, cooldown, officialApy] = await Promise.all([\n client.readContract({\n address: share,\n abi: susdeAbi,\n functionName: 'convertToAssets',\n args: [10n ** 18n],\n }),\n client.readContract({ address: share, abi: susdeAbi, functionName: 'cooldownDuration' }).catch(() => null),\n fetchOfficialSusdeApyPercent(),\n ])\n return {\n chainId: 1,\n product: 'sUSDe',\n asset: getAddress(USDE_ETHEREUM_MAINNET),\n assetSymbol: 'USDe',\n share,\n apyPercent: formatEthenaApyPercentLabel(officialApy),\n apy: officialApy,\n usdePerSusde: formatUnits(assets, 18),\n cooldownDurationSec: cooldown == null ? null : Number(cooldown),\n notes:\n 'sUSDe APY from Ethena app yield feed when available; usdePerSusde from ERC-4626 convertToAssets. Cooldown applies on unstake. Ethereum mainnet. Do not web-search Ethena rates.',\n }\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'\nexport * from './mintingRead.js'\nexport * from './stakedUsdeRead.js'\nexport * from './apyApi.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"]}
1
+ {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/ethena/constants.ts","../../../../src/core/defiEvmClient.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/unsignedMessageRaw.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/ethena/multisign.ts","../../../../src/protocols/evm/ethena/mintingRead.ts","../../../../src/protocols/evm/ethena/stakedUsdeRead.ts","../../../../src/protocols/evm/ethena/apyApi.ts","../../../../src/protocols/evm/ethena/index.ts"],"names":["getAddress","http","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","parseAbi","parseUnits","encodeFunctionData","mainnet","formatUnits"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","/** 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\n/** sUSDe on most L2s (same address table as USDe “Most L2s”). */\nexport const SUSDE_MOST_L2S = '0x211Cc4DD073734dA055fbF44a2b4667d5E5fE5d2' as const\nexport const USDE_ZKSYNC_ERA = '0x39Fe7a0DACcE31Bd90418e3e659fb0b5f0B3Db0d' as const\nexport const SUSDE_ZKSYNC_ERA = '0xAD17Da2f6Ac76746EF261E835C50b2651ce36DA8' 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 4663, // Robinhood Chain\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 4663: 'Robinhood Chain',\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\n/**\n * sUSDe address on a chain, or `null` if we do not model sUSDe for that EVM id.\n * Stake/redeem MCP tools remain Ethereum mainnet only; L2 rows are for asset recognition / transfers.\n */\nexport function susdeTokenAddressOnEvmChain(chainId: number): `0x${string}` | null {\n if (chainId === 1) return SUSDE_ETHEREUM_MAINNET\n if (chainId === 324) return SUSDE_ZKSYNC_ERA\n if (L2_SAME_ADDRESS_CHAIN_IDS.has(chainId)) return SUSDE_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 function isEthenaSusdeOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = susdeTokenAddressOnEvmChain(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 susde: `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` / `SUSDE_MOST_L2S`.\n */\nexport function listEthenaUsdeEvmNetworkRows(): EthenaUsdeEvmNetworkRow[] {\n const rows: EthenaUsdeEvmNetworkRow[] = [\n {\n chainId: 1,\n label: FALLBACK_NAME_BY_ID[1]!,\n usde: USDE_ETHEREUM_MAINNET,\n susde: SUSDE_ETHEREUM_MAINNET,\n },\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 susde: SUSDE_MOST_L2S,\n })\n }\n rows.push({\n chainId: 324,\n label: FALLBACK_NAME_BY_ID[324]!,\n usde: USDE_ZKSYNC_ERA,\n susde: SUSDE_ZKSYNC_ERA,\n })\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 { http, type Transport } from 'viem'\n\n/**\n * Optional browser transport for protocol `eth_*` reads (allowance, decimals, spoke views).\n * Node / MCP leave this unset and use viem `http(rpcUrl)`.\n */\nlet evmRpcTransportFactory: ((rpcUrl: string) => Transport) | undefined\n\nexport function setDefiEvmRpcTransportFactory(factory: ((rpcUrl: string) => Transport) | undefined): void {\n evmRpcTransportFactory = factory\n}\n\nexport function getDefiEvmRpcTransportFactory(): ((rpcUrl: string) => Transport) | undefined {\n return evmRpcTransportFactory\n}\n\n/** Same-origin proxy in the browser when the app has called {@link setDefiEvmRpcTransportFactory}. */\nexport function defiEvmTransport(rpcUrl: string, opts?: Parameters<typeof http>[1]): Transport {\n const url = rpcUrl.trim()\n return evmRpcTransportFactory?.(url) ?? http(url, opts)\n}\n","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk/dist/evm/rpc-utils.js'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n /** Unix seconds (UTC) for mpc-auth multiSignRequest expiryDate. */\n expiryDate?: number\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload, (_, v) => (typeof v === 'bigint' ? v.toString() : v))\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n if (input.expiryDate != null && input.expiryDate > 0) {\n bodyForSign.expiryDate = Math.floor(input.expiryDate)\n }\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk/dist/evm/tx-params.js'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","/**\n * Hex of a serialized unsigned transaction, without a 0x prefix.\n * Get Sig refreshes the gas fee and nonce only when MessageRaw decodes as this transaction.\n * Destination, amount, and calldata stay inside the serialized bytes.\n */\nexport function evmUnsignedMessageRaw(serialized: `0x${string}`): string {\n return serialized.startsWith('0x') ? serialized.slice(2) : serialized\n}\n","import { keccak256, createPublicClient, defineChain, serializeTransaction, getAddress, parseGwei, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../core/defiEvmClient.js'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport { fetchChainFeeParams } from '@continuumdao/continuum-node-sdk/dist/evm/chain-fees.js'\nimport { alignEip1559FeesWithLatestBase } from '@continuumdao/continuum-node-sdk/dist/evm/get-sig-fee-speed.js'\nimport { gweiToDecimalString } from '@continuumdao/continuum-node-sdk/dist/evm/gwei.js'\nimport {\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk/dist/evm/tx-params.js'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport { evmUnsignedMessageRaw } from './unsignedMessageRaw.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /**\n * Ignored. MessageRaw is the serialized unsigned transaction (no 0x prefix).\n * Calldata-only MessageRaw cannot survive Get Sig: only the gas fee or nonce\n * may change, and the updated transaction must be included.\n */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: defiEvmTransport(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: evmUnsignedMessageRaw(serialized),\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n expiryDate: context.expiryDate,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","/**\n * 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 { type Address, createPublicClient, defineChain, encodeFunctionData, getAddress, parseAbi, parseUnits } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { SUSDE_ETHEREUM_MAINNET, USDE_ETHEREUM_MAINNET } from './constants.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk/dist/evm/tx-params.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\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: defiEvmTransport(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: defiEvmTransport(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 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: defiEvmTransport(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 evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'approve' ? AAVE_ERC20_APPROVE_FALLBACK : ETHENA_SUSDE_DEPOSIT_FALLBACK,\n }))\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 const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n const gasLimitConfig =\n args.useCustomGas && args.chainDetail?.gasLimit != null ? Number(args.chainDetail.gasLimit) : undefined\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: 1,\n rpcUrl: args.rpcUrl.trim(),\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 resolveGasLimit: ({ index, estimatedGas }) => {\n const s = steps[index]!\n if (s.kind === 'deposit' && index > 0) {\n const gas = ETHENA_SUSDE_DEPOSIT_FALLBACK\n return args.useCustomGas ? gasLimitFromEstimateAndChainConfig(gas, gasLimitConfig) : gas\n }\n return estimatedGas\n },\n buildBatchMeta: ({ index, gasLimit }) => {\n const s = steps[index]!\n if (s.kind === 'approve') {\n return {\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 }\n return {\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: gasLimit.toString() } },\n }\n },\n })\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 step = args.step\n const evmSteps: EvmTxStep[] = [{ to: step.to, data: step.data, value: step.value, fallbackGas: args.gasFallback }]\n const firstDataNo0x = step.data.startsWith('0x') ? step.data.slice(2) : step.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: 1,\n rpcUrl: args.rpcUrl.trim(),\n executorAddress: args.executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix: args.purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: step.to,\n buildBatchMeta: ({ gasLimit }) => args.makeBatchMeta({ gasLimitI: gasLimit }),\n })\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: defiEvmTransport(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: defiEvmTransport(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","/**\n * Ethena Mint and Redeem V2 — read supported assets from `isSupportedAsset` on Ethereum mainnet.\n * @see https://docs.ethena.fi/solution-design/key-addresses\n */\nimport { createPublicClient, getAddress, parseAbi, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { mainnet } from 'viem/chains'\n\n/** Ethena: Mint and Redeem Contract V2 (mainnet) */\nexport const ETHENA_MINTING_V2_MAINNET: Address = '0xe3490297a08d6fC8Da46Edb7B6142E4F461b62D3'\n\nconst ETHENA_MINTING_READ_ABI = parseAbi([\n 'function isSupportedAsset(address asset) view returns (bool)',\n])\n\nlet cachedClient: { rpc: string; client: PublicClient } | null = null\n\nfunction publicClientForMainnetRpc(rpcUrl: string): PublicClient {\n if (cachedClient && cachedClient.rpc === rpcUrl) return cachedClient.client\n const c = createPublicClient({ chain: mainnet, transport: defiEvmTransport(rpcUrl.trim(), { batch: { batchSize: 64 } }) })\n cachedClient = { rpc: rpcUrl, client: c }\n return c\n}\n\n/**\n * Batched on-chain `isSupportedAsset` checks. Keys in the result map are checksummed.\n * Empty `contractAddresses` returns an empty map without RPC.\n */\nexport async function fetchEthenaMintingIsSupportedMap(\n rpcUrl: string,\n contractAddresses: readonly string[],\n): Promise<Map<Address, boolean>> {\n const out = new Map<Address, boolean>()\n if (!rpcUrl.trim()) return out\n\n const unique: Address[] = []\n const seen = new Set<string>()\n for (const raw of contractAddresses) {\n try {\n const a = getAddress(raw as `0x${string}`)\n const k = a.toLowerCase()\n if (seen.has(k)) continue\n seen.add(k)\n unique.push(a)\n } catch {\n /* skip */\n }\n }\n if (unique.length === 0) return out\n\n const client = publicClientForMainnetRpc(rpcUrl)\n const res = await client.multicall({\n contracts: unique.map((asset) => ({\n address: ETHENA_MINTING_V2_MAINNET,\n abi: ETHENA_MINTING_READ_ABI,\n functionName: 'isSupportedAsset',\n args: [asset],\n })),\n allowFailure: true,\n })\n\n for (let i = 0; i < unique.length; i++) {\n const row = res[i]\n if (row.status !== 'success') continue\n if (row.result === true) out.set(unique[i], true)\n }\n return out\n}\n","/**\n * StakedUSDeV2 view reads (cooldown) on Ethereum mainnet.\n * @see StakedUSDeV2: when cooldownDuration > 0, use cooldownShares; after delay, unstake. When 0, ERC-4626 redeem.\n */\nimport { createPublicClient, getAddress, parseAbi, type Address, type PublicClient } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { SUSDE_ETHEREUM_MAINNET } from './constants.js'\n\nconst STAKED_USDE_V2_VIEWS_ABI = parseAbi([\n 'function cooldownDuration() view returns (uint24)',\n 'function cooldowns(address account) view returns (uint104 cooldownEnd, uint152 underlyingAmount)',\n])\n\nfunction publicClientForMainnet(rpcUrl: string): PublicClient {\n return createPublicClient({\n chain: { id: 1, name: 'Ethereum', nativeCurrency: { name: 'Ether', symbol: 'ETH', decimals: 18 }, rpcUrls: { default: { http: [rpcUrl.trim()] } } },\n transport: defiEvmTransport(rpcUrl.trim()),\n })\n}\n\nexport type EthenaStakedUserCooldown = {\n cooldownEnd: bigint\n /** USDe (wei) in silo for this key after cooldown request(s). */\n underlyingAmount: bigint\n}\n\n/**\n * `cooldownDuration` in seconds. `0` means standard ERC-4626 redeem/withdraw; non-zero means cooldown path.\n */\nexport async function readEthenaStakedUsdeCooldownDuration(args: {\n rpcUrl: string\n vault?: Address\n}): Promise<bigint> {\n const v = getAddress(args.vault ?? SUSDE_ETHEREUM_MAINNET)\n const c = publicClientForMainnet(args.rpcUrl)\n const d = await c.readContract({\n address: v,\n abi: STAKED_USDE_V2_VIEWS_ABI,\n functionName: 'cooldownDuration',\n })\n return BigInt(d as bigint | number | string)\n}\n\n/**\n * Per-account cooldown state (claim after `cooldownEnd` via `unstake`).\n */\nexport async function readEthenaStakedUsdeUserCooldown(args: {\n rpcUrl: string\n account: Address\n vault?: Address\n}): Promise<EthenaStakedUserCooldown> {\n const v = getAddress(args.vault ?? SUSDE_ETHEREUM_MAINNET)\n const c = publicClientForMainnet(args.rpcUrl)\n const r = await c.readContract({\n address: v,\n abi: STAKED_USDE_V2_VIEWS_ABI,\n functionName: 'cooldowns',\n args: [getAddress(args.account)],\n })\n const tuple = r as readonly [bigint | number | string, bigint | number | string]\n return {\n cooldownEnd: BigInt(tuple[0]),\n underlyingAmount: BigInt(tuple[1]),\n }\n}\n\n/**\n * Chain `latest` block timestamp (seconds) for unlock eligibility.\n */\nexport async function readEthenaMainnetBlockTimestamp(rpcUrl: string): Promise<bigint> {\n const c = publicClientForMainnet(rpcUrl)\n const b = await c.getBlock({ blockTag: 'latest' })\n return b.timestamp\n}\n\n/** Human label for a duration in seconds (for UI, e.g. \"7 days\" or \"7 days, 3 hours\"). */\nexport function formatEthenaCooldownDurationLabel(totalSec: bigint): string {\n if (totalSec <= 0n) return '0 seconds'\n const d = totalSec / 86400n\n const h = (totalSec % 86400n) / 3600n\n const m = (totalSec % 3600n) / 60n\n const s = totalSec % 60n\n const parts: string[] = []\n if (d > 0n) parts.push(`${d} day${d === 1n ? '' : 's'}`)\n if (h > 0n) parts.push(`${h} hour${h === 1n ? '' : 's'}`)\n if (m > 0n) parts.push(`${m} min`)\n if (s > 0n) parts.push(`${s} sec`)\n return parts.join(', ')\n}\n","import { createPublicClient, defineChain, formatUnits, getAddress, parseAbi } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport { SUSDE_ETHEREUM_MAINNET, USDE_ETHEREUM_MAINNET } from './constants.js'\n\nconst susdeAbi = parseAbi([\n 'function convertToAssets(uint256 shares) view returns (uint256)',\n 'function cooldownDuration() view returns (uint24)',\n])\n\nconst ETHENA_YIELD_URLS = [\n 'https://app.ethena.fi/api/yields',\n 'https://app.ethena.fi/api/solvency/yield',\n] as const\n\nfunction pickApyFromUnknown(j: unknown): number | null {\n if (j == null || typeof j !== 'object') return null\n const rec = j as Record<string, unknown>\n const candidates = [\n rec.sUSDeApy,\n rec.susdeApy,\n rec.stakingApy,\n rec.apy,\n rec.currentApy,\n rec.sevenDayApy,\n rec.sUSDe,\n rec.yield,\n ]\n for (const c of candidates) {\n if (typeof c === 'number' && Number.isFinite(c) && c >= 0) {\n return c > 1 && c < 200 ? c : c <= 1 ? c * 100 : c\n }\n if (typeof c === 'string') {\n const n = parseFloat(c.replace('%', ''))\n if (Number.isFinite(n) && n >= 0) return n\n }\n if (c && typeof c === 'object') {\n const nested = pickApyFromUnknown(c)\n if (nested != null) return nested\n }\n }\n return null\n}\n\nasync function fetchOfficialSusdeApyPercent(): Promise<number | null> {\n for (const url of ETHENA_YIELD_URLS) {\n try {\n const res = await fetch(url, { cache: 'no-store' })\n if (!res.ok) continue\n const j = await res.json()\n const n = pickApyFromUnknown(j)\n if (n != null) return n\n } catch {\n /* try next official URL */\n }\n }\n return null\n}\n\nexport function formatEthenaApyPercentLabel(pct: number | null): string {\n if (pct == null) return '—'\n return `${pct.toFixed(2)}%`\n}\n\nexport async function ethenaFetchSusdeApySummary(args: { rpcUrl: string }): Promise<{\n chainId: number\n product: string\n asset: string\n assetSymbol: string\n share: string\n apyPercent: string\n apy: number | null\n usdePerSusde: string\n cooldownDurationSec: number | null\n notes: string\n}> {\n const rpc = args.rpcUrl.trim()\n if (!rpc) throw new Error('rpcUrl is required.')\n const ch = defineChain({\n id: 1,\n name: 'Ethereum',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpc] } },\n })\n const client = createPublicClient({ chain: ch, transport: defiEvmTransport(rpc) })\n const share = getAddress(SUSDE_ETHEREUM_MAINNET)\n const [assets, cooldown, officialApy] = await Promise.all([\n client.readContract({\n address: share,\n abi: susdeAbi,\n functionName: 'convertToAssets',\n args: [10n ** 18n],\n }),\n client.readContract({ address: share, abi: susdeAbi, functionName: 'cooldownDuration' }).catch(() => null),\n fetchOfficialSusdeApyPercent(),\n ])\n return {\n chainId: 1,\n product: 'sUSDe',\n asset: getAddress(USDE_ETHEREUM_MAINNET),\n assetSymbol: 'USDe',\n share,\n apyPercent: formatEthenaApyPercentLabel(officialApy),\n apy: officialApy,\n usdePerSusde: formatUnits(assets, 18),\n cooldownDurationSec: cooldown == null ? null : Number(cooldown),\n notes:\n 'sUSDe APY from Ethena app yield feed when available; usdePerSusde from ERC-4626 convertToAssets. Cooldown applies on unstake. Ethereum mainnet. Do not web-search Ethena rates.',\n }\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'\nexport * from './mintingRead.js'\nexport * from './stakedUsdeRead.js'\nexport * from './apyApi.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"]}