@continuumdao/ctm-mpc-defi 0.2.9 → 0.2.11
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 +522 -19
- package/dist/agent/catalog.cjs.map +1 -1
- package/dist/agent/catalog.d.ts +639 -14
- package/dist/agent/catalog.js +510 -20
- package/dist/agent/catalog.js.map +1 -1
- package/dist/agent/skills/hyperliquid/SKILL.md +34 -6
- package/dist/agent/skills/morpho/SKILL.md +63 -0
- package/dist/core/index.cjs +9 -0
- package/dist/core/index.cjs.map +1 -1
- package/dist/core/index.d.ts +3 -1
- package/dist/core/index.js +8 -1
- package/dist/core/index.js.map +1 -1
- package/dist/index.cjs +9 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/protocols/evm/aave-v4/index.cjs.map +1 -1
- package/dist/protocols/evm/aave-v4/index.js.map +1 -1
- package/dist/protocols/evm/euler-v2/index.cjs.map +1 -1
- package/dist/protocols/evm/euler-v2/index.js.map +1 -1
- package/dist/protocols/evm/hyperliquid/index.cjs +407 -34
- package/dist/protocols/evm/hyperliquid/index.cjs.map +1 -1
- package/dist/protocols/evm/hyperliquid/index.d.ts +168 -15
- package/dist/protocols/evm/hyperliquid/index.js +390 -35
- package/dist/protocols/evm/hyperliquid/index.js.map +1 -1
- package/dist/protocols/evm/maple/index.cjs.map +1 -1
- package/dist/protocols/evm/maple/index.js.map +1 -1
- package/dist/protocols/evm/morpho/index.cjs +1971 -0
- package/dist/protocols/evm/morpho/index.cjs.map +1 -0
- package/dist/protocols/evm/morpho/index.d.ts +522 -0
- package/dist/protocols/evm/morpho/index.js +1918 -0
- package/dist/protocols/evm/morpho/index.js.map +1 -0
- package/dist/protocols/evm/sky/index.cjs.map +1 -1
- package/dist/protocols/evm/sky/index.js.map +1 -1
- package/package.json +6 -1
|
@@ -24,6 +24,12 @@ function hyperliquidVaultStatsUrl(chainId) {
|
|
|
24
24
|
return chainId === 998 ? null : "https://stats-data.hyperliquid.xyz/Mainnet/vaults";
|
|
25
25
|
}
|
|
26
26
|
var HYPERLIQUID_HLP_VAULT_ADDRESS = "0xdfc24b077bc1425ad1dea75bcb6f8158e10df303";
|
|
27
|
+
function hyperliquidInferDexFromCoin(coin) {
|
|
28
|
+
const trimmed = coin.trim();
|
|
29
|
+
const sep = trimmed.indexOf(":");
|
|
30
|
+
if (sep <= 0) return void 0;
|
|
31
|
+
return trimmed.slice(0, sep);
|
|
32
|
+
}
|
|
27
33
|
|
|
28
34
|
// src/protocols/evm/hyperliquid/constants.ts
|
|
29
35
|
var HYPERLIQUID_CORE_WRITER_ADDRESS = "0x3333333333333333333333333333333333333333";
|
|
@@ -34,6 +40,28 @@ var HYPERLIQUID_TIF = {
|
|
|
34
40
|
gtc: 2,
|
|
35
41
|
ioc: 3
|
|
36
42
|
};
|
|
43
|
+
var HYPERLIQUID_INTERVAL_MS = {
|
|
44
|
+
"1m": 6e4,
|
|
45
|
+
"3m": 18e4,
|
|
46
|
+
"5m": 3e5,
|
|
47
|
+
"15m": 9e5,
|
|
48
|
+
"30m": 18e5,
|
|
49
|
+
"1h": 36e5,
|
|
50
|
+
"2h": 72e5,
|
|
51
|
+
"4h": 144e5,
|
|
52
|
+
"8h": 288e5,
|
|
53
|
+
"12h": 432e5,
|
|
54
|
+
"1d": 864e5,
|
|
55
|
+
"3d": 2592e5,
|
|
56
|
+
"1w": 6048e5,
|
|
57
|
+
"1M": 2592e6
|
|
58
|
+
};
|
|
59
|
+
var HYPERLIQUID_DEFAULT_OHLCV_INTERVAL = "15m";
|
|
60
|
+
var HYPERLIQUID_DEFAULT_CANDLE_LIMIT = 48;
|
|
61
|
+
var HYPERLIQUID_MAX_CANDLE_LIMIT = 200;
|
|
62
|
+
var HYPERLIQUID_MAX_OHLCV_BARS = 2e3;
|
|
63
|
+
var HYPERLIQUID_DEFAULT_LOOKBACK_DAYS = 1;
|
|
64
|
+
var HYPERLIQUID_MAX_LOOKBACK_DAYS = 90;
|
|
37
65
|
|
|
38
66
|
// src/protocols/evm/hyperliquid/api.ts
|
|
39
67
|
async function hyperliquidInfoPost(chainId, body) {
|
|
@@ -84,19 +112,8 @@ async function hyperliquidFetchAllMids(args) {
|
|
|
84
112
|
const mids = await hyperliquidInfoPost(args.chainId, req);
|
|
85
113
|
return { mids };
|
|
86
114
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
const startTime = args.startTimeMs ?? endTime - 7 * 24 * 60 * 60 * 1e3;
|
|
90
|
-
const raw = await hyperliquidInfoPost(args.chainId, {
|
|
91
|
-
type: "candleSnapshot",
|
|
92
|
-
req: {
|
|
93
|
-
coin: args.coin,
|
|
94
|
-
interval: args.interval,
|
|
95
|
-
startTime,
|
|
96
|
-
endTime
|
|
97
|
-
}
|
|
98
|
-
});
|
|
99
|
-
const candles = (raw ?? []).map((c) => ({
|
|
115
|
+
function hyperliquidMapCandles(raw) {
|
|
116
|
+
return (raw ?? []).map((c) => ({
|
|
100
117
|
timestampMs: c.t,
|
|
101
118
|
open: c.o,
|
|
102
119
|
high: c.h,
|
|
@@ -104,20 +121,180 @@ async function hyperliquidFetchCandles(args) {
|
|
|
104
121
|
close: c.c,
|
|
105
122
|
volume: c.v
|
|
106
123
|
}));
|
|
107
|
-
|
|
124
|
+
}
|
|
125
|
+
async function hyperliquidFetchCandlesRaw(args) {
|
|
126
|
+
const raw = await hyperliquidInfoPost(args.chainId, {
|
|
127
|
+
type: "candleSnapshot",
|
|
128
|
+
req: {
|
|
129
|
+
coin: args.coin,
|
|
130
|
+
interval: args.interval,
|
|
131
|
+
startTime: args.startTimeMs,
|
|
132
|
+
endTime: args.endTimeMs
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
return hyperliquidMapCandles(raw);
|
|
136
|
+
}
|
|
137
|
+
function hyperliquidResolveOhlcvWindow(args) {
|
|
138
|
+
const endTimeMs = args.endTimeMs ?? Date.now();
|
|
139
|
+
const intervalMs = HYPERLIQUID_INTERVAL_MS[args.interval] ?? HYPERLIQUID_INTERVAL_MS["15m"];
|
|
140
|
+
let startTimeMs;
|
|
141
|
+
if (args.startTimeMs != null) {
|
|
142
|
+
startTimeMs = args.startTimeMs;
|
|
143
|
+
} else if (args.lookbackDays != null) {
|
|
144
|
+
if (args.lookbackDays <= 0 || args.lookbackDays > HYPERLIQUID_MAX_LOOKBACK_DAYS) {
|
|
145
|
+
throw new Error(`lookbackDays must be between 1 and ${HYPERLIQUID_MAX_LOOKBACK_DAYS}`);
|
|
146
|
+
}
|
|
147
|
+
startTimeMs = endTimeMs - args.lookbackDays * 864e5;
|
|
148
|
+
} else if (args.lookbackHours != null) {
|
|
149
|
+
if (args.lookbackHours <= 0 || args.lookbackHours > HYPERLIQUID_MAX_LOOKBACK_DAYS * 24) {
|
|
150
|
+
throw new Error(`lookbackHours must be between 1 and ${HYPERLIQUID_MAX_LOOKBACK_DAYS * 24}`);
|
|
151
|
+
}
|
|
152
|
+
startTimeMs = endTimeMs - args.lookbackHours * 36e5;
|
|
153
|
+
} else {
|
|
154
|
+
startTimeMs = endTimeMs - HYPERLIQUID_DEFAULT_LOOKBACK_DAYS * 864e5;
|
|
155
|
+
}
|
|
156
|
+
if (!Number.isFinite(startTimeMs) || !Number.isFinite(endTimeMs) || startTimeMs >= endTimeMs) {
|
|
157
|
+
throw new Error("Invalid OHLCV time range: startTimeMs must be before endTimeMs");
|
|
158
|
+
}
|
|
159
|
+
const expectedBars = Math.ceil((endTimeMs - startTimeMs) / intervalMs);
|
|
160
|
+
if (expectedBars > HYPERLIQUID_MAX_OHLCV_BARS) {
|
|
161
|
+
throw new Error(
|
|
162
|
+
`OHLCV range needs ~${expectedBars} bars at ${args.interval} (max ${HYPERLIQUID_MAX_OHLCV_BARS}). Use a coarser interval or shorter lookback.`
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
return { startTimeMs, endTimeMs, expectedBars };
|
|
166
|
+
}
|
|
167
|
+
async function hyperliquidFetchCandles(args) {
|
|
168
|
+
const endTime = args.endTimeMs ?? Date.now();
|
|
169
|
+
const intervalMs = HYPERLIQUID_INTERVAL_MS[args.interval] ?? HYPERLIQUID_INTERVAL_MS["15m"];
|
|
170
|
+
const limit = Math.min(Math.max(args.limit ?? HYPERLIQUID_DEFAULT_CANDLE_LIMIT, 1), HYPERLIQUID_MAX_CANDLE_LIMIT);
|
|
171
|
+
const startTime = args.startTimeMs ?? endTime - intervalMs * (limit + 4);
|
|
172
|
+
const candles = await hyperliquidFetchCandlesRaw({
|
|
173
|
+
chainId: args.chainId,
|
|
174
|
+
coin: args.coin,
|
|
175
|
+
interval: args.interval,
|
|
176
|
+
startTimeMs: startTime,
|
|
177
|
+
endTimeMs: endTime
|
|
178
|
+
});
|
|
179
|
+
return { candles: candles.slice(-limit) };
|
|
180
|
+
}
|
|
181
|
+
async function hyperliquidFetchOhlcvRange(args) {
|
|
182
|
+
const coin = args.coin.trim();
|
|
183
|
+
const interval = args.interval ?? HYPERLIQUID_DEFAULT_OHLCV_INTERVAL;
|
|
184
|
+
const dex = args.dex?.trim() || hyperliquidInferDexFromCoin(coin) || null;
|
|
185
|
+
const { startTimeMs, endTimeMs, expectedBars } = hyperliquidResolveOhlcvWindow({
|
|
186
|
+
interval,
|
|
187
|
+
lookbackDays: args.lookbackDays,
|
|
188
|
+
lookbackHours: args.lookbackHours,
|
|
189
|
+
startTimeMs: args.startTimeMs,
|
|
190
|
+
endTimeMs: args.endTimeMs
|
|
191
|
+
});
|
|
192
|
+
const candles = await hyperliquidFetchCandlesRaw({
|
|
193
|
+
chainId: args.chainId,
|
|
194
|
+
coin,
|
|
195
|
+
interval,
|
|
196
|
+
startTimeMs,
|
|
197
|
+
endTimeMs
|
|
198
|
+
});
|
|
199
|
+
if (candles.length === 0) {
|
|
200
|
+
throw new Error(
|
|
201
|
+
`No OHLCV data for ${coin} between ${startTimeMs} and ${endTimeMs} at ${interval}. Check coin/dex.`
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
const latestCandle = candles.length > 0 ? candles[candles.length - 1] : null;
|
|
205
|
+
return {
|
|
206
|
+
coin,
|
|
207
|
+
dex,
|
|
208
|
+
interval,
|
|
209
|
+
startTimeMs,
|
|
210
|
+
endTimeMs,
|
|
211
|
+
expectedBars,
|
|
212
|
+
candleCount: candles.length,
|
|
213
|
+
latestCandle,
|
|
214
|
+
candles,
|
|
215
|
+
fetchedAtMs: Date.now()
|
|
216
|
+
};
|
|
217
|
+
}
|
|
218
|
+
async function hyperliquidFetchPerpAssetContext(args) {
|
|
219
|
+
const coin = args.coin.trim();
|
|
220
|
+
const dex = args.dex?.trim() || hyperliquidInferDexFromCoin(coin) || "";
|
|
221
|
+
const req = { type: "metaAndAssetCtxs" };
|
|
222
|
+
if (dex) req.dex = dex;
|
|
223
|
+
const raw = await hyperliquidInfoPost(args.chainId, req);
|
|
224
|
+
const universe = raw?.[0]?.universe ?? [];
|
|
225
|
+
const contexts = raw?.[1] ?? [];
|
|
226
|
+
const idx = universe.findIndex((u) => u.name === coin);
|
|
227
|
+
if (idx < 0) {
|
|
228
|
+
throw new Error(`Hyperliquid asset context not found for ${coin}${dex ? ` on dex ${dex}` : ""}`);
|
|
229
|
+
}
|
|
230
|
+
const ctx = contexts[idx] ?? {};
|
|
231
|
+
const str = (v) => {
|
|
232
|
+
const s = String(v ?? "").trim();
|
|
233
|
+
return s || null;
|
|
234
|
+
};
|
|
235
|
+
return {
|
|
236
|
+
markPx: str(ctx.markPx),
|
|
237
|
+
midPx: str(ctx.midPx),
|
|
238
|
+
oraclePx: str(ctx.oraclePx),
|
|
239
|
+
prevDayPx: str(ctx.prevDayPx),
|
|
240
|
+
funding: str(ctx.funding),
|
|
241
|
+
openInterest: str(ctx.openInterest)
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
function hyperliquidPickLivePrice(args) {
|
|
245
|
+
const midUsd = args.midPx ?? args.markPx ?? args.midFromAllMids;
|
|
246
|
+
if (!midUsd) {
|
|
247
|
+
throw new Error("Could not fetch live Hyperliquid price (mark, mid, and allMids all empty)");
|
|
248
|
+
}
|
|
249
|
+
const source = args.midPx ? "midPx" : args.markPx ? "markPx" : "allMids";
|
|
250
|
+
return {
|
|
251
|
+
markPx: args.markPx,
|
|
252
|
+
midPx: args.midPx,
|
|
253
|
+
oraclePx: null,
|
|
254
|
+
prevDayPx: null,
|
|
255
|
+
midUsd,
|
|
256
|
+
source
|
|
257
|
+
};
|
|
108
258
|
}
|
|
109
259
|
async function hyperliquidFetchMarketSnapshot(args) {
|
|
110
|
-
const
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
260
|
+
const coin = args.coin.trim();
|
|
261
|
+
const interval = args.interval ?? HYPERLIQUID_DEFAULT_OHLCV_INTERVAL;
|
|
262
|
+
const dex = args.dex?.trim() || hyperliquidInferDexFromCoin(coin) || null;
|
|
263
|
+
const candleLimit = Math.min(
|
|
264
|
+
Math.max(args.candleLimit ?? HYPERLIQUID_DEFAULT_CANDLE_LIMIT, 1),
|
|
265
|
+
HYPERLIQUID_MAX_CANDLE_LIMIT
|
|
266
|
+
);
|
|
267
|
+
const [{ mids }, assetCtx, { candles }] = await Promise.all([
|
|
268
|
+
hyperliquidFetchAllMids({ chainId: args.chainId, dex: dex ?? void 0 }),
|
|
269
|
+
hyperliquidFetchPerpAssetContext({ chainId: args.chainId, coin, dex: dex ?? void 0 }),
|
|
270
|
+
hyperliquidFetchCandles({
|
|
271
|
+
chainId: args.chainId,
|
|
272
|
+
coin,
|
|
273
|
+
interval,
|
|
274
|
+
limit: candleLimit
|
|
275
|
+
})
|
|
114
276
|
]);
|
|
277
|
+
const midFromAllMids = mids[coin] ?? null;
|
|
278
|
+
const livePrice = {
|
|
279
|
+
...hyperliquidPickLivePrice({
|
|
280
|
+
markPx: assetCtx.markPx,
|
|
281
|
+
midPx: assetCtx.midPx,
|
|
282
|
+
midFromAllMids
|
|
283
|
+
}),
|
|
284
|
+
oraclePx: assetCtx.oraclePx,
|
|
285
|
+
prevDayPx: assetCtx.prevDayPx
|
|
286
|
+
};
|
|
287
|
+
const latestCandle = candles.length > 0 ? candles[candles.length - 1] : null;
|
|
115
288
|
return {
|
|
116
|
-
coin
|
|
117
|
-
|
|
289
|
+
coin,
|
|
290
|
+
dex,
|
|
291
|
+
livePrice,
|
|
292
|
+
midUsd: livePrice.midUsd,
|
|
118
293
|
fetchedAtMs: Date.now(),
|
|
119
294
|
interval,
|
|
120
|
-
|
|
295
|
+
latestCandle,
|
|
296
|
+
candles,
|
|
297
|
+
candleCount: candles.length
|
|
121
298
|
};
|
|
122
299
|
}
|
|
123
300
|
async function hyperliquidFetchClearinghouseState(args) {
|
|
@@ -262,6 +439,21 @@ async function hyperliquidFetchDexList(args) {
|
|
|
262
439
|
}
|
|
263
440
|
return { dexes };
|
|
264
441
|
}
|
|
442
|
+
async function hyperliquidFetchPerpConciseAnnotations(args) {
|
|
443
|
+
const raw = await hyperliquidInfoPost(args.chainId, {
|
|
444
|
+
type: "perpConciseAnnotations"
|
|
445
|
+
});
|
|
446
|
+
const map = /* @__PURE__ */ new Map();
|
|
447
|
+
if (!Array.isArray(raw)) return map;
|
|
448
|
+
for (const entry of raw) {
|
|
449
|
+
if (!Array.isArray(entry) || entry.length < 2) continue;
|
|
450
|
+
const coin = String(entry[0] ?? "").trim();
|
|
451
|
+
const meta = entry[1];
|
|
452
|
+
if (!coin || !meta || typeof meta !== "object") continue;
|
|
453
|
+
map.set(coin, meta);
|
|
454
|
+
}
|
|
455
|
+
return map;
|
|
456
|
+
}
|
|
265
457
|
async function hyperliquidFetchDelegations(args) {
|
|
266
458
|
const raw = await hyperliquidInfoPost(args.chainId, {
|
|
267
459
|
type: "delegations",
|
|
@@ -277,13 +469,138 @@ async function hyperliquidFetchStakingSummary(args) {
|
|
|
277
469
|
return { delegated: raw?.delegated ?? "0", undelegated: raw?.undelegated ?? "0" };
|
|
278
470
|
}
|
|
279
471
|
|
|
472
|
+
// src/protocols/evm/hyperliquid/marketSearch.ts
|
|
473
|
+
function normalizeQuery(value) {
|
|
474
|
+
return value.trim().toLowerCase();
|
|
475
|
+
}
|
|
476
|
+
function compactCoin(value) {
|
|
477
|
+
return normalizeQuery(value).replace(/[^a-z0-9]/g, "");
|
|
478
|
+
}
|
|
479
|
+
function hyperliquidMarketSymbol(coin) {
|
|
480
|
+
const sep = coin.indexOf(":");
|
|
481
|
+
return sep >= 0 ? coin.slice(sep + 1) : coin;
|
|
482
|
+
}
|
|
483
|
+
function scoreMarketMatch(query, market, annotation) {
|
|
484
|
+
const q = normalizeQuery(query);
|
|
485
|
+
if (!q) return null;
|
|
486
|
+
const coin = market.name;
|
|
487
|
+
const symbol = hyperliquidMarketSymbol(coin);
|
|
488
|
+
const coinLower = normalizeQuery(coin);
|
|
489
|
+
const symbolLower = normalizeQuery(symbol);
|
|
490
|
+
if (coinLower === q) return { score: 100, reason: "exact coin name" };
|
|
491
|
+
if (symbolLower === q) return { score: 95, reason: "exact ticker symbol" };
|
|
492
|
+
if (compactCoin(coin) === compactCoin(q)) return { score: 92, reason: "coin name without separators" };
|
|
493
|
+
if (annotation?.displayName) {
|
|
494
|
+
const display = normalizeQuery(annotation.displayName);
|
|
495
|
+
if (display === q) return { score: 94, reason: "exact display name" };
|
|
496
|
+
if (display.includes(q) || q.includes(display)) return { score: 72, reason: "display name partial match" };
|
|
497
|
+
}
|
|
498
|
+
for (const keyword of annotation?.keywords ?? []) {
|
|
499
|
+
const kw = normalizeQuery(keyword);
|
|
500
|
+
if (!kw) continue;
|
|
501
|
+
if (kw === q) return { score: 88, reason: `keyword "${keyword}"` };
|
|
502
|
+
if (kw.includes(q) || q.includes(kw)) return { score: 68, reason: `keyword partial "${keyword}"` };
|
|
503
|
+
}
|
|
504
|
+
if (symbolLower.includes(q) || q.includes(symbolLower)) {
|
|
505
|
+
return { score: 78, reason: "ticker partial match" };
|
|
506
|
+
}
|
|
507
|
+
if (!coin.includes(":") && coinLower.includes(q)) {
|
|
508
|
+
return { score: 65, reason: "native coin partial match" };
|
|
509
|
+
}
|
|
510
|
+
if (market.dex && normalizeQuery(market.dex) === q) {
|
|
511
|
+
return { score: 40, reason: "dex name match" };
|
|
512
|
+
}
|
|
513
|
+
return null;
|
|
514
|
+
}
|
|
515
|
+
async function hyperliquidCollectAllPerpMarkets(args) {
|
|
516
|
+
const dexFilter = args.dex?.trim();
|
|
517
|
+
const { dexes } = await hyperliquidFetchDexList({ chainId: args.chainId });
|
|
518
|
+
if (dexFilter) {
|
|
519
|
+
const { markets: markets2 } = await hyperliquidFetchPerpMeta({ chainId: args.chainId, dex: dexFilter });
|
|
520
|
+
return { markets: markets2.map((m) => ({ ...m, dex: dexFilter })), dexes };
|
|
521
|
+
}
|
|
522
|
+
const { markets: nativeMarkets } = await hyperliquidFetchPerpMeta({ chainId: args.chainId });
|
|
523
|
+
const markets = [...nativeMarkets];
|
|
524
|
+
const hip3Batches = await Promise.all(
|
|
525
|
+
dexes.map(async (d) => {
|
|
526
|
+
const { markets: dexMarkets } = await hyperliquidFetchPerpMeta({ chainId: args.chainId, dex: d.name });
|
|
527
|
+
return dexMarkets.map((m) => ({ ...m, dex: d.name }));
|
|
528
|
+
})
|
|
529
|
+
);
|
|
530
|
+
for (const batch of hip3Batches) markets.push(...batch);
|
|
531
|
+
return { markets, dexes };
|
|
532
|
+
}
|
|
533
|
+
async function hyperliquidSearchMarkets(args) {
|
|
534
|
+
const query = args.query.trim();
|
|
535
|
+
if (!query) return { matches: [] };
|
|
536
|
+
const limit = Math.max(1, Math.min(args.limit ?? 20, 50));
|
|
537
|
+
const [{ markets }, annotationMap] = await Promise.all([
|
|
538
|
+
hyperliquidCollectAllPerpMarkets({ chainId: args.chainId, dex: args.dex?.trim() }),
|
|
539
|
+
hyperliquidFetchPerpConciseAnnotations({ chainId: args.chainId })
|
|
540
|
+
]);
|
|
541
|
+
const hits = [];
|
|
542
|
+
for (const market of markets) {
|
|
543
|
+
const annotation = annotationMap.get(market.name);
|
|
544
|
+
const scored = scoreMarketMatch(query, market, annotation);
|
|
545
|
+
if (!scored || scored.score < 40) continue;
|
|
546
|
+
hits.push({
|
|
547
|
+
coin: market.name,
|
|
548
|
+
symbol: hyperliquidMarketSymbol(market.name),
|
|
549
|
+
dex: market.dex,
|
|
550
|
+
asset: market.asset,
|
|
551
|
+
szDecimals: market.szDecimals,
|
|
552
|
+
maxLeverage: market.maxLeverage,
|
|
553
|
+
onlyIsolated: market.onlyIsolated,
|
|
554
|
+
displayName: annotation?.displayName,
|
|
555
|
+
category: annotation?.category,
|
|
556
|
+
keywords: annotation?.keywords,
|
|
557
|
+
matchScore: scored.score,
|
|
558
|
+
matchReason: scored.reason
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
hits.sort((a, b) => b.matchScore - a.matchScore || a.coin.localeCompare(b.coin));
|
|
562
|
+
return { matches: hits.slice(0, limit) };
|
|
563
|
+
}
|
|
564
|
+
async function hyperliquidResolvePerpMarket(args) {
|
|
565
|
+
const coin = args.coin.trim();
|
|
566
|
+
if (!coin) throw new Error("coin is required");
|
|
567
|
+
const dex = args.dex?.trim() || hyperliquidInferDexFromCoin(coin);
|
|
568
|
+
if (dex || !coin.includes(":")) {
|
|
569
|
+
const { markets } = await hyperliquidFetchPerpMeta({ chainId: args.chainId, dex });
|
|
570
|
+
const direct = markets.find((m) => m.name.toLowerCase() === coin.toLowerCase());
|
|
571
|
+
if (direct) {
|
|
572
|
+
return {
|
|
573
|
+
...direct,
|
|
574
|
+
dex: dex || direct.dex,
|
|
575
|
+
symbol: hyperliquidMarketSymbol(direct.name)
|
|
576
|
+
};
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
const { matches } = await hyperliquidSearchMarkets({ chainId: args.chainId, query: coin, dex: args.dex, limit: 10 });
|
|
580
|
+
const bestScore = matches[0]?.matchScore ?? 0;
|
|
581
|
+
if (bestScore < 60) throw new Error(`Unknown Hyperliquid perp market: ${coin}`);
|
|
582
|
+
const top = matches.filter((m) => m.matchScore === bestScore);
|
|
583
|
+
if (top.length === 1) {
|
|
584
|
+
const m = top[0];
|
|
585
|
+
return {
|
|
586
|
+
name: m.coin,
|
|
587
|
+
asset: m.asset,
|
|
588
|
+
szDecimals: m.szDecimals,
|
|
589
|
+
maxLeverage: m.maxLeverage,
|
|
590
|
+
onlyIsolated: m.onlyIsolated,
|
|
591
|
+
dex: m.dex,
|
|
592
|
+
symbol: m.symbol
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
throw new Error(
|
|
596
|
+
`Ambiguous Hyperliquid market for "${coin}": ${top.map((m) => m.coin).join(", ")}. Pass dex or full coin name (e.g. xyz:AAPL).`
|
|
597
|
+
);
|
|
598
|
+
}
|
|
599
|
+
|
|
280
600
|
// src/protocols/evm/hyperliquid/assets.ts
|
|
281
601
|
async function hyperliquidResolvePerpAsset(args) {
|
|
282
|
-
const
|
|
283
|
-
|
|
284
|
-
const hit = markets.find((m) => m.name.toLowerCase() === coin.toLowerCase());
|
|
285
|
-
if (!hit) throw new Error(`Unknown Hyperliquid perp market: ${coin}`);
|
|
286
|
-
return { asset: hit.asset, szDecimals: hit.szDecimals, maxLeverage: hit.maxLeverage };
|
|
602
|
+
const resolved = await hyperliquidResolvePerpMarket(args);
|
|
603
|
+
return { asset: resolved.asset, szDecimals: resolved.szDecimals, maxLeverage: resolved.maxLeverage };
|
|
287
604
|
}
|
|
288
605
|
async function hyperliquidResolveSpotAsset(args) {
|
|
289
606
|
const coin = args.coin.trim();
|
|
@@ -357,10 +674,16 @@ function mapPositionRow(p) {
|
|
|
357
674
|
}
|
|
358
675
|
async function hyperliquidFetchOpenMarketContext(args) {
|
|
359
676
|
const user = args.executorAddress.trim().toLowerCase();
|
|
360
|
-
const
|
|
677
|
+
const resolved = await hyperliquidResolvePerpMarket({
|
|
678
|
+
chainId: args.chainId,
|
|
679
|
+
coin: args.coin,
|
|
680
|
+
dex: args.dex
|
|
681
|
+
});
|
|
682
|
+
const coin = resolved.name;
|
|
683
|
+
const dex = args.dex?.trim() || resolved.dex;
|
|
361
684
|
const [{ activeAsset }, { state }] = await Promise.all([
|
|
362
685
|
hyperliquidFetchActiveAssetData({ chainId: args.chainId, user, coin }),
|
|
363
|
-
hyperliquidFetchClearinghouseState({ chainId: args.chainId, user, dex
|
|
686
|
+
hyperliquidFetchClearinghouseState({ chainId: args.chainId, user, dex })
|
|
364
687
|
]);
|
|
365
688
|
return {
|
|
366
689
|
context: {
|
|
@@ -395,12 +718,15 @@ async function hyperliquidFetchOrdersForExecutor(args) {
|
|
|
395
718
|
});
|
|
396
719
|
}
|
|
397
720
|
async function hyperliquidFetchMarketsSummary(args) {
|
|
398
|
-
const
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
721
|
+
const { markets, dexes } = await hyperliquidCollectAllPerpMarkets({
|
|
722
|
+
chainId: args.chainId,
|
|
723
|
+
dex: args.dex?.trim()
|
|
724
|
+
});
|
|
402
725
|
return { markets, dexes };
|
|
403
726
|
}
|
|
727
|
+
async function hyperliquidSearchMarketsSummary(args) {
|
|
728
|
+
return hyperliquidSearchMarkets(args);
|
|
729
|
+
}
|
|
404
730
|
async function hyperliquidFetchPositionsForExecutor(args) {
|
|
405
731
|
const { rows } = await hyperliquidFetchPositionDisplayRows(args);
|
|
406
732
|
return { positions: rows };
|
|
@@ -446,8 +772,37 @@ async function hyperliquidFetchDelegationsForExecutor(args) {
|
|
|
446
772
|
return { delegations };
|
|
447
773
|
}
|
|
448
774
|
async function hyperliquidFetchMarketSnapshotSummary(args) {
|
|
449
|
-
const
|
|
450
|
-
|
|
775
|
+
const resolved = await hyperliquidResolvePerpMarket({
|
|
776
|
+
chainId: args.chainId,
|
|
777
|
+
coin: args.coin,
|
|
778
|
+
dex: args.dex
|
|
779
|
+
});
|
|
780
|
+
const snapshot = await hyperliquidFetchMarketSnapshot({
|
|
781
|
+
chainId: args.chainId,
|
|
782
|
+
coin: resolved.name,
|
|
783
|
+
interval: args.interval,
|
|
784
|
+
dex: args.dex?.trim() || resolved.dex,
|
|
785
|
+
candleLimit: args.candleLimit
|
|
786
|
+
});
|
|
787
|
+
return { snapshot, resolvedCoin: resolved.name, dex: resolved.dex ?? null };
|
|
788
|
+
}
|
|
789
|
+
async function hyperliquidFetchOhlcvSummary(args) {
|
|
790
|
+
const resolved = await hyperliquidResolvePerpMarket({
|
|
791
|
+
chainId: args.chainId,
|
|
792
|
+
coin: args.coin,
|
|
793
|
+
dex: args.dex
|
|
794
|
+
});
|
|
795
|
+
const ohlcv = await hyperliquidFetchOhlcvRange({
|
|
796
|
+
chainId: args.chainId,
|
|
797
|
+
coin: resolved.name,
|
|
798
|
+
interval: args.interval,
|
|
799
|
+
dex: args.dex?.trim() || resolved.dex,
|
|
800
|
+
lookbackDays: args.lookbackDays,
|
|
801
|
+
lookbackHours: args.lookbackHours,
|
|
802
|
+
startTimeMs: args.startTimeMs,
|
|
803
|
+
endTimeMs: args.endTimeMs
|
|
804
|
+
});
|
|
805
|
+
return { ohlcv, resolvedCoin: resolved.name, dex: resolved.dex ?? null };
|
|
451
806
|
}
|
|
452
807
|
var coreWriterAbi = parseAbi(["function sendRawAction(bytes data) external"]);
|
|
453
808
|
var ACTION_LIMIT_ORDER = 1;
|
|
@@ -1104,6 +1459,6 @@ var hyperliquidProtocolModule = {
|
|
|
1104
1459
|
};
|
|
1105
1460
|
registerProtocolModule(hyperliquidProtocolModule);
|
|
1106
1461
|
|
|
1107
|
-
export { HYPERLIQUID_CORE_WRITER_ADDRESS, HYPERLIQUID_CORE_WRITER_GAS_FALLBACK, HYPERLIQUID_HLP_VAULT_ADDRESS, HYPERLIQUID_PROTOCOL_ID, HYPERLIQUID_SPOT_ASSET_OFFSET, HYPERLIQUID_SUPPORTED_CHAIN_IDS, HYPERLIQUID_TIF, buildCoreWriterCancelByCloidCalldata, buildCoreWriterCancelByOidCalldata, buildCoreWriterLimitOrderCalldata, buildCoreWriterStakingDepositCalldata, buildCoreWriterStakingWithdrawCalldata, buildCoreWriterTokenDelegateCalldata, buildCoreWriterUsdClassTransferCalldata, buildCoreWriterVaultTransferCalldata, buildEvmMultisignBodyHyperliquidCancelBatch, buildEvmMultisignBodyHyperliquidCloseBatch, buildEvmMultisignBodyHyperliquidDelegateBatch, buildEvmMultisignBodyHyperliquidDelegateOnlyBatch, buildEvmMultisignBodyHyperliquidLimitOrderBatch, buildEvmMultisignBodyHyperliquidStakeDepositBatch, buildEvmMultisignBodyHyperliquidStakeWithdrawBatch, buildEvmMultisignBodyHyperliquidUndelegateBatch, buildEvmMultisignBodyHyperliquidUsdClassTransferBatch, buildEvmMultisignBodyHyperliquidVaultDepositBatch, buildEvmMultisignBodyHyperliquidVaultWithdrawBatch, coreWriterStep, hyperliquidApiBaseUrl, hyperliquidEncodePx8, hyperliquidEncodeUsd6, hyperliquidEncodeWei8, hyperliquidFetchActiveAssetData, hyperliquidFetchAllMids, hyperliquidFetchCandles, hyperliquidFetchClearinghouseState, hyperliquidFetchDelegations, hyperliquidFetchDelegationsForExecutor, hyperliquidFetchDexList, hyperliquidFetchMarketSnapshot, hyperliquidFetchMarketSnapshotSummary, hyperliquidFetchMarketsSummary, hyperliquidFetchOpenContextSummary, hyperliquidFetchOpenMarketContext, hyperliquidFetchOpenOrders, hyperliquidFetchOpenOrdersSummary, hyperliquidFetchOrdersForExecutor, hyperliquidFetchPerpMeta, hyperliquidFetchPositionDisplayRows, hyperliquidFetchPositionsForExecutor, hyperliquidFetchSpotClearinghouseState, hyperliquidFetchSpotMeta, hyperliquidFetchStakingSummary, hyperliquidFetchStakingSummaryForExecutor, hyperliquidFetchUsdClassBalances, hyperliquidFetchUsdClassBalancesSummary, hyperliquidFetchUserVaultEquities, hyperliquidFetchUserVaultEquitiesSummary, hyperliquidFetchVaultCatalogSummary, hyperliquidFetchVaultSummaries, hyperliquidIsSpotAssetId, hyperliquidProtocolModule, hyperliquidResolveAsset, hyperliquidResolvePerpAsset, hyperliquidResolveSpotAsset, hyperliquidResolveTif, hyperliquidVaultStatsUrl, isHyperliquidChainSupported };
|
|
1462
|
+
export { HYPERLIQUID_CORE_WRITER_ADDRESS, HYPERLIQUID_CORE_WRITER_GAS_FALLBACK, HYPERLIQUID_DEFAULT_CANDLE_LIMIT, HYPERLIQUID_DEFAULT_LOOKBACK_DAYS, HYPERLIQUID_DEFAULT_OHLCV_INTERVAL, HYPERLIQUID_HLP_VAULT_ADDRESS, HYPERLIQUID_INTERVAL_MS, HYPERLIQUID_MAX_CANDLE_LIMIT, HYPERLIQUID_MAX_LOOKBACK_DAYS, HYPERLIQUID_MAX_OHLCV_BARS, HYPERLIQUID_PROTOCOL_ID, HYPERLIQUID_SPOT_ASSET_OFFSET, HYPERLIQUID_SUPPORTED_CHAIN_IDS, HYPERLIQUID_TIF, buildCoreWriterCancelByCloidCalldata, buildCoreWriterCancelByOidCalldata, buildCoreWriterLimitOrderCalldata, buildCoreWriterStakingDepositCalldata, buildCoreWriterStakingWithdrawCalldata, buildCoreWriterTokenDelegateCalldata, buildCoreWriterUsdClassTransferCalldata, buildCoreWriterVaultTransferCalldata, buildEvmMultisignBodyHyperliquidCancelBatch, buildEvmMultisignBodyHyperliquidCloseBatch, buildEvmMultisignBodyHyperliquidDelegateBatch, buildEvmMultisignBodyHyperliquidDelegateOnlyBatch, buildEvmMultisignBodyHyperliquidLimitOrderBatch, buildEvmMultisignBodyHyperliquidStakeDepositBatch, buildEvmMultisignBodyHyperliquidStakeWithdrawBatch, buildEvmMultisignBodyHyperliquidUndelegateBatch, buildEvmMultisignBodyHyperliquidUsdClassTransferBatch, buildEvmMultisignBodyHyperliquidVaultDepositBatch, buildEvmMultisignBodyHyperliquidVaultWithdrawBatch, coreWriterStep, hyperliquidApiBaseUrl, hyperliquidCollectAllPerpMarkets, hyperliquidEncodePx8, hyperliquidEncodeUsd6, hyperliquidEncodeWei8, hyperliquidFetchActiveAssetData, hyperliquidFetchAllMids, hyperliquidFetchCandles, hyperliquidFetchClearinghouseState, hyperliquidFetchDelegations, hyperliquidFetchDelegationsForExecutor, hyperliquidFetchDexList, hyperliquidFetchMarketSnapshot, hyperliquidFetchMarketSnapshotSummary, hyperliquidFetchMarketsSummary, hyperliquidFetchOhlcvRange, hyperliquidFetchOhlcvSummary, hyperliquidFetchOpenContextSummary, hyperliquidFetchOpenMarketContext, hyperliquidFetchOpenOrders, hyperliquidFetchOpenOrdersSummary, hyperliquidFetchOrdersForExecutor, hyperliquidFetchPerpAssetContext, hyperliquidFetchPerpConciseAnnotations, hyperliquidFetchPerpMeta, hyperliquidFetchPositionDisplayRows, hyperliquidFetchPositionsForExecutor, hyperliquidFetchSpotClearinghouseState, hyperliquidFetchSpotMeta, hyperliquidFetchStakingSummary, hyperliquidFetchStakingSummaryForExecutor, hyperliquidFetchUsdClassBalances, hyperliquidFetchUsdClassBalancesSummary, hyperliquidFetchUserVaultEquities, hyperliquidFetchUserVaultEquitiesSummary, hyperliquidFetchVaultCatalogSummary, hyperliquidFetchVaultSummaries, hyperliquidInferDexFromCoin, hyperliquidIsSpotAssetId, hyperliquidMarketSymbol, hyperliquidProtocolModule, hyperliquidResolveAsset, hyperliquidResolveOhlcvWindow, hyperliquidResolvePerpAsset, hyperliquidResolvePerpMarket, hyperliquidResolveSpotAsset, hyperliquidResolveTif, hyperliquidSearchMarkets, hyperliquidSearchMarketsSummary, hyperliquidVaultStatsUrl, isHyperliquidChainSupported };
|
|
1108
1463
|
//# sourceMappingURL=index.js.map
|
|
1109
1464
|
//# sourceMappingURL=index.js.map
|