@continuumdao/ctm-mpc-defi 0.2.55 → 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 (61) hide show
  1. package/dist/agent/catalog.cjs +692 -310
  2. package/dist/agent/catalog.cjs.map +1 -1
  3. package/dist/agent/catalog.d.ts +279 -99
  4. package/dist/agent/catalog.js +687 -312
  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 +5 -4
  9. package/dist/agent/skills/continuum-dao-marketplace/SKILL.md +4 -4
  10. package/dist/agent/skills/curve-dao/SKILL.md +2 -2
  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 +77 -19
  27. package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
  28. package/dist/protocols/evm/circle-cctp/index.d.ts +53 -3
  29. package/dist/protocols/evm/circle-cctp/index.js +76 -20
  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 +288 -32
  36. package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
  37. package/dist/protocols/evm/continuum-dao/index.d.ts +14 -1
  38. package/dist/protocols/evm/continuum-dao/index.js +287 -33
  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/uniswap-v4/index.cjs +164 -17
  58. package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
  59. package/dist/protocols/evm/uniswap-v4/index.js +165 -18
  60. package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
  61. package/package.json +1 -1
@@ -262,6 +262,119 @@ var UNISWAP_V4_LP_WETH_DEPOSIT_FALLBACK = 120000n;
262
262
  var UNISWAP_V4_LP_PERMIT2_APPROVE_FALLBACK = 100000n;
263
263
  var UNISWAP_V4_PERMISSION_FLAG_SWAP = 1;
264
264
  var UNISWAP_V4_PERMISSION_FLAG_LIQUIDITY = 2;
265
+ var COINBASE_B20_STOCK_DECIMALS = 8;
266
+ var COINBASE_B20_ASSET_PREFIX = "0xb200000000000000000000";
267
+ function isCoinbaseB20AssetToken(address) {
268
+ try {
269
+ return viem.getAddress(address).toLowerCase().startsWith(COINBASE_B20_ASSET_PREFIX);
270
+ } catch {
271
+ return false;
272
+ }
273
+ }
274
+ function looksLikeCoinbaseStockSymbol(symbol) {
275
+ return /^[A-Za-z][A-Za-z0-9]{0,8}(?:\.[A-Za-z][A-Za-z0-9]{0,4})?c$/.test((symbol ?? "").trim());
276
+ }
277
+ var COINBASE_TOKENIZED_STOCKS_API_URL = "https://api.coinbase.com/v1/tokenized-stocks";
278
+ var CATALOG_TTL_MS = 15 * 60 * 1e3;
279
+ var CATALOG_MAX = 500;
280
+ var catalogRows = null;
281
+ var catalogAt = 0;
282
+ var catalogInflight = null;
283
+ var catalogBySymbol = /* @__PURE__ */ new Map();
284
+ var catalogByAddress = /* @__PURE__ */ new Map();
285
+ function indexCatalog(rows) {
286
+ catalogRows = rows;
287
+ catalogAt = Date.now();
288
+ catalogBySymbol.clear();
289
+ catalogByAddress.clear();
290
+ for (const row of rows) {
291
+ catalogBySymbol.set(row.symbol.toLowerCase(), row);
292
+ catalogByAddress.set(row.address.toLowerCase(), row);
293
+ }
294
+ }
295
+ function parseCoinbaseTokenizedStocksPayload(payload) {
296
+ const tokens = Array.isArray(payload) ? payload : payload && typeof payload === "object" && Array.isArray(payload.tokens) ? payload.tokens : [];
297
+ const out = [];
298
+ const seen = /* @__PURE__ */ new Set();
299
+ for (const row of tokens) {
300
+ if (!row || typeof row !== "object") continue;
301
+ const rec = row;
302
+ const symbol = typeof rec.symbol === "string" ? rec.symbol.trim() : "";
303
+ const addressRaw = typeof rec.contract_address === "string" ? rec.contract_address.trim() : "";
304
+ if (!looksLikeCoinbaseStockSymbol(symbol) || !isCoinbaseB20AssetToken(addressRaw)) continue;
305
+ const address = viem.getAddress(addressRaw);
306
+ const key = address.toLowerCase();
307
+ if (seen.has(key)) continue;
308
+ seen.add(key);
309
+ const name = typeof rec.name === "string" && rec.name.trim() ? rec.name.trim() : symbol;
310
+ const iconUrl = typeof rec.icon_url === "string" && rec.icon_url.trim() ? rec.icon_url.trim() : void 0;
311
+ const decimals = typeof rec.decimals === "number" && Number.isInteger(rec.decimals) && rec.decimals >= 0 && rec.decimals <= 18 ? rec.decimals : COINBASE_B20_STOCK_DECIMALS;
312
+ out.push({ address, symbol, name, decimals, iconUrl });
313
+ if (out.length >= CATALOG_MAX) break;
314
+ }
315
+ return out;
316
+ }
317
+ async function fetchCoinbaseB20StockCatalog() {
318
+ const merged = [];
319
+ const seen = /* @__PURE__ */ new Set();
320
+ let pageToken = "";
321
+ for (let page = 0; page < 4; page++) {
322
+ const url = new URL(COINBASE_TOKENIZED_STOCKS_API_URL);
323
+ url.searchParams.set("page_size", "500");
324
+ if (pageToken) url.searchParams.set("page_token", pageToken);
325
+ const res = await fetch(url, { cache: "no-store", signal: AbortSignal.timeout(8e3) });
326
+ if (!res.ok) break;
327
+ const json = await res.json();
328
+ for (const row of parseCoinbaseTokenizedStocksPayload(json)) {
329
+ const key = row.address.toLowerCase();
330
+ if (seen.has(key)) continue;
331
+ seen.add(key);
332
+ merged.push(row);
333
+ if (merged.length >= CATALOG_MAX) break;
334
+ }
335
+ pageToken = typeof json.next_page_token === "string" ? json.next_page_token.trim() : "";
336
+ if (!pageToken || merged.length >= CATALOG_MAX) break;
337
+ }
338
+ if (merged.length > 0) indexCatalog(merged);
339
+ return catalogRows ?? [];
340
+ }
341
+ async function ensureCoinbaseB20StockCatalog() {
342
+ if (catalogRows && catalogRows.length > 0 && Date.now() - catalogAt < CATALOG_TTL_MS) return catalogRows;
343
+ if (!catalogInflight) {
344
+ catalogInflight = fetchCoinbaseB20StockCatalog().finally(() => {
345
+ catalogInflight = null;
346
+ });
347
+ }
348
+ try {
349
+ return await catalogInflight;
350
+ } catch {
351
+ return catalogRows ?? [];
352
+ }
353
+ }
354
+ function lookupCoinbaseB20StockToken(token) {
355
+ const key = (token ?? "").trim();
356
+ if (!key) return null;
357
+ const fromCatalog = catalogBySymbol.get(key.toLowerCase());
358
+ if (fromCatalog) return fromCatalog;
359
+ try {
360
+ return catalogByAddress.get(viem.getAddress(key).toLowerCase()) ?? null;
361
+ } catch {
362
+ return null;
363
+ }
364
+ }
365
+ async function canonicalizeEvmTokenInput(token) {
366
+ const raw = (token ?? "").trim();
367
+ if (!raw || viem.isAddress(raw)) return raw;
368
+ if (!looksLikeCoinbaseStockSymbol(raw)) return raw;
369
+ await ensureCoinbaseB20StockCatalog().catch(() => []);
370
+ const hit = lookupCoinbaseB20StockToken(raw);
371
+ if (!hit) {
372
+ throw new Error(
373
+ `Unknown Coinbase stock ticker "${raw}". It is not in the live tokenized-stocks catalog.`
374
+ );
375
+ }
376
+ return hit.address;
377
+ }
265
378
  function defiEvmTransport(rpcUrl, opts) {
266
379
  const url = rpcUrl.trim();
267
380
  return viem.http(url, opts);
@@ -714,6 +827,11 @@ function messageFromUniswapHttpResponseBody(text, status, statusText = "") {
714
827
  return short;
715
828
  }
716
829
  async function uniswapTradeQuote(args) {
830
+ args = {
831
+ ...args,
832
+ tokenIn: await canonicalizeEvmTokenInput(args.tokenIn),
833
+ tokenOut: await canonicalizeEvmTokenInput(args.tokenOut)
834
+ };
717
835
  const apiKey = (args.uniswapApiKey || "").trim();
718
836
  if (!apiKey) {
719
837
  throw new Error("uniswapApiKey (x-api-key) is required");
@@ -1619,7 +1737,7 @@ async function buildEvmMultisignBodyUniswapV4NativeInOnly(args, quoteInputWei) {
1619
1737
  });
1620
1738
  }
1621
1739
  async function buildEvmMultisignBodyUniswapV4SkipPermit2Batch(args) {
1622
- const tokenIn = viem.getAddress(args.tokenIn);
1740
+ const tokenIn = viem.getAddress(await canonicalizeEvmTokenInput(args.tokenIn));
1623
1741
  const parsedInOut = parseUniswapQuoteClassicInOut(args.fullQuoteSnapshot);
1624
1742
  const quoteInputWei = parsedInOut?.inputWei;
1625
1743
  if (quoteInputWei == null || quoteInputWei <= 0n) {
@@ -2214,36 +2332,47 @@ function extractUniswapLpTokenAmounts(response) {
2214
2332
  return { token0: read("token0"), token1: read("token1") };
2215
2333
  }
2216
2334
  async function uniswapLpCreatePosition(args) {
2335
+ const independentAddress = await canonicalizeEvmTokenInput(args.independentToken.tokenAddress);
2336
+ const existingPool = args.existingPool ? {
2337
+ ...args.existingPool,
2338
+ token0Address: await canonicalizeEvmTokenInput(args.existingPool.token0Address),
2339
+ token1Address: await canonicalizeEvmTokenInput(args.existingPool.token1Address)
2340
+ } : void 0;
2341
+ const newPool = args.newPool ? {
2342
+ ...args.newPool,
2343
+ token0Address: await canonicalizeEvmTokenInput(args.newPool.token0Address),
2344
+ token1Address: await canonicalizeEvmTokenInput(args.newPool.token1Address)
2345
+ } : void 0;
2217
2346
  const body = {
2218
2347
  protocol: "V4",
2219
2348
  walletAddress: trimAddr2(args.walletAddress),
2220
2349
  chainId: args.chainId,
2221
2350
  independentToken: {
2222
- tokenAddress: trimAddr2(args.independentToken.tokenAddress),
2351
+ tokenAddress: trimAddr2(independentAddress),
2223
2352
  amount: String(args.independentToken.amount).trim()
2224
2353
  },
2225
2354
  slippageTolerance: args.slippageTolerance ?? UNISWAP_LP_DEFAULT_SLIPPAGE_PERCENT,
2226
2355
  deadline: args.deadline ?? lpDeadlineUnix(),
2227
2356
  simulateTransaction: args.simulateTransaction ?? false
2228
2357
  };
2229
- if (args.existingPool) {
2358
+ if (existingPool) {
2230
2359
  body.existingPool = {
2231
- token0Address: trimAddr2(args.existingPool.token0Address),
2232
- token1Address: trimAddr2(args.existingPool.token1Address),
2233
- poolReference: trimAddr2(args.existingPool.poolReference)
2360
+ token0Address: trimAddr2(existingPool.token0Address),
2361
+ token1Address: trimAddr2(existingPool.token1Address),
2362
+ poolReference: trimAddr2(existingPool.poolReference)
2234
2363
  };
2235
2364
  }
2236
- if (args.newPool) {
2365
+ if (newPool) {
2237
2366
  body.newPool = {
2238
- token0Address: trimAddr2(args.newPool.token0Address),
2239
- token1Address: trimAddr2(args.newPool.token1Address),
2240
- fee: args.newPool.fee,
2241
- tickSpacing: args.newPool.tickSpacing,
2242
- initialPrice: String(args.newPool.initialPrice).trim(),
2243
- ...args.newPool.hooks ? { hooks: trimAddr2(args.newPool.hooks) } : {}
2367
+ token0Address: trimAddr2(newPool.token0Address),
2368
+ token1Address: trimAddr2(newPool.token1Address),
2369
+ fee: newPool.fee,
2370
+ tickSpacing: newPool.tickSpacing,
2371
+ initialPrice: String(newPool.initialPrice).trim(),
2372
+ ...newPool.hooks ? { hooks: trimAddr2(newPool.hooks) } : {}
2244
2373
  };
2245
2374
  }
2246
- if (!args.existingPool && !args.newPool) {
2375
+ if (!existingPool && !newPool) {
2247
2376
  throw new Error("Provide existingPool or newPool for LP create.");
2248
2377
  }
2249
2378
  if (args.priceBounds) {
@@ -2278,11 +2407,11 @@ async function uniswapLpIncreasePosition(args) {
2278
2407
  protocol: "V4",
2279
2408
  walletAddress: trimAddr2(args.walletAddress),
2280
2409
  chainId: args.chainId,
2281
- token0Address: trimAddr2(args.token0Address),
2282
- token1Address: trimAddr2(args.token1Address),
2410
+ token0Address: trimAddr2(await canonicalizeEvmTokenInput(args.token0Address)),
2411
+ token1Address: trimAddr2(await canonicalizeEvmTokenInput(args.token1Address)),
2283
2412
  nftTokenId: String(args.nftTokenId),
2284
2413
  independentToken: {
2285
- tokenAddress: trimAddr2(args.independentToken.tokenAddress),
2414
+ tokenAddress: trimAddr2(await canonicalizeEvmTokenInput(args.independentToken.tokenAddress)),
2286
2415
  amount: String(args.independentToken.amount).trim()
2287
2416
  },
2288
2417
  slippageTolerance: args.slippageTolerance ?? UNISWAP_LP_DEFAULT_SLIPPAGE_PERCENT,
@@ -4194,6 +4323,19 @@ async function fetchFromSwapsTier(args) {
4194
4323
  };
4195
4324
  }
4196
4325
  async function uniswapV4FetchOhlcv(args) {
4326
+ if (args.existingPool) {
4327
+ args = {
4328
+ ...args,
4329
+ existingPool: {
4330
+ ...args.existingPool,
4331
+ token0Address: await canonicalizeEvmTokenInput(args.existingPool.token0Address),
4332
+ token1Address: await canonicalizeEvmTokenInput(args.existingPool.token1Address)
4333
+ }
4334
+ };
4335
+ }
4336
+ if (args.currencyAddress?.trim()) {
4337
+ args = { ...args, currencyAddress: await canonicalizeEvmTokenInput(args.currencyAddress) };
4338
+ }
4197
4339
  const chainId = parseUniswapChainId(args.chainId);
4198
4340
  const interval = assertUniswapV4OhlcvInterval(args.interval ?? "1h");
4199
4341
  const { startTimeMs, endTimeMs } = windowFromArgs(args);
@@ -4460,6 +4602,11 @@ async function uniswapLimitOrderQuote(args) {
4460
4602
  args.nodeReadAuth ?? { bearerOnGet: true, jwt: null }
4461
4603
  );
4462
4604
  }
4605
+ args = {
4606
+ ...args,
4607
+ tokenIn: await canonicalizeEvmTokenInput(args.tokenIn),
4608
+ tokenOut: await canonicalizeEvmTokenInput(args.tokenOut)
4609
+ };
4463
4610
  const chainIdForGuard = parseUniswapChainId(resolveInputChainId(args));
4464
4611
  assertUniswapLimitOrderChain(chainIdForGuard);
4465
4612
  const base = args.baseUrl && args.baseUrl.trim() ? args.baseUrl.trim().replace(/\/$/, "") : "https://trade-api.gateway.uniswap.org/v1";