@continuumdao/ctm-mpc-defi 0.2.42 → 0.2.43

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.
@@ -412,6 +412,10 @@ function formatMorphoUsd(n) {
412
412
  if (n >= 1e3) return `$${(n / 1e3).toFixed(2)}K`;
413
413
  return `$${n.toFixed(2)}`;
414
414
  }
415
+ function formatMorphoUtilizationPct(n) {
416
+ if (n == null || !Number.isFinite(n)) return "\u2014";
417
+ return `${(n * 100).toFixed(1)}%`;
418
+ }
415
419
  function marketParamsFromApiRow(row) {
416
420
  const loanToken = viem.getAddress(row.loanAsset.address ?? "");
417
421
  const collateralToken = viem.getAddress(row.collateralAsset.address ?? "");
@@ -1263,6 +1267,20 @@ async function morphoResolveListedEarnVaultByAddress(args) {
1263
1267
  const hit = rows.find((r) => r.vaultAddress.toLowerCase() === viem.getAddress(addr).toLowerCase());
1264
1268
  return hit ?? null;
1265
1269
  }
1270
+ var MARKET_ITEM_FIELDS = `
1271
+ marketId
1272
+ loanAsset { address symbol decimals price { usd } }
1273
+ collateralAsset { address symbol decimals price { usd } }
1274
+ lltv
1275
+ oracle { address }
1276
+ irmAddress
1277
+ morphoBlue { address }
1278
+ state {
1279
+ supplyApy borrowApy netSupplyApy netBorrowApy
1280
+ supplyAssetsUsd borrowAssetsUsd collateralAssetsUsd utilization
1281
+ rewards { supplyApr borrowApr asset { address symbol } }
1282
+ }
1283
+ `;
1266
1284
  function lltvToPctLabel(lltv) {
1267
1285
  try {
1268
1286
  const wad = BigInt(lltv);
@@ -1274,28 +1292,34 @@ function lltvToPctLabel(lltv) {
1274
1292
  }
1275
1293
  }
1276
1294
  async function fetchMorphoMarketsForChain(chainId, first = 200) {
1295
+ return fetchMorphoMarketsWhere({ chainId, first });
1296
+ }
1297
+ async function fetchMorphoMarketsWhere(args) {
1298
+ const first = args.first ?? 200;
1299
+ const collateralIn = (args.collateralAddresses ?? []).filter((a) => viem.isAddress(a)).map((a) => viem.getAddress(a));
1300
+ const loanIn = (args.loanAddresses ?? []).filter((a) => viem.isAddress(a)).map((a) => viem.getAddress(a));
1301
+ let whereClause = "chainId_in: [$chainId]";
1302
+ const variables = { chainId: args.chainId, first };
1303
+ if (collateralIn.length) {
1304
+ whereClause += ", collateralAssetAddress_in: $collateralIn";
1305
+ variables.collateralIn = collateralIn;
1306
+ }
1307
+ if (loanIn.length) {
1308
+ whereClause += ", loanAssetAddress_in: $loanIn";
1309
+ variables.loanIn = loanIn;
1310
+ }
1311
+ const varDecls = ["$chainId: Int!", "$first: Int!"];
1312
+ if (collateralIn.length) varDecls.push("$collateralIn: [String!]");
1313
+ if (loanIn.length) varDecls.push("$loanIn: [String!]");
1277
1314
  const d = await morphoGql(
1278
1315
  `
1279
- query MorphoMarkets($chainId: Int!, $first: Int!) {
1280
- markets(first: $first, where: { chainId_in: [$chainId] }, orderBy: BorrowAssetsUsd, orderDirection: Desc) {
1281
- items {
1282
- marketId
1283
- loanAsset { address symbol decimals price { usd } }
1284
- collateralAsset { address symbol decimals price { usd } }
1285
- lltv
1286
- oracle { address }
1287
- irmAddress
1288
- morphoBlue { address }
1289
- state {
1290
- supplyApy borrowApy netSupplyApy netBorrowApy
1291
- supplyAssetsUsd borrowAssetsUsd collateralAssetsUsd utilization
1292
- rewards { supplyApr borrowApr asset { address symbol } }
1293
- }
1294
- }
1316
+ query MorphoMarkets(${varDecls.join(", ")}) {
1317
+ markets(first: $first, where: { ${whereClause} }, orderBy: BorrowAssetsUsd, orderDirection: Desc) {
1318
+ items { ${MARKET_ITEM_FIELDS} }
1295
1319
  }
1296
1320
  }
1297
1321
  `,
1298
- { chainId, first }
1322
+ variables
1299
1323
  );
1300
1324
  return d.markets?.items ?? [];
1301
1325
  }
@@ -1323,35 +1347,167 @@ function morphoMarketToBorrowRow(m) {
1323
1347
  supplyAprLabel: formatMorphoApyPct(r.supplyApr)
1324
1348
  })).filter((r) => r.supplyAprLabel !== "\u2014"),
1325
1349
  borrowAssetsUsdLabel: formatMorphoUsd(m.state?.borrowAssetsUsd),
1350
+ supplyAssetsUsdLabel: formatMorphoUsd(m.state?.supplyAssetsUsd),
1351
+ utilizationLabel: formatMorphoUtilizationPct(m.state?.utilization),
1326
1352
  lltvLabel: lltvToPctLabel(m.lltv),
1327
1353
  marketLabel: `${colSym}/${loanSym}`
1328
1354
  };
1329
1355
  }
1330
- async function fetchMorphoBorrowMarketsForCollateral(args) {
1331
- const key = morphoKeyForAssetRow({ contractAddress: args.collateralAddress });
1332
- if (!key) return [];
1333
- const markets = await fetchMorphoMarketsForChain(args.chainId, 300);
1356
+ function rowsFromApi(items) {
1334
1357
  const out = [];
1335
- for (const m of markets) {
1336
- const col = (m.collateralAsset?.address ?? "").trim().toLowerCase();
1337
- if (!col || col !== key) continue;
1358
+ for (const m of items) {
1338
1359
  const row = morphoMarketToBorrowRow(m);
1339
1360
  if (row) out.push(row);
1340
1361
  }
1341
1362
  return out;
1342
1363
  }
1364
+ async function fetchMorphoBorrowMarketsForCollateral(args) {
1365
+ const key = morphoKeyForAssetRow({ contractAddress: args.collateralAddress });
1366
+ if (!key) return [];
1367
+ const markets = await fetchMorphoMarketsWhere({
1368
+ chainId: args.chainId,
1369
+ first: 100,
1370
+ collateralAddresses: [key]
1371
+ });
1372
+ return rowsFromApi(markets);
1373
+ }
1343
1374
  async function fetchMorphoBorrowMarketsForLoan(args) {
1344
1375
  const key = morphoKeyForAssetRow({ contractAddress: args.loanAddress });
1345
1376
  if (!key) return [];
1346
- const markets = await fetchMorphoMarketsForChain(args.chainId, 300);
1347
- const out = [];
1348
- for (const m of markets) {
1349
- const loan = (m.loanAsset?.address ?? "").trim().toLowerCase();
1350
- if (!loan || loan !== key) continue;
1351
- const row = morphoMarketToBorrowRow(m);
1352
- if (row) out.push(row);
1377
+ const markets = await fetchMorphoMarketsWhere({
1378
+ chainId: args.chainId,
1379
+ first: 200,
1380
+ loanAddresses: [key]
1381
+ });
1382
+ return rowsFromApi(markets);
1383
+ }
1384
+ async function fetchMorphoBorrowMarketsForCollaterals(args) {
1385
+ const addrs = args.collateralAddresses.filter((a) => viem.isAddress(a));
1386
+ if (!addrs.length) return [];
1387
+ const markets = await fetchMorphoMarketsWhere({
1388
+ chainId: args.chainId,
1389
+ first: 200,
1390
+ collateralAddresses: addrs
1391
+ });
1392
+ return rowsFromApi(markets);
1393
+ }
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;
1353
1416
  }
1354
- return out;
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
+ var MORPHO_BASE_USDC = "0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913";
1449
+ var MORPHO_BASE_USDT = "0xfde4C96c8593536E31F229EA8f37b2ADa2699bb2";
1450
+ var MORPHO_ETHEREUM_USDC = "0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48";
1451
+ var MORPHO_ETHEREUM_USDT = "0xdAC17F958D2ee523a2206206994597C13D831ec7";
1452
+ var MORPHO_ARC_USDC = "0x3600000000000000000000000000000000000000";
1453
+ var LOAN_TOKEN_BY_CHAIN = {
1454
+ 8453: {
1455
+ usdc: viem.getAddress(MORPHO_BASE_USDC),
1456
+ usdt: viem.getAddress(MORPHO_BASE_USDT)
1457
+ },
1458
+ 1: {
1459
+ usdc: viem.getAddress(MORPHO_ETHEREUM_USDC),
1460
+ usdt: viem.getAddress(MORPHO_ETHEREUM_USDT)
1461
+ },
1462
+ [ARC_MAINNET_CHAIN_ID]: {
1463
+ usdc: viem.getAddress(MORPHO_ARC_USDC)
1464
+ },
1465
+ [ARC_TESTNET_CHAIN_ID]: {
1466
+ usdc: viem.getAddress(MORPHO_ARC_USDC)
1467
+ }
1468
+ };
1469
+ function isMorphoStockQuery(query) {
1470
+ const q = (query ?? "").trim().toLowerCase();
1471
+ if (!q) return false;
1472
+ return /^(stocks?|tokenized(\s+stocks?)?|coinbase(\s+stocks?)?)$/.test(q);
1473
+ }
1474
+ function resolveMorphoAssetRef(token, chainId) {
1475
+ const raw = (token ?? "").trim();
1476
+ if (!raw) return null;
1477
+ if (viem.isAddress(raw)) return viem.getAddress(raw);
1478
+ const stock = lookupCoinbaseB20StockToken(raw);
1479
+ if (stock) return stock.address;
1480
+ const loan = raw.toLowerCase();
1481
+ if (chainId != null && Number.isFinite(chainId)) {
1482
+ const mapped = LOAN_TOKEN_BY_CHAIN[chainId]?.[loan];
1483
+ if (mapped) return mapped;
1484
+ }
1485
+ return null;
1486
+ }
1487
+ function morphoB20CollateralAddresses() {
1488
+ return coinbaseB20StockAddresses();
1489
+ }
1490
+ function isMorphoB20Collateral(address) {
1491
+ return isCoinbaseB20AssetToken(address);
1492
+ }
1493
+ function morphoAssetLabel(address) {
1494
+ const stock = lookupCoinbaseB20StockToken(address);
1495
+ if (stock) return stock.symbol;
1496
+ try {
1497
+ const want = viem.getAddress(address).toLowerCase();
1498
+ if (want === viem.getAddress(MORPHO_BASE_USDC).toLowerCase() || want === viem.getAddress(MORPHO_ETHEREUM_USDC).toLowerCase()) {
1499
+ return "USDC";
1500
+ }
1501
+ if (want === viem.getAddress(MORPHO_BASE_USDT).toLowerCase() || want === viem.getAddress(MORPHO_ETHEREUM_USDT).toLowerCase()) {
1502
+ return "USDT";
1503
+ }
1504
+ if (want === viem.getAddress(MORPHO_ARC_USDC).toLowerCase()) return "USDC";
1505
+ } catch {
1506
+ }
1507
+ return address.length > 10 ? `${address.slice(0, 6)}\u2026${address.slice(-4)}` : address;
1508
+ }
1509
+ function looksLikeMorphoStockTicker(token) {
1510
+ return looksLikeCoinbaseStockSymbol(token) && lookupCoinbaseB20StockToken(token) != null;
1355
1511
  }
1356
1512
 
1357
1513
  // src/protocols/evm/morpho/blueDiscovery.ts
@@ -1369,19 +1525,32 @@ function toDiscoveryRow(row) {
1369
1525
  borrowApyLabel: row.borrowApyLabel,
1370
1526
  supplyApyLabel: row.supplyApyLabel,
1371
1527
  netSupplyApyLabel: row.netSupplyApyLabel,
1528
+ lltvLabel: row.lltvLabel,
1529
+ borrowAssetsUsdLabel: row.borrowAssetsUsdLabel,
1530
+ supplyAssetsUsdLabel: row.supplyAssetsUsdLabel,
1531
+ utilizationLabel: row.utilizationLabel,
1372
1532
  rewards: row.rewards
1373
1533
  };
1374
1534
  }
1375
1535
  async function morphoFetchBlueMarketsSummary(args) {
1376
1536
  const limit = Math.min(Math.max(args.limit ?? 50, 1), 200);
1377
1537
  let rows = [];
1378
- const collateral = args.collateral?.trim();
1379
- const loan = args.loan?.trim();
1538
+ const collateralRaw = args.collateral?.trim();
1539
+ const loanRaw = args.loan?.trim();
1540
+ const q = (args.query ?? "").trim();
1541
+ const collateral = collateralRaw ? resolveMorphoAssetRef(collateralRaw, args.chainId) : null;
1542
+ const loan = loanRaw ? resolveMorphoAssetRef(loanRaw, args.chainId) : null;
1380
1543
  if (collateral) {
1381
1544
  rows = await fetchMorphoBorrowMarketsForCollateral({
1382
1545
  chainId: args.chainId,
1383
1546
  collateralAddress: collateral
1384
1547
  });
1548
+ } else if (isMorphoStockQuery(q) || q && looksLikeMorphoStockTicker(q) && !loanRaw) {
1549
+ const tickerAddr = q && looksLikeMorphoStockTicker(q) ? resolveMorphoAssetRef(q, args.chainId) : null;
1550
+ rows = tickerAddr ? await fetchMorphoBorrowMarketsForCollateral({ chainId: args.chainId, collateralAddress: tickerAddr }) : await fetchMorphoBorrowMarketsForCollaterals({
1551
+ chainId: args.chainId,
1552
+ collateralAddresses: morphoB20CollateralAddresses()
1553
+ });
1385
1554
  } else if (loan) {
1386
1555
  rows = await fetchMorphoBorrowMarketsForLoan({
1387
1556
  chainId: args.chainId,
@@ -1394,8 +1563,12 @@ async function morphoFetchBlueMarketsSummary(args) {
1394
1563
  if (row) rows.push(row);
1395
1564
  }
1396
1565
  }
1397
- const q = (args.query ?? "").trim().toLowerCase();
1398
- if (q) {
1566
+ if (loan && collateral) {
1567
+ const loanKey = loan.toLowerCase();
1568
+ rows = rows.filter((r) => r.loanAssetAddress.toLowerCase() === loanKey);
1569
+ }
1570
+ const qLower = q.toLowerCase();
1571
+ if (qLower && !isMorphoStockQuery(q) && !looksLikeMorphoStockTicker(q)) {
1399
1572
  rows = rows.filter((r) => {
1400
1573
  const hay = [
1401
1574
  r.marketLabel,
@@ -1403,9 +1576,10 @@ async function morphoFetchBlueMarketsSummary(args) {
1403
1576
  r.collateralAssetSymbol,
1404
1577
  r.loanAssetSymbol,
1405
1578
  r.collateralAssetAddress,
1406
- r.loanAssetAddress
1579
+ r.loanAssetAddress,
1580
+ r.lltvLabel
1407
1581
  ].join(" ").toLowerCase();
1408
- return hay.includes(q);
1582
+ return hay.includes(qLower);
1409
1583
  });
1410
1584
  }
1411
1585
  return { markets: rows.slice(0, limit).map(toDiscoveryRow) };
@@ -1499,7 +1673,7 @@ async function fetchMorphoUserBluePositions(args) {
1499
1673
  morphoBlue { address }
1500
1674
  state { borrowApy supplyApy borrowAssetsUsd }
1501
1675
  }
1502
- state { collateral borrowAssets }
1676
+ state { collateral borrowAssets supplyAssets supplyAssetsUsd }
1503
1677
  }
1504
1678
  }
1505
1679
  }
@@ -1510,17 +1684,21 @@ async function fetchMorphoUserBluePositions(args) {
1510
1684
  for (const p of d.userByAddress?.marketPositions ?? []) {
1511
1685
  const borrow = (p.state?.borrowAssets ?? "0").trim();
1512
1686
  const collateral = (p.state?.collateral ?? "0").trim();
1513
- if ((borrow === "0" || borrow === "0.0") && (collateral === "0" || collateral === "0.0")) continue;
1687
+ const supply = (p.state?.supplyAssets ?? "0").trim();
1688
+ if (isZeroPositionAmount(borrow) && isZeroPositionAmount(collateral) && isZeroPositionAmount(supply)) continue;
1514
1689
  const borrowMarket = morphoMarketToBorrowRow(p.market);
1515
1690
  if (!borrowMarket) continue;
1516
1691
  const hf = p.healthFactor;
1692
+ const loanDecimals = borrowMarket.loanAssetDecimals;
1517
1693
  out.push({
1518
1694
  marketId: p.market.marketId,
1519
1695
  marketLabel: borrowMarket.marketLabel,
1520
1696
  loanAssetSymbol: borrowMarket.loanAssetSymbol,
1521
1697
  collateralAssetSymbol: borrowMarket.collateralAssetSymbol,
1522
- collateralHuman: collateral || "0",
1523
- borrowHuman: borrow || "0",
1698
+ collateralHuman: formatMorphoPositionAssets(collateral, borrowMarket.collateralAssetDecimals),
1699
+ borrowHuman: formatMorphoPositionAssets(borrow, loanDecimals),
1700
+ supplyHuman: formatMorphoPositionAssets(supply, loanDecimals),
1701
+ supplyUsdLabel: formatMorphoUsd(p.state?.supplyAssetsUsd),
1524
1702
  healthFactorLabel: hf != null && Number.isFinite(hf) ? hf.toFixed(2) : "\u2014",
1525
1703
  borrowMarket
1526
1704
  });
@@ -1561,6 +1739,26 @@ async function fetchMorphoUserPortfolioUsd(args) {
1561
1739
  function formatMorphoMarketApySummary(apy) {
1562
1740
  return formatMorphoApyPct(apy);
1563
1741
  }
1742
+ async function morphoFetchPositionsSummary(args) {
1743
+ const [vaults, blueRows] = await Promise.all([
1744
+ fetchMorphoUserVaultPositions(args),
1745
+ fetchMorphoUserBluePositions(args)
1746
+ ]);
1747
+ return {
1748
+ vaults,
1749
+ blue: blueRows.map((r) => ({
1750
+ marketId: r.marketId,
1751
+ marketLabel: r.marketLabel,
1752
+ loanAssetSymbol: r.loanAssetSymbol,
1753
+ collateralAssetSymbol: r.collateralAssetSymbol,
1754
+ collateralHuman: r.collateralHuman,
1755
+ borrowHuman: r.borrowHuman,
1756
+ supplyHuman: r.supplyHuman,
1757
+ supplyUsdLabel: r.supplyUsdLabel,
1758
+ healthFactorLabel: r.healthFactorLabel
1759
+ }))
1760
+ };
1761
+ }
1564
1762
 
1565
1763
  // src/protocols/evm/morpho/midnightTypes.ts
1566
1764
  var MORPHO_MIDNIGHT_UNAVAILABLE_MESSAGE = "Morpho Midnight fixed-rate markets are available on supported chains (starting with Base). Open the Midnight tab to browse books.";
@@ -1648,13 +1846,8 @@ function morphoMidnightAprFromTick(tick, ttmSeconds) {
1648
1846
  return morphoMidnightAprFromPriceWad(midnightSdk.TickLib.tickToPrice(tick), ttmSeconds);
1649
1847
  }
1650
1848
  }
1651
-
1652
- // src/protocols/evm/morpho/midnightDiscovery.ts
1653
1849
  init_midnightApi();
1654
1850
  init_midnightConstants();
1655
- function shortAddr(a) {
1656
- return a.length > 10 ? `${a.slice(0, 6)}\u2026${a.slice(-4)}` : a;
1657
- }
1658
1851
  function maturityIso(maturity) {
1659
1852
  if (!maturity || maturity <= 0) return "\u2014";
1660
1853
  try {
@@ -1673,7 +1866,9 @@ function morphoMidnightBookToDiscoveryRow(book) {
1673
1866
  const collaterals = book.collaterals.map((c) => viem.getAddress(c.token));
1674
1867
  const primary = book.collaterals[0];
1675
1868
  const primaryAddr = primary ? viem.getAddress(primary.token) : null;
1676
- const marketLabel = `${shortAddr(primaryAddr ?? "\u2014")}/${shortAddr(loan)} \xB7 ${maturityIso(book.maturity)}`;
1869
+ const primaryLabel = primaryAddr ? morphoAssetLabel(primaryAddr) : "\u2014";
1870
+ const loanLabel = morphoAssetLabel(loan);
1871
+ const marketLabel = `${primaryLabel}/${loanLabel} \xB7 ${maturityIso(book.maturity)}`;
1677
1872
  return {
1678
1873
  marketId: book.marketId,
1679
1874
  chainId: book.chainId,
@@ -1697,10 +1892,12 @@ function morphoMidnightBookToDiscoveryRow(book) {
1697
1892
  }
1698
1893
  async function morphoFetchMidnightBooksSummary(args) {
1699
1894
  const limit = Math.min(Math.max(args.limit ?? exports.MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT, 1), exports.MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT);
1700
- const loan = args.loan?.trim();
1701
- const collateral = args.collateral?.trim();
1702
- const loanTokens = loan && viem.isAddress(loan) ? [viem.getAddress(loan)] : void 0;
1703
- const collateralTokens = collateral && viem.isAddress(collateral) ? [viem.getAddress(collateral)] : void 0;
1895
+ const loanRaw = args.loan?.trim();
1896
+ const collateralRaw = args.collateral?.trim();
1897
+ const loanResolved = loanRaw ? resolveMorphoAssetRef(loanRaw, args.chainId) : null;
1898
+ const collateralResolved = collateralRaw ? resolveMorphoAssetRef(collateralRaw, args.chainId) : null;
1899
+ const loanTokens = loanResolved ? [loanResolved] : void 0;
1900
+ const collateralTokens = collateralResolved ? [collateralResolved] : void 0;
1704
1901
  const { data } = await fetchMorphoMidnightBooks({
1705
1902
  chainId: args.chainId,
1706
1903
  loanTokens,
@@ -1709,8 +1906,8 @@ async function morphoFetchMidnightBooksSummary(args) {
1709
1906
  limit
1710
1907
  });
1711
1908
  let rows = data.map(morphoMidnightBookToDiscoveryRow);
1712
- if (collateral && viem.isAddress(collateral)) {
1713
- const col = viem.getAddress(collateral).toLowerCase();
1909
+ if (collateralResolved) {
1910
+ const col = collateralResolved.toLowerCase();
1714
1911
  rows = rows.filter((r) => r.collateralTokenAddresses.some((a) => a.toLowerCase() === col));
1715
1912
  }
1716
1913
  const side = args.side ?? "either";
@@ -1727,7 +1924,8 @@ async function morphoFetchMidnightBooksSummary(args) {
1727
1924
  r.marketLabel,
1728
1925
  r.loanTokenAddress,
1729
1926
  r.primaryCollateralTokenAddress ?? "",
1730
- ...r.collateralTokenAddresses
1927
+ ...r.collateralTokenAddresses,
1928
+ ...r.collateralTokenAddresses.map((a) => morphoAssetLabel(a))
1731
1929
  ].join(" ").toLowerCase();
1732
1930
  return hay.includes(q);
1733
1931
  });
@@ -3418,6 +3616,8 @@ async function buildEvmMultisignBodyMorphoVaultWithdraw(args) {
3418
3616
  });
3419
3617
  }
3420
3618
  var MORPHO_BLUE_COLLATERAL_DEPOSIT_FALLBACK_GAS = 1200000n;
3619
+ var MORPHO_BLUE_SUPPLY_FALLBACK_GAS = 1100000n;
3620
+ var MORPHO_BLUE_WITHDRAW_FALLBACK_GAS = 900000n;
3421
3621
  var MORPHO_BLUE_BORROW_FALLBACK_GAS = 1100000n;
3422
3622
  var MORPHO_BLUE_REPAY_FALLBACK_GAS = 1000000n;
3423
3623
  var MORPHO_BLUE_COLLATERAL_WITHDRAW_FALLBACK_GAS = 900000n;
@@ -3430,11 +3630,27 @@ var erc20AllowanceAbi2 = viem.parseAbi([
3430
3630
  ]);
3431
3631
  var erc20ApproveAbi2 = viem.parseAbi(["function approve(address spender, uint256 amount) returns (bool)"]);
3432
3632
  var morphoBlueAbi3 = viem.parseAbi([
3633
+ "function supply((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, bytes data)",
3634
+ "function withdraw((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, address receiver)",
3433
3635
  "function supplyCollateral((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, address onBehalf, bytes data)",
3434
3636
  "function borrow((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, address receiver)",
3435
3637
  "function repay((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, uint256 shares, address onBehalf, bytes data)",
3436
3638
  "function withdrawCollateral((address loanToken, address collateralToken, address oracle, address irm, uint256 lltv), uint256 assets, address onBehalf, address receiver)"
3437
3639
  ]);
3640
+ function encodeMorphoBlueSupplyCalldata(args) {
3641
+ return viem.encodeFunctionData({
3642
+ abi: morphoBlueAbi3,
3643
+ functionName: "supply",
3644
+ args: [marketParamsTuple(args.marketParams), args.assets, 0n, args.onBehalf, "0x"]
3645
+ });
3646
+ }
3647
+ function encodeMorphoBlueWithdrawCalldata(args) {
3648
+ return viem.encodeFunctionData({
3649
+ abi: morphoBlueAbi3,
3650
+ functionName: "withdraw",
3651
+ args: [marketParamsTuple(args.marketParams), args.assets, 0n, args.onBehalf, args.receiver]
3652
+ });
3653
+ }
3438
3654
  function marketParamsTuple(p) {
3439
3655
  return {
3440
3656
  loanToken: p.loanToken,
@@ -3567,6 +3783,99 @@ async function buildEvmMultisignBodyMorphoBlueSupplyCollateralBatch(args) {
3567
3783
  })
3568
3784
  });
3569
3785
  }
3786
+ async function buildEvmMultisignBodyMorphoBlueSupplyBatch(args) {
3787
+ const morphoBlue = viem.getAddress(args.morphoBlue);
3788
+ const onBehalf = viem.getAddress(args.onBehalf);
3789
+ const executor = viem.getAddress(args.executorAddress);
3790
+ const loan = viem.getAddress(args.loanToken);
3791
+ const dec = await readTokenDecimals3({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loan });
3792
+ const amountWei = viem.parseUnits(args.amountHuman, dec);
3793
+ if (amountWei === 0n) throw new Error("Supply amount is zero.");
3794
+ const approveSteps = await buildApproveSteps3({
3795
+ rpcUrl: args.rpcUrl,
3796
+ chainId: args.chainId,
3797
+ token: loan,
3798
+ spender: morphoBlue,
3799
+ amountWei,
3800
+ executor
3801
+ });
3802
+ const supplyData = encodeMorphoBlueSupplyCalldata({
3803
+ marketParams: args.marketParams,
3804
+ assets: amountWei,
3805
+ onBehalf
3806
+ });
3807
+ const marketLabel = (args.marketLabel ?? "").trim() || "Morpho Blue market";
3808
+ const evmSteps = stepsToEvm(approveSteps, {
3809
+ to: morphoBlue,
3810
+ data: supplyData,
3811
+ value: 0n,
3812
+ fallbackGas: MORPHO_BLUE_SUPPLY_FALLBACK_GAS
3813
+ });
3814
+ return buildEvmMultisignBatch({
3815
+ context: {
3816
+ chainCategory: "evm",
3817
+ keyGen: args.keyGen,
3818
+ purposeText: args.purposeText,
3819
+ chainId: args.chainId,
3820
+ rpcUrl: args.rpcUrl,
3821
+ executorAddress: executor,
3822
+ chainDetail: args.chainDetail,
3823
+ useCustomGas: args.useCustomGas,
3824
+ customGasChainDetails: args.customGasChainDetails
3825
+ },
3826
+ steps: evmSteps,
3827
+ purposeSuffix: `Morpho Blue: supply (${args.amountHuman}) to "${marketLabel}".`,
3828
+ firstMsgRawNo0x: evmSteps[0].data.slice(2),
3829
+ destinationAddress: morphoBlue,
3830
+ buildBatchMeta: ({ gasLimit }) => ({
3831
+ signatureText: JSON.stringify({ kind: "MorphoBlue", name: "supply", marketLabel, amountHuman: args.amountHuman }),
3832
+ evm: { type: "morpho_blue_supply", version: 1, chainId: String(args.chainId) },
3833
+ morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } }
3834
+ })
3835
+ });
3836
+ }
3837
+ async function buildEvmMultisignBodyMorphoBlueWithdrawBatch(args) {
3838
+ const morphoBlue = viem.getAddress(args.morphoBlue);
3839
+ const onBehalf = viem.getAddress(args.onBehalf);
3840
+ const receiver = viem.getAddress(args.receiver);
3841
+ const executor = viem.getAddress(args.executorAddress);
3842
+ const loan = viem.getAddress(args.loanToken);
3843
+ const dec = await readTokenDecimals3({ rpcUrl: args.rpcUrl, chainId: args.chainId, token: loan });
3844
+ const amountWei = viem.parseUnits(args.amountHuman, dec);
3845
+ if (amountWei === 0n) throw new Error("Withdraw amount is zero.");
3846
+ const withdrawData = encodeMorphoBlueWithdrawCalldata({
3847
+ marketParams: args.marketParams,
3848
+ assets: amountWei,
3849
+ onBehalf,
3850
+ receiver
3851
+ });
3852
+ const marketLabel = (args.marketLabel ?? "").trim() || "Morpho Blue market";
3853
+ const evmSteps = [
3854
+ { to: morphoBlue, data: withdrawData, value: 0n, fallbackGas: MORPHO_BLUE_WITHDRAW_FALLBACK_GAS }
3855
+ ];
3856
+ return buildEvmMultisignBatch({
3857
+ context: {
3858
+ chainCategory: "evm",
3859
+ keyGen: args.keyGen,
3860
+ purposeText: args.purposeText,
3861
+ chainId: args.chainId,
3862
+ rpcUrl: args.rpcUrl,
3863
+ executorAddress: executor,
3864
+ chainDetail: args.chainDetail,
3865
+ useCustomGas: args.useCustomGas,
3866
+ customGasChainDetails: args.customGasChainDetails
3867
+ },
3868
+ steps: evmSteps,
3869
+ purposeSuffix: `Morpho Blue: withdraw (${args.amountHuman}) from "${marketLabel}".`,
3870
+ firstMsgRawNo0x: withdrawData.slice(2),
3871
+ destinationAddress: morphoBlue,
3872
+ buildBatchMeta: ({ gasLimit }) => ({
3873
+ signatureText: JSON.stringify({ kind: "MorphoBlue", name: "withdraw", marketLabel, amountHuman: args.amountHuman }),
3874
+ evm: { type: "morpho_blue_withdraw", version: 1, chainId: String(args.chainId) },
3875
+ morpho: { marketLabel, amountHuman: args.amountHuman, gasBuild: { baseGasUnits: gasLimit.toString() } }
3876
+ })
3877
+ });
3878
+ }
3570
3879
  async function buildEvmMultisignBodyMorphoBlueBorrowBatch(args) {
3571
3880
  const morphoBlue = viem.getAddress(args.morphoBlue);
3572
3881
  const onBehalf = viem.getAddress(args.onBehalf);
@@ -3732,6 +4041,54 @@ async function buildEvmMultisignBodyMorphoMerklDistributorClaim(args) {
3732
4041
  });
3733
4042
  }
3734
4043
 
4044
+ // src/protocols/evm/morpho/stockDiscovery.ts
4045
+ init_midnightApi();
4046
+ init_midnightConstants();
4047
+ var MORPHO_STOCK_MARKETS_DEFAULT_CHAIN_ID = exports.MORPHO_MIDNIGHT_BASE_CHAIN_ID;
4048
+ 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.";
4049
+ async function morphoFetchStockMarketsSummary(args) {
4050
+ const chainId = args.chainId ?? MORPHO_STOCK_MARKETS_DEFAULT_CHAIN_ID;
4051
+ const rate = args.rate ?? "both";
4052
+ const limit = Math.min(Math.max(args.limit ?? 50, 1), 200);
4053
+ const collateralRaw = args.collateral?.trim();
4054
+ const collateral = collateralRaw ? resolveMorphoAssetRef(collateralRaw, chainId) : null;
4055
+ if (collateralRaw && !collateral) {
4056
+ throw new Error(
4057
+ `Unknown Morpho stock collateral "${collateralRaw}". Pass a B20 ticker (AAPLc, NVDAc, \u2026) or 0x address.`
4058
+ );
4059
+ }
4060
+ let markets = [];
4061
+ let books = [];
4062
+ if (rate === "variable" || rate === "both") {
4063
+ const blue = await morphoFetchBlueMarketsSummary({
4064
+ chainId,
4065
+ collateral: collateral ?? void 0,
4066
+ query: collateral ? void 0 : "stock",
4067
+ limit
4068
+ });
4069
+ markets = blue.markets.filter((m) => isMorphoB20Collateral(m.collateralTokenAddress)).slice(0, limit);
4070
+ }
4071
+ if (rate === "fixed" || rate === "both") {
4072
+ if (collateral) {
4073
+ const midnight = await morphoFetchMidnightBooksSummary({
4074
+ chainId,
4075
+ collateral,
4076
+ limit: Math.min(limit, exports.MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT)
4077
+ });
4078
+ books = midnight.books.filter((b) => b.collateralTokenAddresses.some((a) => isMorphoB20Collateral(a))).slice(0, limit);
4079
+ } else {
4080
+ const { data } = await fetchMorphoMidnightBooks({
4081
+ chainId,
4082
+ collateralTokens: morphoB20CollateralAddresses(),
4083
+ sort: "maturity",
4084
+ limit: exports.MORPHO_MIDNIGHT_BOOKS_MAX_LIMIT
4085
+ });
4086
+ books = data.map(morphoMidnightBookToDiscoveryRow).filter((b) => b.collateralTokenAddresses.some((a) => isMorphoB20Collateral(a))).slice(0, limit);
4087
+ }
4088
+ }
4089
+ return { chainId, markets, books, notes: MORPHO_STOCK_MARKETS_NOTES };
4090
+ }
4091
+
3735
4092
  // src/protocols/evm/morpho/index.ts
3736
4093
  var MORPHO_PROTOCOL_ID = "morpho";
3737
4094
  var morphoProtocolModule = {
@@ -3748,10 +4105,15 @@ var morphoProtocolModule = {
3748
4105
  { id: "morpho.vault-deposit", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Deposit into Morpho-listed earn vault (V1 or V2)", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3749
4106
  { id: "morpho.vault-withdraw", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Withdraw from Morpho earn vault (V1 or V2)", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3750
4107
  { id: "morpho.blue-collateral-deposit", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Supply collateral to Morpho Blue market", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
4108
+ { id: "morpho.blue-supply", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Supply loan token to Morpho Blue market", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
4109
+ { id: "morpho.blue-withdraw", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Withdraw supplied loan token from Morpho Blue market", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3751
4110
  { id: "morpho.blue-borrow", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Borrow from Morpho Blue market", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3752
4111
  { id: "morpho.blue-repay", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Repay Morpho Blue borrow", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3753
4112
  { id: "morpho.blue-collateral-withdraw", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Withdraw Morpho Blue collateral", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
3754
4113
  { id: "morpho.merkl-claim", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Claim Morpho Merkl rewards", commonParams: ["keyGen", "purposeText", "useCustomGas"], params: {} },
4114
+ { id: "morpho.fetch-blue-markets", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Search Morpho Blue variable-rate markets", commonParams: [], params: {} },
4115
+ { id: "morpho.fetch-stock-markets", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "List Coinbase B20 stock-backed Morpho Blue and Midnight markets on Base", commonParams: [], params: {} },
4116
+ { id: "morpho.fetch-positions", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "List Morpho vault and Blue positions for a user", commonParams: [], params: {} },
3755
4117
  { id: "morpho.fetch-midnight-books", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "List Morpho Midnight fixed-rate books", commonParams: [], params: {} },
3756
4118
  { id: "morpho.fetch-midnight-quote", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "Quote Morpho Midnight lend/borrow fill", commonParams: [], params: {} },
3757
4119
  { id: "morpho.fetch-midnight-positions", protocolId: MORPHO_PROTOCOL_ID, chainCategory: "evm", description: "List Morpho Midnight user positions", commonParams: [], params: {} },
@@ -3766,14 +4128,23 @@ registerProtocolModule(morphoProtocolModule);
3766
4128
 
3767
4129
  exports.ARC_MAINNET_CHAIN_ID = ARC_MAINNET_CHAIN_ID;
3768
4130
  exports.ARC_TESTNET_CHAIN_ID = ARC_TESTNET_CHAIN_ID;
4131
+ exports.MORPHO_ARC_USDC = MORPHO_ARC_USDC;
4132
+ exports.MORPHO_BASE_USDC = MORPHO_BASE_USDC;
4133
+ exports.MORPHO_BASE_USDT = MORPHO_BASE_USDT;
3769
4134
  exports.MORPHO_BLUE_BORROW_FALLBACK_GAS = MORPHO_BLUE_BORROW_FALLBACK_GAS;
3770
4135
  exports.MORPHO_BLUE_COLLATERAL_DEPOSIT_FALLBACK_GAS = MORPHO_BLUE_COLLATERAL_DEPOSIT_FALLBACK_GAS;
3771
4136
  exports.MORPHO_BLUE_COLLATERAL_WITHDRAW_FALLBACK_GAS = MORPHO_BLUE_COLLATERAL_WITHDRAW_FALLBACK_GAS;
3772
4137
  exports.MORPHO_BLUE_REPAY_FALLBACK_GAS = MORPHO_BLUE_REPAY_FALLBACK_GAS;
4138
+ exports.MORPHO_BLUE_SUPPLY_FALLBACK_GAS = MORPHO_BLUE_SUPPLY_FALLBACK_GAS;
4139
+ exports.MORPHO_BLUE_WITHDRAW_FALLBACK_GAS = MORPHO_BLUE_WITHDRAW_FALLBACK_GAS;
4140
+ exports.MORPHO_ETHEREUM_USDC = MORPHO_ETHEREUM_USDC;
4141
+ exports.MORPHO_ETHEREUM_USDT = MORPHO_ETHEREUM_USDT;
3773
4142
  exports.MORPHO_EXTRA_SUPPORTED_CHAIN_IDS = MORPHO_EXTRA_SUPPORTED_CHAIN_IDS;
3774
4143
  exports.MORPHO_GRAPHQL_URL = MORPHO_GRAPHQL_URL;
3775
4144
  exports.MORPHO_MIDNIGHT_UNAVAILABLE_MESSAGE = MORPHO_MIDNIGHT_UNAVAILABLE_MESSAGE;
3776
4145
  exports.MORPHO_PROTOCOL_ID = MORPHO_PROTOCOL_ID;
4146
+ exports.MORPHO_STOCK_MARKETS_DEFAULT_CHAIN_ID = MORPHO_STOCK_MARKETS_DEFAULT_CHAIN_ID;
4147
+ exports.MORPHO_STOCK_MARKETS_NOTES = MORPHO_STOCK_MARKETS_NOTES;
3777
4148
  exports.MORPHO_VAULT_DEPOSIT_FALLBACK_GAS = MORPHO_VAULT_DEPOSIT_FALLBACK_GAS;
3778
4149
  exports.MORPHO_VAULT_WITHDRAW_FALLBACK_GAS = MORPHO_VAULT_WITHDRAW_FALLBACK_GAS;
3779
4150
  exports.ROBINHOOD_CHAIN_ID = ROBINHOOD_CHAIN_ID;
@@ -3784,7 +4155,9 @@ exports.ROBINHOOD_EARN_VAULT_SYMBOL = ROBINHOOD_EARN_VAULT_SYMBOL;
3784
4155
  exports.applyRobinhoodEarnMultisignDefaults = applyRobinhoodEarnMultisignDefaults;
3785
4156
  exports.buildEvmMultisignBodyMorphoBlueBorrowBatch = buildEvmMultisignBodyMorphoBlueBorrowBatch;
3786
4157
  exports.buildEvmMultisignBodyMorphoBlueRepayBatch = buildEvmMultisignBodyMorphoBlueRepayBatch;
4158
+ exports.buildEvmMultisignBodyMorphoBlueSupplyBatch = buildEvmMultisignBodyMorphoBlueSupplyBatch;
3787
4159
  exports.buildEvmMultisignBodyMorphoBlueSupplyCollateralBatch = buildEvmMultisignBodyMorphoBlueSupplyCollateralBatch;
4160
+ exports.buildEvmMultisignBodyMorphoBlueWithdrawBatch = buildEvmMultisignBodyMorphoBlueWithdrawBatch;
3788
4161
  exports.buildEvmMultisignBodyMorphoBlueWithdrawCollateralBatch = buildEvmMultisignBodyMorphoBlueWithdrawCollateralBatch;
3789
4162
  exports.buildEvmMultisignBodyMorphoMerklDistributorClaim = buildEvmMultisignBodyMorphoMerklDistributorClaim;
3790
4163
  exports.buildEvmMultisignBodyMorphoMidnightBorrowBatch = buildEvmMultisignBodyMorphoMidnightBorrowBatch;
@@ -3796,16 +4169,20 @@ exports.buildEvmMultisignBodyMorphoVaultDepositBatch = buildEvmMultisignBodyMorp
3796
4169
  exports.buildEvmMultisignBodyMorphoVaultWithdraw = buildEvmMultisignBodyMorphoVaultWithdraw;
3797
4170
  exports.emptyMorphoEarnVaultDetailFields = emptyMorphoEarnVaultDetailFields;
3798
4171
  exports.encodeMorphoBlueMarketParamsCallbackData = encodeMorphoBlueMarketParamsCallbackData;
4172
+ exports.encodeMorphoBlueSupplyCalldata = encodeMorphoBlueSupplyCalldata;
4173
+ exports.encodeMorphoBlueWithdrawCalldata = encodeMorphoBlueWithdrawCalldata;
3799
4174
  exports.enrichMorphoEarnOfferingRows = enrichMorphoEarnOfferingRows;
3800
4175
  exports.enrichMorphoEarnOfferingRowsForAgent = enrichMorphoEarnOfferingRowsForAgent;
3801
4176
  exports.ensureMorphoChainAssetCache = ensureMorphoChainAssetCache;
3802
4177
  exports.fetchMorphoBorrowMarketsForCollateral = fetchMorphoBorrowMarketsForCollateral;
4178
+ exports.fetchMorphoBorrowMarketsForCollaterals = fetchMorphoBorrowMarketsForCollaterals;
3803
4179
  exports.fetchMorphoBorrowMarketsForLoan = fetchMorphoBorrowMarketsForLoan;
3804
4180
  exports.fetchMorphoChains = fetchMorphoChains;
3805
4181
  exports.fetchMorphoEarnOfferingsForAsset = fetchMorphoEarnOfferingsForAsset;
3806
4182
  exports.fetchMorphoEarnVaultDetails = fetchMorphoEarnVaultDetails;
3807
4183
  exports.fetchMorphoMarketById = fetchMorphoMarketById;
3808
4184
  exports.fetchMorphoMarketsForChain = fetchMorphoMarketsForChain;
4185
+ exports.fetchMorphoMarketsWhere = fetchMorphoMarketsWhere;
3809
4186
  exports.fetchMorphoMidnightBook = fetchMorphoMidnightBook;
3810
4187
  exports.fetchMorphoMidnightBookQuote = fetchMorphoMidnightBookQuote;
3811
4188
  exports.fetchMorphoMidnightBooks = fetchMorphoMidnightBooks;
@@ -3828,14 +4205,20 @@ exports.formatMorphoFeePct = formatMorphoFeePct;
3828
4205
  exports.formatMorphoMarketApySummary = formatMorphoMarketApySummary;
3829
4206
  exports.formatMorphoMidnightAprPct = formatMorphoMidnightAprPct;
3830
4207
  exports.formatMorphoUsd = formatMorphoUsd;
4208
+ exports.formatMorphoUtilizationPct = formatMorphoUtilizationPct;
3831
4209
  exports.isMorphoArcChainId = isMorphoArcChainId;
4210
+ exports.isMorphoB20Collateral = isMorphoB20Collateral;
4211
+ exports.isMorphoStockQuery = isMorphoStockQuery;
3832
4212
  exports.isMorphoVaultListed = isMorphoVaultListed;
3833
4213
  exports.isRobinhoodEarnProductFlag = isRobinhoodEarnProductFlag;
3834
4214
  exports.isRobinhoodEarnQuery = isRobinhoodEarnQuery;
3835
4215
  exports.loadMorphoSupportedChainIds = loadMorphoSupportedChainIds;
4216
+ exports.looksLikeMorphoStockTicker = looksLikeMorphoStockTicker;
3836
4217
  exports.mapMorphoIncentiveRewards = mapMorphoIncentiveRewards;
3837
4218
  exports.marketParamsFromApiRow = marketParamsFromApiRow;
3838
4219
  exports.mergeMorphoSupportedChainIds = mergeMorphoSupportedChainIds;
4220
+ exports.morphoAssetLabel = morphoAssetLabel;
4221
+ exports.morphoB20CollateralAddresses = morphoB20CollateralAddresses;
3839
4222
  exports.morphoEarnOfferingToDiscoveryRow = morphoEarnOfferingToDiscoveryRow;
3840
4223
  exports.morphoFetchBlueMarketsSummary = morphoFetchBlueMarketsSummary;
3841
4224
  exports.morphoFetchEarnVaultsSummary = morphoFetchEarnVaultsSummary;
@@ -3844,6 +4227,8 @@ exports.morphoFetchMidnightMakerOffersSummary = morphoFetchMidnightMakerOffersSu
3844
4227
  exports.morphoFetchMidnightPositionsSummary = morphoFetchMidnightPositionsSummary;
3845
4228
  exports.morphoFetchMidnightQuote = morphoFetchMidnightQuote;
3846
4229
  exports.morphoFetchMidnightQuoteSummary = morphoFetchMidnightQuoteSummary;
4230
+ exports.morphoFetchPositionsSummary = morphoFetchPositionsSummary;
4231
+ exports.morphoFetchStockMarketsSummary = morphoFetchStockMarketsSummary;
3847
4232
  exports.morphoGql = morphoGql;
3848
4233
  exports.morphoKeyForAssetRow = morphoKeyForAssetRow;
3849
4234
  exports.morphoMarketToBorrowRow = morphoMarketToBorrowRow;
@@ -3867,6 +4252,7 @@ exports.parseMorphoMidnightAprInput = parseMorphoMidnightAprInput;
3867
4252
  exports.parseMorphoMidnightPriceWad = parseMorphoMidnightPriceWad;
3868
4253
  exports.pickBestBlueSupplyMarketForLoan = pickBestBlueSupplyMarketForLoan;
3869
4254
  exports.previewMorphoBlueHealthAfterCollateralWithdraw = previewMorphoBlueHealthAfterCollateralWithdraw;
4255
+ exports.resolveMorphoAssetRef = resolveMorphoAssetRef;
3870
4256
  exports.resolveRobinhoodEarnFetchQuery = resolveRobinhoodEarnFetchQuery;
3871
4257
  exports.searchMorphoListedEarnVaults = searchMorphoListedEarnVaults;
3872
4258
  //# sourceMappingURL=index.cjs.map