@hypurrquant/defi-cli 0.3.5 → 0.4.1

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.
@@ -10,764 +10,6 @@ var __export = (target, all) => {
10
10
  __defProp(target, name, { get: all[name], enumerable: true });
11
11
  };
12
12
 
13
- // ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js
14
- function getLineColFromPtr(string, ptr) {
15
- let lines = string.slice(0, ptr).split(/\r\n|\n|\r/g);
16
- return [lines.length, lines.pop().length + 1];
17
- }
18
- function makeCodeBlock(string, line, column) {
19
- let lines = string.split(/\r\n|\n|\r/g);
20
- let codeblock = "";
21
- let numberLen = (Math.log10(line + 1) | 0) + 1;
22
- for (let i = line - 1; i <= line + 1; i++) {
23
- let l = lines[i - 1];
24
- if (!l)
25
- continue;
26
- codeblock += i.toString().padEnd(numberLen, " ");
27
- codeblock += ": ";
28
- codeblock += l;
29
- codeblock += "\n";
30
- if (i === line) {
31
- codeblock += " ".repeat(numberLen + column + 2);
32
- codeblock += "^\n";
33
- }
34
- }
35
- return codeblock;
36
- }
37
- var TomlError;
38
- var init_error = __esm({
39
- "../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/error.js"() {
40
- "use strict";
41
- TomlError = class extends Error {
42
- line;
43
- column;
44
- codeblock;
45
- constructor(message, options) {
46
- const [line, column] = getLineColFromPtr(options.toml, options.ptr);
47
- const codeblock = makeCodeBlock(options.toml, line, column);
48
- super(`Invalid TOML document: ${message}
49
-
50
- ${codeblock}`, options);
51
- this.line = line;
52
- this.column = column;
53
- this.codeblock = codeblock;
54
- }
55
- };
56
- }
57
- });
58
-
59
- // ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js
60
- function isEscaped(str, ptr) {
61
- let i = 0;
62
- while (str[ptr - ++i] === "\\")
63
- ;
64
- return --i && i % 2;
65
- }
66
- function indexOfNewline(str, start = 0, end = str.length) {
67
- let idx = str.indexOf("\n", start);
68
- if (str[idx - 1] === "\r")
69
- idx--;
70
- return idx <= end ? idx : -1;
71
- }
72
- function skipComment(str, ptr) {
73
- for (let i = ptr; i < str.length; i++) {
74
- let c = str[i];
75
- if (c === "\n")
76
- return i;
77
- if (c === "\r" && str[i + 1] === "\n")
78
- return i + 1;
79
- if (c < " " && c !== " " || c === "\x7F") {
80
- throw new TomlError("control characters are not allowed in comments", {
81
- toml: str,
82
- ptr
83
- });
84
- }
85
- }
86
- return str.length;
87
- }
88
- function skipVoid(str, ptr, banNewLines, banComments) {
89
- let c;
90
- while ((c = str[ptr]) === " " || c === " " || !banNewLines && (c === "\n" || c === "\r" && str[ptr + 1] === "\n"))
91
- ptr++;
92
- return banComments || c !== "#" ? ptr : skipVoid(str, skipComment(str, ptr), banNewLines);
93
- }
94
- function skipUntil(str, ptr, sep, end, banNewLines = false) {
95
- if (!end) {
96
- ptr = indexOfNewline(str, ptr);
97
- return ptr < 0 ? str.length : ptr;
98
- }
99
- for (let i = ptr; i < str.length; i++) {
100
- let c = str[i];
101
- if (c === "#") {
102
- i = indexOfNewline(str, i);
103
- } else if (c === sep) {
104
- return i + 1;
105
- } else if (c === end || banNewLines && (c === "\n" || c === "\r" && str[i + 1] === "\n")) {
106
- return i;
107
- }
108
- }
109
- throw new TomlError("cannot find end of structure", {
110
- toml: str,
111
- ptr
112
- });
113
- }
114
- function getStringEnd(str, seek) {
115
- let first = str[seek];
116
- let target = first === str[seek + 1] && str[seek + 1] === str[seek + 2] ? str.slice(seek, seek + 3) : first;
117
- seek += target.length - 1;
118
- do
119
- seek = str.indexOf(target, ++seek);
120
- while (seek > -1 && first !== "'" && isEscaped(str, seek));
121
- if (seek > -1) {
122
- seek += target.length;
123
- if (target.length > 1) {
124
- if (str[seek] === first)
125
- seek++;
126
- if (str[seek] === first)
127
- seek++;
128
- }
129
- }
130
- return seek;
131
- }
132
- var init_util = __esm({
133
- "../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/util.js"() {
134
- "use strict";
135
- init_error();
136
- }
137
- });
138
-
139
- // ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js
140
- var DATE_TIME_RE, TomlDate;
141
- var init_date = __esm({
142
- "../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/date.js"() {
143
- "use strict";
144
- DATE_TIME_RE = /^(\d{4}-\d{2}-\d{2})?[T ]?(?:(\d{2}):\d{2}(?::\d{2}(?:\.\d+)?)?)?(Z|[-+]\d{2}:\d{2})?$/i;
145
- TomlDate = class _TomlDate extends Date {
146
- #hasDate = false;
147
- #hasTime = false;
148
- #offset = null;
149
- constructor(date) {
150
- let hasDate = true;
151
- let hasTime = true;
152
- let offset = "Z";
153
- if (typeof date === "string") {
154
- let match = date.match(DATE_TIME_RE);
155
- if (match) {
156
- if (!match[1]) {
157
- hasDate = false;
158
- date = `0000-01-01T${date}`;
159
- }
160
- hasTime = !!match[2];
161
- hasTime && date[10] === " " && (date = date.replace(" ", "T"));
162
- if (match[2] && +match[2] > 23) {
163
- date = "";
164
- } else {
165
- offset = match[3] || null;
166
- date = date.toUpperCase();
167
- if (!offset && hasTime)
168
- date += "Z";
169
- }
170
- } else {
171
- date = "";
172
- }
173
- }
174
- super(date);
175
- if (!isNaN(this.getTime())) {
176
- this.#hasDate = hasDate;
177
- this.#hasTime = hasTime;
178
- this.#offset = offset;
179
- }
180
- }
181
- isDateTime() {
182
- return this.#hasDate && this.#hasTime;
183
- }
184
- isLocal() {
185
- return !this.#hasDate || !this.#hasTime || !this.#offset;
186
- }
187
- isDate() {
188
- return this.#hasDate && !this.#hasTime;
189
- }
190
- isTime() {
191
- return this.#hasTime && !this.#hasDate;
192
- }
193
- isValid() {
194
- return this.#hasDate || this.#hasTime;
195
- }
196
- toISOString() {
197
- let iso = super.toISOString();
198
- if (this.isDate())
199
- return iso.slice(0, 10);
200
- if (this.isTime())
201
- return iso.slice(11, 23);
202
- if (this.#offset === null)
203
- return iso.slice(0, -1);
204
- if (this.#offset === "Z")
205
- return iso;
206
- let offset = +this.#offset.slice(1, 3) * 60 + +this.#offset.slice(4, 6);
207
- offset = this.#offset[0] === "-" ? offset : -offset;
208
- let offsetDate = new Date(this.getTime() - offset * 6e4);
209
- return offsetDate.toISOString().slice(0, -1) + this.#offset;
210
- }
211
- static wrapAsOffsetDateTime(jsDate, offset = "Z") {
212
- let date = new _TomlDate(jsDate);
213
- date.#offset = offset;
214
- return date;
215
- }
216
- static wrapAsLocalDateTime(jsDate) {
217
- let date = new _TomlDate(jsDate);
218
- date.#offset = null;
219
- return date;
220
- }
221
- static wrapAsLocalDate(jsDate) {
222
- let date = new _TomlDate(jsDate);
223
- date.#hasTime = false;
224
- date.#offset = null;
225
- return date;
226
- }
227
- static wrapAsLocalTime(jsDate) {
228
- let date = new _TomlDate(jsDate);
229
- date.#hasDate = false;
230
- date.#offset = null;
231
- return date;
232
- }
233
- };
234
- }
235
- });
236
-
237
- // ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js
238
- function parseString(str, ptr = 0, endPtr = str.length) {
239
- let isLiteral = str[ptr] === "'";
240
- let isMultiline = str[ptr++] === str[ptr] && str[ptr] === str[ptr + 1];
241
- if (isMultiline) {
242
- endPtr -= 2;
243
- if (str[ptr += 2] === "\r")
244
- ptr++;
245
- if (str[ptr] === "\n")
246
- ptr++;
247
- }
248
- let tmp = 0;
249
- let isEscape;
250
- let parsed = "";
251
- let sliceStart = ptr;
252
- while (ptr < endPtr - 1) {
253
- let c = str[ptr++];
254
- if (c === "\n" || c === "\r" && str[ptr] === "\n") {
255
- if (!isMultiline) {
256
- throw new TomlError("newlines are not allowed in strings", {
257
- toml: str,
258
- ptr: ptr - 1
259
- });
260
- }
261
- } else if (c < " " && c !== " " || c === "\x7F") {
262
- throw new TomlError("control characters are not allowed in strings", {
263
- toml: str,
264
- ptr: ptr - 1
265
- });
266
- }
267
- if (isEscape) {
268
- isEscape = false;
269
- if (c === "x" || c === "u" || c === "U") {
270
- let code = str.slice(ptr, ptr += c === "x" ? 2 : c === "u" ? 4 : 8);
271
- if (!ESCAPE_REGEX.test(code)) {
272
- throw new TomlError("invalid unicode escape", {
273
- toml: str,
274
- ptr: tmp
275
- });
276
- }
277
- try {
278
- parsed += String.fromCodePoint(parseInt(code, 16));
279
- } catch {
280
- throw new TomlError("invalid unicode escape", {
281
- toml: str,
282
- ptr: tmp
283
- });
284
- }
285
- } else if (isMultiline && (c === "\n" || c === " " || c === " " || c === "\r")) {
286
- ptr = skipVoid(str, ptr - 1, true);
287
- if (str[ptr] !== "\n" && str[ptr] !== "\r") {
288
- throw new TomlError("invalid escape: only line-ending whitespace may be escaped", {
289
- toml: str,
290
- ptr: tmp
291
- });
292
- }
293
- ptr = skipVoid(str, ptr);
294
- } else if (c in ESC_MAP) {
295
- parsed += ESC_MAP[c];
296
- } else {
297
- throw new TomlError("unrecognized escape sequence", {
298
- toml: str,
299
- ptr: tmp
300
- });
301
- }
302
- sliceStart = ptr;
303
- } else if (!isLiteral && c === "\\") {
304
- tmp = ptr - 1;
305
- isEscape = true;
306
- parsed += str.slice(sliceStart, tmp);
307
- }
308
- }
309
- return parsed + str.slice(sliceStart, endPtr - 1);
310
- }
311
- function parseValue(value, toml, ptr, integersAsBigInt) {
312
- if (value === "true")
313
- return true;
314
- if (value === "false")
315
- return false;
316
- if (value === "-inf")
317
- return -Infinity;
318
- if (value === "inf" || value === "+inf")
319
- return Infinity;
320
- if (value === "nan" || value === "+nan" || value === "-nan")
321
- return NaN;
322
- if (value === "-0")
323
- return integersAsBigInt ? 0n : 0;
324
- let isInt = INT_REGEX.test(value);
325
- if (isInt || FLOAT_REGEX.test(value)) {
326
- if (LEADING_ZERO.test(value)) {
327
- throw new TomlError("leading zeroes are not allowed", {
328
- toml,
329
- ptr
330
- });
331
- }
332
- value = value.replace(/_/g, "");
333
- let numeric = +value;
334
- if (isNaN(numeric)) {
335
- throw new TomlError("invalid number", {
336
- toml,
337
- ptr
338
- });
339
- }
340
- if (isInt) {
341
- if ((isInt = !Number.isSafeInteger(numeric)) && !integersAsBigInt) {
342
- throw new TomlError("integer value cannot be represented losslessly", {
343
- toml,
344
- ptr
345
- });
346
- }
347
- if (isInt || integersAsBigInt === true)
348
- numeric = BigInt(value);
349
- }
350
- return numeric;
351
- }
352
- const date = new TomlDate(value);
353
- if (!date.isValid()) {
354
- throw new TomlError("invalid value", {
355
- toml,
356
- ptr
357
- });
358
- }
359
- return date;
360
- }
361
- var INT_REGEX, FLOAT_REGEX, LEADING_ZERO, ESCAPE_REGEX, ESC_MAP;
362
- var init_primitive = __esm({
363
- "../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/primitive.js"() {
364
- "use strict";
365
- init_util();
366
- init_date();
367
- init_error();
368
- INT_REGEX = /^((0x[0-9a-fA-F](_?[0-9a-fA-F])*)|(([+-]|0[ob])?\d(_?\d)*))$/;
369
- FLOAT_REGEX = /^[+-]?\d(_?\d)*(\.\d(_?\d)*)?([eE][+-]?\d(_?\d)*)?$/;
370
- LEADING_ZERO = /^[+-]?0[0-9_]/;
371
- ESCAPE_REGEX = /^[0-9a-f]{2,8}$/i;
372
- ESC_MAP = {
373
- b: "\b",
374
- t: " ",
375
- n: "\n",
376
- f: "\f",
377
- r: "\r",
378
- e: "\x1B",
379
- '"': '"',
380
- "\\": "\\"
381
- };
382
- }
383
- });
384
-
385
- // ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js
386
- function sliceAndTrimEndOf(str, startPtr, endPtr) {
387
- let value = str.slice(startPtr, endPtr);
388
- let commentIdx = value.indexOf("#");
389
- if (commentIdx > -1) {
390
- skipComment(str, commentIdx);
391
- value = value.slice(0, commentIdx);
392
- }
393
- return [value.trimEnd(), commentIdx];
394
- }
395
- function extractValue(str, ptr, end, depth, integersAsBigInt) {
396
- if (depth === 0) {
397
- throw new TomlError("document contains excessively nested structures. aborting.", {
398
- toml: str,
399
- ptr
400
- });
401
- }
402
- let c = str[ptr];
403
- if (c === "[" || c === "{") {
404
- let [value, endPtr2] = c === "[" ? parseArray(str, ptr, depth, integersAsBigInt) : parseInlineTable(str, ptr, depth, integersAsBigInt);
405
- if (end) {
406
- endPtr2 = skipVoid(str, endPtr2);
407
- if (str[endPtr2] === ",")
408
- endPtr2++;
409
- else if (str[endPtr2] !== end) {
410
- throw new TomlError("expected comma or end of structure", {
411
- toml: str,
412
- ptr: endPtr2
413
- });
414
- }
415
- }
416
- return [value, endPtr2];
417
- }
418
- let endPtr;
419
- if (c === '"' || c === "'") {
420
- endPtr = getStringEnd(str, ptr);
421
- let parsed = parseString(str, ptr, endPtr);
422
- if (end) {
423
- endPtr = skipVoid(str, endPtr);
424
- if (str[endPtr] && str[endPtr] !== "," && str[endPtr] !== end && str[endPtr] !== "\n" && str[endPtr] !== "\r") {
425
- throw new TomlError("unexpected character encountered", {
426
- toml: str,
427
- ptr: endPtr
428
- });
429
- }
430
- endPtr += +(str[endPtr] === ",");
431
- }
432
- return [parsed, endPtr];
433
- }
434
- endPtr = skipUntil(str, ptr, ",", end);
435
- let slice = sliceAndTrimEndOf(str, ptr, endPtr - +(str[endPtr - 1] === ","));
436
- if (!slice[0]) {
437
- throw new TomlError("incomplete key-value declaration: no value specified", {
438
- toml: str,
439
- ptr
440
- });
441
- }
442
- if (end && slice[1] > -1) {
443
- endPtr = skipVoid(str, ptr + slice[1]);
444
- endPtr += +(str[endPtr] === ",");
445
- }
446
- return [
447
- parseValue(slice[0], str, ptr, integersAsBigInt),
448
- endPtr
449
- ];
450
- }
451
- var init_extract = __esm({
452
- "../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/extract.js"() {
453
- "use strict";
454
- init_primitive();
455
- init_struct();
456
- init_util();
457
- init_error();
458
- }
459
- });
460
-
461
- // ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js
462
- function parseKey(str, ptr, end = "=") {
463
- let dot = ptr - 1;
464
- let parsed = [];
465
- let endPtr = str.indexOf(end, ptr);
466
- if (endPtr < 0) {
467
- throw new TomlError("incomplete key-value: cannot find end of key", {
468
- toml: str,
469
- ptr
470
- });
471
- }
472
- do {
473
- let c = str[ptr = ++dot];
474
- if (c !== " " && c !== " ") {
475
- if (c === '"' || c === "'") {
476
- if (c === str[ptr + 1] && c === str[ptr + 2]) {
477
- throw new TomlError("multiline strings are not allowed in keys", {
478
- toml: str,
479
- ptr
480
- });
481
- }
482
- let eos = getStringEnd(str, ptr);
483
- if (eos < 0) {
484
- throw new TomlError("unfinished string encountered", {
485
- toml: str,
486
- ptr
487
- });
488
- }
489
- dot = str.indexOf(".", eos);
490
- let strEnd = str.slice(eos, dot < 0 || dot > endPtr ? endPtr : dot);
491
- let newLine = indexOfNewline(strEnd);
492
- if (newLine > -1) {
493
- throw new TomlError("newlines are not allowed in keys", {
494
- toml: str,
495
- ptr: ptr + dot + newLine
496
- });
497
- }
498
- if (strEnd.trimStart()) {
499
- throw new TomlError("found extra tokens after the string part", {
500
- toml: str,
501
- ptr: eos
502
- });
503
- }
504
- if (endPtr < eos) {
505
- endPtr = str.indexOf(end, eos);
506
- if (endPtr < 0) {
507
- throw new TomlError("incomplete key-value: cannot find end of key", {
508
- toml: str,
509
- ptr
510
- });
511
- }
512
- }
513
- parsed.push(parseString(str, ptr, eos));
514
- } else {
515
- dot = str.indexOf(".", ptr);
516
- let part = str.slice(ptr, dot < 0 || dot > endPtr ? endPtr : dot);
517
- if (!KEY_PART_RE.test(part)) {
518
- throw new TomlError("only letter, numbers, dashes and underscores are allowed in keys", {
519
- toml: str,
520
- ptr
521
- });
522
- }
523
- parsed.push(part.trimEnd());
524
- }
525
- }
526
- } while (dot + 1 && dot < endPtr);
527
- return [parsed, skipVoid(str, endPtr + 1, true, true)];
528
- }
529
- function parseInlineTable(str, ptr, depth, integersAsBigInt) {
530
- let res = {};
531
- let seen = /* @__PURE__ */ new Set();
532
- let c;
533
- ptr++;
534
- while ((c = str[ptr++]) !== "}" && c) {
535
- if (c === ",") {
536
- throw new TomlError("expected value, found comma", {
537
- toml: str,
538
- ptr: ptr - 1
539
- });
540
- } else if (c === "#")
541
- ptr = skipComment(str, ptr);
542
- else if (c !== " " && c !== " " && c !== "\n" && c !== "\r") {
543
- let k;
544
- let t = res;
545
- let hasOwn = false;
546
- let [key, keyEndPtr] = parseKey(str, ptr - 1);
547
- for (let i = 0; i < key.length; i++) {
548
- if (i)
549
- t = hasOwn ? t[k] : t[k] = {};
550
- k = key[i];
551
- if ((hasOwn = Object.hasOwn(t, k)) && (typeof t[k] !== "object" || seen.has(t[k]))) {
552
- throw new TomlError("trying to redefine an already defined value", {
553
- toml: str,
554
- ptr
555
- });
556
- }
557
- if (!hasOwn && k === "__proto__") {
558
- Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });
559
- }
560
- }
561
- if (hasOwn) {
562
- throw new TomlError("trying to redefine an already defined value", {
563
- toml: str,
564
- ptr
565
- });
566
- }
567
- let [value, valueEndPtr] = extractValue(str, keyEndPtr, "}", depth - 1, integersAsBigInt);
568
- seen.add(value);
569
- t[k] = value;
570
- ptr = valueEndPtr;
571
- }
572
- }
573
- if (!c) {
574
- throw new TomlError("unfinished table encountered", {
575
- toml: str,
576
- ptr
577
- });
578
- }
579
- return [res, ptr];
580
- }
581
- function parseArray(str, ptr, depth, integersAsBigInt) {
582
- let res = [];
583
- let c;
584
- ptr++;
585
- while ((c = str[ptr++]) !== "]" && c) {
586
- if (c === ",") {
587
- throw new TomlError("expected value, found comma", {
588
- toml: str,
589
- ptr: ptr - 1
590
- });
591
- } else if (c === "#")
592
- ptr = skipComment(str, ptr);
593
- else if (c !== " " && c !== " " && c !== "\n" && c !== "\r") {
594
- let e = extractValue(str, ptr - 1, "]", depth - 1, integersAsBigInt);
595
- res.push(e[0]);
596
- ptr = e[1];
597
- }
598
- }
599
- if (!c) {
600
- throw new TomlError("unfinished array encountered", {
601
- toml: str,
602
- ptr
603
- });
604
- }
605
- return [res, ptr];
606
- }
607
- var KEY_PART_RE;
608
- var init_struct = __esm({
609
- "../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/struct.js"() {
610
- "use strict";
611
- init_primitive();
612
- init_extract();
613
- init_util();
614
- init_error();
615
- KEY_PART_RE = /^[a-zA-Z0-9-_]+[ \t]*$/;
616
- }
617
- });
618
-
619
- // ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js
620
- function peekTable(key, table, meta, type) {
621
- let t = table;
622
- let m = meta;
623
- let k;
624
- let hasOwn = false;
625
- let state;
626
- for (let i = 0; i < key.length; i++) {
627
- if (i) {
628
- t = hasOwn ? t[k] : t[k] = {};
629
- m = (state = m[k]).c;
630
- if (type === 0 && (state.t === 1 || state.t === 2)) {
631
- return null;
632
- }
633
- if (state.t === 2) {
634
- let l = t.length - 1;
635
- t = t[l];
636
- m = m[l].c;
637
- }
638
- }
639
- k = key[i];
640
- if ((hasOwn = Object.hasOwn(t, k)) && m[k]?.t === 0 && m[k]?.d) {
641
- return null;
642
- }
643
- if (!hasOwn) {
644
- if (k === "__proto__") {
645
- Object.defineProperty(t, k, { enumerable: true, configurable: true, writable: true });
646
- Object.defineProperty(m, k, { enumerable: true, configurable: true, writable: true });
647
- }
648
- m[k] = {
649
- t: i < key.length - 1 && type === 2 ? 3 : type,
650
- d: false,
651
- i: 0,
652
- c: {}
653
- };
654
- }
655
- }
656
- state = m[k];
657
- if (state.t !== type && !(type === 1 && state.t === 3)) {
658
- return null;
659
- }
660
- if (type === 2) {
661
- if (!state.d) {
662
- state.d = true;
663
- t[k] = [];
664
- }
665
- t[k].push(t = {});
666
- state.c[state.i++] = state = { t: 1, d: false, i: 0, c: {} };
667
- }
668
- if (state.d) {
669
- return null;
670
- }
671
- state.d = true;
672
- if (type === 1) {
673
- t = hasOwn ? t[k] : t[k] = {};
674
- } else if (type === 0 && hasOwn) {
675
- return null;
676
- }
677
- return [k, t, state.c];
678
- }
679
- function parse(toml, { maxDepth = 1e3, integersAsBigInt } = {}) {
680
- let res = {};
681
- let meta = {};
682
- let tbl = res;
683
- let m = meta;
684
- for (let ptr = skipVoid(toml, 0); ptr < toml.length; ) {
685
- if (toml[ptr] === "[") {
686
- let isTableArray = toml[++ptr] === "[";
687
- let k = parseKey(toml, ptr += +isTableArray, "]");
688
- if (isTableArray) {
689
- if (toml[k[1] - 1] !== "]") {
690
- throw new TomlError("expected end of table declaration", {
691
- toml,
692
- ptr: k[1] - 1
693
- });
694
- }
695
- k[1]++;
696
- }
697
- let p = peekTable(
698
- k[0],
699
- res,
700
- meta,
701
- isTableArray ? 2 : 1
702
- /* Type.EXPLICIT */
703
- );
704
- if (!p) {
705
- throw new TomlError("trying to redefine an already defined table or value", {
706
- toml,
707
- ptr
708
- });
709
- }
710
- m = p[2];
711
- tbl = p[1];
712
- ptr = k[1];
713
- } else {
714
- let k = parseKey(toml, ptr);
715
- let p = peekTable(
716
- k[0],
717
- tbl,
718
- m,
719
- 0
720
- /* Type.DOTTED */
721
- );
722
- if (!p) {
723
- throw new TomlError("trying to redefine an already defined table or value", {
724
- toml,
725
- ptr
726
- });
727
- }
728
- let v = extractValue(toml, k[1], void 0, maxDepth, integersAsBigInt);
729
- p[1][p[0]] = v[0];
730
- ptr = v[1];
731
- }
732
- ptr = skipVoid(toml, ptr, true);
733
- if (toml[ptr] && toml[ptr] !== "\n" && toml[ptr] !== "\r") {
734
- throw new TomlError("each key-value declaration must be followed by an end-of-line", {
735
- toml,
736
- ptr
737
- });
738
- }
739
- ptr = skipVoid(toml, ptr);
740
- }
741
- return res;
742
- }
743
- var init_parse = __esm({
744
- "../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/parse.js"() {
745
- "use strict";
746
- init_struct();
747
- init_extract();
748
- init_util();
749
- init_error();
750
- }
751
- });
752
-
753
- // ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js
754
- var init_stringify = __esm({
755
- "../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/stringify.js"() {
756
- "use strict";
757
- }
758
- });
759
-
760
- // ../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/index.js
761
- var init_dist = __esm({
762
- "../../node_modules/.pnpm/smol-toml@1.6.0/node_modules/smol-toml/dist/index.js"() {
763
- "use strict";
764
- init_parse();
765
- init_stringify();
766
- init_date();
767
- init_error();
768
- }
769
- });
770
-
771
13
  // ../defi-core/dist/index.js
772
14
  var dist_exports = {};
773
15
  __export(dist_exports, {
@@ -803,6 +45,7 @@ import { encodeFunctionData as encodeFunctionData2, decodeFunctionResult, parseA
803
45
  import { readFileSync, readdirSync } from "fs";
804
46
  import { resolve } from "path";
805
47
  import { fileURLToPath } from "url";
48
+ import { parse } from "smol-toml";
806
49
  import { existsSync } from "fs";
807
50
  function formatHuman(t) {
808
51
  const divisor = 10n ** BigInt(t.decimals);
@@ -978,10 +221,9 @@ function readToml(relPath) {
978
221
  return readFileSync(resolve(CONFIG_DIR, relPath), "utf-8");
979
222
  }
980
223
  var TxStatus, InterestRateMode, DefiError, erc20Abi, providerCache, MULTICALL3_ADDRESS, multicall3Abi, ChainConfig, ProtocolCategory, __dirname, CONFIG_DIR, Registry;
981
- var init_dist2 = __esm({
224
+ var init_dist = __esm({
982
225
  "../defi-core/dist/index.js"() {
983
226
  "use strict";
984
- init_dist();
985
227
  TxStatus = /* @__PURE__ */ ((TxStatus2) => {
986
228
  TxStatus2["DryRun"] = "dry_run";
987
229
  TxStatus2["Simulated"] = "simulated";
@@ -1777,43 +1019,43 @@ function createKittenSwapFarming(entry, rpcUrl) {
1777
1019
  return new KittenSwapFarmingAdapter(entry.name, farmingCenter, eternalFarming, positionManager, rpcUrl, factory);
1778
1020
  }
1779
1021
  var DEFAULT_FEE, swapRouterAbi, quoterAbi, ramsesQuoterAbi, positionManagerAbi, UniswapV3Adapter, abi, lbQuoterAbi, UniswapV2Adapter, abi2, algebraQuoterAbi, algebraSingleQuoterAbi, algebraIntegralPmAbi, algebraV2PmAbi, AlgebraV3Adapter, abi3, BalancerV3Adapter, poolAbi, CurveStableSwapAdapter, abi4, abiV2, SolidlyAdapter, thenaPmAbi, thenaRouterAbi, thenaPoolAbi, thenaFactoryAbi, ThenaCLAdapter, _addressDecodeAbi, _symbolDecodeAbi, gaugeManagerAbi, gaugeCLAbi, nfpmAbi, veAbi, voterAbi, HybraGaugeAdapter, abi5, WooFiAdapter, gaugeAbi, veAbi2, voterAbi2, _addressDecodeAbi2, _symbolDecodeAbi2, _boolDecodeAbi, HYPEREVM_TOKENS, CL_TICK_SPACINGS, SolidlyGaugeAdapter, masterchefAbi, MasterChefAdapter, lbRouterAbi, lbFactoryAbi, lbPairAbi, lbRewarderAbi, masterChefAbi, veMoeAbi, lbPairBinAbi, lbQuoterAbi2, erc20Abi2, _addressAbi, _uint256Abi, _boolAbi, _rangeAbi, _binAbi, _uint256ArrayAbi, MerchantMoeLBAdapter, KITTEN_TOKEN, WHYPE_TOKEN, MAX_NONCE_SCAN, HYPEREVM_TOKENS2, farmingCenterAbi, positionManagerAbi2, eternalFarmingAbi, algebraFactoryAbi, _addressDecodeAbi3, nonceCache, KittenSwapFarmingAdapter, POOL_ABI, ERC20_ABI, INCENTIVES_ABI, REWARDS_CONTROLLER_ABI, POOL_PROVIDER_ABI, ADDRESSES_PROVIDER_ABI, ORACLE_ABI, ERC20_DECIMALS_ABI, AaveV3Adapter, POOL_ABI2, ERC20_ABI2, AaveV2Adapter, ORACLE_ABI2, AaveOracleAdapter, CTOKEN_ABI, BSC_BLOCKS_PER_YEAR, CompoundV2Adapter, COMET_ABI, SECONDS_PER_YEAR, CompoundV3Adapter, EULER_VAULT_ABI, SECONDS_PER_YEAR2, EulerV2Adapter, MORPHO_ABI, META_MORPHO_ABI, IRM_ABI, SECONDS_PER_YEAR3, MorphoBlueAdapter, BORROWER_OPS_ABI, TROVE_MANAGER_ABI, HINT_HELPERS_ABI, SORTED_TROVES_ABI, FelixCdpAdapter, PRICE_FEED_ABI, FelixOracleAdapter, ERC4626_ABI, ERC4626VaultAdapter, GENERIC_LST_ABI, GenericLstAdapter, STHYPE_ABI, ERC20_ABI3, StHypeAdapter, KINETIQ_ABI, ORACLE_ABI3, WHYPE, HYPERLEND_ORACLE, KinetiqAdapter, PendleAdapter, GenericYieldAdapter, HLP_ABI, HlpVaultAdapter, GenericDerivativesAdapter, RYSK_ABI, RyskAdapter, GenericOptionsAdapter, ERC721_ABI, ERC721Adapter, DexSpotPrice;
1780
- var init_dist3 = __esm({
1022
+ var init_dist2 = __esm({
1781
1023
  "../defi-protocols/dist/index.js"() {
1782
1024
  "use strict";
1783
- init_dist2();
1784
- init_dist2();
1785
- init_dist2();
1786
- init_dist2();
1787
- init_dist2();
1788
- init_dist2();
1789
- init_dist2();
1790
- init_dist2();
1791
- init_dist2();
1792
- init_dist2();
1793
- init_dist2();
1794
- init_dist2();
1795
- init_dist2();
1796
- init_dist2();
1797
- init_dist2();
1798
- init_dist2();
1799
- init_dist2();
1800
- init_dist2();
1801
- init_dist2();
1802
- init_dist2();
1803
- init_dist2();
1804
- init_dist2();
1805
- init_dist2();
1806
- init_dist2();
1807
- init_dist2();
1808
- init_dist2();
1809
- init_dist2();
1810
- init_dist2();
1811
- init_dist2();
1812
- init_dist2();
1813
- init_dist2();
1814
- init_dist2();
1815
- init_dist2();
1816
- init_dist2();
1025
+ init_dist();
1026
+ init_dist();
1027
+ init_dist();
1028
+ init_dist();
1029
+ init_dist();
1030
+ init_dist();
1031
+ init_dist();
1032
+ init_dist();
1033
+ init_dist();
1034
+ init_dist();
1035
+ init_dist();
1036
+ init_dist();
1037
+ init_dist();
1038
+ init_dist();
1039
+ init_dist();
1040
+ init_dist();
1041
+ init_dist();
1042
+ init_dist();
1043
+ init_dist();
1044
+ init_dist();
1045
+ init_dist();
1046
+ init_dist();
1047
+ init_dist();
1048
+ init_dist();
1049
+ init_dist();
1050
+ init_dist();
1051
+ init_dist();
1052
+ init_dist();
1053
+ init_dist();
1054
+ init_dist();
1055
+ init_dist();
1056
+ init_dist();
1057
+ init_dist();
1058
+ init_dist();
1817
1059
  DEFAULT_FEE = 3e3;
1818
1060
  swapRouterAbi = parseAbi3([
1819
1061
  "struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; }",
@@ -4070,7 +3312,8 @@ var init_dist3 = __esm({
4070
3312
  "function findBestPathFromAmountIn(address[] calldata route, uint128 amountIn) external view returns ((address[] route, address[] pairs, uint256[] binSteps, uint256[] versions, uint128[] amounts, uint128[] virtualAmountsWithoutSlippage, uint128[] fees))"
4071
3313
  ]);
4072
3314
  erc20Abi2 = parseAbi12([
4073
- "function symbol() external view returns (string)"
3315
+ "function symbol() external view returns (string)",
3316
+ "function balanceOf(address account) external view returns (uint256)"
4074
3317
  ]);
4075
3318
  _addressAbi = parseAbi12(["function f() external view returns (address)"]);
4076
3319
  _uint256Abi = parseAbi12(["function f() external view returns (uint256)"]);
@@ -4487,6 +3730,74 @@ var init_dist3 = __esm({
4487
3730
  } catch {
4488
3731
  }
4489
3732
  }
3733
+ const stableSymbols = /* @__PURE__ */ new Set(["USDT", "USDC", "USDT0", "MUSD", "AUSD", "USDY", "FDUSD", "USDe", "sUSDe"]);
3734
+ const mntSymbols = /* @__PURE__ */ new Set(["WMNT", "MNT"]);
3735
+ const moeSymbols = /* @__PURE__ */ new Set(["MOE"]);
3736
+ const sixDecimalStables = /* @__PURE__ */ new Set(["USDT", "USDC", "USDT0", "FDUSD"]);
3737
+ const tokenPriceMap = /* @__PURE__ */ new Map();
3738
+ const tokenDecimalsMap = /* @__PURE__ */ new Map();
3739
+ for (const [addr, sym] of symbolMap) {
3740
+ const key = addr.toLowerCase();
3741
+ if (stableSymbols.has(sym)) {
3742
+ tokenPriceMap.set(key, 1);
3743
+ tokenDecimalsMap.set(key, sixDecimalStables.has(sym) ? 6 : 18);
3744
+ } else if (mntSymbols.has(sym)) {
3745
+ tokenPriceMap.set(key, wmntPriceUsd);
3746
+ tokenDecimalsMap.set(key, 18);
3747
+ } else if (moeSymbols.has(sym)) {
3748
+ tokenPriceMap.set(key, moePriceUsd);
3749
+ tokenDecimalsMap.set(key, 18);
3750
+ }
3751
+ }
3752
+ const unknownTokenAddrs = [];
3753
+ for (let i = 0; i < rewardedPairs.length; i++) {
3754
+ for (const addr of [tokenXAddresses[i], tokenYAddresses[i]]) {
3755
+ if (addr && !tokenPriceMap.has(addr.toLowerCase())) {
3756
+ if (!unknownTokenAddrs.some((a) => a.toLowerCase() === addr.toLowerCase())) {
3757
+ unknownTokenAddrs.push(addr);
3758
+ }
3759
+ }
3760
+ }
3761
+ }
3762
+ if (unknownTokenAddrs.length > 0 && this.lbQuoter && this.wmnt && wmntPriceUsd > 0) {
3763
+ const erc20DecimalsAbi = parseAbi12(["function decimals() external view returns (uint8)"]);
3764
+ const decCalls = unknownTokenAddrs.map((addr) => [
3765
+ addr,
3766
+ encodeFunctionData12({ abi: erc20DecimalsAbi, functionName: "decimals" })
3767
+ ]);
3768
+ const decResults = await multicallRead(rpcUrl, decCalls).catch(() => []);
3769
+ for (let i = 0; i < unknownTokenAddrs.length; i++) {
3770
+ const dec = decResults[i] ? Number(decodeUint256Result(decResults[i]) ?? 18n) : 18;
3771
+ tokenDecimalsMap.set(unknownTokenAddrs[i].toLowerCase(), dec);
3772
+ }
3773
+ const quotePromises = unknownTokenAddrs.map(async (tokenAddr) => {
3774
+ try {
3775
+ const dec = tokenDecimalsMap.get(tokenAddr.toLowerCase()) ?? 18;
3776
+ const quoteUnit = 10n ** BigInt(Math.max(dec - 2, 0));
3777
+ const quote = await client.readContract({
3778
+ address: this.lbQuoter,
3779
+ abi: lbQuoterAbi2,
3780
+ functionName: "findBestPathFromAmountIn",
3781
+ args: [[tokenAddr, this.wmnt], quoteUnit]
3782
+ });
3783
+ const amountOut = quote.amounts?.at(-1) ?? 0n;
3784
+ const priceInWmnt = Number(amountOut) / 1e18 * (10 ** dec / Number(quoteUnit));
3785
+ return { addr: tokenAddr, price: priceInWmnt * wmntPriceUsd };
3786
+ } catch {
3787
+ return { addr: tokenAddr, price: 0 };
3788
+ }
3789
+ });
3790
+ const priceResults = await Promise.all(quotePromises);
3791
+ for (const { addr, price } of priceResults) {
3792
+ if (price > 0) tokenPriceMap.set(addr.toLowerCase(), price);
3793
+ }
3794
+ }
3795
+ const getTokenPriceUsd = (_sym, addr) => {
3796
+ return tokenPriceMap.get(addr.toLowerCase()) ?? 0;
3797
+ };
3798
+ const getTokenDecimals = (_sym, addr) => {
3799
+ return tokenDecimalsMap.get(addr.toLowerCase()) ?? 18;
3800
+ };
4490
3801
  const binRequests = [];
4491
3802
  for (let i = 0; i < rewardedPairs.length; i++) {
4492
3803
  const range = poolData[i].range;
@@ -4517,19 +3828,23 @@ var init_dist3 = __esm({
4517
3828
  binReservesY.get(poolIdx).set(binId, decoded[1]);
4518
3829
  }
4519
3830
  }
4520
- const stableSymbols = /* @__PURE__ */ new Set(["USDT", "USDC", "MUSD", "AUSD", "USDY", "FDUSD"]);
4521
- const mntSymbols = /* @__PURE__ */ new Set(["WMNT", "MNT"]);
4522
- const moeSymbols = /* @__PURE__ */ new Set(["MOE"]);
4523
- const sixDecimalStables = /* @__PURE__ */ new Set(["USDT", "USDC", "FDUSD"]);
4524
- const getTokenPriceUsd = (sym) => {
4525
- if (stableSymbols.has(sym)) return 1;
4526
- if (mntSymbols.has(sym)) return wmntPriceUsd;
4527
- if (moeSymbols.has(sym)) return moePriceUsd;
4528
- return 0;
4529
- };
4530
- const getTokenDecimals = (sym) => {
4531
- return sixDecimalStables.has(sym) ? 6 : 18;
4532
- };
3831
+ const poolBalanceX = /* @__PURE__ */ new Map();
3832
+ const poolBalanceY = /* @__PURE__ */ new Map();
3833
+ {
3834
+ const balCalls = [];
3835
+ for (let i = 0; i < rewardedPairs.length; i++) {
3836
+ const tx = tokenXAddresses[i];
3837
+ const ty = tokenYAddresses[i];
3838
+ const pool = rewardedPairs[i].pool;
3839
+ balCalls.push([tx ?? "0x0000000000000000000000000000000000000000", encodeFunctionData12({ abi: erc20Abi2, functionName: "balanceOf", args: [pool] })]);
3840
+ balCalls.push([ty ?? "0x0000000000000000000000000000000000000000", encodeFunctionData12({ abi: erc20Abi2, functionName: "balanceOf", args: [pool] })]);
3841
+ }
3842
+ const balResults = await multicallRead(rpcUrl, balCalls).catch(() => []);
3843
+ for (let i = 0; i < rewardedPairs.length; i++) {
3844
+ poolBalanceX.set(i, decodeUint256Result(balResults[i * 2] ?? null) ?? 0n);
3845
+ poolBalanceY.set(i, decodeUint256Result(balResults[i * 2 + 1] ?? null) ?? 0n);
3846
+ }
3847
+ }
4533
3848
  const results = [];
4534
3849
  for (let i = 0; i < rewardedPairs.length; i++) {
4535
3850
  const { pool, rewarder } = rewardedPairs[i];
@@ -4554,18 +3869,25 @@ var init_dist3 = __esm({
4554
3869
  const maxBin = Number(range[1]);
4555
3870
  rewardedBins = maxBin - minBin + 1;
4556
3871
  if (rxMap && ryMap) {
4557
- const priceX = getTokenPriceUsd(symX);
4558
- const priceY = getTokenPriceUsd(symY);
4559
- const decX = getTokenDecimals(symX);
4560
- const decY = getTokenDecimals(symY);
3872
+ const priceX2 = getTokenPriceUsd(symX, tokenX);
3873
+ const priceY2 = getTokenPriceUsd(symY, tokenY);
3874
+ const decX2 = getTokenDecimals(symX, tokenX);
3875
+ const decY2 = getTokenDecimals(symY, tokenY);
4561
3876
  for (let b = minBin; b <= maxBin; b++) {
4562
3877
  const rx = rxMap.get(b) ?? 0n;
4563
3878
  const ry = ryMap.get(b) ?? 0n;
4564
- rangeTvlUsd += Number(rx) / 10 ** decX * priceX;
4565
- rangeTvlUsd += Number(ry) / 10 ** decY * priceY;
3879
+ rangeTvlUsd += Number(rx) / 10 ** decX2 * priceX2;
3880
+ rangeTvlUsd += Number(ry) / 10 ** decY2 * priceY2;
4566
3881
  }
4567
3882
  }
4568
3883
  }
3884
+ const priceX = getTokenPriceUsd(symX, tokenX);
3885
+ const priceY = getTokenPriceUsd(symY, tokenY);
3886
+ const decX = getTokenDecimals(symX, tokenX);
3887
+ const decY = getTokenDecimals(symY, tokenY);
3888
+ const fullBalX = poolBalanceX.get(i) ?? 0n;
3889
+ const fullBalY = poolBalanceY.get(i) ?? 0n;
3890
+ const poolTvlUsd = Number(fullBalX) / 10 ** decX * priceX + Number(fullBalY) / 10 ** decY * priceY;
4569
3891
  const aprPercent = rangeTvlUsd > 0 && moePriceUsd > 0 ? poolMoePerDay * moePriceUsd * 365 / rangeTvlUsd * 100 : 0;
4570
3892
  results.push({
4571
3893
  pool,
@@ -4582,8 +3904,11 @@ var init_dist3 = __esm({
4582
3904
  isTopPool,
4583
3905
  moePerDay: poolMoePerDay,
4584
3906
  rangeTvlUsd,
3907
+ poolTvlUsd,
4585
3908
  aprPercent,
4586
- rewardedBins
3909
+ rewardedBins,
3910
+ totalMoePerDay: moePerDay,
3911
+ moePriceUsd
4587
3912
  });
4588
3913
  }
4589
3914
  return results;
@@ -6892,8 +6217,8 @@ var init_dist3 = __esm({
6892
6217
  });
6893
6218
 
6894
6219
  // src/mcp-server.ts
6220
+ init_dist();
6895
6221
  init_dist2();
6896
- init_dist3();
6897
6222
  import "dotenv/config";
6898
6223
  import { createRequire } from "module";
6899
6224
  import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
@@ -6901,8 +6226,8 @@ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"
6901
6226
  import { z } from "zod";
6902
6227
 
6903
6228
  // src/executor.ts
6904
- init_dist2();
6905
- init_dist2();
6229
+ init_dist();
6230
+ init_dist();
6906
6231
  import { createPublicClient as createPublicClient23, createWalletClient, http as http23, parseAbi as parseAbi30, encodeFunctionData as encodeFunctionData27 } from "viem";
6907
6232
  import { privateKeyToAccount } from "viem/accounts";
6908
6233
  var ERC20_ABI4 = parseAbi30([
@@ -7625,6 +6950,277 @@ server.tool(
7625
6950
  }
7626
6951
  }
7627
6952
  );
6953
+ server.tool(
6954
+ "defi_swap",
6955
+ "Swap tokens via DEX aggregator (KyberSwap or OpenOcean). Finds the best route automatically. Defaults to dry-run. Set broadcast=true to send transaction (requires DEFI_PRIVATE_KEY)",
6956
+ {
6957
+ chain: z.string().optional().describe("Chain name (default: hyperevm)"),
6958
+ token_in: z.string().describe("Input token symbol (e.g. WHYPE) or address (0x...)"),
6959
+ token_out: z.string().describe("Output token symbol (e.g. USDC) or address (0x...)"),
6960
+ amount_in: z.string().describe("Amount of input token in wei (as string)"),
6961
+ slippage_bps: z.number().optional().describe("Slippage tolerance in basis points (default: 50 = 0.5%)"),
6962
+ provider: z.enum(["kyber", "openocean"]).optional().describe("Aggregator to use: kyber (default) or openocean"),
6963
+ broadcast: z.boolean().optional().describe("Set true to broadcast the transaction (default: false = dry run)")
6964
+ },
6965
+ async ({ chain, token_in, token_out, amount_in, slippage_bps, provider, broadcast }) => {
6966
+ try {
6967
+ const chainName = (chain ?? "hyperevm").toLowerCase();
6968
+ const registry = getRegistry();
6969
+ const chainConfig = registry.getChain(chainName);
6970
+ const rpcUrl = chainConfig.effectiveRpcUrl();
6971
+ const fromAddr = token_in.startsWith("0x") ? token_in : registry.resolveToken(chainName, token_in).address;
6972
+ const toAddr = token_out.startsWith("0x") ? token_out : registry.resolveToken(chainName, token_out).address;
6973
+ const wallet = process.env["DEFI_WALLET_ADDRESS"] ?? "0x0000000000000000000000000000000000000001";
6974
+ const slippage = slippage_bps ?? 50;
6975
+ const agg = provider ?? "kyber";
6976
+ const KYBER_API = "https://aggregator-api.kyberswap.com";
6977
+ const OPENOCEAN_API = "https://open-api.openocean.finance/v4";
6978
+ let txParams;
6979
+ if (agg === "kyber") {
6980
+ const CHAIN_KYBER = { hyperevm: "hyperevm", mantle: "mantle" };
6981
+ const kyberChain = CHAIN_KYBER[chainName];
6982
+ if (!kyberChain) throw new Error(`KyberSwap: unsupported chain '${chainName}'`);
6983
+ const qparams = new URLSearchParams({ tokenIn: fromAddr, tokenOut: toAddr, amountIn: amount_in });
6984
+ const qres = await fetch(`${KYBER_API}/${kyberChain}/api/v1/routes?${qparams}`, {
6985
+ headers: { "x-client-id": "defi-cli" }
6986
+ });
6987
+ if (!qres.ok) throw new Error(`KyberSwap quote failed: ${qres.status}`);
6988
+ const qjson = await qres.json();
6989
+ const qdata = qjson.data;
6990
+ if (!qdata?.routeSummary) throw new Error("KyberSwap: no route found");
6991
+ const routeSummary = qdata.routeSummary;
6992
+ const amountOut = String(routeSummary.amountOut ?? "0");
6993
+ const bres = await fetch(`${KYBER_API}/${kyberChain}/api/v1/route/build`, {
6994
+ method: "POST",
6995
+ headers: { "Content-Type": "application/json", "x-client-id": "defi-cli" },
6996
+ body: JSON.stringify({ routeSummary, sender: wallet, recipient: wallet, slippageTolerance: slippage })
6997
+ });
6998
+ if (!bres.ok) throw new Error(`KyberSwap build failed: ${bres.status}`);
6999
+ const bjson = await bres.json();
7000
+ const bdata = bjson.data;
7001
+ if (!bdata) throw new Error("KyberSwap: no build data");
7002
+ txParams = {
7003
+ to: String(bdata.routerAddress),
7004
+ data: String(bdata.data),
7005
+ value: String(bdata.value ?? "0x0"),
7006
+ amountOut
7007
+ };
7008
+ } else {
7009
+ const CHAIN_OO = { hyperevm: "hyperevm", mantle: "mantle" };
7010
+ const ooChain = CHAIN_OO[chainName] ?? chainName;
7011
+ const humanAmount = (BigInt(amount_in) / BigInt(10 ** 18)).toString();
7012
+ const ooParams = new URLSearchParams({
7013
+ inTokenAddress: fromAddr,
7014
+ outTokenAddress: toAddr,
7015
+ amount: humanAmount,
7016
+ gasPrice: "0.1",
7017
+ slippage: String(slippage / 100),
7018
+ account: wallet
7019
+ });
7020
+ const ores = await fetch(`${OPENOCEAN_API}/${ooChain}/swap?${ooParams}`);
7021
+ if (!ores.ok) throw new Error(`OpenOcean swap failed: ${ores.status}`);
7022
+ const ojson = await ores.json();
7023
+ const odata = ojson.data;
7024
+ if (!odata) throw new Error("OpenOcean: no swap data");
7025
+ txParams = {
7026
+ to: String(odata.to),
7027
+ data: String(odata.data),
7028
+ value: String(odata.value ?? "0"),
7029
+ amountOut: String(odata.outAmount ?? "0")
7030
+ };
7031
+ }
7032
+ const tx = {
7033
+ description: `${agg === "kyber" ? "KyberSwap" : "OpenOcean"}: swap ${amount_in} ${token_in} -> ${token_out}`,
7034
+ to: txParams.to,
7035
+ data: txParams.data,
7036
+ value: txParams.value.startsWith("0x") ? BigInt(txParams.value) : BigInt(txParams.value || 0),
7037
+ approvals: [{ token: fromAddr, spender: txParams.to, amount: BigInt(amount_in) }]
7038
+ };
7039
+ const executor = makeExecutor(broadcast ?? false, rpcUrl, chainConfig.explorer_url);
7040
+ const result = await executor.execute(tx);
7041
+ return {
7042
+ content: [{
7043
+ type: "text",
7044
+ text: ok(
7045
+ { ...result, amount_out: txParams.amountOut, provider: agg },
7046
+ { chain: chainName, token_in, token_out, broadcast: broadcast ?? false }
7047
+ )
7048
+ }]
7049
+ };
7050
+ } catch (e) {
7051
+ return { content: [{ type: "text", text: err(e instanceof Error ? e.message : String(e), { token_in, token_out }) }], isError: true };
7052
+ }
7053
+ }
7054
+ );
7055
+ server.tool(
7056
+ "defi_lp_discover",
7057
+ "Scan all protocols on a chain for fee and emission pools (gauges, farming, Liquidity Book rewards). Returns up to 134 pools on HyperEVM.",
7058
+ {
7059
+ chain: z.string().optional().describe("Chain name (default: hyperevm)"),
7060
+ protocol: z.string().optional().describe("Filter to a single protocol slug (optional)"),
7061
+ emission_only: z.boolean().optional().describe("Only show emission pools (gauge/farming), skip fee-only pools")
7062
+ },
7063
+ async ({ chain, protocol, emission_only }) => {
7064
+ try {
7065
+ const chainName = (chain ?? "hyperevm").toLowerCase();
7066
+ const registry = getRegistry();
7067
+ const chainConfig = registry.getChain(chainName);
7068
+ const rpcUrl = chainConfig.effectiveRpcUrl();
7069
+ const { createGauge: createGauge2, createKittenSwapFarming: createKittenSwapFarming2, createMerchantMoeLB: createMerchantMoeLB2 } = await Promise.resolve().then(() => (init_dist2(), dist_exports2));
7070
+ const allProtocols = registry.getProtocolsForChain(chainName);
7071
+ const protocols = protocol ? [registry.getProtocol(protocol)] : allProtocols;
7072
+ const results = [];
7073
+ await Promise.allSettled(
7074
+ protocols.map(async (p) => {
7075
+ try {
7076
+ if (["solidly_v2", "solidly_cl", "algebra_v3", "hybra"].includes(p.interface)) {
7077
+ const adapter = createGauge2(p, rpcUrl);
7078
+ if (adapter.discoverGaugedPools) {
7079
+ const pools = await adapter.discoverGaugedPools();
7080
+ for (const pool of pools) {
7081
+ results.push({
7082
+ protocol: p.slug,
7083
+ pool: pool.pool,
7084
+ pair: `${pool.token0}/${pool.token1}`,
7085
+ type: "EMISSION",
7086
+ source: "gauge"
7087
+ });
7088
+ }
7089
+ }
7090
+ }
7091
+ if (p.interface === "algebra_v3" && p.contracts?.["farming_center"]) {
7092
+ const adapter = createKittenSwapFarming2(p, rpcUrl);
7093
+ const pools = await adapter.discoverFarmingPools();
7094
+ for (const pool of pools) {
7095
+ results.push({
7096
+ protocol: p.slug,
7097
+ pool: pool.pool,
7098
+ type: "EMISSION",
7099
+ source: "farming",
7100
+ active: pool.active
7101
+ });
7102
+ }
7103
+ }
7104
+ if (p.interface === "uniswap_v2" && p.contracts?.["lb_factory"]) {
7105
+ const adapter = createMerchantMoeLB2(p, rpcUrl);
7106
+ const pools = await adapter.discoverRewardedPools();
7107
+ for (const pool of pools) {
7108
+ if (emission_only && pool.stopped) continue;
7109
+ results.push({
7110
+ protocol: p.slug,
7111
+ pool: pool.pool,
7112
+ pair: `${pool.symbolX}/${pool.symbolY}`,
7113
+ type: "EMISSION",
7114
+ source: "lb_hooks",
7115
+ active: !pool.stopped,
7116
+ apr: pool.aprPercent ? `${pool.aprPercent}%` : void 0
7117
+ });
7118
+ }
7119
+ }
7120
+ } catch {
7121
+ }
7122
+ })
7123
+ );
7124
+ const filtered = emission_only ? results.filter((r) => r.type === "EMISSION") : results;
7125
+ return {
7126
+ content: [{
7127
+ type: "text",
7128
+ text: ok(
7129
+ { chain: chainName, pools: filtered, total: filtered.length },
7130
+ { scanned_protocols: protocols.length }
7131
+ )
7132
+ }]
7133
+ };
7134
+ } catch (e) {
7135
+ return { content: [{ type: "text", text: err(e instanceof Error ? e.message : String(e)) }], isError: true };
7136
+ }
7137
+ }
7138
+ );
7139
+ server.tool(
7140
+ "defi_lp_autopilot",
7141
+ "Generate an LP autopilot allocation plan from the whitelisted pools in ~/.defi/pools.toml. Returns a dry-run plan with budget splits per pool. Always runs as dry-run (read-only).",
7142
+ {
7143
+ chain: z.string().optional().describe("Chain name (default: hyperevm)"),
7144
+ budget_usd: z.number().describe("Total budget in USD to allocate across whitelisted pools")
7145
+ },
7146
+ async ({ chain, budget_usd }) => {
7147
+ try {
7148
+ const chainName = (chain ?? "hyperevm").toLowerCase();
7149
+ if (budget_usd <= 0) throw new Error("budget_usd must be greater than 0");
7150
+ const { readFileSync: readFileSync2, existsSync: existsSync2 } = await import("fs");
7151
+ const { homedir } = await import("os");
7152
+ const { join } = await import("path");
7153
+ const whitelistPath = join(homedir(), ".defi", "pools.toml");
7154
+ if (!existsSync2(whitelistPath)) {
7155
+ return {
7156
+ content: [{
7157
+ type: "text",
7158
+ text: err(
7159
+ `No whitelist found at ${whitelistPath}. Create it with [[pools]] entries (see defi-cli README).`,
7160
+ { path: whitelistPath }
7161
+ )
7162
+ }],
7163
+ isError: true
7164
+ };
7165
+ }
7166
+ const raw = readFileSync2(whitelistPath, "utf8");
7167
+ const entries = [];
7168
+ let current = null;
7169
+ for (const line of raw.split("\n")) {
7170
+ const trimmed = line.trim();
7171
+ if (trimmed === "[[pools]]") {
7172
+ if (current) entries.push(current);
7173
+ current = {};
7174
+ } else if (current && trimmed.includes("=")) {
7175
+ const [k, ...rest] = trimmed.split("=");
7176
+ const key = k.trim();
7177
+ const val = rest.join("=").trim().replace(/^"|"$/g, "");
7178
+ if (key === "weight") {
7179
+ current[key] = parseFloat(val);
7180
+ } else {
7181
+ current[key] = val;
7182
+ }
7183
+ }
7184
+ }
7185
+ if (current) entries.push(current);
7186
+ const chainFiltered = entries.filter((e) => !e.chain || e.chain.toLowerCase() === chainName);
7187
+ if (chainFiltered.length === 0) {
7188
+ throw new Error(`No whitelisted pools for chain '${chainName}' in ${whitelistPath}`);
7189
+ }
7190
+ const totalWeight = chainFiltered.reduce((s, e) => s + (e.weight ?? 1), 0);
7191
+ const plan = chainFiltered.map((e) => {
7192
+ const weight = e.weight ?? 1;
7193
+ const alloc = weight / totalWeight * budget_usd;
7194
+ return {
7195
+ protocol: e.protocol ?? "unknown",
7196
+ pool_address: e.pool_address ?? "unknown",
7197
+ type: e.type ?? "lp",
7198
+ asset: e.asset,
7199
+ weight,
7200
+ weight_pct: Math.round(weight / totalWeight * 1e4) / 100,
7201
+ allocated_usd: Math.round(alloc * 100) / 100
7202
+ };
7203
+ });
7204
+ return {
7205
+ content: [{
7206
+ type: "text",
7207
+ text: ok(
7208
+ {
7209
+ chain: chainName,
7210
+ budget_usd,
7211
+ plan,
7212
+ total_pools: plan.length,
7213
+ note: "This is a dry-run plan. Use the defi CLI with --broadcast to execute."
7214
+ },
7215
+ { whitelist_path: whitelistPath }
7216
+ )
7217
+ }]
7218
+ };
7219
+ } catch (e) {
7220
+ return { content: [{ type: "text", text: err(e instanceof Error ? e.message : String(e)) }], isError: true };
7221
+ }
7222
+ }
7223
+ );
7628
7224
  server.tool(
7629
7225
  "defi_price",
7630
7226
  "Query asset price from on-chain oracles (Aave V3) and/or DEX spot prices",
@@ -7654,8 +7250,8 @@ server.tool(
7654
7250
  } catch (e) {
7655
7251
  return { content: [{ type: "text", text: err(`Could not resolve asset: ${asset}`) }], isError: true };
7656
7252
  }
7657
- const { ProtocolCategory: ProtocolCategory2 } = await Promise.resolve().then(() => (init_dist2(), dist_exports));
7658
- const { createOracleFromLending: createOracleFromLending2 } = await Promise.resolve().then(() => (init_dist3(), dist_exports2));
7253
+ const { ProtocolCategory: ProtocolCategory2 } = await Promise.resolve().then(() => (init_dist(), dist_exports));
7254
+ const { createOracleFromLending: createOracleFromLending2 } = await Promise.resolve().then(() => (init_dist2(), dist_exports2));
7659
7255
  const prices = [];
7660
7256
  if (srcMode === "all" || srcMode === "oracle") {
7661
7257
  const lendingProtos = registry.getProtocolsForChain(chainName).filter((p) => p.category === ProtocolCategory2.Lending);
@@ -7669,7 +7265,7 @@ server.tool(
7669
7265
  }));
7670
7266
  }
7671
7267
  if (srcMode === "all" || srcMode === "dex") {
7672
- const { DexSpotPrice: DexSpotPrice2 } = await Promise.resolve().then(() => (init_dist3(), dist_exports2));
7268
+ const { DexSpotPrice: DexSpotPrice2 } = await Promise.resolve().then(() => (init_dist2(), dist_exports2));
7673
7269
  const USDC_SYMBOL = "USDC";
7674
7270
  let usdcAddr;
7675
7271
  let usdcDecimals = 6;
@@ -7733,8 +7329,8 @@ server.tool(
7733
7329
  const registry = getRegistry();
7734
7330
  const chainConfig = registry.getChain(chainName);
7735
7331
  const rpcUrl = chainConfig.effectiveRpcUrl();
7736
- const { ProtocolCategory: ProtocolCategory2 } = await Promise.resolve().then(() => (init_dist2(), dist_exports));
7737
- const { createOracleFromLending: createOracleFromLending2, DexSpotPrice: DexSpotPrice2 } = await Promise.resolve().then(() => (init_dist3(), dist_exports2));
7332
+ const { ProtocolCategory: ProtocolCategory2 } = await Promise.resolve().then(() => (init_dist(), dist_exports));
7333
+ const { createOracleFromLending: createOracleFromLending2, DexSpotPrice: DexSpotPrice2 } = await Promise.resolve().then(() => (init_dist2(), dist_exports2));
7738
7334
  const tokens = registry.tokens.get(chainName) ?? [];
7739
7335
  const lendingProtos = registry.getProtocolsForChain(chainName).filter((p) => p.category === ProtocolCategory2.Lending);
7740
7336
  const dexProtos = registry.getProtocolsForChain(chainName).filter((p) => p.category === ProtocolCategory2.Dex);
@@ -7817,8 +7413,8 @@ server.tool(
7817
7413
  const chainConfig = registry.getChain(chainName);
7818
7414
  const rpcUrl = chainConfig.effectiveRpcUrl();
7819
7415
  const user = address;
7820
- const { ProtocolCategory: ProtocolCategory2, multicallRead: multicallRead2 } = await Promise.resolve().then(() => (init_dist2(), dist_exports));
7821
- const { createLending: _createLending } = await Promise.resolve().then(() => (init_dist3(), dist_exports2));
7416
+ const { ProtocolCategory: ProtocolCategory2, multicallRead: multicallRead2 } = await Promise.resolve().then(() => (init_dist(), dist_exports));
7417
+ const { createLending: _createLending } = await Promise.resolve().then(() => (init_dist2(), dist_exports2));
7822
7418
  const { encodeFunctionData: encodeFunctionData28, parseAbi: parseAbi31 } = await import("viem");
7823
7419
  const POOL_ABI3 = parseAbi31([
7824
7420
  "function getUserAccountData(address user) external view returns (uint256 totalCollateralBase, uint256 totalDebtBase, uint256 availableBorrowsBase, uint256 currentLiquidationThreshold, uint256 ltv, uint256 healthFactor)"
@@ -7875,43 +7471,4 @@ server.tool(
7875
7471
  );
7876
7472
  var transport = new StdioServerTransport();
7877
7473
  await server.connect(transport);
7878
- /*! Bundled license information:
7879
-
7880
- smol-toml/dist/error.js:
7881
- smol-toml/dist/util.js:
7882
- smol-toml/dist/date.js:
7883
- smol-toml/dist/primitive.js:
7884
- smol-toml/dist/extract.js:
7885
- smol-toml/dist/struct.js:
7886
- smol-toml/dist/parse.js:
7887
- smol-toml/dist/stringify.js:
7888
- smol-toml/dist/index.js:
7889
- (*!
7890
- * Copyright (c) Squirrel Chat et al., All rights reserved.
7891
- * SPDX-License-Identifier: BSD-3-Clause
7892
- *
7893
- * Redistribution and use in source and binary forms, with or without
7894
- * modification, are permitted provided that the following conditions are met:
7895
- *
7896
- * 1. Redistributions of source code must retain the above copyright notice, this
7897
- * list of conditions and the following disclaimer.
7898
- * 2. Redistributions in binary form must reproduce the above copyright notice,
7899
- * this list of conditions and the following disclaimer in the
7900
- * documentation and/or other materials provided with the distribution.
7901
- * 3. Neither the name of the copyright holder nor the names of its contributors
7902
- * may be used to endorse or promote products derived from this software without
7903
- * specific prior written permission.
7904
- *
7905
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
7906
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
7907
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
7908
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
7909
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
7910
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
7911
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
7912
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
7913
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
7914
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
7915
- *)
7916
- */
7917
7474
  //# sourceMappingURL=mcp-server.js.map