@continuumdao/ctm-mpc-defi 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +16 -1
  2. package/dist/agent/catalog.cjs +913 -142
  3. package/dist/agent/catalog.cjs.map +1 -1
  4. package/dist/agent/catalog.d.cts +834 -12
  5. package/dist/agent/catalog.d.ts +834 -12
  6. package/dist/agent/catalog.js +863 -143
  7. package/dist/agent/catalog.js.map +1 -1
  8. package/dist/chains/evm/index.cjs +13 -0
  9. package/dist/chains/evm/index.cjs.map +1 -1
  10. package/dist/chains/evm/index.d.cts +3 -1
  11. package/dist/chains/evm/index.d.ts +3 -1
  12. package/dist/chains/evm/index.js +13 -1
  13. package/dist/chains/evm/index.js.map +1 -1
  14. package/dist/core/index.cjs +76 -0
  15. package/dist/core/index.cjs.map +1 -1
  16. package/dist/core/index.d.cts +35 -2
  17. package/dist/core/index.d.ts +35 -2
  18. package/dist/core/index.js +70 -1
  19. package/dist/core/index.js.map +1 -1
  20. package/dist/index.cjs +934 -141
  21. package/dist/index.cjs.map +1 -1
  22. package/dist/index.d.cts +3 -2
  23. package/dist/index.d.ts +3 -2
  24. package/dist/index.js +927 -142
  25. package/dist/index.js.map +1 -1
  26. package/dist/protocols/evm/aave-v4/index.cjs +1987 -0
  27. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -0
  28. package/dist/protocols/evm/aave-v4/index.d.cts +500 -0
  29. package/dist/protocols/evm/aave-v4/index.d.ts +500 -0
  30. package/dist/protocols/evm/aave-v4/index.js +1943 -0
  31. package/dist/protocols/evm/aave-v4/index.js.map +1 -0
  32. package/dist/protocols/evm/ethena/index.cjs +965 -0
  33. package/dist/protocols/evm/ethena/index.cjs.map +1 -0
  34. package/dist/protocols/evm/ethena/index.d.cts +161 -0
  35. package/dist/protocols/evm/ethena/index.d.ts +161 -0
  36. package/dist/protocols/evm/ethena/index.js +943 -0
  37. package/dist/protocols/evm/ethena/index.js.map +1 -0
  38. package/dist/protocols/evm/euler-v2/index.cjs +2263 -0
  39. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -0
  40. package/dist/protocols/evm/euler-v2/index.d.cts +317 -0
  41. package/dist/protocols/evm/euler-v2/index.d.ts +317 -0
  42. package/dist/protocols/evm/euler-v2/index.js +2238 -0
  43. package/dist/protocols/evm/euler-v2/index.js.map +1 -0
  44. package/dist/protocols/evm/lido/index.cjs +834 -0
  45. package/dist/protocols/evm/lido/index.cjs.map +1 -0
  46. package/dist/protocols/evm/lido/index.d.cts +120 -0
  47. package/dist/protocols/evm/lido/index.d.ts +120 -0
  48. package/dist/protocols/evm/lido/index.js +809 -0
  49. package/dist/protocols/evm/lido/index.js.map +1 -0
  50. package/dist/protocols/evm/maple/index.cjs +707 -0
  51. package/dist/protocols/evm/maple/index.cjs.map +1 -0
  52. package/dist/protocols/evm/maple/index.d.cts +109 -0
  53. package/dist/protocols/evm/maple/index.d.ts +109 -0
  54. package/dist/protocols/evm/maple/index.js +693 -0
  55. package/dist/protocols/evm/maple/index.js.map +1 -0
  56. package/dist/protocols/evm/sky/index.cjs +1254 -0
  57. package/dist/protocols/evm/sky/index.cjs.map +1 -0
  58. package/dist/protocols/evm/sky/index.d.cts +218 -0
  59. package/dist/protocols/evm/sky/index.d.ts +218 -0
  60. package/dist/protocols/evm/sky/index.js +1229 -0
  61. package/dist/protocols/evm/sky/index.js.map +1 -0
  62. package/dist/protocols/evm/uniswap-v4/index.cjs +31 -11
  63. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  64. package/dist/protocols/evm/uniswap-v4/index.d.cts +2 -1
  65. package/dist/protocols/evm/uniswap-v4/index.d.ts +2 -1
  66. package/dist/protocols/evm/uniswap-v4/index.js +31 -11
  67. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  68. package/package.json +37 -3
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/protocols/evm/aave-v4/api.ts","../../../../src/chains/evm/rpcUrl.ts","../../../../src/protocols/evm/aave-v4/spokeOnChain.ts","../../../../src/core/keygen.ts","../../../../src/chains/evm/txParams.ts","../../../../src/chains/evm/fees/chainFees.ts","../../../../src/chains/evm/fees/eip1559Align.ts","../../../../src/protocols/evm/aave-v4/multisign.ts","../../../../src/protocols/evm/aave-v4/index.ts"],"names":["n","x","getAddress","defineChain","createPublicClient","http","gasPriceGwei","parseGwei"],"mappings":"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","file":"index.js","sourcesContent":["import type { ProtocolModule } from './types.js'\n\nconst modules: ProtocolModule[] = []\n\nexport function registerProtocolModule(mod: ProtocolModule): void {\n const existing = modules.findIndex((m) => m.id === mod.id)\n if (existing >= 0) {\n modules[existing] = mod\n } else {\n modules.push(mod)\n }\n}\n\nexport function getProtocolModules(): readonly ProtocolModule[] {\n return modules\n}\n\nexport function getProtocolModule(id: string): ProtocolModule | undefined {\n return modules.find((m) => m.id === id)\n}\n\nexport function getActionsByChainCategory(category: string): ProtocolModule['actions'] {\n return modules.filter((m) => m.chainCategory === category).flatMap((m) => m.actions)\n}\n","import { getAddress, isAddress } from 'viem'\n\nexport const AAVE_V4_GRAPHQL_URL = 'https://api.v4.aave.com/graphql'\n\ntype GqlError = { message?: string }\n\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nexport async function aaveV4Gql<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n const r = await fetch(AAVE_V4_GRAPHQL_URL, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ query, variables: variables ?? {} }),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `Aave V4 API HTTP ${r.status}: ${t.slice(0, 200)}` : `Aave V4 API HTTP ${r.status}`)\n }\n const j = (await r.json()) as GqlData<T> & { errors?: GqlError[] }\n if (j.errors?.length) {\n const msg = j.errors.map((e) => e.message ?? 'Unknown').join('; ')\n throw new Error(msg)\n }\n if (j.data == null) {\n throw new Error('Aave V4 API: empty response')\n }\n return j.data\n}\n\ntype ChainRowV4 = { chainId: number; name?: string | null; nativeWrappedToken?: string | null }\n\nexport async function fetchAaveV4Chains(): Promise<readonly ChainRowV4[]> {\n const d = await aaveV4Gql<{ chains: ChainRowV4[] }>(`\n query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }\n `, { c: { query: { filter: 'ALL' } } })\n return d.chains ?? []\n}\n\n/**\n * Aave v4: supported EVM chain IDs (from {@link fetchAaveV4Chains}).\n */\nexport async function loadAaveV4SupportedChainIdsFromV4Api(): Promise<ReadonlySet<number>> {\n const rows = await fetchAaveV4Chains()\n const s = new Set<number>()\n for (const c of rows) s.add(c.chainId)\n return s\n}\n\nconst RESERVES_ADDRESS_FRAGMENT = `\n asset { underlying { address } }\n`\n\nexport type V4ReservesListRow = {\n id: string\n onChainId?: string | null\n spoke?: {\n address: string\n name?: string | null\n liquidationConfig?: { targetHealthFactor: string; healthFactorForMaxBonus: string } | null\n } | null\n summary: {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n }\n userState: {\n balance: { amount: { value: string; decimals: number } } | null\n borrowable?: { amount: { value: string; decimals: number } } | null\n } | null\n}\n\nexport function aggregateV4SupplyDisplay(\n symbolForDisplay: string,\n rows: readonly V4ReservesListRow[],\n): {\n depositedAmount: string\n apy: string\n totalDeposits: string\n availableLiquidity: string\n} {\n const sym = (symbolForDisplay ?? '').trim()\n const withSuffix = (n: string) => (n === '—' ? '—' : sym ? `${n} ${sym}` : n)\n\n if (!rows.length) {\n return { depositedAmount: '—', apy: '—', totalDeposits: '—', availableLiquidity: '—' }\n }\n\n const apy = formatV4SupplyApy(rows)\n\n const sumKey = (key: 'supplied' | 'borrowed') =>\n sumNumberValues(\n rows.map((r) => {\n const v = key === 'supplied' ? r.summary?.supplied?.amount : r.summary?.borrowed?.amount\n return (v?.value ?? '').trim()\n }),\n )\n\n const totalSupN = sumKey('supplied')\n const totalBorN = sumKey('borrowed')\n const totalDeposits =\n totalSupN == null ? '—' : withSuffix(formatAaveV4TokenAmount(totalSupN))\n\n const availableLiquidity = (() => {\n if (totalSupN == null || totalBorN == null) return '—'\n const a = totalSupN - totalBorN\n if (!Number.isFinite(a)) return '—'\n return withSuffix(formatAaveV4TokenAmount(a < 0 ? 0 : a))\n })()\n\n const userN = userSupplyBalanceNumber(rows)\n const depositedAmount = userN == null ? '—' : withSuffix(formatAaveV4TokenAmount(userN))\n\n return { depositedAmount, apy, totalDeposits, availableLiquidity }\n}\n\nfunction sumNumberValues(values: ReadonlyArray<string>): number | null {\n if (!values.length) return null\n let s = 0\n for (const v of values) {\n const n = parseFloat(v)\n if (Number.isFinite(n)) s += n\n }\n return s\n}\n\n/**\n * Formats a token notional for display: uses k (≥1k) and M (≥1M) with a few decimal places, otherwise limited decimals.\n * Safe to reuse outside the Aave V4 dialog (e.g. tables, tooltips).\n */\nexport function formatAaveV4TokenAmount(n: number): string {\n if (!Number.isFinite(n)) return '—'\n if (n === 0) return '0'\n const sign = n < 0 ? '-' : ''\n const a = Math.abs(n)\n const strip = (s: string) => s.replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, '')\n\n if (a >= 1_000_000) {\n return sign + strip((a / 1_000_000).toFixed(2)) + 'M'\n }\n if (a >= 1000) {\n const k = a / 1000\n const d = k >= 100 ? 1 : 2\n return sign + strip(k.toFixed(d)) + 'k'\n }\n if (a >= 1) {\n return sign + strip(a.toFixed(2))\n }\n if (a >= 0.0001) {\n return sign + strip(a.toFixed(4))\n }\n return sign + a.toExponential(2)\n}\n\n/**\n * Human-readable notional for Aave v4 API decimal strings (reserve amounts, user debt, etc.).\n * Use this for all “display from GraphQL `value`” paths so formatting stays consistent.\n */\nexport function formatAaveV4AmountHumanFromApiString(raw: string | null | undefined): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = parseFloat(s)\n if (!Number.isFinite(n)) return '—'\n return formatAaveV4TokenAmount(n)\n}\n\n/**\n * Unnamed reserve liquidity: supplied − borrowed (both API decimal strings, same unit).\n */\nexport function formatAaveV4ReserveLiquidityFromSummary(args: {\n suppliedValue: string | null | undefined\n borrowedValue: string | null | undefined\n}): string {\n const a = parseFloat(String(args.suppliedValue ?? '').trim())\n const b = parseFloat(String(args.borrowedValue ?? '').trim())\n if (!Number.isFinite(a) || !Number.isFinite(b)) return '—'\n return formatAaveV4TokenAmount(Math.max(0, a - b))\n}\n\nfunction userSupplyBalanceNumber(rows: readonly V4ReservesListRow[]): number | null {\n const vals = rows\n .map((r) => (r.userState?.balance?.amount?.value ?? '').trim())\n .filter((v) => v.length > 0)\n if (!vals.length) return null\n const u = new Set(vals)\n if (u.size === 1) {\n const n = parseFloat(vals[0]!)\n return Number.isFinite(n) ? n : null\n }\n const sum = vals.reduce((acc, b) => acc + (parseFloat(b) || 0), 0)\n return Number.isFinite(sum) ? sum : null\n}\n\nfunction formatV4SupplyApy(rows: readonly V4ReservesListRow[]): string {\n if (!rows.length) return '—'\n const weighted: { w: number; apy: number }[] = []\n for (const r of rows) {\n const sup = parseFloat((r.summary?.supplied?.amount?.value ?? '').trim())\n const norm = (r.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(norm)\n if (Number.isFinite(n) && Number.isFinite(sup) && sup > 0) {\n weighted.push({ w: sup, apy: n })\n }\n }\n if (weighted.length) {\n const tw = weighted.reduce((a, x) => a + x.w, 0)\n if (tw > 0) {\n const x = weighted.reduce((a, x) => a + x.w * x.apy, 0) / tw\n if (x >= 0.01) return `${x.toFixed(2)}%`\n if (x > 0) return `${x.toFixed(4)}%`\n return '0%'\n }\n }\n const any = (rows[0]?.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(any)\n if (!Number.isFinite(n)) return '—'\n if (n >= 0.01) return `${n.toFixed(2)}%`\n if (n > 0) return `${n.toFixed(4)}%`\n return '0%'\n}\n\nexport async function fetchAaveV4NativeWrappedToken(chainId: number): Promise<string | null> {\n const all = await fetchAaveV4Chains()\n const c = all.find((x) => x.chainId === chainId)\n const t = (c?.nativeWrappedToken ?? '').trim()\n if (t && isAddress(t)) return getAddress(t)\n return null\n}\n\n/**\n * All underlying token addresses (lowercased checksummed form for lookup: store lowercase) listed as reserves on the chain.\n */\nexport async function fetchAaveV4SupportedUnderlyingAddressSet(chainId: number): Promise<ReadonlySet<string>> {\n const d = await aaveV4Gql<{\n reserves: ReadonlyArray<{ asset: { underlying: { address: string } } }>\n }>(\n `\n query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }\n `,\n {\n r: {\n query: { chainIds: [chainId] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n const s = new Set<string>()\n for (const r of d.reserves ?? []) {\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (a && isAddress(a)) s.add(a.toLowerCase())\n }\n return s\n}\n\nfunction erc20Input(address: `0x${string}`, chainId: number) {\n return { address, chainId }\n}\n\nexport async function fetchAaveV4ReservesForUnderlying(args: {\n chainId: number\n underlying: `0x${string}`\n user?: `0x${string}` | null\n}): Promise<readonly V4ReservesListRow[]> {\n const d = await aaveV4Gql<{ reserves: V4ReservesListRow[] }>(\n `\n query S($r: ReservesRequest!) {\n reserves(request: $r) {\n id\n onChainId\n spoke { address name liquidationConfig { targetHealthFactor healthFactorForMaxBonus } }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n }\n userState {\n balance { amount { value decimals } }\n borrowable { amount { value decimals } }\n }\n }\n }\n `,\n {\n r: {\n query: { tokens: [erc20Input(args.underlying, args.chainId)] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n ...(args.user ? { user: args.user } : {}),\n },\n },\n )\n return d.reserves ?? []\n}\n\n/**\n * Reserve row for a hub asset on the same Aave v4 **Spoke** as the user’s collateral (same as {@link useAaveV4DepositCollateralInfo}’s `collateralForAsset`).\n * Needed so borrow/repay multi-sign uses the same spoke as the user’s position.\n */\nexport function pickAaveV4ReserveRowForSpoke(\n rows: readonly V4ReservesListRow[],\n spokeAddress: `0x${string}`,\n): V4ReservesListRow | null {\n const want = getAddress(spokeAddress).toLowerCase()\n for (const r of rows) {\n const a = (r.spoke?.address ?? '').trim()\n if (!a) continue\n try {\n if (getAddress(a as `0x${string}`).toLowerCase() === want) return r\n } catch {\n continue\n }\n }\n return null\n}\n\nexport function aaveV4KeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n\ntype AaveV4ChainTokenCache = {\n supportedUnderlying: ReadonlySet<string>\n nativeWrapped: string | null\n}\n\nconst aaveV4ChainTokenCache = new Map<number, Promise<AaveV4ChainTokenCache>>()\n\n/**\n * Fetches and caches (per process) the list of Aave v4 underlying addresses on a chain and the wrapped native token.\n */\nexport function ensureAaveV4ChainTokenCache(chainId: number): Promise<AaveV4ChainTokenCache> {\n const hit = aaveV4ChainTokenCache.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const [nativeWrapped, supportedUnderlying] = await Promise.all([\n fetchAaveV4NativeWrappedToken(chainId),\n fetchAaveV4SupportedUnderlyingAddressSet(chainId),\n ])\n return { supportedUnderlying, nativeWrapped }\n })()\n aaveV4ChainTokenCache.set(chainId, p)\n return p\n}\n\n// —— Hubs, collateral, borrowable (per UI “market” / Aave v4 pool) ——————————————\n\n/** UI market segment; maps to Aave v4 `Hub` by name (e.g. Plus ≈ “Main”, Core, Prime ≈ “Bluechip”). */\nexport type AaveV4UiMarketId = 'main' | 'core' | 'bluechip'\n\nexport type AaveV4Hub = {\n name: string\n address: `0x${string}`\n chain: { chainId: number; name?: string | null }\n}\n\n/** `summary` is included for hub `reserves` (market borrow/supply TVL, APYs). */\nexport type AaveV4HubReserveSummary = {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n borrowApy: { normalized: string; value: string }\n}\n\nexport type AaveV4HubReserve = {\n canBorrow: boolean\n canUseAsCollateral: boolean\n canSupply: boolean\n /** Spoke contract to call for `supply` on this reserve. */\n spoke: { address: string } | null\n settings: {\n borrowable: boolean\n collateral: boolean\n collateralFactor: { normalized: string; value: string }\n collateralRisk: { normalized: string; value: string }\n }\n asset: {\n underlying: {\n address: string\n info: { name: string; symbol: string; icon: string | null } | null\n }\n }\n /** Present when using the extended hub reserves query (borrow tab, market TVL). */\n summary?: AaveV4HubReserveSummary | null\n}\n\nconst aaveV4HubsByChain = new Map<number, Promise<readonly AaveV4Hub[]>>()\nconst aaveV4HubReserves = new Map<string, Promise<readonly AaveV4HubReserve[]>>()\n\nfunction hubReservesKey(chainId: number, hub: `0x${string}`) {\n return `v3spoke+summary:${chainId}:${hub.toLowerCase()}`\n}\n\nexport async function fetchAaveV4HubsForChain(chainId: number): Promise<readonly AaveV4Hub[]> {\n const hit = aaveV4HubsByChain.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ hubs: AaveV4Hub[] }>(\n `query F($h: HubsRequest!) { hubs(request: $h) { name address chain { chainId name } } }`,\n { h: { query: { chainIds: [chainId] } } },\n )\n const out = (d.hubs ?? []).map((h) => ({\n name: h.name,\n address: getAddress((h.address ?? '').trim() as `0x${string}`) as `0x${string}`,\n chain: h.chain,\n }))\n return out\n })()\n aaveV4HubsByChain.set(chainId, p)\n return p\n}\n\n/**\n * Resolves which Aave v4 hub (Core / Plus / Prime, etc.) a UI “market” refers to.\n * Main → Plus, Core → Core, Bluechip → Prime.\n */\nexport function resolveAaveV4HubForUiMarket(\n hubs: readonly AaveV4Hub[],\n market: AaveV4UiMarketId,\n chainId: number,\n): AaveV4Hub | null {\n const on = hubs.filter((h) => h.chain.chainId === chainId)\n if (!on.length) return null\n const find = (names: string[]) => {\n const set = new Set(names.map((n) => n.toLowerCase()))\n return on.find((h) => set.has((h.name ?? '').trim().toLowerCase())) ?? null\n }\n if (market === 'core') return find(['core'])\n if (market === 'bluechip') return find(['prime', 'bluechip', 'institutional'])\n // main: prefer Plus; fall back to common names, then first hub\n return find(['plus', 'main', 'default']) ?? on[0] ?? null\n}\n\n/**\n * Inverse of {@link resolveAaveV4HubForUiMarket} label mapping, for switching UI market when a hub is chosen by\n * “first hub on chain that lists this underlying”.\n */\nexport function aaveV4UiMarketIdForHubName(hubName: string): AaveV4UiMarketId {\n const n = (hubName ?? '').trim().toLowerCase()\n if (n === 'core') return 'core'\n if (n === 'plus' || n === 'main' || n === 'default') return 'main'\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 'bluechip'\n return 'main'\n}\n\n/**\n * When more than one hub lists the same underlying, the ideal hub is the one that matches the user’s *actual*\n * position (supply/debt on that hub’s Spoke). We don’t have that signal here, so we use a **deterministic** order after\n * {@link aaveV4UiMarketIdForHubName}: Core → Main/Plus → Bluechip/Prime (then name) so the choice is not tied to\n * GraphQL list order. Callers with wallet/user data can later prefer a hub whose Spoke appears in\n * `fetchAaveV4ReservesForUnderlying` with non-zero `userState`.\n */\nfunction aaveV4HubAutoPickTiebreakOrder(a: AaveV4Hub, b: AaveV4Hub): number {\n const rank = (name: string) => {\n const n = (name ?? '').trim().toLowerCase()\n if (n === 'core') return 0\n if (n === 'plus' || n === 'main' || n === 'default') return 1\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 2\n return 3\n }\n const ra = rank(a.name)\n const rb = rank(b.name)\n if (ra !== rb) return ra - rb\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n}\n\ntype AaveV4HubCollateralCandidate = {\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n}\n\n/**\n * Sort key for “which borrow is cheaper” on a **debt** reserve row. Lower is better; missing data sorts last.\n */\nfunction aaveV4HubReserveBorrowApyForSort(r: AaveV4HubReserve | null | undefined): number {\n if (!r) return Number.POSITIVE_INFINITY\n const norm = parseFloat((r.summary?.borrowApy?.normalized ?? '').trim())\n if (Number.isFinite(norm) && norm >= 0) return norm\n const v = parseFloat((r.summary?.borrowApy?.value ?? '').trim())\n if (Number.isFinite(v) && v >= 0) {\n if (v > 0 && v <= 1) return v * 100\n return v\n }\n return Number.POSITIVE_INFINITY\n}\n\n/**\n * `summary.suppliable` on a reserve is pool liquidity for borrowing that asset (human-notional, same units as\n * {@link formatAaveV4AmountHumanFromApiString}).\n */\nfunction aaveV4SuppliableHumanFromHubReserve(r: AaveV4HubReserve | null | undefined): number | null {\n if (!r) return null\n const n = parseFloat((r.summary?.suppliable?.amount?.value ?? '').trim())\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\n/**\n * The selected UI market maps to a single hub, but a token may only be listed in another hub (e.g. WETH in Core, not\n * Plus on Ethereum). Returns a hub on this chain where this underlying appears in hub reserves, so Spoke and\n * collateral can be resolved.\n *\n * **When no debt hint:** `preferHub` is tried first, then other hubs in {@link aaveV4HubAutoPickTiebreakOrder} order.\n *\n * **When `debtUnderlying` is set (user chose a debt asset on the borrow flow):** among hubs that list **both** the\n * **collateral** and that **debt** as borrowable, the hub with the **lowest debt borrow APY** is chosen. If\n * `debtBorrowAmountHumanForLiquidity` is a positive number string, we **prefer** hubs where `suppliable` on the debt\n * reserve is at least that amount; if none satisfy that, the lowest-APY hub among all debt-backed candidates is\n * used anyway.\n */\nexport async function findAaveV4HubReserveForChainUnderlying(args: {\n chainId: number\n hubs: readonly AaveV4Hub[]\n underlying: `0x${string}`\n /** Tried first; if the asset is not listed here, other hubs on the same chain are scanned. */\n preferHub: AaveV4Hub\n /** If set, disambiguate using this debt asset’s `borrowAPY` (and optional liquidity) per hub. */\n debtUnderlying?: `0x${string}` | null\n /**\n * When set, used with `debtUnderlying` to prefer hubs with enough `suppliable` on the debt line for a borrow\n * of that size (human amount; commas may be included).\n */\n debtBorrowAmountHumanForLiquidity?: string | null\n}): Promise<{\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n} | null> {\n const onChain = args.hubs.filter((h) => h.chain.chainId === args.chainId)\n if (!onChain.length) return null\n const prefer = getAddress(args.preferHub.address) as `0x${string}`\n const order = (() => {\n const rest = onChain\n .filter((h) => getAddress(h.address) !== prefer)\n .sort(aaveV4HubAutoPickTiebreakOrder)\n const first = onChain.find((h) => getAddress(h.address) === prefer)\n return first ? [first, ...rest] : rest\n })()\n\n const candidates: AaveV4HubCollateralCandidate[] = []\n for (const h of order) {\n const rows = await fetchAaveV4HubReserves({ chainId: args.chainId, hubAddress: h.address as `0x${string}` })\n const c = findHubReserveForUnderlying(rows, args.underlying)\n if (c) candidates.push({ hub: h, hubReserves: rows, reserve: c })\n }\n if (!candidates.length) return null\n\n const noDebt = (): AaveV4HubCollateralCandidate => candidates[0]!\n\n const rawDebt = (args.debtUnderlying ?? '').trim()\n if (!rawDebt || !isAddress(rawDebt)) {\n return noDebt()\n }\n const debtU = getAddress(rawDebt) as `0x${string}`\n\n const withDebt = candidates\n .map((c) => {\n const dr = findHubReserveForUnderlying(c.hubReserves, debtU)\n return { ...c, debtReserve: dr }\n })\n .filter(\n (x): x is AaveV4HubCollateralCandidate & { debtReserve: AaveV4HubReserve } =>\n x.debtReserve != null &&\n x.debtReserve.canBorrow === true &&\n x.debtReserve.settings?.borrowable === true,\n )\n if (!withDebt.length) {\n return noDebt()\n }\n\n const amountRaw = (args.debtBorrowAmountHumanForLiquidity ?? '')\n .trim()\n .replace(/,/g, '')\n const wantN = amountRaw && parseFloat(amountRaw) > 0 ? parseFloat(amountRaw) : null\n\n const sortKey = (a: (typeof withDebt)[0], b: (typeof withDebt)[0]): number => {\n const d = aaveV4HubReserveBorrowApyForSort(a.debtReserve) - aaveV4HubReserveBorrowApyForSort(b.debtReserve)\n if (d !== 0) return d\n const pa = getAddress(a.hub.address) === prefer ? 0 : 1\n const pb = getAddress(b.hub.address) === prefer ? 0 : 1\n if (pa !== pb) return pa - pb\n return aaveV4HubAutoPickTiebreakOrder(a.hub, b.hub)\n }\n\n if (wantN == null) {\n withDebt.sort(sortKey)\n const x = withDebt[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n }\n\n const sufficient = withDebt.filter((c) => {\n const s = aaveV4SuppliableHumanFromHubReserve(c.debtReserve)\n return s != null && s + 1e-9 >= wantN\n })\n const pool = sufficient.length ? sufficient : withDebt\n pool.sort(sortKey)\n const x = pool[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n}\n\nexport async function fetchAaveV4HubReserves(args: { chainId: number; hubAddress: `0x${string}` }): Promise<readonly AaveV4HubReserve[]> {\n const h = getAddress(args.hubAddress) as `0x${string}`\n const k = hubReservesKey(args.chainId, h)\n const hit = aaveV4HubReserves.get(k)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ reserves: AaveV4HubReserve[] }>(\n `query R($r: ReservesRequest!) {\n reserves(request: $r) {\n canBorrow\n canSupply\n canUseAsCollateral\n spoke { address }\n settings {\n borrowable\n collateral\n collateralFactor { normalized value }\n collateralRisk { normalized value }\n }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n borrowApy { normalized value }\n }\n asset { underlying { address info { name symbol icon } } }\n }\n }`,\n {\n r: {\n query: { hub: { address: h, chainId: args.chainId } },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n return d.reserves ?? []\n })()\n aaveV4HubReserves.set(k, p)\n return p\n}\n\n/**\n * LTV you can borrow against a unit of this asset, e.g. \"90%\".\n */\nexport function formatAaveV4PercentDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = (normalized ?? '').trim()\n if (n) {\n const f = parseFloat(n)\n if (!Number.isFinite(f)) return '—'\n if (f === 0) return '—'\n if (f % 1 === 0) return `${f.toFixed(0)}%`\n return `${f >= 10 ? f.toFixed(0) : f >= 1 ? f.toFixed(1).replace(/\\.0$/, '') : f.toFixed(2).replace(/\\.?0+$/, '')}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${Math.round(v * 100)}%`\n }\n return '—'\n}\n\n/**\n * Collateral / protocol risk on the same 0–100 style scale as the API, or a plain label if zero/empty.\n */\nexport function formatAaveV4RiskDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = parseFloat((normalized ?? '').trim())\n if (Number.isFinite(n) && n > 0) {\n return n >= 0.01 ? `${n.toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%` : `${n.toFixed(4)}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${(v * 100).toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%`\n }\n return 'Low'\n}\n\nexport function findHubReserveForUnderlying(\n list: readonly AaveV4HubReserve[],\n underlying: `0x${string}`,\n): AaveV4HubReserve | null {\n const t = getAddress(underlying).toLowerCase()\n return list.find((r) => (r.asset?.underlying?.address ?? '').toLowerCase() === t) ?? null\n}\n\nexport type AaveV4BorrowableDisplay = {\n address: string\n symbol: string\n name: string\n icon: string | null\n}\n\n/**\n * De-duplicated borrowable debt assets in a hub (what users can borrow there).\n */\nexport function borrowableAssetsFromHubReserves(rows: readonly AaveV4HubReserve[]): AaveV4BorrowableDisplay[] {\n const seen = new Set<string>()\n const out: AaveV4BorrowableDisplay[] = []\n for (const r of rows) {\n if (!r.canBorrow || !r.settings?.borrowable) continue\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (!a || !isAddress(a)) continue\n const lo = a.toLowerCase()\n if (seen.has(lo)) continue\n seen.add(lo)\n const info = r.asset?.underlying?.info\n out.push({\n address: getAddress(a as `0x${string}`),\n symbol: (info?.symbol ?? '—').trim() || '—',\n name: (info?.name ?? '').trim() || '—',\n icon: (info?.icon ?? '').trim() || null,\n })\n }\n out.sort((p, q) => p.symbol.localeCompare(q.symbol, undefined, { sensitivity: 'base' }))\n return out\n}\n\nconst USER_BORROWS_HUB = `\n query AaveV4UserBorrowsHub($r: UserBorrowsRequest!) {\n userBorrows(request: $r) {\n debt { amount { value } }\n reserve {\n asset { underlying { address } }\n }\n }\n }\n`\n\n/**\n * Current variable-debt balance per underlying token for this user in the given hub (one entry per asset).\n * Values are API decimal strings; format with {@link formatAaveV4AmountHumanFromApiString}.\n */\nexport async function fetchAaveV4UserBorrowsDebtByUnderlyingForHub(args: {\n user: `0x${string}`\n chainId: number\n hubAddress: `0x${string}`\n}): Promise<ReadonlyMap<string, string>> {\n const u = getAddress(args.user)\n const h = getAddress(args.hubAddress) as `0x${string}`\n const d = await aaveV4Gql<{\n userBorrows: {\n debt: { amount: { value: string } } | null\n reserve: { asset: { underlying: { address: string } } } | null\n }[]\n }>(USER_BORROWS_HUB, {\n r: {\n query: {\n userHub: {\n user: u,\n hub: { input: { address: h, chainId: args.chainId } },\n },\n },\n orderBy: { amount: 'DESC' },\n includeZeroBalances: false,\n },\n })\n const m = new Map<string, string>()\n for (const row of d.userBorrows ?? []) {\n const addr = (row?.reserve?.asset?.underlying?.address ?? '').trim()\n if (!addr) continue\n const lo = getAddress(addr as `0x${string}`).toLowerCase()\n const v = (row?.debt?.amount?.value ?? '').trim()\n if (!v) continue\n const n = parseFloat(v)\n if (!Number.isFinite(n) || n === 0) continue\n const prev = m.get(lo)\n if (prev) {\n const p = parseFloat(prev)\n m.set(lo, String((Number.isFinite(p) ? p : 0) + n))\n } else {\n m.set(lo, v)\n }\n }\n return m\n}\n\nexport type AaveV4BorrowTableRow = {\n address: string\n symbol: string\n name: string\n icon: string | null\n yourBorrowedDisplay: string\n baseBorrowApyDisplay: string\n totalBorrowsDisplay: string\n liquidityDisplay: string\n}\n\n/**\n * One row per borrowable asset in the hub, using shared human-readable formatters.\n */\nexport function buildAaveV4BorrowTableRowsFromHub(\n borrowable: readonly AaveV4BorrowableDisplay[],\n hubReserves: readonly AaveV4HubReserve[] | null,\n /** `undefined` = not loaded or no wallet (show em dash for “your” column). */\n debtByUnderlying: ReadonlyMap<string, string> | undefined,\n): AaveV4BorrowTableRow[] {\n if (!hubReserves?.length) {\n return borrowable.map((b) => ({\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: debtByUnderlying === undefined ? '—' : `0${b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''}`,\n baseBorrowApyDisplay: '—',\n totalBorrowsDisplay: '—',\n liquidityDisplay: '—',\n }))\n }\n return borrowable.map((b) => {\n const lo = b.address.toLowerCase()\n const r = hubReserves.find((x) => (x.asset?.underlying?.address ?? '').toLowerCase() === lo) ?? null\n const s = r?.summary\n const debtRaw = debtByUnderlying?.get(lo) ?? null\n const symSuffix = b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''\n return {\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: (() => {\n if (debtByUnderlying === undefined) return '—'\n if (debtRaw == null || !String(debtRaw).trim()) return `0${symSuffix}`\n const n = parseFloat(String(debtRaw).trim())\n if (!Number.isFinite(n) || n === 0) return `0${symSuffix}`\n return `${formatAaveV4AmountHumanFromApiString(debtRaw)}${symSuffix}`\n })(),\n baseBorrowApyDisplay: formatAaveV4PercentDisplay(\n s?.borrowApy?.normalized,\n s?.borrowApy?.value,\n ),\n totalBorrowsDisplay: s\n ? `${formatAaveV4AmountHumanFromApiString(s.borrowed?.amount?.value)}${symSuffix}`\n : '—',\n liquidityDisplay: s\n ? `${formatAaveV4ReserveLiquidityFromSummary({\n suppliedValue: s.supplied?.amount?.value,\n borrowedValue: s.borrowed?.amount?.value,\n })}${symSuffix}`\n : '—',\n }\n })\n}\n","export function isValidRpcUrl(url: string): boolean {\n const t = url.trim()\n if (!t) return false\n try {\n const u = new URL(t)\n return u.protocol === 'http:' || u.protocol === 'https:'\n } catch {\n return false\n }\n}\n","import { type Address, createPublicClient, defineChain, getAddress, http } from 'viem'\nimport { isValidRpcUrl } from '../../../chains/evm/rpcUrl.js'\n\nconst spokeStaticAbi = [\n {\n name: 'getReserveCount',\n type: 'function',\n stateMutability: 'view',\n inputs: [],\n outputs: [{ name: '', type: 'uint256' }],\n },\n {\n name: 'getReserve',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'reserveId', type: 'uint256' }],\n outputs: [\n {\n name: '',\n type: 'tuple',\n components: [\n { name: 'underlying', type: 'address' },\n { name: 'hub', type: 'address' },\n { name: 'assetId', type: 'uint16' },\n { name: 'decimals', type: 'uint8' },\n { name: 'collateralRisk', type: 'uint24' },\n { name: 'flags', type: 'uint8' },\n { name: 'dynamicConfigKey', type: 'uint32' },\n ],\n },\n ],\n },\n {\n name: 'getReserveConfig',\n type: 'function',\n stateMutability: 'view',\n inputs: [{ name: 'reserveId', type: 'uint256' }],\n outputs: [\n {\n name: '',\n type: 'tuple',\n components: [\n { name: 'collateralRisk', type: 'uint24' },\n { name: 'paused', type: 'bool' },\n { name: 'frozen', type: 'bool' },\n { name: 'borrowable', type: 'bool' },\n { name: 'receiveSharesEnabled', type: 'bool' },\n ],\n },\n ],\n },\n] as const\n\nexport type AaveV4SpokeOnChainReserveStatus = {\n reserveId: bigint\n /** From `getReserveConfig` — not a global Spoke `paused()`. */\n paused: boolean\n frozen: boolean\n borrowable: boolean\n receiveSharesEnabled: boolean\n collateralRisk: number\n}\n\ntype SpokeReadArgs = {\n rpcUrl: string\n chainId: number\n spoke: Address\n underlying: Address\n}\n\n/**\n * On-chain `reserveId` for an underlying on the Spoke (`getReserve` scan). Used for\n * `supply(uint256 reserveId, uint256 amount, address onBehalfOf)` calldata.\n */\nexport async function fetchAaveV4SpokeReserveIdForUnderlying(args: SpokeReadArgs): Promise<bigint | null> {\n const url = (args.rpcUrl ?? '').trim()\n if (!isValidRpcUrl(url)) return null\n if (!Number.isFinite(args.chainId) || args.chainId < 0) return null\n const spoke = getAddress(args.spoke)\n const want = getAddress(args.underlying).toLowerCase()\n\n const chain = defineChain({\n id: args.chainId,\n name: 'Rpc',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [url] } },\n })\n const client = createPublicClient({ chain, transport: http(url) })\n const count = await client.readContract({\n address: spoke,\n abi: spokeStaticAbi,\n functionName: 'getReserveCount',\n })\n const n = Number(count)\n if (!Number.isFinite(n) || n < 0 || n > 256) return null\n\n for (let i = 0; i < n; i++) {\n const r = await client.readContract({\n address: spoke,\n abi: spokeStaticAbi,\n functionName: 'getReserve',\n args: [BigInt(i)],\n })\n if (r.underlying.toLowerCase() === want) return BigInt(i)\n }\n return null\n}\n\n/**\n * Per-reserve pause/freeze from the Spoke (`getReserveConfig`), after resolving\n * `reserveId` for `underlying` via `getReserve` / `getReserveCount`.\n * Aave v4 does not expose a single contract-wide `paused()` on the Spoke for this.\n */\nexport async function fetchAaveV4SpokeReserveStatusForUnderlying(args: SpokeReadArgs): Promise<AaveV4SpokeOnChainReserveStatus | null> {\n const reserveId = await fetchAaveV4SpokeReserveIdForUnderlying(args)\n if (reserveId == null) return null\n\n const url = (args.rpcUrl ?? '').trim()\n const spoke = getAddress(args.spoke)\n const chain = defineChain({\n id: args.chainId,\n name: 'Rpc',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [url] } },\n })\n const client = createPublicClient({ chain, transport: http(url) })\n const cfg = await client.readContract({\n address: spoke,\n abi: spokeStaticAbi,\n functionName: 'getReserveConfig',\n args: [reserveId],\n })\n return {\n reserveId,\n paused: cfg.paused,\n frozen: cfg.frozen,\n borrowable: cfg.borrowable,\n receiveSharesEnabled: cfg.receiveSharesEnabled,\n collateralRisk: Number(cfg.collateralRisk),\n }\n}\n","import type { KeyGenSubset } from './types.js'\n\nexport type { KeyGenSubset }\n\n/** App-compatible alias used by existing multisign builders. */\nexport type KeyGenSubsetForPermit = KeyGenSubset\n\nexport function firstClientIdFromKeyGen(data: KeyGenSubset | null | undefined): string | null {\n const map = data?.ClientKeys\n if (!map || typeof map !== 'object') return null\n for (const v of Object.values(map)) {\n if (typeof v === 'string' && v.trim()) return v.trim()\n }\n return null\n}\n\nexport function requirePubKeyHex(keyGen: KeyGenSubset): string {\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n return ph\n}\n\nexport function keyListFromKeyGen(keyGen: KeyGenSubset): string[] {\n return keyGen.keylist ?? []\n}\n","/**\n * Proposal-time EVM fields for POST /multiSignRequest (mpc-auth).\n * Same shape as trigger txParams and GET /getSignRequestById?tx_params=1.\n */\n\nexport type ProposalTxParams = {\n nonce: number\n gasLimit: string\n txType: 'eip1559' | 'legacy'\n maxFeePerGas?: string\n maxPriorityFeePerGas?: string\n gasPrice?: string\n}\n\nexport function gasLimitFromEstimateAndChainConfig(\n estimatedGas: bigint,\n chainGasLimit?: number,\n): bigint {\n if (chainGasLimit == null || !Number.isFinite(chainGasLimit) || chainGasLimit <= 0) {\n return estimatedGas\n }\n const cfg = BigInt(Math.floor(chainGasLimit))\n return cfg > estimatedGas ? cfg : estimatedGas\n}\n\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n\nexport function composeFeePayloadToTxParams(\n p: Record<string, unknown>,\n legacy: boolean,\n): ProposalTxParams | undefined {\n const gl = p.txGasLimit ?? p.txgaslimit\n if (gl == null || String(gl).trim() === '') return undefined\n const n = p.txNonce ?? p.txnonce\n let nonce = 0\n if (typeof n === 'bigint') nonce = Number(n)\n else if (typeof n === 'number') nonce = n\n else if (n != null) nonce = parseInt(String(n), 10)\n if (!Number.isFinite(nonce)) nonce = 0\n const gasLimit = String(gl)\n if (legacy) {\n const gp = p.txGasPrice ?? p.txgasprice\n return {\n nonce,\n gasLimit,\n txType: 'legacy',\n gasPrice: gp != null ? String(gp) : '0',\n }\n }\n return {\n nonce,\n gasLimit,\n txType: 'eip1559',\n maxFeePerGas: String(p.txMaxFeePerGas ?? ''),\n maxPriorityFeePerGas: String(p.txMaxPriorityFeePerGas ?? ''),\n }\n}\n\nexport function triggerTxParamsFromComposeBody(body: Record<string, unknown>): ProposalTxParams {\n const existing = body.txParams\n if (existing && typeof existing === 'object' && !Array.isArray(existing)) {\n const o = existing as ProposalTxParams & { gasLimit?: string }\n if (String(o.gasLimit ?? '').trim() !== '') {\n return { ...o }\n }\n }\n const pb = body.proposalTxParams\n if (Array.isArray(pb) && pb.length > 0 && typeof pb[0] === 'object' && pb[0] !== null) {\n const first = pb[0] as ProposalTxParams & { gasLimit?: string }\n if (String(first.gasLimit ?? '').trim() !== '') {\n return { ...first }\n }\n }\n const fromSnapshot = composeFeePayloadToTxParams(\n body,\n body.txMaxFeePerGas == null && body.txMaxPriorityFeePerGas == null,\n )\n if (fromSnapshot) return fromSnapshot\n return {\n nonce: 0,\n gasLimit: '',\n txType: 'legacy',\n gasPrice: '0',\n }\n}\n\nexport function proposalTxParamsToFeeSnapshot(\n params: ProposalTxParams,\n): Record<string, unknown> {\n if (params.txType === 'legacy') {\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txGasPrice: params.gasPrice ?? '0',\n }\n }\n return {\n txNonce: params.nonce,\n txGasLimit: params.gasLimit,\n txMaxFeePerGas: params.maxFeePerGas ?? '',\n txMaxPriorityFeePerGas: params.maxPriorityFeePerGas ?? '',\n }\n}\n","import { createPublicClient, http, defineChain, formatUnits } from 'viem'\n\nexport interface ChainFeeParams {\n isEip1559: boolean\n baseFeeGwei?: number\n priorityFeeGwei?: number\n gasPriceGwei?: number\n}\n\nexport async function fetchChainFeeParams(\n rpcUrl: string,\n chainId: number | string,\n): Promise<ChainFeeParams> {\n const url = rpcUrl.trim()\n if (!url) return { isEip1559: false }\n\n const chainIdNum = typeof chainId === 'string' ? parseInt(chainId, 10) : chainId\n if (Number.isNaN(chainIdNum)) return { isEip1559: false }\n\n const chain = defineChain({\n id: chainIdNum,\n name: 'Discovery',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [url] } },\n })\n\n const publicClient = createPublicClient({\n chain,\n transport: http(url),\n })\n\n const getGasPriceGwei = async (): Promise<number> => {\n const gasPriceWei = await publicClient.getGasPrice()\n return parseFloat(formatUnits(gasPriceWei, 9))\n }\n\n try {\n const block = await publicClient.getBlock({ blockTag: 'latest' })\n const baseFeePerGas = block?.baseFeePerGas\n if (baseFeePerGas == null || baseFeePerGas === undefined) {\n const gasPriceGwei = await getGasPriceGwei()\n return { isEip1559: false, gasPriceGwei }\n }\n\n const baseFeeGwei = parseFloat(formatUnits(baseFeePerGas, 9))\n\n let priorityFeeGwei: number | undefined\n try {\n const priorityWei = await publicClient.estimateMaxPriorityFeePerGas()\n priorityFeeGwei = parseFloat(formatUnits(priorityWei, 9))\n } catch {\n /* chain may not support eth_maxPriorityFeePerGas */\n }\n\n const gasPriceGwei = await getGasPriceGwei()\n return {\n isEip1559: true,\n baseFeeGwei,\n priorityFeeGwei,\n gasPriceGwei,\n }\n } catch {\n try {\n const gasPriceWei = await publicClient.getGasPrice()\n const gasPriceGwei = parseFloat(formatUnits(gasPriceWei, 9))\n return { isEip1559: false, gasPriceGwei }\n } catch {\n return { isEip1559: false }\n }\n }\n}\n","import { parseGwei } from 'viem'\n\nexport type ResolvedEip1559Fees = {\n maxFeePerGas: bigint\n maxPriorityFeePerGas: bigint\n}\n\nfunction finalizeEip1559Fees(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n floor: { maxFeePerGas: bigint; maxPriorityFeePerGas: bigint } | null | undefined,\n baseWei: bigint,\n): ResolvedEip1559Fees {\n let maxP = maxPriorityFeePerGas\n let maxF = maxFeePerGas\n if (floor) {\n if (maxP < floor.maxPriorityFeePerGas) maxP = floor.maxPriorityFeePerGas\n if (maxF < floor.maxFeePerGas) maxF = floor.maxFeePerGas\n }\n if (baseWei > 0n && maxF < baseWei + maxP) {\n maxF = baseWei + maxP + parseGwei('0.001')\n }\n if (maxF < maxP) {\n maxF = baseWei > 0n ? baseWei + maxP + parseGwei('0.001') : maxP * 2n\n }\n return { maxFeePerGas: maxF, maxPriorityFeePerGas: maxP }\n}\n\n/** Align EIP-1559 fees with the latest head base fee (same rules as Get Sig). */\nexport function alignEip1559FeesWithLatestBase(\n maxFeePerGas: bigint,\n maxPriorityFeePerGas: bigint,\n latestBlockBaseFeeWei: bigint,\n): ResolvedEip1559Fees {\n return finalizeEip1559Fees(maxFeePerGas, maxPriorityFeePerGas, null, latestBlockBaseFeeWei)\n}\n\nexport function gweiToDecimalString(n: number): string {\n if (!Number.isFinite(n)) return '0'\n if (n === 0) return '0'\n const s = String(n)\n if (s.indexOf('e') !== -1 || s.indexOf('E') !== -1) return n.toFixed(9).replace(/\\.?0+$/, '') || '0'\n return s\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n keccak256,\n parseAbi,\n parseGwei,\n parseUnits,\n serializeTransaction,\n} from 'viem'\nimport { firstClientIdFromKeyGen, type KeyGenSubsetForPermit } from '../../../core/keygen.js'\nimport { gasLimitFromEstimateAndChainConfig, type ProposalTxParams } from '../../../chains/evm/txParams.js'\nimport { fetchChainFeeParams } from '../../../chains/evm/fees/chainFees.js'\nimport { alignEip1559FeesWithLatestBase } from '../../../chains/evm/fees/eip1559Align.js'\nimport { type AaveV4UiMarketId } from './api.js'\nimport { fetchAaveV4SpokeReserveIdForUnderlying } from './spokeOnChain.js'\n\n/**\n * `eth_estimateGas` can revert for complex Aave v4 `supply` calldata; same order of magnitude as Curve router.\n * Exported for Get Sig / Execute fallbacks.\n */\nexport const AAVE_V4_SPOKE_SUPPLY_DEFAULT_GAS_UNITS = 1_200_000n\nconst AAVE_SPOKE_SUPPLY_ESTIMATE_FALLBACK = AAVE_V4_SPOKE_SUPPLY_DEFAULT_GAS_UNITS\nconst AAVE_SPOKE_SET_USING_AS_COLLATERAL_FALLBACK = 450_000n\nconst AAVE_ERC20_APPROVE_FALLBACK = 100_000n\nconst AAVE_WETH_DEPOSIT_FALLBACK = 120_000n\nexport const AAVE_V4_SPOKE_WITHDRAW_DEFAULT_GAS_UNITS = 800_000n\nconst AAVE_SPOKE_WITHDRAW_ESTIMATE_FALLBACK = AAVE_V4_SPOKE_WITHDRAW_DEFAULT_GAS_UNITS\nexport const AAVE_V4_SPOKE_BORROW_DEFAULT_GAS_UNITS = 900_000n\nconst AAVE_SPOKE_BORROW_ESTIMATE_FALLBACK = AAVE_V4_SPOKE_BORROW_DEFAULT_GAS_UNITS\nexport const AAVE_V4_SPOKE_REPAY_DEFAULT_GAS_UNITS = 1_000_000n\nconst AAVE_SPOKE_REPAY_ESTIMATE_FALLBACK = AAVE_V4_SPOKE_REPAY_DEFAULT_GAS_UNITS\nconst AAVE_MERKL_CLAIM_ESTIMATE_FALLBACK = 500_000n\nconst EULER_REUL_UNLOCK_ESTIMATE_FALLBACK = 500_000n\n\nfunction gweiToDecimalString(n: number): string {\n if (!Number.isFinite(n)) return '0'\n if (n === 0) return '0'\n const s = String(n)\n if (s.indexOf('e') !== -1 || s.indexOf('E') !== -1) return n.toFixed(9).replace(/\\.?0+$/, '') || '0'\n return s\n}\n\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nfunction txToViemStep(tx: { to: Address; data: `0x${string}`; value: bigint }): {\n to: Address\n data: `0x${string}`\n value: bigint\n} {\n return { to: getAddress(tx.to), data: tx.data, value: tx.value }\n}\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\n/** Aave v4 Spoke (mainnet): `supply(uint256 reserveId, uint256 amount, address onBehalfOf)` — not the 4-arg asset + referral form. */\nconst spokeSupplyAbi = parseAbi(['function supply(uint256 reserveId, uint256 amount, address onBehalfOf)'])\nconst spokeWithdrawAbi = parseAbi(['function withdraw(uint256 reserveId, uint256 amount, address onBehalfOf)'])\nconst spokeBorrowAbi = parseAbi(['function borrow(uint256 reserveId, uint256 amount, address onBehalfOf)'])\nconst spokeRepayAbi = parseAbi(['function repay(uint256 reserveId, uint256 amount, address onBehalfOf)'])\nconst spokeSetUsingAsCollateralAbi = parseAbi([\n 'function setUsingAsCollateral(uint256 reserveId, bool usingAsCollateral, address onBehalfOf)',\n])\n\ntype BuildStep =\n | { kind: 'weth_deposit' | 'approve' | 'supply' | 'set_collateral'; to: Address; data: `0x${string}`; value: bigint }\n\n/**\n * Aave v4: optional WETH `deposit` (native path), exact ERC-20 `approve` to the spoke when needed, then\n * `spoke.supply(reserveId, amount, onBehalfOf)`.\n * Optionally appends `spoke.setUsingAsCollateral(reserveId, true, onBehalfOf)` in the same batch\n * (same pattern as the Aave app’s “use as collateral” toggle after supply).\n */\nexport async function buildEvmMultisignBodyAaveV4DepositBatch(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n market: AaveV4UiMarketId\n /** Underlying to supply (e.g. WETH when user chose native, or the ERC-20). */\n asset: Address\n isNativeIn: boolean\n /** Wrapped native; required when `isNativeIn`. */\n nativeWrapped: Address\n amountHuman: string\n spoke: Address\n onBehalfOf: Address\n executorAddress: Address\n purposeText: string\n /**\n * When true, add a final tx `setUsingAsCollateral(reserveId, true, onBehalfOf)` after `supply`\n * so the new supply is enabled as borrow collateral (Aave v4 `ISpoke.setUsingAsCollateral`).\n */\n enableAsCollateralAfterSupply?: boolean\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n const asset = getAddress(args.asset)\n const spoke = getAddress(args.spoke)\n const weth = getAddress(args.nativeWrapped)\n const executor = getAddress(args.executorAddress)\n const onBehalf = getAddress(args.onBehalfOf)\n if (args.isNativeIn && asset.toLowerCase() !== weth.toLowerCase()) {\n throw new Error('Native deposit path: underlying asset must match the chain wrapped native token.')\n }\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n\n const dec = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const amountWei = parseUnits(args.amountHuman, Number(dec))\n if (amountWei === 0n) throw new Error('Amount is zero after converting with token decimals.')\n\n const steps: BuildStep[] = []\n\n if (args.isNativeIn) {\n const dataDeposit = encodeFunctionData({ abi: wethDepositAbi, functionName: 'deposit', args: [] })\n steps.push({ kind: 'weth_deposit', to: weth, data: dataDeposit, value: amountWei })\n const wethAllowance = await publicClient.readContract({\n address: weth,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, spoke],\n })\n if (wethAllowance < amountWei) {\n if (wethAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [spoke, 0n],\n })\n steps.push({ kind: 'approve', to: weth, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [spoke, amountWei],\n })\n steps.push({ kind: 'approve', to: weth, data: dataApprove, value: 0n })\n }\n } else {\n const currentAllowance = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, spoke],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [spoke, 0n],\n })\n steps.push({ kind: 'approve', to: asset, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [spoke, amountWei],\n })\n steps.push({ kind: 'approve', to: asset, data: dataApprove, value: 0n })\n }\n }\n\n const reserveId = await fetchAaveV4SpokeReserveIdForUnderlying({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n spoke,\n underlying: asset,\n })\n if (reserveId == null) {\n throw new Error(\n 'Could not resolve Aave v4 reserve id for this asset on the Spoke (getReserve). Check RPC and the selected market.',\n )\n }\n\n const supplyData = encodeFunctionData({\n abi: spokeSupplyAbi,\n functionName: 'supply',\n args: [reserveId, amountWei, onBehalf],\n })\n steps.push({ kind: 'supply', to: spoke, data: supplyData, value: 0n })\n\n if (args.enableAsCollateralAfterSupply === true) {\n const setCollateralData = encodeFunctionData({\n abi: spokeSetUsingAsCollateralAbi,\n functionName: 'setUsingAsCollateral',\n args: [reserveId, true, onBehalf],\n })\n steps.push({ kind: 'set_collateral', to: spoke, data: setCollateralData, value: 0n })\n }\n\n const feeParams = await fetchChainFeeParams(args.rpcUrl, args.chainId)\n const legacy = Boolean(args.chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei =\n !legacy ? (await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n : 0n\n const useCustomGas = args.useCustomGas\n const gasLimitConfig =\n useCustomGas && args.chainDetail?.gasLimit != null ? Number(args.chainDetail.gasLimit) : undefined\n const gasFeeMultiplier =\n useCustomGas && args.chainDetail?.gasMultiplier != null ? Number(args.chainDetail.gasMultiplier) : undefined\n\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n const messageHashes: string[] = []\n const messageRawBatch: string[] = []\n const proposalTxParamsBatch: ProposalTxParams[] = []\n const batchMeta: Record<string, unknown>[] = []\n let firstTxFeePayload: Record<string, unknown> = {}\n let firstDataNo0x = ''\n const marketLabel = String(args.market)\n\n for (let i = 0; i < steps.length; i++) {\n const s = steps[i]!\n const v = txToViemStep(s)\n const currentNonce = baseNonce + i\n let estimatedGas: bigint\n try {\n estimatedGas = await publicClient.estimateGas({\n to: v.to,\n data: v.data,\n value: v.value,\n account: executor,\n })\n } catch {\n if (s.kind === 'weth_deposit') estimatedGas = AAVE_WETH_DEPOSIT_FALLBACK\n else if (s.kind === 'approve') estimatedGas = AAVE_ERC20_APPROVE_FALLBACK\n else if (s.kind === 'set_collateral') estimatedGas = AAVE_SPOKE_SET_USING_AS_COLLATERAL_FALLBACK\n else estimatedGas = AAVE_SPOKE_SUPPLY_ESTIMATE_FALLBACK\n }\n const gasLimitI = useCustomGas ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig) : estimatedGas\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n const ser = serializeTransaction({\n type: 'legacy',\n to: v.to,\n data: v.data,\n value: v.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId: args.chainId,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n })\n if (i === 0) {\n firstTxFeePayload = { txNonce: currentNonce, txGasLimit: gasLimitI.toString(), txGasPrice: gasPriceWei.toString() }\n firstDataNo0x = v.data.startsWith('0x') ? v.data.slice(2) : v.data\n }\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0 ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei)) : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n const ser = serializeTransaction({\n type: 'eip1559',\n to: v.to,\n data: v.data,\n value: v.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId: args.chainId,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n })\n if (i === 0) {\n firstTxFeePayload = {\n txNonce: currentNonce,\n txGasLimit: gasLimitI.toString(),\n txMaxFeePerGas: maxFeePerGas.toString(),\n txMaxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n firstDataNo0x = v.data.startsWith('0x') ? v.data.slice(2) : v.data\n }\n }\n\n if (s.kind === 'weth_deposit') {\n batchMeta.push({\n destinationAddress: weth,\n signatureText: JSON.stringify({\n kind: 'AaveV4',\n name: 'WETH.deposit',\n function: 'deposit()',\n valueWei: amountWei.toString(),\n market: marketLabel,\n note: 'Wrap native to WETH, then supply to Aave v4 (same batch).',\n }),\n evm: { type: 'aave_v4_weth_deposit', version: 1, chainId: String(args.chainId) },\n aaveV4: { step: 'weth_deposit', market: marketLabel, amountHuman: args.amountHuman, hubAsset: asset },\n })\n } else if (s.kind === 'approve') {\n const tokenForApprove = s.to\n batchMeta.push({\n destinationAddress: tokenForApprove,\n signatureText: JSON.stringify({\n kind: 'AaveV4',\n name: 'ERC20.approve',\n to: 'Aave v4 spoke',\n function: 'approve(address spender, uint256 amount)',\n spoke,\n amountHuman: args.amountHuman,\n note: 'Allowance for this supply amount only (not unlimited).',\n }),\n evm: { type: 'aave_v4_erc20_approve', version: 1, chainId: String(args.chainId) },\n aaveV4: { market: marketLabel, amountHuman: args.amountHuman, spoke },\n })\n } else if (s.kind === 'set_collateral') {\n batchMeta.push({\n destinationAddress: spoke,\n signatureText: JSON.stringify({\n kind: 'AaveV4',\n name: 'Spoke.setUsingAsCollateral',\n function: 'setUsingAsCollateral(uint256 reserveId, bool usingAsCollateral, address onBehalfOf)',\n reserveId: reserveId.toString(),\n usingAsCollateral: true,\n onBehalfOf: onBehalf,\n market: marketLabel,\n note: 'Enables this supplied reserve as collateral for borrowing (after supply in the same batch).',\n }),\n evm: { type: 'aave_v4_spoke_set_using_as_collateral', version: 1, chainId: String(args.chainId) },\n aaveV4: { market: marketLabel, asset, spoke, reserveId: reserveId.toString(), gasBuildSetCollateral: { baseGasUnits: gasLimitI.toString() } },\n })\n } else {\n batchMeta.push({\n destinationAddress: spoke,\n signatureText: JSON.stringify({\n kind: 'AaveV4',\n name: 'Spoke.supply',\n function: 'supply(uint256 reserveId, uint256 amount, address onBehalfOf)',\n reserveId: reserveId.toString(),\n asset,\n onBehalfOf: onBehalf,\n market: marketLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'aave_v4_spoke_supply', version: 1, chainId: String(args.chainId) },\n aaveV4: {\n market: marketLabel,\n amountHuman: args.amountHuman,\n asset,\n spoke,\n reserveId: reserveId.toString(),\n gasBuildSupply: { baseGasUnits: gasLimitI.toString() },\n },\n })\n }\n }\n\n const extraPayload: Record<string, unknown> = { batchMeta }\n if (useCustomGas && args.customGasChainDetails && Object.keys(args.customGasChainDetails).length > 0) {\n extraPayload.customGasChainDetails = args.customGasChainDetails\n }\n const extraJSON = JSON.stringify(extraPayload)\n const firstSigText = (batchMeta[0] as { signatureText: string }).signatureText\n const n = steps.length\n const hasWrap = args.isNativeIn\n const withCollateral = args.enableAsCollateralAfterSupply === true\n const purposeSuffix = (() => {\n if (hasWrap) {\n return withCollateral\n ? `Aave v4: ${n}-tx batch — wrap native to WETH (if needed), approve spoke for the exact amount, supply, then setUsingAsCollateral.`\n : `Aave v4: ${n}-tx batch — wrap native to WETH (if needed), approve spoke for the exact amount, then supply.`\n }\n if (n === 1) {\n return 'Aave v4: 1-tx — supply (allowance already sufficient).'\n }\n if (withCollateral && n === 2) {\n return 'Aave v4: 2-tx batch — supply (allowance already sufficient), then setUsingAsCollateral.'\n }\n if (withCollateral) {\n return `Aave v4: ${n}-tx batch — approve spoke for the exact amount, supply, then setUsingAsCollateral.`\n }\n return `Aave v4: ${n}-tx batch — approve spoke for the exact amount, then supply.`\n })()\n\n const firstValue = steps[0]!.value\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: firstDataNo0x,\n messageHashes,\n messageRawBatch,\n destinationChainID: String(args.chainId),\n destinationAddress: steps[0]!.to,\n extraJSON,\n signatureText: firstSigText,\n purpose: (() => {\n const t = args.purposeText.trim()\n return (t ? `${t}\\n\\n` : '') + purposeSuffix\n })(),\n ...firstTxFeePayload,\n proposalTxParams: proposalTxParamsBatch,\n }\n if (firstValue > 0n) {\n bodyForSign.value = firstValue.toString()\n }\n if (clientId) bodyForSign.clientId = clientId\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\ntype BuildAaveV4OneStepTx = { to: Address; data: `0x${string}`; value: bigint }\n\n/**\n * `Spoke.withdraw` — one transaction (same sign-request shape as a single step of a deposit batch).\n * Prefer passing {@link fetchAaveV4SpokeReserveIdForUnderlying} result via `reserveIdOnChain` when known.\n */\nexport async function buildEvmMultisignBodyAaveV4SpokeWithdraw(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketLabel: string\n spoke: Address\n underlying: Address\n amountHuman: string\n onBehalfOf: Address\n executorAddress: Address\n purposeText: string\n /** When set, avoids an extra on-chain getReserve for the id. */\n reserveIdOnChain?: bigint | null\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n const asset = getAddress(args.underlying)\n const spoke = getAddress(args.spoke)\n const onBehalf = getAddress(args.onBehalfOf)\n const executor = getAddress(args.executorAddress)\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const dec = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const amountWei = parseUnits(args.amountHuman, Number(dec))\n if (amountWei === 0n) throw new Error('Withdraw amount is zero after converting with token decimals.')\n\n let reserveId: bigint\n if (args.reserveIdOnChain != null && args.reserveIdOnChain >= 0n) {\n reserveId = args.reserveIdOnChain\n } else {\n const r = await fetchAaveV4SpokeReserveIdForUnderlying({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n spoke,\n underlying: asset,\n })\n if (r == null) {\n throw new Error('Could not resolve Aave v4 reserve id for this asset on the Spoke.')\n }\n reserveId = r\n }\n\n const data = encodeFunctionData({\n abi: spokeWithdrawAbi,\n functionName: 'withdraw',\n args: [reserveId, amountWei, onBehalf],\n })\n const tx: BuildAaveV4OneStepTx = { to: spoke, data, value: 0n }\n return buildEvmMultisignBodyAaveV4OneStep({\n ph,\n keyList,\n clientId: clientId ?? undefined,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails ?? undefined,\n purposeText: args.purposeText,\n purposeSuffix: `Aave v4: 1-tx — Spoke.withdraw for ${(args.amountHuman || '').trim() || '…'} of underlying on this market (see signature text).`,\n executorAddress: executor,\n v: tx,\n estimateGasFallback: AAVE_SPOKE_WITHDRAW_ESTIMATE_FALLBACK,\n buildBatchMeta: (ctx) => ({\n destinationAddress: spoke,\n signatureText: JSON.stringify({\n kind: 'AaveV4',\n name: 'Spoke.withdraw',\n function: 'withdraw(uint256 reserveId, uint256 amount, address onBehalfOf)',\n reserveId: reserveId.toString(),\n asset,\n onBehalfOf: onBehalf,\n market: args.marketLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'aave_v4_spoke_withdraw', version: 1, chainId: String(args.chainId) },\n aaveV4: {\n market: args.marketLabel,\n amountHuman: args.amountHuman,\n asset,\n spoke,\n reserveId: reserveId.toString(),\n gasBuildWithdraw: { baseGasUnits: ctx.gasLimit.toString() },\n },\n }),\n })\n}\n\n/**\n * `Spoke.borrow` — one transaction, same shape as {@link buildEvmMultisignBodyAaveV4SpokeWithdraw}.\n */\nexport async function buildEvmMultisignBodyAaveV4SpokeBorrow(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n marketLabel: string\n spoke: Address\n underlying: Address\n amountHuman: string\n onBehalfOf: Address\n executorAddress: Address\n purposeText: string\n reserveIdOnChain?: bigint | null\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n const asset = getAddress(args.underlying)\n const spoke = getAddress(args.spoke)\n const onBehalf = getAddress(args.onBehalfOf)\n const executor = getAddress(args.executorAddress)\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const dec = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const amountWei = parseUnits(args.amountHuman, Number(dec))\n if (amountWei === 0n) throw new Error('Borrow amount is zero after converting with token decimals.')\n\n let reserveId: bigint\n if (args.reserveIdOnChain != null && args.reserveIdOnChain >= 0n) {\n reserveId = args.reserveIdOnChain\n } else {\n const r = await fetchAaveV4SpokeReserveIdForUnderlying({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n spoke,\n underlying: asset,\n })\n if (r == null) {\n throw new Error('Could not resolve Aave v4 reserve id for this asset on the Spoke.')\n }\n reserveId = r\n }\n\n const data = encodeFunctionData({\n abi: spokeBorrowAbi,\n functionName: 'borrow',\n args: [reserveId, amountWei, onBehalf],\n })\n const tx: BuildAaveV4OneStepTx = { to: spoke, data, value: 0n }\n return buildEvmMultisignBodyAaveV4OneStep({\n ph,\n keyList,\n clientId: clientId ?? undefined,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails ?? undefined,\n purposeText: args.purposeText,\n purposeSuffix: `Aave v4: 1-tx — Spoke.borrow for ${(args.amountHuman || '').trim() || '…'} of underlying on this market (see signature text).`,\n executorAddress: executor,\n v: tx,\n estimateGasFallback: AAVE_SPOKE_BORROW_ESTIMATE_FALLBACK,\n buildBatchMeta: (ctx) => ({\n destinationAddress: spoke,\n signatureText: JSON.stringify({\n kind: 'AaveV4',\n name: 'Spoke.borrow',\n function: 'borrow(uint256 reserveId, uint256 amount, address onBehalfOf)',\n reserveId: reserveId.toString(),\n asset,\n onBehalfOf: onBehalf,\n market: args.marketLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'aave_v4_spoke_borrow', version: 1, chainId: String(args.chainId) },\n aaveV4: {\n market: args.marketLabel,\n amountHuman: args.amountHuman,\n asset,\n spoke,\n reserveId: reserveId.toString(),\n gasBuildBorrow: { baseGasUnits: ctx.gasLimit.toString() },\n },\n }),\n })\n}\n\ntype RepayBuildStep = { kind: 'approve' | 'repay'; to: Address; data: `0x${string}`; value: bigint }\n\n/**\n * `approve` (if required) and `Spoke.repay` — one or two transactions (same pattern as a deposit batch).\n */\nexport async function buildEvmMultisignBodyAaveV4SpokeRepay(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n market: AaveV4UiMarketId\n spoke: Address\n underlying: Address\n amountHuman: string\n onBehalfOf: Address\n executorAddress: Address\n purposeText: string\n reserveIdOnChain?: bigint | null\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n const asset = getAddress(args.underlying)\n const spoke = getAddress(args.spoke)\n const onBehalf = getAddress(args.onBehalfOf)\n const executor = getAddress(args.executorAddress)\n\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const dec = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'decimals',\n })\n const amountWei = parseUnits(args.amountHuman, Number(dec))\n if (amountWei === 0n) throw new Error('Repay amount is zero after converting with token decimals.')\n\n let reserveId: bigint\n if (args.reserveIdOnChain != null && args.reserveIdOnChain >= 0n) {\n reserveId = args.reserveIdOnChain\n } else {\n const r = await fetchAaveV4SpokeReserveIdForUnderlying({\n rpcUrl: args.rpcUrl,\n chainId: args.chainId,\n spoke,\n underlying: asset,\n })\n if (r == null) {\n throw new Error('Could not resolve Aave v4 reserve id for this asset on the Spoke.')\n }\n reserveId = r\n }\n\n const steps: RepayBuildStep[] = []\n const currentAllowance = await publicClient.readContract({\n address: asset,\n abi: erc20AllowanceAbi,\n functionName: 'allowance',\n args: [executor, spoke],\n })\n if (currentAllowance < amountWei) {\n if (currentAllowance > 0n) {\n const dataReset = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [spoke, 0n],\n })\n steps.push({ kind: 'approve', to: asset, data: dataReset, value: 0n })\n }\n const dataApprove = encodeFunctionData({\n abi: erc20ApproveAbi,\n functionName: 'approve',\n args: [spoke, amountWei],\n })\n steps.push({ kind: 'approve', to: asset, data: dataApprove, value: 0n })\n }\n const repayData = encodeFunctionData({\n abi: spokeRepayAbi,\n functionName: 'repay',\n args: [reserveId, amountWei, onBehalf],\n })\n steps.push({ kind: 'repay', to: spoke, data: repayData, value: 0n })\n\n const feeParams = await fetchChainFeeParams(args.rpcUrl, args.chainId)\n const legacy = Boolean(args.chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei =\n !legacy ? (await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n : 0n\n const useCustom = args.useCustomGas\n const gasLimitConfig =\n useCustom && args.chainDetail?.gasLimit != null ? Number(args.chainDetail.gasLimit) : undefined\n const gasFeeMultiplier =\n useCustom && args.chainDetail?.gasMultiplier != null ? Number(args.chainDetail.gasMultiplier) : undefined\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n const messageHashes: string[] = []\n const messageRawBatch: string[] = []\n const proposalTxParamsBatch: ProposalTxParams[] = []\n const batchMeta: Record<string, unknown>[] = []\n let firstTxFeePayload: Record<string, unknown> = {}\n let firstDataNo0x = ''\n const marketLabel = String(args.market)\n\n for (let i = 0; i < steps.length; i++) {\n const s = steps[i]!\n const v = txToViemStep(s)\n const currentNonce = baseNonce + i\n let estimatedGas: bigint\n try {\n estimatedGas = await publicClient.estimateGas({\n to: v.to,\n data: v.data,\n value: v.value,\n account: executor,\n })\n } catch {\n if (s.kind === 'approve') estimatedGas = AAVE_ERC20_APPROVE_FALLBACK\n else estimatedGas = AAVE_SPOKE_REPAY_ESTIMATE_FALLBACK\n }\n const gasLimitI = useCustom ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig) : estimatedGas\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustom && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustom && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n const ser = serializeTransaction({\n type: 'legacy',\n to: v.to,\n data: v.data,\n value: v.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId: args.chainId,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n })\n if (i === 0) {\n firstTxFeePayload = { txNonce: currentNonce, txGasLimit: gasLimitI.toString(), txGasPrice: gasPriceWei.toString() }\n firstDataNo0x = v.data.startsWith('0x') ? v.data.slice(2) : v.data\n }\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustom && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority =\n useCustom && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustom && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0 ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei)) : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustom && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n const ser = serializeTransaction({\n type: 'eip1559',\n to: v.to,\n data: v.data,\n value: v.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId: args.chainId,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n })\n if (i === 0) {\n firstTxFeePayload = {\n txNonce: currentNonce,\n txGasLimit: gasLimitI.toString(),\n txMaxFeePerGas: maxFeePerGas.toString(),\n txMaxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n firstDataNo0x = v.data.startsWith('0x') ? v.data.slice(2) : v.data\n }\n }\n\n if (s.kind === 'approve') {\n const tokenForApprove = s.to\n batchMeta.push({\n destinationAddress: tokenForApprove,\n signatureText: JSON.stringify({\n kind: 'AaveV4',\n name: 'ERC20.approve (repay)',\n to: 'Aave v4 spoke',\n function: 'approve(address spender, uint256 amount)',\n spoke,\n amountHuman: args.amountHuman,\n note: 'Allowance to repay this amount (or reset+approve to exact amount).',\n }),\n evm: { type: 'aave_v4_erc20_approve', version: 1, chainId: String(args.chainId) },\n aaveV4: { market: marketLabel, amountHuman: args.amountHuman, spoke, step: 'repay_prepare' },\n })\n } else {\n batchMeta.push({\n destinationAddress: spoke,\n signatureText: JSON.stringify({\n kind: 'AaveV4',\n name: 'Spoke.repay',\n function: 'repay(uint256 reserveId, uint256 amount, address onBehalfOf)',\n reserveId: reserveId.toString(),\n asset,\n onBehalfOf: onBehalf,\n market: marketLabel,\n amountHuman: args.amountHuman,\n }),\n evm: { type: 'aave_v4_spoke_repay', version: 1, chainId: String(args.chainId) },\n aaveV4: {\n market: marketLabel,\n amountHuman: args.amountHuman,\n asset,\n spoke,\n reserveId: reserveId.toString(),\n gasBuildRepay: { baseGasUnits: gasLimitI.toString() },\n },\n })\n }\n }\n\n const extraPayload: Record<string, unknown> = { batchMeta }\n if (useCustom && args.customGasChainDetails && Object.keys(args.customGasChainDetails).length > 0) {\n extraPayload.customGasChainDetails = args.customGasChainDetails\n }\n const extraJSON = JSON.stringify(extraPayload)\n const firstSigText = (batchMeta[0] as { signatureText: string }).signatureText\n const n = steps.length\n const purposeSuffix = `Aave v4: ${n}-tx batch — approve spoke if needed, then repay ${(args.amountHuman || '').trim() || '…'} of debt.`\n\n const firstValue = steps[0]!.value\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: firstDataNo0x,\n messageHashes,\n messageRawBatch,\n destinationChainID: String(args.chainId),\n destinationAddress: steps[0]!.to,\n extraJSON,\n signatureText: firstSigText,\n purpose: (() => {\n const t = args.purposeText.trim()\n return (t ? `${t}\\n\\n` : '') + purposeSuffix\n })(),\n ...firstTxFeePayload,\n proposalTxParams: proposalTxParamsBatch,\n }\n if (firstValue > 0n) {\n bodyForSign.value = firstValue.toString()\n }\n if (clientId) bodyForSign.clientId = clientId\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\n/**\n * Merkl claim-rewards call from the Aave API (`claimRewards`) — one transaction to `to` with `data` / `value`.\n */\nexport async function buildEvmMultisignBodyAaveV4MerklClaimRewards(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n to: Address\n data: `0x${string}`\n valueWei: bigint\n rewardIdCount: number\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n const to = getAddress(args.to)\n const executor = getAddress(args.executorAddress)\n return buildEvmMultisignBodyAaveV4OneStep({\n ph,\n keyList,\n clientId: clientId ?? undefined,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails ?? undefined,\n purposeText: args.purposeText,\n purposeSuffix: `Aave v4: 1-tx — Merkl claim rewards (${args.rewardIdCount} id(s), see calldata in signature text).`,\n executorAddress: executor,\n v: { to, data: args.data, value: args.valueWei },\n estimateGasFallback: AAVE_MERKL_CLAIM_ESTIMATE_FALLBACK,\n buildBatchMeta: (ctx) => ({\n destinationAddress: to,\n signatureText: JSON.stringify({\n kind: 'AaveV4',\n name: 'claimRewards (Merkl)',\n rewardIdCount: args.rewardIdCount,\n chainId: args.chainId,\n valueWei: args.valueWei.toString(),\n note: 'From Aave v4 claimRewards request.',\n }),\n evm: { type: 'aave_v4_merkl_claim_rewards', version: 1, chainId: String(args.chainId) },\n aaveV4: { step: 'merkl_claim', rewardIdCount: args.rewardIdCount, gasBuildClaim: { baseGasUnits: ctx.gasLimit.toString() } },\n }),\n })\n}\n\n/**\n * Merkl `Distributor.claim` using calldata from {@link encodeMerklDistributorClaimData} / Merkl API proofs.\n */\nexport async function buildEvmMultisignBodyEulerV2MerklDistributorClaim(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n to: Address\n data: `0x${string}`\n valueWei: bigint\n claimLeafCount: number\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n const to = getAddress(args.to)\n const executor = getAddress(args.executorAddress)\n return buildEvmMultisignBodyAaveV4OneStep({\n ph,\n keyList,\n clientId: clientId ?? undefined,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails ?? undefined,\n purposeText: args.purposeText,\n purposeSuffix: `Euler v2: 1-tx — Merkl distributor claim (${args.claimLeafCount} reward(s), see calldata in signature text).`,\n executorAddress: executor,\n v: { to, data: args.data, value: args.valueWei },\n estimateGasFallback: AAVE_MERKL_CLAIM_ESTIMATE_FALLBACK,\n buildBatchMeta: (ctx) => ({\n destinationAddress: to,\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'Merkl Distributor claim',\n claimLeafCount: args.claimLeafCount,\n chainId: args.chainId,\n valueWei: args.valueWei.toString(),\n note: 'Merkl API proofs; Distributor.claim(users,tokens,amounts,proofs).',\n }),\n evm: { type: 'euler_v2_merkl_distributor_claim', version: 1, chainId: String(args.chainId) },\n eulerV2: { step: 'merkl_distributor_claim', claimLeafCount: args.claimLeafCount, gasBuildClaim: { baseGasUnits: ctx.gasLimit.toString() } },\n }),\n })\n}\n\n/**\n * rEUL (`RewardToken`) batched `withdrawToByLockTimestamps` → unwrap vested underlying (EUL) to `executorAddress`.\n */\nexport async function buildEvmMultisignBodyEulerV2ReulUnlock(args: {\n keyGen: KeyGenSubsetForPermit\n chainId: number\n rpcUrl: string\n chainDetail: ChainRow\n useCustomGas: boolean\n customGasChainDetails?: Record<string, unknown> | null\n to: Address\n data: `0x${string}`\n valueWei: bigint\n lockTimestampCount: number\n allowRemainderLoss: boolean\n executorAddress: Address\n purposeText: string\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ph = (args.keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n const keyList = args.keyGen.keylist ?? []\n const clientId = firstClientIdFromKeyGen(args.keyGen)\n const to = getAddress(args.to)\n const executor = getAddress(args.executorAddress)\n const lossLabel = args.allowRemainderLoss ? 'early unlock (remainder to receiver)' : 'vested only'\n return buildEvmMultisignBodyAaveV4OneStep({\n ph,\n keyList,\n clientId: clientId ?? undefined,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails ?? undefined,\n purposeText: args.purposeText,\n purposeSuffix: `Euler v2: 1-tx — rEUL unlock (${args.lockTimestampCount} lock(s), ${lossLabel}).`,\n executorAddress: executor,\n v: { to, data: args.data, value: args.valueWei },\n estimateGasFallback: EULER_REUL_UNLOCK_ESTIMATE_FALLBACK,\n buildBatchMeta: (ctx) => ({\n destinationAddress: to,\n signatureText: JSON.stringify({\n kind: 'EulerV2',\n name: 'rEUL unlock (RewardToken)',\n lockTimestampCount: args.lockTimestampCount,\n allowRemainderLoss: args.allowRemainderLoss,\n chainId: args.chainId,\n valueWei: args.valueWei.toString(),\n note: 'RewardToken.withdrawToByLockTimestamps(account, lockTimestamps, allowRemainderLoss).',\n }),\n evm: { type: 'euler_v2_reul_unlock', version: 1, chainId: String(args.chainId) },\n eulerV2: {\n step: 'reul_unlock',\n lockTimestampCount: args.lockTimestampCount,\n allowRemainderLoss: args.allowRemainderLoss,\n gasBuildClaim: { baseGasUnits: ctx.gasLimit.toString() },\n },\n }),\n })\n}\n\nasync function buildEvmMultisignBodyAaveV4OneStep(args: {\n ph: string\n keyList: unknown[]\n clientId: string | undefined\n chainId: number\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 v: BuildAaveV4OneStepTx\n estimateGasFallback: bigint\n buildBatchMeta: (ctx: { gasLimit: bigint }) => Record<string, unknown>\n}): Promise<{ bodyForSign: Record<string, unknown>; messageToSign: string }> {\n const ch = defineChain({\n id: args.chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [args.rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(args.rpcUrl) })\n const v = args.v\n const feeParams = await fetchChainFeeParams(args.rpcUrl, args.chainId)\n const legacy = Boolean(args.chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWeiOneStep =\n !legacy ? (await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n : 0n\n const useCustomGas = args.useCustomGas\n const gasLimitConfig =\n useCustomGas && args.chainDetail?.gasLimit != null ? Number(args.chainDetail.gasLimit) : undefined\n const gasFeeMultiplier =\n useCustomGas && args.chainDetail?.gasMultiplier != null ? Number(args.chainDetail.gasMultiplier) : undefined\n\n const baseNonce = await publicClient.getTransactionCount({ address: args.executorAddress, blockTag: 'pending' })\n const currentNonce = baseNonce\n let estimatedGas: bigint\n try {\n estimatedGas = await publicClient.estimateGas({\n to: v.to,\n data: v.data,\n value: v.value,\n account: args.executorAddress,\n })\n } catch {\n estimatedGas = args.estimateGasFallback\n }\n const gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n const batchMeta0 = args.buildBatchMeta({ gasLimit: gasLimitI })\n\n let firstTxFeePayload: Record<string, unknown> = {}\n let firstDataNo0x = ''\n const messageHashes: string[] = []\n const messageRawBatch: string[] = []\n const proposalTxParamsBatch: ProposalTxParams[] = []\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && args.chainDetail?.gasPrice != null && args.chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(args.chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n const ser = serializeTransaction({\n type: 'legacy',\n to: v.to,\n data: v.data,\n value: v.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId: args.chainId,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n })\n firstTxFeePayload = { txNonce: currentNonce, txGasLimit: gasLimitI.toString(), txGasPrice: gasPriceWei.toString() }\n firstDataNo0x = v.data.startsWith('0x') ? v.data.slice(2) : v.data\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && args.chainDetail?.baseFee != null ? Number(args.chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && args.chainDetail?.priorityFee != null ? Number(args.chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && args.chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(args.chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0 ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei)) : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWeiOneStep,\n ))\n const ser = serializeTransaction({\n type: 'eip1559',\n to: v.to,\n data: v.data,\n value: v.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId: args.chainId,\n })\n const h = keccak256(ser)\n messageHashes.push(h.startsWith('0x') ? h.slice(2) : h)\n messageRawBatch.push(ser)\n proposalTxParamsBatch.push({\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n })\n firstTxFeePayload = {\n txNonce: currentNonce,\n txGasLimit: gasLimitI.toString(),\n txMaxFeePerGas: maxFeePerGas.toString(),\n txMaxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n firstDataNo0x = v.data.startsWith('0x') ? v.data.slice(2) : v.data\n }\n\n const extraPayload: Record<string, unknown> = { batchMeta: [batchMeta0] }\n if (useCustomGas && args.customGasChainDetails && Object.keys(args.customGasChainDetails).length > 0) {\n extraPayload.customGasChainDetails = args.customGasChainDetails\n }\n const extraJSON = JSON.stringify(extraPayload)\n const firstSigText = (batchMeta0 as { signatureText: string }).signatureText\n const bodyForSign: Record<string, unknown> = {\n keyList: args.keyList,\n pubKey: args.ph,\n msgHash: messageHashes[0],\n msgRaw: firstDataNo0x,\n messageHashes,\n messageRawBatch,\n destinationChainID: String(args.chainId),\n destinationAddress: v.to,\n extraJSON,\n signatureText: firstSigText,\n purpose: (() => {\n const t = args.purposeText.trim()\n return (t ? `${t}\\n\\n` : '') + args.purposeSuffix\n })(),\n ...firstTxFeePayload,\n proposalTxParams: proposalTxParamsBatch,\n }\n if (v.value > 0n) {\n bodyForSign.value = v.value.toString()\n }\n if (args.clientId) bodyForSign.clientId = args.clientId\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\n// —— Sign-request recognition & gas hints (Get Sig / Execute tab), aligned with Uniswap + Curve ——————\n\n/** Minimum gas floor for Execute preflight (same style as `MIN_CURVE_ROUTER_GAS_EXEC`). */\nexport const MIN_AAVE_V4_DEPOSIT_GAS_EXEC = 400_000n\n\nconst AAVE_V4_EVM_TYPES = new Set([\n 'aave_v4_weth_deposit',\n 'aave_v4_erc20_approve',\n 'aave_v4_spoke_supply',\n 'aave_v4_spoke_set_using_as_collateral',\n 'aave_v4_spoke_withdraw',\n 'aave_v4_spoke_borrow',\n 'aave_v4_spoke_repay',\n 'aave_v4_merkl_claim_rewards',\n])\n\nfunction parseExtraJsonObject(detail: Record<string, unknown> | null | undefined): Record<string, unknown> | null {\n if (!detail) return null\n const raw = detail.ExtraJSON ?? detail.extraJSON\n if (raw == null) return null\n if (typeof raw === 'object' && !Array.isArray(raw)) return raw as Record<string, unknown>\n if (typeof raw === 'string' && raw.trim()) {\n try {\n const p = JSON.parse(raw) as unknown\n if (p && typeof p === 'object' && !Array.isArray(p)) return p as Record<string, unknown>\n } catch {\n return null\n }\n }\n return null\n}\n\nfunction parseOptionalGasLimitString(raw: string | number | undefined): bigint | null {\n if (raw == null) return null\n const s = String(raw).trim()\n if (!s) return null\n try {\n if (/^0x[0-9a-fA-F]+$/.test(s)) return BigInt(s)\n return BigInt(s)\n } catch {\n return null\n }\n}\n\n/**\n * True when this sign request (or `batchMeta[batchIndex]`) is an Aave v4 deposit batch step.\n */\nexport function isAaveV4DepositEvmSignRequest(\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 != null && 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 if (AAVE_V4_EVM_TYPES.has(String((evm0 as Record<string, unknown>).type ?? ''))) return true\n }\n }\n if (batchIndex != null && batchIndex >= 0) return false\n const evm = ex.evm\n if (evm && typeof evm === 'object' && !Array.isArray(evm)) {\n if (AAVE_V4_EVM_TYPES.has(String((evm as Record<string, unknown>).type ?? ''))) return true\n }\n return false\n}\n\n/**\n * Prefer `proposalTxParams[i]` / `batchMeta[i].aaveV4.gasBuildSupply` when `eth_estimateGas` reverts.\n */\nexport function resolveAaveV4DepositGasUnitsFromSignRequest(\n detail: Record<string, unknown> | null | undefined,\n batchIndex?: number\n): bigint | null {\n if (!detail) return null\n const index = batchIndex != null && batchIndex >= 0 ? batchIndex : 0\n const propBatch = (detail.proposal_tx_params ?? detail.proposalTxParams ?? detail.ProposalTxParams) as unknown\n if (Array.isArray(propBatch) && propBatch.length > index) {\n const row = propBatch[index]\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 if (batchIndex == null || batchIndex === 0) {\n const tp = (detail.txParams ?? detail.TxParams) as Record<string, unknown> | undefined\n if (tp && typeof tp === 'object') {\n const gl = parseOptionalGasLimitString(\n (tp.gasLimit ?? tp.GasLimit ?? tp.txGasLimit) 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[index] && typeof bm[index] === 'object' && !Array.isArray(bm[index])) {\n const a4 = (bm[index] as Record<string, unknown>).aaveV4 as Record<string, unknown> | undefined\n if (a4 && typeof a4 === 'object') {\n const gs =\n (a4.gasBuildSupply ??\n a4.gasBuildSetCollateral ??\n a4.gasBuildWithdraw ??\n a4.gasBuildBorrow ??\n a4.gasBuildRepay ??\n a4.gasBuildClaim) 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 }\n return null\n}\n","import type { ProtocolModule } from '../../../core/types.js'\nimport { registerProtocolModule } from '../../../core/registry.js'\n\nexport * from './api.js'\nexport * from './spokeOnChain.js'\nexport * from './multisign.js'\n\nexport const AAVE_V4_PROTOCOL_ID = 'aave-v4'\n\nexport const aaveV4ProtocolModule: ProtocolModule = {\n id: AAVE_V4_PROTOCOL_ID,\n chainCategory: 'evm',\n isChainSupported(ctx) {\n return ctx.chainCategory === 'evm'\n },\n isTokenSupported(token) {\n return token.category === 'evm' && (token.kind === 'native' || token.kind === 'erc20')\n },\n actions: [\n { id: 'aave-v4.deposit', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Supply to Aave v4 Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.withdraw', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Withdraw from Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.borrow', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Borrow from Spoke', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n { id: 'aave-v4.repay', protocolId: AAVE_V4_PROTOCOL_ID, chainCategory: 'evm', description: 'Repay Spoke debt', commonParams: ['keyGen', 'purposeText', 'useCustomGas'], params: {} },\n ],\n}\n\nregisterProtocolModule(aaveV4ProtocolModule)\n"]}