@continuumdao/ctm-mpc-defi 0.2.56 → 0.2.57

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 (49) hide show
  1. package/dist/agent/catalog.cjs +304 -134
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +162 -42
  4. package/dist/agent/catalog.js +304 -136
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/aave-v4/SKILL.md +26 -3
  7. package/dist/agent/skills/aerodrome/SKILL.md +3 -1
  8. package/dist/agent/skills/curve-dao/SKILL.md +2 -2
  9. package/dist/agent/skills/uniswap-v4/SKILL.md +2 -2
  10. package/dist/index.cjs +165 -19
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +166 -20
  13. package/dist/index.js.map +1 -1
  14. package/dist/protocols/evm/aave-v4/index.cjs +198 -15
  15. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  16. package/dist/protocols/evm/aave-v4/index.d.ts +62 -7
  17. package/dist/protocols/evm/aave-v4/index.js +189 -16
  18. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  19. package/dist/protocols/evm/aerodrome/index.cjs +152 -63
  20. package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
  21. package/dist/protocols/evm/aerodrome/index.d.ts +30 -58
  22. package/dist/protocols/evm/aerodrome/index.js +151 -64
  23. package/dist/protocols/evm/aerodrome/index.js.map +1 -1
  24. package/dist/protocols/evm/compound-v3/index.cjs +115 -2
  25. package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
  26. package/dist/protocols/evm/compound-v3/index.js +116 -3
  27. package/dist/protocols/evm/compound-v3/index.js.map +1 -1
  28. package/dist/protocols/evm/curve-dao/index.cjs +120 -5
  29. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  30. package/dist/protocols/evm/curve-dao/index.js +120 -5
  31. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  32. package/dist/protocols/evm/euler-v2/index.cjs +121 -6
  33. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  34. package/dist/protocols/evm/euler-v2/index.js +121 -6
  35. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  36. package/dist/protocols/evm/morpho/index.cjs +129 -57
  37. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  38. package/dist/protocols/evm/morpho/index.d.ts +2 -1
  39. package/dist/protocols/evm/morpho/index.js +129 -58
  40. package/dist/protocols/evm/morpho/index.js.map +1 -1
  41. package/dist/protocols/evm/pendle/index.cjs +129 -10
  42. package/dist/protocols/evm/pendle/index.cjs.map +1 -1
  43. package/dist/protocols/evm/pendle/index.js +129 -10
  44. package/dist/protocols/evm/pendle/index.js.map +1 -1
  45. package/dist/protocols/evm/uniswap-v4/index.cjs +164 -17
  46. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  47. package/dist/protocols/evm/uniswap-v4/index.js +165 -18
  48. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  49. package/package.json +1 -1
@@ -214,50 +214,118 @@ function isCoinbaseB20AssetToken(address) {
214
214
  }
215
215
  }
216
216
  function looksLikeCoinbaseStockSymbol(symbol) {
217
- return /^[A-Za-z][A-Za-z0-9]{0,10}c$/.test((symbol ?? "").trim());
217
+ return /^[A-Za-z][A-Za-z0-9]{0,8}(?:\.[A-Za-z][A-Za-z0-9]{0,4})?c$/.test((symbol ?? "").trim());
218
+ }
219
+ function coinbaseB20StockAddresses() {
220
+ return coinbaseB20CatalogTokens().map((t) => t.address);
221
+ }
222
+ function indexCatalog(rows) {
223
+ catalogRows = rows;
224
+ catalogAt = Date.now();
225
+ catalogBySymbol.clear();
226
+ catalogByAddress.clear();
227
+ for (const row of rows) {
228
+ catalogBySymbol.set(row.symbol.toLowerCase(), row);
229
+ catalogByAddress.set(row.address.toLowerCase(), row);
230
+ }
231
+ }
232
+ function coinbaseB20CatalogTokens() {
233
+ return catalogRows ?? [];
234
+ }
235
+ function parseCoinbaseTokenizedStocksPayload(payload) {
236
+ const tokens = Array.isArray(payload) ? payload : payload && typeof payload === "object" && Array.isArray(payload.tokens) ? payload.tokens : [];
237
+ const out = [];
238
+ const seen = /* @__PURE__ */ new Set();
239
+ for (const row of tokens) {
240
+ if (!row || typeof row !== "object") continue;
241
+ const rec = row;
242
+ const symbol = typeof rec.symbol === "string" ? rec.symbol.trim() : "";
243
+ const addressRaw = typeof rec.contract_address === "string" ? rec.contract_address.trim() : "";
244
+ if (!looksLikeCoinbaseStockSymbol(symbol) || !isCoinbaseB20AssetToken(addressRaw)) continue;
245
+ const address = viem.getAddress(addressRaw);
246
+ const key = address.toLowerCase();
247
+ if (seen.has(key)) continue;
248
+ seen.add(key);
249
+ const name = typeof rec.name === "string" && rec.name.trim() ? rec.name.trim() : symbol;
250
+ const iconUrl = typeof rec.icon_url === "string" && rec.icon_url.trim() ? rec.icon_url.trim() : void 0;
251
+ const decimals = typeof rec.decimals === "number" && Number.isInteger(rec.decimals) && rec.decimals >= 0 && rec.decimals <= 18 ? rec.decimals : exports.AERODROME_COINBASE_STOCK_DECIMALS;
252
+ out.push({ address, symbol, name, decimals, iconUrl });
253
+ if (out.length >= CATALOG_MAX) break;
254
+ }
255
+ return out;
256
+ }
257
+ async function fetchCoinbaseB20StockCatalog() {
258
+ const merged = [];
259
+ const seen = /* @__PURE__ */ new Set();
260
+ let pageToken = "";
261
+ for (let page = 0; page < 4; page++) {
262
+ const url = new URL(COINBASE_TOKENIZED_STOCKS_API_URL);
263
+ url.searchParams.set("page_size", "500");
264
+ if (pageToken) url.searchParams.set("page_token", pageToken);
265
+ const res = await fetch(url, { cache: "no-store", signal: AbortSignal.timeout(8e3) });
266
+ if (!res.ok) break;
267
+ const json = await res.json();
268
+ for (const row of parseCoinbaseTokenizedStocksPayload(json)) {
269
+ const key = row.address.toLowerCase();
270
+ if (seen.has(key)) continue;
271
+ seen.add(key);
272
+ merged.push(row);
273
+ if (merged.length >= CATALOG_MAX) break;
274
+ }
275
+ pageToken = typeof json.next_page_token === "string" ? json.next_page_token.trim() : "";
276
+ if (!pageToken || merged.length >= CATALOG_MAX) break;
277
+ }
278
+ if (merged.length > 0) indexCatalog(merged);
279
+ return catalogRows ?? [];
280
+ }
281
+ async function ensureCoinbaseB20StockCatalog() {
282
+ if (catalogRows && catalogRows.length > 0 && Date.now() - catalogAt < CATALOG_TTL_MS) return catalogRows;
283
+ if (!catalogInflight) {
284
+ catalogInflight = fetchCoinbaseB20StockCatalog().finally(() => {
285
+ catalogInflight = null;
286
+ });
287
+ }
288
+ try {
289
+ return await catalogInflight;
290
+ } catch {
291
+ return catalogRows ?? [];
292
+ }
218
293
  }
219
294
  function lookupCoinbaseB20StockToken(token) {
220
295
  const key = (token ?? "").trim();
221
296
  if (!key) return null;
222
- const lower = key.toLowerCase();
223
- const bySymbol = exports.AERODROME_COINBASE_STOCK_TOKENS.find((t) => t.symbol.toLowerCase() === lower);
224
- if (bySymbol) {
225
- return {
226
- address: viem.getAddress(bySymbol.address),
227
- symbol: bySymbol.symbol,
228
- decimals: exports.AERODROME_COINBASE_STOCK_DECIMALS
229
- };
297
+ const fromCatalog = catalogBySymbol.get(key.toLowerCase());
298
+ if (fromCatalog) return fromCatalog;
299
+ try {
300
+ return catalogByAddress.get(viem.getAddress(key).toLowerCase()) ?? null;
301
+ } catch {
302
+ return null;
230
303
  }
304
+ }
305
+ function coinbaseB20CatalogName(addressOrSymbol) {
306
+ const key = (addressOrSymbol ?? "").trim();
307
+ if (!key) return void 0;
308
+ const bySymbol = catalogBySymbol.get(key.toLowerCase());
309
+ if (bySymbol?.name) return bySymbol.name;
231
310
  try {
232
- const address = viem.getAddress(key);
233
- const byAddr = exports.AERODROME_COINBASE_STOCK_TOKENS.find((t) => viem.getAddress(t.address).toLowerCase() === address.toLowerCase());
234
- if (byAddr) {
235
- return { address, symbol: byAddr.symbol, decimals: exports.AERODROME_COINBASE_STOCK_DECIMALS };
236
- }
311
+ return catalogByAddress.get(viem.getAddress(key).toLowerCase())?.name;
237
312
  } catch {
313
+ return void 0;
238
314
  }
239
- return null;
240
315
  }
241
- exports.AERODROME_COINBASE_STOCK_TOKENS = void 0; exports.AERODROME_COINBASE_STOCK_DECIMALS = void 0; exports.AERODROME_B20_ASSET_PREFIX = void 0;
316
+ exports.AERODROME_COINBASE_STOCK_DECIMALS = void 0; exports.AERODROME_B20_ASSET_PREFIX = void 0; var COINBASE_TOKENIZED_STOCKS_API_URL, CATALOG_TTL_MS, CATALOG_MAX, catalogRows, catalogAt, catalogInflight, catalogBySymbol, catalogByAddress;
242
317
  var init_coinbaseB20 = __esm({
243
318
  "src/protocols/evm/shared/coinbaseB20.ts"() {
244
- exports.AERODROME_COINBASE_STOCK_TOKENS = [
245
- { symbol: "AAPLc", name: "Apple Inc.", address: "0xb200000000000000000000C2e324d24d7eEcd1fb" },
246
- { symbol: "NVDAc", name: "NVIDIA Corporation", address: "0xb20000000000000000000078ee7ce2fE4908108C" },
247
- { symbol: "METAc", name: "Meta Platforms Inc.", address: "0xb2000000000000000000008bC8786B856E61707C" },
248
- { symbol: "GOOGLc", name: "Alphabet Inc.", address: "0xb2000000000000000000002D0BA3164cc74f58B7" },
249
- { symbol: "AMZNc", name: "Amazon.com Inc.", address: "0xb200000000000000000000d9192b6B456483C2E8" },
250
- { symbol: "TSLAc", name: "Tesla Inc.", address: "0xb2000000000000000000001e800a7f5189430cD0" },
251
- { symbol: "MSFTc", name: "Microsoft Corporation", address: "0xB200000000000000000000Ab99cFa739E253872B" },
252
- { symbol: "COINc", name: "Coinbase Global Inc.", address: "0xb200000000000000000000c85a31389D71F3ecfb" },
253
- { symbol: "MSTRc", name: "Strategy Inc.", address: "0xb2000000000000000000004884b426556b92883d" },
254
- { symbol: "CRCLc", name: "Circle Internet Group Inc.", address: "0xB20000000000000000000019f6E7C675b73C2e4D" },
255
- { symbol: "INTCc", name: "Intel Corporation", address: "0xB2000000000000000000004AFF16039bA04bdFBc" },
256
- { symbol: "SNDKc", name: "Sandisk Corporation", address: "0xb200000000000000000000397293Cb8cda9a10c5" },
257
- { symbol: "SPCXc", name: "Space Exploration Technologies Corp.", address: "0xb2000000000000000000007b9fcbd005511aCBd5" }
258
- ];
259
319
  exports.AERODROME_COINBASE_STOCK_DECIMALS = 8;
260
320
  exports.AERODROME_B20_ASSET_PREFIX = "0xb200000000000000000000";
321
+ COINBASE_TOKENIZED_STOCKS_API_URL = "https://api.coinbase.com/v1/tokenized-stocks";
322
+ CATALOG_TTL_MS = 15 * 60 * 1e3;
323
+ CATALOG_MAX = 500;
324
+ catalogRows = null;
325
+ catalogAt = 0;
326
+ catalogInflight = null;
327
+ catalogBySymbol = /* @__PURE__ */ new Map();
328
+ catalogByAddress = /* @__PURE__ */ new Map();
261
329
  }
262
330
  });
263
331
 
@@ -1101,6 +1169,16 @@ function lookupAerodromeKnownToken(token) {
1101
1169
  }
1102
1170
  return null;
1103
1171
  }
1172
+ async function ensureAerodromeStockTickers(tokens) {
1173
+ const needsCatalog = tokens.some((token) => {
1174
+ const raw = (token ?? "").trim();
1175
+ if (!raw || isAerodromeNativeToken(raw)) return false;
1176
+ if (lookupAerodromeKnownToken(raw)) return false;
1177
+ if (/^0x[a-fA-F0-9]{40}$/.test(raw)) return false;
1178
+ return looksLikeCoinbaseStockSymbol(raw);
1179
+ });
1180
+ if (needsCatalog) await ensureCoinbaseB20StockCatalog();
1181
+ }
1104
1182
  function resolveAerodromeErc20OrWeth(token, weth) {
1105
1183
  const raw = (token ?? "").trim();
1106
1184
  if (!raw) throw new Error("Token is required.");
@@ -1111,7 +1189,7 @@ function resolveAerodromeErc20OrWeth(token, weth) {
1111
1189
  return viem.getAddress(raw);
1112
1190
  } catch {
1113
1191
  throw new Error(
1114
- `Unknown Aerodrome token "${raw}". Pass a 0x address or a known ticker (ETH, WETH, USDC, AERO, AAPLc, NVDAc, \u2026). Coinbase B20 stocks are seeded \u2014 do not ask the user for a contract address.`
1192
+ `Unknown Aerodrome token "${raw}". Pass a 0x address or a ticker (ETH, WETH, USDC, AERO, AAPLc, \u2026). Coinbase B20 tickers come from the live tokenized-stocks catalog.`
1115
1193
  );
1116
1194
  }
1117
1195
  }
@@ -1134,7 +1212,7 @@ async function assertAerodromeStockIssued(args) {
1134
1212
  }
1135
1213
  }
1136
1214
  function aerodromeCoinbaseStockAddresses() {
1137
- return exports.AERODROME_COINBASE_STOCK_TOKENS.map((t) => viem.getAddress(t.address));
1215
+ return coinbaseB20StockAddresses();
1138
1216
  }
1139
1217
  function parseBaseTokenizedStockDocs(text) {
1140
1218
  try {
@@ -1171,6 +1249,11 @@ function parseBaseTokenizedStockDocs(text) {
1171
1249
  }
1172
1250
  }
1173
1251
  async function fetchOfficialBaseTokenizedStocks() {
1252
+ try {
1253
+ const live = await ensureCoinbaseB20StockCatalog();
1254
+ if (live.length > 0) return live.map((t) => ({ symbol: t.symbol, address: t.address }));
1255
+ } catch {
1256
+ }
1174
1257
  for (const url of BASE_STOCKS_DOCS_URLS) {
1175
1258
  try {
1176
1259
  const res = await fetch(url, { cache: "no-store", signal: AbortSignal.timeout(8e3) });
@@ -1182,22 +1265,11 @@ async function fetchOfficialBaseTokenizedStocks() {
1182
1265
  }
1183
1266
  return [];
1184
1267
  }
1185
- function seedName(address) {
1186
- const want = address.toLowerCase();
1187
- return exports.AERODROME_COINBASE_STOCK_TOKENS.find((t) => viem.getAddress(t.address).toLowerCase() === want)?.name;
1188
- }
1189
- function seedSymbol(address) {
1190
- const want = address.toLowerCase();
1191
- return exports.AERODROME_COINBASE_STOCK_TOKENS.find((t) => viem.getAddress(t.address).toLowerCase() === want)?.symbol;
1192
- }
1193
- function seedStockRows() {
1194
- return exports.AERODROME_COINBASE_STOCK_TOKENS.map((t) => ({
1195
- address: viem.getAddress(t.address),
1196
- symbol: t.symbol,
1197
- name: t.name,
1198
- decimals: exports.AERODROME_COINBASE_STOCK_DECIMALS,
1199
- issued: false
1200
- }));
1268
+ function catalogName(address) {
1269
+ return coinbaseB20CatalogName(address);
1270
+ }
1271
+ function catalogSymbol(address) {
1272
+ return lookupCoinbaseB20StockToken(address)?.symbol;
1201
1273
  }
1202
1274
  async function aerodromeResolveStockTokens(args) {
1203
1275
  let official = [];
@@ -1219,21 +1291,18 @@ async function aerodromeResolveStockTokens(args) {
1219
1291
  decimals: meta?.decimals ?? prev?.decimals
1220
1292
  });
1221
1293
  };
1222
- for (const t of exports.AERODROME_COINBASE_STOCK_TOKENS) {
1223
- add(t.address, { symbol: t.symbol, name: t.name, decimals: exports.AERODROME_COINBASE_STOCK_DECIMALS });
1224
- }
1225
1294
  for (const t of official) {
1226
1295
  add(t.address, { symbol: t.symbol, decimals: exports.AERODROME_COINBASE_STOCK_DECIMALS });
1227
1296
  }
1228
1297
  for (const t of args.knownTokens ?? []) {
1229
1298
  if (!isCoinbaseB20AssetToken(t.address)) continue;
1230
1299
  const symbol = (t.symbol ?? "").trim();
1231
- const seeded = Boolean(seedSymbol(viem.getAddress(t.address)));
1232
- if (!seeded && symbol && !looksLikeCoinbaseStockSymbol(symbol)) continue;
1300
+ const known = Boolean(catalogSymbol(viem.getAddress(t.address)));
1301
+ if (!known && symbol && !looksLikeCoinbaseStockSymbol(symbol)) continue;
1233
1302
  add(t.address, { symbol, decimals: t.decimals });
1234
1303
  }
1235
1304
  const rows = [...candidates.values()];
1236
- if (rows.length === 0) return seedStockRows();
1305
+ if (rows.length === 0) return [];
1237
1306
  try {
1238
1307
  const client = aerodromePublicClient(args.rpcUrl);
1239
1308
  const meta = await client.multicall({
@@ -1253,14 +1322,22 @@ async function aerodromeResolveStockTokens(args) {
1253
1322
  const supply = meta[base + 3]?.status === "success" ? meta[base + 3].result : 0n;
1254
1323
  return {
1255
1324
  address: row.address,
1256
- symbol: onchainSymbol || row.symbol || seedSymbol(row.address) || row.address.slice(0, 8),
1257
- name: seedName(row.address) || onchainName || onchainSymbol || row.symbol || "",
1325
+ symbol: onchainSymbol || row.symbol || catalogSymbol(row.address) || row.address.slice(0, 8),
1326
+ name: catalogName(row.address) || onchainName || onchainSymbol || row.symbol || "",
1258
1327
  decimals: Number.isFinite(onchainDecimals) ? onchainDecimals : row.decimals ?? exports.AERODROME_COINBASE_STOCK_DECIMALS,
1259
- issued: supply > 0n
1328
+ issued: supply > 0n,
1329
+ iconUrl: lookupCoinbaseB20StockToken(row.address)?.iconUrl
1260
1330
  };
1261
1331
  });
1262
1332
  } catch {
1263
- return seedStockRows();
1333
+ return rows.map((row) => ({
1334
+ address: row.address,
1335
+ symbol: row.symbol || catalogSymbol(row.address) || row.address.slice(0, 8),
1336
+ name: row.name || catalogName(row.address) || row.symbol || "",
1337
+ decimals: row.decimals ?? exports.AERODROME_COINBASE_STOCK_DECIMALS,
1338
+ issued: false,
1339
+ iconUrl: lookupCoinbaseB20StockToken(row.address)?.iconUrl
1340
+ }));
1264
1341
  }
1265
1342
  }
1266
1343
  var BASE_STOCKS_DOCS_URLS, MAX_DOCS_CHARS, MAX_OFFICIAL_STOCKS;
@@ -1475,6 +1552,7 @@ async function aerodromeDiscoverPoolsSummary(args) {
1475
1552
  }
1476
1553
  const rpcUrl = requireAerodromeRpcUrl(args.rpcUrl);
1477
1554
  const addrs = await loadAerodromeAddresses();
1555
+ await ensureAerodromeStockTickers([args.token, args.tokenOut ?? ""]);
1478
1556
  const isNative = isAerodromeNativeToken(args.token);
1479
1557
  const token = resolveAerodromeErc20OrWeth(args.token, addrs.weth);
1480
1558
  await assertAerodromeStockIssued({ rpcUrl, token, isNative, label: args.token });
@@ -1826,6 +1904,7 @@ init_abi();
1826
1904
  init_addresses();
1827
1905
  init_client();
1828
1906
  init_support();
1907
+ init_coinbaseB20();
1829
1908
  init_stockTokens();
1830
1909
  function poolKind(type) {
1831
1910
  if (type === 0) return "stable";
@@ -1846,6 +1925,7 @@ async function aerodromeFetchListedTokens(args) {
1846
1925
  throw new Error(`Aerodrome is Base-only (chainId ${exports.AERODROME_CHAIN_ID}).`);
1847
1926
  }
1848
1927
  const addrs = await loadAerodromeAddresses();
1928
+ await ensureCoinbaseB20StockCatalog().catch(() => []);
1849
1929
  const client = aerodromePublicClient(args.rpcUrl);
1850
1930
  const account = args.account?.trim() ? viem.getAddress(args.account) : viem.zeroAddress;
1851
1931
  const extra = [...aerodromeCoinbaseStockAddresses(), ...args.extraAddresses ?? []].map((a) => {
@@ -2216,7 +2296,6 @@ init_client();
2216
2296
  init_discover();
2217
2297
  init_stockTokens();
2218
2298
  init_support();
2219
- init_stockTokens();
2220
2299
  var AERODROME_STABLE_FILLER = 2097152;
2221
2300
  var AERODROME_VOLATILE_FILLER = 4194304;
2222
2301
  var AERODROME_CL_FACTORY_OLDEST_BIT = 1048576;
@@ -2373,6 +2452,7 @@ async function aerodromeQuote(args) {
2373
2452
  }
2374
2453
  const rpcUrl = requireAerodromeRpcUrl(args.rpcUrl);
2375
2454
  const addrs = await loadAerodromeAddresses();
2455
+ await ensureAerodromeStockTickers([args.tokenIn, args.tokenOut]);
2376
2456
  const isNativeIn = isAerodromeNativeToken(args.tokenIn);
2377
2457
  const isNativeOut = isAerodromeNativeToken(args.tokenOut);
2378
2458
  const tokenIn = resolveAerodromeErc20OrWeth(args.tokenIn, addrs.weth);
@@ -3116,8 +3196,7 @@ function pairTokenLabel(address, isNative) {
3116
3196
  if (isNative) return "ETH";
3117
3197
  if (address.toLowerCase() === exports.AERODROME_WETH_BASE.toLowerCase()) return "WETH";
3118
3198
  if (address.toLowerCase() === exports.AERODROME_USDC_BASE.toLowerCase()) return "USDC";
3119
- const stock = exports.AERODROME_COINBASE_STOCK_TOKENS.find((t) => t.address.toLowerCase() === address.toLowerCase());
3120
- return stock?.symbol || `${address.slice(0, 6)}\u2026${address.slice(-4)}`;
3199
+ return lookupAerodromeKnownToken(address)?.symbol || `${address.slice(0, 6)}\u2026${address.slice(-4)}`;
3121
3200
  }
3122
3201
  function noDirectPoolHint(args) {
3123
3202
  const a = pairTokenLabel(args.tokenA, args.isNativeA);
@@ -3145,6 +3224,7 @@ async function aerodromeQuoteAddLiquidity(args) {
3145
3224
  }
3146
3225
  const addrs = await loadAerodromeAddresses();
3147
3226
  const client = aerodromePublicClient(args.rpcUrl);
3227
+ await ensureAerodromeStockTickers([args.tokenA, args.tokenB]);
3148
3228
  const isNativeA = isAerodromeNativeToken(args.tokenA);
3149
3229
  const isNativeB = isAerodromeNativeToken(args.tokenB);
3150
3230
  const tokenA = resolveAerodromeErc20OrWeth(args.tokenA, addrs.weth);
@@ -3335,6 +3415,7 @@ async function estimateClOtherSide(client, helper, amount, sqrtP, amountIs0) {
3335
3415
  init_abi();
3336
3416
  init_addresses();
3337
3417
  init_client();
3418
+ init_stockTokens();
3338
3419
  init_support();
3339
3420
  function minAfterSlippage(amount, slippagePercent) {
3340
3421
  if (!Number.isFinite(slippagePercent) || slippagePercent <= 0 || slippagePercent >= 100) {
@@ -3455,6 +3536,7 @@ async function buildEvmMultisignBodyAerodromeRemoveLiquidityBatch(args) {
3455
3536
  const lp = viem.getAddress(args.lpToken);
3456
3537
  const dec = args.lpDecimals ?? Number(await client.readContract({ address: lp, abi: erc20Abi, functionName: "decimals" }));
3457
3538
  const liquidity = viem.parseUnits(args.liquidityHuman.trim(), dec);
3539
+ await ensureAerodromeStockTickers([args.tokenA, args.tokenB]);
3458
3540
  const tokenA = resolveAerodromeErc20OrWeth(args.tokenA, addrs.weth);
3459
3541
  const tokenB = resolveAerodromeErc20OrWeth(args.tokenB, addrs.weth);
3460
3542
  const isNativeA = isAerodromeNativeToken(args.tokenA);
@@ -3519,6 +3601,7 @@ async function buildEvmMultisignBodyAerodromeRemoveLiquidityBatch(args) {
3519
3601
  init_abi();
3520
3602
  init_addresses();
3521
3603
  init_client();
3604
+ init_stockTokens();
3522
3605
  init_support();
3523
3606
  async function aerodromeQuoteClDeposit(args) {
3524
3607
  if (!isAerodromeChainSupported(args.chainId)) {
@@ -3526,6 +3609,7 @@ async function aerodromeQuoteClDeposit(args) {
3526
3609
  }
3527
3610
  const addrs = await loadAerodromeAddresses();
3528
3611
  const client = aerodromePublicClient(args.rpcUrl);
3612
+ await ensureAerodromeStockTickers([args.token0, args.token1]);
3529
3613
  const token0 = resolveAerodromeErc20OrWeth(args.token0, addrs.weth);
3530
3614
  const token1 = resolveAerodromeErc20OrWeth(args.token1, addrs.weth);
3531
3615
  const dec0 = args.token0Decimals ?? (isAerodromeNativeToken(args.token0) ? 18 : Number(await client.readContract({ address: token0, abi: erc20Abi, functionName: "decimals" })));
@@ -3570,6 +3654,7 @@ async function aerodromeQuoteClDeposit(args) {
3570
3654
  // src/protocols/evm/aerodrome/liquidityClMultisign.ts
3571
3655
  init_abi();
3572
3656
  init_addresses();
3657
+ init_stockTokens();
3573
3658
  init_support();
3574
3659
  function minAfterSlippage2(amount, slippagePercent) {
3575
3660
  if (!Number.isFinite(slippagePercent) || slippagePercent <= 0 || slippagePercent >= 100) {
@@ -3670,6 +3755,7 @@ async function buildEvmMultisignBodyAerodromeClIncreaseBatch(args) {
3670
3755
  const addrs = await loadAerodromeAddresses();
3671
3756
  const amount0 = BigInt(args.amount0Wei);
3672
3757
  const amount1 = BigInt(args.amount1Wei);
3758
+ await ensureAerodromeStockTickers([args.token0, args.token1]);
3673
3759
  const token0 = resolveAerodromeErc20OrWeth(args.token0, addrs.weth);
3674
3760
  const token1 = resolveAerodromeErc20OrWeth(args.token1, addrs.weth);
3675
3761
  const steps = [];
@@ -4077,7 +4163,8 @@ function mergeStocksIntoListed(tokens, stocks) {
4077
4163
  emerging: prev?.emerging ?? false,
4078
4164
  accountBalance: prev?.accountBalance ?? "0",
4079
4165
  name: stock.name,
4080
- issued: stock.issued
4166
+ issued: stock.issued,
4167
+ iconUrl: stock.iconUrl
4081
4168
  });
4082
4169
  }
4083
4170
  const stocksFirst = stocks.map((s) => byAddr.get(s.address.toLowerCase())).filter(Boolean);
@@ -4288,6 +4375,7 @@ exports.AERODROME_VOLATILE_FILLER = AERODROME_VOLATILE_FILLER;
4288
4375
  exports.aerodromeClFactoryList = aerodromeClFactoryList;
4289
4376
  exports.aerodromeClSwapRouterForFactory = aerodromeClSwapRouterForFactory;
4290
4377
  exports.aerodromeCoinbaseStockAddresses = aerodromeCoinbaseStockAddresses;
4378
+ exports.aerodromeCoinbaseStockCatalog = coinbaseB20CatalogTokens;
4291
4379
  exports.aerodromeDiscoverConnectorPools = aerodromeDiscoverConnectorPools;
4292
4380
  exports.aerodromeDiscoverConnectorPoolsLoaded = aerodromeDiscoverConnectorPoolsLoaded;
4293
4381
  exports.aerodromeDiscoverDirectPools = aerodromeDiscoverDirectPools;
@@ -4336,6 +4424,7 @@ exports.buildEvmMultisignBodyAerodromeRemoveLiquidityBatch = buildEvmMultisignBo
4336
4424
  exports.buildEvmMultisignBodyAerodromeSwapBatch = buildEvmMultisignBodyAerodromeSwapBatch;
4337
4425
  exports.computeAerodromePriceImpactPercent = computeAerodromePriceImpactPercent;
4338
4426
  exports.encodeAerodromeMixedPath = encodeAerodromeMixedPath;
4427
+ exports.ensureAerodromeStockTickers = ensureAerodromeStockTickers;
4339
4428
  exports.fetchOfficialBaseTokenizedStocks = fetchOfficialBaseTokenizedStocks;
4340
4429
  exports.findAerodromePaths = findAerodromePaths;
4341
4430
  exports.formatAerodromeLpYieldLabel = formatAerodromeLpYieldLabel;