@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.
- package/dist/agent/catalog.cjs +304 -134
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +162 -42
- package/dist/agent/catalog.js +304 -136
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/aave-v4/SKILL.md +26 -3
- package/dist/agent/skills/aerodrome/SKILL.md +3 -1
- package/dist/agent/skills/curve-dao/SKILL.md +2 -2
- package/dist/agent/skills/uniswap-v4/SKILL.md +2 -2
- package/dist/index.cjs +165 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +166 -20
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs +198 -15
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/aave-v4/index.d.ts +62 -7
- package/dist/protocols/evm/aave-v4/index.js +189 -16
- package/dist/protocols/evm/aave-v4/index.js.map +1 -1
- package/dist/protocols/evm/aerodrome/index.cjs +152 -63
- package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
- package/dist/protocols/evm/aerodrome/index.d.ts +30 -58
- package/dist/protocols/evm/aerodrome/index.js +151 -64
- package/dist/protocols/evm/aerodrome/index.js.map +1 -1
- package/dist/protocols/evm/compound-v3/index.cjs +115 -2
- package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
- package/dist/protocols/evm/compound-v3/index.js +116 -3
- package/dist/protocols/evm/compound-v3/index.js.map +1 -1
- package/dist/protocols/evm/curve-dao/index.cjs +120 -5
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/curve-dao/index.js +120 -5
- package/dist/protocols/evm/curve-dao/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs +121 -6
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.js +121 -6
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/morpho/index.cjs +129 -57
- package/dist/protocols/evm/morpho/index.cjs.map +1 -1
- package/dist/protocols/evm/morpho/index.d.ts +2 -1
- package/dist/protocols/evm/morpho/index.js +129 -58
- package/dist/protocols/evm/morpho/index.js.map +1 -1
- package/dist/protocols/evm/pendle/index.cjs +129 -10
- package/dist/protocols/evm/pendle/index.cjs.map +1 -1
- package/dist/protocols/evm/pendle/index.js +129 -10
- package/dist/protocols/evm/pendle/index.js.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.cjs +164 -17
- package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.js +165 -18
- package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
- 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,
|
|
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
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
return
|
|
226
|
-
|
|
227
|
-
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
1186
|
-
|
|
1187
|
-
|
|
1188
|
-
|
|
1189
|
-
|
|
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
|
|
1232
|
-
if (!
|
|
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
|
|
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 ||
|
|
1257
|
-
name:
|
|
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
|
|
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
|
-
|
|
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;
|