@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.
- package/dist/agent/catalog.cjs +304 -134
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +162 -42
- package/dist/agent/catalog.js +304 -136
- 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/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/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/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
package/dist/agent/catalog.cjs
CHANGED
|
@@ -48,6 +48,111 @@ var init_chainIdParse = __esm({
|
|
|
48
48
|
"src/chains/evm/chainIdParse.ts"() {
|
|
49
49
|
}
|
|
50
50
|
});
|
|
51
|
+
function isCoinbaseB20AssetToken(address) {
|
|
52
|
+
try {
|
|
53
|
+
return viem.getAddress(address).toLowerCase().startsWith(COINBASE_B20_ASSET_PREFIX);
|
|
54
|
+
} catch {
|
|
55
|
+
return false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
function looksLikeCoinbaseStockSymbol(symbol) {
|
|
59
|
+
return /^[A-Za-z][A-Za-z0-9]{0,8}(?:\.[A-Za-z][A-Za-z0-9]{0,4})?c$/.test((symbol ?? "").trim());
|
|
60
|
+
}
|
|
61
|
+
function indexCatalog(rows) {
|
|
62
|
+
catalogRows = rows;
|
|
63
|
+
catalogAt = Date.now();
|
|
64
|
+
catalogBySymbol.clear();
|
|
65
|
+
catalogByAddress.clear();
|
|
66
|
+
for (const row of rows) {
|
|
67
|
+
catalogBySymbol.set(row.symbol.toLowerCase(), row);
|
|
68
|
+
catalogByAddress.set(row.address.toLowerCase(), row);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
function parseCoinbaseTokenizedStocksPayload(payload) {
|
|
72
|
+
const tokens = Array.isArray(payload) ? payload : payload && typeof payload === "object" && Array.isArray(payload.tokens) ? payload.tokens : [];
|
|
73
|
+
const out = [];
|
|
74
|
+
const seen = /* @__PURE__ */ new Set();
|
|
75
|
+
for (const row of tokens) {
|
|
76
|
+
if (!row || typeof row !== "object") continue;
|
|
77
|
+
const rec = row;
|
|
78
|
+
const symbol = typeof rec.symbol === "string" ? rec.symbol.trim() : "";
|
|
79
|
+
const addressRaw = typeof rec.contract_address === "string" ? rec.contract_address.trim() : "";
|
|
80
|
+
if (!looksLikeCoinbaseStockSymbol(symbol) || !isCoinbaseB20AssetToken(addressRaw)) continue;
|
|
81
|
+
const address = viem.getAddress(addressRaw);
|
|
82
|
+
const key = address.toLowerCase();
|
|
83
|
+
if (seen.has(key)) continue;
|
|
84
|
+
seen.add(key);
|
|
85
|
+
const name = typeof rec.name === "string" && rec.name.trim() ? rec.name.trim() : symbol;
|
|
86
|
+
const iconUrl = typeof rec.icon_url === "string" && rec.icon_url.trim() ? rec.icon_url.trim() : void 0;
|
|
87
|
+
const decimals = typeof rec.decimals === "number" && Number.isInteger(rec.decimals) && rec.decimals >= 0 && rec.decimals <= 18 ? rec.decimals : COINBASE_B20_STOCK_DECIMALS;
|
|
88
|
+
out.push({ address, symbol, name, decimals, iconUrl });
|
|
89
|
+
if (out.length >= CATALOG_MAX) break;
|
|
90
|
+
}
|
|
91
|
+
return out;
|
|
92
|
+
}
|
|
93
|
+
async function fetchCoinbaseB20StockCatalog() {
|
|
94
|
+
const merged = [];
|
|
95
|
+
const seen = /* @__PURE__ */ new Set();
|
|
96
|
+
let pageToken = "";
|
|
97
|
+
for (let page = 0; page < 4; page++) {
|
|
98
|
+
const url = new URL(COINBASE_TOKENIZED_STOCKS_API_URL);
|
|
99
|
+
url.searchParams.set("page_size", "500");
|
|
100
|
+
if (pageToken) url.searchParams.set("page_token", pageToken);
|
|
101
|
+
const res = await fetch(url, { cache: "no-store", signal: AbortSignal.timeout(8e3) });
|
|
102
|
+
if (!res.ok) break;
|
|
103
|
+
const json = await res.json();
|
|
104
|
+
for (const row of parseCoinbaseTokenizedStocksPayload(json)) {
|
|
105
|
+
const key = row.address.toLowerCase();
|
|
106
|
+
if (seen.has(key)) continue;
|
|
107
|
+
seen.add(key);
|
|
108
|
+
merged.push(row);
|
|
109
|
+
if (merged.length >= CATALOG_MAX) break;
|
|
110
|
+
}
|
|
111
|
+
pageToken = typeof json.next_page_token === "string" ? json.next_page_token.trim() : "";
|
|
112
|
+
if (!pageToken || merged.length >= CATALOG_MAX) break;
|
|
113
|
+
}
|
|
114
|
+
if (merged.length > 0) indexCatalog(merged);
|
|
115
|
+
return catalogRows ?? [];
|
|
116
|
+
}
|
|
117
|
+
async function ensureCoinbaseB20StockCatalog() {
|
|
118
|
+
if (catalogRows && catalogRows.length > 0 && Date.now() - catalogAt < CATALOG_TTL_MS) return catalogRows;
|
|
119
|
+
if (!catalogInflight) {
|
|
120
|
+
catalogInflight = fetchCoinbaseB20StockCatalog().finally(() => {
|
|
121
|
+
catalogInflight = null;
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
return await catalogInflight;
|
|
126
|
+
} catch {
|
|
127
|
+
return catalogRows ?? [];
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
function lookupCoinbaseB20StockToken(token) {
|
|
131
|
+
const key = (token ?? "").trim();
|
|
132
|
+
if (!key) return null;
|
|
133
|
+
const fromCatalog = catalogBySymbol.get(key.toLowerCase());
|
|
134
|
+
if (fromCatalog) return fromCatalog;
|
|
135
|
+
try {
|
|
136
|
+
return catalogByAddress.get(viem.getAddress(key).toLowerCase()) ?? null;
|
|
137
|
+
} catch {
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
var COINBASE_B20_STOCK_DECIMALS, COINBASE_B20_ASSET_PREFIX, COINBASE_TOKENIZED_STOCKS_API_URL, CATALOG_TTL_MS, CATALOG_MAX, catalogRows, catalogAt, catalogInflight, catalogBySymbol, catalogByAddress;
|
|
142
|
+
var init_coinbaseB20 = __esm({
|
|
143
|
+
"src/protocols/evm/shared/coinbaseB20.ts"() {
|
|
144
|
+
COINBASE_B20_STOCK_DECIMALS = 8;
|
|
145
|
+
COINBASE_B20_ASSET_PREFIX = "0xb200000000000000000000";
|
|
146
|
+
COINBASE_TOKENIZED_STOCKS_API_URL = "https://api.coinbase.com/v1/tokenized-stocks";
|
|
147
|
+
CATALOG_TTL_MS = 15 * 60 * 1e3;
|
|
148
|
+
CATALOG_MAX = 500;
|
|
149
|
+
catalogRows = null;
|
|
150
|
+
catalogAt = 0;
|
|
151
|
+
catalogInflight = null;
|
|
152
|
+
catalogBySymbol = /* @__PURE__ */ new Map();
|
|
153
|
+
catalogByAddress = /* @__PURE__ */ new Map();
|
|
154
|
+
}
|
|
155
|
+
});
|
|
51
156
|
function defiEvmTransport(rpcUrl, opts) {
|
|
52
157
|
const url = rpcUrl.trim();
|
|
53
158
|
return viem.http(url, opts);
|
|
@@ -520,27 +625,6 @@ var init_midnightApi = __esm({
|
|
|
520
625
|
init_midnightConstants();
|
|
521
626
|
}
|
|
522
627
|
});
|
|
523
|
-
var COINBASE_B20_STOCK_TOKENS, COINBASE_B20_STOCK_DECIMALS;
|
|
524
|
-
var init_coinbaseB20 = __esm({
|
|
525
|
-
"src/protocols/evm/shared/coinbaseB20.ts"() {
|
|
526
|
-
COINBASE_B20_STOCK_TOKENS = [
|
|
527
|
-
{ symbol: "AAPLc", name: "Apple Inc.", address: "0xb200000000000000000000C2e324d24d7eEcd1fb" },
|
|
528
|
-
{ symbol: "NVDAc", name: "NVIDIA Corporation", address: "0xb20000000000000000000078ee7ce2fE4908108C" },
|
|
529
|
-
{ symbol: "METAc", name: "Meta Platforms Inc.", address: "0xb2000000000000000000008bC8786B856E61707C" },
|
|
530
|
-
{ symbol: "GOOGLc", name: "Alphabet Inc.", address: "0xb2000000000000000000002D0BA3164cc74f58B7" },
|
|
531
|
-
{ symbol: "AMZNc", name: "Amazon.com Inc.", address: "0xb200000000000000000000d9192b6B456483C2E8" },
|
|
532
|
-
{ symbol: "TSLAc", name: "Tesla Inc.", address: "0xb2000000000000000000001e800a7f5189430cD0" },
|
|
533
|
-
{ symbol: "MSFTc", name: "Microsoft Corporation", address: "0xB200000000000000000000Ab99cFa739E253872B" },
|
|
534
|
-
{ symbol: "COINc", name: "Coinbase Global Inc.", address: "0xb200000000000000000000c85a31389D71F3ecfb" },
|
|
535
|
-
{ symbol: "MSTRc", name: "Strategy Inc.", address: "0xb2000000000000000000004884b426556b92883d" },
|
|
536
|
-
{ symbol: "CRCLc", name: "Circle Internet Group Inc.", address: "0xB20000000000000000000019f6E7C675b73C2e4D" },
|
|
537
|
-
{ symbol: "INTCc", name: "Intel Corporation", address: "0xB2000000000000000000004AFF16039bA04bdFBc" },
|
|
538
|
-
{ symbol: "SNDKc", name: "Sandisk Corporation", address: "0xb200000000000000000000397293Cb8cda9a10c5" },
|
|
539
|
-
{ symbol: "SPCXc", name: "Space Exploration Technologies Corp.", address: "0xb2000000000000000000007b9fcbd005511aCBd5" }
|
|
540
|
-
];
|
|
541
|
-
COINBASE_B20_STOCK_DECIMALS = 8;
|
|
542
|
-
}
|
|
543
|
-
});
|
|
544
628
|
function isAerodromeChainSupported(chainId) {
|
|
545
629
|
const n = typeof chainId === "number" ? chainId : Number.parseInt(String(chainId), 10);
|
|
546
630
|
return n === AERODROME_CHAIN_ID;
|
|
@@ -1309,7 +1393,108 @@ function parseMultisignBuilderOutput(data) {
|
|
|
1309
1393
|
return multisignOutputSchema.parse(data);
|
|
1310
1394
|
}
|
|
1311
1395
|
|
|
1396
|
+
// src/protocols/evm/aave-v4/api.ts
|
|
1397
|
+
init_defiProxy();
|
|
1398
|
+
init_coinbaseB20();
|
|
1399
|
+
var AAVE_V4_GRAPHQL_URL = "https://api.v4.aave.com/graphql";
|
|
1400
|
+
async function aaveV4Gql(query, variables) {
|
|
1401
|
+
const body = { query, variables: variables ?? {} };
|
|
1402
|
+
const j = await postJsonViaOptionalProxy({
|
|
1403
|
+
directUrl: AAVE_V4_GRAPHQL_URL,
|
|
1404
|
+
body,
|
|
1405
|
+
proxyUrl: getAaveGraphqlProxyUrl(),
|
|
1406
|
+
proxyEnvelope: body
|
|
1407
|
+
});
|
|
1408
|
+
if (j.errors?.length) {
|
|
1409
|
+
const msg = j.errors.map((e) => e.message ?? "Unknown").join("; ");
|
|
1410
|
+
throw new Error(msg);
|
|
1411
|
+
}
|
|
1412
|
+
if (j.data == null) {
|
|
1413
|
+
throw new Error("Aave V4 API: empty response");
|
|
1414
|
+
}
|
|
1415
|
+
return j.data;
|
|
1416
|
+
}
|
|
1417
|
+
async function fetchAaveV4Chains() {
|
|
1418
|
+
const d = await aaveV4Gql(`
|
|
1419
|
+
query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }
|
|
1420
|
+
`, { c: { query: { filter: "ALL" } } });
|
|
1421
|
+
return d.chains ?? [];
|
|
1422
|
+
}
|
|
1423
|
+
async function loadAaveV4SupportedChainIdsFromV4Api() {
|
|
1424
|
+
const rows = await fetchAaveV4Chains();
|
|
1425
|
+
const s = /* @__PURE__ */ new Set();
|
|
1426
|
+
for (const c of rows) s.add(c.chainId);
|
|
1427
|
+
return s;
|
|
1428
|
+
}
|
|
1429
|
+
var RESERVES_ADDRESS_FRAGMENT = `
|
|
1430
|
+
asset { underlying { address } }
|
|
1431
|
+
`;
|
|
1432
|
+
async function fetchAaveV4NativeWrappedToken(chainId) {
|
|
1433
|
+
const all = await fetchAaveV4Chains();
|
|
1434
|
+
const c = all.find((x) => x.chainId === chainId);
|
|
1435
|
+
const t = (c?.nativeWrappedToken ?? "").trim();
|
|
1436
|
+
if (t && viem.isAddress(t)) return viem.getAddress(t);
|
|
1437
|
+
return null;
|
|
1438
|
+
}
|
|
1439
|
+
async function fetchAaveV4SupportedUnderlyingAddressSet(chainId) {
|
|
1440
|
+
const d = await aaveV4Gql(
|
|
1441
|
+
`
|
|
1442
|
+
query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }
|
|
1443
|
+
`,
|
|
1444
|
+
{
|
|
1445
|
+
r: {
|
|
1446
|
+
query: { chainIds: [chainId] },
|
|
1447
|
+
filter: "ALL",
|
|
1448
|
+
orderBy: { supplyApy: "DESC" }
|
|
1449
|
+
}
|
|
1450
|
+
}
|
|
1451
|
+
);
|
|
1452
|
+
const s = /* @__PURE__ */ new Set();
|
|
1453
|
+
for (const r of d.reserves ?? []) {
|
|
1454
|
+
const a = (r.asset?.underlying?.address ?? "").trim();
|
|
1455
|
+
if (a && viem.isAddress(a)) s.add(a.toLowerCase());
|
|
1456
|
+
}
|
|
1457
|
+
return s;
|
|
1458
|
+
}
|
|
1459
|
+
var aaveV4ChainTokenCache = /* @__PURE__ */ new Map();
|
|
1460
|
+
function ensureAaveV4ChainTokenCache(chainId) {
|
|
1461
|
+
const hit = aaveV4ChainTokenCache.get(chainId);
|
|
1462
|
+
if (hit) return hit;
|
|
1463
|
+
const p = (async () => {
|
|
1464
|
+
const [nativeWrapped, supportedUnderlying] = await Promise.all([
|
|
1465
|
+
fetchAaveV4NativeWrappedToken(chainId),
|
|
1466
|
+
fetchAaveV4SupportedUnderlyingAddressSet(chainId)
|
|
1467
|
+
]);
|
|
1468
|
+
return { supportedUnderlying, nativeWrapped };
|
|
1469
|
+
})();
|
|
1470
|
+
aaveV4ChainTokenCache.set(chainId, p);
|
|
1471
|
+
return p;
|
|
1472
|
+
}
|
|
1473
|
+
function parseAaveV4UiMarketId(raw) {
|
|
1474
|
+
const t = (raw ?? "").trim().toLowerCase().replace(/\s+/g, " ");
|
|
1475
|
+
if (!t) return void 0;
|
|
1476
|
+
if (t === "core") return "core";
|
|
1477
|
+
if (t === "bluechip" || t === "prime" || t === "institutional") return "bluechip";
|
|
1478
|
+
if (t === "main" || t === "plus" || t === "default") return "main";
|
|
1479
|
+
if (t === "bstocks" || t === "bstock" || t === "b stocks" || t === "stocks" || t === "stock" || t === "equities" || t === "equity" || t === "coinbase stocks" || t === "tokenized stocks" || t === "tokenised stocks") {
|
|
1480
|
+
return "bstocks";
|
|
1481
|
+
}
|
|
1482
|
+
return void 0;
|
|
1483
|
+
}
|
|
1484
|
+
function resolveAaveV4UnderlyingAddress(token) {
|
|
1485
|
+
const raw = (token ?? "").trim();
|
|
1486
|
+
if (!raw) return null;
|
|
1487
|
+
if (viem.isAddress(raw)) return viem.getAddress(raw);
|
|
1488
|
+
return lookupCoinbaseB20StockToken(raw)?.address ?? null;
|
|
1489
|
+
}
|
|
1490
|
+
|
|
1312
1491
|
// src/agent/schemas/chainPreprocess.ts
|
|
1492
|
+
function rewriteAaveV4AssetField(o, key) {
|
|
1493
|
+
const raw = String(o[key] ?? "").trim();
|
|
1494
|
+
if (!raw || viem.isAddress(raw)) return;
|
|
1495
|
+
const resolved = resolveAaveV4UnderlyingAddress(raw);
|
|
1496
|
+
if (resolved) o[key] = resolved;
|
|
1497
|
+
}
|
|
1313
1498
|
function preprocessObject(raw) {
|
|
1314
1499
|
if (!raw || typeof raw !== "object" || Array.isArray(raw)) return null;
|
|
1315
1500
|
return { ...raw };
|
|
@@ -1651,6 +1836,12 @@ function preprocessAaveMultisignInput(action) {
|
|
|
1651
1836
|
return (raw) => {
|
|
1652
1837
|
const o = preprocessObject(raw);
|
|
1653
1838
|
if (!o) return raw;
|
|
1839
|
+
rewriteAaveV4AssetField(o, "underlying");
|
|
1840
|
+
rewriteAaveV4AssetField(o, "collateralUnderlying");
|
|
1841
|
+
if (typeof o.marketId === "string") {
|
|
1842
|
+
const id = parseAaveV4UiMarketId(o.marketId);
|
|
1843
|
+
if (id) o.marketId = id;
|
|
1844
|
+
}
|
|
1654
1845
|
derivePurposeIfMissing(o, (x) => {
|
|
1655
1846
|
const amt = String(x.amountHuman ?? "").trim();
|
|
1656
1847
|
const asset = String(x.underlying ?? "").trim();
|
|
@@ -1667,8 +1858,8 @@ var uniswapQuoteTradeTypeSchema = zod.z.enum(["EXACT_INPUT", "EXACT_OUTPUT"]);
|
|
|
1667
1858
|
var mcpUniswapV4QuoteInputSchema = zod.z.object({
|
|
1668
1859
|
type: uniswapQuoteTradeTypeSchema.describe("EXACT_INPUT or EXACT_OUTPUT"),
|
|
1669
1860
|
amount: zod.z.string().min(1).describe("Amount in token-in base units (wei string for ERC-20)"),
|
|
1670
|
-
tokenIn: zod.z.string().min(1).describe("Input token; 0x0 for native ETH"),
|
|
1671
|
-
tokenOut: zod.z.string().min(1).describe("Output token address"),
|
|
1861
|
+
tokenIn: zod.z.string().min(1).describe("Input token address or Coinbase stock ticker (AAPLc); 0x0 for native ETH"),
|
|
1862
|
+
tokenOut: zod.z.string().min(1).describe("Output token address or Coinbase stock ticker (AAPLc)"),
|
|
1672
1863
|
chainId: agentEvmChainIdSchema.describe("tokenInChainId / same-chain default"),
|
|
1673
1864
|
uniswapApiKey: zod.z.string().min(1).describe("Uniswap Trade API x-api-key"),
|
|
1674
1865
|
swapper: evmAddressSchema.optional().describe("MPC executor; omit if keyGen + managementNodeUrl provided"),
|
|
@@ -1704,7 +1895,9 @@ var mcpUniswapV4BuildSwapMultisignInputSchema = withMultisignKeySourceRefine(
|
|
|
1704
1895
|
zod.z.preprocess(
|
|
1705
1896
|
preprocessUniswapBuildSwapInput,
|
|
1706
1897
|
evmMultisignCommonInputSchema.extend({
|
|
1707
|
-
tokenIn: evmAddressSchema.describe(
|
|
1898
|
+
tokenIn: evmAddressSchema.describe(
|
|
1899
|
+
"Token in address or Coinbase stock ticker (AAPLc); 0x0 for native ETH"
|
|
1900
|
+
),
|
|
1708
1901
|
swap: swapTxRequestSchema,
|
|
1709
1902
|
createSwapResponse: zod.z.object({
|
|
1710
1903
|
swap: swapTxRequestSchema,
|
|
@@ -1721,8 +1914,8 @@ var mcpUniswapV4LimitOrderQuoteInputSchema = zod.z.object({
|
|
|
1721
1914
|
type: uniswapQuoteTradeTypeSchema.describe("EXACT_INPUT or EXACT_OUTPUT"),
|
|
1722
1915
|
amount: zod.z.string().min(1).describe("Amount in token-in base units (wei string for ERC-20)"),
|
|
1723
1916
|
limitPrice: zod.z.string().min(1).describe("Limit price string from Trade API (pair exchange rate)"),
|
|
1724
|
-
tokenIn: zod.z.string().min(1).describe("Input token; 0x0 for native ETH"),
|
|
1725
|
-
tokenOut: zod.z.string().min(1).describe("Output token address"),
|
|
1917
|
+
tokenIn: zod.z.string().min(1).describe("Input token address or Coinbase stock ticker (AAPLc); 0x0 for native ETH"),
|
|
1918
|
+
tokenOut: zod.z.string().min(1).describe("Output token address or Coinbase stock ticker (AAPLc)"),
|
|
1726
1919
|
chainId: agentEvmChainIdSchema.describe("Must be 1 (Ethereum mainnet) for limit orders"),
|
|
1727
1920
|
orderDeadline: agentCoercedIntSchema(zod.z.number().int().positive()).describe("Unix seconds when unfilled order expires"),
|
|
1728
1921
|
uniswapApiKey: zod.z.string().min(1).describe("Uniswap Trade API x-api-key"),
|
|
@@ -2069,8 +2262,8 @@ var mcpUniswapV4BuildAllowlistFinalizeMultisignInputSchema = withMultisignKeySou
|
|
|
2069
2262
|
var mcpCurveDaoQuoteInputSchema = zod.z.object({
|
|
2070
2263
|
chainId: agentEvmChainIdSchema.describe("EVM chain id (rpcUrl resolved from get_chain_registry rpcGateway)"),
|
|
2071
2264
|
rpcUrl: zod.z.string().min(1).optional().describe("JSON-RPC URL; continuum-mcp-server injects from chain registry \u2014 do not pass a public RPC URL"),
|
|
2072
|
-
tokenIn: zod.z.string().min(1).describe("Input token address, or 0xeeee\u2026 / 0x0 / eth for native"),
|
|
2073
|
-
tokenOut: zod.z.string().min(1).describe("Output token address or 0xeeee\u2026 native placeholder"),
|
|
2265
|
+
tokenIn: zod.z.string().min(1).describe("Input token address, Coinbase stock ticker (AAPLc), or 0xeeee\u2026 / 0x0 / eth for native"),
|
|
2266
|
+
tokenOut: zod.z.string().min(1).describe("Output token address, Coinbase stock ticker (AAPLc), or 0xeeee\u2026 native placeholder"),
|
|
2074
2267
|
amountHuman: zod.z.string().min(1).describe("Human-readable amount of tokenIn"),
|
|
2075
2268
|
tokenInDecimals: zod.z.number().int().min(0).max(18).optional().describe("Token-in decimals; omit to read on-chain (native uses 18)")
|
|
2076
2269
|
});
|
|
@@ -2081,8 +2274,10 @@ var mcpCurveDaoBuildSwapMultisignInputSchema = withMultisignKeySourceRefine(
|
|
|
2081
2274
|
zod.z.preprocess(
|
|
2082
2275
|
preprocessCurveBuildSwapInput,
|
|
2083
2276
|
evmMultisignCommonInputSchema.extend({
|
|
2084
|
-
tokenIn: evmAddressSchema.describe(
|
|
2085
|
-
|
|
2277
|
+
tokenIn: evmAddressSchema.describe(
|
|
2278
|
+
"ERC-20 sold, or a Coinbase stock ticker (AAPLc). Native in uses the WETH path in the UI."
|
|
2279
|
+
),
|
|
2280
|
+
tokenOut: zod.z.string().min(1).describe("Output token, Coinbase stock ticker (AAPLc), or 0xeeee\u2026 native placeholder"),
|
|
2086
2281
|
amountHuman: zod.z.string().min(1).describe("Human-readable amount of tokenIn"),
|
|
2087
2282
|
slippagePercent: zod.z.number().gt(0).lt(100).describe("Slippage 0\u2013100 exclusive"),
|
|
2088
2283
|
quoteSnapshot: jsonObjectSchema.optional().describe("Optional quote row from ctm_curve_dao_quote \u2014 aliases tokenIn/tokenOut/amountHuman")
|
|
@@ -3033,7 +3228,9 @@ var mcpSkySusdsDepositInputSchema = mcpMultisignInput({
|
|
|
3033
3228
|
var mcpSkySusdsRedeemInputSchema = mcpMultisignInput({
|
|
3034
3229
|
sharesHuman: zod.z.string().min(1)
|
|
3035
3230
|
});
|
|
3036
|
-
var mcpAaveV4MarketIdSchema = zod.z.string().min(1).optional().describe(
|
|
3231
|
+
var mcpAaveV4MarketIdSchema = zod.z.string().min(1).optional().describe(
|
|
3232
|
+
"UI market segment: main (Plus), core, bluechip (Prime), or bstocks (Base Coinbase tokenized stocks). Aliases: stocks, equities. Default main."
|
|
3233
|
+
);
|
|
3037
3234
|
function mcpAaveV4MultisignInput(fields, action) {
|
|
3038
3235
|
return withMultisignKeySourceRefine(
|
|
3039
3236
|
zod.z.preprocess(preprocessAaveMultisignInput(action), evmMultisignCommonInputSchema.extend(fields))
|
|
@@ -3051,7 +3248,7 @@ var mcpAaveV4DepositInputSchema = mcpAaveV4MultisignInput(
|
|
|
3051
3248
|
{
|
|
3052
3249
|
spoke: evmAddressSchema.optional().describe("Omit \u2014 continuum-mcp-server resolves spoke from Aave v4 API."),
|
|
3053
3250
|
underlying: evmAddressSchema.describe(
|
|
3054
|
-
"Asset to supply. Native ETH: 0x0 or wrapped native with isNativeIn true."
|
|
3251
|
+
"Asset to supply. Address, or a Base bStock ticker (AAPLc). Native ETH: 0x0 or wrapped native with isNativeIn true."
|
|
3055
3252
|
),
|
|
3056
3253
|
amountHuman: zod.z.string().min(1),
|
|
3057
3254
|
marketId: mcpAaveV4MarketIdSchema,
|
|
@@ -3067,7 +3264,7 @@ var mcpAaveV4DepositInputSchema = mcpAaveV4MultisignInput(
|
|
|
3067
3264
|
var mcpAaveV4WithdrawInputSchema = mcpAaveV4MultisignInput(
|
|
3068
3265
|
{
|
|
3069
3266
|
spoke: evmAddressSchema.optional().describe("Omit \u2014 server resolves from Aave v4 API."),
|
|
3070
|
-
underlying: evmAddressSchema.describe("Supplied asset to withdraw."),
|
|
3267
|
+
underlying: evmAddressSchema.describe("Supplied asset to withdraw. Address or bStock ticker (AAPLc)."),
|
|
3071
3268
|
amountHuman: zod.z.string().min(1),
|
|
3072
3269
|
marketId: mcpAaveV4MarketIdSchema,
|
|
3073
3270
|
...mcpAaveV4HealthPreviewFields
|
|
@@ -3077,10 +3274,14 @@ var mcpAaveV4WithdrawInputSchema = mcpAaveV4MultisignInput(
|
|
|
3077
3274
|
var mcpAaveV4BorrowInputSchema = mcpAaveV4MultisignInput(
|
|
3078
3275
|
{
|
|
3079
3276
|
spoke: evmAddressSchema.optional().describe("Omit \u2014 server resolves from Aave v4 API."),
|
|
3080
|
-
underlying: evmAddressSchema.describe(
|
|
3277
|
+
underlying: evmAddressSchema.describe(
|
|
3278
|
+
"Debt asset to borrow (e.g. USDC), not collateral. On bstocks the equities are not borrowable."
|
|
3279
|
+
),
|
|
3081
3280
|
amountHuman: zod.z.string().min(1),
|
|
3082
3281
|
marketId: mcpAaveV4MarketIdSchema,
|
|
3083
|
-
collateralUnderlying: evmAddressSchema.optional().describe(
|
|
3282
|
+
collateralUnderlying: evmAddressSchema.optional().describe(
|
|
3283
|
+
"Collateral token already supplied (address or bStock ticker such as AAPLc). Helps pick the hub when debt exists on multiple hubs."
|
|
3284
|
+
),
|
|
3084
3285
|
...mcpAaveV4HealthPreviewFields
|
|
3085
3286
|
},
|
|
3086
3287
|
"borrow"
|
|
@@ -3088,7 +3289,7 @@ var mcpAaveV4BorrowInputSchema = mcpAaveV4MultisignInput(
|
|
|
3088
3289
|
var mcpAaveV4RepayInputSchema = mcpAaveV4MultisignInput(
|
|
3089
3290
|
{
|
|
3090
3291
|
spoke: evmAddressSchema.optional().describe("Omit \u2014 server resolves from Aave v4 API."),
|
|
3091
|
-
underlying: evmAddressSchema.describe("Debt token to repay."),
|
|
3292
|
+
underlying: evmAddressSchema.describe("Debt token to repay. On bstocks this is USDC."),
|
|
3092
3293
|
amountHuman: zod.z.string().min(1),
|
|
3093
3294
|
marketId: mcpAaveV4MarketIdSchema,
|
|
3094
3295
|
...mcpAaveV4HealthPreviewFields
|
|
@@ -4266,11 +4467,18 @@ var mcpMapleFetchMarketInputSchema = zod.z.object({
|
|
|
4266
4467
|
underlying: zod.z.string().trim().min(1).optional().describe("Deposit asset address or ticker (USDC, USDT, USDG).")
|
|
4267
4468
|
});
|
|
4268
4469
|
var mcpMapleFetchMarketOutputSchema = mcpMapleFetchMarketsOutputSchema;
|
|
4269
|
-
var
|
|
4470
|
+
var aaveV4UiMarketIdEnum = zod.z.enum(["main", "core", "bluechip", "bstocks"]);
|
|
4471
|
+
function preprocessAaveV4MarketId(value) {
|
|
4472
|
+
if (typeof value !== "string") return value;
|
|
4473
|
+
return parseAaveV4UiMarketId(value) ?? value;
|
|
4474
|
+
}
|
|
4475
|
+
var mcpAaveV4UiMarketIdSchema = zod.z.preprocess(preprocessAaveV4MarketId, aaveV4UiMarketIdEnum.optional()).describe(
|
|
4476
|
+
"UI market segment: main (Plus), core, bluechip (Prime), or bstocks (Base Coinbase tokenized stocks). Aliases: stocks, equities. Omit to list all hubs."
|
|
4477
|
+
);
|
|
4270
4478
|
var mcpAaveV4MarketSummarySchema = zod.z.object({
|
|
4271
4479
|
chainId: zod.z.number(),
|
|
4272
4480
|
hubName: zod.z.string(),
|
|
4273
|
-
marketId:
|
|
4481
|
+
marketId: aaveV4UiMarketIdEnum,
|
|
4274
4482
|
hubAddress: zod.z.string(),
|
|
4275
4483
|
symbol: zod.z.string(),
|
|
4276
4484
|
name: zod.z.string(),
|
|
@@ -4290,7 +4498,9 @@ var mcpAaveV4MarketSummarySchema = zod.z.object({
|
|
|
4290
4498
|
var mcpAaveV4FetchMarketsInputSchema = zod.z.object({
|
|
4291
4499
|
chainId: agentEvmChainIdSchema,
|
|
4292
4500
|
marketId: mcpAaveV4UiMarketIdSchema,
|
|
4293
|
-
underlying: zod.z.string().trim().min(1).optional().describe(
|
|
4501
|
+
underlying: zod.z.string().trim().min(1).optional().describe(
|
|
4502
|
+
'Optional filter: ERC-20 address or ticker (USDT, USDC, AAPLc). "stock" lists bStock collateral. Omit to list all reserves.'
|
|
4503
|
+
)
|
|
4294
4504
|
});
|
|
4295
4505
|
var mcpAaveV4FetchMarketsOutputSchema = zod.z.object({
|
|
4296
4506
|
chainId: zod.z.number(),
|
|
@@ -4299,14 +4509,21 @@ var mcpAaveV4FetchMarketsOutputSchema = zod.z.object({
|
|
|
4299
4509
|
});
|
|
4300
4510
|
var mcpAaveV4FetchMarketInputSchema = zod.z.object({
|
|
4301
4511
|
chainId: agentEvmChainIdSchema,
|
|
4302
|
-
underlying: zod.z.string().trim().min(1).describe(
|
|
4512
|
+
underlying: zod.z.string().trim().min(1).describe(
|
|
4513
|
+
"Reserve underlying address or ticker (USDT, AAPLc). Prefer fetch_markets or fetch_stock_markets when listing rates."
|
|
4514
|
+
),
|
|
4303
4515
|
marketId: mcpAaveV4UiMarketIdSchema
|
|
4304
4516
|
});
|
|
4305
4517
|
var mcpAaveV4FetchMarketOutputSchema = mcpAaveV4FetchMarketsOutputSchema;
|
|
4518
|
+
var mcpAaveV4FetchStockMarketsInputSchema = zod.z.object({
|
|
4519
|
+
chainId: agentEvmChainIdSchema.optional().describe("Defaults to Base 8453 (Coinbase Stocks hub)."),
|
|
4520
|
+
underlying: zod.z.string().trim().min(1).optional().describe("B20 ticker or address (AAPLc), or USDC. Omit to list the whole Coinbase Stocks hub.")
|
|
4521
|
+
});
|
|
4522
|
+
var mcpAaveV4FetchStockMarketsOutputSchema = mcpAaveV4FetchMarketsOutputSchema;
|
|
4306
4523
|
var mcpEulerV2FetchLendVaultsInputSchema = zod.z.object({
|
|
4307
4524
|
chainId: agentEvmChainIdSchema,
|
|
4308
4525
|
underlyingAddress: evmAddressSchema.describe(
|
|
4309
|
-
"Underlying asset address from
|
|
4526
|
+
"Underlying asset address, or a Coinbase stock ticker (AAPLc) from the live catalog."
|
|
4310
4527
|
),
|
|
4311
4528
|
limit: agentCoercedOptionalIntSchema(zod.z.number().int().min(1).max(100)).describe("Max vault rows (default 30).")
|
|
4312
4529
|
});
|
|
@@ -4328,7 +4545,7 @@ var mcpEulerV2FetchLendVaultsOutputSchema = zod.z.object({
|
|
|
4328
4545
|
var mcpEulerV2FetchEarnVaultsInputSchema = zod.z.object({
|
|
4329
4546
|
chainId: agentEvmChainIdSchema,
|
|
4330
4547
|
underlyingAddress: evmAddressSchema.describe(
|
|
4331
|
-
"Underlying asset address from
|
|
4548
|
+
"Underlying asset address, or a Coinbase stock ticker (AAPLc) from the live catalog."
|
|
4332
4549
|
),
|
|
4333
4550
|
limit: agentCoercedOptionalIntSchema(zod.z.number().int().min(1).max(100)).describe("Max vault rows (default 30).")
|
|
4334
4551
|
});
|
|
@@ -4423,7 +4640,7 @@ var mcpPendleFetchMerkleRewardsOutputSchema = jsonObjectSchema.describe(
|
|
|
4423
4640
|
var mcpPendleQuoteSwapInputSchema = zod.z.object({
|
|
4424
4641
|
chainId: agentEvmChainIdSchema,
|
|
4425
4642
|
rpcUrl: zod.z.string().min(1).optional(),
|
|
4426
|
-
tokenIn: zod.z.string().min(1).describe("Underlying, PT, or
|
|
4643
|
+
tokenIn: zod.z.string().min(1).describe("Underlying, PT, YT, or Coinbase stock ticker (AAPLc). 0xeeee / 0x0 = native."),
|
|
4427
4644
|
tokenOut: zod.z.string().min(1),
|
|
4428
4645
|
amountHuman: zod.z.string().min(1),
|
|
4429
4646
|
slippagePercent: zod.z.number().gt(0).lt(100),
|
|
@@ -6558,7 +6775,7 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
|
|
|
6558
6775
|
actionId: "aave-v4.deposit",
|
|
6559
6776
|
protocolId: "aave-v4",
|
|
6560
6777
|
chainCategory: "evm",
|
|
6561
|
-
description: "Build Aave v4 Spoke supply/deposit batch (wrap native, approve, supply).",
|
|
6778
|
+
description: "Build Aave v4 Spoke supply/deposit batch (wrap native, approve, supply). Base bStocks: marketId bstocks and underlying ticker (AAPLc) or address.",
|
|
6562
6779
|
prerequisites: ["keyGenId", "chainId", "underlying", "amountHuman", "get_defi_protocol_skill for hubs/spokes"],
|
|
6563
6780
|
handler: { importPath: "protocols/evm/aave-v4", exportName: "buildEvmMultisignBodyAaveV4DepositBatch" },
|
|
6564
6781
|
inputZod: mcpAaveV4DepositInputSchema
|
|
@@ -6578,7 +6795,7 @@ var MCP_PROTOCOL_TOOL_DEFINITIONS = [
|
|
|
6578
6795
|
actionId: "aave-v4.borrow",
|
|
6579
6796
|
protocolId: "aave-v4",
|
|
6580
6797
|
chainCategory: "evm",
|
|
6581
|
-
description: "Build Aave v4 Spoke borrow; underlying is debt asset
|
|
6798
|
+
description: "Build Aave v4 Spoke borrow; underlying is the debt asset (USDC on bstocks). Equities are collateral-only. collateralUnderlying may be a bStock ticker (AAPLc).",
|
|
6582
6799
|
prerequisites: [
|
|
6583
6800
|
"keyGenId",
|
|
6584
6801
|
"chainId",
|
|
@@ -10012,10 +10229,11 @@ var CORE_MCP_TOOL_DEFINITIONS = [
|
|
|
10012
10229
|
actionId: "aave-v4.fetch-markets",
|
|
10013
10230
|
protocolId: "aave-v4",
|
|
10014
10231
|
chainCategory: "evm",
|
|
10015
|
-
description: "List Aave v4 hub reserves on a chain with live supply/borrow APY, liquidity, and collateral factor. Use this (not web search) to compare lending rates or pick an underlying + marketId for build_*_multisign. Optional marketId (main/core/bluechip) or underlying filter.",
|
|
10232
|
+
description: "List Aave v4 hub reserves on a chain with live supply/borrow APY, liquidity, and collateral factor. Use this (not web search) to compare lending rates or pick an underlying + marketId for build_*_multisign. Optional marketId (main/core/bluechip/bstocks) or underlying filter. Base tokenized stocks: marketId bstocks or ctm_aave_v4_fetch_stock_markets. Tickers (AAPLc) OK.",
|
|
10016
10233
|
prerequisites: ["chainId", "get_defi_protocol_supported_chains"],
|
|
10017
10234
|
followUp: [
|
|
10018
10235
|
"ctm_aave_v4_fetch_market",
|
|
10236
|
+
"ctm_aave_v4_fetch_stock_markets",
|
|
10019
10237
|
"ctm_aave_v4_build_deposit_multisign",
|
|
10020
10238
|
"ctm_aave_v4_build_borrow_multisign"
|
|
10021
10239
|
],
|
|
@@ -10028,7 +10246,7 @@ var CORE_MCP_TOOL_DEFINITIONS = [
|
|
|
10028
10246
|
actionId: "aave-v4.fetch-market",
|
|
10029
10247
|
protocolId: "aave-v4",
|
|
10030
10248
|
chainCategory: "evm",
|
|
10031
|
-
description: "One Aave v4 reserve (or the same underlying across hubs) with supply/borrow APY and liquidity. Copy underlying + marketId for deposit/borrow/repay. Do not web-search Aave rates.",
|
|
10249
|
+
description: "One Aave v4 reserve (or the same underlying across hubs) with supply/borrow APY and liquidity. Copy underlying + marketId for deposit/borrow/repay. Tickers OK (USDT, AAPLc). Do not web-search Aave rates.",
|
|
10032
10250
|
prerequisites: ["chainId", "underlying from ctm_aave_v4_fetch_markets or get_defi_protocol_supported_tokens"],
|
|
10033
10251
|
followUp: [
|
|
10034
10252
|
"ctm_aave_v4_build_deposit_multisign",
|
|
@@ -10040,6 +10258,23 @@ var CORE_MCP_TOOL_DEFINITIONS = [
|
|
|
10040
10258
|
inputZod: mcpAaveV4FetchMarketInputSchema,
|
|
10041
10259
|
outputZod: mcpAaveV4FetchMarketOutputSchema
|
|
10042
10260
|
}),
|
|
10261
|
+
defineMcpTool({
|
|
10262
|
+
name: "ctm_aave_v4_fetch_stock_markets",
|
|
10263
|
+
actionId: "aave-v4.fetch-stock-markets",
|
|
10264
|
+
protocolId: "aave-v4",
|
|
10265
|
+
chainCategory: "evm",
|
|
10266
|
+
description: "Coinbase tokenized stocks (bStocks) on the Aave v4 Coinbase Stocks hub, Base chainId 8453 by default. Equities (AAPLc, NVDAc, \u2026) are collateral-only; USDC is the borrow asset. Tickers OK. Same rows as ctm_aave_v4_fetch_markets with marketId bstocks. Chainlink feeds are 24/5. Not for U.S. persons.",
|
|
10267
|
+
prerequisites: ["chainId 8453 or omit"],
|
|
10268
|
+
followUp: [
|
|
10269
|
+
"ctm_aave_v4_build_deposit_multisign",
|
|
10270
|
+
"ctm_aave_v4_build_borrow_multisign",
|
|
10271
|
+
"ctm_aave_v4_build_repay_multisign",
|
|
10272
|
+
"ctm_aave_v4_build_withdraw_multisign"
|
|
10273
|
+
],
|
|
10274
|
+
handler: { importPath: "protocols/evm/aave-v4", exportName: "aaveV4FetchStockMarketsSummary" },
|
|
10275
|
+
inputZod: mcpAaveV4FetchStockMarketsInputSchema,
|
|
10276
|
+
outputZod: mcpAaveV4FetchStockMarketsOutputSchema
|
|
10277
|
+
}),
|
|
10043
10278
|
defineMcpTool({
|
|
10044
10279
|
name: "ctm_aave_v4_fetch_merkl_rewards",
|
|
10045
10280
|
actionId: "aave-v4.fetch-merkl-rewards",
|
|
@@ -11033,83 +11268,6 @@ var skyProtocolModule = {
|
|
|
11033
11268
|
};
|
|
11034
11269
|
registerProtocolModule(skyProtocolModule);
|
|
11035
11270
|
|
|
11036
|
-
// src/protocols/evm/aave-v4/api.ts
|
|
11037
|
-
init_defiProxy();
|
|
11038
|
-
var AAVE_V4_GRAPHQL_URL = "https://api.v4.aave.com/graphql";
|
|
11039
|
-
async function aaveV4Gql(query, variables) {
|
|
11040
|
-
const body = { query, variables: variables ?? {} };
|
|
11041
|
-
const j = await postJsonViaOptionalProxy({
|
|
11042
|
-
directUrl: AAVE_V4_GRAPHQL_URL,
|
|
11043
|
-
body,
|
|
11044
|
-
proxyUrl: getAaveGraphqlProxyUrl(),
|
|
11045
|
-
proxyEnvelope: body
|
|
11046
|
-
});
|
|
11047
|
-
if (j.errors?.length) {
|
|
11048
|
-
const msg = j.errors.map((e) => e.message ?? "Unknown").join("; ");
|
|
11049
|
-
throw new Error(msg);
|
|
11050
|
-
}
|
|
11051
|
-
if (j.data == null) {
|
|
11052
|
-
throw new Error("Aave V4 API: empty response");
|
|
11053
|
-
}
|
|
11054
|
-
return j.data;
|
|
11055
|
-
}
|
|
11056
|
-
async function fetchAaveV4Chains() {
|
|
11057
|
-
const d = await aaveV4Gql(`
|
|
11058
|
-
query C($c: ChainsRequest!) { chains(request: $c) { chainId name nativeWrappedToken } }
|
|
11059
|
-
`, { c: { query: { filter: "ALL" } } });
|
|
11060
|
-
return d.chains ?? [];
|
|
11061
|
-
}
|
|
11062
|
-
async function loadAaveV4SupportedChainIdsFromV4Api() {
|
|
11063
|
-
const rows = await fetchAaveV4Chains();
|
|
11064
|
-
const s = /* @__PURE__ */ new Set();
|
|
11065
|
-
for (const c of rows) s.add(c.chainId);
|
|
11066
|
-
return s;
|
|
11067
|
-
}
|
|
11068
|
-
var RESERVES_ADDRESS_FRAGMENT = `
|
|
11069
|
-
asset { underlying { address } }
|
|
11070
|
-
`;
|
|
11071
|
-
async function fetchAaveV4NativeWrappedToken(chainId) {
|
|
11072
|
-
const all = await fetchAaveV4Chains();
|
|
11073
|
-
const c = all.find((x) => x.chainId === chainId);
|
|
11074
|
-
const t = (c?.nativeWrappedToken ?? "").trim();
|
|
11075
|
-
if (t && viem.isAddress(t)) return viem.getAddress(t);
|
|
11076
|
-
return null;
|
|
11077
|
-
}
|
|
11078
|
-
async function fetchAaveV4SupportedUnderlyingAddressSet(chainId) {
|
|
11079
|
-
const d = await aaveV4Gql(
|
|
11080
|
-
`
|
|
11081
|
-
query A($r: ReservesRequest!) { reserves(request: $r) { ${RESERVES_ADDRESS_FRAGMENT} } }
|
|
11082
|
-
`,
|
|
11083
|
-
{
|
|
11084
|
-
r: {
|
|
11085
|
-
query: { chainIds: [chainId] },
|
|
11086
|
-
filter: "ALL",
|
|
11087
|
-
orderBy: { supplyApy: "DESC" }
|
|
11088
|
-
}
|
|
11089
|
-
}
|
|
11090
|
-
);
|
|
11091
|
-
const s = /* @__PURE__ */ new Set();
|
|
11092
|
-
for (const r of d.reserves ?? []) {
|
|
11093
|
-
const a = (r.asset?.underlying?.address ?? "").trim();
|
|
11094
|
-
if (a && viem.isAddress(a)) s.add(a.toLowerCase());
|
|
11095
|
-
}
|
|
11096
|
-
return s;
|
|
11097
|
-
}
|
|
11098
|
-
var aaveV4ChainTokenCache = /* @__PURE__ */ new Map();
|
|
11099
|
-
function ensureAaveV4ChainTokenCache(chainId) {
|
|
11100
|
-
const hit = aaveV4ChainTokenCache.get(chainId);
|
|
11101
|
-
if (hit) return hit;
|
|
11102
|
-
const p = (async () => {
|
|
11103
|
-
const [nativeWrapped, supportedUnderlying] = await Promise.all([
|
|
11104
|
-
fetchAaveV4NativeWrappedToken(chainId),
|
|
11105
|
-
fetchAaveV4SupportedUnderlyingAddressSet(chainId)
|
|
11106
|
-
]);
|
|
11107
|
-
return { supportedUnderlying, nativeWrapped };
|
|
11108
|
-
})();
|
|
11109
|
-
aaveV4ChainTokenCache.set(chainId, p);
|
|
11110
|
-
return p;
|
|
11111
|
-
}
|
|
11112
|
-
|
|
11113
11271
|
// src/protocols/evm/aave-v4/index.ts
|
|
11114
11272
|
var AAVE_V4_PROTOCOL_ID = "aave-v4";
|
|
11115
11273
|
var aaveV4ProtocolModule = {
|
|
@@ -14209,6 +14367,7 @@ function getProtocolDiscoverySummary(protocolId) {
|
|
|
14209
14367
|
}))
|
|
14210
14368
|
};
|
|
14211
14369
|
}
|
|
14370
|
+
init_coinbaseB20();
|
|
14212
14371
|
init_support();
|
|
14213
14372
|
init_support2();
|
|
14214
14373
|
init_addresses();
|
|
@@ -14217,7 +14376,8 @@ init_constants();
|
|
|
14217
14376
|
function advisor(protocolId, tokenFilter, impl) {
|
|
14218
14377
|
return { protocolId, tokenFilter, ...impl };
|
|
14219
14378
|
}
|
|
14220
|
-
function aerodromeAdvisorPriorityTokens() {
|
|
14379
|
+
async function aerodromeAdvisorPriorityTokens() {
|
|
14380
|
+
const stocks = await ensureCoinbaseB20StockCatalog().catch(() => []);
|
|
14221
14381
|
return [
|
|
14222
14382
|
{
|
|
14223
14383
|
address: "0x0000000000000000000000000000000000000000",
|
|
@@ -14243,11 +14403,11 @@ function aerodromeAdvisorPriorityTokens() {
|
|
|
14243
14403
|
decimals: 18,
|
|
14244
14404
|
roles: ["swappable"]
|
|
14245
14405
|
},
|
|
14246
|
-
...
|
|
14406
|
+
...stocks.map((t) => ({
|
|
14247
14407
|
address: t.address,
|
|
14248
14408
|
symbol: t.symbol,
|
|
14249
14409
|
name: t.name,
|
|
14250
|
-
decimals: COINBASE_B20_STOCK_DECIMALS,
|
|
14410
|
+
decimals: t.decimals || COINBASE_B20_STOCK_DECIMALS,
|
|
14251
14411
|
roles: ["swappable", "listed", "coinbase_b20"]
|
|
14252
14412
|
}))
|
|
14253
14413
|
];
|
|
@@ -14260,10 +14420,18 @@ var PROTOCOL_SUPPORT_ADVISORS = {
|
|
|
14260
14420
|
},
|
|
14261
14421
|
async supportedTokens(chainId) {
|
|
14262
14422
|
const cache = await ensureAaveV4ChainTokenCache(chainId);
|
|
14263
|
-
|
|
14264
|
-
|
|
14265
|
-
|
|
14266
|
-
|
|
14423
|
+
await ensureCoinbaseB20StockCatalog().catch(() => []);
|
|
14424
|
+
const tokens = [...cache.supportedUnderlying].map((address) => {
|
|
14425
|
+
const known = lookupCoinbaseB20StockToken(address);
|
|
14426
|
+
if (!known) return { address, roles: ["underlying"] };
|
|
14427
|
+
return {
|
|
14428
|
+
address,
|
|
14429
|
+
symbol: known.symbol,
|
|
14430
|
+
name: "name" in known ? known.name : void 0,
|
|
14431
|
+
decimals: COINBASE_B20_STOCK_DECIMALS,
|
|
14432
|
+
roles: ["underlying", "coinbase_b20", "collateral"]
|
|
14433
|
+
};
|
|
14434
|
+
});
|
|
14267
14435
|
if (cache.nativeWrapped) {
|
|
14268
14436
|
tokens.unshift({
|
|
14269
14437
|
address: cache.nativeWrapped,
|
|
@@ -14274,7 +14442,7 @@ var PROTOCOL_SUPPORT_ADVISORS = {
|
|
|
14274
14442
|
return {
|
|
14275
14443
|
tokens,
|
|
14276
14444
|
nativeWrapped: cache.nativeWrapped ?? void 0,
|
|
14277
|
-
notes: "Native ETH deposits use wrapped native token address from Aave v4 API."
|
|
14445
|
+
notes: "Native ETH deposits use wrapped native token address from Aave v4 API. Base chainId 8453 Coinbase Stocks hub is marketId bstocks. Listed equities come from the Aave v4 API; tickers resolve from the live Coinbase catalog. Equities are collateral-only; USDC is the borrow asset."
|
|
14278
14446
|
};
|
|
14279
14447
|
},
|
|
14280
14448
|
async isTokenSupported(chainId, address) {
|
|
@@ -14560,9 +14728,9 @@ var PROTOCOL_SUPPORT_ADVISORS = {
|
|
|
14560
14728
|
return { tokens: [], notes: "Aerodrome is Base-only (chainId 8453)." };
|
|
14561
14729
|
}
|
|
14562
14730
|
return {
|
|
14563
|
-
tokens: aerodromeAdvisorPriorityTokens(),
|
|
14731
|
+
tokens: await aerodromeAdvisorPriorityTokens(),
|
|
14564
14732
|
nativeWrapped: AERODROME_WETH_BASE,
|
|
14565
|
-
notes: "
|
|
14733
|
+
notes: "ETH, WETH, USDC, AERO, plus the live Coinbase B20 catalog. For a price call ctm_aerodrome_quote with a ticker. To see pools for one token call ctm_aerodrome_discover_pools. Do not dump LpSugar."
|
|
14566
14734
|
};
|
|
14567
14735
|
}
|
|
14568
14736
|
}),
|
|
@@ -14872,6 +15040,8 @@ exports.mcpAaveV4FetchMarketInputSchema = mcpAaveV4FetchMarketInputSchema;
|
|
|
14872
15040
|
exports.mcpAaveV4FetchMarketOutputSchema = mcpAaveV4FetchMarketOutputSchema;
|
|
14873
15041
|
exports.mcpAaveV4FetchMarketsInputSchema = mcpAaveV4FetchMarketsInputSchema;
|
|
14874
15042
|
exports.mcpAaveV4FetchMarketsOutputSchema = mcpAaveV4FetchMarketsOutputSchema;
|
|
15043
|
+
exports.mcpAaveV4FetchStockMarketsInputSchema = mcpAaveV4FetchStockMarketsInputSchema;
|
|
15044
|
+
exports.mcpAaveV4FetchStockMarketsOutputSchema = mcpAaveV4FetchStockMarketsOutputSchema;
|
|
14875
15045
|
exports.mcpAaveV4MerklClaimInputSchema = mcpAaveV4MerklClaimInputSchema;
|
|
14876
15046
|
exports.mcpAaveV4RepayInputSchema = mcpAaveV4RepayInputSchema;
|
|
14877
15047
|
exports.mcpAaveV4WithdrawInputSchema = mcpAaveV4WithdrawInputSchema;
|