@continuumdao/ctm-mpc-defi 0.2.56 → 0.2.58

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 (66) hide show
  1. package/dist/agent/catalog.cjs +749 -171
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +373 -44
  4. package/dist/agent/catalog.js +738 -173
  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/circle-cctp/SKILL.md +1 -1
  9. package/dist/agent/skills/curve-dao/SKILL.md +2 -2
  10. package/dist/agent/skills/railgun/SKILL.md +39 -0
  11. package/dist/agent/skills/uniswap-v4/SKILL.md +2 -2
  12. package/dist/index.cjs +165 -19
  13. package/dist/index.cjs.map +1 -1
  14. package/dist/index.js +166 -20
  15. package/dist/index.js.map +1 -1
  16. package/dist/protocols/evm/aave-v4/index.cjs +198 -15
  17. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  18. package/dist/protocols/evm/aave-v4/index.d.ts +62 -7
  19. package/dist/protocols/evm/aave-v4/index.js +189 -16
  20. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  21. package/dist/protocols/evm/aerodrome/index.cjs +152 -63
  22. package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
  23. package/dist/protocols/evm/aerodrome/index.d.ts +30 -58
  24. package/dist/protocols/evm/aerodrome/index.js +151 -64
  25. package/dist/protocols/evm/aerodrome/index.js.map +1 -1
  26. package/dist/protocols/evm/circle-cctp/index.cjs +5 -3
  27. package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
  28. package/dist/protocols/evm/circle-cctp/index.d.ts +3 -1
  29. package/dist/protocols/evm/circle-cctp/index.js +5 -4
  30. package/dist/protocols/evm/circle-cctp/index.js.map +1 -1
  31. package/dist/protocols/evm/compound-v3/index.cjs +115 -2
  32. package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
  33. package/dist/protocols/evm/compound-v3/index.js +116 -3
  34. package/dist/protocols/evm/compound-v3/index.js.map +1 -1
  35. package/dist/protocols/evm/continuum-dao/index.cjs +1 -1
  36. package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
  37. package/dist/protocols/evm/continuum-dao/index.d.ts +1 -1
  38. package/dist/protocols/evm/continuum-dao/index.js +1 -1
  39. package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
  40. package/dist/protocols/evm/curve-dao/index.cjs +120 -5
  41. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  42. package/dist/protocols/evm/curve-dao/index.js +120 -5
  43. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  44. package/dist/protocols/evm/euler-v2/index.cjs +121 -6
  45. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  46. package/dist/protocols/evm/euler-v2/index.js +121 -6
  47. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  48. package/dist/protocols/evm/morpho/index.cjs +129 -57
  49. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  50. package/dist/protocols/evm/morpho/index.d.ts +2 -1
  51. package/dist/protocols/evm/morpho/index.js +129 -58
  52. package/dist/protocols/evm/morpho/index.js.map +1 -1
  53. package/dist/protocols/evm/pendle/index.cjs +129 -10
  54. package/dist/protocols/evm/pendle/index.cjs.map +1 -1
  55. package/dist/protocols/evm/pendle/index.js +129 -10
  56. package/dist/protocols/evm/pendle/index.js.map +1 -1
  57. package/dist/protocols/evm/railgun/index.cjs +1261 -0
  58. package/dist/protocols/evm/railgun/index.cjs.map +1 -0
  59. package/dist/protocols/evm/railgun/index.d.ts +294 -0
  60. package/dist/protocols/evm/railgun/index.js +1218 -0
  61. package/dist/protocols/evm/railgun/index.js.map +1 -0
  62. package/dist/protocols/evm/uniswap-v4/index.cjs +164 -17
  63. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  64. package/dist/protocols/evm/uniswap-v4/index.js +165 -18
  65. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  66. package/package.json +17 -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;