@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
@@ -702,6 +702,121 @@ async function fetchEulerBorrowCollateralMaxWithdrawAssetsWei(args) {
702
702
  caller
703
703
  });
704
704
  }
705
+ var COINBASE_B20_STOCK_DECIMALS = 8;
706
+ var COINBASE_B20_ASSET_PREFIX = "0xb200000000000000000000";
707
+ function isCoinbaseB20AssetToken(address) {
708
+ try {
709
+ return viem.getAddress(address).toLowerCase().startsWith(COINBASE_B20_ASSET_PREFIX);
710
+ } catch {
711
+ return false;
712
+ }
713
+ }
714
+ function looksLikeCoinbaseStockSymbol(symbol) {
715
+ return /^[A-Za-z][A-Za-z0-9]{0,8}(?:\.[A-Za-z][A-Za-z0-9]{0,4})?c$/.test((symbol ?? "").trim());
716
+ }
717
+ var COINBASE_TOKENIZED_STOCKS_API_URL = "https://api.coinbase.com/v1/tokenized-stocks";
718
+ var CATALOG_TTL_MS = 15 * 60 * 1e3;
719
+ var CATALOG_MAX = 500;
720
+ var catalogRows = null;
721
+ var catalogAt = 0;
722
+ var catalogInflight = null;
723
+ var catalogBySymbol = /* @__PURE__ */ new Map();
724
+ var catalogByAddress = /* @__PURE__ */ new Map();
725
+ function indexCatalog(rows) {
726
+ catalogRows = rows;
727
+ catalogAt = Date.now();
728
+ catalogBySymbol.clear();
729
+ catalogByAddress.clear();
730
+ for (const row of rows) {
731
+ catalogBySymbol.set(row.symbol.toLowerCase(), row);
732
+ catalogByAddress.set(row.address.toLowerCase(), row);
733
+ }
734
+ }
735
+ function parseCoinbaseTokenizedStocksPayload(payload) {
736
+ const tokens = Array.isArray(payload) ? payload : payload && typeof payload === "object" && Array.isArray(payload.tokens) ? payload.tokens : [];
737
+ const out = [];
738
+ const seen = /* @__PURE__ */ new Set();
739
+ for (const row of tokens) {
740
+ if (!row || typeof row !== "object") continue;
741
+ const rec = row;
742
+ const symbol = typeof rec.symbol === "string" ? rec.symbol.trim() : "";
743
+ const addressRaw = typeof rec.contract_address === "string" ? rec.contract_address.trim() : "";
744
+ if (!looksLikeCoinbaseStockSymbol(symbol) || !isCoinbaseB20AssetToken(addressRaw)) continue;
745
+ const address = viem.getAddress(addressRaw);
746
+ const key = address.toLowerCase();
747
+ if (seen.has(key)) continue;
748
+ seen.add(key);
749
+ const name = typeof rec.name === "string" && rec.name.trim() ? rec.name.trim() : symbol;
750
+ const iconUrl = typeof rec.icon_url === "string" && rec.icon_url.trim() ? rec.icon_url.trim() : void 0;
751
+ const decimals = typeof rec.decimals === "number" && Number.isInteger(rec.decimals) && rec.decimals >= 0 && rec.decimals <= 18 ? rec.decimals : COINBASE_B20_STOCK_DECIMALS;
752
+ out.push({ address, symbol, name, decimals, iconUrl });
753
+ if (out.length >= CATALOG_MAX) break;
754
+ }
755
+ return out;
756
+ }
757
+ async function fetchCoinbaseB20StockCatalog() {
758
+ const merged = [];
759
+ const seen = /* @__PURE__ */ new Set();
760
+ let pageToken = "";
761
+ for (let page = 0; page < 4; page++) {
762
+ const url = new URL(COINBASE_TOKENIZED_STOCKS_API_URL);
763
+ url.searchParams.set("page_size", "500");
764
+ if (pageToken) url.searchParams.set("page_token", pageToken);
765
+ const res = await fetch(url, { cache: "no-store", signal: AbortSignal.timeout(8e3) });
766
+ if (!res.ok) break;
767
+ const json = await res.json();
768
+ for (const row of parseCoinbaseTokenizedStocksPayload(json)) {
769
+ const key = row.address.toLowerCase();
770
+ if (seen.has(key)) continue;
771
+ seen.add(key);
772
+ merged.push(row);
773
+ if (merged.length >= CATALOG_MAX) break;
774
+ }
775
+ pageToken = typeof json.next_page_token === "string" ? json.next_page_token.trim() : "";
776
+ if (!pageToken || merged.length >= CATALOG_MAX) break;
777
+ }
778
+ if (merged.length > 0) indexCatalog(merged);
779
+ return catalogRows ?? [];
780
+ }
781
+ async function ensureCoinbaseB20StockCatalog() {
782
+ if (catalogRows && catalogRows.length > 0 && Date.now() - catalogAt < CATALOG_TTL_MS) return catalogRows;
783
+ if (!catalogInflight) {
784
+ catalogInflight = fetchCoinbaseB20StockCatalog().finally(() => {
785
+ catalogInflight = null;
786
+ });
787
+ }
788
+ try {
789
+ return await catalogInflight;
790
+ } catch {
791
+ return catalogRows ?? [];
792
+ }
793
+ }
794
+ function lookupCoinbaseB20StockToken(token) {
795
+ const key = (token ?? "").trim();
796
+ if (!key) return null;
797
+ const fromCatalog = catalogBySymbol.get(key.toLowerCase());
798
+ if (fromCatalog) return fromCatalog;
799
+ try {
800
+ return catalogByAddress.get(viem.getAddress(key).toLowerCase()) ?? null;
801
+ } catch {
802
+ return null;
803
+ }
804
+ }
805
+ async function canonicalizeEvmTokenInput(token) {
806
+ const raw = (token ?? "").trim();
807
+ if (!raw || viem.isAddress(raw)) return raw;
808
+ if (!looksLikeCoinbaseStockSymbol(raw)) return raw;
809
+ await ensureCoinbaseB20StockCatalog().catch(() => []);
810
+ const hit = lookupCoinbaseB20StockToken(raw);
811
+ if (!hit) {
812
+ throw new Error(
813
+ `Unknown Coinbase stock ticker "${raw}". It is not in the live tokenized-stocks catalog.`
814
+ );
815
+ }
816
+ return hit.address;
817
+ }
818
+
819
+ // src/protocols/evm/euler-v2/isolatedLendMultisign.ts
705
820
  var EULER_V2_ISOLATED_VAULT_DEPOSIT_FALLBACK_GAS = 950000n;
706
821
  var EULER_VAULT_DEPOSIT_ESTIMATE_FALLBACK = EULER_V2_ISOLATED_VAULT_DEPOSIT_FALLBACK_GAS;
707
822
  var EULER_ERC20_APPROVE_FALLBACK = 100000n;
@@ -716,7 +831,7 @@ var erc4626DepositAbi = viem.parseAbi([
716
831
  "function deposit(uint256 assets, address receiver) returns (uint256 shares)"
717
832
  ]);
718
833
  async function buildEvmMultisignBodyEulerV2IsolatedLendDepositBatch(args) {
719
- const asset = viem.getAddress(args.underlying);
834
+ const asset = viem.getAddress(await canonicalizeEvmTokenInput(args.underlying));
720
835
  const evault = viem.getAddress(args.evault);
721
836
  const weth = viem.getAddress(args.nativeWrapped);
722
837
  const executor = viem.getAddress(args.executorAddress);
@@ -913,8 +1028,8 @@ async function buildEvmMultisignBodyEulerV2IsolatedBorrowBatch(args) {
913
1028
  const evc = viem.getAddress(args.evc);
914
1029
  const borrowVault = viem.getAddress(args.borrowVault);
915
1030
  const collateralVault = viem.getAddress(args.collateralVault);
916
- const collateralAsset = viem.getAddress(args.collateralUnderlying);
917
- const borrowAsset = viem.getAddress(args.borrowUnderlying);
1031
+ const collateralAsset = viem.getAddress(await canonicalizeEvmTokenInput(args.collateralUnderlying));
1032
+ const borrowAsset = viem.getAddress(await canonicalizeEvmTokenInput(args.borrowUnderlying));
918
1033
  const weth = viem.getAddress(args.nativeWrapped);
919
1034
  const executor = viem.getAddress(args.executorAddress);
920
1035
  const receiver = viem.getAddress(args.receiver);
@@ -1324,7 +1439,7 @@ var evcAbi3 = viem.parseAbi([
1324
1439
  async function buildEvmMultisignBodyEulerV2BorrowCollateralDepositBatch(args) {
1325
1440
  const evc = viem.getAddress(args.evc);
1326
1441
  const collateralVault = viem.getAddress(args.collateralVault);
1327
- const collateralAsset = viem.getAddress(args.collateralUnderlying);
1442
+ const collateralAsset = viem.getAddress(await canonicalizeEvmTokenInput(args.collateralUnderlying));
1328
1443
  const subAccount = viem.getAddress(args.subAccount);
1329
1444
  const executor = viem.getAddress(args.executorAddress);
1330
1445
  const ch = viem.defineChain({
@@ -2544,7 +2659,7 @@ async function fetchEulerV2IsolatedLendMarketsForRowAsset(args) {
2544
2659
  return rows;
2545
2660
  }
2546
2661
  async function eulerV2FetchLendVaultsSummary(args) {
2547
- const addr = args.underlyingAddress.trim();
2662
+ const addr = (await canonicalizeEvmTokenInput(args.underlyingAddress)).trim();
2548
2663
  if (!viem.isAddress(addr)) {
2549
2664
  throw new Error("underlyingAddress must be a valid ERC-20 address.");
2550
2665
  }
@@ -2840,7 +2955,7 @@ function checksumHex2(raw) {
2840
2955
 
2841
2956
  // src/protocols/evm/euler-v2/eulerV2EarnDiscovery.ts
2842
2957
  async function eulerV2FetchEarnVaultsSummary(args) {
2843
- const addr = args.underlyingAddress.trim();
2958
+ const addr = (await canonicalizeEvmTokenInput(args.underlyingAddress)).trim();
2844
2959
  if (!viem.isAddress(addr)) {
2845
2960
  throw new Error("underlyingAddress must be a valid ERC-20 address.");
2846
2961
  }