@continuumdao/ctm-mpc-defi 0.2.11 → 0.2.12

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 (64) hide show
  1. package/dist/agent/catalog.cjs +96 -47
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +879 -339
  4. package/dist/agent/catalog.js +96 -47
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/morpho/SKILL.md +8 -0
  7. package/dist/chains/evm/index.cjs +1 -1
  8. package/dist/chains/evm/index.cjs.map +1 -1
  9. package/dist/chains/evm/index.js +1 -1
  10. package/dist/chains/evm/index.js.map +1 -1
  11. package/dist/core/index.cjs +1 -1
  12. package/dist/core/index.cjs.map +1 -1
  13. package/dist/core/index.d.ts +1 -1
  14. package/dist/core/index.js +1 -1
  15. package/dist/core/index.js.map +1 -1
  16. package/dist/index.cjs +1 -1
  17. package/dist/index.cjs.map +1 -1
  18. package/dist/index.js +1 -1
  19. package/dist/index.js.map +1 -1
  20. package/dist/protocols/evm/aave-v4/index.cjs +1 -1
  21. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  22. package/dist/protocols/evm/aave-v4/index.js +1 -1
  23. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  24. package/dist/protocols/evm/curve-dao/index.cjs +1 -1
  25. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  26. package/dist/protocols/evm/curve-dao/index.js +1 -1
  27. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  28. package/dist/protocols/evm/ethena/index.cjs +1 -1
  29. package/dist/protocols/evm/ethena/index.cjs.map +1 -1
  30. package/dist/protocols/evm/ethena/index.js +1 -1
  31. package/dist/protocols/evm/ethena/index.js.map +1 -1
  32. package/dist/protocols/evm/euler-v2/index.cjs +1 -1
  33. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  34. package/dist/protocols/evm/euler-v2/index.js +1 -1
  35. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  36. package/dist/protocols/evm/gmx/index.cjs +1 -1
  37. package/dist/protocols/evm/gmx/index.cjs.map +1 -1
  38. package/dist/protocols/evm/gmx/index.js +1 -1
  39. package/dist/protocols/evm/gmx/index.js.map +1 -1
  40. package/dist/protocols/evm/hyperliquid/index.cjs +1 -1
  41. package/dist/protocols/evm/hyperliquid/index.cjs.map +1 -1
  42. package/dist/protocols/evm/hyperliquid/index.js +1 -1
  43. package/dist/protocols/evm/hyperliquid/index.js.map +1 -1
  44. package/dist/protocols/evm/lido/index.cjs +1 -1
  45. package/dist/protocols/evm/lido/index.cjs.map +1 -1
  46. package/dist/protocols/evm/lido/index.js +1 -1
  47. package/dist/protocols/evm/lido/index.js.map +1 -1
  48. package/dist/protocols/evm/maple/index.cjs +1 -1
  49. package/dist/protocols/evm/maple/index.cjs.map +1 -1
  50. package/dist/protocols/evm/maple/index.js +1 -1
  51. package/dist/protocols/evm/maple/index.js.map +1 -1
  52. package/dist/protocols/evm/morpho/index.cjs +1 -1
  53. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  54. package/dist/protocols/evm/morpho/index.js +1 -1
  55. package/dist/protocols/evm/morpho/index.js.map +1 -1
  56. package/dist/protocols/evm/sky/index.cjs +1 -1
  57. package/dist/protocols/evm/sky/index.cjs.map +1 -1
  58. package/dist/protocols/evm/sky/index.js +1 -1
  59. package/dist/protocols/evm/sky/index.js.map +1 -1
  60. package/dist/protocols/evm/uniswap-v4/index.cjs +1 -1
  61. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  62. package/dist/protocols/evm/uniswap-v4/index.js +1 -1
  63. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  64. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/core/defiProxy.ts","../../../../src/protocols/evm/aave-v4/api.ts","../../../../src/protocols/evm/aave-v4/spokeOnChain.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/aave-v4/multisign.ts","../../../../src/protocols/evm/aave-v4/userPositionsApi.ts","../../../../src/protocols/evm/aave-v4/positionActionsApi.ts","../../../../src/protocols/evm/aave-v4/loadSupportedChainIds.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/aave-v4/reserveDisplay.ts","../../../../src/protocols/evm/aave-v4/index.ts"],"names":["n","x","getAddress","defineChain","createPublicClient","http","gasLimitFromEstimateAndChainConfig","isAddress","all"],"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","/**\n * Optional browser → Next.js API proxy paths for DeFi upstream calls.\n * Set once from continuumdao-node-app client bootstrap.\n */\n\nlet aaveGraphqlProxyUrl: string | undefined\nlet eulerGraphqlProxyUrl: string | undefined\nlet mapleGraphqlProxyUrl: string | undefined\nlet morphoGraphqlProxyUrl: string | undefined\nlet coingeckoProxyUrl: string | undefined\n\nexport function setAaveGraphqlProxyUrl(url: string | undefined): void {\n aaveGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getAaveGraphqlProxyUrl(): string | undefined {\n return aaveGraphqlProxyUrl\n}\n\nexport function setEulerGraphqlProxyUrl(url: string | undefined): void {\n eulerGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getEulerGraphqlProxyUrl(): string | undefined {\n return eulerGraphqlProxyUrl\n}\n\nexport function setMapleGraphqlProxyUrl(url: string | undefined): void {\n mapleGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMapleGraphqlProxyUrl(): string | undefined {\n return mapleGraphqlProxyUrl\n}\n\nexport function setMorphoGraphqlProxyUrl(url: string | undefined): void {\n morphoGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoGraphqlProxyUrl(): string | undefined {\n return morphoGraphqlProxyUrl\n}\n\nexport function setCoingeckoProxyUrl(url: string | undefined): void {\n coingeckoProxyUrl = url?.trim() || undefined\n}\n\nexport function getCoingeckoProxyUrl(): string | undefined {\n return coingeckoProxyUrl\n}\n\nexport async function postJsonViaOptionalProxy<T>(args: {\n directUrl: string\n body: unknown\n proxyUrl?: string\n proxyEnvelope?: unknown\n}): Promise<T> {\n const proxy = args.proxyUrl?.trim()\n if (proxy) {\n const r = await fetch(proxy, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.proxyEnvelope ?? args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `Proxy HTTP ${r.status}: ${t.slice(0, 200)}` : `Proxy HTTP ${r.status}`)\n }\n return (await r.json()) as T\n }\n const r = await fetch(args.directUrl, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `HTTP ${r.status}: ${t.slice(0, 200)}` : `HTTP ${r.status}`)\n }\n return (await r.json()) as T\n}\n","import { getAddress, isAddress } from 'viem'\nimport { getAaveGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\n\nexport const AAVE_V4_GRAPHQL_URL = 'https://api.v4.aave.com/graphql'\n\ntype GqlError = { message?: string }\n\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nexport async function aaveV4Gql<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n const body = { query, variables: variables ?? {} }\n const j = await postJsonViaOptionalProxy<GqlData<T> & { errors?: GqlError[] }>({\n directUrl: AAVE_V4_GRAPHQL_URL,\n body,\n proxyUrl: getAaveGraphqlProxyUrl(),\n proxyEnvelope: body,\n })\n if (j.errors?.length) {\n const msg = j.errors.map((e) => e.message ?? 'Unknown').join('; ')\n throw new Error(msg)\n }\n if (j.data == null) {\n throw new Error('Aave V4 API: empty response')\n }\n return j.data\n}\n\ntype ChainRowV4 = { chainId: number; name?: string | null; nativeWrappedToken?: string | null }\n\nexport async function fetchAaveV4Chains(): Promise<readonly ChainRowV4[]> {\n const d = await aaveV4Gql<{ chains: ChainRowV4[] }>(`\n query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }\n `, { c: { query: { filter: 'ALL' } } })\n return d.chains ?? []\n}\n\n/**\n * Aave v4: supported EVM chain IDs (from {@link fetchAaveV4Chains}).\n */\nexport async function loadAaveV4SupportedChainIdsFromV4Api(): Promise<ReadonlySet<number>> {\n const rows = await fetchAaveV4Chains()\n const s = new Set<number>()\n for (const c of rows) s.add(c.chainId)\n return s\n}\n\nconst RESERVES_ADDRESS_FRAGMENT = `\n asset { underlying { address } }\n`\n\nexport type V4ReservesListRow = {\n id: string\n onChainId?: string | null\n spoke?: {\n address: string\n name?: string | null\n liquidationConfig?: { targetHealthFactor: string; healthFactorForMaxBonus: string } | null\n } | null\n summary: {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n }\n userState: {\n balance: { amount: { value: string; decimals: number } } | null\n borrowable?: { amount: { value: string; decimals: number } } | null\n } | null\n}\n\nexport function aggregateV4SupplyDisplay(\n symbolForDisplay: string,\n rows: readonly V4ReservesListRow[],\n): {\n depositedAmount: string\n apy: string\n totalDeposits: string\n availableLiquidity: string\n} {\n const sym = (symbolForDisplay ?? '').trim()\n const withSuffix = (n: string) => (n === '—' ? '—' : sym ? `${n} ${sym}` : n)\n\n if (!rows.length) {\n return { depositedAmount: '—', apy: '—', totalDeposits: '—', availableLiquidity: '—' }\n }\n\n const apy = formatV4SupplyApy(rows)\n\n const sumKey = (key: 'supplied' | 'borrowed') =>\n sumNumberValues(\n rows.map((r) => {\n const v = key === 'supplied' ? r.summary?.supplied?.amount : r.summary?.borrowed?.amount\n return (v?.value ?? '').trim()\n }),\n )\n\n const totalSupN = sumKey('supplied')\n const totalBorN = sumKey('borrowed')\n const totalDeposits =\n totalSupN == null ? '—' : withSuffix(formatAaveV4TokenAmount(totalSupN))\n\n const availableLiquidity = (() => {\n if (totalSupN == null || totalBorN == null) return '—'\n const a = totalSupN - totalBorN\n if (!Number.isFinite(a)) return '—'\n return withSuffix(formatAaveV4TokenAmount(a < 0 ? 0 : a))\n })()\n\n const userN = userSupplyBalanceNumber(rows)\n const depositedAmount = userN == null ? '—' : withSuffix(formatAaveV4TokenAmount(userN))\n\n return { depositedAmount, apy, totalDeposits, availableLiquidity }\n}\n\nfunction sumNumberValues(values: ReadonlyArray<string>): number | null {\n if (!values.length) return null\n let s = 0\n for (const v of values) {\n const n = parseFloat(v)\n if (Number.isFinite(n)) s += n\n }\n return s\n}\n\n/**\n * Formats a token notional for display: uses k (≥1k) and M (≥1M) with a few decimal places, otherwise limited decimals.\n * Safe to reuse outside the Aave V4 dialog (e.g. tables, tooltips).\n */\nexport function formatAaveV4TokenAmount(n: number): string {\n if (!Number.isFinite(n)) return '—'\n if (n === 0) return '0'\n const sign = n < 0 ? '-' : ''\n const a = Math.abs(n)\n const strip = (s: string) => s.replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, '')\n\n if (a >= 1_000_000) {\n return sign + strip((a / 1_000_000).toFixed(2)) + 'M'\n }\n if (a >= 1000) {\n const k = a / 1000\n const d = k >= 100 ? 1 : 2\n return sign + strip(k.toFixed(d)) + 'k'\n }\n if (a >= 1) {\n return sign + strip(a.toFixed(2))\n }\n if (a >= 0.0001) {\n return sign + strip(a.toFixed(4))\n }\n return sign + a.toExponential(2)\n}\n\n/**\n * Human-readable notional for Aave v4 API decimal strings (reserve amounts, user debt, etc.).\n * Use this for all “display from GraphQL `value`” paths so formatting stays consistent.\n */\nexport function formatAaveV4AmountHumanFromApiString(raw: string | null | undefined): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = parseFloat(s)\n if (!Number.isFinite(n)) return '—'\n return formatAaveV4TokenAmount(n)\n}\n\n/**\n * Unnamed reserve liquidity: supplied − borrowed (both API decimal strings, same unit).\n */\nexport function formatAaveV4ReserveLiquidityFromSummary(args: {\n suppliedValue: string | null | undefined\n borrowedValue: string | null | undefined\n}): string {\n const a = parseFloat(String(args.suppliedValue ?? '').trim())\n const b = parseFloat(String(args.borrowedValue ?? '').trim())\n if (!Number.isFinite(a) || !Number.isFinite(b)) return '—'\n return formatAaveV4TokenAmount(Math.max(0, a - b))\n}\n\nfunction userSupplyBalanceNumber(rows: readonly V4ReservesListRow[]): number | null {\n const vals = rows\n .map((r) => (r.userState?.balance?.amount?.value ?? '').trim())\n .filter((v) => v.length > 0)\n if (!vals.length) return null\n const u = new Set(vals)\n if (u.size === 1) {\n const n = parseFloat(vals[0]!)\n return Number.isFinite(n) ? n : null\n }\n const sum = vals.reduce((acc, b) => acc + (parseFloat(b) || 0), 0)\n return Number.isFinite(sum) ? sum : null\n}\n\nfunction formatV4SupplyApy(rows: readonly V4ReservesListRow[]): string {\n if (!rows.length) return '—'\n const weighted: { w: number; apy: number }[] = []\n for (const r of rows) {\n const sup = parseFloat((r.summary?.supplied?.amount?.value ?? '').trim())\n const norm = (r.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(norm)\n if (Number.isFinite(n) && Number.isFinite(sup) && sup > 0) {\n weighted.push({ w: sup, apy: n })\n }\n }\n if (weighted.length) {\n const tw = weighted.reduce((a, x) => a + x.w, 0)\n if (tw > 0) {\n const x = weighted.reduce((a, x) => a + x.w * x.apy, 0) / tw\n if (x >= 0.01) return `${x.toFixed(2)}%`\n if (x > 0) return `${x.toFixed(4)}%`\n return '0%'\n }\n }\n const any = (rows[0]?.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(any)\n if (!Number.isFinite(n)) return '—'\n if (n >= 0.01) return `${n.toFixed(2)}%`\n if (n > 0) return `${n.toFixed(4)}%`\n return '0%'\n}\n\nexport async function fetchAaveV4NativeWrappedToken(chainId: number): Promise<string | null> {\n const all = await fetchAaveV4Chains()\n const c = all.find((x) => x.chainId === chainId)\n const t = (c?.nativeWrappedToken ?? '').trim()\n if (t && isAddress(t)) return getAddress(t)\n return null\n}\n\n/**\n * All underlying token addresses (lowercased checksummed form for lookup: store lowercase) listed as reserves on the chain.\n */\nexport async function fetchAaveV4SupportedUnderlyingAddressSet(chainId: number): Promise<ReadonlySet<string>> {\n const d = await aaveV4Gql<{\n reserves: ReadonlyArray<{ asset: { underlying: { address: string } } }>\n }>(\n `\n query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }\n `,\n {\n r: {\n query: { chainIds: [chainId] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n const s = new Set<string>()\n for (const r of d.reserves ?? []) {\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (a && isAddress(a)) s.add(a.toLowerCase())\n }\n return s\n}\n\nfunction erc20Input(address: `0x${string}`, chainId: number) {\n return { address, chainId }\n}\n\nexport async function fetchAaveV4ReservesForUnderlying(args: {\n chainId: number\n underlying: `0x${string}`\n user?: `0x${string}` | null\n}): Promise<readonly V4ReservesListRow[]> {\n const d = await aaveV4Gql<{ reserves: V4ReservesListRow[] }>(\n `\n query S($r: ReservesRequest!) {\n reserves(request: $r) {\n id\n onChainId\n spoke { address name liquidationConfig { targetHealthFactor healthFactorForMaxBonus } }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n }\n userState {\n balance { amount { value decimals } }\n borrowable { amount { value decimals } }\n }\n }\n }\n `,\n {\n r: {\n query: { tokens: [erc20Input(args.underlying, args.chainId)] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n ...(args.user ? { user: args.user } : {}),\n },\n },\n )\n return d.reserves ?? []\n}\n\n/**\n * Reserve row for a hub asset on the same Aave v4 **Spoke** as the user’s collateral (same as {@link useAaveV4DepositCollateralInfo}’s `collateralForAsset`).\n * Needed so borrow/repay multi-sign uses the same spoke as the user’s position.\n */\nexport function pickAaveV4ReserveRowForSpoke(\n rows: readonly V4ReservesListRow[],\n spokeAddress: `0x${string}`,\n): V4ReservesListRow | null {\n const want = getAddress(spokeAddress).toLowerCase()\n for (const r of rows) {\n const a = (r.spoke?.address ?? '').trim()\n if (!a) continue\n try {\n if (getAddress(a as `0x${string}`).toLowerCase() === want) return r\n } catch {\n continue\n }\n }\n return null\n}\n\nexport function aaveV4KeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n\ntype AaveV4ChainTokenCache = {\n supportedUnderlying: ReadonlySet<string>\n nativeWrapped: string | null\n}\n\nconst aaveV4ChainTokenCache = new Map<number, Promise<AaveV4ChainTokenCache>>()\n\n/**\n * Fetches and caches (per process) the list of Aave v4 underlying addresses on a chain and the wrapped native token.\n */\nexport function ensureAaveV4ChainTokenCache(chainId: number): Promise<AaveV4ChainTokenCache> {\n const hit = aaveV4ChainTokenCache.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const [nativeWrapped, supportedUnderlying] = await Promise.all([\n fetchAaveV4NativeWrappedToken(chainId),\n fetchAaveV4SupportedUnderlyingAddressSet(chainId),\n ])\n return { supportedUnderlying, nativeWrapped }\n })()\n aaveV4ChainTokenCache.set(chainId, p)\n return p\n}\n\n// —— Hubs, collateral, borrowable (per UI “market” / Aave v4 pool) ——————————————\n\n/** UI market segment; maps to Aave v4 `Hub` by name (e.g. Plus ≈ “Main”, Core, Prime ≈ “Bluechip”). */\nexport type AaveV4UiMarketId = 'main' | 'core' | 'bluechip'\n\nexport type AaveV4Hub = {\n name: string\n address: `0x${string}`\n chain: { chainId: number; name?: string | null }\n}\n\n/** `summary` is included for hub `reserves` (market borrow/supply TVL, APYs). */\nexport type AaveV4HubReserveSummary = {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n borrowApy: { normalized: string; value: string }\n}\n\nexport type AaveV4HubReserve = {\n canBorrow: boolean\n canUseAsCollateral: boolean\n canSupply: boolean\n /** Spoke contract to call for `supply` on this reserve. */\n spoke: { address: string } | null\n settings: {\n borrowable: boolean\n collateral: boolean\n collateralFactor: { normalized: string; value: string }\n collateralRisk: { normalized: string; value: string }\n }\n asset: {\n underlying: {\n address: string\n info: { name: string; symbol: string; icon: string | null } | null\n }\n }\n /** Present when using the extended hub reserves query (borrow tab, market TVL). */\n summary?: AaveV4HubReserveSummary | null\n}\n\nconst aaveV4HubsByChain = new Map<number, Promise<readonly AaveV4Hub[]>>()\nconst aaveV4HubReserves = new Map<string, Promise<readonly AaveV4HubReserve[]>>()\n\nfunction hubReservesKey(chainId: number, hub: `0x${string}`) {\n return `v3spoke+summary:${chainId}:${hub.toLowerCase()}`\n}\n\nexport async function fetchAaveV4HubsForChain(chainId: number): Promise<readonly AaveV4Hub[]> {\n const hit = aaveV4HubsByChain.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ hubs: AaveV4Hub[] }>(\n `query F($h: HubsRequest!) { hubs(request: $h) { name address chain { chainId name } } }`,\n { h: { query: { chainIds: [chainId] } } },\n )\n const out = (d.hubs ?? []).map((h) => ({\n name: h.name,\n address: getAddress((h.address ?? '').trim() as `0x${string}`) as `0x${string}`,\n chain: h.chain,\n }))\n return out\n })()\n aaveV4HubsByChain.set(chainId, p)\n return p\n}\n\n/**\n * Resolves which Aave v4 hub (Core / Plus / Prime, etc.) a UI “market” refers to.\n * Main → Plus, Core → Core, Bluechip → Prime.\n */\nexport function resolveAaveV4HubForUiMarket(\n hubs: readonly AaveV4Hub[],\n market: AaveV4UiMarketId,\n chainId: number,\n): AaveV4Hub | null {\n const on = hubs.filter((h) => h.chain.chainId === chainId)\n if (!on.length) return null\n const find = (names: string[]) => {\n const set = new Set(names.map((n) => n.toLowerCase()))\n return on.find((h) => set.has((h.name ?? '').trim().toLowerCase())) ?? null\n }\n if (market === 'core') return find(['core'])\n if (market === 'bluechip') return find(['prime', 'bluechip', 'institutional'])\n // main: prefer Plus; fall back to common names, then first hub\n return find(['plus', 'main', 'default']) ?? on[0] ?? null\n}\n\n/**\n * Inverse of {@link resolveAaveV4HubForUiMarket} label mapping, for switching UI market when a hub is chosen by\n * “first hub on chain that lists this underlying”.\n */\nexport function aaveV4UiMarketIdForHubName(hubName: string): AaveV4UiMarketId {\n const n = (hubName ?? '').trim().toLowerCase()\n if (n === 'core') return 'core'\n if (n === 'plus' || n === 'main' || n === 'default') return 'main'\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 'bluechip'\n return 'main'\n}\n\n/**\n * When more than one hub lists the same underlying, the ideal hub is the one that matches the user’s *actual*\n * position (supply/debt on that hub’s Spoke). We don’t have that signal here, so we use a **deterministic** order after\n * {@link aaveV4UiMarketIdForHubName}: Core → Main/Plus → Bluechip/Prime (then name) so the choice is not tied to\n * GraphQL list order. Callers with wallet/user data can later prefer a hub whose Spoke appears in\n * `fetchAaveV4ReservesForUnderlying` with non-zero `userState`.\n */\nfunction aaveV4HubAutoPickTiebreakOrder(a: AaveV4Hub, b: AaveV4Hub): number {\n const rank = (name: string) => {\n const n = (name ?? '').trim().toLowerCase()\n if (n === 'core') return 0\n if (n === 'plus' || n === 'main' || n === 'default') return 1\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 2\n return 3\n }\n const ra = rank(a.name)\n const rb = rank(b.name)\n if (ra !== rb) return ra - rb\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n}\n\ntype AaveV4HubCollateralCandidate = {\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n}\n\n/**\n * Sort key for “which borrow is cheaper” on a **debt** reserve row. Lower is better; missing data sorts last.\n */\nfunction aaveV4HubReserveBorrowApyForSort(r: AaveV4HubReserve | null | undefined): number {\n if (!r) return Number.POSITIVE_INFINITY\n const norm = parseFloat((r.summary?.borrowApy?.normalized ?? '').trim())\n if (Number.isFinite(norm) && norm >= 0) return norm\n const v = parseFloat((r.summary?.borrowApy?.value ?? '').trim())\n if (Number.isFinite(v) && v >= 0) {\n if (v > 0 && v <= 1) return v * 100\n return v\n }\n return Number.POSITIVE_INFINITY\n}\n\n/**\n * `summary.suppliable` on a reserve is pool liquidity for borrowing that asset (human-notional, same units as\n * {@link formatAaveV4AmountHumanFromApiString}).\n */\nfunction aaveV4SuppliableHumanFromHubReserve(r: AaveV4HubReserve | null | undefined): number | null {\n if (!r) return null\n const n = parseFloat((r.summary?.suppliable?.amount?.value ?? '').trim())\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\n/**\n * The selected UI market maps to a single hub, but a token may only be listed in another hub (e.g. WETH in Core, not\n * Plus on Ethereum). Returns a hub on this chain where this underlying appears in hub reserves, so Spoke and\n * collateral can be resolved.\n *\n * **When no debt hint:** `preferHub` is tried first, then other hubs in {@link aaveV4HubAutoPickTiebreakOrder} order.\n *\n * **When `debtUnderlying` is set (user chose a debt asset on the borrow flow):** among hubs that list **both** the\n * **collateral** and that **debt** as borrowable, the hub with the **lowest debt borrow APY** is chosen. If\n * `debtBorrowAmountHumanForLiquidity` is a positive number string, we **prefer** hubs where `suppliable` on the debt\n * reserve is at least that amount; if none satisfy that, the lowest-APY hub among all debt-backed candidates is\n * used anyway.\n */\nexport async function findAaveV4HubReserveForChainUnderlying(args: {\n chainId: number\n hubs: readonly AaveV4Hub[]\n underlying: `0x${string}`\n /** Tried first; if the asset is not listed here, other hubs on the same chain are scanned. */\n preferHub: AaveV4Hub\n /** If set, disambiguate using this debt asset’s `borrowAPY` (and optional liquidity) per hub. */\n debtUnderlying?: `0x${string}` | null\n /**\n * When set, used with `debtUnderlying` to prefer hubs with enough `suppliable` on the debt line for a borrow\n * of that size (human amount; commas may be included).\n */\n debtBorrowAmountHumanForLiquidity?: string | null\n}): Promise<{\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n} | null> {\n const onChain = args.hubs.filter((h) => h.chain.chainId === args.chainId)\n if (!onChain.length) return null\n const prefer = getAddress(args.preferHub.address) as `0x${string}`\n const order = (() => {\n const rest = onChain\n .filter((h) => getAddress(h.address) !== prefer)\n .sort(aaveV4HubAutoPickTiebreakOrder)\n const first = onChain.find((h) => getAddress(h.address) === prefer)\n return first ? [first, ...rest] : rest\n })()\n\n const candidates: AaveV4HubCollateralCandidate[] = []\n for (const h of order) {\n const rows = await fetchAaveV4HubReserves({ chainId: args.chainId, hubAddress: h.address as `0x${string}` })\n const c = findHubReserveForUnderlying(rows, args.underlying)\n if (c) candidates.push({ hub: h, hubReserves: rows, reserve: c })\n }\n if (!candidates.length) return null\n\n const noDebt = (): AaveV4HubCollateralCandidate => candidates[0]!\n\n const rawDebt = (args.debtUnderlying ?? '').trim()\n if (!rawDebt || !isAddress(rawDebt)) {\n return noDebt()\n }\n const debtU = getAddress(rawDebt) as `0x${string}`\n\n const withDebt = candidates\n .map((c) => {\n const dr = findHubReserveForUnderlying(c.hubReserves, debtU)\n return { ...c, debtReserve: dr }\n })\n .filter(\n (x): x is AaveV4HubCollateralCandidate & { debtReserve: AaveV4HubReserve } =>\n x.debtReserve != null &&\n x.debtReserve.canBorrow === true &&\n x.debtReserve.settings?.borrowable === true,\n )\n if (!withDebt.length) {\n return noDebt()\n }\n\n const amountRaw = (args.debtBorrowAmountHumanForLiquidity ?? '')\n .trim()\n .replace(/,/g, '')\n const wantN = amountRaw && parseFloat(amountRaw) > 0 ? parseFloat(amountRaw) : null\n\n const sortKey = (a: (typeof withDebt)[0], b: (typeof withDebt)[0]): number => {\n const d = aaveV4HubReserveBorrowApyForSort(a.debtReserve) - aaveV4HubReserveBorrowApyForSort(b.debtReserve)\n if (d !== 0) return d\n const pa = getAddress(a.hub.address) === prefer ? 0 : 1\n const pb = getAddress(b.hub.address) === prefer ? 0 : 1\n if (pa !== pb) return pa - pb\n return aaveV4HubAutoPickTiebreakOrder(a.hub, b.hub)\n }\n\n if (wantN == null) {\n withDebt.sort(sortKey)\n const x = withDebt[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n }\n\n const sufficient = withDebt.filter((c) => {\n const s = aaveV4SuppliableHumanFromHubReserve(c.debtReserve)\n return s != null && s + 1e-9 >= wantN\n })\n const pool = sufficient.length ? sufficient : withDebt\n pool.sort(sortKey)\n const x = pool[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n}\n\nexport async function fetchAaveV4HubReserves(args: { chainId: number; hubAddress: `0x${string}` }): Promise<readonly AaveV4HubReserve[]> {\n const h = getAddress(args.hubAddress) as `0x${string}`\n const k = hubReservesKey(args.chainId, h)\n const hit = aaveV4HubReserves.get(k)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ reserves: AaveV4HubReserve[] }>(\n `query R($r: ReservesRequest!) {\n reserves(request: $r) {\n canBorrow\n canSupply\n canUseAsCollateral\n spoke { address }\n settings {\n borrowable\n collateral\n collateralFactor { normalized value }\n collateralRisk { normalized value }\n }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n borrowApy { normalized value }\n }\n asset { underlying { address info { name symbol icon } } }\n }\n }`,\n {\n r: {\n query: { hub: { address: h, chainId: args.chainId } },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n return d.reserves ?? []\n })()\n aaveV4HubReserves.set(k, p)\n return p\n}\n\n/**\n * LTV you can borrow against a unit of this asset, e.g. \"90%\".\n */\nexport function formatAaveV4PercentDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = (normalized ?? '').trim()\n if (n) {\n const f = parseFloat(n)\n if (!Number.isFinite(f)) return '—'\n if (f === 0) return '—'\n if (f % 1 === 0) return `${f.toFixed(0)}%`\n return `${f >= 10 ? f.toFixed(0) : f >= 1 ? f.toFixed(1).replace(/\\.0$/, '') : f.toFixed(2).replace(/\\.?0+$/, '')}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${Math.round(v * 100)}%`\n }\n return '—'\n}\n\n/**\n * Collateral / protocol risk on the same 0–100 style scale as the API, or a plain label if zero/empty.\n */\nexport function formatAaveV4RiskDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = parseFloat((normalized ?? '').trim())\n if (Number.isFinite(n) && n > 0) {\n return n >= 0.01 ? `${n.toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%` : `${n.toFixed(4)}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${(v * 100).toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%`\n }\n return 'Low'\n}\n\nexport function findHubReserveForUnderlying(\n list: readonly AaveV4HubReserve[],\n underlying: `0x${string}`,\n): AaveV4HubReserve | null {\n const t = getAddress(underlying).toLowerCase()\n return list.find((r) => (r.asset?.underlying?.address ?? '').toLowerCase() === t) ?? null\n}\n\nexport type AaveV4BorrowableDisplay = {\n address: string\n symbol: string\n name: string\n icon: string | null\n}\n\n/**\n * De-duplicated borrowable debt assets in a hub (what users can borrow there).\n */\nexport function borrowableAssetsFromHubReserves(rows: readonly AaveV4HubReserve[]): AaveV4BorrowableDisplay[] {\n const seen = new Set<string>()\n const out: AaveV4BorrowableDisplay[] = []\n for (const r of rows) {\n if (!r.canBorrow || !r.settings?.borrowable) continue\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (!a || !isAddress(a)) continue\n const lo = a.toLowerCase()\n if (seen.has(lo)) continue\n seen.add(lo)\n const info = r.asset?.underlying?.info\n out.push({\n address: getAddress(a as `0x${string}`),\n symbol: (info?.symbol ?? '—').trim() || '—',\n name: (info?.name ?? '').trim() || '—',\n icon: (info?.icon ?? '').trim() || null,\n })\n }\n out.sort((p, q) => p.symbol.localeCompare(q.symbol, undefined, { sensitivity: 'base' }))\n return out\n}\n\nconst USER_BORROWS_HUB = `\n query AaveV4UserBorrowsHub($r: UserBorrowsRequest!) {\n userBorrows(request: $r) {\n debt { amount { value } }\n reserve {\n asset { underlying { address } }\n }\n }\n }\n`\n\n/**\n * Current variable-debt balance per underlying token for this user in the given hub (one entry per asset).\n * Values are API decimal strings; format with {@link formatAaveV4AmountHumanFromApiString}.\n */\nexport async function fetchAaveV4UserBorrowsDebtByUnderlyingForHub(args: {\n user: `0x${string}`\n chainId: number\n hubAddress: `0x${string}`\n}): Promise<ReadonlyMap<string, string>> {\n const u = getAddress(args.user)\n const h = getAddress(args.hubAddress) as `0x${string}`\n const d = await aaveV4Gql<{\n userBorrows: {\n debt: { amount: { value: string } } | null\n reserve: { asset: { underlying: { address: string } } } | null\n }[]\n }>(USER_BORROWS_HUB, {\n r: {\n query: {\n userHub: {\n user: u,\n hub: { input: { address: h, chainId: args.chainId } },\n },\n },\n orderBy: { amount: 'DESC' },\n includeZeroBalances: false,\n },\n })\n const m = new Map<string, string>()\n for (const row of d.userBorrows ?? []) {\n const addr = (row?.reserve?.asset?.underlying?.address ?? '').trim()\n if (!addr) continue\n const lo = getAddress(addr as `0x${string}`).toLowerCase()\n const v = (row?.debt?.amount?.value ?? '').trim()\n if (!v) continue\n const n = parseFloat(v)\n if (!Number.isFinite(n) || n === 0) continue\n const prev = m.get(lo)\n if (prev) {\n const p = parseFloat(prev)\n m.set(lo, String((Number.isFinite(p) ? p : 0) + n))\n } else {\n m.set(lo, v)\n }\n }\n return m\n}\n\nexport type AaveV4BorrowTableRow = {\n address: string\n symbol: string\n name: string\n icon: string | null\n yourBorrowedDisplay: string\n baseBorrowApyDisplay: string\n totalBorrowsDisplay: string\n liquidityDisplay: string\n}\n\n/**\n * One row per borrowable asset in the hub, using shared human-readable formatters.\n */\nexport function buildAaveV4BorrowTableRowsFromHub(\n borrowable: readonly AaveV4BorrowableDisplay[],\n hubReserves: readonly AaveV4HubReserve[] | null,\n /** `undefined` = not loaded or no wallet (show em dash for “your” column). */\n debtByUnderlying: ReadonlyMap<string, string> | undefined,\n): AaveV4BorrowTableRow[] {\n if (!hubReserves?.length) {\n return borrowable.map((b) => ({\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: debtByUnderlying === undefined ? '—' : `0${b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''}`,\n baseBorrowApyDisplay: '—',\n totalBorrowsDisplay: '—',\n liquidityDisplay: '—',\n }))\n }\n return borrowable.map((b) => {\n const lo = b.address.toLowerCase()\n const r = hubReserves.find((x) => (x.asset?.underlying?.address ?? '').toLowerCase() === lo) ?? null\n const s = r?.summary\n const debtRaw = debtByUnderlying?.get(lo) ?? null\n const symSuffix = b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''\n return {\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: (() => {\n if (debtByUnderlying === undefined) return '—'\n if (debtRaw == null || !String(debtRaw).trim()) return `0${symSuffix}`\n const n = parseFloat(String(debtRaw).trim())\n if (!Number.isFinite(n) || n === 0) return `0${symSuffix}`\n return `${formatAaveV4AmountHumanFromApiString(debtRaw)}${symSuffix}`\n })(),\n baseBorrowApyDisplay: formatAaveV4PercentDisplay(\n s?.borrowApy?.normalized,\n s?.borrowApy?.value,\n ),\n totalBorrowsDisplay: s\n ? `${formatAaveV4AmountHumanFromApiString(s.borrowed?.amount?.value)}${symSuffix}`\n : '—',\n liquidityDisplay: s\n ? `${formatAaveV4ReserveLiquidityFromSummary({\n suppliedValue: s.supplied?.amount?.value,\n borrowedValue: s.borrowed?.amount?.value,\n })}${symSuffix}`\n : '—',\n }\n })\n}\n","import { type Address, createPublicClient, defineChain, getAddress, http } from 'viem'\nimport { isValidRpcUrl } from '@continuumdao/continuum-node-sdk'\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","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string, purposeSuffix?: string): string {\n const t = purposeText.trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport { type KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\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\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\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 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 marketLabel = String(args.market)\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit'\n ? AAVE_WETH_DEPOSIT_FALLBACK\n : s.kind === 'approve'\n ? AAVE_ERC20_APPROVE_FALLBACK\n : s.kind === 'set_collateral'\n ? AAVE_SPOKE_SET_USING_AS_COLLATERAL_FALLBACK\n : AAVE_SPOKE_SUPPLY_ESTIMATE_FALLBACK,\n }))\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 const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n buildBatchMeta: ({ index, gasLimit }) => {\n const s = steps[index]!\n if (s.kind === 'weth_deposit') {\n return {\n signatureText: JSON.stringify({\n kind: '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 }\n if (s.kind === 'approve') {\n return {\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 }\n if (s.kind === 'set_collateral') {\n return {\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: {\n market: marketLabel,\n asset,\n spoke,\n reserveId: reserveId.toString(),\n gasBuildSetCollateral: { baseGasUnits: gasLimit.toString() },\n },\n }\n }\n return {\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: gasLimit.toString() },\n },\n }\n },\n })\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 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 keyGen: args.keyGen,\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 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 keyGen: args.keyGen,\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 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 marketLabel = String(args.market)\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'approve' ? AAVE_ERC20_APPROVE_FALLBACK : AAVE_SPOKE_REPAY_ESTIMATE_FALLBACK,\n }))\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 const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n buildBatchMeta: ({ index, gasLimit }) => {\n const s = steps[index]!\n if (s.kind === 'approve') {\n return {\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 }\n return {\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: gasLimit.toString() },\n },\n }\n },\n })\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 to = getAddress(args.to)\n const executor = getAddress(args.executorAddress)\n return buildEvmMultisignBodyAaveV4OneStep({\n keyGen: args.keyGen,\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 to = getAddress(args.to)\n const executor = getAddress(args.executorAddress)\n return buildEvmMultisignBodyAaveV4OneStep({\n keyGen: args.keyGen,\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 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 keyGen: args.keyGen,\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 keyGen: KeyGenSubsetForPermit\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 firstDataNo0x = args.v.data.startsWith('0x') ? args.v.data.slice(2) : args.v.data\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: args.executorAddress,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: [\n {\n to: args.v.to,\n data: args.v.data,\n value: args.v.value,\n fallbackGas: args.estimateGasFallback,\n },\n ],\n purposeSuffix: args.purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: args.v.to,\n buildBatchMeta: ({ gasLimit }) => args.buildBatchMeta({ gasLimit }),\n })\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 { getAddress, isAddress } from 'viem'\nimport { aaveV4Gql } from './api.js'\nimport { formatAaveV4PercentDisplay } from './api.js'\n\nconst POSITIONS_LIST = `\n query AaveUserPositions($r: UserPositionsRequest!, $currency: Currency! = USD, $w: TimeWindow! = LAST_DAY) {\n userPositions(request: $r) {\n id\n user\n createdAt\n spoke {\n id\n name\n address\n chain {\n chainId\n name\n }\n liquidationConfig {\n targetHealthFactor\n healthFactorForMaxBonus\n }\n }\n totalSupplied(currency: $currency) {\n current { value name symbol }\n }\n totalDebt(currency: $currency) {\n current { value name symbol }\n }\n netBalance(currency: $currency) {\n current { value name symbol }\n }\n healthFactor {\n current\n change(window: $w) {\n normalized\n value\n }\n }\n netApy {\n normalized\n value\n }\n }\n }\n`\n\nconst POSITION_DETAIL = `\n query AaveUserPosition(\n $r: UserPositionRequest!\n $currency: Currency! = USD\n $w: TimeWindow! = LAST_DAY\n ) {\n userPosition(request: $r) {\n id\n user\n createdAt\n spoke {\n id\n name\n address\n chain {\n chainId\n name\n }\n liquidationConfig {\n targetHealthFactor\n healthFactorForMaxBonus\n }\n }\n totalSupplied(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n totalCollateral(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n totalDebt(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n netBalance(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n netCollateral(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n netApy {\n normalized\n value\n }\n netSupplyApy {\n current {\n normalized\n }\n }\n netBorrowApy {\n current {\n normalized\n }\n }\n netAccruedInterest(currency: $currency) {\n value\n name\n symbol\n }\n healthFactor {\n current\n change(window: $w) {\n normalized\n value\n }\n }\n maxBorrowingPower(currency: $currency) {\n value\n name\n symbol\n }\n remainingBorrowingPower(currency: $currency) {\n value\n name\n symbol\n }\n averageCollateralFactor {\n normalized\n }\n liquidationPrice(currency: $currency) {\n value\n name\n symbol\n }\n canUpdateDynamicConfig\n netBalancePercentChange(window: $w) {\n normalized\n }\n }\n }\n`\n\nconst USER_SUPPLIES = `\n query AaveUserSupplies($r: UserSuppliesRequest!) {\n userSupplies(request: $r) {\n id\n isCollateral\n principal {\n amount {\n value\n }\n token {\n address\n info {\n symbol\n name\n icon\n }\n }\n }\n balance {\n amount {\n value\n }\n token {\n address\n info {\n symbol\n name\n }\n }\n }\n withdrawable {\n amount {\n value\n }\n token {\n address\n info {\n symbol\n }\n }\n }\n interest {\n amount {\n value\n }\n token {\n address\n info {\n symbol\n }\n }\n }\n reserve {\n id\n onChainId\n summary {\n supplyApy {\n normalized\n value\n }\n }\n asset {\n underlying {\n address\n info {\n symbol\n name\n icon\n }\n }\n }\n }\n }\n }\n`\n\nexport type AaveV4ExchangeAmount = { value: string; name: string; symbol: string }\n\nexport type AaveV4SpokeLiquidationConfig = {\n targetHealthFactor: string\n healthFactorForMaxBonus: string\n}\n\nexport type AaveV4UserPositionRow = {\n id: string\n user: string\n createdAt: string\n spoke: {\n id: string\n name: string\n address: string\n chain: { chainId: number; name?: string | null }\n liquidationConfig: AaveV4SpokeLiquidationConfig | null\n }\n totalSupplied: { current: AaveV4ExchangeAmount }\n totalDebt: { current: AaveV4ExchangeAmount }\n netBalance: { current: AaveV4ExchangeAmount }\n healthFactor: { current: string | null; change: { normalized: string; value: string } }\n netApy: { normalized: string; value: string }\n}\n\nexport type AaveV4UserPositionDetail = {\n id: string\n user: string\n createdAt: string\n spoke: AaveV4UserPositionRow['spoke']\n totalSupplied: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n totalCollateral: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n totalDebt: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n netBalance: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n netCollateral: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n netApy: { normalized: string; value: string }\n netSupplyApy: { current: { normalized: string } }\n netBorrowApy: { current: { normalized: string } }\n netAccruedInterest: AaveV4ExchangeAmount\n healthFactor: { current: string | null; change: { normalized: string; value: string } }\n maxBorrowingPower: AaveV4ExchangeAmount\n remainingBorrowingPower: AaveV4ExchangeAmount\n averageCollateralFactor: { normalized: string }\n liquidationPrice: AaveV4ExchangeAmount | null\n canUpdateDynamicConfig: boolean\n netBalancePercentChange: { normalized: string }\n}\n\ntype Erc20TokenInfo = { symbol: string; name: string; icon: string | null } | null\n\nexport type AaveV4UserSupplyRow = {\n id: string\n isCollateral: boolean\n principal: {\n amount: { value: string }\n token: { address: string; info: Erc20TokenInfo }\n }\n balance: {\n amount: { value: string }\n token: { address: string; info: { symbol: string; name?: string } | null }\n }\n withdrawable: {\n amount: { value: string }\n token: { address: string; info: { symbol: string } | null }\n }\n interest: {\n amount: { value: string }\n token: { address: string; info: { symbol: string } | null }\n }\n reserve: {\n id: string\n onChainId?: string | null\n summary: { supplyApy: { normalized: string; value: string } | null } | null\n asset: {\n underlying: {\n address: string\n info: Erc20TokenInfo\n }\n }\n }\n}\n\nconst DEFAULT_CURRENCY = 'USD'\nconst DEFAULT_TIME_WINDOW = 'LAST_DAY'\n\nexport function formatAaveV4ExchangeLabel(ex: { name?: string; symbol?: string } | null | undefined): string {\n if (ex == null) return '—'\n const sym = (ex.symbol ?? '').trim()\n const name = (ex.name ?? '').trim()\n if (sym === '$' && name) return name\n if (name && sym && name.toUpperCase() !== sym) return name\n return sym || name || '—'\n}\n\nexport function formatAaveV4PositionPercent(\n normalized: string | undefined,\n value: string | undefined,\n): string {\n const n = (normalized ?? '').trim()\n const v = (value ?? '').trim()\n if (n === '0' && (v === '0' || v === '')) return '0%'\n const out = formatAaveV4PercentDisplay(normalized, value)\n return out\n}\n\nexport function formatAaveV4PositionHealthFactor(raw: string | null | undefined): string {\n if (raw == null || String(raw).trim() === '') return '∞'\n return formatAaveV4HealthFactorInner(raw)\n}\n\nfunction formatAaveV4HealthFactorInner(raw: string): string {\n const n = Number(raw)\n if (!Number.isFinite(n)) return String(raw)\n if (n >= 1e12) return '∞'\n return n >= 10 ? n.toFixed(1) : n.toFixed(2)\n}\n\nfunction buildUserPositionsRequest(\n user: `0x${string}`,\n filter: { chainIds: number[] } | { tokens: { address: `0x${string}`; chainId: number }[] },\n) {\n return {\n user,\n filter,\n orderBy: { balance: 'DESC' as const },\n }\n}\n\nexport async function fetchAaveV4UserPositionsForChain(args: {\n user: string\n chainId: number\n}): Promise<readonly AaveV4UserPositionRow[]> {\n const u = (args.user ?? '').trim()\n if (!u || !isAddress(u)) return []\n const user = getAddress(u as `0x${string}`)\n const d = await aaveV4Gql<{ userPositions: AaveV4UserPositionRow[] }>(POSITIONS_LIST, {\n r: buildUserPositionsRequest(user, { chainIds: [args.chainId] }),\n currency: DEFAULT_CURRENCY,\n w: DEFAULT_TIME_WINDOW,\n })\n return d.userPositions ?? []\n}\n\nexport type AaveV4UserPositionsByAsset = {\n forAsset: readonly AaveV4UserPositionRow[]\n other: readonly AaveV4UserPositionRow[]\n filterUnderlying: `0x${string}` | null\n}\n\nexport async function fetchAaveV4UserPositionsByAssetOnChain(args: {\n user: string\n chainId: number\n filterUnderlying: `0x${string}` | null\n}): Promise<AaveV4UserPositionsByAsset> {\n const u = (args.user ?? '').trim()\n if (!u || !isAddress(u)) {\n return { forAsset: [], other: [], filterUnderlying: null }\n }\n const user = getAddress(u as `0x${string}`)\n const c = args.chainId\n const f = args.filterUnderlying\n if (f == null) {\n const all = await fetchAaveV4UserPositionsForChain({ user: u, chainId: c })\n return { forAsset: all, other: [], filterUnderlying: null }\n }\n const token = getAddress(f)\n const [allRes, withTokenRes] = await Promise.all([\n aaveV4Gql<{ userPositions: AaveV4UserPositionRow[] }>(POSITIONS_LIST, {\n r: buildUserPositionsRequest(user, { chainIds: [c] }),\n currency: DEFAULT_CURRENCY,\n w: DEFAULT_TIME_WINDOW,\n }),\n aaveV4Gql<{ userPositions: AaveV4UserPositionRow[] }>(POSITIONS_LIST, {\n r: buildUserPositionsRequest(user, { tokens: [{ address: token, chainId: c }] }),\n currency: DEFAULT_CURRENCY,\n w: DEFAULT_TIME_WINDOW,\n }),\n ])\n const all = allRes.userPositions ?? []\n const forAsset = withTokenRes.userPositions ?? []\n const want = new Set(forAsset.map((p) => p.id))\n const other = all.filter((p) => !want.has(p.id))\n return { forAsset, other, filterUnderlying: token }\n}\n\nexport async function fetchAaveV4UserPositionById(positionId: string): Promise<AaveV4UserPositionDetail | null> {\n const id = (positionId ?? '').trim()\n if (!id) return null\n const d = await aaveV4Gql<{ userPosition: AaveV4UserPositionDetail | null }>(POSITION_DETAIL, {\n r: { id },\n currency: DEFAULT_CURRENCY,\n w: DEFAULT_TIME_WINDOW,\n })\n return d.userPosition ?? null\n}\n\nexport async function fetchAaveV4UserSuppliesForPosition(userPositionId: string): Promise<readonly AaveV4UserSupplyRow[]> {\n const pid = (userPositionId ?? '').trim()\n if (!pid) return []\n const d = await aaveV4Gql<{ userSupplies: AaveV4UserSupplyRow[] }>(USER_SUPPLIES, {\n r: {\n query: { userPositionId: pid },\n orderBy: { amount: 'DESC' },\n includeZeroBalances: false,\n },\n })\n return d.userSupplies ?? []\n}\n\n/**\n * True when the wallet has a positive supplied balance of `contextUnderlying` on this Spoke **and** the index marks\n * it as used as collateral (`isCollateral`). Use this to gate **new borrows**; **repay** should rely on variable debt\n * only, so users can repay after turning collateral off.\n */\nexport async function aaveV4UserHasAvailableBorrowCollateralForContextOnSpoke(args: {\n user: `0x${string}`\n chainId: number\n contextUnderlying: `0x${string}`\n spokeAddress: `0x${string}`\n}): Promise<boolean> {\n let wantSpoke: string\n try {\n wantSpoke = getAddress(args.spokeAddress).toLowerCase()\n } catch {\n return false\n }\n const u0 = getAddress(args.contextUnderlying).toLowerCase()\n\n const positions = await fetchAaveV4UserPositionsForChain({ user: args.user, chainId: args.chainId })\n const pos = positions.find((p) => {\n const a = (p.spoke?.address ?? '').trim()\n if (!a) return false\n try {\n return getAddress(a as `0x${string}`).toLowerCase() === wantSpoke\n } catch {\n return false\n }\n })\n if (!pos) return false\n\n const supplies = await fetchAaveV4UserSuppliesForPosition(pos.id)\n const row = supplies.find((s) => {\n const a = (s.reserve?.asset?.underlying?.address ?? '').trim()\n if (!a) return false\n try {\n return getAddress(a as `0x${string}`).toLowerCase() === u0\n } catch {\n return false\n }\n })\n if (!row) return false\n const bal = parseFloat((row.balance?.amount?.value ?? '').trim())\n if (!Number.isFinite(bal) || bal <= 0) return false\n return row.isCollateral === true\n}\n\nexport function formatAaveV4DecimalString(raw: string | undefined | null, maxFractionDigits = 6): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = Number(s)\n if (!Number.isFinite(n)) return s\n if (Math.abs(n) >= 1e9) return n.toExponential(2)\n return n.toLocaleString(undefined, { maximumFractionDigits: maxFractionDigits })\n}\n\n/**\n * For risk / borrow notional: show enough digits for small positive USD (or fiat) so values like\n * 0.0034 don’t get lost; keep net balance in {@link formatAaveV4DecimalString} for larger numbers.\n */\nexport function formatAaveV4RiskNotionalString(raw: string | undefined | null): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = Number(s)\n if (!Number.isFinite(n)) return s\n if (n === 0) return '0'\n if (Math.abs(n) >= 1e9) return n.toExponential(2)\n if (n > 0 && n < 0.5) {\n return n.toLocaleString(undefined, { maximumSignificantDigits: 4, maximumFractionDigits: 8 })\n }\n return n.toLocaleString(undefined, { maximumFractionDigits: 6 })\n}\n\nexport function formatAaveV4HealthFactor(raw: string | null | undefined): string {\n if (raw == null || String(raw).trim() === '') return '—'\n return formatAaveV4HealthFactorInner(String(raw).trim())\n}\n\nconst HF_EPS = 1e-9\n\nexport type AaveV4WithdrawHealthGateResult =\n | { outcome: 'allow' }\n | { outcome: 'block'; reason: string }\n | {\n outcome: 'confirm'\n reason: string\n targetHealthFactor: number\n healthFactorForMaxBonus: number\n }\n\nexport function aaveV4WithdrawHealthGate(args: {\n resultingHealthFactor: number | null\n hasBorrowDebt: boolean\n liquidationConfig: AaveV4SpokeLiquidationConfig | null | undefined\n}): AaveV4WithdrawHealthGateResult {\n const { hasBorrowDebt, liquidationConfig: liq } = args\n const r0 = args.resultingHealthFactor\n if (!hasBorrowDebt) {\n return { outcome: 'allow' }\n }\n if (r0 == null || !Number.isFinite(r0)) {\n return { outcome: 'block', reason: 'Could not determine health factor after withdrawal.' }\n }\n const r = r0 as number\n const t = liq == null ? NaN : Number(liq.targetHealthFactor)\n const m = liq == null ? NaN : Number(liq.healthFactorForMaxBonus)\n\n if (r <= 1 + HF_EPS) {\n return {\n outcome: 'block',\n reason: 'This withdrawal would leave health factor at or below 1.0 (liquidation range).',\n }\n }\n if (Number.isFinite(m) && m > 1 + HF_EPS && r <= m + HF_EPS) {\n return {\n outcome: 'block',\n reason: `This withdrawal would put health factor at or below the spoke’s max-liquidation-bonus threshold (${m}).`,\n }\n }\n if (Number.isFinite(t) && r < t - HF_EPS) {\n return {\n outcome: 'confirm',\n reason: `The resulting health factor would be below this market’s target (${t.toFixed(4)}).`,\n targetHealthFactor: t,\n healthFactorForMaxBonus: Number.isFinite(m) ? m : 0,\n }\n }\n return { outcome: 'allow' }\n}\n\n/**\n * After a **borrow** (or any action that lowers HF), use the same numeric gates as\n * {@link aaveV4WithdrawHealthGate} for resulting health factor.\n */\nexport function aaveV4BorrowHealthGate(args: {\n resultingHealthFactor: number | null\n liquidationConfig: AaveV4SpokeLiquidationConfig | null | undefined\n}): AaveV4WithdrawHealthGateResult {\n return aaveV4WithdrawHealthGate({\n resultingHealthFactor: args.resultingHealthFactor,\n hasBorrowDebt: true,\n liquidationConfig: args.liquidationConfig,\n })\n}\n\n/**\n * After **repay**, the protocol usually improves HF; we only block clearly dangerous previews.\n * Pass `strict: true` to apply the same thresholds as {@link aaveV4WithdrawHealthGate}.\n */\nexport function aaveV4RepayHealthGate(args: {\n resultingHealthFactor: number | null\n liquidationConfig: AaveV4SpokeLiquidationConfig | null | undefined\n /** When true, apply the same 1.0 / max-bonus / target rules as a withdrawal (rare for repay). */\n strict: boolean\n}): AaveV4WithdrawHealthGateResult {\n if (!args.strict) {\n return { outcome: 'allow' }\n }\n return aaveV4WithdrawHealthGate({\n resultingHealthFactor: args.resultingHealthFactor,\n hasBorrowDebt: true,\n liquidationConfig: args.liquidationConfig,\n })\n}\n","import { aaveV4Gql } from './api.js'\nimport type { AaveV4SpokeLiquidationConfig } from './userPositionsApi.js'\n\n/**\n * Built in {@link AaveV4Dialog} and consumed by the multi-sign page handler (withdraw / Merkl claim).\n */\nexport type AaveV4PositionActionPayload =\n | {\n kind: 'claim'\n /** Purpose / gas for this Merkl request (own fields in the Positions tab, not the shared Aave v4 form state on the page). */\n purposeText: string\n useCustomGas: boolean\n }\n | {\n kind: 'withdraw'\n reserveGraphqlId: string\n /** GraphQL or RPC-resolved on-chain id for `Spoke.withdraw`, when available. */\n reserveOnChainId: string | null\n underlying: `0x${string}`\n amountHuman: string\n withdrawRiskAck: boolean\n spokeAddress: `0x${string}`\n /** Spoke display name for sign-request metadata. */\n spokeName: string\n liquidationConfig: AaveV4SpokeLiquidationConfig | null\n hasBorrowDebt: boolean\n }\n | {\n kind: 'borrow'\n reserveGraphqlId: string\n reserveOnChainId: string | null\n underlying: `0x${string}`\n amountHuman: string\n borrowRiskAck: boolean\n spokeAddress: `0x${string}`\n spokeName: string\n liquidationConfig: AaveV4SpokeLiquidationConfig | null\n }\n | {\n kind: 'repay'\n reserveGraphqlId: string\n reserveOnChainId: string | null\n underlying: `0x${string}`\n amountHuman: string\n spokeAddress: `0x${string}`\n spokeName: string\n }\n\nconst PREVIEW_WITHDRAW = `\n query AaveV4PreviewWithdraw($req: PreviewRequest!) {\n preview(request: $req) {\n __typename\n ... on PreviewUserPosition {\n id\n healthFactor {\n __typename\n ... on HealthFactorVariation {\n current\n after\n }\n ... on HealthFactorError {\n reason\n current\n after\n }\n }\n }\n }\n }\n`\n\nconst USER_CLAIMABLE = `\n query AaveV4UserClaimableRewards($req: UserClaimableRewardsRequest!) {\n userClaimableRewards(request: $req) {\n __typename\n ... on UserMerklClaimableReward {\n id\n claimable {\n amount { value }\n exchange { value name symbol }\n token {\n address\n info { symbol name }\n }\n }\n }\n }\n }\n`\n\nconst CLAIM_REWARDS = `\n query AaveV4ClaimRewards($req: ClaimRewardsRequest!) {\n claimRewards(request: $req) {\n to\n from\n data\n value\n chainId\n }\n }\n`\n\nexport function parseBigDecimalHf(s: string | null | undefined): number | null {\n if (s == null || !String(s).trim()) return null\n const n = Number(String(s).trim())\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * @returns resulting HF `after` when preview is `PreviewUserPosition` with a variation, else `null` on error or unknown.\n */\nexport async function previewAaveV4WithdrawResultingHf(args: {\n user: `0x${string}`\n reserveId: string\n amountExactHuman: string\n}): Promise<{ resultingHf: number | null; error: string | null }> {\n const req = {\n action: {\n withdraw: {\n sender: args.user,\n reserve: args.reserveId,\n amount: { erc20: { exact: args.amountExactHuman } },\n },\n },\n }\n const d = await aaveV4Gql<{\n preview: {\n __typename: string\n id?: string\n healthFactor?: {\n __typename: string\n current?: string | null\n after?: string | null\n reason?: string | null\n } | null\n } | null\n }>(PREVIEW_WITHDRAW, { req })\n const p = d.preview\n if (p?.__typename !== 'PreviewUserPosition') {\n return { resultingHf: null, error: 'Withdraw preview is not available for this request.' }\n }\n const hf = p.healthFactor\n if (hf?.__typename === 'HealthFactorError') {\n return { resultingHf: null, error: (hf as { reason?: string }).reason ?? 'Invalid withdrawal for this position.' }\n }\n if (hf?.__typename === 'HealthFactorVariation') {\n return { resultingHf: parseBigDecimalHf((hf as { after?: string }).after), error: null }\n }\n return { resultingHf: null, error: 'Could not read health factor from preview.' }\n}\n\n/**\n * @returns resulting HF `after` for a borrow preview, or error from the API.\n */\nexport async function previewAaveV4BorrowResultingHf(args: {\n user: `0x${string}`\n reserveGraphqlId: string\n amountExactHuman: string\n}): Promise<{ resultingHf: number | null; error: string | null }> {\n const req = {\n action: {\n borrow: {\n sender: args.user,\n reserve: args.reserveGraphqlId,\n amount: { erc20: { value: args.amountExactHuman } },\n },\n },\n }\n const d = await aaveV4Gql<{\n preview: {\n __typename: string\n id?: string\n healthFactor?: {\n __typename: string\n current?: string | null\n after?: string | null\n reason?: string | null\n } | null\n } | null\n }>(PREVIEW_WITHDRAW, { req })\n const p = d.preview\n if (p?.__typename !== 'PreviewUserPosition') {\n return { resultingHf: null, error: 'Borrow preview is not available for this request.' }\n }\n const hf = p.healthFactor\n if (hf?.__typename === 'HealthFactorError') {\n return { resultingHf: null, error: (hf as { reason?: string }).reason ?? 'Invalid borrow for this position.' }\n }\n if (hf?.__typename === 'HealthFactorVariation') {\n return { resultingHf: parseBigDecimalHf((hf as { after?: string }).after), error: null }\n }\n return { resultingHf: null, error: 'Could not read health factor from borrow preview.' }\n}\n\nconst PREVIEW_REPAY = `\n query AaveV4PreviewRepay($req: PreviewRequest!) {\n preview(request: $req) {\n __typename\n ... on PreviewUserPosition {\n id\n healthFactor {\n __typename\n ... on HealthFactorVariation {\n current\n after\n }\n ... on HealthFactorError {\n reason\n current\n after\n }\n }\n }\n }\n }\n`\n\n/**\n * @returns resulting HF `after` for a repay preview.\n */\nexport async function previewAaveV4RepayResultingHf(args: {\n user: `0x${string}`\n reserveGraphqlId: string\n amountExactHuman: string\n}): Promise<{ resultingHf: number | null; error: string | null }> {\n const req = {\n action: {\n repay: {\n sender: args.user,\n reserve: args.reserveGraphqlId,\n amount: { erc20: { value: { exact: args.amountExactHuman } } },\n },\n },\n }\n const d = await aaveV4Gql<{\n preview: {\n __typename: string\n id?: string\n healthFactor?: {\n __typename: string\n current?: string | null\n after?: string | null\n reason?: string | null\n } | null\n } | null\n }>(PREVIEW_REPAY, { req })\n const p = d.preview\n if (p?.__typename !== 'PreviewUserPosition') {\n return { resultingHf: null, error: 'Repay preview is not available for this request.' }\n }\n const hf = p.healthFactor\n if (hf?.__typename === 'HealthFactorError') {\n return { resultingHf: null, error: (hf as { reason?: string }).reason ?? 'Invalid repay for this position.' }\n }\n if (hf?.__typename === 'HealthFactorVariation') {\n return { resultingHf: parseBigDecimalHf((hf as { after?: string }).after), error: null }\n }\n return { resultingHf: null, error: 'Could not read health factor from repay preview.' }\n}\n\nexport type AaveV4MerklClaimableRewardRow = {\n id: string\n tokenSymbol: string\n tokenName: string\n tokenAddress: string\n /** Human amount string from the API (reward token units). */\n amountValue: string\n /** Approximate notional in `exchangeLabel` (often USD) when present. */\n exchangeValue: string | null\n exchangeLabel: string\n}\n\nexport async function fetchAaveV4MerklClaimableRewardsForChain(args: {\n user: `0x${string}`\n chainId: number\n}): Promise<readonly AaveV4MerklClaimableRewardRow[]> {\n const d = await aaveV4Gql<{\n userClaimableRewards: (\n | { __typename: string }\n | {\n __typename: 'UserMerklClaimableReward'\n id: string\n claimable: {\n amount: { value: string }\n exchange: { value: string; name: string; symbol: string }\n token: {\n address: string\n info: { symbol: string; name: string } | null\n }\n }\n }\n )[]\n }>(USER_CLAIMABLE, { req: { user: args.user, chainId: args.chainId } })\n const out: AaveV4MerklClaimableRewardRow[] = []\n for (const r of d.userClaimableRewards ?? []) {\n if (r.__typename !== 'UserMerklClaimableReward' || !('claimable' in r)) continue\n const id = (r.id ?? '').trim()\n if (!id) continue\n const c = r.claimable\n const sym = (c?.token?.info?.symbol ?? '').trim() || '—'\n const name = (c?.token?.info?.name ?? '').trim() || sym\n const addr = (c?.token?.address ?? '').trim()\n const amt = (c?.amount?.value ?? '').trim()\n const exV = (c?.exchange?.value ?? '').trim()\n const exName = (c?.exchange?.name ?? '').trim()\n const exSym = (c?.exchange?.symbol ?? '').trim()\n const exchangeLabel =\n exName && exSym && exName.toUpperCase() !== exSym.toUpperCase() ? exName : exSym || exName || '—'\n let exchangeValue: string | null = null\n if (exV) {\n const n = parseFloat(exV)\n exchangeValue = Number.isFinite(n) ? exV : null\n }\n out.push({\n id,\n tokenSymbol: sym,\n tokenName: name,\n tokenAddress: addr,\n amountValue: amt,\n exchangeValue,\n exchangeLabel,\n })\n }\n return out\n}\n\nexport async function fetchAaveV4MerklClaimRewardIdsForChain(args: {\n user: `0x${string}`\n chainId: number\n}): Promise<readonly string[]> {\n const rows = await fetchAaveV4MerklClaimableRewardsForChain(args)\n return rows.map((r) => r.id)\n}\n\nexport type AaveV4ClaimRewardsTx = {\n to: `0x${string}`\n from: `0x${string}`\n data: `0x${string}`\n value: string\n chainId: string\n}\n\nexport async function fetchAaveV4ClaimRewardsCalldata(args: {\n user: `0x${string}`\n chainId: number\n rewardIds: readonly string[]\n}): Promise<AaveV4ClaimRewardsTx | null> {\n if (args.rewardIds.length === 0) return null\n const d = await aaveV4Gql<{\n claimRewards: { to: string; from: string; data: string; value: string; chainId: string } | null\n }>(CLAIM_REWARDS, { req: { user: args.user, chainId: args.chainId, ids: args.rewardIds } })\n const c = d.claimRewards\n if (!c) return null\n return {\n to: c.to as `0x${string}`,\n from: c.from as `0x${string}`,\n data: c.data as `0x${string}`,\n value: c.value,\n chainId: c.chainId,\n }\n}\n","import { loadAaveV4SupportedChainIdsFromV4Api } from './api.js'\n\nlet cached: ReadonlySet<number> | null = null\nlet inflight: Promise<ReadonlySet<number>> | null = null\n\n/**\n * Aave v4: supported EVM chain IDs from `https://api.v4.aave.com/graphql` (`chains` query).\n * @see https://aave.com/docs/aave-v4/liquidity/chains\n */\nexport function loadAaveV4SupportedChainIds(): Promise<ReadonlySet<number>> {\n if (cached) return Promise.resolve(cached)\n if (inflight) return inflight\n inflight = (async () => {\n try {\n const s = await loadAaveV4SupportedChainIdsFromV4Api()\n cached = s\n return s\n } finally {\n inflight = null\n }\n })()\n return inflight\n}\n","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { formatUnits, getAddress, zeroAddress } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nexport type AavePercentValueLike = { formatted: string; value: string } | null | undefined\n\nexport type AaveDecimalValueLike = { raw: string; decimals: number; value: string } | null | undefined\n\nexport type AaveSupplyInfoLike = {\n apy?: AavePercentValueLike\n total?: AaveDecimalValueLike\n} | null | undefined\n\nexport type AaveBorrowInfoLike = {\n total?: {\n amount?: AaveDecimalValueLike\n } | null\n} | null | undefined\n\n/**\n * Format Aave `PercentValue.formatted` for UI (e.g. supply/borrow APY), appending a % if missing.\n */\nexport function formatAavePercentDisplay(p: AavePercentValueLike): string {\n if (!p) return '—'\n const t = (p.formatted ?? '').trim()\n if (t) return t.includes('%') ? t : `${t}%`\n const v = (p.value ?? '').trim()\n if (!v) return '—'\n const n = Number(v) * 100\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\n/**\n * Free liquidity in the reserve: supplied liquidity minus total borrowed (underlying, token units as string).\n */\nexport function aaveAvailableLiquidityDisplay(\n supplyInfo: AaveSupplyInfoLike,\n borrowInfo: AaveBorrowInfoLike,\n): string {\n const sTotal = supplyInfo?.total\n const bAmt = borrowInfo?.total?.amount\n if (!sTotal?.raw || sTotal.decimals == null) return '—'\n if (!bAmt?.raw || bAmt.decimals == null) return '—'\n try {\n if (sTotal.decimals !== bAmt.decimals) return '—'\n const a = BigInt(sTotal.raw) - BigInt(bAmt.raw)\n if (a < 0n) return '0'\n return formatUnits(a, sTotal.decimals)\n } catch {\n return '—'\n }\n}\n\n/**\n * Map Assets row / native to Aave market underlying. Native uses the chain’s wrapped token address from the API.\n */\nexport function aaveUnderlyingAddressForContext(args: {\n contextContract: string\n chainNativeWrapped: string | null | undefined\n}): `0x${string}` {\n const raw = (args.contextContract ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === zeroAddress.toLowerCase() && args.chainNativeWrapped) {\n return getAddress(args.chainNativeWrapped.trim() as `0x${string}`)\n }\n return a\n } catch {\n return getAddress(zeroAddress)\n }\n}\n\nexport function isValidAaveChainId(assetsChainId: string | undefined | null): boolean {\n if (assetsChainId == null) return false\n const n = parseEvmChainIdToNumber(assetsChainId)\n return !Number.isNaN(n) && n >= 0\n}\n\n/**\n * Per-reserve supply rows from the Aave client `market` call (shaped for read-only display).\n */\nexport function aaveReadSupplyMetrics(\n reserve: unknown,\n symbolForDisplay: string,\n): {\n depositedAmount: string\n apy: string\n totalDeposits: string\n availableLiquidity: string\n} {\n if (!reserve || typeof reserve !== 'object') {\n return { depositedAmount: '—', apy: '—', totalDeposits: '—', availableLiquidity: '—' }\n }\n const r = reserve as {\n supplyInfo?: { apy?: AavePercentValueLike; total?: AaveDecimalValueLike }\n borrowInfo?: AaveBorrowInfoLike\n userState?: { balance?: { amount?: { value?: string } } | null } | null\n }\n const apy = formatAavePercentDisplay(r.supplyInfo?.apy)\n const tot = (r.supplyInfo?.total?.value ?? '—') as string\n const liq = aaveAvailableLiquidityDisplay(r.supplyInfo, r.borrowInfo)\n const dep = (r.userState?.balance?.amount?.value ?? '—') as string\n const sym = (symbolForDisplay ?? '').trim()\n return {\n depositedAmount: dep === '—' ? '—' : sym ? `${dep} ${sym}` : dep,\n apy,\n totalDeposits: tot === '—' ? '—' : sym ? `${tot} ${sym}` : tot,\n availableLiquidity: liq === '—' ? '—' : sym ? `${liq} ${sym}` : liq,\n }\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'\nexport * from './userPositionsApi.js'\nexport * from './positionActionsApi.js'\nexport * from './loadSupportedChainIds.js'\nexport * from './reserveDisplay.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"]}
1
+ {"version":3,"sources":["../../../../src/core/registry.ts","../../../../src/core/defiProxy.ts","../../../../src/protocols/evm/aave-v4/api.ts","../../../../src/protocols/evm/aave-v4/spokeOnChain.ts","../../../../src/core/purpose.ts","../../../../src/core/envelope.ts","../../../../src/chains/evm/routerSwapGas.ts","../../../../src/chains/evm/buildBatch.ts","../../../../src/protocols/evm/aave-v4/multisign.ts","../../../../src/protocols/evm/aave-v4/userPositionsApi.ts","../../../../src/protocols/evm/aave-v4/positionActionsApi.ts","../../../../src/protocols/evm/aave-v4/loadSupportedChainIds.ts","../../../../src/chains/evm/chainIdParse.ts","../../../../src/protocols/evm/aave-v4/reserveDisplay.ts","../../../../src/protocols/evm/aave-v4/index.ts"],"names":["n","x","getAddress","defineChain","createPublicClient","http","gasLimitFromEstimateAndChainConfig","isAddress","all"],"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","/**\n * Optional browser → Next.js API proxy paths for DeFi upstream calls.\n * Set once from continuumdao-node-app client bootstrap.\n */\n\nlet aaveGraphqlProxyUrl: string | undefined\nlet eulerGraphqlProxyUrl: string | undefined\nlet mapleGraphqlProxyUrl: string | undefined\nlet morphoGraphqlProxyUrl: string | undefined\nlet coingeckoProxyUrl: string | undefined\n\nexport function setAaveGraphqlProxyUrl(url: string | undefined): void {\n aaveGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getAaveGraphqlProxyUrl(): string | undefined {\n return aaveGraphqlProxyUrl\n}\n\nexport function setEulerGraphqlProxyUrl(url: string | undefined): void {\n eulerGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getEulerGraphqlProxyUrl(): string | undefined {\n return eulerGraphqlProxyUrl\n}\n\nexport function setMapleGraphqlProxyUrl(url: string | undefined): void {\n mapleGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMapleGraphqlProxyUrl(): string | undefined {\n return mapleGraphqlProxyUrl\n}\n\nexport function setMorphoGraphqlProxyUrl(url: string | undefined): void {\n morphoGraphqlProxyUrl = url?.trim() || undefined\n}\n\nexport function getMorphoGraphqlProxyUrl(): string | undefined {\n return morphoGraphqlProxyUrl\n}\n\nexport function setCoingeckoProxyUrl(url: string | undefined): void {\n coingeckoProxyUrl = url?.trim() || undefined\n}\n\nexport function getCoingeckoProxyUrl(): string | undefined {\n return coingeckoProxyUrl\n}\n\nexport async function postJsonViaOptionalProxy<T>(args: {\n directUrl: string\n body: unknown\n proxyUrl?: string\n proxyEnvelope?: unknown\n}): Promise<T> {\n const proxy = args.proxyUrl?.trim()\n if (proxy) {\n const r = await fetch(proxy, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.proxyEnvelope ?? args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `Proxy HTTP ${r.status}: ${t.slice(0, 200)}` : `Proxy HTTP ${r.status}`)\n }\n return (await r.json()) as T\n }\n const r = await fetch(args.directUrl, {\n method: 'POST',\n headers: {'content-type': 'application/json'},\n body: JSON.stringify(args.body),\n })\n if (!r.ok) {\n const t = await r.text().catch(() => '')\n throw new Error(t ? `HTTP ${r.status}: ${t.slice(0, 200)}` : `HTTP ${r.status}`)\n }\n return (await r.json()) as T\n}\n","import { getAddress, isAddress } from 'viem'\nimport { getAaveGraphqlProxyUrl, postJsonViaOptionalProxy } from '../../../core/defiProxy.js'\n\nexport const AAVE_V4_GRAPHQL_URL = 'https://api.v4.aave.com/graphql'\n\ntype GqlError = { message?: string }\n\ntype GqlData<T> = { data?: T; errors?: GqlError[] }\n\nexport async function aaveV4Gql<T>(query: string, variables?: Record<string, unknown>): Promise<T> {\n const body = { query, variables: variables ?? {} }\n const j = await postJsonViaOptionalProxy<GqlData<T> & { errors?: GqlError[] }>({\n directUrl: AAVE_V4_GRAPHQL_URL,\n body,\n proxyUrl: getAaveGraphqlProxyUrl(),\n proxyEnvelope: body,\n })\n if (j.errors?.length) {\n const msg = j.errors.map((e) => e.message ?? 'Unknown').join('; ')\n throw new Error(msg)\n }\n if (j.data == null) {\n throw new Error('Aave V4 API: empty response')\n }\n return j.data\n}\n\ntype ChainRowV4 = { chainId: number; name?: string | null; nativeWrappedToken?: string | null }\n\nexport async function fetchAaveV4Chains(): Promise<readonly ChainRowV4[]> {\n const d = await aaveV4Gql<{ chains: ChainRowV4[] }>(`\n query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }\n `, { c: { query: { filter: 'ALL' } } })\n return d.chains ?? []\n}\n\n/**\n * Aave v4: supported EVM chain IDs (from {@link fetchAaveV4Chains}).\n */\nexport async function loadAaveV4SupportedChainIdsFromV4Api(): Promise<ReadonlySet<number>> {\n const rows = await fetchAaveV4Chains()\n const s = new Set<number>()\n for (const c of rows) s.add(c.chainId)\n return s\n}\n\nconst RESERVES_ADDRESS_FRAGMENT = `\n asset { underlying { address } }\n`\n\nexport type V4ReservesListRow = {\n id: string\n onChainId?: string | null\n spoke?: {\n address: string\n name?: string | null\n liquidationConfig?: { targetHealthFactor: string; healthFactorForMaxBonus: string } | null\n } | null\n summary: {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n }\n userState: {\n balance: { amount: { value: string; decimals: number } } | null\n borrowable?: { amount: { value: string; decimals: number } } | null\n } | null\n}\n\nexport function aggregateV4SupplyDisplay(\n symbolForDisplay: string,\n rows: readonly V4ReservesListRow[],\n): {\n depositedAmount: string\n apy: string\n totalDeposits: string\n availableLiquidity: string\n} {\n const sym = (symbolForDisplay ?? '').trim()\n const withSuffix = (n: string) => (n === '—' ? '—' : sym ? `${n} ${sym}` : n)\n\n if (!rows.length) {\n return { depositedAmount: '—', apy: '—', totalDeposits: '—', availableLiquidity: '—' }\n }\n\n const apy = formatV4SupplyApy(rows)\n\n const sumKey = (key: 'supplied' | 'borrowed') =>\n sumNumberValues(\n rows.map((r) => {\n const v = key === 'supplied' ? r.summary?.supplied?.amount : r.summary?.borrowed?.amount\n return (v?.value ?? '').trim()\n }),\n )\n\n const totalSupN = sumKey('supplied')\n const totalBorN = sumKey('borrowed')\n const totalDeposits =\n totalSupN == null ? '—' : withSuffix(formatAaveV4TokenAmount(totalSupN))\n\n const availableLiquidity = (() => {\n if (totalSupN == null || totalBorN == null) return '—'\n const a = totalSupN - totalBorN\n if (!Number.isFinite(a)) return '—'\n return withSuffix(formatAaveV4TokenAmount(a < 0 ? 0 : a))\n })()\n\n const userN = userSupplyBalanceNumber(rows)\n const depositedAmount = userN == null ? '—' : withSuffix(formatAaveV4TokenAmount(userN))\n\n return { depositedAmount, apy, totalDeposits, availableLiquidity }\n}\n\nfunction sumNumberValues(values: ReadonlyArray<string>): number | null {\n if (!values.length) return null\n let s = 0\n for (const v of values) {\n const n = parseFloat(v)\n if (Number.isFinite(n)) s += n\n }\n return s\n}\n\n/**\n * Formats a token notional for display: uses k (≥1k) and M (≥1M) with a few decimal places, otherwise limited decimals.\n * Safe to reuse outside the Aave V4 dialog (e.g. tables, tooltips).\n */\nexport function formatAaveV4TokenAmount(n: number): string {\n if (!Number.isFinite(n)) return '—'\n if (n === 0) return '0'\n const sign = n < 0 ? '-' : ''\n const a = Math.abs(n)\n const strip = (s: string) => s.replace(/(\\.\\d*?)0+$/, '$1').replace(/\\.$/, '')\n\n if (a >= 1_000_000) {\n return sign + strip((a / 1_000_000).toFixed(2)) + 'M'\n }\n if (a >= 1000) {\n const k = a / 1000\n const d = k >= 100 ? 1 : 2\n return sign + strip(k.toFixed(d)) + 'k'\n }\n if (a >= 1) {\n return sign + strip(a.toFixed(2))\n }\n if (a >= 0.0001) {\n return sign + strip(a.toFixed(4))\n }\n return sign + a.toExponential(2)\n}\n\n/**\n * Human-readable notional for Aave v4 API decimal strings (reserve amounts, user debt, etc.).\n * Use this for all “display from GraphQL `value`” paths so formatting stays consistent.\n */\nexport function formatAaveV4AmountHumanFromApiString(raw: string | null | undefined): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = parseFloat(s)\n if (!Number.isFinite(n)) return '—'\n return formatAaveV4TokenAmount(n)\n}\n\n/**\n * Unnamed reserve liquidity: supplied − borrowed (both API decimal strings, same unit).\n */\nexport function formatAaveV4ReserveLiquidityFromSummary(args: {\n suppliedValue: string | null | undefined\n borrowedValue: string | null | undefined\n}): string {\n const a = parseFloat(String(args.suppliedValue ?? '').trim())\n const b = parseFloat(String(args.borrowedValue ?? '').trim())\n if (!Number.isFinite(a) || !Number.isFinite(b)) return '—'\n return formatAaveV4TokenAmount(Math.max(0, a - b))\n}\n\nfunction userSupplyBalanceNumber(rows: readonly V4ReservesListRow[]): number | null {\n const vals = rows\n .map((r) => (r.userState?.balance?.amount?.value ?? '').trim())\n .filter((v) => v.length > 0)\n if (!vals.length) return null\n const u = new Set(vals)\n if (u.size === 1) {\n const n = parseFloat(vals[0]!)\n return Number.isFinite(n) ? n : null\n }\n const sum = vals.reduce((acc, b) => acc + (parseFloat(b) || 0), 0)\n return Number.isFinite(sum) ? sum : null\n}\n\nfunction formatV4SupplyApy(rows: readonly V4ReservesListRow[]): string {\n if (!rows.length) return '—'\n const weighted: { w: number; apy: number }[] = []\n for (const r of rows) {\n const sup = parseFloat((r.summary?.supplied?.amount?.value ?? '').trim())\n const norm = (r.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(norm)\n if (Number.isFinite(n) && Number.isFinite(sup) && sup > 0) {\n weighted.push({ w: sup, apy: n })\n }\n }\n if (weighted.length) {\n const tw = weighted.reduce((a, x) => a + x.w, 0)\n if (tw > 0) {\n const x = weighted.reduce((a, x) => a + x.w * x.apy, 0) / tw\n if (x >= 0.01) return `${x.toFixed(2)}%`\n if (x > 0) return `${x.toFixed(4)}%`\n return '0%'\n }\n }\n const any = (rows[0]?.summary?.supplyApy?.normalized ?? '').trim()\n const n = parseFloat(any)\n if (!Number.isFinite(n)) return '—'\n if (n >= 0.01) return `${n.toFixed(2)}%`\n if (n > 0) return `${n.toFixed(4)}%`\n return '0%'\n}\n\nexport async function fetchAaveV4NativeWrappedToken(chainId: number): Promise<string | null> {\n const all = await fetchAaveV4Chains()\n const c = all.find((x) => x.chainId === chainId)\n const t = (c?.nativeWrappedToken ?? '').trim()\n if (t && isAddress(t)) return getAddress(t)\n return null\n}\n\n/**\n * All underlying token addresses (lowercased checksummed form for lookup: store lowercase) listed as reserves on the chain.\n */\nexport async function fetchAaveV4SupportedUnderlyingAddressSet(chainId: number): Promise<ReadonlySet<string>> {\n const d = await aaveV4Gql<{\n reserves: ReadonlyArray<{ asset: { underlying: { address: string } } }>\n }>(\n `\n query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }\n `,\n {\n r: {\n query: { chainIds: [chainId] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n const s = new Set<string>()\n for (const r of d.reserves ?? []) {\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (a && isAddress(a)) s.add(a.toLowerCase())\n }\n return s\n}\n\nfunction erc20Input(address: `0x${string}`, chainId: number) {\n return { address, chainId }\n}\n\nexport async function fetchAaveV4ReservesForUnderlying(args: {\n chainId: number\n underlying: `0x${string}`\n user?: `0x${string}` | null\n}): Promise<readonly V4ReservesListRow[]> {\n const d = await aaveV4Gql<{ reserves: V4ReservesListRow[] }>(\n `\n query S($r: ReservesRequest!) {\n reserves(request: $r) {\n id\n onChainId\n spoke { address name liquidationConfig { targetHealthFactor healthFactorForMaxBonus } }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n }\n userState {\n balance { amount { value decimals } }\n borrowable { amount { value decimals } }\n }\n }\n }\n `,\n {\n r: {\n query: { tokens: [erc20Input(args.underlying, args.chainId)] },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n ...(args.user ? { user: args.user } : {}),\n },\n },\n )\n return d.reserves ?? []\n}\n\n/**\n * Reserve row for a hub asset on the same Aave v4 **Spoke** as the user’s collateral (same as {@link useAaveV4DepositCollateralInfo}’s `collateralForAsset`).\n * Needed so borrow/repay multi-sign uses the same spoke as the user’s position.\n */\nexport function pickAaveV4ReserveRowForSpoke(\n rows: readonly V4ReservesListRow[],\n spokeAddress: `0x${string}`,\n): V4ReservesListRow | null {\n const want = getAddress(spokeAddress).toLowerCase()\n for (const r of rows) {\n const a = (r.spoke?.address ?? '').trim()\n if (!a) continue\n try {\n if (getAddress(a as `0x${string}`).toLowerCase() === want) return r\n } catch {\n continue\n }\n }\n return null\n}\n\nexport function aaveV4KeyForNodeAssetRow(args: {\n contractAddress: string\n nativeWrapped: string | null\n}): string | null {\n const raw = (args.contractAddress ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === '0x0000000000000000000000000000000000000000' && args.nativeWrapped) {\n return getAddress(args.nativeWrapped.trim() as `0x${string}`).toLowerCase()\n }\n return a.toLowerCase()\n } catch {\n return null\n }\n}\n\ntype AaveV4ChainTokenCache = {\n supportedUnderlying: ReadonlySet<string>\n nativeWrapped: string | null\n}\n\nconst aaveV4ChainTokenCache = new Map<number, Promise<AaveV4ChainTokenCache>>()\n\n/**\n * Fetches and caches (per process) the list of Aave v4 underlying addresses on a chain and the wrapped native token.\n */\nexport function ensureAaveV4ChainTokenCache(chainId: number): Promise<AaveV4ChainTokenCache> {\n const hit = aaveV4ChainTokenCache.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const [nativeWrapped, supportedUnderlying] = await Promise.all([\n fetchAaveV4NativeWrappedToken(chainId),\n fetchAaveV4SupportedUnderlyingAddressSet(chainId),\n ])\n return { supportedUnderlying, nativeWrapped }\n })()\n aaveV4ChainTokenCache.set(chainId, p)\n return p\n}\n\n// —— Hubs, collateral, borrowable (per UI “market” / Aave v4 pool) ——————————————\n\n/** UI market segment; maps to Aave v4 `Hub` by name (e.g. Plus ≈ “Main”, Core, Prime ≈ “Bluechip”). */\nexport type AaveV4UiMarketId = 'main' | 'core' | 'bluechip'\n\nexport type AaveV4Hub = {\n name: string\n address: `0x${string}`\n chain: { chainId: number; name?: string | null }\n}\n\n/** `summary` is included for hub `reserves` (market borrow/supply TVL, APYs). */\nexport type AaveV4HubReserveSummary = {\n supplied: { amount: { value: string; decimals: number } }\n borrowed: { amount: { value: string; decimals: number } }\n suppliable: { amount: { value: string; decimals: number } }\n supplyApy: { normalized: string; value: string }\n borrowApy: { normalized: string; value: string }\n}\n\nexport type AaveV4HubReserve = {\n canBorrow: boolean\n canUseAsCollateral: boolean\n canSupply: boolean\n /** Spoke contract to call for `supply` on this reserve. */\n spoke: { address: string } | null\n settings: {\n borrowable: boolean\n collateral: boolean\n collateralFactor: { normalized: string; value: string }\n collateralRisk: { normalized: string; value: string }\n }\n asset: {\n underlying: {\n address: string\n info: { name: string; symbol: string; icon: string | null } | null\n }\n }\n /** Present when using the extended hub reserves query (borrow tab, market TVL). */\n summary?: AaveV4HubReserveSummary | null\n}\n\nconst aaveV4HubsByChain = new Map<number, Promise<readonly AaveV4Hub[]>>()\nconst aaveV4HubReserves = new Map<string, Promise<readonly AaveV4HubReserve[]>>()\n\nfunction hubReservesKey(chainId: number, hub: `0x${string}`) {\n return `v3spoke+summary:${chainId}:${hub.toLowerCase()}`\n}\n\nexport async function fetchAaveV4HubsForChain(chainId: number): Promise<readonly AaveV4Hub[]> {\n const hit = aaveV4HubsByChain.get(chainId)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ hubs: AaveV4Hub[] }>(\n `query F($h: HubsRequest!) { hubs(request: $h) { name address chain { chainId name } } }`,\n { h: { query: { chainIds: [chainId] } } },\n )\n const out = (d.hubs ?? []).map((h) => ({\n name: h.name,\n address: getAddress((h.address ?? '').trim() as `0x${string}`) as `0x${string}`,\n chain: h.chain,\n }))\n return out\n })()\n aaveV4HubsByChain.set(chainId, p)\n return p\n}\n\n/**\n * Resolves which Aave v4 hub (Core / Plus / Prime, etc.) a UI “market” refers to.\n * Main → Plus, Core → Core, Bluechip → Prime.\n */\nexport function resolveAaveV4HubForUiMarket(\n hubs: readonly AaveV4Hub[],\n market: AaveV4UiMarketId,\n chainId: number,\n): AaveV4Hub | null {\n const on = hubs.filter((h) => h.chain.chainId === chainId)\n if (!on.length) return null\n const find = (names: string[]) => {\n const set = new Set(names.map((n) => n.toLowerCase()))\n return on.find((h) => set.has((h.name ?? '').trim().toLowerCase())) ?? null\n }\n if (market === 'core') return find(['core'])\n if (market === 'bluechip') return find(['prime', 'bluechip', 'institutional'])\n // main: prefer Plus; fall back to common names, then first hub\n return find(['plus', 'main', 'default']) ?? on[0] ?? null\n}\n\n/**\n * Inverse of {@link resolveAaveV4HubForUiMarket} label mapping, for switching UI market when a hub is chosen by\n * “first hub on chain that lists this underlying”.\n */\nexport function aaveV4UiMarketIdForHubName(hubName: string): AaveV4UiMarketId {\n const n = (hubName ?? '').trim().toLowerCase()\n if (n === 'core') return 'core'\n if (n === 'plus' || n === 'main' || n === 'default') return 'main'\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 'bluechip'\n return 'main'\n}\n\n/**\n * When more than one hub lists the same underlying, the ideal hub is the one that matches the user’s *actual*\n * position (supply/debt on that hub’s Spoke). We don’t have that signal here, so we use a **deterministic** order after\n * {@link aaveV4UiMarketIdForHubName}: Core → Main/Plus → Bluechip/Prime (then name) so the choice is not tied to\n * GraphQL list order. Callers with wallet/user data can later prefer a hub whose Spoke appears in\n * `fetchAaveV4ReservesForUnderlying` with non-zero `userState`.\n */\nfunction aaveV4HubAutoPickTiebreakOrder(a: AaveV4Hub, b: AaveV4Hub): number {\n const rank = (name: string) => {\n const n = (name ?? '').trim().toLowerCase()\n if (n === 'core') return 0\n if (n === 'plus' || n === 'main' || n === 'default') return 1\n if (n === 'prime' || n === 'bluechip' || n === 'institutional') return 2\n return 3\n }\n const ra = rank(a.name)\n const rb = rank(b.name)\n if (ra !== rb) return ra - rb\n return a.name.localeCompare(b.name, undefined, { sensitivity: 'base' })\n}\n\ntype AaveV4HubCollateralCandidate = {\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n}\n\n/**\n * Sort key for “which borrow is cheaper” on a **debt** reserve row. Lower is better; missing data sorts last.\n */\nfunction aaveV4HubReserveBorrowApyForSort(r: AaveV4HubReserve | null | undefined): number {\n if (!r) return Number.POSITIVE_INFINITY\n const norm = parseFloat((r.summary?.borrowApy?.normalized ?? '').trim())\n if (Number.isFinite(norm) && norm >= 0) return norm\n const v = parseFloat((r.summary?.borrowApy?.value ?? '').trim())\n if (Number.isFinite(v) && v >= 0) {\n if (v > 0 && v <= 1) return v * 100\n return v\n }\n return Number.POSITIVE_INFINITY\n}\n\n/**\n * `summary.suppliable` on a reserve is pool liquidity for borrowing that asset (human-notional, same units as\n * {@link formatAaveV4AmountHumanFromApiString}).\n */\nfunction aaveV4SuppliableHumanFromHubReserve(r: AaveV4HubReserve | null | undefined): number | null {\n if (!r) return null\n const n = parseFloat((r.summary?.suppliable?.amount?.value ?? '').trim())\n return Number.isFinite(n) && n >= 0 ? n : null\n}\n\n/**\n * The selected UI market maps to a single hub, but a token may only be listed in another hub (e.g. WETH in Core, not\n * Plus on Ethereum). Returns a hub on this chain where this underlying appears in hub reserves, so Spoke and\n * collateral can be resolved.\n *\n * **When no debt hint:** `preferHub` is tried first, then other hubs in {@link aaveV4HubAutoPickTiebreakOrder} order.\n *\n * **When `debtUnderlying` is set (user chose a debt asset on the borrow flow):** among hubs that list **both** the\n * **collateral** and that **debt** as borrowable, the hub with the **lowest debt borrow APY** is chosen. If\n * `debtBorrowAmountHumanForLiquidity` is a positive number string, we **prefer** hubs where `suppliable` on the debt\n * reserve is at least that amount; if none satisfy that, the lowest-APY hub among all debt-backed candidates is\n * used anyway.\n */\nexport async function findAaveV4HubReserveForChainUnderlying(args: {\n chainId: number\n hubs: readonly AaveV4Hub[]\n underlying: `0x${string}`\n /** Tried first; if the asset is not listed here, other hubs on the same chain are scanned. */\n preferHub: AaveV4Hub\n /** If set, disambiguate using this debt asset’s `borrowAPY` (and optional liquidity) per hub. */\n debtUnderlying?: `0x${string}` | null\n /**\n * When set, used with `debtUnderlying` to prefer hubs with enough `suppliable` on the debt line for a borrow\n * of that size (human amount; commas may be included).\n */\n debtBorrowAmountHumanForLiquidity?: string | null\n}): Promise<{\n hub: AaveV4Hub\n hubReserves: readonly AaveV4HubReserve[]\n reserve: AaveV4HubReserve\n} | null> {\n const onChain = args.hubs.filter((h) => h.chain.chainId === args.chainId)\n if (!onChain.length) return null\n const prefer = getAddress(args.preferHub.address) as `0x${string}`\n const order = (() => {\n const rest = onChain\n .filter((h) => getAddress(h.address) !== prefer)\n .sort(aaveV4HubAutoPickTiebreakOrder)\n const first = onChain.find((h) => getAddress(h.address) === prefer)\n return first ? [first, ...rest] : rest\n })()\n\n const candidates: AaveV4HubCollateralCandidate[] = []\n for (const h of order) {\n const rows = await fetchAaveV4HubReserves({ chainId: args.chainId, hubAddress: h.address as `0x${string}` })\n const c = findHubReserveForUnderlying(rows, args.underlying)\n if (c) candidates.push({ hub: h, hubReserves: rows, reserve: c })\n }\n if (!candidates.length) return null\n\n const noDebt = (): AaveV4HubCollateralCandidate => candidates[0]!\n\n const rawDebt = (args.debtUnderlying ?? '').trim()\n if (!rawDebt || !isAddress(rawDebt)) {\n return noDebt()\n }\n const debtU = getAddress(rawDebt) as `0x${string}`\n\n const withDebt = candidates\n .map((c) => {\n const dr = findHubReserveForUnderlying(c.hubReserves, debtU)\n return { ...c, debtReserve: dr }\n })\n .filter(\n (x): x is AaveV4HubCollateralCandidate & { debtReserve: AaveV4HubReserve } =>\n x.debtReserve != null &&\n x.debtReserve.canBorrow === true &&\n x.debtReserve.settings?.borrowable === true,\n )\n if (!withDebt.length) {\n return noDebt()\n }\n\n const amountRaw = (args.debtBorrowAmountHumanForLiquidity ?? '')\n .trim()\n .replace(/,/g, '')\n const wantN = amountRaw && parseFloat(amountRaw) > 0 ? parseFloat(amountRaw) : null\n\n const sortKey = (a: (typeof withDebt)[0], b: (typeof withDebt)[0]): number => {\n const d = aaveV4HubReserveBorrowApyForSort(a.debtReserve) - aaveV4HubReserveBorrowApyForSort(b.debtReserve)\n if (d !== 0) return d\n const pa = getAddress(a.hub.address) === prefer ? 0 : 1\n const pb = getAddress(b.hub.address) === prefer ? 0 : 1\n if (pa !== pb) return pa - pb\n return aaveV4HubAutoPickTiebreakOrder(a.hub, b.hub)\n }\n\n if (wantN == null) {\n withDebt.sort(sortKey)\n const x = withDebt[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n }\n\n const sufficient = withDebt.filter((c) => {\n const s = aaveV4SuppliableHumanFromHubReserve(c.debtReserve)\n return s != null && s + 1e-9 >= wantN\n })\n const pool = sufficient.length ? sufficient : withDebt\n pool.sort(sortKey)\n const x = pool[0]!\n return { hub: x.hub, hubReserves: x.hubReserves, reserve: x.reserve }\n}\n\nexport async function fetchAaveV4HubReserves(args: { chainId: number; hubAddress: `0x${string}` }): Promise<readonly AaveV4HubReserve[]> {\n const h = getAddress(args.hubAddress) as `0x${string}`\n const k = hubReservesKey(args.chainId, h)\n const hit = aaveV4HubReserves.get(k)\n if (hit) return hit\n const p = (async () => {\n const d = await aaveV4Gql<{ reserves: AaveV4HubReserve[] }>(\n `query R($r: ReservesRequest!) {\n reserves(request: $r) {\n canBorrow\n canSupply\n canUseAsCollateral\n spoke { address }\n settings {\n borrowable\n collateral\n collateralFactor { normalized value }\n collateralRisk { normalized value }\n }\n summary {\n supplied { amount { value decimals } }\n borrowed { amount { value decimals } }\n suppliable { amount { value decimals } }\n supplyApy { normalized value }\n borrowApy { normalized value }\n }\n asset { underlying { address info { name symbol icon } } }\n }\n }`,\n {\n r: {\n query: { hub: { address: h, chainId: args.chainId } },\n filter: 'ALL',\n orderBy: { supplyApy: 'DESC' },\n },\n },\n )\n return d.reserves ?? []\n })()\n aaveV4HubReserves.set(k, p)\n return p\n}\n\n/**\n * LTV you can borrow against a unit of this asset, e.g. \"90%\".\n */\nexport function formatAaveV4PercentDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = (normalized ?? '').trim()\n if (n) {\n const f = parseFloat(n)\n if (!Number.isFinite(f)) return '—'\n if (f === 0) return '—'\n if (f % 1 === 0) return `${f.toFixed(0)}%`\n return `${f >= 10 ? f.toFixed(0) : f >= 1 ? f.toFixed(1).replace(/\\.0$/, '') : f.toFixed(2).replace(/\\.?0+$/, '')}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${Math.round(v * 100)}%`\n }\n return '—'\n}\n\n/**\n * Collateral / protocol risk on the same 0–100 style scale as the API, or a plain label if zero/empty.\n */\nexport function formatAaveV4RiskDisplay(normalized: string | undefined, value: string | undefined): string {\n const n = parseFloat((normalized ?? '').trim())\n if (Number.isFinite(n) && n > 0) {\n return n >= 0.01 ? `${n.toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%` : `${n.toFixed(4)}%`\n }\n const v = parseFloat((value ?? '').trim())\n if (Number.isFinite(v) && v > 0) {\n return `${(v * 100).toFixed(2).replace(/\\.0+$|(\\.\\d*?)0+$/, '$1')}%`\n }\n return 'Low'\n}\n\nexport function findHubReserveForUnderlying(\n list: readonly AaveV4HubReserve[],\n underlying: `0x${string}`,\n): AaveV4HubReserve | null {\n const t = getAddress(underlying).toLowerCase()\n return list.find((r) => (r.asset?.underlying?.address ?? '').toLowerCase() === t) ?? null\n}\n\nexport type AaveV4BorrowableDisplay = {\n address: string\n symbol: string\n name: string\n icon: string | null\n}\n\n/**\n * De-duplicated borrowable debt assets in a hub (what users can borrow there).\n */\nexport function borrowableAssetsFromHubReserves(rows: readonly AaveV4HubReserve[]): AaveV4BorrowableDisplay[] {\n const seen = new Set<string>()\n const out: AaveV4BorrowableDisplay[] = []\n for (const r of rows) {\n if (!r.canBorrow || !r.settings?.borrowable) continue\n const a = (r.asset?.underlying?.address ?? '').trim()\n if (!a || !isAddress(a)) continue\n const lo = a.toLowerCase()\n if (seen.has(lo)) continue\n seen.add(lo)\n const info = r.asset?.underlying?.info\n out.push({\n address: getAddress(a as `0x${string}`),\n symbol: (info?.symbol ?? '—').trim() || '—',\n name: (info?.name ?? '').trim() || '—',\n icon: (info?.icon ?? '').trim() || null,\n })\n }\n out.sort((p, q) => p.symbol.localeCompare(q.symbol, undefined, { sensitivity: 'base' }))\n return out\n}\n\nconst USER_BORROWS_HUB = `\n query AaveV4UserBorrowsHub($r: UserBorrowsRequest!) {\n userBorrows(request: $r) {\n debt { amount { value } }\n reserve {\n asset { underlying { address } }\n }\n }\n }\n`\n\n/**\n * Current variable-debt balance per underlying token for this user in the given hub (one entry per asset).\n * Values are API decimal strings; format with {@link formatAaveV4AmountHumanFromApiString}.\n */\nexport async function fetchAaveV4UserBorrowsDebtByUnderlyingForHub(args: {\n user: `0x${string}`\n chainId: number\n hubAddress: `0x${string}`\n}): Promise<ReadonlyMap<string, string>> {\n const u = getAddress(args.user)\n const h = getAddress(args.hubAddress) as `0x${string}`\n const d = await aaveV4Gql<{\n userBorrows: {\n debt: { amount: { value: string } } | null\n reserve: { asset: { underlying: { address: string } } } | null\n }[]\n }>(USER_BORROWS_HUB, {\n r: {\n query: {\n userHub: {\n user: u,\n hub: { input: { address: h, chainId: args.chainId } },\n },\n },\n orderBy: { amount: 'DESC' },\n includeZeroBalances: false,\n },\n })\n const m = new Map<string, string>()\n for (const row of d.userBorrows ?? []) {\n const addr = (row?.reserve?.asset?.underlying?.address ?? '').trim()\n if (!addr) continue\n const lo = getAddress(addr as `0x${string}`).toLowerCase()\n const v = (row?.debt?.amount?.value ?? '').trim()\n if (!v) continue\n const n = parseFloat(v)\n if (!Number.isFinite(n) || n === 0) continue\n const prev = m.get(lo)\n if (prev) {\n const p = parseFloat(prev)\n m.set(lo, String((Number.isFinite(p) ? p : 0) + n))\n } else {\n m.set(lo, v)\n }\n }\n return m\n}\n\nexport type AaveV4BorrowTableRow = {\n address: string\n symbol: string\n name: string\n icon: string | null\n yourBorrowedDisplay: string\n baseBorrowApyDisplay: string\n totalBorrowsDisplay: string\n liquidityDisplay: string\n}\n\n/**\n * One row per borrowable asset in the hub, using shared human-readable formatters.\n */\nexport function buildAaveV4BorrowTableRowsFromHub(\n borrowable: readonly AaveV4BorrowableDisplay[],\n hubReserves: readonly AaveV4HubReserve[] | null,\n /** `undefined` = not loaded or no wallet (show em dash for “your” column). */\n debtByUnderlying: ReadonlyMap<string, string> | undefined,\n): AaveV4BorrowTableRow[] {\n if (!hubReserves?.length) {\n return borrowable.map((b) => ({\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: debtByUnderlying === undefined ? '—' : `0${b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''}`,\n baseBorrowApyDisplay: '—',\n totalBorrowsDisplay: '—',\n liquidityDisplay: '—',\n }))\n }\n return borrowable.map((b) => {\n const lo = b.address.toLowerCase()\n const r = hubReserves.find((x) => (x.asset?.underlying?.address ?? '').toLowerCase() === lo) ?? null\n const s = r?.summary\n const debtRaw = debtByUnderlying?.get(lo) ?? null\n const symSuffix = b.symbol && b.symbol !== '—' ? ` ${b.symbol}` : ''\n return {\n address: b.address,\n symbol: b.symbol,\n name: b.name,\n icon: b.icon,\n yourBorrowedDisplay: (() => {\n if (debtByUnderlying === undefined) return '—'\n if (debtRaw == null || !String(debtRaw).trim()) return `0${symSuffix}`\n const n = parseFloat(String(debtRaw).trim())\n if (!Number.isFinite(n) || n === 0) return `0${symSuffix}`\n return `${formatAaveV4AmountHumanFromApiString(debtRaw)}${symSuffix}`\n })(),\n baseBorrowApyDisplay: formatAaveV4PercentDisplay(\n s?.borrowApy?.normalized,\n s?.borrowApy?.value,\n ),\n totalBorrowsDisplay: s\n ? `${formatAaveV4AmountHumanFromApiString(s.borrowed?.amount?.value)}${symSuffix}`\n : '—',\n liquidityDisplay: s\n ? `${formatAaveV4ReserveLiquidityFromSummary({\n suppliedValue: s.supplied?.amount?.value,\n borrowedValue: s.borrowed?.amount?.value,\n })}${symSuffix}`\n : '—',\n }\n })\n}\n","import { type Address, createPublicClient, defineChain, getAddress, http } from 'viem'\nimport { isValidRpcUrl } from '@continuumdao/continuum-node-sdk'\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","/** Merge user purpose text with an optional batch / protocol suffix. */\nexport function mergePurposeText(purposeText: string | undefined, purposeSuffix?: string): string {\n const t = (purposeText ?? '').trim()\n const suffix = (purposeSuffix ?? '').trim()\n if (!suffix) return t\n return t ? `${t}\\n\\n${suffix}` : suffix\n}\n","import type { ChainCategory, MultisignBuildResult, KeyGenSubset } from './types.js'\nimport { getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk'\nimport { mergePurposeText } from './purpose.js'\n\nexport interface MultisignLeg {\n msgHash: string\n msgRaw: string\n destinationAddress: string\n signatureText: string\n audit: Record<string, unknown>\n feeSnapshot: Record<string, unknown>\n proposalTxParams?: Record<string, unknown>\n /** Payable value wei string for first leg only when relevant */\n valueWei?: bigint\n}\n\nexport interface ChainCategoryBuildInput {\n keyGen: KeyGenSubset\n purposeText: string\n purposeSuffix?: string\n destinationChainID: string\n legs: MultisignLeg[]\n extraJSON?: Record<string, unknown>\n /** Top-level destination address (first leg destination if omitted) */\n destinationAddress?: string\n}\n\nexport interface ChainCategoryModule {\n category: ChainCategory\n finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult\n}\n\n/**\n * Assemble mpc-auth `bodyForSign` from category-built legs.\n * Supports single-tx and batch (messageHashes / messageRawBatch / proposalTxParams).\n */\nexport function finalizeMultisign(input: ChainCategoryBuildInput): MultisignBuildResult {\n const { keyGen, destinationChainID, legs } = input\n if (legs.length === 0) {\n throw new Error('finalizeMultisign requires at least one leg')\n }\n\n const ph = (keyGen.pubkeyhex ?? '').trim()\n if (!ph) throw new Error('keyGen pubKey (pubkeyhex) is required')\n\n const keyList = keyGen.keylist ?? []\n const clientId = getClientIdFromKeyGenResult(keyGen)\n const first = legs[0]!\n\n const messageHashes = legs.map((l) => l.msgHash)\n const messageRawBatch = legs.map((l) => l.msgRaw)\n const batchMeta = legs.map((l) => ({\n destinationAddress: l.destinationAddress,\n signatureText: l.signatureText,\n ...l.audit,\n }))\n\n const proposalTxParams = legs\n .map((l) => l.proposalTxParams)\n .filter((p): p is Record<string, unknown> => p != null && typeof p === 'object')\n\n const extraPayload: Record<string, unknown> = {\n batchMeta,\n ...(input.extraJSON ?? {}),\n }\n const extraJSON = JSON.stringify(extraPayload)\n\n const bodyForSign: Record<string, unknown> = {\n keyList,\n pubKey: ph,\n msgHash: messageHashes[0],\n msgRaw: first.msgRaw,\n destinationChainID,\n destinationAddress: input.destinationAddress ?? first.destinationAddress,\n extraJSON,\n signatureText: first.signatureText,\n purpose: mergePurposeText(input.purposeText, input.purposeSuffix),\n ...first.feeSnapshot,\n }\n\n if (legs.length > 1) {\n bodyForSign.messageHashes = messageHashes\n bodyForSign.messageRawBatch = messageRawBatch\n }\n\n if (proposalTxParams.length > 0) {\n bodyForSign.proposalTxParams = proposalTxParams\n }\n\n const valueWei = first.valueWei\n if (valueWei != null && valueWei > 0n) {\n bodyForSign.value = valueWei.toString()\n }\n\n if (clientId) bodyForSign.clientId = clientId\n\n return { bodyForSign, messageToSign: JSON.stringify(bodyForSign) }\n}\n\nexport const coreChainCategoryModule: ChainCategoryModule = {\n category: 'evm',\n finalizeMultisign,\n}\n","import { gasLimitFromEstimateAndChainConfig } from '@continuumdao/continuum-node-sdk'\n\n/** Curve router swap gas: chain cap when set, else 12/10 estimate bump. */\nexport function routerSwapGasLimitFromEstimate(\n estimatedGas: bigint,\n chainGasLimit?: number | null,\n): bigint {\n if (chainGasLimit != null && Number.isFinite(chainGasLimit) && chainGasLimit > 0) {\n return gasLimitFromEstimateAndChainConfig(estimatedGas, chainGasLimit)\n }\n return (estimatedGas * 12n + 9n) / 10n\n}\n","import {\n keccak256,\n createPublicClient,\n defineChain,\n http,\n serializeTransaction,\n getAddress,\n parseGwei,\n type Address,\n type PublicClient,\n} from 'viem'\nimport type { MultisignBuildResult } from '../../core/types.js'\nimport { finalizeMultisign, type MultisignLeg } from '../../core/envelope.js'\nimport type { KeyGenSubset } from '../../core/types.js'\nimport {\n fetchChainFeeParams,\n alignEip1559FeesWithLatestBase,\n gweiToDecimalString,\n gasLimitFromEstimateAndChainConfig,\n proposalTxParamsToFeeSnapshot,\n type ProposalTxParams,\n} from '@continuumdao/continuum-node-sdk'\nimport { routerSwapGasLimitFromEstimate } from './routerSwapGas.js'\nimport type { EvmProtocolContext, EvmTxStep } from './types.js'\n\nexport type EvmBatchMetaBuilder = (args: {\n step: EvmTxStep\n index: number\n gasLimit: bigint\n}) => Record<string, unknown>\n\nexport type EvmBuildBatchArgs = {\n context: EvmProtocolContext\n steps: EvmTxStep[]\n purposeSuffix?: string\n buildBatchMeta: EvmBatchMetaBuilder\n /** First leg msgRaw without 0x prefix; defaults to first step calldata */\n firstMsgRawNo0x?: string\n destinationAddress?: Address\n /** Top-level `value` on bodyForSign when the payable amount is not on the first leg */\n payableValueWei?: bigint\n resolveGasLimit?: (args: {\n step: EvmTxStep\n index: number\n estimatedGas: bigint\n publicClient: PublicClient\n }) => Promise<bigint> | bigint\n /** Override default `estimateGas` (e.g. trade-API gas, skip post-approve deposit estimate). */\n estimateGasForStep?: (args: {\n step: EvmTxStep\n index: number\n publicClient: PublicClient\n executor: Address\n }) => Promise<bigint> | bigint\n}\n\n/**\n * Build unsigned EVM txs, estimate gas, serialize, hash — then assemble mpc-auth body via core envelope.\n */\nexport async function buildEvmMultisignBatch(args: EvmBuildBatchArgs): Promise<MultisignBuildResult> {\n const { context, steps } = args\n const {\n chainId,\n rpcUrl,\n executorAddress,\n chainDetail,\n useCustomGas,\n customGasChainDetails,\n keyGen,\n purposeText,\n } = context\n\n if (steps.length === 0) throw new Error('buildEvmMultisignBatch requires at least one step')\n\n const ch = defineChain({\n id: chainId,\n name: 'Destination',\n nativeCurrency: { decimals: 18, name: 'Ether', symbol: 'ETH' },\n rpcUrls: { default: { http: [rpcUrl] } },\n })\n const publicClient = createPublicClient({ chain: ch, transport: http(rpcUrl) })\n\n const feeParams = await fetchChainFeeParams(rpcUrl, chainId)\n const legacy = Boolean(chainDetail?.legacy) || !feeParams.isEip1559\n const latestBaseFeeWei = !legacy\n ? ((await publicClient.getBlock({ blockTag: 'latest' })).baseFeePerGas ?? 0n)\n : 0n\n\n const gasLimitConfig =\n useCustomGas && chainDetail?.gasLimit != null ? Number(chainDetail.gasLimit) : undefined\n const chainGasLimitRouter =\n chainDetail?.gasLimit != null &&\n Number.isFinite(Number(chainDetail.gasLimit)) &&\n Number(chainDetail.gasLimit) > 0\n ? Number(chainDetail.gasLimit)\n : undefined\n const gasFeeMultiplier =\n useCustomGas && chainDetail?.gasMultiplier != null ? Number(chainDetail.gasMultiplier) : undefined\n\n const executor = getAddress(executorAddress)\n const baseNonce = await publicClient.getTransactionCount({ address: executor, blockTag: 'pending' })\n\n const legs: MultisignLeg[] = []\n\n for (let i = 0; i < steps.length; i++) {\n const step = steps[i]!\n const currentNonce = baseNonce + i\n\n let estimatedGas: bigint\n if (args.estimateGasForStep) {\n estimatedGas = await args.estimateGasForStep({ step, index: i, publicClient, executor })\n } else {\n try {\n estimatedGas = await publicClient.estimateGas({\n to: step.to,\n data: step.data,\n value: step.value,\n account: executor,\n })\n } catch {\n estimatedGas = step.fallbackGas ?? 100_000n\n }\n }\n\n let gasLimitI: bigint\n if (args.resolveGasLimit) {\n gasLimitI = await args.resolveGasLimit({ step, index: i, estimatedGas, publicClient })\n } else if (step.routerSwap) {\n gasLimitI = routerSwapGasLimitFromEstimate(estimatedGas, chainGasLimitRouter)\n } else {\n gasLimitI = useCustomGas\n ? gasLimitFromEstimateAndChainConfig(estimatedGas, gasLimitConfig)\n : estimatedGas\n }\n\n let proposalTxParams: ProposalTxParams\n let feeSnapshot: Record<string, unknown>\n let serialized: `0x${string}`\n\n if (legacy) {\n let gasPriceWei = await publicClient.getGasPrice()\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n gasPriceWei = (gasPriceWei * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n if (useCustomGas && chainDetail?.gasPrice != null && chainDetail.gasPrice > 0) {\n const configured = parseGwei(gweiToDecimalString(Number(chainDetail.gasPrice)))\n if (configured > gasPriceWei) gasPriceWei = configured\n }\n serialized = serializeTransaction({\n type: 'legacy',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n gasPrice: gasPriceWei,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'legacy',\n gasPrice: gasPriceWei.toString(),\n }\n feeSnapshot = proposalTxParamsToFeeSnapshot(proposalTxParams)\n } else {\n const fetchedBase = feeParams.baseFeeGwei ?? 0\n const fetchedPriority = feeParams.priorityFeeGwei ?? 0\n const configuredBase =\n useCustomGas && chainDetail?.baseFee != null ? Number(chainDetail.baseFee) : 0\n const configuredPriority =\n useCustomGas && chainDetail?.priorityFee != null ? Number(chainDetail.priorityFee) : 0\n const effectiveBaseFeeGwei = Math.max(fetchedBase, configuredBase)\n const effectivePriorityFeeGwei = Math.max(fetchedPriority, configuredPriority)\n const baseFeeMultiplierPct =\n useCustomGas && chainDetail?.baseFeeMultiplier != null\n ? Math.max(100, Number(chainDetail.baseFeeMultiplier))\n : 100\n const baseComponentGwei = (effectiveBaseFeeGwei * baseFeeMultiplierPct) / 100\n const maxFeePerGasGwei = baseComponentGwei + effectivePriorityFeeGwei\n let maxPriorityFeePerGas =\n effectivePriorityFeeGwei > 0\n ? parseGwei(gweiToDecimalString(effectivePriorityFeeGwei))\n : parseGwei('1')\n let maxFeePerGas = parseGwei(gweiToDecimalString(maxFeePerGasGwei))\n if (useCustomGas && gasFeeMultiplier != null && gasFeeMultiplier > 0) {\n maxPriorityFeePerGas = (maxPriorityFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n maxFeePerGas = (maxFeePerGas * BigInt(100 + gasFeeMultiplier)) / 100n\n }\n ;({ maxFeePerGas, maxPriorityFeePerGas } = alignEip1559FeesWithLatestBase(\n maxFeePerGas,\n maxPriorityFeePerGas,\n latestBaseFeeWei,\n ))\n serialized = serializeTransaction({\n type: 'eip1559',\n to: step.to,\n data: step.data,\n value: step.value,\n gas: gasLimitI,\n maxFeePerGas,\n maxPriorityFeePerGas,\n nonce: currentNonce,\n chainId,\n })\n proposalTxParams = {\n nonce: currentNonce,\n gasLimit: gasLimitI.toString(),\n txType: 'eip1559',\n maxFeePerGas: maxFeePerGas.toString(),\n maxPriorityFeePerGas: maxPriorityFeePerGas.toString(),\n }\n feeSnapshot = i === 0 ? proposalTxParamsToFeeSnapshot(proposalTxParams) : {}\n }\n\n const h = keccak256(serialized)\n const msgHash = h.startsWith('0x') ? h.slice(2) : h\n\n const batchMetaExtra = args.buildBatchMeta({ step, index: i, gasLimit: gasLimitI })\n\n legs.push({\n msgHash,\n msgRaw: i === 0 && args.firstMsgRawNo0x != null ? args.firstMsgRawNo0x : serialized,\n destinationAddress: step.to,\n signatureText:\n typeof batchMetaExtra.signatureText === 'string'\n ? batchMetaExtra.signatureText\n : JSON.stringify(batchMetaExtra.signatureText ?? {}),\n audit: batchMetaExtra,\n feeSnapshot: i === 0 ? feeSnapshot : {},\n proposalTxParams,\n valueWei: i === 0 ? step.value : undefined,\n })\n\n if (i === 0 && args.firstMsgRawNo0x != null) {\n legs[0]!.msgRaw = args.firstMsgRawNo0x\n }\n }\n\n const extraJSON: Record<string, unknown> = {}\n if (useCustomGas && customGasChainDetails && Object.keys(customGasChainDetails).length > 0) {\n extraJSON.customGasChainDetails = customGasChainDetails\n }\n\n const result = finalizeMultisign({\n keyGen: keyGen as KeyGenSubset,\n purposeText,\n purposeSuffix: args.purposeSuffix,\n destinationChainID: String(chainId),\n destinationAddress: args.destinationAddress ?? steps[0]!.to,\n legs,\n extraJSON: Object.keys(extraJSON).length > 0 ? extraJSON : undefined,\n })\n const pv = args.payableValueWei\n if (pv != null && pv > 0n) {\n result.bodyForSign.value = pv.toString()\n }\n return result\n}\n\nexport const evmChainCategoryModule = {\n category: 'evm' as const,\n finalizeMultisign,\n buildEvmMultisignBatch,\n}\n","import {\n type Address,\n createPublicClient,\n defineChain,\n encodeFunctionData,\n getAddress,\n http,\n parseAbi,\n parseUnits,\n} from 'viem'\nimport { type KeyGenSubsetForPermit } from '../../../core/types.js'\nimport { buildEvmMultisignBatch } from '../../../chains/evm/buildBatch.js'\nimport type { EvmTxStep } from '../../../chains/evm/types.js'\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\ntype ChainRow = {\n legacy?: boolean\n gasLimit?: number\n gasMultiplier?: number\n gasPrice?: number\n baseFee?: number\n priorityFee?: number\n baseFeeMultiplier?: number\n}\n\nconst wethDepositAbi = parseAbi(['function deposit() payable'])\nconst erc20AllowanceAbi = parseAbi([\n 'function allowance(address owner, address spender) view returns (uint256)',\n 'function decimals() view returns (uint8)',\n])\nconst erc20ApproveAbi = parseAbi(['function approve(address spender, uint256 amount) returns (bool)'])\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 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 marketLabel = String(args.market)\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas:\n s.kind === 'weth_deposit'\n ? AAVE_WETH_DEPOSIT_FALLBACK\n : s.kind === 'approve'\n ? AAVE_ERC20_APPROVE_FALLBACK\n : s.kind === 'set_collateral'\n ? AAVE_SPOKE_SET_USING_AS_COLLATERAL_FALLBACK\n : AAVE_SPOKE_SUPPLY_ESTIMATE_FALLBACK,\n }))\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 const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n buildBatchMeta: ({ index, gasLimit }) => {\n const s = steps[index]!\n if (s.kind === 'weth_deposit') {\n return {\n signatureText: JSON.stringify({\n kind: '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 }\n if (s.kind === 'approve') {\n return {\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 }\n if (s.kind === 'set_collateral') {\n return {\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: {\n market: marketLabel,\n asset,\n spoke,\n reserveId: reserveId.toString(),\n gasBuildSetCollateral: { baseGasUnits: gasLimit.toString() },\n },\n }\n }\n return {\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: gasLimit.toString() },\n },\n }\n },\n })\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 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 keyGen: args.keyGen,\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 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 keyGen: args.keyGen,\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 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 marketLabel = String(args.market)\n const evmSteps: EvmTxStep[] = steps.map((s) => ({\n to: s.to,\n data: s.data,\n value: s.value,\n fallbackGas: s.kind === 'approve' ? AAVE_ERC20_APPROVE_FALLBACK : AAVE_SPOKE_REPAY_ESTIMATE_FALLBACK,\n }))\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 const firstDataNo0x = evmSteps[0]!.data.startsWith('0x') ? evmSteps[0]!.data.slice(2) : evmSteps[0]!.data\n\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: executor,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: evmSteps,\n purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: steps[0]!.to,\n buildBatchMeta: ({ index, gasLimit }) => {\n const s = steps[index]!\n if (s.kind === 'approve') {\n return {\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 }\n return {\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: gasLimit.toString() },\n },\n }\n },\n })\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 to = getAddress(args.to)\n const executor = getAddress(args.executorAddress)\n return buildEvmMultisignBodyAaveV4OneStep({\n keyGen: args.keyGen,\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 to = getAddress(args.to)\n const executor = getAddress(args.executorAddress)\n return buildEvmMultisignBodyAaveV4OneStep({\n keyGen: args.keyGen,\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 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 keyGen: args.keyGen,\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 keyGen: KeyGenSubsetForPermit\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 firstDataNo0x = args.v.data.startsWith('0x') ? args.v.data.slice(2) : args.v.data\n return buildEvmMultisignBatch({\n context: {\n chainCategory: 'evm',\n keyGen: args.keyGen,\n purposeText: args.purposeText,\n chainId: args.chainId,\n rpcUrl: args.rpcUrl,\n executorAddress: args.executorAddress,\n chainDetail: args.chainDetail,\n useCustomGas: args.useCustomGas,\n customGasChainDetails: args.customGasChainDetails,\n },\n steps: [\n {\n to: args.v.to,\n data: args.v.data,\n value: args.v.value,\n fallbackGas: args.estimateGasFallback,\n },\n ],\n purposeSuffix: args.purposeSuffix,\n firstMsgRawNo0x: firstDataNo0x,\n destinationAddress: args.v.to,\n buildBatchMeta: ({ gasLimit }) => args.buildBatchMeta({ gasLimit }),\n })\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 { getAddress, isAddress } from 'viem'\nimport { aaveV4Gql } from './api.js'\nimport { formatAaveV4PercentDisplay } from './api.js'\n\nconst POSITIONS_LIST = `\n query AaveUserPositions($r: UserPositionsRequest!, $currency: Currency! = USD, $w: TimeWindow! = LAST_DAY) {\n userPositions(request: $r) {\n id\n user\n createdAt\n spoke {\n id\n name\n address\n chain {\n chainId\n name\n }\n liquidationConfig {\n targetHealthFactor\n healthFactorForMaxBonus\n }\n }\n totalSupplied(currency: $currency) {\n current { value name symbol }\n }\n totalDebt(currency: $currency) {\n current { value name symbol }\n }\n netBalance(currency: $currency) {\n current { value name symbol }\n }\n healthFactor {\n current\n change(window: $w) {\n normalized\n value\n }\n }\n netApy {\n normalized\n value\n }\n }\n }\n`\n\nconst POSITION_DETAIL = `\n query AaveUserPosition(\n $r: UserPositionRequest!\n $currency: Currency! = USD\n $w: TimeWindow! = LAST_DAY\n ) {\n userPosition(request: $r) {\n id\n user\n createdAt\n spoke {\n id\n name\n address\n chain {\n chainId\n name\n }\n liquidationConfig {\n targetHealthFactor\n healthFactorForMaxBonus\n }\n }\n totalSupplied(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n totalCollateral(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n totalDebt(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n netBalance(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n netCollateral(currency: $currency) {\n current { value name symbol }\n change { normalized value }\n }\n netApy {\n normalized\n value\n }\n netSupplyApy {\n current {\n normalized\n }\n }\n netBorrowApy {\n current {\n normalized\n }\n }\n netAccruedInterest(currency: $currency) {\n value\n name\n symbol\n }\n healthFactor {\n current\n change(window: $w) {\n normalized\n value\n }\n }\n maxBorrowingPower(currency: $currency) {\n value\n name\n symbol\n }\n remainingBorrowingPower(currency: $currency) {\n value\n name\n symbol\n }\n averageCollateralFactor {\n normalized\n }\n liquidationPrice(currency: $currency) {\n value\n name\n symbol\n }\n canUpdateDynamicConfig\n netBalancePercentChange(window: $w) {\n normalized\n }\n }\n }\n`\n\nconst USER_SUPPLIES = `\n query AaveUserSupplies($r: UserSuppliesRequest!) {\n userSupplies(request: $r) {\n id\n isCollateral\n principal {\n amount {\n value\n }\n token {\n address\n info {\n symbol\n name\n icon\n }\n }\n }\n balance {\n amount {\n value\n }\n token {\n address\n info {\n symbol\n name\n }\n }\n }\n withdrawable {\n amount {\n value\n }\n token {\n address\n info {\n symbol\n }\n }\n }\n interest {\n amount {\n value\n }\n token {\n address\n info {\n symbol\n }\n }\n }\n reserve {\n id\n onChainId\n summary {\n supplyApy {\n normalized\n value\n }\n }\n asset {\n underlying {\n address\n info {\n symbol\n name\n icon\n }\n }\n }\n }\n }\n }\n`\n\nexport type AaveV4ExchangeAmount = { value: string; name: string; symbol: string }\n\nexport type AaveV4SpokeLiquidationConfig = {\n targetHealthFactor: string\n healthFactorForMaxBonus: string\n}\n\nexport type AaveV4UserPositionRow = {\n id: string\n user: string\n createdAt: string\n spoke: {\n id: string\n name: string\n address: string\n chain: { chainId: number; name?: string | null }\n liquidationConfig: AaveV4SpokeLiquidationConfig | null\n }\n totalSupplied: { current: AaveV4ExchangeAmount }\n totalDebt: { current: AaveV4ExchangeAmount }\n netBalance: { current: AaveV4ExchangeAmount }\n healthFactor: { current: string | null; change: { normalized: string; value: string } }\n netApy: { normalized: string; value: string }\n}\n\nexport type AaveV4UserPositionDetail = {\n id: string\n user: string\n createdAt: string\n spoke: AaveV4UserPositionRow['spoke']\n totalSupplied: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n totalCollateral: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n totalDebt: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n netBalance: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n netCollateral: { current: AaveV4ExchangeAmount; change: { normalized: string; value: string } }\n netApy: { normalized: string; value: string }\n netSupplyApy: { current: { normalized: string } }\n netBorrowApy: { current: { normalized: string } }\n netAccruedInterest: AaveV4ExchangeAmount\n healthFactor: { current: string | null; change: { normalized: string; value: string } }\n maxBorrowingPower: AaveV4ExchangeAmount\n remainingBorrowingPower: AaveV4ExchangeAmount\n averageCollateralFactor: { normalized: string }\n liquidationPrice: AaveV4ExchangeAmount | null\n canUpdateDynamicConfig: boolean\n netBalancePercentChange: { normalized: string }\n}\n\ntype Erc20TokenInfo = { symbol: string; name: string; icon: string | null } | null\n\nexport type AaveV4UserSupplyRow = {\n id: string\n isCollateral: boolean\n principal: {\n amount: { value: string }\n token: { address: string; info: Erc20TokenInfo }\n }\n balance: {\n amount: { value: string }\n token: { address: string; info: { symbol: string; name?: string } | null }\n }\n withdrawable: {\n amount: { value: string }\n token: { address: string; info: { symbol: string } | null }\n }\n interest: {\n amount: { value: string }\n token: { address: string; info: { symbol: string } | null }\n }\n reserve: {\n id: string\n onChainId?: string | null\n summary: { supplyApy: { normalized: string; value: string } | null } | null\n asset: {\n underlying: {\n address: string\n info: Erc20TokenInfo\n }\n }\n }\n}\n\nconst DEFAULT_CURRENCY = 'USD'\nconst DEFAULT_TIME_WINDOW = 'LAST_DAY'\n\nexport function formatAaveV4ExchangeLabel(ex: { name?: string; symbol?: string } | null | undefined): string {\n if (ex == null) return '—'\n const sym = (ex.symbol ?? '').trim()\n const name = (ex.name ?? '').trim()\n if (sym === '$' && name) return name\n if (name && sym && name.toUpperCase() !== sym) return name\n return sym || name || '—'\n}\n\nexport function formatAaveV4PositionPercent(\n normalized: string | undefined,\n value: string | undefined,\n): string {\n const n = (normalized ?? '').trim()\n const v = (value ?? '').trim()\n if (n === '0' && (v === '0' || v === '')) return '0%'\n const out = formatAaveV4PercentDisplay(normalized, value)\n return out\n}\n\nexport function formatAaveV4PositionHealthFactor(raw: string | null | undefined): string {\n if (raw == null || String(raw).trim() === '') return '∞'\n return formatAaveV4HealthFactorInner(raw)\n}\n\nfunction formatAaveV4HealthFactorInner(raw: string): string {\n const n = Number(raw)\n if (!Number.isFinite(n)) return String(raw)\n if (n >= 1e12) return '∞'\n return n >= 10 ? n.toFixed(1) : n.toFixed(2)\n}\n\nfunction buildUserPositionsRequest(\n user: `0x${string}`,\n filter: { chainIds: number[] } | { tokens: { address: `0x${string}`; chainId: number }[] },\n) {\n return {\n user,\n filter,\n orderBy: { balance: 'DESC' as const },\n }\n}\n\nexport async function fetchAaveV4UserPositionsForChain(args: {\n user: string\n chainId: number\n}): Promise<readonly AaveV4UserPositionRow[]> {\n const u = (args.user ?? '').trim()\n if (!u || !isAddress(u)) return []\n const user = getAddress(u as `0x${string}`)\n const d = await aaveV4Gql<{ userPositions: AaveV4UserPositionRow[] }>(POSITIONS_LIST, {\n r: buildUserPositionsRequest(user, { chainIds: [args.chainId] }),\n currency: DEFAULT_CURRENCY,\n w: DEFAULT_TIME_WINDOW,\n })\n return d.userPositions ?? []\n}\n\nexport type AaveV4UserPositionsByAsset = {\n forAsset: readonly AaveV4UserPositionRow[]\n other: readonly AaveV4UserPositionRow[]\n filterUnderlying: `0x${string}` | null\n}\n\nexport async function fetchAaveV4UserPositionsByAssetOnChain(args: {\n user: string\n chainId: number\n filterUnderlying: `0x${string}` | null\n}): Promise<AaveV4UserPositionsByAsset> {\n const u = (args.user ?? '').trim()\n if (!u || !isAddress(u)) {\n return { forAsset: [], other: [], filterUnderlying: null }\n }\n const user = getAddress(u as `0x${string}`)\n const c = args.chainId\n const f = args.filterUnderlying\n if (f == null) {\n const all = await fetchAaveV4UserPositionsForChain({ user: u, chainId: c })\n return { forAsset: all, other: [], filterUnderlying: null }\n }\n const token = getAddress(f)\n const [allRes, withTokenRes] = await Promise.all([\n aaveV4Gql<{ userPositions: AaveV4UserPositionRow[] }>(POSITIONS_LIST, {\n r: buildUserPositionsRequest(user, { chainIds: [c] }),\n currency: DEFAULT_CURRENCY,\n w: DEFAULT_TIME_WINDOW,\n }),\n aaveV4Gql<{ userPositions: AaveV4UserPositionRow[] }>(POSITIONS_LIST, {\n r: buildUserPositionsRequest(user, { tokens: [{ address: token, chainId: c }] }),\n currency: DEFAULT_CURRENCY,\n w: DEFAULT_TIME_WINDOW,\n }),\n ])\n const all = allRes.userPositions ?? []\n const forAsset = withTokenRes.userPositions ?? []\n const want = new Set(forAsset.map((p) => p.id))\n const other = all.filter((p) => !want.has(p.id))\n return { forAsset, other, filterUnderlying: token }\n}\n\nexport async function fetchAaveV4UserPositionById(positionId: string): Promise<AaveV4UserPositionDetail | null> {\n const id = (positionId ?? '').trim()\n if (!id) return null\n const d = await aaveV4Gql<{ userPosition: AaveV4UserPositionDetail | null }>(POSITION_DETAIL, {\n r: { id },\n currency: DEFAULT_CURRENCY,\n w: DEFAULT_TIME_WINDOW,\n })\n return d.userPosition ?? null\n}\n\nexport async function fetchAaveV4UserSuppliesForPosition(userPositionId: string): Promise<readonly AaveV4UserSupplyRow[]> {\n const pid = (userPositionId ?? '').trim()\n if (!pid) return []\n const d = await aaveV4Gql<{ userSupplies: AaveV4UserSupplyRow[] }>(USER_SUPPLIES, {\n r: {\n query: { userPositionId: pid },\n orderBy: { amount: 'DESC' },\n includeZeroBalances: false,\n },\n })\n return d.userSupplies ?? []\n}\n\n/**\n * True when the wallet has a positive supplied balance of `contextUnderlying` on this Spoke **and** the index marks\n * it as used as collateral (`isCollateral`). Use this to gate **new borrows**; **repay** should rely on variable debt\n * only, so users can repay after turning collateral off.\n */\nexport async function aaveV4UserHasAvailableBorrowCollateralForContextOnSpoke(args: {\n user: `0x${string}`\n chainId: number\n contextUnderlying: `0x${string}`\n spokeAddress: `0x${string}`\n}): Promise<boolean> {\n let wantSpoke: string\n try {\n wantSpoke = getAddress(args.spokeAddress).toLowerCase()\n } catch {\n return false\n }\n const u0 = getAddress(args.contextUnderlying).toLowerCase()\n\n const positions = await fetchAaveV4UserPositionsForChain({ user: args.user, chainId: args.chainId })\n const pos = positions.find((p) => {\n const a = (p.spoke?.address ?? '').trim()\n if (!a) return false\n try {\n return getAddress(a as `0x${string}`).toLowerCase() === wantSpoke\n } catch {\n return false\n }\n })\n if (!pos) return false\n\n const supplies = await fetchAaveV4UserSuppliesForPosition(pos.id)\n const row = supplies.find((s) => {\n const a = (s.reserve?.asset?.underlying?.address ?? '').trim()\n if (!a) return false\n try {\n return getAddress(a as `0x${string}`).toLowerCase() === u0\n } catch {\n return false\n }\n })\n if (!row) return false\n const bal = parseFloat((row.balance?.amount?.value ?? '').trim())\n if (!Number.isFinite(bal) || bal <= 0) return false\n return row.isCollateral === true\n}\n\nexport function formatAaveV4DecimalString(raw: string | undefined | null, maxFractionDigits = 6): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = Number(s)\n if (!Number.isFinite(n)) return s\n if (Math.abs(n) >= 1e9) return n.toExponential(2)\n return n.toLocaleString(undefined, { maximumFractionDigits: maxFractionDigits })\n}\n\n/**\n * For risk / borrow notional: show enough digits for small positive USD (or fiat) so values like\n * 0.0034 don’t get lost; keep net balance in {@link formatAaveV4DecimalString} for larger numbers.\n */\nexport function formatAaveV4RiskNotionalString(raw: string | undefined | null): string {\n const s = (raw ?? '').trim()\n if (!s) return '—'\n const n = Number(s)\n if (!Number.isFinite(n)) return s\n if (n === 0) return '0'\n if (Math.abs(n) >= 1e9) return n.toExponential(2)\n if (n > 0 && n < 0.5) {\n return n.toLocaleString(undefined, { maximumSignificantDigits: 4, maximumFractionDigits: 8 })\n }\n return n.toLocaleString(undefined, { maximumFractionDigits: 6 })\n}\n\nexport function formatAaveV4HealthFactor(raw: string | null | undefined): string {\n if (raw == null || String(raw).trim() === '') return '—'\n return formatAaveV4HealthFactorInner(String(raw).trim())\n}\n\nconst HF_EPS = 1e-9\n\nexport type AaveV4WithdrawHealthGateResult =\n | { outcome: 'allow' }\n | { outcome: 'block'; reason: string }\n | {\n outcome: 'confirm'\n reason: string\n targetHealthFactor: number\n healthFactorForMaxBonus: number\n }\n\nexport function aaveV4WithdrawHealthGate(args: {\n resultingHealthFactor: number | null\n hasBorrowDebt: boolean\n liquidationConfig: AaveV4SpokeLiquidationConfig | null | undefined\n}): AaveV4WithdrawHealthGateResult {\n const { hasBorrowDebt, liquidationConfig: liq } = args\n const r0 = args.resultingHealthFactor\n if (!hasBorrowDebt) {\n return { outcome: 'allow' }\n }\n if (r0 == null || !Number.isFinite(r0)) {\n return { outcome: 'block', reason: 'Could not determine health factor after withdrawal.' }\n }\n const r = r0 as number\n const t = liq == null ? NaN : Number(liq.targetHealthFactor)\n const m = liq == null ? NaN : Number(liq.healthFactorForMaxBonus)\n\n if (r <= 1 + HF_EPS) {\n return {\n outcome: 'block',\n reason: 'This withdrawal would leave health factor at or below 1.0 (liquidation range).',\n }\n }\n if (Number.isFinite(m) && m > 1 + HF_EPS && r <= m + HF_EPS) {\n return {\n outcome: 'block',\n reason: `This withdrawal would put health factor at or below the spoke’s max-liquidation-bonus threshold (${m}).`,\n }\n }\n if (Number.isFinite(t) && r < t - HF_EPS) {\n return {\n outcome: 'confirm',\n reason: `The resulting health factor would be below this market’s target (${t.toFixed(4)}).`,\n targetHealthFactor: t,\n healthFactorForMaxBonus: Number.isFinite(m) ? m : 0,\n }\n }\n return { outcome: 'allow' }\n}\n\n/**\n * After a **borrow** (or any action that lowers HF), use the same numeric gates as\n * {@link aaveV4WithdrawHealthGate} for resulting health factor.\n */\nexport function aaveV4BorrowHealthGate(args: {\n resultingHealthFactor: number | null\n liquidationConfig: AaveV4SpokeLiquidationConfig | null | undefined\n}): AaveV4WithdrawHealthGateResult {\n return aaveV4WithdrawHealthGate({\n resultingHealthFactor: args.resultingHealthFactor,\n hasBorrowDebt: true,\n liquidationConfig: args.liquidationConfig,\n })\n}\n\n/**\n * After **repay**, the protocol usually improves HF; we only block clearly dangerous previews.\n * Pass `strict: true` to apply the same thresholds as {@link aaveV4WithdrawHealthGate}.\n */\nexport function aaveV4RepayHealthGate(args: {\n resultingHealthFactor: number | null\n liquidationConfig: AaveV4SpokeLiquidationConfig | null | undefined\n /** When true, apply the same 1.0 / max-bonus / target rules as a withdrawal (rare for repay). */\n strict: boolean\n}): AaveV4WithdrawHealthGateResult {\n if (!args.strict) {\n return { outcome: 'allow' }\n }\n return aaveV4WithdrawHealthGate({\n resultingHealthFactor: args.resultingHealthFactor,\n hasBorrowDebt: true,\n liquidationConfig: args.liquidationConfig,\n })\n}\n","import { aaveV4Gql } from './api.js'\nimport type { AaveV4SpokeLiquidationConfig } from './userPositionsApi.js'\n\n/**\n * Built in {@link AaveV4Dialog} and consumed by the multi-sign page handler (withdraw / Merkl claim).\n */\nexport type AaveV4PositionActionPayload =\n | {\n kind: 'claim'\n /** Purpose / gas for this Merkl request (own fields in the Positions tab, not the shared Aave v4 form state on the page). */\n purposeText: string\n useCustomGas: boolean\n }\n | {\n kind: 'withdraw'\n reserveGraphqlId: string\n /** GraphQL or RPC-resolved on-chain id for `Spoke.withdraw`, when available. */\n reserveOnChainId: string | null\n underlying: `0x${string}`\n amountHuman: string\n withdrawRiskAck: boolean\n spokeAddress: `0x${string}`\n /** Spoke display name for sign-request metadata. */\n spokeName: string\n liquidationConfig: AaveV4SpokeLiquidationConfig | null\n hasBorrowDebt: boolean\n }\n | {\n kind: 'borrow'\n reserveGraphqlId: string\n reserveOnChainId: string | null\n underlying: `0x${string}`\n amountHuman: string\n borrowRiskAck: boolean\n spokeAddress: `0x${string}`\n spokeName: string\n liquidationConfig: AaveV4SpokeLiquidationConfig | null\n }\n | {\n kind: 'repay'\n reserveGraphqlId: string\n reserveOnChainId: string | null\n underlying: `0x${string}`\n amountHuman: string\n spokeAddress: `0x${string}`\n spokeName: string\n }\n\nconst PREVIEW_WITHDRAW = `\n query AaveV4PreviewWithdraw($req: PreviewRequest!) {\n preview(request: $req) {\n __typename\n ... on PreviewUserPosition {\n id\n healthFactor {\n __typename\n ... on HealthFactorVariation {\n current\n after\n }\n ... on HealthFactorError {\n reason\n current\n after\n }\n }\n }\n }\n }\n`\n\nconst USER_CLAIMABLE = `\n query AaveV4UserClaimableRewards($req: UserClaimableRewardsRequest!) {\n userClaimableRewards(request: $req) {\n __typename\n ... on UserMerklClaimableReward {\n id\n claimable {\n amount { value }\n exchange { value name symbol }\n token {\n address\n info { symbol name }\n }\n }\n }\n }\n }\n`\n\nconst CLAIM_REWARDS = `\n query AaveV4ClaimRewards($req: ClaimRewardsRequest!) {\n claimRewards(request: $req) {\n to\n from\n data\n value\n chainId\n }\n }\n`\n\nexport function parseBigDecimalHf(s: string | null | undefined): number | null {\n if (s == null || !String(s).trim()) return null\n const n = Number(String(s).trim())\n return Number.isFinite(n) ? n : null\n}\n\n/**\n * @returns resulting HF `after` when preview is `PreviewUserPosition` with a variation, else `null` on error or unknown.\n */\nexport async function previewAaveV4WithdrawResultingHf(args: {\n user: `0x${string}`\n reserveId: string\n amountExactHuman: string\n}): Promise<{ resultingHf: number | null; error: string | null }> {\n const req = {\n action: {\n withdraw: {\n sender: args.user,\n reserve: args.reserveId,\n amount: { erc20: { exact: args.amountExactHuman } },\n },\n },\n }\n const d = await aaveV4Gql<{\n preview: {\n __typename: string\n id?: string\n healthFactor?: {\n __typename: string\n current?: string | null\n after?: string | null\n reason?: string | null\n } | null\n } | null\n }>(PREVIEW_WITHDRAW, { req })\n const p = d.preview\n if (p?.__typename !== 'PreviewUserPosition') {\n return { resultingHf: null, error: 'Withdraw preview is not available for this request.' }\n }\n const hf = p.healthFactor\n if (hf?.__typename === 'HealthFactorError') {\n return { resultingHf: null, error: (hf as { reason?: string }).reason ?? 'Invalid withdrawal for this position.' }\n }\n if (hf?.__typename === 'HealthFactorVariation') {\n return { resultingHf: parseBigDecimalHf((hf as { after?: string }).after), error: null }\n }\n return { resultingHf: null, error: 'Could not read health factor from preview.' }\n}\n\n/**\n * @returns resulting HF `after` for a borrow preview, or error from the API.\n */\nexport async function previewAaveV4BorrowResultingHf(args: {\n user: `0x${string}`\n reserveGraphqlId: string\n amountExactHuman: string\n}): Promise<{ resultingHf: number | null; error: string | null }> {\n const req = {\n action: {\n borrow: {\n sender: args.user,\n reserve: args.reserveGraphqlId,\n amount: { erc20: { value: args.amountExactHuman } },\n },\n },\n }\n const d = await aaveV4Gql<{\n preview: {\n __typename: string\n id?: string\n healthFactor?: {\n __typename: string\n current?: string | null\n after?: string | null\n reason?: string | null\n } | null\n } | null\n }>(PREVIEW_WITHDRAW, { req })\n const p = d.preview\n if (p?.__typename !== 'PreviewUserPosition') {\n return { resultingHf: null, error: 'Borrow preview is not available for this request.' }\n }\n const hf = p.healthFactor\n if (hf?.__typename === 'HealthFactorError') {\n return { resultingHf: null, error: (hf as { reason?: string }).reason ?? 'Invalid borrow for this position.' }\n }\n if (hf?.__typename === 'HealthFactorVariation') {\n return { resultingHf: parseBigDecimalHf((hf as { after?: string }).after), error: null }\n }\n return { resultingHf: null, error: 'Could not read health factor from borrow preview.' }\n}\n\nconst PREVIEW_REPAY = `\n query AaveV4PreviewRepay($req: PreviewRequest!) {\n preview(request: $req) {\n __typename\n ... on PreviewUserPosition {\n id\n healthFactor {\n __typename\n ... on HealthFactorVariation {\n current\n after\n }\n ... on HealthFactorError {\n reason\n current\n after\n }\n }\n }\n }\n }\n`\n\n/**\n * @returns resulting HF `after` for a repay preview.\n */\nexport async function previewAaveV4RepayResultingHf(args: {\n user: `0x${string}`\n reserveGraphqlId: string\n amountExactHuman: string\n}): Promise<{ resultingHf: number | null; error: string | null }> {\n const req = {\n action: {\n repay: {\n sender: args.user,\n reserve: args.reserveGraphqlId,\n amount: { erc20: { value: { exact: args.amountExactHuman } } },\n },\n },\n }\n const d = await aaveV4Gql<{\n preview: {\n __typename: string\n id?: string\n healthFactor?: {\n __typename: string\n current?: string | null\n after?: string | null\n reason?: string | null\n } | null\n } | null\n }>(PREVIEW_REPAY, { req })\n const p = d.preview\n if (p?.__typename !== 'PreviewUserPosition') {\n return { resultingHf: null, error: 'Repay preview is not available for this request.' }\n }\n const hf = p.healthFactor\n if (hf?.__typename === 'HealthFactorError') {\n return { resultingHf: null, error: (hf as { reason?: string }).reason ?? 'Invalid repay for this position.' }\n }\n if (hf?.__typename === 'HealthFactorVariation') {\n return { resultingHf: parseBigDecimalHf((hf as { after?: string }).after), error: null }\n }\n return { resultingHf: null, error: 'Could not read health factor from repay preview.' }\n}\n\nexport type AaveV4MerklClaimableRewardRow = {\n id: string\n tokenSymbol: string\n tokenName: string\n tokenAddress: string\n /** Human amount string from the API (reward token units). */\n amountValue: string\n /** Approximate notional in `exchangeLabel` (often USD) when present. */\n exchangeValue: string | null\n exchangeLabel: string\n}\n\nexport async function fetchAaveV4MerklClaimableRewardsForChain(args: {\n user: `0x${string}`\n chainId: number\n}): Promise<readonly AaveV4MerklClaimableRewardRow[]> {\n const d = await aaveV4Gql<{\n userClaimableRewards: (\n | { __typename: string }\n | {\n __typename: 'UserMerklClaimableReward'\n id: string\n claimable: {\n amount: { value: string }\n exchange: { value: string; name: string; symbol: string }\n token: {\n address: string\n info: { symbol: string; name: string } | null\n }\n }\n }\n )[]\n }>(USER_CLAIMABLE, { req: { user: args.user, chainId: args.chainId } })\n const out: AaveV4MerklClaimableRewardRow[] = []\n for (const r of d.userClaimableRewards ?? []) {\n if (r.__typename !== 'UserMerklClaimableReward' || !('claimable' in r)) continue\n const id = (r.id ?? '').trim()\n if (!id) continue\n const c = r.claimable\n const sym = (c?.token?.info?.symbol ?? '').trim() || '—'\n const name = (c?.token?.info?.name ?? '').trim() || sym\n const addr = (c?.token?.address ?? '').trim()\n const amt = (c?.amount?.value ?? '').trim()\n const exV = (c?.exchange?.value ?? '').trim()\n const exName = (c?.exchange?.name ?? '').trim()\n const exSym = (c?.exchange?.symbol ?? '').trim()\n const exchangeLabel =\n exName && exSym && exName.toUpperCase() !== exSym.toUpperCase() ? exName : exSym || exName || '—'\n let exchangeValue: string | null = null\n if (exV) {\n const n = parseFloat(exV)\n exchangeValue = Number.isFinite(n) ? exV : null\n }\n out.push({\n id,\n tokenSymbol: sym,\n tokenName: name,\n tokenAddress: addr,\n amountValue: amt,\n exchangeValue,\n exchangeLabel,\n })\n }\n return out\n}\n\nexport async function fetchAaveV4MerklClaimRewardIdsForChain(args: {\n user: `0x${string}`\n chainId: number\n}): Promise<readonly string[]> {\n const rows = await fetchAaveV4MerklClaimableRewardsForChain(args)\n return rows.map((r) => r.id)\n}\n\nexport type AaveV4ClaimRewardsTx = {\n to: `0x${string}`\n from: `0x${string}`\n data: `0x${string}`\n value: string\n chainId: string\n}\n\nexport async function fetchAaveV4ClaimRewardsCalldata(args: {\n user: `0x${string}`\n chainId: number\n rewardIds: readonly string[]\n}): Promise<AaveV4ClaimRewardsTx | null> {\n if (args.rewardIds.length === 0) return null\n const d = await aaveV4Gql<{\n claimRewards: { to: string; from: string; data: string; value: string; chainId: string } | null\n }>(CLAIM_REWARDS, { req: { user: args.user, chainId: args.chainId, ids: args.rewardIds } })\n const c = d.claimRewards\n if (!c) return null\n return {\n to: c.to as `0x${string}`,\n from: c.from as `0x${string}`,\n data: c.data as `0x${string}`,\n value: c.value,\n chainId: c.chainId,\n }\n}\n","import { loadAaveV4SupportedChainIdsFromV4Api } from './api.js'\n\nlet cached: ReadonlySet<number> | null = null\nlet inflight: Promise<ReadonlySet<number>> | null = null\n\n/**\n * Aave v4: supported EVM chain IDs from `https://api.v4.aave.com/graphql` (`chains` query).\n * @see https://aave.com/docs/aave-v4/liquidity/chains\n */\nexport function loadAaveV4SupportedChainIds(): Promise<ReadonlySet<number>> {\n if (cached) return Promise.resolve(cached)\n if (inflight) return inflight\n inflight = (async () => {\n try {\n const s = await loadAaveV4SupportedChainIdsFromV4Api()\n cached = s\n return s\n } finally {\n inflight = null\n }\n })()\n return inflight\n}\n","/** Parse chain id for comparisons (decimal, 0x hex, CAIP-2 eip155:N, bigint). */\nexport function parseEvmChainIdToNumber(chainId: string | number | bigint | null | undefined): number {\n if (chainId == null) return Number.NaN\n if (typeof chainId === 'bigint') {\n const n = Number(chainId)\n return Number.isSafeInteger(n) && n >= 0 ? n : Number.NaN\n }\n if (typeof chainId === 'number') {\n return Number.isInteger(chainId) && chainId >= 0 ? chainId : Number.NaN\n }\n const t = String(chainId).trim()\n if (!t) return Number.NaN\n const low = t.toLowerCase()\n if (low.startsWith('eip155:')) {\n const rest = t.slice('eip155:'.length).trim()\n const n = Number.parseInt(rest, 10)\n return Number.isNaN(n) || n < 0 ? Number.NaN : n\n }\n if (low.startsWith('0x')) {\n return Number.parseInt(t, 16)\n }\n return Number.parseInt(t, 10)\n}\n","import { formatUnits, getAddress, zeroAddress } from 'viem'\nimport { parseEvmChainIdToNumber } from '../../../chains/evm/chainIdParse.js'\n\nexport type AavePercentValueLike = { formatted: string; value: string } | null | undefined\n\nexport type AaveDecimalValueLike = { raw: string; decimals: number; value: string } | null | undefined\n\nexport type AaveSupplyInfoLike = {\n apy?: AavePercentValueLike\n total?: AaveDecimalValueLike\n} | null | undefined\n\nexport type AaveBorrowInfoLike = {\n total?: {\n amount?: AaveDecimalValueLike\n } | null\n} | null | undefined\n\n/**\n * Format Aave `PercentValue.formatted` for UI (e.g. supply/borrow APY), appending a % if missing.\n */\nexport function formatAavePercentDisplay(p: AavePercentValueLike): string {\n if (!p) return '—'\n const t = (p.formatted ?? '').trim()\n if (t) return t.includes('%') ? t : `${t}%`\n const v = (p.value ?? '').trim()\n if (!v) return '—'\n const n = Number(v) * 100\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\n/**\n * Free liquidity in the reserve: supplied liquidity minus total borrowed (underlying, token units as string).\n */\nexport function aaveAvailableLiquidityDisplay(\n supplyInfo: AaveSupplyInfoLike,\n borrowInfo: AaveBorrowInfoLike,\n): string {\n const sTotal = supplyInfo?.total\n const bAmt = borrowInfo?.total?.amount\n if (!sTotal?.raw || sTotal.decimals == null) return '—'\n if (!bAmt?.raw || bAmt.decimals == null) return '—'\n try {\n if (sTotal.decimals !== bAmt.decimals) return '—'\n const a = BigInt(sTotal.raw) - BigInt(bAmt.raw)\n if (a < 0n) return '0'\n return formatUnits(a, sTotal.decimals)\n } catch {\n return '—'\n }\n}\n\n/**\n * Map Assets row / native to Aave market underlying. Native uses the chain’s wrapped token address from the API.\n */\nexport function aaveUnderlyingAddressForContext(args: {\n contextContract: string\n chainNativeWrapped: string | null | undefined\n}): `0x${string}` {\n const raw = (args.contextContract ?? '').trim()\n try {\n const a = getAddress(raw)\n if (a.toLowerCase() === zeroAddress.toLowerCase() && args.chainNativeWrapped) {\n return getAddress(args.chainNativeWrapped.trim() as `0x${string}`)\n }\n return a\n } catch {\n return getAddress(zeroAddress)\n }\n}\n\nexport function isValidAaveChainId(assetsChainId: string | undefined | null): boolean {\n if (assetsChainId == null) return false\n const n = parseEvmChainIdToNumber(assetsChainId)\n return !Number.isNaN(n) && n >= 0\n}\n\n/**\n * Per-reserve supply rows from the Aave client `market` call (shaped for read-only display).\n */\nexport function aaveReadSupplyMetrics(\n reserve: unknown,\n symbolForDisplay: string,\n): {\n depositedAmount: string\n apy: string\n totalDeposits: string\n availableLiquidity: string\n} {\n if (!reserve || typeof reserve !== 'object') {\n return { depositedAmount: '—', apy: '—', totalDeposits: '—', availableLiquidity: '—' }\n }\n const r = reserve as {\n supplyInfo?: { apy?: AavePercentValueLike; total?: AaveDecimalValueLike }\n borrowInfo?: AaveBorrowInfoLike\n userState?: { balance?: { amount?: { value?: string } } | null } | null\n }\n const apy = formatAavePercentDisplay(r.supplyInfo?.apy)\n const tot = (r.supplyInfo?.total?.value ?? '—') as string\n const liq = aaveAvailableLiquidityDisplay(r.supplyInfo, r.borrowInfo)\n const dep = (r.userState?.balance?.amount?.value ?? '—') as string\n const sym = (symbolForDisplay ?? '').trim()\n return {\n depositedAmount: dep === '—' ? '—' : sym ? `${dep} ${sym}` : dep,\n apy,\n totalDeposits: tot === '—' ? '—' : sym ? `${tot} ${sym}` : tot,\n availableLiquidity: liq === '—' ? '—' : sym ? `${liq} ${sym}` : liq,\n }\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'\nexport * from './userPositionsApi.js'\nexport * from './positionActionsApi.js'\nexport * from './loadSupportedChainIds.js'\nexport * from './reserveDisplay.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"]}