@continuumdao/ctm-mpc-defi 0.2.62 → 0.2.64

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 (33) hide show
  1. package/dist/agent/catalog.cjs +329 -79
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +217 -27
  4. package/dist/agent/catalog.js +325 -80
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/aerodrome/SKILL.md +16 -14
  7. package/dist/agent/skills/continuum-dao/SKILL.md +2 -2
  8. package/dist/agent/skills/railgun/SKILL.md +10 -4
  9. package/dist/agent/skills/yield-compare/SKILL.md +5 -5
  10. package/dist/index.cjs +5 -4
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +5 -4
  13. package/dist/index.js.map +1 -1
  14. package/dist/protocols/evm/aerodrome/index.cjs +476 -282
  15. package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
  16. package/dist/protocols/evm/aerodrome/index.d.ts +38 -13
  17. package/dist/protocols/evm/aerodrome/index.js +473 -284
  18. package/dist/protocols/evm/aerodrome/index.js.map +1 -1
  19. package/dist/protocols/evm/continuum-dao/index.cjs +397 -70
  20. package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
  21. package/dist/protocols/evm/continuum-dao/index.d.ts +27 -3
  22. package/dist/protocols/evm/continuum-dao/index.js +398 -71
  23. package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
  24. package/dist/protocols/evm/curve-dao/index.cjs +54 -6
  25. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  26. package/dist/protocols/evm/curve-dao/index.js +54 -6
  27. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  28. package/dist/protocols/evm/euler-v2/index.cjs +45 -10
  29. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  30. package/dist/protocols/evm/euler-v2/index.d.ts +10 -2
  31. package/dist/protocols/evm/euler-v2/index.js +44 -11
  32. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  33. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
- import { getAddress, zeroAddress, encodePacked, parseUnits, formatUnits, encodeFunctionData, defineChain, createPublicClient, http, parseGwei, serializeTransaction, keccak256 } from 'viem';
1
+ import { getAddress, zeroAddress, encodePacked, parseUnits, formatUnits, encodeFunctionData, defineChain, createPublicClient, encodeAbiParameters, http, parseGwei, serializeTransaction, keccak256 } from 'viem';
2
2
  import { fetchChainFeeParams, gasLimitFromEstimateAndChainConfig, gweiToDecimalString, proposalTxParamsToFeeSnapshot, alignEip1559FeesWithLatestBase, getClientIdFromKeyGenResult } from '@continuumdao/continuum-node-sdk';
3
3
 
4
4
  var __defProp = Object.defineProperty;
@@ -20,7 +20,11 @@ var init_expiry = __esm({
20
20
  });
21
21
  function isAerodromeChainSupported(chainId) {
22
22
  const n = typeof chainId === "number" ? chainId : Number.parseInt(String(chainId), 10);
23
- return n === AERODROME_CHAIN_ID;
23
+ return AERO_CHAIN_IDS.includes(n);
24
+ }
25
+ function aerodromeUnsupportedChainMessage(chainId) {
26
+ const listed = AERO_CHAIN_IDS.map((id) => `${AERO_CHAIN_LABEL[id]} ${id}`).join(", ");
27
+ return `Aero is not deployed on chain ${chainId}. Launch chains: ${listed}.`;
24
28
  }
25
29
  function aerodromeOnChainDeadlineUnix(expiryDate) {
26
30
  if (typeof expiryDate === "number" && Number.isFinite(expiryDate) && expiryDate > 0) {
@@ -32,7 +36,7 @@ function requireAerodromeRpcUrl(rpcUrl) {
32
36
  const url = (rpcUrl ?? "").trim();
33
37
  if (!url) {
34
38
  throw new Error(
35
- "rpcUrl is required. The MCP server injects it from get_chain_registry rpcGateway \u2014 pass chainId 8453 only, do not pass a public RPC URL."
39
+ "rpcUrl is required. The MCP server injects it from get_chain_registry rpcGateway \u2014 pass an Aero chainId (Base 8453, Ethereum 1, OP 10, Arbitrum 42161, Robinhood 4663, Arc 5042, Ink 57073). Do not pass a public RPC URL."
36
40
  );
37
41
  }
38
42
  return url;
@@ -48,26 +52,27 @@ function isAerodromeNativeToken(address) {
48
52
  return false;
49
53
  }
50
54
  }
51
- var AERODROME_PROTOCOL_ID, AERODROME_CHAIN_ID, AERODROME_NATIVE_PLACEHOLDER, AERODROME_WETH_BASE, AERODROME_USDC_BASE;
55
+ var AERODROME_PROTOCOL_ID, AERODROME_CHAIN_ID, AERO_CHAIN_IDS, AERO_CHAIN_LABEL, AERODROME_NATIVE_PLACEHOLDER, AERODROME_WETH_BASE, AERODROME_USDC_BASE;
52
56
  var init_support = __esm({
53
57
  "src/protocols/evm/aerodrome/support.ts"() {
54
58
  init_expiry();
55
59
  AERODROME_PROTOCOL_ID = "aerodrome";
56
60
  AERODROME_CHAIN_ID = 8453;
61
+ AERO_CHAIN_IDS = [8453, 1, 10, 42161, 4663, 5042, 57073];
62
+ AERO_CHAIN_LABEL = {
63
+ 1: "Ethereum",
64
+ 10: "OP Mainnet",
65
+ 42161: "Arbitrum",
66
+ 4663: "Robinhood Chain",
67
+ 5042: "Arc",
68
+ 8453: "Base",
69
+ 57073: "Ink"
70
+ };
57
71
  AERODROME_NATIVE_PLACEHOLDER = zeroAddress;
58
72
  AERODROME_WETH_BASE = "0x4200000000000000000000000000000000000006";
59
73
  AERODROME_USDC_BASE = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
60
74
  }
61
75
  });
62
- function asAddr(raw) {
63
- const s = (raw ?? "").trim();
64
- if (!s) return null;
65
- try {
66
- return getAddress(s.startsWith("0x") ? s : `0x${s}`);
67
- } catch {
68
- return null;
69
- }
70
- }
71
76
  function parseSugarBaseEnv(text) {
72
77
  const out = {};
73
78
  for (const line of text.split(/\r?\n/)) {
@@ -87,77 +92,99 @@ function parseSecurityMdxAddresses(text) {
87
92
  let m;
88
93
  while (m = re.exec(text)) {
89
94
  const name = (m[1] ?? "").trim().toLowerCase().replace(/\s+/g, "");
90
- const addr = m[2];
91
- if (name && addr && !out[name]) out[name] = addr;
95
+ const addr2 = m[2];
96
+ if (name && addr2 && !out[name]) out[name] = addr2;
92
97
  }
93
98
  return out;
94
99
  }
95
- function nthAddr(csv, n) {
96
- if (!csv) return null;
97
- const part = csv.split(",")[n];
98
- return part ? asAddr(part.trim()) : null;
100
+ function addr(raw) {
101
+ return getAddress(raw);
102
+ }
103
+ function aeroUsdcAddress(chainId) {
104
+ const raw = AERO_USDC_BY_CHAIN[chainId];
105
+ return raw ? addr(raw) : null;
99
106
  }
100
- function firstAddr(csv) {
101
- return nthAddr(csv, 0);
107
+ function aeroWrappedNativeAddress(chainId) {
108
+ const raw = AERO_WETH_BY_CHAIN[chainId];
109
+ return raw ? addr(raw) : null;
110
+ }
111
+ function aeroRowIconAddresses(chainId) {
112
+ const out = [];
113
+ if (chainId === AERODROME_CHAIN_ID) {
114
+ out.push(addr(AERO_LEGACY_TOKEN_BASE), addr(AERO_TOKEN_BASE));
115
+ }
116
+ const receipt = AERO_RECEIPT_BY_CHAIN[chainId];
117
+ if (receipt) out.push(addr(receipt));
118
+ const weth = aeroWrappedNativeAddress(chainId);
119
+ if (weth) out.push(weth);
120
+ const usdc = aeroUsdcAddress(chainId);
121
+ if (usdc) out.push(usdc);
122
+ return out;
102
123
  }
103
- function mergeLoaded(sugar, docs) {
124
+ function aeroAddressesForChain(chainId) {
104
125
  const fb = AERODROME_BASE_ADDRESSES_FALLBACK;
105
- const pick = (loaded, fallback) => loaded ?? getAddress(fallback);
126
+ const cl = addr(AERO_CL_FACTORY_BY_CHAIN[chainId] ?? AERO_CL_FACTORY_BY_CHAIN[AERODROME_CHAIN_ID]);
127
+ const receipt = addr(AERO_RECEIPT_BY_CHAIN[chainId] ?? AERO_RECEIPT_BY_CHAIN[AERODROME_CHAIN_ID]);
128
+ const weth = aeroWrappedNativeAddress(chainId) ?? addr("0x0000000000000000000000000000000000000000");
129
+ const token = chainId === AERODROME_CHAIN_ID ? addr(AERO_TOKEN_BASE) : receipt;
106
130
  return {
107
- chainId: AERODROME_CHAIN_ID,
108
- aero: pick(asAddr(docs.aero), fb.aero),
109
- router: pick(asAddr(docs.router), fb.router),
110
- poolFactory: pick(firstAddr(sugar.V2_FACTORIES_8453) ?? asAddr(docs.poolfactory), fb.poolFactory),
111
- factoryRegistry: pick(asAddr(sugar.REGISTRY_8453) ?? asAddr(docs.factoryregistry), fb.factoryRegistry),
112
- voter: pick(asAddr(sugar.VOTER_8453) ?? asAddr(docs.voter), fb.voter),
113
- votingEscrow: pick(asAddr(docs.votingescrow), fb.votingEscrow),
114
- rewardsDistributor: pick(asAddr(sugar.DIST_8453) ?? asAddr(docs.rewardsdistributor), fb.rewardsDistributor),
115
- mixedQuoter: pick(asAddr(docs.mixedquoter), fb.mixedQuoter),
116
- mixedQuoterV3: pick(asAddr(docs.mixedquoterv3), fb.mixedQuoterV3),
117
- nfpm: pick(asAddr(docs.nonfungiblepositionmanager), fb.nfpm),
118
- clFactory: pick(firstAddr(sugar.CL_FACTORIES_8453) ?? asAddr(docs.poolfactory), fb.clFactory),
119
- clFactory2: pick(nthAddr(sugar.CL_FACTORIES_8453, 1), fb.clFactory2),
120
- clFactory3: pick(nthAddr(sugar.CL_FACTORIES_8453, 2), fb.clFactory3),
121
- universalRouter: pick(asAddr(docs.universalrouter), fb.universalRouter),
122
- swapRouter: pick(asAddr(docs.swaprouter), fb.swapRouter),
123
- swapRouter2: pick(asAddr(docs.swaprouter2), fb.swapRouter2),
124
- swapRouter3: pick(asAddr(docs.swaprouter3), fb.swapRouter3),
125
- pricesOracle: pick(asAddr(docs.pricesoracle), fb.pricesOracle),
126
- slipstreamHelper: pick(asAddr(docs.slipstreamhelper), fb.slipstreamHelper),
127
- lpSugar: pick(asAddr(sugar.LP_SUGAR_ADDRESS_8453), fb.lpSugar),
128
- sugarSlipstreamHelper: pick(asAddr(sugar.SLIPSTREAM_HELPER_8453), fb.sugarSlipstreamHelper),
129
- swapper: pick(asAddr(sugar.SWAPPER_8453), fb.swapper),
130
- weth: pick(asAddr(AERODROME_WETH_BASE), fb.weth)
131
+ chainId,
132
+ aero: token,
133
+ router: chainId === AERODROME_CHAIN_ID ? addr(fb.router) : addr(AERO_METAROUTER),
134
+ poolFactory: addr(AERO_VOLATILE_POOL_FACTORY),
135
+ factoryRegistry: addr(AERO_FACTORY_REGISTRY_BY_CHAIN[chainId] ?? AERO_FACTORY_REGISTRY_BY_CHAIN[AERODROME_CHAIN_ID]),
136
+ voter: addr(AERO_LEAF_VOTER),
137
+ votingEscrow: addr("0xBF7977E1521e9a3032bf7243Ee4712f311f13915"),
138
+ rewardsDistributor: addr(fb.rewardsDistributor),
139
+ mixedQuoter: addr(AERO_METAQUOTER),
140
+ mixedQuoterV3: addr(AERO_METAQUOTER),
141
+ nfpm: addr(AERO_NFPM),
142
+ clFactory: cl,
143
+ clFactory2: cl,
144
+ clFactory3: cl,
145
+ universalRouter: addr(fb.universalRouter),
146
+ swapRouter: addr(AERO_SWAP_ROUTER),
147
+ swapRouter2: addr(AERO_SWAP_ROUTER),
148
+ swapRouter3: addr(AERO_SWAP_ROUTER),
149
+ pricesOracle: addr(fb.pricesOracle),
150
+ slipstreamHelper: addr(fb.slipstreamHelper),
151
+ lpSugar: chainId === AERODROME_CHAIN_ID ? addr(fb.lpSugar) : addr("0x0000000000000000000000000000000000000000"),
152
+ sugarSlipstreamHelper: addr(fb.sugarSlipstreamHelper),
153
+ swapper: addr(fb.swapper),
154
+ weth,
155
+ stablePoolFactory: addr(AERO_STABLE_POOL_FACTORY),
156
+ volatilePoolFactory: addr(AERO_VOLATILE_POOL_FACTORY),
157
+ metarouter: addr(AERO_METAROUTER),
158
+ metaquoter: addr(AERO_METAQUOTER),
159
+ receiptToken: receipt
131
160
  };
132
161
  }
133
- async function fetchText(url) {
134
- try {
135
- const res = await fetch(url, { cache: "force-cache" });
136
- if (!res.ok) return null;
137
- return await res.text();
138
- } catch {
139
- return null;
140
- }
141
- }
142
- async function loadAerodromeAddresses() {
143
- if (!cache) {
144
- cache = (async () => {
145
- const [sugarText, docsText] = await Promise.all([fetchText(SUGAR_ENV_URL), fetchText(SECURITY_MDX_URL)]);
146
- const sugar = sugarText ? parseSugarBaseEnv(sugarText) : {};
147
- const docs = docsText ? parseSecurityMdxAddresses(docsText) : {};
148
- return mergeLoaded(sugar, docs);
149
- })();
162
+ async function loadAerodromeAddresses(chainId = AERODROME_CHAIN_ID) {
163
+ if (!isAerodromeChainSupported(chainId)) {
164
+ throw new Error(aerodromeUnsupportedChainMessage(chainId));
150
165
  }
151
- return cache;
166
+ const cached = cache.get(chainId);
167
+ if (cached) return cached;
168
+ const addrs = aeroAddressesForChain(chainId);
169
+ cache.set(chainId, addrs);
170
+ return addrs;
152
171
  }
153
172
  function resetAerodromeAddressCache() {
154
- cache = null;
173
+ cache = /* @__PURE__ */ new Map();
155
174
  }
156
175
  function aerodromeFallbackAddresses() {
157
- return mergeLoaded({}, {});
176
+ return aeroAddressesForChain(AERODROME_CHAIN_ID);
158
177
  }
159
178
  function aerodromeClFactoryList(addrs) {
160
- return [addrs.clFactory, addrs.clFactory2, addrs.clFactory3];
179
+ const out = [];
180
+ const seen = /* @__PURE__ */ new Set();
181
+ for (const factory of [addrs.clFactory, addrs.clFactory2, addrs.clFactory3]) {
182
+ const key = factory.toLowerCase();
183
+ if (seen.has(key)) continue;
184
+ seen.add(key);
185
+ out.push(factory);
186
+ }
187
+ return out;
161
188
  }
162
189
  function aerodromeClSwapRouterForFactory(addrs, factory) {
163
190
  const f = getAddress(factory).toLowerCase();
@@ -165,7 +192,7 @@ function aerodromeClSwapRouterForFactory(addrs, factory) {
165
192
  if (f === addrs.clFactory2.toLowerCase()) return addrs.swapRouter2;
166
193
  return addrs.swapRouter;
167
194
  }
168
- var AERODROME_BASE_ADDRESSES_FALLBACK, SUGAR_ENV_URL, SECURITY_MDX_URL, cache;
195
+ var AERODROME_BASE_ADDRESSES_FALLBACK, AERO_TOKEN_BASE, AERO_LEGACY_TOKEN_BASE, AERO_METAROUTER, AERO_METAQUOTER, AERO_STABLE_POOL_FACTORY, AERO_VOLATILE_POOL_FACTORY, AERO_NFPM, AERO_SWAP_ROUTER, AERO_LEAF_VOTER, AERO_RECEIPT_BY_CHAIN, AERO_FACTORY_REGISTRY_BY_CHAIN, AERO_CL_FACTORY_BY_CHAIN, OP_STACK_WETH, AERO_WETH_BY_CHAIN, AERO_USDC_BY_CHAIN, cache;
169
196
  var init_addresses = __esm({
170
197
  "src/protocols/evm/aerodrome/addresses.ts"() {
171
198
  init_support();
@@ -199,9 +226,58 @@ var init_addresses = __esm({
199
226
  swapper: "0x91616a7B9CF6D23f8C17845581051EBdC4BcB916",
200
227
  weth: AERODROME_WETH_BASE
201
228
  };
202
- SUGAR_ENV_URL = "https://raw.githubusercontent.com/velodrome-finance/sugar/main/deployments/base.env";
203
- SECURITY_MDX_URL = "https://raw.githubusercontent.com/aerodrome-finance/docs/main/content/security.mdx";
204
- cache = null;
229
+ AERO_TOKEN_BASE = "0x3f5bF3EdAc59d650D8fDf9657a71F2f904A3a4Ee";
230
+ AERO_LEGACY_TOKEN_BASE = "0x940181a94A35A4569E4529A3CDfB74e38FD98631";
231
+ AERO_METAROUTER = "0x0fEf9e88A7b76BCDBF451780C6774FE32965Ee98";
232
+ AERO_METAQUOTER = "0x1dDfeC5058180C207F55BB77D95AcDd0d8227868";
233
+ AERO_STABLE_POOL_FACTORY = "0x78589E876edcEbdce72ee3436ab3c9AD3a7cEF2D";
234
+ AERO_VOLATILE_POOL_FACTORY = "0x8E6a9FCd1d638CC760Ffba397605Fe3355dE76D2";
235
+ AERO_NFPM = "0x4857DB576eE0e45F10525eC59527BfD10beeC60b";
236
+ AERO_SWAP_ROUTER = "0x9Ee35Bf1bd69a03c6F0393582030fCe8Bb93D418";
237
+ AERO_LEAF_VOTER = "0x382409fad8503FbCdbB27A4211551fa03e884078";
238
+ AERO_RECEIPT_BY_CHAIN = {
239
+ 8453: "0x6CdDa0E730744DC6fF67654B35350Adad05EceE7",
240
+ 10: "0xbdEaeA5205d16f34Cb40038052d91235D87B4C54",
241
+ 42161: "0x436a085B2751cB87db270FFa66f8d698F87bEC82",
242
+ 1: "0x9e148C5716b5aAdCFD3B71cEAE9EE7a9e22C29E2",
243
+ 57073: "0x9e148C5716b5aAdCFD3B71cEAE9EE7a9e22C29E2",
244
+ 4663: "0x9e148C5716b5aAdCFD3B71cEAE9EE7a9e22C29E2",
245
+ 5042: "0x20077cC0d5E385A0Fe9C91bbC7DC744f51559307"
246
+ };
247
+ AERO_FACTORY_REGISTRY_BY_CHAIN = {
248
+ 8453: "0x7b2A2c12dC5Ea2a31455952a05031C3E4BB28F3E",
249
+ 10: "0xb6F9705A631CC1C0E8570FFde48882C95E2Df408",
250
+ 42161: "0x9E635b2c689fC52201DF7eF1C9FA607c2F58f666",
251
+ 1: "0xdd1705e23762F4D6e44D8C31BD8Ea80c54612239",
252
+ 57073: "0xdd1705e23762F4D6e44D8C31BD8Ea80c54612239",
253
+ 4663: "0xdd1705e23762F4D6e44D8C31BD8Ea80c54612239",
254
+ 5042: "0xCe44907DC45D3BFa3f5f6035B0e6E8B22D780A42"
255
+ };
256
+ AERO_CL_FACTORY_BY_CHAIN = {
257
+ 8453: "0x9CB220581b91b0C83223012FE69688b92aD07a76",
258
+ 10: "0xfeaB42D90055db3a0616249f76B6002D72266778",
259
+ 42161: "0x88a60ee77392577c355C0acb2A8d476D5a4EC03a",
260
+ 1: "0xF4Fd2E6c5B60c5b365cd1B96DD6245E6D60414c2",
261
+ 57073: "0x7660BF2aDefC687C22906112ca323d60A00358cF",
262
+ 4663: "0xc63d7338c178e805c544B8f897066bD3BBcBE136",
263
+ 5042: "0x7F83235643181E440433400a027618Cd50879751"
264
+ };
265
+ OP_STACK_WETH = "0x4200000000000000000000000000000000000006";
266
+ AERO_WETH_BY_CHAIN = {
267
+ 1: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
268
+ 10: OP_STACK_WETH,
269
+ 42161: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
270
+ 8453: OP_STACK_WETH,
271
+ 57073: OP_STACK_WETH,
272
+ 4663: "0x0Bd7D308f8E1639FAb988df18A8011f41EAcAD73"
273
+ };
274
+ AERO_USDC_BY_CHAIN = {
275
+ 1: "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48",
276
+ 10: "0x0b2C639c533813f4Aa9D7837CAf62653d097Ff85",
277
+ 42161: "0xaf88d065e77c8cC2239327C5EDb3A432268e5831",
278
+ 8453: "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913"
279
+ };
280
+ cache = /* @__PURE__ */ new Map();
205
281
  }
206
282
  });
207
283
  function isCoinbaseB20AssetToken(address) {
@@ -328,7 +404,7 @@ var init_coinbaseB20 = __esm({
328
404
  });
329
405
 
330
406
  // src/protocols/evm/aerodrome/abi.ts
331
- var lpSugarAbi, routerAbi, mixedQuoterAbi, mixedQuoterV3Abi, v2PoolFactoryAbi, clPoolFactoryAbi, clPoolAbi, sugarHelperAbi, nfpmAbi, clSwapRouterAbi, poolClaimFeesAbi, gaugeAbi, clGaugeAbi, aerodromePoolMetaAbi, aerodromeVoterAbi, erc20Abi;
407
+ var lpSugarAbi, routerAbi, mixedQuoterAbi, mixedQuoterV3Abi, aeroV2FactoryAbi, aeroPoolAmountOutAbi, aeroMetarouterAbi, clPoolFactoryAbi, clPoolAbi, sugarHelperAbi, nfpmAbi, clSwapRouterAbi, poolClaimFeesAbi, gaugeAbi, clGaugeAbi, aerodromePoolMetaAbi, aerodromeVoterAbi, erc20Abi;
332
408
  var init_abi = __esm({
333
409
  "src/protocols/evm/aerodrome/abi.ts"() {
334
410
  lpSugarAbi = [
@@ -762,19 +838,42 @@ var init_abi = __esm({
762
838
  ]
763
839
  }
764
840
  ];
765
- v2PoolFactoryAbi = [
841
+ aeroV2FactoryAbi = [
766
842
  {
767
843
  type: "function",
768
844
  name: "getPool",
769
845
  stateMutability: "view",
770
846
  inputs: [
771
847
  { name: "tokenA", type: "address" },
772
- { name: "tokenB", type: "address" },
773
- { name: "stable", type: "bool" }
848
+ { name: "tokenB", type: "address" }
774
849
  ],
775
850
  outputs: [{ name: "", type: "address" }]
776
851
  }
777
852
  ];
853
+ aeroPoolAmountOutAbi = [
854
+ {
855
+ type: "function",
856
+ name: "getAmountOut",
857
+ stateMutability: "view",
858
+ inputs: [
859
+ { name: "amountIn", type: "uint256" },
860
+ { name: "tokenIn", type: "address" }
861
+ ],
862
+ outputs: [{ name: "", type: "uint256" }]
863
+ }
864
+ ];
865
+ aeroMetarouterAbi = [
866
+ {
867
+ type: "function",
868
+ name: "execute",
869
+ stateMutability: "payable",
870
+ inputs: [
871
+ { name: "commands", type: "bytes" },
872
+ { name: "inputs", type: "bytes[]" }
873
+ ],
874
+ outputs: []
875
+ }
876
+ ];
778
877
  clPoolFactoryAbi = [
779
878
  {
780
879
  type: "function",
@@ -1355,8 +1454,8 @@ var init_stockTokens = __esm({
1355
1454
  MAX_OFFICIAL_STOCKS = 40;
1356
1455
  }
1357
1456
  });
1358
- function checksum(addr) {
1359
- return getAddress(addr);
1457
+ function checksum(addr2) {
1458
+ return getAddress(addr2);
1360
1459
  }
1361
1460
  function pairKey(a, b) {
1362
1461
  const [x, y] = [a.toLowerCase(), b.toLowerCase()].sort();
@@ -1398,7 +1497,8 @@ async function tickSpacingsForFactory(rpcUrl, factory) {
1398
1497
  }
1399
1498
  async function aerodromeDiscoverConnectorPools(args) {
1400
1499
  const client = aerodromePublicClient(args.rpcUrl);
1401
- const connectors = [args.addrs.weth, getAddress(AERODROME_USDC_BASE), args.addrs.aero];
1500
+ const usdc = aeroUsdcAddress(args.addrs.chainId);
1501
+ const connectors = [args.addrs.weth, ...usdc ? [usdc] : [], args.addrs.aero];
1402
1502
  const pairs = connectorPairs(args.tokenIn, args.tokenOut, connectors);
1403
1503
  const clFactories = aerodromeClFactoryList(args.addrs);
1404
1504
  const spacingsByFactory = await Promise.all(
@@ -1418,10 +1518,10 @@ async function aerodromeDiscoverConnectorPools(args) {
1418
1518
  allowFailure: true,
1419
1519
  contracts: jobs.map(
1420
1520
  (job) => job.kind === "v2" ? {
1421
- address: args.addrs.poolFactory,
1422
- abi: v2PoolFactoryAbi,
1521
+ address: job.stable ? args.addrs.stablePoolFactory : args.addrs.volatilePoolFactory,
1522
+ abi: aeroV2FactoryAbi,
1423
1523
  functionName: "getPool",
1424
- args: [job.tokenA, job.tokenB, job.stable]
1524
+ args: [job.tokenA, job.tokenB]
1425
1525
  } : {
1426
1526
  address: job.factory,
1427
1527
  abi: clPoolFactoryAbi,
@@ -1449,7 +1549,7 @@ async function aerodromeDiscoverConnectorPools(args) {
1449
1549
  type: job.stable ? 0 : -1,
1450
1550
  token0: checksum(token0),
1451
1551
  token1: checksum(token1),
1452
- factory: args.addrs.poolFactory,
1552
+ factory: job.stable ? args.addrs.stablePoolFactory : args.addrs.volatilePoolFactory,
1453
1553
  poolFee: "0",
1454
1554
  kind: job.stable ? "stable" : "volatile"
1455
1555
  });
@@ -1468,11 +1568,11 @@ async function aerodromeDiscoverConnectorPools(args) {
1468
1568
  return pools;
1469
1569
  }
1470
1570
  async function aerodromeDiscoverConnectorPoolsLoaded(args) {
1471
- const addrs = await loadAerodromeAddresses();
1571
+ const addrs = await loadAerodromeAddresses(args.chainId);
1472
1572
  return aerodromeDiscoverConnectorPools({ ...args, addrs });
1473
1573
  }
1474
1574
  async function aerodromeDiscoverDirectPools(args) {
1475
- const addrs = await loadAerodromeAddresses();
1575
+ const addrs = await loadAerodromeAddresses(args.chainId);
1476
1576
  const client = aerodromePublicClient(args.rpcUrl);
1477
1577
  const tokenA = checksum(args.tokenA);
1478
1578
  const tokenB = checksum(args.tokenB);
@@ -1491,10 +1591,10 @@ async function aerodromeDiscoverDirectPools(args) {
1491
1591
  allowFailure: true,
1492
1592
  contracts: jobs.map(
1493
1593
  (job) => job.kind === "v2" ? {
1494
- address: addrs.poolFactory,
1495
- abi: v2PoolFactoryAbi,
1594
+ address: job.stable ? addrs.stablePoolFactory : addrs.volatilePoolFactory,
1595
+ abi: aeroV2FactoryAbi,
1496
1596
  functionName: "getPool",
1497
- args: [tokenA, tokenB, job.stable]
1597
+ args: [tokenA, tokenB]
1498
1598
  } : {
1499
1599
  address: job.factory,
1500
1600
  abi: clPoolFactoryAbi,
@@ -1522,7 +1622,7 @@ async function aerodromeDiscoverDirectPools(args) {
1522
1622
  type: job.stable ? 0 : -1,
1523
1623
  token0,
1524
1624
  token1,
1525
- factory: addrs.poolFactory,
1625
+ factory: job.stable ? addrs.stablePoolFactory : addrs.volatilePoolFactory,
1526
1626
  poolFee: "0",
1527
1627
  kind: job.stable ? "stable" : "volatile"
1528
1628
  });
@@ -1546,10 +1646,10 @@ function tokenLabel(raw, resolved, isNative) {
1546
1646
  }
1547
1647
  async function aerodromeDiscoverPoolsSummary(args) {
1548
1648
  if (!isAerodromeChainSupported(args.chainId)) {
1549
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
1649
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
1550
1650
  }
1551
1651
  const rpcUrl = requireAerodromeRpcUrl(args.rpcUrl);
1552
- const addrs = await loadAerodromeAddresses();
1652
+ const addrs = await loadAerodromeAddresses(args.chainId);
1553
1653
  await ensureAerodromeStockTickers([args.token, args.tokenOut ?? ""]);
1554
1654
  const isNative = isAerodromeNativeToken(args.token);
1555
1655
  const token = resolveAerodromeErc20OrWeth(args.token, addrs.weth);
@@ -1565,7 +1665,7 @@ async function aerodromeDiscoverPoolsSummary(args) {
1565
1665
  const inLabel = tokenLabel(args.token, token, isNative);
1566
1666
  const outLabel = tokenLabel(counterpartRaw, tokenOut, isNativeOut);
1567
1667
  return {
1568
- chainId: AERODROME_CHAIN_ID,
1668
+ chainId: args.chainId,
1569
1669
  token: {
1570
1670
  address: isNative ? zeroAddress : token,
1571
1671
  symbol: inLabel,
@@ -1632,7 +1732,8 @@ function isMainPair(token0, token1, aero) {
1632
1732
  return mains.has(token0.toLowerCase()) && mains.has(token1.toLowerCase());
1633
1733
  }
1634
1734
  async function fetchSugarYieldPage(args) {
1635
- const addrs = await loadAerodromeAddresses();
1735
+ const addrs = await loadAerodromeAddresses(args.chainId);
1736
+ if (addrs.lpSugar === zeroAddress) return [];
1636
1737
  const client = aerodromePublicClient(args.rpcUrl);
1637
1738
  const rows = await client.readContract({
1638
1739
  address: addrs.lpSugar,
@@ -1722,10 +1823,10 @@ function rankAndCap(rows, query) {
1722
1823
  filtered.sort((a, b) => (b.tvlUsd ?? 0) - (a.tvlUsd ?? 0));
1723
1824
  return filtered.slice(0, AERODROME_IMPORTANT_POOL_CAP);
1724
1825
  }
1725
- async function scanSugarTop(rpcUrl) {
1826
+ async function scanSugarTop(chainId, rpcUrl) {
1726
1827
  const pages = [];
1727
1828
  for (let i = 0; i < SUGAR_SCAN_PAGES; i++) {
1728
- const page = await fetchSugarYieldPage({ rpcUrl, limit: SUGAR_PAGE, offset: i * SUGAR_PAGE });
1829
+ const page = await fetchSugarYieldPage({ chainId, rpcUrl, limit: SUGAR_PAGE, offset: i * SUGAR_PAGE });
1729
1830
  pages.push(page);
1730
1831
  if (page.length < SUGAR_PAGE) break;
1731
1832
  }
@@ -1733,24 +1834,25 @@ async function scanSugarTop(rpcUrl) {
1733
1834
  }
1734
1835
  async function aerodromeFetchImportantPoolsSummary(args) {
1735
1836
  if (!isAerodromeChainSupported(args.chainId)) {
1736
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
1837
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
1737
1838
  }
1738
- const addrs = await loadAerodromeAddresses();
1739
- const scanned = await scanSugarTop(args.rpcUrl);
1839
+ const addrs = await loadAerodromeAddresses(args.chainId);
1840
+ const scanned = await scanSugarTop(args.chainId, args.rpcUrl);
1740
1841
  const aeroUsd = aeroUsdPriceFromRows(scanned, addrs.aero);
1741
1842
  const main = scanned.filter((r) => isMainPair(r.token0, r.token1, addrs.aero));
1742
1843
  const pools = rankAndCap(main.map((r) => toYieldRow(r, aeroUsd)), args.query);
1743
1844
  return {
1744
- chainId: AERODROME_CHAIN_ID,
1845
+ chainId: args.chainId,
1745
1846
  pools,
1746
- notes: `At most ${AERODROME_IMPORTANT_POOL_CAP} important Base pairs (ETH/WETH, USDC, AERO, major stables), TVL-ranked. Not an LpSugar.all dump. feeApr is omitted (Sugar exposes fee tier, not volume). emissionsApr uses on-chain AERO/USDC when priced.`
1847
+ notes: `At most ${AERODROME_IMPORTANT_POOL_CAP} important pairs (ETH/WETH, USDC, AERO, major stables), TVL-ranked from the Base LpSugar index. feeApr is omitted. emissionsApr uses on-chain AERO/USDC when priced. Other Aero chains have no Sugar index, so this list is empty there \u2014 use ctm_aerodrome_discover_pools for a pair. AERO rewards on those chains are sAERO allocation, not a Sugar emissions APR.`
1747
1848
  };
1748
1849
  }
1749
1850
  async function aerodromeFetchLpYieldsSummary(args) {
1750
1851
  return aerodromeFetchImportantPoolsSummary(args);
1751
1852
  }
1752
- async function fetchSugarByAddress(rpcUrl, lp) {
1753
- const addrs = await loadAerodromeAddresses();
1853
+ async function fetchSugarByAddress(chainId, rpcUrl, lp) {
1854
+ const addrs = await loadAerodromeAddresses(chainId);
1855
+ if (addrs.lpSugar === zeroAddress) return null;
1754
1856
  const client = aerodromePublicClient(rpcUrl);
1755
1857
  try {
1756
1858
  const p = await client.readContract({
@@ -1778,27 +1880,30 @@ async function fetchSugarByAddress(rpcUrl, lp) {
1778
1880
  return null;
1779
1881
  }
1780
1882
  }
1781
- function resolveYieldToken(addr, weth) {
1782
- if (isAerodromeNativeToken(addr)) return getAddress(weth);
1783
- return getAddress(addr);
1883
+ function resolveYieldToken(addr2, weth) {
1884
+ if (isAerodromeNativeToken(addr2)) return getAddress(weth);
1885
+ return getAddress(addr2);
1784
1886
  }
1785
- async function aeroUsdFromUsdcPool(rpcUrl, aero) {
1887
+ async function aeroUsdFromUsdcPool(chainId, rpcUrl, aero) {
1888
+ const usdc = aeroUsdcAddress(chainId);
1889
+ if (!usdc) return null;
1786
1890
  const aeroUsdc = await aerodromeDiscoverDirectPools({
1891
+ chainId,
1787
1892
  rpcUrl,
1788
1893
  tokenA: getAddress(aero),
1789
- tokenB: getAddress(AERODROME_USDC_BASE)
1894
+ tokenB: usdc
1790
1895
  });
1791
1896
  const prefer = aeroUsdc.find((p) => p.kind === "volatile") ?? aeroUsdc[0];
1792
1897
  if (!prefer) return null;
1793
- const raw = await fetchSugarByAddress(rpcUrl, prefer.lp);
1898
+ const raw = await fetchSugarByAddress(chainId, rpcUrl, prefer.lp);
1794
1899
  return raw ? aeroUsdPriceFromRows([raw], aero) : null;
1795
1900
  }
1796
1901
  async function aerodromeFetchLpYieldsForPools(args) {
1797
1902
  if (!isAerodromeChainSupported(args.chainId)) {
1798
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
1903
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
1799
1904
  }
1800
- const addrs = await loadAerodromeAddresses();
1801
- const aeroUsd = await aeroUsdFromUsdcPool(args.rpcUrl, addrs.aero);
1905
+ const addrs = await loadAerodromeAddresses(args.chainId);
1906
+ const aeroUsd = await aeroUsdFromUsdcPool(args.chainId, args.rpcUrl, addrs.aero);
1802
1907
  const seen = /* @__PURE__ */ new Set();
1803
1908
  const pools = [];
1804
1909
  for (const rawLp of args.lps) {
@@ -1810,24 +1915,24 @@ async function aerodromeFetchLpYieldsForPools(args) {
1810
1915
  }
1811
1916
  if (lp === zeroAddress || seen.has(lp.toLowerCase())) continue;
1812
1917
  seen.add(lp.toLowerCase());
1813
- const raw = await fetchSugarByAddress(args.rpcUrl, lp);
1918
+ const raw = await fetchSugarByAddress(args.chainId, args.rpcUrl, lp);
1814
1919
  if (raw) pools.push(toYieldRow(raw, aeroUsd));
1815
1920
  }
1816
1921
  return {
1817
- chainId: AERODROME_CHAIN_ID,
1922
+ chainId: args.chainId,
1818
1923
  pools,
1819
1924
  notes: "Same Sugar emissions formula as fetch_lp_yields (AERO/USDC priced). feeApr is omitted (Sugar has fee tier, not volume)."
1820
1925
  };
1821
1926
  }
1822
1927
  async function aerodromeFetchLpYieldsForPair(args) {
1823
1928
  if (!isAerodromeChainSupported(args.chainId)) {
1824
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
1929
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
1825
1930
  }
1826
- const addrs = await loadAerodromeAddresses();
1931
+ const addrs = await loadAerodromeAddresses(args.chainId);
1827
1932
  const tokenA = resolveYieldToken(args.tokenA, addrs.weth);
1828
1933
  const tokenB = resolveYieldToken(args.tokenB, addrs.weth);
1829
1934
  if (tokenA.toLowerCase() === tokenB.toLowerCase()) {
1830
- return { chainId: AERODROME_CHAIN_ID, pools: [], notes: "Pair tokens must differ." };
1935
+ return { chainId: args.chainId, pools: [], notes: "Pair tokens must differ." };
1831
1936
  }
1832
1937
  const discovered = await aerodromeDiscoverDirectPools({ rpcUrl: args.rpcUrl, tokenA, tokenB });
1833
1938
  return aerodromeFetchLpYieldsForPools({
@@ -1837,16 +1942,16 @@ async function aerodromeFetchLpYieldsForPair(args) {
1837
1942
  });
1838
1943
  }
1839
1944
  async function aerodromeFetchStockLpYieldsSummary(args) {
1840
- if (!isAerodromeChainSupported(args.chainId)) {
1841
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
1945
+ if (args.chainId !== 8453) {
1946
+ throw new Error("Aero stock LP yields are Base (8453) only.");
1842
1947
  }
1843
- const addrs = await loadAerodromeAddresses();
1844
- const scanned = await scanSugarTop(args.rpcUrl);
1948
+ const addrs = await loadAerodromeAddresses(args.chainId);
1949
+ const scanned = await scanSugarTop(args.chainId, args.rpcUrl);
1845
1950
  const aeroUsd = aeroUsdPriceFromRows(scanned, addrs.aero);
1846
1951
  const stock = scanned.filter((r) => isCoinbaseB20AssetToken(r.token0) || isCoinbaseB20AssetToken(r.token1));
1847
1952
  const pools = rankAndCap(stock.map((r) => toYieldRow(r, aeroUsd)), args.query);
1848
1953
  return {
1849
- chainId: AERODROME_CHAIN_ID,
1954
+ chainId: args.chainId,
1850
1955
  pools,
1851
1956
  notes: "Coinbase B20 stock LP yields only (typically STOCK/USDC Slipstream). Separate from main-pair fetch_lp_yields. HIP-3 / Arcus stock trading is not this list."
1852
1957
  };
@@ -1920,9 +2025,10 @@ async function paginate(pageSize, maxPages, readPage) {
1920
2025
  }
1921
2026
  async function aerodromeFetchListedTokens(args) {
1922
2027
  if (!isAerodromeChainSupported(args.chainId)) {
1923
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
2028
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
1924
2029
  }
1925
- const addrs = await loadAerodromeAddresses();
2030
+ const addrs = await loadAerodromeAddresses(args.chainId);
2031
+ if (addrs.lpSugar === zeroAddress) return [];
1926
2032
  await ensureCoinbaseB20StockCatalog().catch(() => []);
1927
2033
  const client = aerodromePublicClient(args.rpcUrl);
1928
2034
  const account = args.account?.trim() ? getAddress(args.account) : zeroAddress;
@@ -1963,9 +2069,10 @@ async function aerodromeFetchListedTokens(args) {
1963
2069
  }
1964
2070
  async function aerodromeFetchSwapPools(args) {
1965
2071
  if (!isAerodromeChainSupported(args.chainId)) {
1966
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
2072
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
1967
2073
  }
1968
- const addrs = await loadAerodromeAddresses();
2074
+ const addrs = await loadAerodromeAddresses(args.chainId);
2075
+ if (addrs.lpSugar === zeroAddress) return [];
1969
2076
  const client = aerodromePublicClient(args.rpcUrl);
1970
2077
  const rows = await paginate(
1971
2078
  200,
@@ -1989,9 +2096,10 @@ async function aerodromeFetchSwapPools(args) {
1989
2096
  }
1990
2097
  async function aerodromeFetchPools(args) {
1991
2098
  if (!isAerodromeChainSupported(args.chainId)) {
1992
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
2099
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
1993
2100
  }
1994
- const addrs = await loadAerodromeAddresses();
2101
+ const addrs = await loadAerodromeAddresses(args.chainId);
2102
+ if (addrs.lpSugar === zeroAddress) return [];
1995
2103
  const client = aerodromePublicClient(args.rpcUrl);
1996
2104
  const limit = BigInt(args.limit ?? 50);
1997
2105
  const offset = BigInt(args.offset ?? 0);
@@ -2020,9 +2128,10 @@ function mapSugarLp(p) {
2020
2128
  }
2021
2129
  async function aerodromeFetchPoolsByAddress(args) {
2022
2130
  if (!isAerodromeChainSupported(args.chainId)) {
2023
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
2131
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
2024
2132
  }
2025
- const addrs = await loadAerodromeAddresses();
2133
+ const addrs = await loadAerodromeAddresses(args.chainId);
2134
+ if (addrs.lpSugar === zeroAddress) return /* @__PURE__ */ new Map();
2026
2135
  const client = aerodromePublicClient(args.rpcUrl);
2027
2136
  const unique = [];
2028
2137
  const seen = /* @__PURE__ */ new Set();
@@ -2110,9 +2219,10 @@ async function aerodromeFetchPoolsByAddress(args) {
2110
2219
  }
2111
2220
  async function aerodromeFetchPositions(args) {
2112
2221
  if (!isAerodromeChainSupported(args.chainId)) {
2113
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
2222
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
2114
2223
  }
2115
- const addrs = await loadAerodromeAddresses();
2224
+ const addrs = await loadAerodromeAddresses(args.chainId);
2225
+ if (addrs.lpSugar === zeroAddress) return [];
2116
2226
  const client = aerodromePublicClient(args.rpcUrl);
2117
2227
  const account = getAddress(args.account);
2118
2228
  const rows = await paginate(
@@ -2373,6 +2483,25 @@ function mergePools(into, extra) {
2373
2483
  }
2374
2484
  return out;
2375
2485
  }
2486
+ async function quoteViaPools(rpcUrl, amountIn, hops) {
2487
+ if (hops.length === 0 || hops.some((h) => h.kind === "cl")) return null;
2488
+ const client = aerodromePublicClient(rpcUrl);
2489
+ let cursor = amountIn;
2490
+ for (const hop of hops) {
2491
+ try {
2492
+ cursor = await client.readContract({
2493
+ address: hop.lp,
2494
+ abi: aeroPoolAmountOutAbi,
2495
+ functionName: "getAmountOut",
2496
+ args: [cursor, hop.from]
2497
+ });
2498
+ } catch {
2499
+ return null;
2500
+ }
2501
+ if (cursor <= 0n) return null;
2502
+ }
2503
+ return cursor;
2504
+ }
2376
2505
  async function quoteViaRouter(rpcUrl, router, amountIn, hops) {
2377
2506
  if (hops.some((h) => h.kind === "cl")) return null;
2378
2507
  const client = aerodromePublicClient(rpcUrl);
@@ -2408,6 +2537,8 @@ async function quoteViaMixedQuoter(rpcUrl, quoter, amountIn, hops, abi) {
2408
2537
  }
2409
2538
  }
2410
2539
  async function quoteAerodromeHopsAmountOut(args) {
2540
+ const viaPools = await quoteViaPools(args.rpcUrl, args.amountIn, args.hops);
2541
+ if (viaPools != null && viaPools > 0n) return { out: viaPools, source: "router" };
2411
2542
  const viaRouter = await quoteViaRouter(args.rpcUrl, args.router, args.amountIn, args.hops);
2412
2543
  if (viaRouter != null && viaRouter > 0n) return { out: viaRouter, source: "router" };
2413
2544
  const viaV3 = await quoteViaMixedQuoter(
@@ -2446,10 +2577,10 @@ async function throwIfUnissuedStock(args) {
2446
2577
  }
2447
2578
  async function aerodromeQuote(args) {
2448
2579
  if (!isAerodromeChainSupported(args.chainId)) {
2449
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
2580
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
2450
2581
  }
2451
2582
  const rpcUrl = requireAerodromeRpcUrl(args.rpcUrl);
2452
- const addrs = await loadAerodromeAddresses();
2583
+ const addrs = await loadAerodromeAddresses(args.chainId);
2453
2584
  await ensureAerodromeStockTickers([args.tokenIn, args.tokenOut]);
2454
2585
  const isNativeIn = isAerodromeNativeToken(args.tokenIn);
2455
2586
  const isNativeOut = isAerodromeNativeToken(args.tokenOut);
@@ -2478,9 +2609,10 @@ async function aerodromeQuote(args) {
2478
2609
  let pools = await aerodromeDiscoverConnectorPools({ rpcUrl, tokenIn, tokenOut, addrs });
2479
2610
  let paths = findAerodromePaths(pools, tokenIn, tokenOut);
2480
2611
  if (paths.length === 0) {
2481
- const sugarPools = await aerodromeFetchSwapPools({ chainId: AERODROME_CHAIN_ID, rpcUrl });
2612
+ const sugarPools = await aerodromeFetchSwapPools({ chainId: args.chainId, rpcUrl });
2482
2613
  pools = mergePools(pools, sugarPools);
2483
- const connectors = [addrs.weth, getAddress(AERODROME_USDC_BASE), addrs.aero];
2614
+ const usdc = aeroUsdcAddress(args.chainId);
2615
+ const connectors = [addrs.weth, ...usdc ? [usdc] : [], addrs.aero];
2484
2616
  const relevant = pools.filter((p) => {
2485
2617
  const a = p.token0.toLowerCase();
2486
2618
  const b = p.token1.toLowerCase();
@@ -2553,7 +2685,7 @@ async function aerodromeQuote(args) {
2553
2685
  }
2554
2686
  }
2555
2687
  return {
2556
- chainId: AERODROME_CHAIN_ID,
2688
+ chainId: args.chainId,
2557
2689
  tokenIn: isNativeIn ? zeroAddress : tokenIn,
2558
2690
  tokenOut: isNativeOut ? zeroAddress : tokenOut,
2559
2691
  amountInWei: amountIn.toString(),
@@ -2855,7 +2987,7 @@ async function buildAerodromeMultisignBatch(args) {
2855
2987
  chainCategory: "evm",
2856
2988
  keyGen: args.keyGen,
2857
2989
  purposeText: args.purposeText,
2858
- chainId: AERODROME_CHAIN_ID,
2990
+ chainId: args.chainId ?? AERODROME_CHAIN_ID,
2859
2991
  rpcUrl: args.rpcUrl,
2860
2992
  executorAddress: executor,
2861
2993
  chainDetail: args.chainDetail,
@@ -2886,8 +3018,76 @@ function applySlippage(amountOut, slippagePercent) {
2886
3018
  const bps = BigInt(Math.round(slippagePercent * 100));
2887
3019
  return amountOut - amountOut * bps / 10000n;
2888
3020
  }
2889
- function routerRoutes(hops) {
2890
- return hops.map((h) => ({ from: h.from, to: h.to, stable: h.stable, factory: h.factory }));
3021
+ function encodeAeroV2ExactIn(args) {
3022
+ const commands = [];
3023
+ const inputs = [];
3024
+ const spend = (mode, amount) => encodeAbiParameters(
3025
+ [
3026
+ { type: "uint8", name: "mode" },
3027
+ { type: "uint256", name: "value" }
3028
+ ],
3029
+ [mode, amount]
3030
+ );
3031
+ if (args.wrapNative) {
3032
+ commands.push(11);
3033
+ inputs.push(spend(0, args.amountIn));
3034
+ }
3035
+ commands.push(8);
3036
+ inputs.push(
3037
+ encodeAbiParameters(
3038
+ [
3039
+ { type: "address[]", name: "pools" },
3040
+ { type: "address", name: "tokenIn" },
3041
+ {
3042
+ type: "tuple",
3043
+ name: "amountIn",
3044
+ components: [
3045
+ { name: "mode", type: "uint8" },
3046
+ { name: "value", type: "uint256" }
3047
+ ]
3048
+ },
3049
+ { type: "bool", name: "payerIsUser" },
3050
+ { type: "uint256", name: "minAmountOut" },
3051
+ { type: "address", name: "recipient" }
3052
+ ],
3053
+ [
3054
+ args.pools,
3055
+ args.wrapNative ? args.weth : args.tokenIn,
3056
+ { mode: 0, value: args.amountIn },
3057
+ !args.wrapNative,
3058
+ args.minOut,
3059
+ args.unwrapNative ? args.router : args.recipient
3060
+ ]
3061
+ )
3062
+ );
3063
+ if (args.unwrapNative) {
3064
+ commands.push(12);
3065
+ inputs.push(
3066
+ encodeAbiParameters(
3067
+ [
3068
+ { type: "address", name: "recipient" },
3069
+ {
3070
+ type: "tuple",
3071
+ name: "spend",
3072
+ components: [
3073
+ { name: "mode", type: "uint8" },
3074
+ { name: "value", type: "uint256" }
3075
+ ]
3076
+ }
3077
+ ],
3078
+ [args.recipient, { mode: 1, value: 1000000n }]
3079
+ )
3080
+ );
3081
+ }
3082
+ const commandsBytes = `0x${commands.map((n) => n.toString(16).padStart(2, "0")).join("")}`;
3083
+ return {
3084
+ data: encodeFunctionData({
3085
+ abi: aeroMetarouterAbi,
3086
+ functionName: "execute",
3087
+ args: [commandsBytes, inputs]
3088
+ }),
3089
+ value: args.wrapNative ? args.amountIn : 0n
3090
+ };
2891
3091
  }
2892
3092
  async function appendSequentialMixedHops(args) {
2893
3093
  let remainingIn = args.amountIn;
@@ -2950,63 +3150,41 @@ async function appendSequentialMixedHops(args) {
2950
3150
  rpcUrl: args.rpcUrl,
2951
3151
  token: hop.from,
2952
3152
  owner: args.executor,
2953
- spender: args.addrs.router,
3153
+ spender: args.addrs.metarouter,
2954
3154
  amountWei: remainingIn
2955
3155
  });
2956
3156
  }
2957
- const routes = routerRoutes([hop]);
2958
- if (payNative) {
2959
- args.steps.push({
2960
- to: args.addrs.router,
2961
- data: encodeFunctionData({
2962
- abi: routerAbi,
2963
- functionName: "swapExactETHForTokens",
2964
- args: [hopOutMin, routes, args.executor, args.deadline]
2965
- }),
2966
- value: remainingIn,
2967
- kind: "swap",
2968
- routerSwap: true,
2969
- fallbackGas: 350000n
2970
- });
2971
- } else if (isLast && args.isNativeOut) {
2972
- args.steps.push({
2973
- to: args.addrs.router,
2974
- data: encodeFunctionData({
2975
- abi: routerAbi,
2976
- functionName: "swapExactTokensForETH",
2977
- args: [remainingIn, hopOutMin, routes, args.executor, args.deadline]
2978
- }),
2979
- value: 0n,
2980
- kind: "swap",
2981
- routerSwap: true,
2982
- fallbackGas: 350000n
2983
- });
2984
- } else {
2985
- args.steps.push({
2986
- to: args.addrs.router,
2987
- data: encodeFunctionData({
2988
- abi: routerAbi,
2989
- functionName: "swapExactTokensForTokens",
2990
- args: [remainingIn, hopOutMin, routes, args.executor, args.deadline]
2991
- }),
2992
- value: 0n,
2993
- kind: "swap",
2994
- routerSwap: true,
2995
- fallbackGas: 350000n
2996
- });
2997
- }
3157
+ const encoded = encodeAeroV2ExactIn({
3158
+ router: args.addrs.metarouter,
3159
+ weth: args.addrs.weth,
3160
+ pools: [hop.lp],
3161
+ tokenIn: hop.from,
3162
+ amountIn: remainingIn,
3163
+ minOut: hopOutMin,
3164
+ recipient: args.executor,
3165
+ wrapNative: payNative,
3166
+ unwrapNative: isLast && args.isNativeOut
3167
+ });
3168
+ args.steps.push({
3169
+ to: args.addrs.metarouter,
3170
+ data: encoded.data,
3171
+ value: encoded.value,
3172
+ kind: "swap",
3173
+ routerSwap: true,
3174
+ fallbackGas: 350000n
3175
+ });
2998
3176
  }
2999
3177
  remainingIn = hopOutMin;
3000
3178
  }
3001
3179
  }
3002
3180
  async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
3003
- if (args.chainId !== AERODROME_CHAIN_ID) {
3004
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
3181
+ if (!isAerodromeChainSupported(args.chainId)) {
3182
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
3005
3183
  }
3006
3184
  const executor = getAddress(args.executorAddress);
3007
- const addrs = await loadAerodromeAddresses();
3185
+ const addrs = await loadAerodromeAddresses(args.chainId);
3008
3186
  const quote = args.quoteSnapshot?.hops?.length && args.quoteSnapshot.amountOutWei ? args.quoteSnapshot : await aerodromeQuote({
3009
- chainId: AERODROME_CHAIN_ID,
3187
+ chainId: args.chainId,
3010
3188
  rpcUrl: args.rpcUrl,
3011
3189
  tokenIn: args.tokenIn,
3012
3190
  tokenOut: args.tokenOut,
@@ -3019,12 +3197,12 @@ async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
3019
3197
  const hops = quote.hops;
3020
3198
  const deadline = aerodromeOnChainDeadlineUnix(args.expiryDate);
3021
3199
  const steps = [];
3022
- const sdkTx = await tryAerodromeSdkUnsignedSwap({
3200
+ const sdkTx = hops.length === 0 ? await tryAerodromeSdkUnsignedSwap({
3023
3201
  rpcUrl: args.rpcUrl,
3024
3202
  account: executor,
3025
3203
  quote,
3026
3204
  slippage: args.slippagePercent / 100
3027
- });
3205
+ }) : null;
3028
3206
  if (sdkTx) {
3029
3207
  const tokenInAddr = getAddress(isNativeIn ? addrs.weth : quote.tokenIn);
3030
3208
  if (!isNativeIn) {
@@ -3046,57 +3224,35 @@ async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
3046
3224
  fallbackGas: 400000n
3047
3225
  });
3048
3226
  } else if (hops.length > 0 && hops.every((h) => h.kind !== "cl")) {
3049
- const routes = routerRoutes(hops);
3050
3227
  if (!isNativeIn) {
3051
3228
  await pushErc20ApproveIfNeeded({
3052
3229
  steps,
3053
3230
  rpcUrl: args.rpcUrl,
3054
3231
  token: hops[0].from,
3055
3232
  owner: executor,
3056
- spender: addrs.router,
3233
+ spender: addrs.metarouter,
3057
3234
  amountWei: amountIn
3058
3235
  });
3059
3236
  }
3060
- if (isNativeIn) {
3061
- steps.push({
3062
- to: addrs.router,
3063
- data: encodeFunctionData({
3064
- abi: routerAbi,
3065
- functionName: "swapExactETHForTokens",
3066
- args: [amountOutMin, routes, executor, deadline]
3067
- }),
3068
- value: amountIn,
3069
- kind: "swap",
3070
- routerSwap: true,
3071
- fallbackGas: 350000n
3072
- });
3073
- } else if (isNativeOut) {
3074
- steps.push({
3075
- to: addrs.router,
3076
- data: encodeFunctionData({
3077
- abi: routerAbi,
3078
- functionName: "swapExactTokensForETH",
3079
- args: [amountIn, amountOutMin, routes, executor, deadline]
3080
- }),
3081
- value: 0n,
3082
- kind: "swap",
3083
- routerSwap: true,
3084
- fallbackGas: 350000n
3085
- });
3086
- } else {
3087
- steps.push({
3088
- to: addrs.router,
3089
- data: encodeFunctionData({
3090
- abi: routerAbi,
3091
- functionName: "swapExactTokensForTokens",
3092
- args: [amountIn, amountOutMin, routes, executor, deadline]
3093
- }),
3094
- value: 0n,
3095
- kind: "swap",
3096
- routerSwap: true,
3097
- fallbackGas: 350000n
3098
- });
3099
- }
3237
+ const encoded = encodeAeroV2ExactIn({
3238
+ router: addrs.metarouter,
3239
+ weth: addrs.weth,
3240
+ pools: hops.map((h) => h.lp),
3241
+ tokenIn: hops[0].from,
3242
+ amountIn,
3243
+ minOut: amountOutMin,
3244
+ recipient: executor,
3245
+ wrapNative: isNativeIn,
3246
+ unwrapNative: isNativeOut
3247
+ });
3248
+ steps.push({
3249
+ to: addrs.metarouter,
3250
+ data: encoded.data,
3251
+ value: encoded.value,
3252
+ kind: "swap",
3253
+ routerSwap: true,
3254
+ fallbackGas: 350000n
3255
+ });
3100
3256
  } else if (hops.length === 1 && hops[0].kind === "cl") {
3101
3257
  const hop = hops[0];
3102
3258
  const swapRouter = aerodromeClSwapRouterForFactory(addrs, hop.factory);
@@ -3155,6 +3311,7 @@ async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
3155
3311
  return buildAerodromeMultisignBatch({
3156
3312
  keyGen: args.keyGen,
3157
3313
  rpcUrl: args.rpcUrl,
3314
+ chainId: args.chainId,
3158
3315
  chainDetail: args.chainDetail,
3159
3316
  useCustomGas: args.useCustomGas,
3160
3317
  customGasChainDetails: args.customGasChainDetails,
@@ -3169,14 +3326,14 @@ async function buildEvmMultisignBodyAerodromeSwapBatch(args) {
3169
3326
  name: "ERC20.approve",
3170
3327
  note: "Allowance for this swap amount only."
3171
3328
  }),
3172
- evm: { type: "aerodrome_erc20_approve", version: 1, chainId: String(AERODROME_CHAIN_ID) }
3329
+ evm: { type: "aerodrome_erc20_approve", version: 1, chainId: String(args.chainId) }
3173
3330
  } : {
3174
3331
  signatureText: JSON.stringify({
3175
3332
  kind: "Aerodrome",
3176
3333
  name: "swap",
3177
3334
  hops: hops.map((h) => ({ from: h.from, to: h.to, kind: h.kind }))
3178
3335
  }),
3179
- evm: { type: "aerodrome_swap", version: 1, chainId: String(AERODROME_CHAIN_ID) }
3336
+ evm: { type: "aerodrome_swap", version: 1, chainId: String(args.chainId) }
3180
3337
  }
3181
3338
  });
3182
3339
  }
@@ -3218,9 +3375,9 @@ function formatLpHuman(wei, decimals) {
3218
3375
  }
3219
3376
  async function aerodromeQuoteAddLiquidity(args) {
3220
3377
  if (!isAerodromeChainSupported(args.chainId)) {
3221
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
3378
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
3222
3379
  }
3223
- const addrs = await loadAerodromeAddresses();
3380
+ const addrs = await loadAerodromeAddresses(args.chainId);
3224
3381
  const client = aerodromePublicClient(args.rpcUrl);
3225
3382
  await ensureAerodromeStockTickers([args.tokenA, args.tokenB]);
3226
3383
  const isNativeA = isAerodromeNativeToken(args.tokenA);
@@ -3267,6 +3424,7 @@ async function aerodromeQuoteAddLiquidity(args) {
3267
3424
  const amountBParsed = rawB ? parseUnits(rawB, decB) : 0n;
3268
3425
  if (emptyPool) {
3269
3426
  const cl = await quoteClPairRatio({
3427
+ chainId: args.chainId,
3270
3428
  rpcUrl: args.rpcUrl,
3271
3429
  tokenA,
3272
3430
  tokenB,
@@ -3311,6 +3469,11 @@ async function aerodromeQuoteAddLiquidity(args) {
3311
3469
  }
3312
3470
  const amountADesired = rawA ? amountAParsed : OTHER_SIDE_DESIRED;
3313
3471
  const amountBDesired = rawB ? amountBParsed : OTHER_SIDE_DESIRED;
3472
+ if (addrs.router.toLowerCase() === addrs.metarouter.toLowerCase()) {
3473
+ throw new Error(
3474
+ "Aero v2 add-liquidity on this chain uses the Metarouter and is not encoded yet. Base still quotes through the legacy router."
3475
+ );
3476
+ }
3314
3477
  const [amountA, amountB, liquidity] = await client.readContract({
3315
3478
  address: addrs.router,
3316
3479
  abi: routerAbi,
@@ -3336,6 +3499,7 @@ async function aerodromeQuoteAddLiquidity(args) {
3336
3499
  }
3337
3500
  async function quoteClPairRatio(args) {
3338
3501
  const directs = await aerodromeDiscoverDirectPools({
3502
+ chainId: args.chainId,
3339
3503
  rpcUrl: args.rpcUrl,
3340
3504
  tokenA: args.tokenA,
3341
3505
  tokenB: args.tokenB
@@ -3367,7 +3531,7 @@ async function quoteClPairRatio(args) {
3367
3531
  if (!best) return null;
3368
3532
  const token0 = args.tokenA.toLowerCase() < args.tokenB.toLowerCase() ? args.tokenA : args.tokenB;
3369
3533
  const aIs0 = args.tokenA.toLowerCase() === token0.toLowerCase();
3370
- const addrs = await loadAerodromeAddresses();
3534
+ const addrs = await loadAerodromeAddresses(args.chainId);
3371
3535
  let amount0 = aIs0 ? args.amountAParsed : args.amountBParsed;
3372
3536
  let amount1 = aIs0 ? args.amountBParsed : args.amountAParsed;
3373
3537
  if (args.rawA && !args.rawB) {
@@ -3424,7 +3588,7 @@ function minAfterSlippage(amount, slippagePercent) {
3424
3588
  }
3425
3589
  async function buildEvmMultisignBodyAerodromeAddLiquidityBatch(args) {
3426
3590
  const executor = getAddress(args.executorAddress);
3427
- const addrs = await loadAerodromeAddresses();
3591
+ const addrs = await loadAerodromeAddresses(args.chainId);
3428
3592
  const quote = await aerodromeQuoteAddLiquidity({
3429
3593
  chainId: args.chainId,
3430
3594
  rpcUrl: args.rpcUrl,
@@ -3513,6 +3677,7 @@ async function buildEvmMultisignBodyAerodromeAddLiquidityBatch(args) {
3513
3677
  return buildAerodromeMultisignBatch({
3514
3678
  keyGen: args.keyGen,
3515
3679
  rpcUrl: args.rpcUrl,
3680
+ chainId: args.chainId,
3516
3681
  chainDetail: args.chainDetail,
3517
3682
  useCustomGas: args.useCustomGas,
3518
3683
  customGasChainDetails: args.customGasChainDetails,
@@ -3523,13 +3688,13 @@ async function buildEvmMultisignBodyAerodromeAddLiquidityBatch(args) {
3523
3688
  purposeSuffix: "Aerodrome: add basic-pool liquidity.",
3524
3689
  meta: () => ({
3525
3690
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "addLiquidity", stable: args.stable }),
3526
- evm: { type: "aerodrome_add_liquidity", version: 1, chainId: String(AERODROME_CHAIN_ID) }
3691
+ evm: { type: "aerodrome_add_liquidity", version: 1, chainId: String(args.chainId) }
3527
3692
  })
3528
3693
  });
3529
3694
  }
3530
3695
  async function buildEvmMultisignBodyAerodromeRemoveLiquidityBatch(args) {
3531
3696
  const executor = getAddress(args.executorAddress);
3532
- const addrs = await loadAerodromeAddresses();
3697
+ const addrs = await loadAerodromeAddresses(args.chainId);
3533
3698
  const client = aerodromePublicClient(args.rpcUrl);
3534
3699
  const lp = getAddress(args.lpToken);
3535
3700
  const dec = args.lpDecimals ?? Number(await client.readContract({ address: lp, abi: erc20Abi, functionName: "decimals" }));
@@ -3580,6 +3745,7 @@ async function buildEvmMultisignBodyAerodromeRemoveLiquidityBatch(args) {
3580
3745
  return buildAerodromeMultisignBatch({
3581
3746
  keyGen: args.keyGen,
3582
3747
  rpcUrl: args.rpcUrl,
3748
+ chainId: args.chainId,
3583
3749
  chainDetail: args.chainDetail,
3584
3750
  useCustomGas: args.useCustomGas,
3585
3751
  customGasChainDetails: args.customGasChainDetails,
@@ -3590,7 +3756,7 @@ async function buildEvmMultisignBodyAerodromeRemoveLiquidityBatch(args) {
3590
3756
  purposeSuffix: "Aerodrome: remove basic-pool liquidity.",
3591
3757
  meta: () => ({
3592
3758
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "removeLiquidity", lp }),
3593
- evm: { type: "aerodrome_remove_liquidity", version: 1, chainId: String(AERODROME_CHAIN_ID) }
3759
+ evm: { type: "aerodrome_remove_liquidity", version: 1, chainId: String(args.chainId) }
3594
3760
  })
3595
3761
  });
3596
3762
  }
@@ -3603,9 +3769,9 @@ init_stockTokens();
3603
3769
  init_support();
3604
3770
  async function aerodromeQuoteClDeposit(args) {
3605
3771
  if (!isAerodromeChainSupported(args.chainId)) {
3606
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
3772
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
3607
3773
  }
3608
- const addrs = await loadAerodromeAddresses();
3774
+ const addrs = await loadAerodromeAddresses(args.chainId);
3609
3775
  const client = aerodromePublicClient(args.rpcUrl);
3610
3776
  await ensureAerodromeStockTickers([args.token0, args.token1]);
3611
3777
  const token0 = resolveAerodromeErc20OrWeth(args.token0, addrs.weth);
@@ -3663,7 +3829,7 @@ function minAfterSlippage2(amount, slippagePercent) {
3663
3829
  }
3664
3830
  async function buildEvmMultisignBodyAerodromeClMintBatch(args) {
3665
3831
  const executor = getAddress(args.executorAddress);
3666
- const addrs = await loadAerodromeAddresses();
3832
+ const addrs = await loadAerodromeAddresses(args.chainId);
3667
3833
  const quote = await aerodromeQuoteClDeposit({
3668
3834
  chainId: args.chainId,
3669
3835
  rpcUrl: args.rpcUrl,
@@ -3734,6 +3900,7 @@ async function buildEvmMultisignBodyAerodromeClMintBatch(args) {
3734
3900
  return buildAerodromeMultisignBatch({
3735
3901
  keyGen: args.keyGen,
3736
3902
  rpcUrl: args.rpcUrl,
3903
+ chainId: args.chainId,
3737
3904
  chainDetail: args.chainDetail,
3738
3905
  useCustomGas: args.useCustomGas,
3739
3906
  customGasChainDetails: args.customGasChainDetails,
@@ -3744,13 +3911,13 @@ async function buildEvmMultisignBodyAerodromeClMintBatch(args) {
3744
3911
  purposeSuffix: "Aerodrome Slipstream: mint concentrated position NFT.",
3745
3912
  meta: () => ({
3746
3913
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.mint" }),
3747
- evm: { type: "aerodrome_cl_mint", version: 1, chainId: String(AERODROME_CHAIN_ID) }
3914
+ evm: { type: "aerodrome_cl_mint", version: 1, chainId: String(args.chainId) }
3748
3915
  })
3749
3916
  });
3750
3917
  }
3751
3918
  async function buildEvmMultisignBodyAerodromeClIncreaseBatch(args) {
3752
3919
  const executor = getAddress(args.executorAddress);
3753
- const addrs = await loadAerodromeAddresses();
3920
+ const addrs = await loadAerodromeAddresses(args.chainId);
3754
3921
  const amount0 = BigInt(args.amount0Wei);
3755
3922
  const amount1 = BigInt(args.amount1Wei);
3756
3923
  await ensureAerodromeStockTickers([args.token0, args.token1]);
@@ -3801,6 +3968,7 @@ async function buildEvmMultisignBodyAerodromeClIncreaseBatch(args) {
3801
3968
  return buildAerodromeMultisignBatch({
3802
3969
  keyGen: args.keyGen,
3803
3970
  rpcUrl: args.rpcUrl,
3971
+ chainId: args.chainId,
3804
3972
  chainDetail: args.chainDetail,
3805
3973
  useCustomGas: args.useCustomGas,
3806
3974
  customGasChainDetails: args.customGasChainDetails,
@@ -3811,13 +3979,13 @@ async function buildEvmMultisignBodyAerodromeClIncreaseBatch(args) {
3811
3979
  purposeSuffix: "Aerodrome Slipstream: increase liquidity.",
3812
3980
  meta: () => ({
3813
3981
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.increaseLiquidity", tokenId: args.tokenId }),
3814
- evm: { type: "aerodrome_cl_increase", version: 1, chainId: String(AERODROME_CHAIN_ID) }
3982
+ evm: { type: "aerodrome_cl_increase", version: 1, chainId: String(args.chainId) }
3815
3983
  })
3816
3984
  });
3817
3985
  }
3818
3986
  async function buildEvmMultisignBodyAerodromeClDecreaseBatch(args) {
3819
3987
  const executor = getAddress(args.executorAddress);
3820
- const addrs = await loadAerodromeAddresses();
3988
+ const addrs = await loadAerodromeAddresses(args.chainId);
3821
3989
  const steps = [
3822
3990
  {
3823
3991
  to: addrs.nfpm,
@@ -3842,6 +4010,7 @@ async function buildEvmMultisignBodyAerodromeClDecreaseBatch(args) {
3842
4010
  return buildAerodromeMultisignBatch({
3843
4011
  keyGen: args.keyGen,
3844
4012
  rpcUrl: args.rpcUrl,
4013
+ chainId: args.chainId,
3845
4014
  chainDetail: args.chainDetail,
3846
4015
  useCustomGas: args.useCustomGas,
3847
4016
  customGasChainDetails: args.customGasChainDetails,
@@ -3852,13 +4021,13 @@ async function buildEvmMultisignBodyAerodromeClDecreaseBatch(args) {
3852
4021
  purposeSuffix: "Aerodrome Slipstream: decrease liquidity.",
3853
4022
  meta: () => ({
3854
4023
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.decreaseLiquidity", tokenId: args.tokenId }),
3855
- evm: { type: "aerodrome_cl_decrease", version: 1, chainId: String(AERODROME_CHAIN_ID) }
4024
+ evm: { type: "aerodrome_cl_decrease", version: 1, chainId: String(args.chainId) }
3856
4025
  })
3857
4026
  });
3858
4027
  }
3859
4028
  async function buildEvmMultisignBodyAerodromeClCollectBatch(args) {
3860
4029
  const executor = getAddress(args.executorAddress);
3861
- const addrs = await loadAerodromeAddresses();
4030
+ const addrs = await loadAerodromeAddresses(args.chainId);
3862
4031
  const max = 2n ** 128n - 1n;
3863
4032
  const steps = [
3864
4033
  {
@@ -3876,6 +4045,7 @@ async function buildEvmMultisignBodyAerodromeClCollectBatch(args) {
3876
4045
  return buildAerodromeMultisignBatch({
3877
4046
  keyGen: args.keyGen,
3878
4047
  rpcUrl: args.rpcUrl,
4048
+ chainId: args.chainId,
3879
4049
  chainDetail: args.chainDetail,
3880
4050
  useCustomGas: args.useCustomGas,
3881
4051
  customGasChainDetails: args.customGasChainDetails,
@@ -3886,13 +4056,13 @@ async function buildEvmMultisignBodyAerodromeClCollectBatch(args) {
3886
4056
  purposeSuffix: "Aerodrome Slipstream: collect fees.",
3887
4057
  meta: () => ({
3888
4058
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.collect", tokenId: args.tokenId }),
3889
- evm: { type: "aerodrome_cl_collect", version: 1, chainId: String(AERODROME_CHAIN_ID) }
4059
+ evm: { type: "aerodrome_cl_collect", version: 1, chainId: String(args.chainId) }
3890
4060
  })
3891
4061
  });
3892
4062
  }
3893
4063
  async function buildEvmMultisignBodyAerodromeClBurnBatch(args) {
3894
4064
  const executor = getAddress(args.executorAddress);
3895
- const addrs = await loadAerodromeAddresses();
4065
+ const addrs = await loadAerodromeAddresses(args.chainId);
3896
4066
  const steps = [
3897
4067
  {
3898
4068
  to: addrs.nfpm,
@@ -3909,6 +4079,7 @@ async function buildEvmMultisignBodyAerodromeClBurnBatch(args) {
3909
4079
  return buildAerodromeMultisignBatch({
3910
4080
  keyGen: args.keyGen,
3911
4081
  rpcUrl: args.rpcUrl,
4082
+ chainId: args.chainId,
3912
4083
  chainDetail: args.chainDetail,
3913
4084
  useCustomGas: args.useCustomGas,
3914
4085
  customGasChainDetails: args.customGasChainDetails,
@@ -3919,14 +4090,13 @@ async function buildEvmMultisignBodyAerodromeClBurnBatch(args) {
3919
4090
  purposeSuffix: "Aerodrome Slipstream: burn empty position NFT.",
3920
4091
  meta: () => ({
3921
4092
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "nfpm.burn", tokenId: args.tokenId }),
3922
- evm: { type: "aerodrome_cl_burn", version: 1, chainId: String(AERODROME_CHAIN_ID) }
4093
+ evm: { type: "aerodrome_cl_burn", version: 1, chainId: String(args.chainId) }
3923
4094
  })
3924
4095
  });
3925
4096
  }
3926
4097
 
3927
4098
  // src/protocols/evm/aerodrome/gaugeMultisign.ts
3928
4099
  init_abi();
3929
- init_support();
3930
4100
  async function buildEvmMultisignBodyAerodromeGaugeStakeBatch(args) {
3931
4101
  const executor = getAddress(args.executorAddress);
3932
4102
  const gauge = getAddress(args.gauge);
@@ -3976,6 +4146,7 @@ async function buildEvmMultisignBodyAerodromeGaugeStakeBatch(args) {
3976
4146
  return buildAerodromeMultisignBatch({
3977
4147
  keyGen: args.keyGen,
3978
4148
  rpcUrl: args.rpcUrl,
4149
+ chainId: args.chainId,
3979
4150
  chainDetail: args.chainDetail,
3980
4151
  useCustomGas: args.useCustomGas,
3981
4152
  customGasChainDetails: args.customGasChainDetails,
@@ -3986,7 +4157,7 @@ async function buildEvmMultisignBodyAerodromeGaugeStakeBatch(args) {
3986
4157
  purposeSuffix: "Aerodrome: stake LP in gauge.",
3987
4158
  meta: () => ({
3988
4159
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "gauge.deposit" }),
3989
- evm: { type: "aerodrome_gauge_stake", version: 1, chainId: String(AERODROME_CHAIN_ID) }
4160
+ evm: { type: "aerodrome_gauge_stake", version: 1, chainId: String(args.chainId) }
3990
4161
  })
3991
4162
  });
3992
4163
  }
@@ -4021,6 +4192,7 @@ async function buildEvmMultisignBodyAerodromeGaugeUnstakeBatch(args) {
4021
4192
  return buildAerodromeMultisignBatch({
4022
4193
  keyGen: args.keyGen,
4023
4194
  rpcUrl: args.rpcUrl,
4195
+ chainId: args.chainId,
4024
4196
  chainDetail: args.chainDetail,
4025
4197
  useCustomGas: args.useCustomGas,
4026
4198
  customGasChainDetails: args.customGasChainDetails,
@@ -4031,7 +4203,7 @@ async function buildEvmMultisignBodyAerodromeGaugeUnstakeBatch(args) {
4031
4203
  purposeSuffix: "Aerodrome: unstake LP from gauge.",
4032
4204
  meta: () => ({
4033
4205
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "gauge.withdraw" }),
4034
- evm: { type: "aerodrome_gauge_unstake", version: 1, chainId: String(AERODROME_CHAIN_ID) }
4206
+ evm: { type: "aerodrome_gauge_unstake", version: 1, chainId: String(args.chainId) }
4035
4207
  })
4036
4208
  });
4037
4209
  }
@@ -4050,6 +4222,7 @@ async function buildEvmMultisignBodyAerodromeClaimFeesBatch(args) {
4050
4222
  return buildAerodromeMultisignBatch({
4051
4223
  keyGen: args.keyGen,
4052
4224
  rpcUrl: args.rpcUrl,
4225
+ chainId: args.chainId,
4053
4226
  chainDetail: args.chainDetail,
4054
4227
  useCustomGas: args.useCustomGas,
4055
4228
  customGasChainDetails: args.customGasChainDetails,
@@ -4060,7 +4233,7 @@ async function buildEvmMultisignBodyAerodromeClaimFeesBatch(args) {
4060
4233
  purposeSuffix: "Aerodrome: claim basic-pool fees.",
4061
4234
  meta: () => ({
4062
4235
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "pool.claimFees", pool }),
4063
- evm: { type: "aerodrome_claim_fees", version: 1, chainId: String(AERODROME_CHAIN_ID) }
4236
+ evm: { type: "aerodrome_claim_fees", version: 1, chainId: String(args.chainId) }
4064
4237
  })
4065
4238
  });
4066
4239
  }
@@ -4093,6 +4266,7 @@ async function buildEvmMultisignBodyAerodromeClaimEmissionsBatch(args) {
4093
4266
  return buildAerodromeMultisignBatch({
4094
4267
  keyGen: args.keyGen,
4095
4268
  rpcUrl: args.rpcUrl,
4269
+ chainId: args.chainId,
4096
4270
  chainDetail: args.chainDetail,
4097
4271
  useCustomGas: args.useCustomGas,
4098
4272
  customGasChainDetails: args.customGasChainDetails,
@@ -4103,7 +4277,7 @@ async function buildEvmMultisignBodyAerodromeClaimEmissionsBatch(args) {
4103
4277
  purposeSuffix: "Aerodrome: claim gauge emissions.",
4104
4278
  meta: () => ({
4105
4279
  signatureText: JSON.stringify({ kind: "Aerodrome", name: "gauge.getReward" }),
4106
- evm: { type: "aerodrome_claim_emissions", version: 1, chainId: String(AERODROME_CHAIN_ID) }
4280
+ evm: { type: "aerodrome_claim_emissions", version: 1, chainId: String(args.chainId) }
4107
4281
  })
4108
4282
  });
4109
4283
  }
@@ -4170,38 +4344,53 @@ function mergeStocksIntoListed(tokens, stocks) {
4170
4344
  return [...stocksFirst, ...rest];
4171
4345
  }
4172
4346
  async function aerodromeFetchListedTokensSummary(args) {
4173
- const includeSugar = args.includeSugarListed !== false;
4174
- const officialPromise = fetchOfficialBaseTokenizedStocks().catch(() => []);
4347
+ const includeSugar = args.includeSugarListed !== false && args.chainId === 8453;
4348
+ const officialPromise = args.chainId === 8453 ? fetchOfficialBaseTokenizedStocks().catch(() => []) : Promise.resolve([]);
4175
4349
  const tokens = includeSugar ? await aerodromeFetchListedTokens(args) : [];
4176
4350
  const official = await officialPromise;
4177
- const stocks = await aerodromeResolveStockTokens({
4351
+ const stocks = args.chainId === 8453 ? await aerodromeResolveStockTokens({
4178
4352
  rpcUrl: args.rpcUrl,
4179
4353
  official,
4180
4354
  knownTokens: tokens
4181
- });
4182
- const addrs = await loadAerodromeAddresses();
4355
+ }) : [];
4356
+ const addrs = await loadAerodromeAddresses(args.chainId);
4357
+ const usdc = aeroUsdcAddress(args.chainId);
4183
4358
  const core = [
4184
4359
  { address: zeroAddress, symbol: "ETH", decimals: 18, listed: true, emerging: false, accountBalance: "0" },
4185
- {
4186
- address: AERODROME_WETH_BASE,
4187
- symbol: "WETH",
4188
- decimals: 18,
4189
- listed: true,
4190
- emerging: false,
4191
- accountBalance: "0"
4192
- },
4193
- {
4194
- address: AERODROME_USDC_BASE,
4195
- symbol: "USDC",
4196
- decimals: 6,
4197
- listed: true,
4198
- emerging: false,
4199
- accountBalance: "0"
4200
- },
4201
- { address: addrs.aero, symbol: "AERO", decimals: 18, listed: true, emerging: false, accountBalance: "0" }
4360
+ ...addrs.weth === zeroAddress ? [] : [
4361
+ {
4362
+ address: addrs.weth,
4363
+ symbol: "WETH",
4364
+ decimals: 18,
4365
+ listed: true,
4366
+ emerging: false,
4367
+ accountBalance: "0"
4368
+ }
4369
+ ],
4370
+ ...usdc ? [
4371
+ {
4372
+ address: usdc,
4373
+ symbol: "USDC",
4374
+ decimals: 6,
4375
+ listed: true,
4376
+ emerging: false,
4377
+ accountBalance: "0"
4378
+ }
4379
+ ] : [],
4380
+ { address: addrs.aero, symbol: "AERO", decimals: 18, listed: true, emerging: false, accountBalance: "0" },
4381
+ ...addrs.receiptToken.toLowerCase() === addrs.aero.toLowerCase() ? [] : [
4382
+ {
4383
+ address: addrs.receiptToken,
4384
+ symbol: "xAERO",
4385
+ decimals: 18,
4386
+ listed: true,
4387
+ emerging: false,
4388
+ accountBalance: "0"
4389
+ }
4390
+ ]
4202
4391
  ];
4203
4392
  return {
4204
- chainId: AERODROME_CHAIN_ID,
4393
+ chainId: args.chainId,
4205
4394
  native: { address: zeroAddress, symbol: "ETH", decimals: 18 },
4206
4395
  aero: { address: addrs.aero, symbol: "AERO", decimals: 18 },
4207
4396
  stocks,
@@ -4220,7 +4409,7 @@ async function aerodromeFetchPoolsSummary(args) {
4220
4409
  const offset = Math.max(0, args.offset ?? 0);
4221
4410
  const limit = Math.min(Math.max(args.limit ?? pools.length, 1), pools.length);
4222
4411
  return {
4223
- chainId: AERODROME_CHAIN_ID,
4412
+ chainId: args.chainId,
4224
4413
  pools: pools.slice(offset, offset + limit),
4225
4414
  notes
4226
4415
  };
@@ -4229,7 +4418,7 @@ async function aerodromeFetchPositionsSummary(args) {
4229
4418
  const account = (args.account ?? args.executorAddress ?? "").trim();
4230
4419
  if (!account) throw new Error("account or executorAddress is required.");
4231
4420
  if (!isAerodromeChainSupported(args.chainId)) {
4232
- throw new Error(`Aerodrome is Base-only (chainId ${AERODROME_CHAIN_ID}).`);
4421
+ throw new Error(aerodromeUnsupportedChainMessage(args.chainId));
4233
4422
  }
4234
4423
  const positions = await aerodromeFetchPositionsWithPools({
4235
4424
  chainId: args.chainId,
@@ -4237,7 +4426,7 @@ async function aerodromeFetchPositionsSummary(args) {
4237
4426
  account
4238
4427
  });
4239
4428
  return {
4240
- chainId: AERODROME_CHAIN_ID,
4429
+ chainId: args.chainId,
4241
4430
  account,
4242
4431
  notes: "Dust v2 rows hidden (liquidity < 1e12 and no stake/emissions). Claim fees from the pool (claimFees.pool = lp). Claim emissions from the gauge in AERO (claimEmissions); CL staked also needs tokenId + cl. Skip emissions when claimEmissions is null.",
4243
4432
  positions: positions.map((p) => {
@@ -4274,10 +4463,10 @@ var aerodromeProtocolModule = {
4274
4463
  id: "aerodrome.quote",
4275
4464
  protocolId: AERODROME_PROTOCOL_ID,
4276
4465
  chainCategory: "evm",
4277
- description: "Quote an Aerodrome swap on Base via factory discovery + MixedRouteQuoterV3 / Router. Tickers (AAPLc, USDC, ETH) accepted.",
4466
+ description: "Quote an Aero swap (protocol id aerodrome) via factory discovery and pool getAmountOut / Metaquoter. Base 8453 by default; also Ethereum, OP Mainnet, Arbitrum, Robinhood, Arc, and Ink. Tickers (AAPLc, USDC, ETH) accepted. Stock tickers are Base only.",
4278
4467
  commonParams: [],
4279
4468
  params: {
4280
- chainId: { type: "number", required: true, description: `Must be ${AERODROME_CHAIN_ID}` },
4469
+ chainId: { type: "number", required: true, description: "Aero chain: 8453 (Base, default), 1, 10, 42161, 4663, 5042, or 57073." },
4281
4470
  tokenIn: { type: "address", required: true, description: "Ticker (AAPLc, USDC, ETH, WETH, AERO) or 0x / 0x0 native" },
4282
4471
  tokenOut: { type: "address", required: true, description: "Ticker (AAPLc, USDC, ETH, WETH, AERO) or 0x / 0x0 native" },
4283
4472
  amountHuman: { type: "string", required: true, description: "Human-readable input amount (B20 stocks are 8 decimals)" }
@@ -4366,6 +4555,6 @@ var aerodromeProtocolModule = {
4366
4555
  };
4367
4556
  registerProtocolModule(aerodromeProtocolModule);
4368
4557
 
4369
- export { COINBASE_B20_ASSET_PREFIX as AERODROME_B20_ASSET_PREFIX, AERODROME_BASE_ADDRESSES_FALLBACK, AERODROME_CHAIN_ID, AERODROME_CL_FACTORY_NEWEST_BIT, AERODROME_CL_FACTORY_OLDEST_BIT, COINBASE_B20_STOCK_DECIMALS as AERODROME_COINBASE_STOCK_DECIMALS, AERODROME_IMPORTANT_POOL_CAP, AERODROME_NATIVE_PLACEHOLDER, AERODROME_PROTOCOL_ID, AERODROME_STABLE_FILLER, AERODROME_USDC_BASE, AERODROME_VOLATILE_FILLER, AERODROME_WETH_BASE, aerodromeClFactoryList, aerodromeClSwapRouterForFactory, aerodromeCoinbaseStockAddresses, coinbaseB20CatalogTokens as aerodromeCoinbaseStockCatalog, aerodromeDiscoverConnectorPools, aerodromeDiscoverConnectorPoolsLoaded, aerodromeDiscoverDirectPools, aerodromeDiscoverPoolsSummary, aerodromeFallbackAddresses, aerodromeFetchImportantPoolsSummary, aerodromeFetchListedTokens, aerodromeFetchListedTokensSummary, aerodromeFetchLpYieldsForPair, aerodromeFetchLpYieldsForPools, aerodromeFetchLpYieldsSummary, aerodromeFetchPools, aerodromeFetchPoolsByAddress, aerodromeFetchPoolsSummary, aerodromeFetchPositions, aerodromeFetchPositionsSummary, aerodromeFetchPositionsWithPools, aerodromeFetchStockLpYieldsSummary, aerodromeFetchSwapPools, aerodromeMixedPathFiller, aerodromeOnChainDeadlineUnix, aerodromePositionKey, aerodromePositionLabel, aerodromeProbeAmountIn, aerodromeProtocolModule, aerodromeQuote, aerodromeQuoteAddLiquidity, aerodromeQuoteClDeposit, aerodromeResolveStockTokens, aerodromeUnissuedStockMessage, assertAerodromeStockIssued, buildAerodromeLiquidityPurposePrefill, buildAerodromeRewardsPurposePrefill, buildAerodromeSwapPurposePrefill, buildEvmMultisignBodyAerodromeAddLiquidityBatch, buildEvmMultisignBodyAerodromeClBurnBatch, buildEvmMultisignBodyAerodromeClCollectBatch, buildEvmMultisignBodyAerodromeClDecreaseBatch, buildEvmMultisignBodyAerodromeClIncreaseBatch, buildEvmMultisignBodyAerodromeClMintBatch, buildEvmMultisignBodyAerodromeClaimEmissionsBatch, buildEvmMultisignBodyAerodromeClaimFeesBatch, buildEvmMultisignBodyAerodromeGaugeStakeBatch, buildEvmMultisignBodyAerodromeGaugeUnstakeBatch, buildEvmMultisignBodyAerodromeRemoveLiquidityBatch, buildEvmMultisignBodyAerodromeSwapBatch, computeAerodromePriceImpactPercent, encodeAerodromeMixedPath, ensureAerodromeStockTickers, fetchOfficialBaseTokenizedStocks, findAerodromePaths, formatAerodromeLpYieldLabel, formatAerodromePriceImpact, isCoinbaseB20AssetToken as isAerodromeB20AssetToken, isAerodromeChainSupported, isAerodromeCoinbaseStockToken, isAerodromeNativeToken, loadAerodromeAddresses, looksLikeCoinbaseStockSymbol, lookupAerodromeKnownToken, parseBaseTokenizedStockDocs, parseSecurityMdxAddresses, parseSugarBaseEnv, quoteAerodromeHopsAmountOut, requireAerodromeRpcUrl, resetAerodromeAddressCache, resolveAerodromeErc20OrWeth, tryAerodromeSdkQuote, tryAerodromeSdkUnsignedSwap };
4558
+ export { COINBASE_B20_ASSET_PREFIX as AERODROME_B20_ASSET_PREFIX, AERODROME_BASE_ADDRESSES_FALLBACK, AERODROME_CHAIN_ID, AERODROME_CL_FACTORY_NEWEST_BIT, AERODROME_CL_FACTORY_OLDEST_BIT, COINBASE_B20_STOCK_DECIMALS as AERODROME_COINBASE_STOCK_DECIMALS, AERODROME_IMPORTANT_POOL_CAP, AERODROME_NATIVE_PLACEHOLDER, AERODROME_PROTOCOL_ID, AERODROME_STABLE_FILLER, AERODROME_USDC_BASE, AERODROME_VOLATILE_FILLER, AERODROME_WETH_BASE, AERO_CHAIN_IDS, AERO_LEAF_VOTER, AERO_LEGACY_TOKEN_BASE, AERO_METAQUOTER, AERO_METAROUTER, AERO_NFPM, AERO_STABLE_POOL_FACTORY, AERO_SWAP_ROUTER, AERO_TOKEN_BASE, AERO_VOLATILE_POOL_FACTORY, aeroAddressesForChain, aeroRowIconAddresses, aeroUsdcAddress, aeroWrappedNativeAddress, aerodromeClFactoryList, aerodromeClSwapRouterForFactory, aerodromeCoinbaseStockAddresses, coinbaseB20CatalogTokens as aerodromeCoinbaseStockCatalog, aerodromeDiscoverConnectorPools, aerodromeDiscoverConnectorPoolsLoaded, aerodromeDiscoverDirectPools, aerodromeDiscoverPoolsSummary, aerodromeFallbackAddresses, aerodromeFetchImportantPoolsSummary, aerodromeFetchListedTokens, aerodromeFetchListedTokensSummary, aerodromeFetchLpYieldsForPair, aerodromeFetchLpYieldsForPools, aerodromeFetchLpYieldsSummary, aerodromeFetchPools, aerodromeFetchPoolsByAddress, aerodromeFetchPoolsSummary, aerodromeFetchPositions, aerodromeFetchPositionsSummary, aerodromeFetchPositionsWithPools, aerodromeFetchStockLpYieldsSummary, aerodromeFetchSwapPools, aerodromeMixedPathFiller, aerodromeOnChainDeadlineUnix, aerodromePositionKey, aerodromePositionLabel, aerodromeProbeAmountIn, aerodromeProtocolModule, aerodromeQuote, aerodromeQuoteAddLiquidity, aerodromeQuoteClDeposit, aerodromeResolveStockTokens, aerodromeUnissuedStockMessage, aerodromeUnsupportedChainMessage, assertAerodromeStockIssued, buildAerodromeLiquidityPurposePrefill, buildAerodromeRewardsPurposePrefill, buildAerodromeSwapPurposePrefill, buildEvmMultisignBodyAerodromeAddLiquidityBatch, buildEvmMultisignBodyAerodromeClBurnBatch, buildEvmMultisignBodyAerodromeClCollectBatch, buildEvmMultisignBodyAerodromeClDecreaseBatch, buildEvmMultisignBodyAerodromeClIncreaseBatch, buildEvmMultisignBodyAerodromeClMintBatch, buildEvmMultisignBodyAerodromeClaimEmissionsBatch, buildEvmMultisignBodyAerodromeClaimFeesBatch, buildEvmMultisignBodyAerodromeGaugeStakeBatch, buildEvmMultisignBodyAerodromeGaugeUnstakeBatch, buildEvmMultisignBodyAerodromeRemoveLiquidityBatch, buildEvmMultisignBodyAerodromeSwapBatch, computeAerodromePriceImpactPercent, encodeAerodromeMixedPath, ensureAerodromeStockTickers, fetchOfficialBaseTokenizedStocks, findAerodromePaths, formatAerodromeLpYieldLabel, formatAerodromePriceImpact, isCoinbaseB20AssetToken as isAerodromeB20AssetToken, isAerodromeChainSupported, isAerodromeCoinbaseStockToken, isAerodromeNativeToken, loadAerodromeAddresses, looksLikeCoinbaseStockSymbol, lookupAerodromeKnownToken, parseBaseTokenizedStockDocs, parseSecurityMdxAddresses, parseSugarBaseEnv, quoteAerodromeHopsAmountOut, requireAerodromeRpcUrl, resetAerodromeAddressCache, resolveAerodromeErc20OrWeth, tryAerodromeSdkQuote, tryAerodromeSdkUnsignedSwap };
4370
4559
  //# sourceMappingURL=index.js.map
4371
4560
  //# sourceMappingURL=index.js.map