@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.
- package/dist/agent/catalog.cjs +692 -310
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +279 -99
- package/dist/agent/catalog.js +687 -312
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/aave-v4/SKILL.md +26 -3
- package/dist/agent/skills/aerodrome/SKILL.md +3 -1
- package/dist/agent/skills/circle-cctp/SKILL.md +5 -4
- package/dist/agent/skills/continuum-dao-marketplace/SKILL.md +4 -4
- package/dist/agent/skills/curve-dao/SKILL.md +2 -2
- package/dist/agent/skills/uniswap-v4/SKILL.md +2 -2
- package/dist/index.cjs +165 -19
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +166 -20
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs +198 -15
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/aave-v4/index.d.ts +62 -7
- package/dist/protocols/evm/aave-v4/index.js +189 -16
- package/dist/protocols/evm/aave-v4/index.js.map +1 -1
- package/dist/protocols/evm/aerodrome/index.cjs +152 -63
- package/dist/protocols/evm/aerodrome/index.cjs.map +1 -1
- package/dist/protocols/evm/aerodrome/index.d.ts +30 -58
- package/dist/protocols/evm/aerodrome/index.js +151 -64
- package/dist/protocols/evm/aerodrome/index.js.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.cjs +77 -19
- package/dist/protocols/evm/circle-cctp/index.cjs.map +1 -1
- package/dist/protocols/evm/circle-cctp/index.d.ts +53 -3
- package/dist/protocols/evm/circle-cctp/index.js +76 -20
- package/dist/protocols/evm/circle-cctp/index.js.map +1 -1
- package/dist/protocols/evm/compound-v3/index.cjs +115 -2
- package/dist/protocols/evm/compound-v3/index.cjs.map +1 -1
- package/dist/protocols/evm/compound-v3/index.js +116 -3
- package/dist/protocols/evm/compound-v3/index.js.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.cjs +288 -32
- package/dist/protocols/evm/continuum-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/continuum-dao/index.d.ts +14 -1
- package/dist/protocols/evm/continuum-dao/index.js +287 -33
- package/dist/protocols/evm/continuum-dao/index.js.map +1 -1
- package/dist/protocols/evm/curve-dao/index.cjs +120 -5
- package/dist/protocols/evm/curve-dao/index.cjs.map +1 -1
- package/dist/protocols/evm/curve-dao/index.js +120 -5
- package/dist/protocols/evm/curve-dao/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs +121 -6
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.js +121 -6
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/morpho/index.cjs +129 -57
- package/dist/protocols/evm/morpho/index.cjs.map +1 -1
- package/dist/protocols/evm/morpho/index.d.ts +2 -1
- package/dist/protocols/evm/morpho/index.js +129 -58
- package/dist/protocols/evm/morpho/index.js.map +1 -1
- package/dist/protocols/evm/pendle/index.cjs +129 -10
- package/dist/protocols/evm/pendle/index.cjs.map +1 -1
- package/dist/protocols/evm/pendle/index.js +129 -10
- package/dist/protocols/evm/pendle/index.js.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.cjs +164 -17
- package/dist/protocols/evm/uniswap-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/uniswap-v4/index.js +165 -18
- package/dist/protocols/evm/uniswap-v4/index.js.map +1 -1
- 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(
|
|
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 (
|
|
2358
|
+
if (existingPool) {
|
|
2230
2359
|
body.existingPool = {
|
|
2231
|
-
token0Address: trimAddr2(
|
|
2232
|
-
token1Address: trimAddr2(
|
|
2233
|
-
poolReference: trimAddr2(
|
|
2360
|
+
token0Address: trimAddr2(existingPool.token0Address),
|
|
2361
|
+
token1Address: trimAddr2(existingPool.token1Address),
|
|
2362
|
+
poolReference: trimAddr2(existingPool.poolReference)
|
|
2234
2363
|
};
|
|
2235
2364
|
}
|
|
2236
|
-
if (
|
|
2365
|
+
if (newPool) {
|
|
2237
2366
|
body.newPool = {
|
|
2238
|
-
token0Address: trimAddr2(
|
|
2239
|
-
token1Address: trimAddr2(
|
|
2240
|
-
fee:
|
|
2241
|
-
tickSpacing:
|
|
2242
|
-
initialPrice: String(
|
|
2243
|
-
...
|
|
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 (!
|
|
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";
|