@continuumdao/ctm-mpc-defi 0.2.56 → 0.2.57

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/agent/catalog.cjs +304 -134
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +162 -42
  4. package/dist/agent/catalog.js +304 -136
  5. package/dist/agent/catalog.js.map +1 -1
  6. package/dist/agent/skills/aave-v4/SKILL.md +26 -3
  7. package/dist/agent/skills/aerodrome/SKILL.md +3 -1
  8. package/dist/agent/skills/curve-dao/SKILL.md +2 -2
  9. package/dist/agent/skills/uniswap-v4/SKILL.md +2 -2
  10. package/dist/index.cjs +165 -19
  11. package/dist/index.cjs.map +1 -1
  12. package/dist/index.js +166 -20
  13. package/dist/index.js.map +1 -1
  14. package/dist/protocols/evm/aave-v4/index.cjs +198 -15
  15. package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
  16. package/dist/protocols/evm/aave-v4/index.d.ts +62 -7
  17. package/dist/protocols/evm/aave-v4/index.js +189 -16
  18. package/dist/protocols/evm/aave-v4/index.js.map +1 -1
  19. package/dist/protocols/evm/aerodrome/index.cjs +152 -63
  20. package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
  21. package/dist/protocols/evm/aerodrome/index.d.ts +30 -58
  22. package/dist/protocols/evm/aerodrome/index.js +151 -64
  23. package/dist/protocols/evm/aerodrome/index.js.map +1 -1
  24. package/dist/protocols/evm/compound-v3/index.cjs +115 -2
  25. package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
  26. package/dist/protocols/evm/compound-v3/index.js +116 -3
  27. package/dist/protocols/evm/compound-v3/index.js.map +1 -1
  28. package/dist/protocols/evm/curve-dao/index.cjs +120 -5
  29. package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
  30. package/dist/protocols/evm/curve-dao/index.js +120 -5
  31. package/dist/protocols/evm/curve-dao/index.js.map +1 -1
  32. package/dist/protocols/evm/euler-v2/index.cjs +121 -6
  33. package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
  34. package/dist/protocols/evm/euler-v2/index.js +121 -6
  35. package/dist/protocols/evm/euler-v2/index.js.map +1 -1
  36. package/dist/protocols/evm/morpho/index.cjs +129 -57
  37. package/dist/protocols/evm/morpho/index.cjs.map +1 -1
  38. package/dist/protocols/evm/morpho/index.d.ts +2 -1
  39. package/dist/protocols/evm/morpho/index.js +129 -58
  40. package/dist/protocols/evm/morpho/index.js.map +1 -1
  41. package/dist/protocols/evm/pendle/index.cjs +129 -10
  42. package/dist/protocols/evm/pendle/index.cjs.map +1 -1
  43. package/dist/protocols/evm/pendle/index.js +129 -10
  44. package/dist/protocols/evm/pendle/index.js.map +1 -1
  45. package/dist/protocols/evm/uniswap-v4/index.cjs +164 -17
  46. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  47. package/dist/protocols/evm/uniswap-v4/index.js +165 -18
  48. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  49. package/package.json +1 -1
@@ -700,6 +700,121 @@ async function fetchEulerBorrowCollateralMaxWithdrawAssetsWei(args) {
700
700
  caller
701
701
  });
702
702
  }
703
+ var COINBASE_B20_STOCK_DECIMALS = 8;
704
+ var COINBASE_B20_ASSET_PREFIX = "0xb200000000000000000000";
705
+ function isCoinbaseB20AssetToken(address) {
706
+ try {
707
+ return getAddress(address).toLowerCase().startsWith(COINBASE_B20_ASSET_PREFIX);
708
+ } catch {
709
+ return false;
710
+ }
711
+ }
712
+ function looksLikeCoinbaseStockSymbol(symbol) {
713
+ return /^[A-Za-z][A-Za-z0-9]{0,8}(?:\.[A-Za-z][A-Za-z0-9]{0,4})?c$/.test((symbol ?? "").trim());
714
+ }
715
+ var COINBASE_TOKENIZED_STOCKS_API_URL = "https://api.coinbase.com/v1/tokenized-stocks";
716
+ var CATALOG_TTL_MS = 15 * 60 * 1e3;
717
+ var CATALOG_MAX = 500;
718
+ var catalogRows = null;
719
+ var catalogAt = 0;
720
+ var catalogInflight = null;
721
+ var catalogBySymbol = /* @__PURE__ */ new Map();
722
+ var catalogByAddress = /* @__PURE__ */ new Map();
723
+ function indexCatalog(rows) {
724
+ catalogRows = rows;
725
+ catalogAt = Date.now();
726
+ catalogBySymbol.clear();
727
+ catalogByAddress.clear();
728
+ for (const row of rows) {
729
+ catalogBySymbol.set(row.symbol.toLowerCase(), row);
730
+ catalogByAddress.set(row.address.toLowerCase(), row);
731
+ }
732
+ }
733
+ function parseCoinbaseTokenizedStocksPayload(payload) {
734
+ const tokens = Array.isArray(payload) ? payload : payload && typeof payload === "object" && Array.isArray(payload.tokens) ? payload.tokens : [];
735
+ const out = [];
736
+ const seen = /* @__PURE__ */ new Set();
737
+ for (const row of tokens) {
738
+ if (!row || typeof row !== "object") continue;
739
+ const rec = row;
740
+ const symbol = typeof rec.symbol === "string" ? rec.symbol.trim() : "";
741
+ const addressRaw = typeof rec.contract_address === "string" ? rec.contract_address.trim() : "";
742
+ if (!looksLikeCoinbaseStockSymbol(symbol) || !isCoinbaseB20AssetToken(addressRaw)) continue;
743
+ const address = getAddress(addressRaw);
744
+ const key = address.toLowerCase();
745
+ if (seen.has(key)) continue;
746
+ seen.add(key);
747
+ const name = typeof rec.name === "string" && rec.name.trim() ? rec.name.trim() : symbol;
748
+ const iconUrl = typeof rec.icon_url === "string" && rec.icon_url.trim() ? rec.icon_url.trim() : void 0;
749
+ const decimals = typeof rec.decimals === "number" && Number.isInteger(rec.decimals) && rec.decimals >= 0 && rec.decimals <= 18 ? rec.decimals : COINBASE_B20_STOCK_DECIMALS;
750
+ out.push({ address, symbol, name, decimals, iconUrl });
751
+ if (out.length >= CATALOG_MAX) break;
752
+ }
753
+ return out;
754
+ }
755
+ async function fetchCoinbaseB20StockCatalog() {
756
+ const merged = [];
757
+ const seen = /* @__PURE__ */ new Set();
758
+ let pageToken = "";
759
+ for (let page = 0; page < 4; page++) {
760
+ const url = new URL(COINBASE_TOKENIZED_STOCKS_API_URL);
761
+ url.searchParams.set("page_size", "500");
762
+ if (pageToken) url.searchParams.set("page_token", pageToken);
763
+ const res = await fetch(url, { cache: "no-store", signal: AbortSignal.timeout(8e3) });
764
+ if (!res.ok) break;
765
+ const json = await res.json();
766
+ for (const row of parseCoinbaseTokenizedStocksPayload(json)) {
767
+ const key = row.address.toLowerCase();
768
+ if (seen.has(key)) continue;
769
+ seen.add(key);
770
+ merged.push(row);
771
+ if (merged.length >= CATALOG_MAX) break;
772
+ }
773
+ pageToken = typeof json.next_page_token === "string" ? json.next_page_token.trim() : "";
774
+ if (!pageToken || merged.length >= CATALOG_MAX) break;
775
+ }
776
+ if (merged.length > 0) indexCatalog(merged);
777
+ return catalogRows ?? [];
778
+ }
779
+ async function ensureCoinbaseB20StockCatalog() {
780
+ if (catalogRows && catalogRows.length > 0 && Date.now() - catalogAt < CATALOG_TTL_MS) return catalogRows;
781
+ if (!catalogInflight) {
782
+ catalogInflight = fetchCoinbaseB20StockCatalog().finally(() => {
783
+ catalogInflight = null;
784
+ });
785
+ }
786
+ try {
787
+ return await catalogInflight;
788
+ } catch {
789
+ return catalogRows ?? [];
790
+ }
791
+ }
792
+ function lookupCoinbaseB20StockToken(token) {
793
+ const key = (token ?? "").trim();
794
+ if (!key) return null;
795
+ const fromCatalog = catalogBySymbol.get(key.toLowerCase());
796
+ if (fromCatalog) return fromCatalog;
797
+ try {
798
+ return catalogByAddress.get(getAddress(key).toLowerCase()) ?? null;
799
+ } catch {
800
+ return null;
801
+ }
802
+ }
803
+ async function canonicalizeEvmTokenInput(token) {
804
+ const raw = (token ?? "").trim();
805
+ if (!raw || isAddress(raw)) return raw;
806
+ if (!looksLikeCoinbaseStockSymbol(raw)) return raw;
807
+ await ensureCoinbaseB20StockCatalog().catch(() => []);
808
+ const hit = lookupCoinbaseB20StockToken(raw);
809
+ if (!hit) {
810
+ throw new Error(
811
+ `Unknown Coinbase stock ticker "${raw}". It is not in the live tokenized-stocks catalog.`
812
+ );
813
+ }
814
+ return hit.address;
815
+ }
816
+
817
+ // src/protocols/evm/euler-v2/isolatedLendMultisign.ts
703
818
  var EULER_V2_ISOLATED_VAULT_DEPOSIT_FALLBACK_GAS = 950000n;
704
819
  var EULER_VAULT_DEPOSIT_ESTIMATE_FALLBACK = EULER_V2_ISOLATED_VAULT_DEPOSIT_FALLBACK_GAS;
705
820
  var EULER_ERC20_APPROVE_FALLBACK = 100000n;
@@ -714,7 +829,7 @@ var erc4626DepositAbi = parseAbi([
714
829
  "function deposit(uint256 assets, address receiver) returns (uint256 shares)"
715
830
  ]);
716
831
  async function buildEvmMultisignBodyEulerV2IsolatedLendDepositBatch(args) {
717
- const asset = getAddress(args.underlying);
832
+ const asset = getAddress(await canonicalizeEvmTokenInput(args.underlying));
718
833
  const evault = getAddress(args.evault);
719
834
  const weth = getAddress(args.nativeWrapped);
720
835
  const executor = getAddress(args.executorAddress);
@@ -911,8 +1026,8 @@ async function buildEvmMultisignBodyEulerV2IsolatedBorrowBatch(args) {
911
1026
  const evc = getAddress(args.evc);
912
1027
  const borrowVault = getAddress(args.borrowVault);
913
1028
  const collateralVault = getAddress(args.collateralVault);
914
- const collateralAsset = getAddress(args.collateralUnderlying);
915
- const borrowAsset = getAddress(args.borrowUnderlying);
1029
+ const collateralAsset = getAddress(await canonicalizeEvmTokenInput(args.collateralUnderlying));
1030
+ const borrowAsset = getAddress(await canonicalizeEvmTokenInput(args.borrowUnderlying));
916
1031
  const weth = getAddress(args.nativeWrapped);
917
1032
  const executor = getAddress(args.executorAddress);
918
1033
  const receiver = getAddress(args.receiver);
@@ -1322,7 +1437,7 @@ var evcAbi3 = parseAbi([
1322
1437
  async function buildEvmMultisignBodyEulerV2BorrowCollateralDepositBatch(args) {
1323
1438
  const evc = getAddress(args.evc);
1324
1439
  const collateralVault = getAddress(args.collateralVault);
1325
- const collateralAsset = getAddress(args.collateralUnderlying);
1440
+ const collateralAsset = getAddress(await canonicalizeEvmTokenInput(args.collateralUnderlying));
1326
1441
  const subAccount = getAddress(args.subAccount);
1327
1442
  const executor = getAddress(args.executorAddress);
1328
1443
  const ch = defineChain({
@@ -2542,7 +2657,7 @@ async function fetchEulerV2IsolatedLendMarketsForRowAsset(args) {
2542
2657
  return rows;
2543
2658
  }
2544
2659
  async function eulerV2FetchLendVaultsSummary(args) {
2545
- const addr = args.underlyingAddress.trim();
2660
+ const addr = (await canonicalizeEvmTokenInput(args.underlyingAddress)).trim();
2546
2661
  if (!isAddress(addr)) {
2547
2662
  throw new Error("underlyingAddress must be a valid ERC-20 address.");
2548
2663
  }
@@ -2838,7 +2953,7 @@ function checksumHex2(raw) {
2838
2953
 
2839
2954
  // src/protocols/evm/euler-v2/eulerV2EarnDiscovery.ts
2840
2955
  async function eulerV2FetchEarnVaultsSummary(args) {
2841
- const addr = args.underlyingAddress.trim();
2956
+ const addr = (await canonicalizeEvmTokenInput(args.underlyingAddress)).trim();
2842
2957
  if (!isAddress(addr)) {
2843
2958
  throw new Error("underlyingAddress must be a valid ERC-20 address.");
2844
2959
  }