@continuumdao/ctm-mpc-defi 0.2.64 → 0.2.66
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agent/catalog.cjs +1227 -2928
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +1620 -1631
- package/dist/agent/catalog.js +1226 -2929
- package/dist/agent/catalog.js.map +1 -1
- package/dist/chains/evm/index.cjs +22 -15
- package/dist/chains/evm/index.cjs.map +1 -1
- package/dist/chains/evm/index.d.ts +13 -2
- package/dist/chains/evm/index.js +12 -6
- package/dist/chains/evm/index.js.map +1 -1
- package/dist/core/index.cjs +3 -3
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +1 -1
- package/dist/core/index.js +2 -2
- package/dist/core/index.js.map +1 -1
- package/dist/index.cjs +25 -17
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +15 -4
- package/dist/index.js +14 -7
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs +22 -16
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/aave-v4/index.js +11 -5
- package/dist/protocols/evm/aave-v4/index.js.map +1 -1
- package/dist/protocols/evm/aerodrome/index.cjs +21 -15
- package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
- package/dist/protocols/evm/aerodrome/index.d.ts +5 -1
- package/dist/protocols/evm/aerodrome/index.js +11 -5
- package/dist/protocols/evm/aerodrome/index.js.map +1 -1
- package/dist/protocols/evm/arcus/index.cjs +21 -15
- package/dist/protocols/evm/arcus/index.cjs.map +1 -1
- package/dist/protocols/evm/arcus/index.js +11 -5
- package/dist/protocols/evm/arcus/index.js.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.cjs +21 -15
- package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.js +11 -5
- package/dist/protocols/evm/circle-cctp/index.js.map +1 -1
- package/dist/protocols/evm/compound-v3/index.cjs +21 -15
- package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
- package/dist/protocols/evm/compound-v3/index.js +11 -5
- package/dist/protocols/evm/compound-v3/index.js.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.cjs +37 -18
- package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.d.ts +3 -1
- package/dist/protocols/evm/continuum-dao/index.js +27 -9
- package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
- package/dist/protocols/evm/curve-dao/index.cjs +21 -15
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/curve-dao/index.d.ts +1 -1
- package/dist/protocols/evm/curve-dao/index.js +11 -5
- package/dist/protocols/evm/curve-dao/index.js.map +1 -1
- package/dist/protocols/evm/derive/index.cjs +24 -18
- package/dist/protocols/evm/derive/index.cjs.map +1 -1
- package/dist/protocols/evm/derive/index.js +11 -5
- package/dist/protocols/evm/derive/index.js.map +1 -1
- package/dist/protocols/evm/ethena/index.cjs +22 -16
- package/dist/protocols/evm/ethena/index.cjs.map +1 -1
- package/dist/protocols/evm/ethena/index.js +11 -5
- package/dist/protocols/evm/ethena/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs +21 -15
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.js +11 -5
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/gmx/index.cjs +21 -15
- package/dist/protocols/evm/gmx/index.cjs.map +1 -1
- package/dist/protocols/evm/gmx/index.js +11 -5
- package/dist/protocols/evm/gmx/index.js.map +1 -1
- package/dist/protocols/evm/hyperliquid/index.cjs +21 -15
- package/dist/protocols/evm/hyperliquid/index.cjs.map +1 -1
- package/dist/protocols/evm/hyperliquid/index.js +11 -5
- package/dist/protocols/evm/hyperliquid/index.js.map +1 -1
- package/dist/protocols/evm/hyperliquidOutcome/index.cjs +2 -2
- package/dist/protocols/evm/hyperliquidOutcome/index.cjs.map +1 -1
- package/dist/protocols/evm/hyperliquidOutcome/index.js +1 -1
- package/dist/protocols/evm/hyperliquidOutcome/index.js.map +1 -1
- package/dist/protocols/evm/lido/index.cjs +21 -15
- package/dist/protocols/evm/lido/index.cjs.map +1 -1
- package/dist/protocols/evm/lido/index.js +11 -5
- package/dist/protocols/evm/lido/index.js.map +1 -1
- package/dist/protocols/evm/maple/index.cjs +21 -15
- package/dist/protocols/evm/maple/index.cjs.map +1 -1
- package/dist/protocols/evm/maple/index.js +11 -5
- package/dist/protocols/evm/maple/index.js.map +1 -1
- package/dist/protocols/evm/morpho/index.cjs +21 -15
- package/dist/protocols/evm/morpho/index.cjs.map +1 -1
- package/dist/protocols/evm/morpho/index.js +11 -5
- package/dist/protocols/evm/morpho/index.js.map +1 -1
- package/dist/protocols/evm/pendle/index.cjs +21 -15
- package/dist/protocols/evm/pendle/index.cjs.map +1 -1
- package/dist/protocols/evm/pendle/index.d.ts +5 -1
- package/dist/protocols/evm/pendle/index.js +11 -5
- package/dist/protocols/evm/pendle/index.js.map +1 -1
- package/dist/protocols/evm/permit2/index.cjs +2 -2
- package/dist/protocols/evm/permit2/index.cjs.map +1 -1
- package/dist/protocols/evm/permit2/index.js +1 -1
- package/dist/protocols/evm/permit2/index.js.map +1 -1
- package/dist/protocols/evm/railgun/index.cjs +21 -15
- package/dist/protocols/evm/railgun/index.cjs.map +1 -1
- package/dist/protocols/evm/railgun/index.js +11 -5
- package/dist/protocols/evm/railgun/index.js.map +1 -1
- package/dist/protocols/evm/sky/index.cjs +21 -15
- package/dist/protocols/evm/sky/index.cjs.map +1 -1
- package/dist/protocols/evm/sky/index.js +11 -5
- package/dist/protocols/evm/sky/index.js.map +1 -1
- package/dist/protocols/evm/trueo/index.cjs +21 -15
- package/dist/protocols/evm/trueo/index.cjs.map +1 -1
- package/dist/protocols/evm/trueo/index.js +11 -5
- package/dist/protocols/evm/trueo/index.js.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.cjs +23 -16
- package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.d.ts +1 -1
- package/dist/protocols/evm/uniswap-v4/index.js +12 -5
- package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
- package/dist/protocols/evm/venice/index.cjs +22 -16
- package/dist/protocols/evm/venice/index.cjs.map +1 -1
- package/dist/protocols/evm/venice/index.js +11 -5
- package/dist/protocols/evm/venice/index.js.map +1 -1
- package/package.json +2 -2
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var viem = require('viem');
|
|
4
|
-
var
|
|
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
|
|
|
6
10
|
// src/core/registry.ts
|
|
7
11
|
var modules = [];
|
|
@@ -107,7 +111,7 @@ function finalizeMultisign(input) {
|
|
|
107
111
|
const ph = (keyGen.pubkeyhex ?? "").trim();
|
|
108
112
|
if (!ph) throw new Error("keyGen pubKey (pubkeyhex) is required");
|
|
109
113
|
const keyList = keyGen.keylist ?? [];
|
|
110
|
-
const clientId =
|
|
114
|
+
const clientId = rpcUtils_js.getClientIdFromKeyGenResult(keyGen);
|
|
111
115
|
const first = legs[0];
|
|
112
116
|
const messageHashes = legs.map((l) => l.msgHash);
|
|
113
117
|
const messageRawBatch = legs.map((l) => l.msgRaw);
|
|
@@ -153,11 +157,16 @@ function finalizeMultisign(input) {
|
|
|
153
157
|
}
|
|
154
158
|
function routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimit) {
|
|
155
159
|
if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {
|
|
156
|
-
return
|
|
160
|
+
return txParams_js.gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit);
|
|
157
161
|
}
|
|
158
162
|
return (estimatedGas * 12n + 9n) / 10n;
|
|
159
163
|
}
|
|
160
164
|
|
|
165
|
+
// src/chains/evm/unsignedMessageRaw.ts
|
|
166
|
+
function evmUnsignedMessageRaw(serialized) {
|
|
167
|
+
return serialized.startsWith("0x") ? serialized.slice(2) : serialized;
|
|
168
|
+
}
|
|
169
|
+
|
|
161
170
|
// src/chains/evm/buildBatch.ts
|
|
162
171
|
async function buildEvmMultisignBatch(args) {
|
|
163
172
|
const { context, steps } = args;
|
|
@@ -179,7 +188,7 @@ async function buildEvmMultisignBatch(args) {
|
|
|
179
188
|
rpcUrls: { default: { http: [rpcUrl] } }
|
|
180
189
|
});
|
|
181
190
|
const publicClient = viem.createPublicClient({ chain: ch, transport: defiEvmTransport(rpcUrl) });
|
|
182
|
-
const feeParams = await
|
|
191
|
+
const feeParams = await chainFees_js.fetchChainFeeParams(rpcUrl, chainId);
|
|
183
192
|
const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559;
|
|
184
193
|
const latestBaseFeeWei = !legacy ? (await publicClient.getBlock({ blockTag: "latest" })).baseFeePerGas ?? 0n : 0n;
|
|
185
194
|
const gasLimitConfig = useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : void 0;
|
|
@@ -212,7 +221,7 @@ async function buildEvmMultisignBatch(args) {
|
|
|
212
221
|
} else if (step.routerSwap) {
|
|
213
222
|
gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter);
|
|
214
223
|
} else {
|
|
215
|
-
gasLimitI = useCustomGas ?
|
|
224
|
+
gasLimitI = useCustomGas ? txParams_js.gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig) : estimatedGas;
|
|
216
225
|
}
|
|
217
226
|
let proposalTxParams;
|
|
218
227
|
let feeSnapshot;
|
|
@@ -223,7 +232,7 @@ async function buildEvmMultisignBatch(args) {
|
|
|
223
232
|
gasPriceWei = gasPriceWei * BigInt(100 + gasFeeMultiplier) / 100n;
|
|
224
233
|
}
|
|
225
234
|
if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {
|
|
226
|
-
const configured = viem.parseGwei(
|
|
235
|
+
const configured = viem.parseGwei(gwei_js.gweiToDecimalString(Number(chainDetail.gasPrice)));
|
|
227
236
|
if (configured > gasPriceWei) gasPriceWei = configured;
|
|
228
237
|
}
|
|
229
238
|
serialized = viem.serializeTransaction({
|
|
@@ -242,7 +251,7 @@ async function buildEvmMultisignBatch(args) {
|
|
|
242
251
|
txType: "legacy",
|
|
243
252
|
gasPrice: gasPriceWei.toString()
|
|
244
253
|
};
|
|
245
|
-
feeSnapshot =
|
|
254
|
+
feeSnapshot = txParams_js.proposalTxParamsToFeeSnapshot(proposalTxParams);
|
|
246
255
|
} else {
|
|
247
256
|
const fetchedBase = feeParams.baseFeeGwei ?? 0;
|
|
248
257
|
const fetchedPriority = feeParams.priorityFeeGwei ?? 0;
|
|
@@ -253,13 +262,13 @@ async function buildEvmMultisignBatch(args) {
|
|
|
253
262
|
const baseFeeMultiplierPct = useCustomGas && chainDetail?.baseFeeMultiplier != null ? Math.max(100, Number(chainDetail.baseFeeMultiplier)) : 100;
|
|
254
263
|
const baseComponentGwei = effectiveBaseFeeGwei * baseFeeMultiplierPct / 100;
|
|
255
264
|
const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei;
|
|
256
|
-
let maxPriorityFeePerGas = effectivePriorityFeeGwei > 0 ? viem.parseGwei(
|
|
257
|
-
let maxFeePerGas = viem.parseGwei(
|
|
265
|
+
let maxPriorityFeePerGas = effectivePriorityFeeGwei > 0 ? viem.parseGwei(gwei_js.gweiToDecimalString(effectivePriorityFeeGwei)) : viem.parseGwei("1");
|
|
266
|
+
let maxFeePerGas = viem.parseGwei(gwei_js.gweiToDecimalString(maxFeePerGasGwei));
|
|
258
267
|
if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {
|
|
259
268
|
maxPriorityFeePerGas = maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier) / 100n;
|
|
260
269
|
maxFeePerGas = maxFeePerGas * BigInt(100 + gasFeeMultiplier) / 100n;
|
|
261
270
|
}
|
|
262
|
-
({ maxFeePerGas, maxPriorityFeePerGas } =
|
|
271
|
+
({ maxFeePerGas, maxPriorityFeePerGas } = getSigFeeSpeed_js.alignEip1559FeesWithLatestBase(
|
|
263
272
|
maxFeePerGas,
|
|
264
273
|
maxPriorityFeePerGas,
|
|
265
274
|
latestBaseFeeWei
|
|
@@ -282,14 +291,14 @@ async function buildEvmMultisignBatch(args) {
|
|
|
282
291
|
maxFeePerGas: maxFeePerGas.toString(),
|
|
283
292
|
maxPriorityFeePerGas: maxPriorityFeePerGas.toString()
|
|
284
293
|
};
|
|
285
|
-
feeSnapshot = i === 0 ?
|
|
294
|
+
feeSnapshot = i === 0 ? txParams_js.proposalTxParamsToFeeSnapshot(proposalTxParams) : {};
|
|
286
295
|
}
|
|
287
296
|
const h = viem.keccak256(serialized);
|
|
288
297
|
const msgHash = h.startsWith("0x") ? h.slice(2) : h;
|
|
289
298
|
const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI });
|
|
290
299
|
legs.push({
|
|
291
300
|
msgHash,
|
|
292
|
-
msgRaw:
|
|
301
|
+
msgRaw: evmUnsignedMessageRaw(serialized),
|
|
293
302
|
destinationAddress: step.to,
|
|
294
303
|
signatureText: typeof batchMetaExtra.signatureText === "string" ? batchMetaExtra.signatureText : JSON.stringify(batchMetaExtra.signatureText ?? {}),
|
|
295
304
|
audit: batchMetaExtra,
|
|
@@ -297,9 +306,6 @@ async function buildEvmMultisignBatch(args) {
|
|
|
297
306
|
proposalTxParams,
|
|
298
307
|
valueWei: i === 0 ? step.value : void 0
|
|
299
308
|
});
|
|
300
|
-
if (i === 0 && args.firstMsgRawNo0x != null) {
|
|
301
|
-
legs[0].msgRaw = args.firstMsgRawNo0x;
|
|
302
|
-
}
|
|
303
309
|
}
|
|
304
310
|
const extraJSON = {};
|
|
305
311
|
if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/lido/mainnet.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/lido/multisign.ts","../../../../src/protocols/evm/lido/aprApi.ts","../../../../src/protocols/evm/lido/reads.ts","../../../../src/protocols/evm/lido/withdrawalTimeApi.ts","../../../../src/protocols/evm/lido/withdrawalReceiptParse.ts","../../../../src/protocols/evm/lido/index.ts"],"names":["getAddress","zeroAddress","http","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","parseAbi","parseUnits","encodeFunctionData","decodeEventLog"],"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","import { getAddress, zeroAddress, type Address } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\n/** Lido staking / stERC-20 (“stETH”) on Ethereum mainnet — same proxy for `submit` + ERC‑20 balances. */\nexport const LIDO_STETH_CONTRACT_MAINNET = getAddress(\n '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84',\n)\n\n/** Lido Wrapped stETH (ERC-20): `wrap` / `unwrap`. */\nexport const LIDO_WSTETH_CONTRACT_MAINNET = getAddress(\n '0x7f39C581F595B853cBbF37C12FfeeA971C5a5bEa',\n)\n\n/** EIP-7623-era Withdrawal Queue (NFT-backed requests). */\nexport const LIDO_WITHDRAWAL_QUEUE_MAINNET = getAddress('0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1')\n\nexport const LIDO_ETHEREUM_MAINNET_CHAIN_ID = 1\n\n/** Robinhood Chain — bridged wstETH (CCIP). Staking / withdrawals remain mainnet-only. */\nexport const LIDO_ROBINHOOD_CHAIN_ID = 4663\nexport const LIDO_WSTETH_ROBINHOOD = getAddress('0x2dC99af320BC317c567f24eE95811dcbd5983DfD')\n\n/** Accepted referral pad for `submit`; zero is valid. */\nexport const LIDO_SUBMIT_REFERRAL_MAINNET = zeroAddress satisfies Address\n\nexport function isEthereumMainnetChainId(chainIdStr: string | undefined | null): boolean {\n return String(chainIdStr ?? '').trim() === String(LIDO_ETHEREUM_MAINNET_CHAIN_ID)\n}\n\n/** Chains where Lido assets are recognized (mainnet actions + bridged wstETH on Robinhood). */\nexport function listLidoSupportedChainIds(): number[] {\n return [LIDO_ETHEREUM_MAINNET_CHAIN_ID, LIDO_ROBINHOOD_CHAIN_ID]\n}\n\nexport function isLidoSupportedChainId(chainId: number): boolean {\n return chainId === LIDO_ETHEREUM_MAINNET_CHAIN_ID || chainId === LIDO_ROBINHOOD_CHAIN_ID\n}\n\n/** Canonical wstETH on a chain, or null when Lido is not modeled there. */\nexport function lidoWstethAddressOnEvmChain(chainId: number): Address | null {\n if (chainId === LIDO_ETHEREUM_MAINNET_CHAIN_ID) return LIDO_WSTETH_CONTRACT_MAINNET\n if (chainId === LIDO_ROBINHOOD_CHAIN_ID) return LIDO_WSTETH_ROBINHOOD\n return null\n}\n\nexport function isLidoWstethOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = lidoWstethAddressOnEvmChain(n)\n if (!expected) return false\n try {\n return getAddress(contractAddress) === expected\n } catch {\n return false\n }\n}\n\nexport function isLidoStethOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n if (!isEthereumMainnetChainId(assetsChainId)) return false\n try {\n return getAddress(contractAddress) === LIDO_STETH_CONTRACT_MAINNET\n } catch {\n return false\n }\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 * Lido on Ethereum — multi-sign payloads for stake (`submit`), queue exit (`approve` + `requestWithdrawals`),\n * and finalized claim (`claimWithdrawal`).\n */\nimport { type Address, createPublicClient, defineChain, encodeFunctionData, getAddress, parseAbi, parseUnits } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport {\n LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n LIDO_STETH_CONTRACT_MAINNET,\n LIDO_WITHDRAWAL_QUEUE_MAINNET,\n LIDO_SUBMIT_REFERRAL_MAINNET,\n LIDO_WSTETH_CONTRACT_MAINNET,\n} from './mainnet.js'\n\nexport const LIDO_SUBMIT_FALLBACK_GAS_UNITS = 450_000n\nconst LIDO_APPROVE_FALLBACK = 110_000n\nexport const LIDO_REQUEST_WITHDRAWALS_FALLBACK_GAS_UNITS = 1_350_000n\nexport const LIDO_CLAIM_WITHDRAWAL_FALLBACK_GAS_UNITS = 900_000n\n/** `wrap(stETH)` on wstETH. */\nexport const LIDO_WSTETH_WRAP_FALLBACK_GAS_UNITS = 520_000n\n/** `unwrap(wstETH)` on wstETH. */\nexport const LIDO_WSTETH_UNWRAP_FALLBACK_GAS_UNITS = 600_000n\nexport const MIN_LIDO_EXECUTE_GAS = 260_000n\n\nconst erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n])\nconst lidoAbi = parseAbi([\n 'function submit(address referral) payable returns (uint256)',\n 'function getSharesByPooledEth(uint256 ethAmount) view returns (uint256)',\n])\nconst wqAbi = parseAbi([\n 'function MIN_STETH_WITHDRAWAL_AMOUNT() view returns (uint256)',\n 'function MAX_STETH_WITHDRAWAL_AMOUNT() view returns (uint256)',\n 'function requestWithdrawals(uint256[] amounts, address owner) returns (uint256[] requestIds)',\n 'function claimWithdrawal(uint256 requestId)',\n])\nconst wstethAbi = parseAbi([\n 'function wrap(uint256 stETHAmount) returns (uint256)',\n 'function unwrap(uint256 wstETHAmount) returns (uint256)',\n])\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | 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\nexport const LIDO_EVM_TYPES = new Set([\n 'lido_submit',\n 'lido_steth_approve',\n 'lido_request_withdrawals',\n 'lido_claim_withdrawal',\n 'lido_wsteth_wrap',\n 'lido_wsteth_unwrap',\n])\n\n/** 0-based batch indices whose `batchMeta[i].evm.type` is `lido_request_withdrawals`. */\nexport function lidoRequestWithdrawalsBatchIndices(\n detail: Record<string, unknown> | null | undefined,\n): number[] {\n const ex = parseExtraJsonObject(detail)\n if (!ex) return []\n const bm = ex.batchMeta\n if (!Array.isArray(bm)) return []\n const out: number[] = []\n bm.forEach((entry, idx) => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return\n const evm = (entry as Record<string, unknown>).evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return\n const t = String((evm as Record<string, unknown>).type ?? '').trim()\n if (t === 'lido_request_withdrawals') out.push(idx)\n })\n return out\n}\n\nexport function isLidoBatchStepEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n if (!ex) return false\n const idx = batchIndex >= 0 ? batchIndex : 0\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[idx] && typeof bm[idx] === 'object' && !Array.isArray(bm[idx])) {\n const evm0 = (bm[idx] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n const t = String((evm0 as Record<string, unknown>).type ?? '')\n if (LIDO_EVM_TYPES.has(t)) return true\n }\n }\n return false\n}\n\nexport function resolveLidoBatchStepGasFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex: number,\n): bigint | null {\n if (!detail) return null\n const idx = batchIndex >= 0 ? batchIndex : 0\n const propBatch = (detail.proposal_tx_params ?? detail.proposalTxParams ?? detail.ProposalTxParams) as unknown\n if (Array.isArray(propBatch) && propBatch.length > idx) {\n const row = propBatch[idx]\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n const r = row as Record<string, unknown>\n const gl = parseOptionalGasLimitString(\n (r.gas_limit ?? r.gasLimit ?? r.GasLimit) as string | number | undefined,\n )\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[idx] && typeof bm[idx] === 'object' && !Array.isArray(bm[idx])) {\n const l = (bm[idx] as Record<string, unknown>).lido as Record<string, unknown> | undefined\n const gs =\n (l?.gasSubmit ??\n l?.gasApprove ??\n l?.gasRequestWithdrawals ??\n l?.gasClaimWithdrawal ??\n l?.gasWstethWrap ??\n l?.gasWstethUnwrap) as Record<string, unknown> | undefined\n const base = parseOptionalGasLimitString(gs?.baseGasUnits as string | number | undefined)\n if (base != null && base > 0n) return base\n }\n return null\n}\n\ntype BuildStepTx = {\n to: Address\n data: `0x${string}`\n value: bigint\n}\n\ntype StepKind = BuildStepTx & {\n fallbackGas: bigint\n buildBatchMeta: (ctx: { gasLimit: bigint }) => Record<string, unknown>\n}\n\nasync function finalizeLidoMultipart(\n steps: StepKind[],\n args: {\n keyGen: KeyGenSubsetForPermit\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n purposeText: string\n purposeSuffix: string\n executorAddress: Address\n },\n): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.fallbackGas,\n }))\n const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n rpcUrl: args.rpcUrl.trim(),\n executorAddress: args.executorAddress,\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: steps[0]!.to,\n buildBatchMeta: ({ index, gasLimit }) => steps[index]!.buildBatchMeta({ gasLimit }),\n })\n}\n\nexport async function buildEvmMultisignBodyLidoSubmit(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n ethAmountHuman: string\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido stake is supported on Ethereum mainnet (chain id 1) only.')\n }\n const lido = LIDO_STETH_CONTRACT_MAINNET\n const amt = parseUnits(args.ethAmountHuman, 18)\n if (amt === 0n) throw new Error('ETH amount must be greater than zero.')\n const referral = getAddress(LIDO_SUBMIT_REFERRAL_MAINNET)\n const data = encodeFunctionData({\n abi: lidoAbi,\n functionName: 'submit',\n args: [referral],\n })\n const step: StepKind = {\n to: lido,\n data,\n value: amt,\n fallbackGas: LIDO_SUBMIT_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: lido,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'Lido.submit',\n referral: referral,\n valueWei: amt.toString(),\n ethAmountHuman: args.ethAmountHuman,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_submit', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: { step: 'submit', ethAmountHuman: args.ethAmountHuman, gasSubmit: { baseGasUnits: gasLimit.toString() } },\n }),\n }\n const purposeSuffix = `Lido: stake ${args.ethAmountHuman} ETH → stETH (submit) on Ethereum.`\n return finalizeLidoMultipart([step], {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: args.executorAddress,\n })\n}\n\nexport async function buildEvmMultisignBodyLidoRequestWithdrawals(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n stEthAmountHuman: string\n owner: Address\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido withdrawals are supported on Ethereum mainnet (chain id 1) only.')\n }\n const steth = LIDO_STETH_CONTRACT_MAINNET\n const wq = LIDO_WITHDRAWAL_QUEUE_MAINNET\n const ch = defineChain({\n id: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\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 amountWei = parseUnits(args.stEthAmountHuman, 18)\n if (amountWei === 0n) throw new Error('stETH amount must be greater than zero.')\n\n const minW = await publicClient.readContract({\n address: wq,\n abi: wqAbi,\n functionName: 'MIN_STETH_WITHDRAWAL_AMOUNT',\n })\n const maxW = await publicClient.readContract({\n address: wq,\n abi: wqAbi,\n functionName: 'MAX_STETH_WITHDRAWAL_AMOUNT',\n })\n if (amountWei < minW) {\n throw new Error(\n `Withdrawal amount is below the queue minimum (${minW.toString()} wei of stETH; check decimals / protocol constants).`,\n )\n }\n if (amountWei > maxW) {\n throw new Error(\n `This flow sends a single request; amount exceeds the queue maximum (${maxW.toString()} wei). Split across multiple requests.`,\n )\n }\n\n const executor = getAddress(args.executorAddress)\n const ownerAddr = getAddress(args.owner)\n\n const steps: StepKind[] = []\n let approvalNeeded = false\n const allowance = await publicClient.readContract({\n address: steth,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [executor, wq],\n })\n if (allowance < amountWei) {\n approvalNeeded = true\n if (allowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [wq, 0n],\n })\n steps.push({\n to: steth,\n data: dataReset,\n value: 0n,\n fallbackGas: LIDO_APPROVE_FALLBACK,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: steth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'stETH.approve (reset allowance before new amount)',\n spender: wq,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_steth_approve', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: { step: 'approve_reset', gasApprove: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [wq, amountWei],\n })\n steps.push({\n to: steth,\n data: dataApprove,\n value: 0n,\n fallbackGas: LIDO_APPROVE_FALLBACK,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: steth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'stETH.approve',\n spender: wq,\n amountWei: amountWei.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_steth_approve', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'approve_exact',\n stEthAmountHuman: args.stEthAmountHuman,\n gasApprove: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n }\n\n const dataReq = encodeFunctionData({\n abi: wqAbi,\n functionName: 'requestWithdrawals',\n args: [[amountWei], ownerAddr],\n })\n steps.push({\n to: wq,\n data: dataReq,\n value: 0n,\n fallbackGas: LIDO_REQUEST_WITHDRAWALS_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: wq,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'WithdrawalQueue.requestWithdrawals',\n amountsWei: [amountWei.toString()],\n owner: ownerAddr,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_request_withdrawals', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'requestWithdrawals',\n stEthAmountHuman: args.stEthAmountHuman,\n owner: ownerAddr,\n approvalNeeded,\n gasRequestWithdrawals: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n\n const purposeSuffix = `Lido: withdrawal queue — approve (if needed) + requestWithdrawals (${args.stEthAmountHuman} stETH) on Ethereum (claim ETH in a follow-up tx when finalized).`\n return finalizeLidoMultipart(steps, {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: executor,\n })\n}\n\nexport async function buildEvmMultisignBodyLidoClaimWithdrawal(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n requestId: bigint\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido withdrawals are supported on Ethereum mainnet (chain id 1) only.')\n }\n if (args.requestId <= 0n) throw new Error('Withdrawal request id must be greater than zero.')\n const wq = LIDO_WITHDRAWAL_QUEUE_MAINNET\n\n const data = encodeFunctionData({\n abi: wqAbi,\n functionName: 'claimWithdrawal',\n args: [args.requestId],\n })\n\n const step: StepKind = {\n to: wq,\n data,\n value: 0n,\n fallbackGas: LIDO_CLAIM_WITHDRAWAL_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: wq,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'WithdrawalQueue.claimWithdrawal',\n requestId: args.requestId.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_claim_withdrawal', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'claimWithdrawal',\n requestId: args.requestId.toString(),\n gasClaimWithdrawal: { baseGasUnits: gasLimit.toString() },\n },\n }),\n }\n const purposeSuffix = `Lido: claim ETH for finalized withdrawal request #${args.requestId.toString()} on Ethereum (separate tx from requesting).`\n return finalizeLidoMultipart([step], {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: args.executorAddress,\n })\n}\n\nexport async function buildEvmMultisignBodyLidoWrapStEth(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n stEthAmountHuman: string\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido wrap is supported on Ethereum mainnet (chain id 1) only.')\n }\n const steth = LIDO_STETH_CONTRACT_MAINNET\n const wsteth = LIDO_WSTETH_CONTRACT_MAINNET\n const ch = defineChain({\n id: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\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 amountWei = parseUnits(args.stEthAmountHuman, 18)\n if (amountWei === 0n) throw new Error('stETH amount must be greater than zero.')\n\n const executor = getAddress(args.executorAddress)\n\n const steps: StepKind[] = []\n let approvalNeeded = false\n const allowance = await publicClient.readContract({\n address: steth,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [executor, wsteth],\n })\n if (allowance < amountWei) {\n approvalNeeded = true\n if (allowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [wsteth, 0n],\n })\n steps.push({\n to: steth,\n data: dataReset,\n value: 0n,\n fallbackGas: LIDO_APPROVE_FALLBACK,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: steth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'stETH.approve (reset for wstETH wrap)',\n spender: wsteth,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_steth_approve', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: { step: 'approve_wrap_reset', spender: 'wstETH', gasApprove: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [wsteth, amountWei],\n })\n steps.push({\n to: steth,\n data: dataApprove,\n value: 0n,\n fallbackGas: LIDO_APPROVE_FALLBACK,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: steth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'stETH.approve',\n spender: wsteth,\n amountWei: amountWei.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_steth_approve', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'approve_wrap_exact',\n stEthAmountHuman: args.stEthAmountHuman,\n gasApprove: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n }\n\n const dataWrap = encodeFunctionData({\n abi: wstethAbi,\n functionName: 'wrap',\n args: [amountWei],\n })\n steps.push({\n to: wsteth,\n data: dataWrap,\n value: 0n,\n fallbackGas: LIDO_WSTETH_WRAP_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: wsteth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'WstETH.wrap',\n stEthAmountWei: amountWei.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_wsteth_wrap', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'wrap',\n stEthAmountHuman: args.stEthAmountHuman,\n approvalNeeded,\n gasWstethWrap: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n\n const purposeSuffix = `Lido: approve (if needed) + wrap (${args.stEthAmountHuman} stETH → wstETH) on Ethereum.`\n return finalizeLidoMultipart(steps, {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: executor,\n })\n}\n\nexport async function buildEvmMultisignBodyLidoUnwrapWstEth(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n wstEthAmountHuman: string\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido unwrap is supported on Ethereum mainnet (chain id 1) only.')\n }\n const wsteth = LIDO_WSTETH_CONTRACT_MAINNET\n const amt = parseUnits(args.wstEthAmountHuman, 18)\n if (amt === 0n) throw new Error('wstETH amount must be greater than zero.')\n\n const data = encodeFunctionData({\n abi: wstethAbi,\n functionName: 'unwrap',\n args: [amt],\n })\n const step: StepKind = {\n to: wsteth,\n data,\n value: 0n,\n fallbackGas: LIDO_WSTETH_UNWRAP_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: wsteth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'WstETH.unwrap',\n wstEthAmountWei: amt.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_wsteth_unwrap', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'unwrap',\n wstEthAmountHuman: args.wstEthAmountHuman,\n gasWstethUnwrap: { baseGasUnits: gasLimit.toString() },\n },\n }),\n }\n const purposeSuffix = `Lido: unwrap (${args.wstEthAmountHuman} wstETH → stETH) on Ethereum.`\n return finalizeLidoMultipart([step], {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: args.executorAddress,\n })\n}\n\n/** True if this sign request relies on isolated `estimateGas` pitfalls (prior batch allowances). */\nexport function isLidoEvmSignRequestForEstimateWorkaround(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n return isLidoBatchStepEvmSignRequest(detail, batchIndex ?? 0)\n}\n","/** Read-only APR from official Lido API (Ethereum mainnet stETH). @see https://docs.lido.fi/integrations/api/ */\nexport async function fetchLidoStethAprLastPct(): Promise<number | null> {\n try {\n const res = await fetch('https://eth-api.lido.fi/v1/protocol/steth/apr/last', { cache: 'no-store' })\n if (!res.ok) return null\n const j = (await res.json()) as { data?: { apr?: unknown } }\n const apr = j?.data?.apr\n const n = typeof apr === 'number' ? apr : typeof apr === 'string' ? parseFloat(apr) : NaN\n return Number.isFinite(n) ? n : null\n } catch {\n return null\n }\n}\n","import { fetchLidoStethAprLastPct } from './aprApi.js'\n\nexport async function lidoFetchStethAprSummary(): Promise<{\n aprPercent: string\n apr: number | null\n asset: string\n source: string\n notes: string\n}> {\n const apr = await fetchLidoStethAprLastPct()\n return {\n aprPercent: apr == null ? '—' : `${apr.toFixed(2)}%`,\n apr,\n asset: 'stETH',\n source: 'lido-api',\n notes:\n 'Recent stETH staking APR from official Lido API (eth-api.lido.fi/v1/protocol/steth/apr/last). Ethereum mainnet. Do not web-search Lido rates.',\n }\n}\n","/**\n * Estimated time when withdrawal request(s) for a given **stETH** amount reach finalization / claim readiness.\n * @see https://docs.lido.fi/integrations/api/ — Withdrawals API v2 calculate\n */\nexport type LidoWithdrawalTimeEstimate =\n | { ok: true; finalizationAtIso: string; displayLabel: string }\n | { ok: false; error: string }\n\nfunction formatIsoUtc(i: string): string {\n try {\n const d = new Date(i)\n if (Number.isNaN(d.getTime())) return i\n return d.toUTCString()\n } catch {\n return i\n }\n}\n\n/** `amountHuman` — integer or decimal **stETH** (human units); passed as `calculate?amount=` (API expects stETH, not wei). */\nexport async function fetchLidoWithdrawalFinalizationEta(args: { amountHuman: string }): Promise<LidoWithdrawalTimeEstimate> {\n const raw = args.amountHuman.trim().replace(/,/g, '')\n if (!raw || raw === '.' || raw === '0') {\n return { ok: false, error: '' }\n }\n const q = encodeURIComponent(raw)\n try {\n const res = await fetch(`https://wq-api.lido.fi/v2/request-time/calculate?amount=${q}`, {\n cache: 'no-store',\n })\n if (!res.ok) {\n return { ok: false, error: `Withdrawal ETA API (${res.status})` }\n }\n const j = (await res.json()) as {\n status?: unknown\n requestInfo?: { finalizationAt?: unknown }\n }\n const at = j?.requestInfo?.finalizationAt\n const s = typeof at === 'string' && at.trim() ? at.trim() : null\n if (!s || j.status !== 'calculated') {\n return { ok: false, error: '' }\n }\n return {\n ok: true,\n finalizationAtIso: s,\n displayLabel: formatIsoUtc(s),\n }\n } catch (e) {\n return {\n ok: false,\n error: e instanceof Error ? e.message : 'ETA unavailable',\n }\n }\n}\n","/**\n * Withdrawal NFTs on Ethereum are ERC-721 tokens minted on the Withdrawal Queue.\n * Parses mint `Transfer(from=0)` events to recover request id(s) (= token ids).\n */\nimport {\n decodeEventLog,\n encodeFunctionData,\n getAddress,\n parseAbi,\n zeroAddress,\n type Address,\n type Hex,\n type TransactionReceipt,\n} from 'viem'\nimport { LIDO_WITHDRAWAL_QUEUE_MAINNET } from './mainnet.js'\n\nconst erc721TransferAbi = parseAbi([\n 'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)',\n])\nconst requestWithdrawalsAbiSlice = parseAbi(['function requestWithdrawals(uint256[] amounts, address owner)'])\n\nlet _requestWithdrawalsSelectorPrefix: Hex | null = null\n\n/** First 10 chars of encoded calldata: `0x` + 4-byte selector — detects `requestWithdrawals` txs. */\nexport function requestWithdrawalsCalldataPrefix(): Hex {\n if (_requestWithdrawalsSelectorPrefix === null) {\n _requestWithdrawalsSelectorPrefix = encodeFunctionData({\n abi: requestWithdrawalsAbiSlice,\n functionName: 'requestWithdrawals',\n args: [[0n], getAddress(zeroAddress)],\n }).slice(0, 10) as Hex\n }\n return _requestWithdrawalsSelectorPrefix\n}\n\nexport function calldataStartsWithRequestWithdrawals(dataHex: string | Hex | undefined | null): boolean {\n const raw = typeof dataHex === 'string' ? dataHex.trim() : ''\n if (!raw.startsWith('0x') && !raw.startsWith('0X')) return false\n const head = (raw.startsWith('0x') || raw.startsWith('0X') ? raw.toLowerCase() : `0x${raw}`).toLowerCase()\n return head.startsWith(requestWithdrawalsCalldataPrefix().toLowerCase())\n}\n\n/** Token ids minted by the Withdrawal Queue in this receipt (`Transfer` from zero address). */\nexport function withdrawalQueueMintedTokenIdsFromReceipt(\n receipt: TransactionReceipt,\n withdrawalQueue: Address | string = LIDO_WITHDRAWAL_QUEUE_MAINNET,\n): bigint[] {\n let wqNorm: string\n try {\n wqNorm = getAddress(withdrawalQueue as Address).toLowerCase()\n } catch {\n return []\n }\n\n const out: bigint[] = []\n const zeroFrom = zeroAddress.toLowerCase()\n\n for (const log of receipt.logs) {\n if ((log.address ?? '').toLowerCase() !== wqNorm) continue\n try {\n const decoded = decodeEventLog({\n abi: erc721TransferAbi,\n data: log.data,\n topics: log.topics,\n })\n const args =\n decoded && typeof decoded === 'object' && 'args' in decoded\n ? (decoded.args as { from?: Address; tokenId?: bigint })\n : undefined\n const from = args?.from?.toLowerCase()\n if (!from || from !== zeroFrom) continue\n if (typeof args?.tokenId !== 'bigint') continue\n out.push(args.tokenId)\n } catch {\n /* ignore */\n }\n }\n out.sort((a, b) => (a === b ? 0 : a < b ? -1 : 1))\n return out\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isLidoSupportedChainId } from './mainnet.js'\n\nexport * from './mainnet.js'\nexport * from './multisign.js'\nexport * from './aprApi.js'\nexport * from './reads.js'\nexport * from './withdrawalTimeApi.js'\nexport * from './withdrawalReceiptParse.js'\n\nexport const LIDO_PROTOCOL_ID = 'lido'\n\nexport const lidoProtocolModule: ProtocolModule = {\n id: LIDO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isLidoSupportedChainId(Number(ctx.chainId))\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'lido.submit', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Stake ETH via Lido submit()', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: { valueWei: { type: 'string', required: true, description: 'ETH to stake (wei string)' } } },\n { id: 'lido.request-withdrawals', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Queue stETH withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.claim-withdrawal', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim finalized withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.wrap-steth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Wrap stETH to wstETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.unwrap-wsteth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Unwrap wstETH to stETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(lidoProtocolModule)\n"]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/lido/mainnet.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/lido/multisign.ts","../../../../src/protocols/evm/lido/aprApi.ts","../../../../src/protocols/evm/lido/reads.ts","../../../../src/protocols/evm/lido/withdrawalTimeApi.ts","../../../../src/protocols/evm/lido/withdrawalReceiptParse.ts","../../../../src/protocols/evm/lido/index.ts"],"names":["getAddress","zeroAddress","http","getClientIdFromKeyGenResult","gasLimitFromEstimateAndChainConfig","defineChain","createPublicClient","fetchChainFeeParams","parseGwei","gweiToDecimalString","serializeTransaction","proposalTxParamsToFeeSnapshot","alignEip1559FeesWithLatestBase","keccak256","parseAbi","parseUnits","encodeFunctionData","decodeEventLog"],"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","import { getAddress, zeroAddress, type Address } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\n/** Lido staking / stERC-20 (“stETH”) on Ethereum mainnet — same proxy for `submit` + ERC‑20 balances. */\nexport const LIDO_STETH_CONTRACT_MAINNET = getAddress(\n '0xae7ab96520DE3A18E5e111B5EaAb095312D7fE84',\n)\n\n/** Lido Wrapped stETH (ERC-20): `wrap` / `unwrap`. */\nexport const LIDO_WSTETH_CONTRACT_MAINNET = getAddress(\n '0x7f39C581F595B853cBbF37C12FfeeA971C5a5bEa',\n)\n\n/** EIP-7623-era Withdrawal Queue (NFT-backed requests). */\nexport const LIDO_WITHDRAWAL_QUEUE_MAINNET = getAddress('0x889edC2eDab5f40e902b864aD4d7AdE8E412F9B1')\n\nexport const LIDO_ETHEREUM_MAINNET_CHAIN_ID = 1\n\n/** Robinhood Chain — bridged wstETH (CCIP). Staking / withdrawals remain mainnet-only. */\nexport const LIDO_ROBINHOOD_CHAIN_ID = 4663\nexport const LIDO_WSTETH_ROBINHOOD = getAddress('0x2dC99af320BC317c567f24eE95811dcbd5983DfD')\n\n/** Accepted referral pad for `submit`; zero is valid. */\nexport const LIDO_SUBMIT_REFERRAL_MAINNET = zeroAddress satisfies Address\n\nexport function isEthereumMainnetChainId(chainIdStr: string | undefined | null): boolean {\n return String(chainIdStr ?? '').trim() === String(LIDO_ETHEREUM_MAINNET_CHAIN_ID)\n}\n\n/** Chains where Lido assets are recognized (mainnet actions + bridged wstETH on Robinhood). */\nexport function listLidoSupportedChainIds(): number[] {\n return [LIDO_ETHEREUM_MAINNET_CHAIN_ID, LIDO_ROBINHOOD_CHAIN_ID]\n}\n\nexport function isLidoSupportedChainId(chainId: number): boolean {\n return chainId === LIDO_ETHEREUM_MAINNET_CHAIN_ID || chainId === LIDO_ROBINHOOD_CHAIN_ID\n}\n\n/** Canonical wstETH on a chain, or null when Lido is not modeled there. */\nexport function lidoWstethAddressOnEvmChain(chainId: number): Address | null {\n if (chainId === LIDO_ETHEREUM_MAINNET_CHAIN_ID) return LIDO_WSTETH_CONTRACT_MAINNET\n if (chainId === LIDO_ROBINHOOD_CHAIN_ID) return LIDO_WSTETH_ROBINHOOD\n return null\n}\n\nexport function isLidoWstethOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n const n = parseEvmChainIdToNumber(assetsChainId)\n if (Number.isNaN(n) || n < 0) return false\n const expected = lidoWstethAddressOnEvmChain(n)\n if (!expected) return false\n try {\n return getAddress(contractAddress) === expected\n } catch {\n return false\n }\n}\n\nexport function isLidoStethOnAssetsChain(assetsChainId: string, contractAddress: string): boolean {\n if (!isEthereumMainnetChainId(assetsChainId)) return false\n try {\n return getAddress(contractAddress) === LIDO_STETH_CONTRACT_MAINNET\n } catch {\n return false\n }\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 * Lido on Ethereum — multi-sign payloads for stake (`submit`), queue exit (`approve` + `requestWithdrawals`),\n * and finalized claim (`claimWithdrawal`).\n */\nimport { type Address, createPublicClient, defineChain, encodeFunctionData, getAddress, parseAbi, parseUnits } from 'viem'\nimport { defiEvmTransport } from '../../../core/defiEvmClient.js'\nimport type { KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\nimport {\n LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n LIDO_STETH_CONTRACT_MAINNET,\n LIDO_WITHDRAWAL_QUEUE_MAINNET,\n LIDO_SUBMIT_REFERRAL_MAINNET,\n LIDO_WSTETH_CONTRACT_MAINNET,\n} from './mainnet.js'\n\nexport const LIDO_SUBMIT_FALLBACK_GAS_UNITS = 450_000n\nconst LIDO_APPROVE_FALLBACK = 110_000n\nexport const LIDO_REQUEST_WITHDRAWALS_FALLBACK_GAS_UNITS = 1_350_000n\nexport const LIDO_CLAIM_WITHDRAWAL_FALLBACK_GAS_UNITS = 900_000n\n/** `wrap(stETH)` on wstETH. */\nexport const LIDO_WSTETH_WRAP_FALLBACK_GAS_UNITS = 520_000n\n/** `unwrap(wstETH)` on wstETH. */\nexport const LIDO_WSTETH_UNWRAP_FALLBACK_GAS_UNITS = 600_000n\nexport const MIN_LIDO_EXECUTE_GAS = 260_000n\n\nconst erc20Abi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function approve(address spender, uint256 amount) returns (bool)',\n])\nconst lidoAbi = parseAbi([\n 'function submit(address referral) payable returns (uint256)',\n 'function getSharesByPooledEth(uint256 ethAmount) view returns (uint256)',\n])\nconst wqAbi = parseAbi([\n 'function MIN_STETH_WITHDRAWAL_AMOUNT() view returns (uint256)',\n 'function MAX_STETH_WITHDRAWAL_AMOUNT() view returns (uint256)',\n 'function requestWithdrawals(uint256[] amounts, address owner) returns (uint256[] requestIds)',\n 'function claimWithdrawal(uint256 requestId)',\n])\nconst wstethAbi = parseAbi([\n 'function wrap(uint256 stETHAmount) returns (uint256)',\n 'function unwrap(uint256 wstETHAmount) returns (uint256)',\n])\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | 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\nexport const LIDO_EVM_TYPES = new Set([\n 'lido_submit',\n 'lido_steth_approve',\n 'lido_request_withdrawals',\n 'lido_claim_withdrawal',\n 'lido_wsteth_wrap',\n 'lido_wsteth_unwrap',\n])\n\n/** 0-based batch indices whose `batchMeta[i].evm.type` is `lido_request_withdrawals`. */\nexport function lidoRequestWithdrawalsBatchIndices(\n detail: Record<string, unknown> | null | undefined,\n): number[] {\n const ex = parseExtraJsonObject(detail)\n if (!ex) return []\n const bm = ex.batchMeta\n if (!Array.isArray(bm)) return []\n const out: number[] = []\n bm.forEach((entry, idx) => {\n if (!entry || typeof entry !== 'object' || Array.isArray(entry)) return\n const evm = (entry as Record<string, unknown>).evm\n if (!evm || typeof evm !== 'object' || Array.isArray(evm)) return\n const t = String((evm as Record<string, unknown>).type ?? '').trim()\n if (t === 'lido_request_withdrawals') out.push(idx)\n })\n return out\n}\n\nexport function isLidoBatchStepEvmSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex: number,\n): boolean {\n const ex = parseExtraJsonObject(detail)\n if (!ex) return false\n const idx = batchIndex >= 0 ? batchIndex : 0\n const bm = ex.batchMeta\n if (Array.isArray(bm) && bm[idx] && typeof bm[idx] === 'object' && !Array.isArray(bm[idx])) {\n const evm0 = (bm[idx] as Record<string, unknown>).evm\n if (evm0 && typeof evm0 === 'object' && !Array.isArray(evm0)) {\n const t = String((evm0 as Record<string, unknown>).type ?? '')\n if (LIDO_EVM_TYPES.has(t)) return true\n }\n }\n return false\n}\n\nexport function resolveLidoBatchStepGasFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex: number,\n): bigint | null {\n if (!detail) return null\n const idx = batchIndex >= 0 ? batchIndex : 0\n const propBatch = (detail.proposal_tx_params ?? detail.proposalTxParams ?? detail.ProposalTxParams) as unknown\n if (Array.isArray(propBatch) && propBatch.length > idx) {\n const row = propBatch[idx]\n if (row && typeof row === 'object' && !Array.isArray(row)) {\n const r = row as Record<string, unknown>\n const gl = parseOptionalGasLimitString(\n (r.gas_limit ?? r.gasLimit ?? r.GasLimit) as string | number | undefined,\n )\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[idx] && typeof bm[idx] === 'object' && !Array.isArray(bm[idx])) {\n const l = (bm[idx] as Record<string, unknown>).lido as Record<string, unknown> | undefined\n const gs =\n (l?.gasSubmit ??\n l?.gasApprove ??\n l?.gasRequestWithdrawals ??\n l?.gasClaimWithdrawal ??\n l?.gasWstethWrap ??\n l?.gasWstethUnwrap) as Record<string, unknown> | undefined\n const base = parseOptionalGasLimitString(gs?.baseGasUnits as string | number | undefined)\n if (base != null && base > 0n) return base\n }\n return null\n}\n\ntype BuildStepTx = {\n to: Address\n data: `0x${string}`\n value: bigint\n}\n\ntype StepKind = BuildStepTx & {\n fallbackGas: bigint\n buildBatchMeta: (ctx: { gasLimit: bigint }) => Record<string, unknown>\n}\n\nasync function finalizeLidoMultipart(\n steps: StepKind[],\n args: {\n keyGen: KeyGenSubsetForPermit\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n purposeText: string\n purposeSuffix: string\n executorAddress: Address\n },\n): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.fallbackGas,\n }))\n const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n rpcUrl: args.rpcUrl.trim(),\n executorAddress: args.executorAddress,\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: steps[0]!.to,\n buildBatchMeta: ({ index, gasLimit }) => steps[index]!.buildBatchMeta({ gasLimit }),\n })\n}\n\nexport async function buildEvmMultisignBodyLidoSubmit(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n ethAmountHuman: string\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido stake is supported on Ethereum mainnet (chain id 1) only.')\n }\n const lido = LIDO_STETH_CONTRACT_MAINNET\n const amt = parseUnits(args.ethAmountHuman, 18)\n if (amt === 0n) throw new Error('ETH amount must be greater than zero.')\n const referral = getAddress(LIDO_SUBMIT_REFERRAL_MAINNET)\n const data = encodeFunctionData({\n abi: lidoAbi,\n functionName: 'submit',\n args: [referral],\n })\n const step: StepKind = {\n to: lido,\n data,\n value: amt,\n fallbackGas: LIDO_SUBMIT_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: lido,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'Lido.submit',\n referral: referral,\n valueWei: amt.toString(),\n ethAmountHuman: args.ethAmountHuman,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_submit', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: { step: 'submit', ethAmountHuman: args.ethAmountHuman, gasSubmit: { baseGasUnits: gasLimit.toString() } },\n }),\n }\n const purposeSuffix = `Lido: stake ${args.ethAmountHuman} ETH → stETH (submit) on Ethereum.`\n return finalizeLidoMultipart([step], {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: args.executorAddress,\n })\n}\n\nexport async function buildEvmMultisignBodyLidoRequestWithdrawals(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n stEthAmountHuman: string\n owner: Address\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido withdrawals are supported on Ethereum mainnet (chain id 1) only.')\n }\n const steth = LIDO_STETH_CONTRACT_MAINNET\n const wq = LIDO_WITHDRAWAL_QUEUE_MAINNET\n const ch = defineChain({\n id: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\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 amountWei = parseUnits(args.stEthAmountHuman, 18)\n if (amountWei === 0n) throw new Error('stETH amount must be greater than zero.')\n\n const minW = await publicClient.readContract({\n address: wq,\n abi: wqAbi,\n functionName: 'MIN_STETH_WITHDRAWAL_AMOUNT',\n })\n const maxW = await publicClient.readContract({\n address: wq,\n abi: wqAbi,\n functionName: 'MAX_STETH_WITHDRAWAL_AMOUNT',\n })\n if (amountWei < minW) {\n throw new Error(\n `Withdrawal amount is below the queue minimum (${minW.toString()} wei of stETH; check decimals / protocol constants).`,\n )\n }\n if (amountWei > maxW) {\n throw new Error(\n `This flow sends a single request; amount exceeds the queue maximum (${maxW.toString()} wei). Split across multiple requests.`,\n )\n }\n\n const executor = getAddress(args.executorAddress)\n const ownerAddr = getAddress(args.owner)\n\n const steps: StepKind[] = []\n let approvalNeeded = false\n const allowance = await publicClient.readContract({\n address: steth,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [executor, wq],\n })\n if (allowance < amountWei) {\n approvalNeeded = true\n if (allowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [wq, 0n],\n })\n steps.push({\n to: steth,\n data: dataReset,\n value: 0n,\n fallbackGas: LIDO_APPROVE_FALLBACK,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: steth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'stETH.approve (reset allowance before new amount)',\n spender: wq,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_steth_approve', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: { step: 'approve_reset', gasApprove: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [wq, amountWei],\n })\n steps.push({\n to: steth,\n data: dataApprove,\n value: 0n,\n fallbackGas: LIDO_APPROVE_FALLBACK,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: steth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'stETH.approve',\n spender: wq,\n amountWei: amountWei.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_steth_approve', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'approve_exact',\n stEthAmountHuman: args.stEthAmountHuman,\n gasApprove: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n }\n\n const dataReq = encodeFunctionData({\n abi: wqAbi,\n functionName: 'requestWithdrawals',\n args: [[amountWei], ownerAddr],\n })\n steps.push({\n to: wq,\n data: dataReq,\n value: 0n,\n fallbackGas: LIDO_REQUEST_WITHDRAWALS_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: wq,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'WithdrawalQueue.requestWithdrawals',\n amountsWei: [amountWei.toString()],\n owner: ownerAddr,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_request_withdrawals', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'requestWithdrawals',\n stEthAmountHuman: args.stEthAmountHuman,\n owner: ownerAddr,\n approvalNeeded,\n gasRequestWithdrawals: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n\n const purposeSuffix = `Lido: withdrawal queue — approve (if needed) + requestWithdrawals (${args.stEthAmountHuman} stETH) on Ethereum (claim ETH in a follow-up tx when finalized).`\n return finalizeLidoMultipart(steps, {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: executor,\n })\n}\n\nexport async function buildEvmMultisignBodyLidoClaimWithdrawal(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n requestId: bigint\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido withdrawals are supported on Ethereum mainnet (chain id 1) only.')\n }\n if (args.requestId <= 0n) throw new Error('Withdrawal request id must be greater than zero.')\n const wq = LIDO_WITHDRAWAL_QUEUE_MAINNET\n\n const data = encodeFunctionData({\n abi: wqAbi,\n functionName: 'claimWithdrawal',\n args: [args.requestId],\n })\n\n const step: StepKind = {\n to: wq,\n data,\n value: 0n,\n fallbackGas: LIDO_CLAIM_WITHDRAWAL_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: wq,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'WithdrawalQueue.claimWithdrawal',\n requestId: args.requestId.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_claim_withdrawal', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'claimWithdrawal',\n requestId: args.requestId.toString(),\n gasClaimWithdrawal: { baseGasUnits: gasLimit.toString() },\n },\n }),\n }\n const purposeSuffix = `Lido: claim ETH for finalized withdrawal request #${args.requestId.toString()} on Ethereum (separate tx from requesting).`\n return finalizeLidoMultipart([step], {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: args.executorAddress,\n })\n}\n\nexport async function buildEvmMultisignBodyLidoWrapStEth(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n stEthAmountHuman: string\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido wrap is supported on Ethereum mainnet (chain id 1) only.')\n }\n const steth = LIDO_STETH_CONTRACT_MAINNET\n const wsteth = LIDO_WSTETH_CONTRACT_MAINNET\n const ch = defineChain({\n id: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\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 amountWei = parseUnits(args.stEthAmountHuman, 18)\n if (amountWei === 0n) throw new Error('stETH amount must be greater than zero.')\n\n const executor = getAddress(args.executorAddress)\n\n const steps: StepKind[] = []\n let approvalNeeded = false\n const allowance = await publicClient.readContract({\n address: steth,\n abi: erc20Abi,\n functionName: 'allowance',\n args: [executor, wsteth],\n })\n if (allowance < amountWei) {\n approvalNeeded = true\n if (allowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [wsteth, 0n],\n })\n steps.push({\n to: steth,\n data: dataReset,\n value: 0n,\n fallbackGas: LIDO_APPROVE_FALLBACK,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: steth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'stETH.approve (reset for wstETH wrap)',\n spender: wsteth,\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_steth_approve', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: { step: 'approve_wrap_reset', spender: 'wstETH', gasApprove: { baseGasUnits: gasLimit.toString() } },\n }),\n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20Abi,\n functionName: 'approve',\n args: [wsteth, amountWei],\n })\n steps.push({\n to: steth,\n data: dataApprove,\n value: 0n,\n fallbackGas: LIDO_APPROVE_FALLBACK,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: steth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'stETH.approve',\n spender: wsteth,\n amountWei: amountWei.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_steth_approve', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'approve_wrap_exact',\n stEthAmountHuman: args.stEthAmountHuman,\n gasApprove: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n }\n\n const dataWrap = encodeFunctionData({\n abi: wstethAbi,\n functionName: 'wrap',\n args: [amountWei],\n })\n steps.push({\n to: wsteth,\n data: dataWrap,\n value: 0n,\n fallbackGas: LIDO_WSTETH_WRAP_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: wsteth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'WstETH.wrap',\n stEthAmountWei: amountWei.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_wsteth_wrap', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'wrap',\n stEthAmountHuman: args.stEthAmountHuman,\n approvalNeeded,\n gasWstethWrap: { baseGasUnits: gasLimit.toString() },\n },\n }),\n })\n\n const purposeSuffix = `Lido: approve (if needed) + wrap (${args.stEthAmountHuman} stETH → wstETH) on Ethereum.`\n return finalizeLidoMultipart(steps, {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: executor,\n })\n}\n\nexport async function buildEvmMultisignBodyLidoUnwrapWstEth(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n wstEthAmountHuman: string\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n if (args.chainId !== LIDO_ETHEREUM_MAINNET_CHAIN_ID) {\n throw new Error('Lido unwrap is supported on Ethereum mainnet (chain id 1) only.')\n }\n const wsteth = LIDO_WSTETH_CONTRACT_MAINNET\n const amt = parseUnits(args.wstEthAmountHuman, 18)\n if (amt === 0n) throw new Error('wstETH amount must be greater than zero.')\n\n const data = encodeFunctionData({\n abi: wstethAbi,\n functionName: 'unwrap',\n args: [amt],\n })\n const step: StepKind = {\n to: wsteth,\n data,\n value: 0n,\n fallbackGas: LIDO_WSTETH_UNWRAP_FALLBACK_GAS_UNITS,\n buildBatchMeta: ({ gasLimit }) => ({\n destinationAddress: wsteth,\n signatureText: JSON.stringify({\n kind: 'Lido',\n name: 'WstETH.unwrap',\n wstEthAmountWei: amt.toString(),\n chainId: LIDO_ETHEREUM_MAINNET_CHAIN_ID,\n }),\n evm: { type: 'lido_wsteth_unwrap', version: 1, chainId: String(LIDO_ETHEREUM_MAINNET_CHAIN_ID) },\n lido: {\n step: 'unwrap',\n wstEthAmountHuman: args.wstEthAmountHuman,\n gasWstethUnwrap: { baseGasUnits: gasLimit.toString() },\n },\n }),\n }\n const purposeSuffix = `Lido: unwrap (${args.wstEthAmountHuman} wstETH → stETH) on Ethereum.`\n return finalizeLidoMultipart([step], {\n keyGen: args.keyGen,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n purposeText: args.purposeText,\n purposeSuffix,\n executorAddress: args.executorAddress,\n })\n}\n\n/** True if this sign request relies on isolated `estimateGas` pitfalls (prior batch allowances). */\nexport function isLidoEvmSignRequestForEstimateWorkaround(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number,\n): boolean {\n return isLidoBatchStepEvmSignRequest(detail, batchIndex ?? 0)\n}\n","/** Read-only APR from official Lido API (Ethereum mainnet stETH). @see https://docs.lido.fi/integrations/api/ */\nexport async function fetchLidoStethAprLastPct(): Promise<number | null> {\n try {\n const res = await fetch('https://eth-api.lido.fi/v1/protocol/steth/apr/last', { cache: 'no-store' })\n if (!res.ok) return null\n const j = (await res.json()) as { data?: { apr?: unknown } }\n const apr = j?.data?.apr\n const n = typeof apr === 'number' ? apr : typeof apr === 'string' ? parseFloat(apr) : NaN\n return Number.isFinite(n) ? n : null\n } catch {\n return null\n }\n}\n","import { fetchLidoStethAprLastPct } from './aprApi.js'\n\nexport async function lidoFetchStethAprSummary(): Promise<{\n aprPercent: string\n apr: number | null\n asset: string\n source: string\n notes: string\n}> {\n const apr = await fetchLidoStethAprLastPct()\n return {\n aprPercent: apr == null ? '—' : `${apr.toFixed(2)}%`,\n apr,\n asset: 'stETH',\n source: 'lido-api',\n notes:\n 'Recent stETH staking APR from official Lido API (eth-api.lido.fi/v1/protocol/steth/apr/last). Ethereum mainnet. Do not web-search Lido rates.',\n }\n}\n","/**\n * Estimated time when withdrawal request(s) for a given **stETH** amount reach finalization / claim readiness.\n * @see https://docs.lido.fi/integrations/api/ — Withdrawals API v2 calculate\n */\nexport type LidoWithdrawalTimeEstimate =\n | { ok: true; finalizationAtIso: string; displayLabel: string }\n | { ok: false; error: string }\n\nfunction formatIsoUtc(i: string): string {\n try {\n const d = new Date(i)\n if (Number.isNaN(d.getTime())) return i\n return d.toUTCString()\n } catch {\n return i\n }\n}\n\n/** `amountHuman` — integer or decimal **stETH** (human units); passed as `calculate?amount=` (API expects stETH, not wei). */\nexport async function fetchLidoWithdrawalFinalizationEta(args: { amountHuman: string }): Promise<LidoWithdrawalTimeEstimate> {\n const raw = args.amountHuman.trim().replace(/,/g, '')\n if (!raw || raw === '.' || raw === '0') {\n return { ok: false, error: '' }\n }\n const q = encodeURIComponent(raw)\n try {\n const res = await fetch(`https://wq-api.lido.fi/v2/request-time/calculate?amount=${q}`, {\n cache: 'no-store',\n })\n if (!res.ok) {\n return { ok: false, error: `Withdrawal ETA API (${res.status})` }\n }\n const j = (await res.json()) as {\n status?: unknown\n requestInfo?: { finalizationAt?: unknown }\n }\n const at = j?.requestInfo?.finalizationAt\n const s = typeof at === 'string' && at.trim() ? at.trim() : null\n if (!s || j.status !== 'calculated') {\n return { ok: false, error: '' }\n }\n return {\n ok: true,\n finalizationAtIso: s,\n displayLabel: formatIsoUtc(s),\n }\n } catch (e) {\n return {\n ok: false,\n error: e instanceof Error ? e.message : 'ETA unavailable',\n }\n }\n}\n","/**\n * Withdrawal NFTs on Ethereum are ERC-721 tokens minted on the Withdrawal Queue.\n * Parses mint `Transfer(from=0)` events to recover request id(s) (= token ids).\n */\nimport {\n decodeEventLog,\n encodeFunctionData,\n getAddress,\n parseAbi,\n zeroAddress,\n type Address,\n type Hex,\n type TransactionReceipt,\n} from 'viem'\nimport { LIDO_WITHDRAWAL_QUEUE_MAINNET } from './mainnet.js'\n\nconst erc721TransferAbi = parseAbi([\n 'event Transfer(address indexed from, address indexed to, uint256 indexed tokenId)',\n])\nconst requestWithdrawalsAbiSlice = parseAbi(['function requestWithdrawals(uint256[] amounts, address owner)'])\n\nlet _requestWithdrawalsSelectorPrefix: Hex | null = null\n\n/** First 10 chars of encoded calldata: `0x` + 4-byte selector — detects `requestWithdrawals` txs. */\nexport function requestWithdrawalsCalldataPrefix(): Hex {\n if (_requestWithdrawalsSelectorPrefix === null) {\n _requestWithdrawalsSelectorPrefix = encodeFunctionData({\n abi: requestWithdrawalsAbiSlice,\n functionName: 'requestWithdrawals',\n args: [[0n], getAddress(zeroAddress)],\n }).slice(0, 10) as Hex\n }\n return _requestWithdrawalsSelectorPrefix\n}\n\nexport function calldataStartsWithRequestWithdrawals(dataHex: string | Hex | undefined | null): boolean {\n const raw = typeof dataHex === 'string' ? dataHex.trim() : ''\n if (!raw.startsWith('0x') && !raw.startsWith('0X')) return false\n const head = (raw.startsWith('0x') || raw.startsWith('0X') ? raw.toLowerCase() : `0x${raw}`).toLowerCase()\n return head.startsWith(requestWithdrawalsCalldataPrefix().toLowerCase())\n}\n\n/** Token ids minted by the Withdrawal Queue in this receipt (`Transfer` from zero address). */\nexport function withdrawalQueueMintedTokenIdsFromReceipt(\n receipt: TransactionReceipt,\n withdrawalQueue: Address | string = LIDO_WITHDRAWAL_QUEUE_MAINNET,\n): bigint[] {\n let wqNorm: string\n try {\n wqNorm = getAddress(withdrawalQueue as Address).toLowerCase()\n } catch {\n return []\n }\n\n const out: bigint[] = []\n const zeroFrom = zeroAddress.toLowerCase()\n\n for (const log of receipt.logs) {\n if ((log.address ?? '').toLowerCase() !== wqNorm) continue\n try {\n const decoded = decodeEventLog({\n abi: erc721TransferAbi,\n data: log.data,\n topics: log.topics,\n })\n const args =\n decoded && typeof decoded === 'object' && 'args' in decoded\n ? (decoded.args as { from?: Address; tokenId?: bigint })\n : undefined\n const from = args?.from?.toLowerCase()\n if (!from || from !== zeroFrom) continue\n if (typeof args?.tokenId !== 'bigint') continue\n out.push(args.tokenId)\n } catch {\n /* ignore */\n }\n }\n out.sort((a, b) => (a === b ? 0 : a < b ? -1 : 1))\n return out\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\nimport { isLidoSupportedChainId } from './mainnet.js'\n\nexport * from './mainnet.js'\nexport * from './multisign.js'\nexport * from './aprApi.js'\nexport * from './reads.js'\nexport * from './withdrawalTimeApi.js'\nexport * from './withdrawalReceiptParse.js'\n\nexport const LIDO_PROTOCOL_ID = 'lido'\n\nexport const lidoProtocolModule: ProtocolModule = {\n id: LIDO_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n if (ctx.chainCategory !== 'evm') return false\n return isLidoSupportedChainId(Number(ctx.chainId))\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'lido.submit', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Stake ETH via Lido submit()', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: { valueWei: { type: 'string', required: true, description: 'ETH to stake (wei string)' } } },\n { id: 'lido.request-withdrawals', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Queue stETH withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.claim-withdrawal', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Claim finalized withdrawal', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.wrap-steth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Wrap stETH to wstETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'lido.unwrap-wsteth', protocolId: LIDO_PROTOCOL_ID, chainCategory: 'evm', description: 'Unwrap wstETH to stETH', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(lidoProtocolModule)\n"]}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import { getAddress, parseAbi, zeroAddress, parseUnits, encodeFunctionData, defineChain, createPublicClient, decodeEventLog, http, parseGwei, serializeTransaction, keccak256 } from 'viem';
|
|
2
|
-
import {
|
|
2
|
+
import { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk/dist/evm/rpc-utils.js';
|
|
3
|
+
import { fetchChainFeeParams } from '@continuumdao/continuum-node-sdk/dist/evm/chain-fees.js';
|
|
4
|
+
import { alignEip1559FeesWithLatestBase } from '@continuumdao/continuum-node-sdk/dist/evm/get-sig-fee-speed.js';
|
|
5
|
+
import { gweiToDecimalString } from '@continuumdao/continuum-node-sdk/dist/evm/gwei.js';
|
|
6
|
+
import { gasLimitFromEstimateAndChainConfig, proposalTxParamsToFeeSnapshot } from '@continuumdao/continuum-node-sdk/dist/evm/tx-params.js';
|
|
3
7
|
|
|
4
8
|
// src/core/registry.ts
|
|
5
9
|
var modules = [];
|
|
@@ -156,6 +160,11 @@ function routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimit) {
|
|
|
156
160
|
return (estimatedGas * 12n + 9n) / 10n;
|
|
157
161
|
}
|
|
158
162
|
|
|
163
|
+
// src/chains/evm/unsignedMessageRaw.ts
|
|
164
|
+
function evmUnsignedMessageRaw(serialized) {
|
|
165
|
+
return serialized.startsWith("0x") ? serialized.slice(2) : serialized;
|
|
166
|
+
}
|
|
167
|
+
|
|
159
168
|
// src/chains/evm/buildBatch.ts
|
|
160
169
|
async function buildEvmMultisignBatch(args) {
|
|
161
170
|
const { context, steps } = args;
|
|
@@ -287,7 +296,7 @@ async function buildEvmMultisignBatch(args) {
|
|
|
287
296
|
const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI });
|
|
288
297
|
legs.push({
|
|
289
298
|
msgHash,
|
|
290
|
-
msgRaw:
|
|
299
|
+
msgRaw: evmUnsignedMessageRaw(serialized),
|
|
291
300
|
destinationAddress: step.to,
|
|
292
301
|
signatureText: typeof batchMetaExtra.signatureText === "string" ? batchMetaExtra.signatureText : JSON.stringify(batchMetaExtra.signatureText ?? {}),
|
|
293
302
|
audit: batchMetaExtra,
|
|
@@ -295,9 +304,6 @@ async function buildEvmMultisignBatch(args) {
|
|
|
295
304
|
proposalTxParams,
|
|
296
305
|
valueWei: i === 0 ? step.value : void 0
|
|
297
306
|
});
|
|
298
|
-
if (i === 0 && args.firstMsgRawNo0x != null) {
|
|
299
|
-
legs[0].msgRaw = args.firstMsgRawNo0x;
|
|
300
|
-
}
|
|
301
307
|
}
|
|
302
308
|
const extraJSON = {};
|
|
303
309
|
if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {
|