@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
|
@@ -456,6 +456,125 @@ async function fetchMorphoMarketById(args) {
|
|
|
456
456
|
marketParams: marketParamsFromApiRow(row)
|
|
457
457
|
};
|
|
458
458
|
}
|
|
459
|
+
var COINBASE_B20_STOCK_DECIMALS = 8;
|
|
460
|
+
var COINBASE_B20_ASSET_PREFIX = "0xb200000000000000000000";
|
|
461
|
+
function isCoinbaseB20AssetToken(address) {
|
|
462
|
+
try {
|
|
463
|
+
return viem.getAddress(address).toLowerCase().startsWith(COINBASE_B20_ASSET_PREFIX);
|
|
464
|
+
} catch {
|
|
465
|
+
return false;
|
|
466
|
+
}
|
|
467
|
+
}
|
|
468
|
+
function looksLikeCoinbaseStockSymbol(symbol) {
|
|
469
|
+
return /^[A-Za-z][A-Za-z0-9]{0,8}(?:\.[A-Za-z][A-Za-z0-9]{0,4})?c$/.test((symbol ?? "").trim());
|
|
470
|
+
}
|
|
471
|
+
function coinbaseB20StockAddresses() {
|
|
472
|
+
return coinbaseB20CatalogTokens().map((t) => t.address);
|
|
473
|
+
}
|
|
474
|
+
var COINBASE_TOKENIZED_STOCKS_API_URL = "https://api.coinbase.com/v1/tokenized-stocks";
|
|
475
|
+
var CATALOG_TTL_MS = 15 * 60 * 1e3;
|
|
476
|
+
var CATALOG_MAX = 500;
|
|
477
|
+
var catalogRows = null;
|
|
478
|
+
var catalogAt = 0;
|
|
479
|
+
var catalogInflight = null;
|
|
480
|
+
var catalogBySymbol = /* @__PURE__ */ new Map();
|
|
481
|
+
var catalogByAddress = /* @__PURE__ */ new Map();
|
|
482
|
+
function indexCatalog(rows) {
|
|
483
|
+
catalogRows = rows;
|
|
484
|
+
catalogAt = Date.now();
|
|
485
|
+
catalogBySymbol.clear();
|
|
486
|
+
catalogByAddress.clear();
|
|
487
|
+
for (const row of rows) {
|
|
488
|
+
catalogBySymbol.set(row.symbol.toLowerCase(), row);
|
|
489
|
+
catalogByAddress.set(row.address.toLowerCase(), row);
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
function coinbaseB20CatalogTokens() {
|
|
493
|
+
return catalogRows ?? [];
|
|
494
|
+
}
|
|
495
|
+
function parseCoinbaseTokenizedStocksPayload(payload) {
|
|
496
|
+
const tokens = Array.isArray(payload) ? payload : payload && typeof payload === "object" && Array.isArray(payload.tokens) ? payload.tokens : [];
|
|
497
|
+
const out = [];
|
|
498
|
+
const seen = /* @__PURE__ */ new Set();
|
|
499
|
+
for (const row of tokens) {
|
|
500
|
+
if (!row || typeof row !== "object") continue;
|
|
501
|
+
const rec = row;
|
|
502
|
+
const symbol = typeof rec.symbol === "string" ? rec.symbol.trim() : "";
|
|
503
|
+
const addressRaw = typeof rec.contract_address === "string" ? rec.contract_address.trim() : "";
|
|
504
|
+
if (!looksLikeCoinbaseStockSymbol(symbol) || !isCoinbaseB20AssetToken(addressRaw)) continue;
|
|
505
|
+
const address = viem.getAddress(addressRaw);
|
|
506
|
+
const key = address.toLowerCase();
|
|
507
|
+
if (seen.has(key)) continue;
|
|
508
|
+
seen.add(key);
|
|
509
|
+
const name = typeof rec.name === "string" && rec.name.trim() ? rec.name.trim() : symbol;
|
|
510
|
+
const iconUrl = typeof rec.icon_url === "string" && rec.icon_url.trim() ? rec.icon_url.trim() : void 0;
|
|
511
|
+
const decimals = typeof rec.decimals === "number" && Number.isInteger(rec.decimals) && rec.decimals >= 0 && rec.decimals <= 18 ? rec.decimals : COINBASE_B20_STOCK_DECIMALS;
|
|
512
|
+
out.push({ address, symbol, name, decimals, iconUrl });
|
|
513
|
+
if (out.length >= CATALOG_MAX) break;
|
|
514
|
+
}
|
|
515
|
+
return out;
|
|
516
|
+
}
|
|
517
|
+
async function fetchCoinbaseB20StockCatalog() {
|
|
518
|
+
const merged = [];
|
|
519
|
+
const seen = /* @__PURE__ */ new Set();
|
|
520
|
+
let pageToken = "";
|
|
521
|
+
for (let page = 0; page < 4; page++) {
|
|
522
|
+
const url = new URL(COINBASE_TOKENIZED_STOCKS_API_URL);
|
|
523
|
+
url.searchParams.set("page_size", "500");
|
|
524
|
+
if (pageToken) url.searchParams.set("page_token", pageToken);
|
|
525
|
+
const res = await fetch(url, { cache: "no-store", signal: AbortSignal.timeout(8e3) });
|
|
526
|
+
if (!res.ok) break;
|
|
527
|
+
const json = await res.json();
|
|
528
|
+
for (const row of parseCoinbaseTokenizedStocksPayload(json)) {
|
|
529
|
+
const key = row.address.toLowerCase();
|
|
530
|
+
if (seen.has(key)) continue;
|
|
531
|
+
seen.add(key);
|
|
532
|
+
merged.push(row);
|
|
533
|
+
if (merged.length >= CATALOG_MAX) break;
|
|
534
|
+
}
|
|
535
|
+
pageToken = typeof json.next_page_token === "string" ? json.next_page_token.trim() : "";
|
|
536
|
+
if (!pageToken || merged.length >= CATALOG_MAX) break;
|
|
537
|
+
}
|
|
538
|
+
if (merged.length > 0) indexCatalog(merged);
|
|
539
|
+
return catalogRows ?? [];
|
|
540
|
+
}
|
|
541
|
+
async function ensureCoinbaseB20StockCatalog() {
|
|
542
|
+
if (catalogRows && catalogRows.length > 0 && Date.now() - catalogAt < CATALOG_TTL_MS) return catalogRows;
|
|
543
|
+
if (!catalogInflight) {
|
|
544
|
+
catalogInflight = fetchCoinbaseB20StockCatalog().finally(() => {
|
|
545
|
+
catalogInflight = null;
|
|
546
|
+
});
|
|
547
|
+
}
|
|
548
|
+
try {
|
|
549
|
+
return await catalogInflight;
|
|
550
|
+
} catch {
|
|
551
|
+
return catalogRows ?? [];
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
function lookupCoinbaseB20StockToken(token) {
|
|
555
|
+
const key = (token ?? "").trim();
|
|
556
|
+
if (!key) return null;
|
|
557
|
+
const fromCatalog = catalogBySymbol.get(key.toLowerCase());
|
|
558
|
+
if (fromCatalog) return fromCatalog;
|
|
559
|
+
try {
|
|
560
|
+
return catalogByAddress.get(viem.getAddress(key).toLowerCase()) ?? null;
|
|
561
|
+
} catch {
|
|
562
|
+
return null;
|
|
563
|
+
}
|
|
564
|
+
}
|
|
565
|
+
async function canonicalizeEvmTokenInput(token) {
|
|
566
|
+
const raw = (token ?? "").trim();
|
|
567
|
+
if (!raw || viem.isAddress(raw)) return raw;
|
|
568
|
+
if (!looksLikeCoinbaseStockSymbol(raw)) return raw;
|
|
569
|
+
await ensureCoinbaseB20StockCatalog().catch(() => []);
|
|
570
|
+
const hit = lookupCoinbaseB20StockToken(raw);
|
|
571
|
+
if (!hit) {
|
|
572
|
+
throw new Error(
|
|
573
|
+
`Unknown Coinbase stock ticker "${raw}". It is not in the live tokenized-stocks catalog.`
|
|
574
|
+
);
|
|
575
|
+
}
|
|
576
|
+
return hit.address;
|
|
577
|
+
}
|
|
459
578
|
var LIGHT_BATCH_SIZE = 8;
|
|
460
579
|
var V2_EXPOSURE_POSITION_LIMIT = 20;
|
|
461
580
|
var EXPOSURE_FETCH_CONCURRENCY = 4;
|
|
@@ -955,7 +1074,7 @@ async function fetchMorphoVaultV2sForChain(chainId, first = 100, skip = 0) {
|
|
|
955
1074
|
return d.vaultV2s?.items ?? [];
|
|
956
1075
|
}
|
|
957
1076
|
async function fetchMorphoVaultsForAssetAddress(args) {
|
|
958
|
-
const asset = viem.getAddress(args.assetAddress);
|
|
1077
|
+
const asset = viem.getAddress(await canonicalizeEvmTokenInput(args.assetAddress));
|
|
959
1078
|
const d = await morphoGql(
|
|
960
1079
|
`
|
|
961
1080
|
query MorphoVaultsForAsset($chainId: Int!, $asset: String!, $first: Int!) {
|
|
@@ -979,7 +1098,7 @@ async function fetchMorphoVaultsForAssetAddress(args) {
|
|
|
979
1098
|
return d.vaults?.items ?? [];
|
|
980
1099
|
}
|
|
981
1100
|
async function fetchMorphoVaultV2sForAssetAddress(args) {
|
|
982
|
-
const asset = viem.getAddress(args.assetAddress);
|
|
1101
|
+
const asset = viem.getAddress(await canonicalizeEvmTokenInput(args.assetAddress));
|
|
983
1102
|
const d = await morphoGql(
|
|
984
1103
|
`
|
|
985
1104
|
query MorphoVaultV2sForAsset($chainId: Int!, $asset: Address!, $first: Int!) {
|
|
@@ -1391,60 +1510,6 @@ async function fetchMorphoBorrowMarketsForCollaterals(args) {
|
|
|
1391
1510
|
});
|
|
1392
1511
|
return rowsFromApi(markets);
|
|
1393
1512
|
}
|
|
1394
|
-
var COINBASE_B20_STOCK_TOKENS = [
|
|
1395
|
-
{ symbol: "AAPLc", name: "Apple Inc.", address: "0xb200000000000000000000C2e324d24d7eEcd1fb" },
|
|
1396
|
-
{ symbol: "NVDAc", name: "NVIDIA Corporation", address: "0xb20000000000000000000078ee7ce2fE4908108C" },
|
|
1397
|
-
{ symbol: "METAc", name: "Meta Platforms Inc.", address: "0xb2000000000000000000008bC8786B856E61707C" },
|
|
1398
|
-
{ symbol: "GOOGLc", name: "Alphabet Inc.", address: "0xb2000000000000000000002D0BA3164cc74f58B7" },
|
|
1399
|
-
{ symbol: "AMZNc", name: "Amazon.com Inc.", address: "0xb200000000000000000000d9192b6B456483C2E8" },
|
|
1400
|
-
{ symbol: "TSLAc", name: "Tesla Inc.", address: "0xb2000000000000000000001e800a7f5189430cD0" },
|
|
1401
|
-
{ symbol: "MSFTc", name: "Microsoft Corporation", address: "0xB200000000000000000000Ab99cFa739E253872B" },
|
|
1402
|
-
{ symbol: "COINc", name: "Coinbase Global Inc.", address: "0xb200000000000000000000c85a31389D71F3ecfb" },
|
|
1403
|
-
{ symbol: "MSTRc", name: "Strategy Inc.", address: "0xb2000000000000000000004884b426556b92883d" },
|
|
1404
|
-
{ symbol: "CRCLc", name: "Circle Internet Group Inc.", address: "0xB20000000000000000000019f6E7C675b73C2e4D" },
|
|
1405
|
-
{ symbol: "INTCc", name: "Intel Corporation", address: "0xB2000000000000000000004AFF16039bA04bdFBc" },
|
|
1406
|
-
{ symbol: "SNDKc", name: "Sandisk Corporation", address: "0xb200000000000000000000397293Cb8cda9a10c5" },
|
|
1407
|
-
{ symbol: "SPCXc", name: "Space Exploration Technologies Corp.", address: "0xb2000000000000000000007b9fcbd005511aCBd5" }
|
|
1408
|
-
];
|
|
1409
|
-
var COINBASE_B20_STOCK_DECIMALS = 8;
|
|
1410
|
-
var COINBASE_B20_ASSET_PREFIX = "0xb200000000000000000000";
|
|
1411
|
-
function isCoinbaseB20AssetToken(address) {
|
|
1412
|
-
try {
|
|
1413
|
-
return viem.getAddress(address).toLowerCase().startsWith(COINBASE_B20_ASSET_PREFIX);
|
|
1414
|
-
} catch {
|
|
1415
|
-
return false;
|
|
1416
|
-
}
|
|
1417
|
-
}
|
|
1418
|
-
function looksLikeCoinbaseStockSymbol(symbol) {
|
|
1419
|
-
return /^[A-Za-z][A-Za-z0-9]{0,10}c$/.test((symbol ?? "").trim());
|
|
1420
|
-
}
|
|
1421
|
-
function coinbaseB20StockAddresses() {
|
|
1422
|
-
return COINBASE_B20_STOCK_TOKENS.map((t) => viem.getAddress(t.address));
|
|
1423
|
-
}
|
|
1424
|
-
function lookupCoinbaseB20StockToken(token) {
|
|
1425
|
-
const key = (token ?? "").trim();
|
|
1426
|
-
if (!key) return null;
|
|
1427
|
-
const lower = key.toLowerCase();
|
|
1428
|
-
const bySymbol = COINBASE_B20_STOCK_TOKENS.find((t) => t.symbol.toLowerCase() === lower);
|
|
1429
|
-
if (bySymbol) {
|
|
1430
|
-
return {
|
|
1431
|
-
address: viem.getAddress(bySymbol.address),
|
|
1432
|
-
symbol: bySymbol.symbol,
|
|
1433
|
-
decimals: COINBASE_B20_STOCK_DECIMALS
|
|
1434
|
-
};
|
|
1435
|
-
}
|
|
1436
|
-
try {
|
|
1437
|
-
const address = viem.getAddress(key);
|
|
1438
|
-
const byAddr = COINBASE_B20_STOCK_TOKENS.find((t) => viem.getAddress(t.address).toLowerCase() === address.toLowerCase());
|
|
1439
|
-
if (byAddr) {
|
|
1440
|
-
return { address, symbol: byAddr.symbol, decimals: COINBASE_B20_STOCK_DECIMALS };
|
|
1441
|
-
}
|
|
1442
|
-
} catch {
|
|
1443
|
-
}
|
|
1444
|
-
return null;
|
|
1445
|
-
}
|
|
1446
|
-
|
|
1447
|
-
// src/protocols/evm/morpho/assetRef.ts
|
|
1448
1513
|
var MORPHO_BASE_USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
|
|
1449
1514
|
var MORPHO_BASE_USDT = "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2";
|
|
1450
1515
|
var MORPHO_ETHEREUM_USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
|
|
@@ -1484,6 +1549,9 @@ function resolveMorphoAssetRef(token, chainId) {
|
|
|
1484
1549
|
}
|
|
1485
1550
|
return null;
|
|
1486
1551
|
}
|
|
1552
|
+
async function ensureMorphoStockCatalog() {
|
|
1553
|
+
await ensureCoinbaseB20StockCatalog().catch(() => []);
|
|
1554
|
+
}
|
|
1487
1555
|
function morphoB20CollateralAddresses() {
|
|
1488
1556
|
return coinbaseB20StockAddresses();
|
|
1489
1557
|
}
|
|
@@ -1533,6 +1601,7 @@ function toDiscoveryRow(row) {
|
|
|
1533
1601
|
};
|
|
1534
1602
|
}
|
|
1535
1603
|
async function morphoFetchBlueMarketsSummary(args) {
|
|
1604
|
+
await ensureMorphoStockCatalog();
|
|
1536
1605
|
const limit = Math.min(Math.max(args.limit ?? 50, 1), 200);
|
|
1537
1606
|
let rows = [];
|
|
1538
1607
|
const collateralRaw = args.collateral?.trim();
|
|
@@ -1891,6 +1960,7 @@ function morphoMidnightBookToDiscoveryRow(book) {
|
|
|
1891
1960
|
};
|
|
1892
1961
|
}
|
|
1893
1962
|
async function morphoFetchMidnightBooksSummary(args) {
|
|
1963
|
+
await ensureMorphoStockCatalog();
|
|
1894
1964
|
const limit = Math.min(Math.max(args.limit ?? exports.MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT, 1), exports.MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT);
|
|
1895
1965
|
const loanRaw = args.loan?.trim();
|
|
1896
1966
|
const collateralRaw = args.collateral?.trim();
|
|
@@ -3449,7 +3519,7 @@ var vaultDepositAbi = viem.parseAbi([
|
|
|
3449
3519
|
"function deposit(uint256 assets, address onBehalf) returns (uint256 shares)"
|
|
3450
3520
|
]);
|
|
3451
3521
|
async function buildEvmMultisignBodyMorphoVaultDepositBatch(args) {
|
|
3452
|
-
const asset = viem.getAddress(args.underlying);
|
|
3522
|
+
const asset = viem.getAddress(await canonicalizeEvmTokenInput(args.underlying));
|
|
3453
3523
|
const vault = viem.getAddress(args.vault);
|
|
3454
3524
|
const weth = viem.getAddress(args.nativeWrapped);
|
|
3455
3525
|
const executor = viem.getAddress(args.executorAddress);
|
|
@@ -4199,6 +4269,7 @@ init_midnightConstants();
|
|
|
4199
4269
|
var MORPHO_STOCK_MARKETS_DEFAULT_CHAIN_ID = exports.MORPHO_MIDNIGHT_BASE_CHAIN_ID;
|
|
4200
4270
|
var MORPHO_STOCK_MARKETS_NOTES = "Coinbase B20 stock-backed Morpho markets on Base. Curators set LLTV, oracle, and IRM. Chainlink equity feeds are 24/5 (stale off cash hours). Tokens are Regulation S / not for U.S. persons. Liquidity is still thin. Variable = Blue; fixed = Midnight.";
|
|
4201
4271
|
async function morphoFetchStockMarketsSummary(args) {
|
|
4272
|
+
await ensureMorphoStockCatalog();
|
|
4202
4273
|
const chainId = args.chainId ?? MORPHO_STOCK_MARKETS_DEFAULT_CHAIN_ID;
|
|
4203
4274
|
const rate = args.rate ?? "both";
|
|
4204
4275
|
const limit = Math.min(Math.max(args.limit ?? 50, 1), 200);
|
|
@@ -4332,6 +4403,7 @@ exports.encodeMorphoBlueWithdrawCalldata = encodeMorphoBlueWithdrawCalldata;
|
|
|
4332
4403
|
exports.enrichMorphoEarnOfferingRows = enrichMorphoEarnOfferingRows;
|
|
4333
4404
|
exports.enrichMorphoEarnOfferingRowsForAgent = enrichMorphoEarnOfferingRowsForAgent;
|
|
4334
4405
|
exports.ensureMorphoChainAssetCache = ensureMorphoChainAssetCache;
|
|
4406
|
+
exports.ensureMorphoStockCatalog = ensureMorphoStockCatalog;
|
|
4335
4407
|
exports.fetchAllMerklDistributorClaimLeaves = fetchAllMerklDistributorClaimLeaves;
|
|
4336
4408
|
exports.fetchMerklRewardsSummary = fetchMerklRewardsSummary;
|
|
4337
4409
|
exports.fetchMorphoBorrowMarketsForCollateral = fetchMorphoBorrowMarketsForCollateral;
|