@0xwh1sker/mantle-cli 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +43 -0
  3. package/dist/commands/account.d.ts +3 -0
  4. package/dist/commands/account.d.ts.map +1 -0
  5. package/dist/commands/account.js +96 -0
  6. package/dist/commands/account.js.map +1 -0
  7. package/dist/commands/catalog.d.ts +3 -0
  8. package/dist/commands/catalog.d.ts.map +1 -0
  9. package/dist/commands/catalog.js +93 -0
  10. package/dist/commands/catalog.js.map +1 -0
  11. package/dist/commands/chain.d.ts +3 -0
  12. package/dist/commands/chain.d.ts.map +1 -0
  13. package/dist/commands/chain.js +65 -0
  14. package/dist/commands/chain.js.map +1 -0
  15. package/dist/commands/defi-aave.d.ts +11 -0
  16. package/dist/commands/defi-aave.d.ts.map +1 -0
  17. package/dist/commands/defi-aave.js +216 -0
  18. package/dist/commands/defi-aave.js.map +1 -0
  19. package/dist/commands/defi-lp.d.ts +13 -0
  20. package/dist/commands/defi-lp.d.ts.map +1 -0
  21. package/dist/commands/defi-lp.js +496 -0
  22. package/dist/commands/defi-lp.js.map +1 -0
  23. package/dist/commands/defi-swap.d.ts +11 -0
  24. package/dist/commands/defi-swap.d.ts.map +1 -0
  25. package/dist/commands/defi-swap.js +206 -0
  26. package/dist/commands/defi-swap.js.map +1 -0
  27. package/dist/commands/defi.d.ts +3 -0
  28. package/dist/commands/defi.d.ts.map +1 -0
  29. package/dist/commands/defi.js +358 -0
  30. package/dist/commands/defi.js.map +1 -0
  31. package/dist/commands/diagnostics.d.ts +3 -0
  32. package/dist/commands/diagnostics.d.ts.map +1 -0
  33. package/dist/commands/diagnostics.js +76 -0
  34. package/dist/commands/diagnostics.js.map +1 -0
  35. package/dist/commands/indexer.d.ts +3 -0
  36. package/dist/commands/indexer.d.ts.map +1 -0
  37. package/dist/commands/indexer.js +92 -0
  38. package/dist/commands/indexer.js.map +1 -0
  39. package/dist/commands/registry.d.ts +3 -0
  40. package/dist/commands/registry.d.ts.map +1 -0
  41. package/dist/commands/registry.js +76 -0
  42. package/dist/commands/registry.js.map +1 -0
  43. package/dist/commands/token.d.ts +3 -0
  44. package/dist/commands/token.d.ts.map +1 -0
  45. package/dist/commands/token.js +100 -0
  46. package/dist/commands/token.js.map +1 -0
  47. package/dist/formatter.d.ts +20 -0
  48. package/dist/formatter.d.ts.map +1 -0
  49. package/dist/formatter.js +98 -0
  50. package/dist/formatter.js.map +1 -0
  51. package/dist/index.d.ts +3 -0
  52. package/dist/index.d.ts.map +1 -0
  53. package/dist/index.js +76 -0
  54. package/dist/index.js.map +1 -0
  55. package/dist/utils.d.ts +7 -0
  56. package/dist/utils.d.ts.map +1 -0
  57. package/dist/utils.js +62 -0
  58. package/dist/utils.js.map +1 -0
  59. package/package.json +43 -0
@@ -0,0 +1,76 @@
1
+ import { allTools } from "@0xwh1sker/mantle-core/tools/index.js";
2
+ import { formatKeyValue, formatJson } from "../formatter.js";
3
+ import { parseJsonArray } from "../utils.js";
4
+ export function registerDiagnostics(parent) {
5
+ const group = parent.command("diagnostics").description("RPC health and probing");
6
+ group
7
+ .command("rpc-health")
8
+ .description("Check RPC endpoint health and chain-id consistency")
9
+ .option("--rpc-url <url>", "RPC URL to test (defaults to configured endpoint)")
10
+ .action(async (opts, cmd) => {
11
+ const globals = cmd.optsWithGlobals();
12
+ const result = await allTools["mantle_checkRpcHealth"].handler({
13
+ rpc_url: opts.rpcUrl ?? globals.rpcUrl,
14
+ network: globals.network
15
+ });
16
+ if (globals.json) {
17
+ formatJson(result);
18
+ }
19
+ else {
20
+ const data = result;
21
+ formatKeyValue(data, {
22
+ order: [
23
+ "endpoint", "reachable", "chain_id", "chain_id_matches",
24
+ "block_number", "latency_ms", "error", "checked_at_utc"
25
+ ],
26
+ labels: {
27
+ endpoint: "Endpoint",
28
+ reachable: "Reachable",
29
+ chain_id: "Chain ID",
30
+ chain_id_matches: "Chain ID Matches",
31
+ block_number: "Block",
32
+ latency_ms: "Latency (ms)",
33
+ error: "Error",
34
+ checked_at_utc: "Checked At"
35
+ }
36
+ });
37
+ }
38
+ });
39
+ group
40
+ .command("probe")
41
+ .description("Probe a JSON-RPC endpoint with a minimal method call")
42
+ .option("--rpc-url <url>", "RPC endpoint to probe")
43
+ .option("--method <method>", "RPC method (eth_chainId, eth_blockNumber, eth_getBalance)", "eth_blockNumber")
44
+ .option("--params <json>", "optional method params as JSON array")
45
+ .action(async (opts, cmd) => {
46
+ const globals = cmd.optsWithGlobals();
47
+ const params = opts.params
48
+ ? parseJsonArray(opts.params, "params")
49
+ : undefined;
50
+ const result = await allTools["mantle_probeEndpoint"].handler({
51
+ rpc_url: opts.rpcUrl ?? globals.rpcUrl,
52
+ method: opts.method,
53
+ params,
54
+ network: globals.network
55
+ });
56
+ if (globals.json) {
57
+ formatJson(result);
58
+ }
59
+ else {
60
+ const data = result;
61
+ formatKeyValue(data, {
62
+ order: ["endpoint", "method", "success", "result", "error", "latency_ms", "probed_at_utc"],
63
+ labels: {
64
+ endpoint: "Endpoint",
65
+ method: "Method",
66
+ success: "Success",
67
+ result: "Result",
68
+ error: "Error",
69
+ latency_ms: "Latency (ms)",
70
+ probed_at_utc: "Probed At"
71
+ }
72
+ });
73
+ }
74
+ });
75
+ }
76
+ //# sourceMappingURL=diagnostics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/commands/diagnostics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerIndexer(parent: Command): void;
3
+ //# sourceMappingURL=indexer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.d.ts","sourceRoot":"","sources":["../../src/commands/indexer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,eAAe,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAiGrD"}
@@ -0,0 +1,92 @@
1
+ import { allTools } from "@0xwh1sker/mantle-core/tools/index.js";
2
+ import { formatTable, formatJson, formatKeyValue } from "../formatter.js";
3
+ import { parseIntegerOption, parseJsonString } from "../utils.js";
4
+ export function registerIndexer(parent) {
5
+ const group = parent.command("indexer").description("Subgraph and SQL queries");
6
+ group
7
+ .command("subgraph")
8
+ .description("Run GraphQL query against a Mantle indexer")
9
+ .requiredOption("--endpoint <url>", "GraphQL endpoint URL")
10
+ .requiredOption("--query <graphql>", "GraphQL query document")
11
+ .option("--variables <json>", "optional GraphQL variables as JSON string")
12
+ .option("--timeout <ms>", "request timeout in milliseconds", (value) => parseIntegerOption(value, "--timeout"))
13
+ .action(async (opts, cmd) => {
14
+ const globals = cmd.optsWithGlobals();
15
+ const variables = opts.variables
16
+ ? parseJsonString(opts.variables, "variables")
17
+ : undefined;
18
+ const result = await allTools["mantle_querySubgraph"].handler({
19
+ endpoint: opts.endpoint,
20
+ query: opts.query,
21
+ variables,
22
+ timeout_ms: opts.timeout,
23
+ network: globals.network
24
+ });
25
+ if (globals.json) {
26
+ formatJson(result);
27
+ }
28
+ else {
29
+ const data = result;
30
+ formatKeyValue({
31
+ endpoint: data.endpoint,
32
+ queried_at: data.queried_at_utc,
33
+ elapsed_ms: data.elapsed_ms
34
+ }, {
35
+ labels: {
36
+ endpoint: "Endpoint",
37
+ queried_at: "Queried At",
38
+ elapsed_ms: "Elapsed (ms)"
39
+ }
40
+ });
41
+ if (data.errors) {
42
+ console.log(" Errors:", JSON.stringify(data.errors, null, 2));
43
+ }
44
+ if (data.data) {
45
+ console.log(JSON.stringify(data.data, null, 2));
46
+ }
47
+ }
48
+ });
49
+ group
50
+ .command("sql")
51
+ .description("Run read-only SQL query against an indexer")
52
+ .requiredOption("--endpoint <url>", "SQL indexer endpoint URL")
53
+ .requiredOption("--query <sql>", "read-only SQL query")
54
+ .option("--params <json>", "optional query params as JSON string")
55
+ .option("--timeout <ms>", "request timeout in milliseconds", (value) => parseIntegerOption(value, "--timeout"))
56
+ .action(async (opts, cmd) => {
57
+ const globals = cmd.optsWithGlobals();
58
+ const params = opts.params
59
+ ? parseJsonString(opts.params, "params")
60
+ : undefined;
61
+ const result = await allTools["mantle_queryIndexerSql"].handler({
62
+ endpoint: opts.endpoint,
63
+ query: opts.query,
64
+ params,
65
+ timeout_ms: opts.timeout,
66
+ network: globals.network
67
+ });
68
+ if (globals.json) {
69
+ formatJson(result);
70
+ }
71
+ else {
72
+ const data = result;
73
+ const columns = (data.columns ?? []);
74
+ const rows = (data.rows ?? []);
75
+ console.log(`\n Endpoint: ${data.endpoint} Rows: ${data.row_count} Elapsed: ${data.elapsed_ms}ms\n`);
76
+ if (rows.length > 0 && columns.length > 0) {
77
+ const tableRows = rows.map((row) => {
78
+ const record = {};
79
+ columns.forEach((col, i) => {
80
+ record[col] = Array.isArray(row) ? row[i] : row[col];
81
+ });
82
+ return record;
83
+ });
84
+ formatTable(tableRows, columns.map((col) => ({ key: col, label: col })));
85
+ }
86
+ if (data.truncated) {
87
+ console.log(" (Results truncated)");
88
+ }
89
+ }
90
+ });
91
+ }
92
+ //# sourceMappingURL=indexer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexer.js","sourceRoot":"","sources":["../../src/commands/indexer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,uCAAuC,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAElE,MAAM,UAAU,eAAe,CAAC,MAAe;IAC7C,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC;IAEhF,KAAK;SACF,OAAO,CAAC,UAAU,CAAC;SACnB,WAAW,CAAC,4CAA4C,CAAC;SACzD,cAAc,CAAC,kBAAkB,EAAE,sBAAsB,CAAC;SAC1D,cAAc,CAAC,mBAAmB,EAAE,wBAAwB,CAAC;SAC7D,MAAM,CAAC,oBAAoB,EAAE,2CAA2C,CAAC;SACzE,MAAM,CAAC,gBAAgB,EAAE,iCAAiC,EAAE,CAAC,KAAa,EAAE,EAAE,CAC7E,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CACvC;SACA,MAAM,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS;YAC9B,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,SAAmB,EAAE,WAAW,CAAC;YACxD,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,sBAAsB,CAAC,CAAC,OAAO,CAAC;YAC5D,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,SAAS;YACT,UAAU,EAAE,IAAI,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,UAAU,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAiC,CAAC;YAC/C,cAAc,CACZ;gBACE,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,UAAU,EAAE,IAAI,CAAC,cAAc;gBAC/B,UAAU,EAAE,IAAI,CAAC,UAAU;aAC5B,EACD;gBACE,MAAM,EAAE;oBACN,QAAQ,EAAE,UAAU;oBACpB,UAAU,EAAE,YAAY;oBACxB,UAAU,EAAE,cAAc;iBAC3B;aACF,CACF,CAAC;YACF,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;YAClD,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAEL,KAAK;SACF,OAAO,CAAC,KAAK,CAAC;SACd,WAAW,CAAC,4CAA4C,CAAC;SACzD,cAAc,CAAC,kBAAkB,EAAE,0BAA0B,CAAC;SAC9D,cAAc,CAAC,eAAe,EAAE,qBAAqB,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,sCAAsC,CAAC;SACjE,MAAM,CAAC,gBAAgB,EAAE,iCAAiC,EAAE,CAAC,KAAa,EAAE,EAAE,CAC7E,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CACvC;SACA,MAAM,CAAC,KAAK,EAAE,IAA6B,EAAE,GAAY,EAAE,EAAE;QAC5D,MAAM,OAAO,GAAG,GAAG,CAAC,eAAe,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM;YACxB,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,MAAgB,EAAE,QAAQ,CAAC;YAClD,CAAC,CAAC,SAAS,CAAC;QACd,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,wBAAwB,CAAC,CAAC,OAAO,CAAC;YAC9D,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM;YACN,UAAU,EAAE,IAAI,CAAC,OAAO;YACxB,OAAO,EAAE,OAAO,CAAC,OAAO;SACzB,CAAC,CAAC;QACH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,UAAU,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAG,MAAiC,CAAC;YAC/C,MAAM,OAAO,GAAG,CAAC,IAAI,CAAC,OAAO,IAAI,EAAE,CAAa,CAAC;YACjD,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAgB,CAAC;YAC9C,OAAO,CAAC,GAAG,CAAC,iBAAiB,IAAI,CAAC,QAAQ,WAAW,IAAI,CAAC,SAAS,cAAc,IAAI,CAAC,UAAU,MAAM,CAAC,CAAC;YACxG,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC1C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;oBACjC,MAAM,MAAM,GAA4B,EAAE,CAAC;oBAC3C,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;wBACzB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAE,GAA+B,CAAC,GAAG,CAAC,CAAC;oBACpF,CAAC,CAAC,CAAC;oBACH,OAAO,MAAM,CAAC;gBAChB,CAAC,CAAC,CAAC;gBACH,WAAW,CACT,SAAS,EACT,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC,CACjD,CAAC;YACJ,CAAC;YACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;gBACnB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerRegistry(parent: Command): void;
3
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/commands/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAIzC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAwEtD"}
@@ -0,0 +1,76 @@
1
+ import { allTools } from "@0xwh1sker/mantle-core/tools/index.js";
2
+ import { formatKeyValue, formatJson } from "../formatter.js";
3
+ export function registerRegistry(parent) {
4
+ const group = parent.command("registry").description("Address resolution and validation");
5
+ group
6
+ .command("resolve")
7
+ .description("Resolve trusted contract address by key, alias, or label")
8
+ .argument("<identifier>", "registry key, alias, or label")
9
+ .option("--category <category>", "filter category (system, token, bridge, defi, any)", "any")
10
+ .action(async (identifier, opts, cmd) => {
11
+ const globals = cmd.optsWithGlobals();
12
+ const result = await allTools["mantle_resolveAddress"].handler({
13
+ identifier,
14
+ network: globals.network,
15
+ category: opts.category
16
+ });
17
+ if (globals.json) {
18
+ formatJson(result);
19
+ }
20
+ else {
21
+ const data = result;
22
+ formatKeyValue(data, {
23
+ order: [
24
+ "identifier", "network", "address", "label", "category",
25
+ "status", "confidence", "aliases", "source_url"
26
+ ],
27
+ labels: {
28
+ identifier: "Identifier",
29
+ network: "Network",
30
+ address: "Address",
31
+ label: "Label",
32
+ category: "Category",
33
+ status: "Status",
34
+ is_official: "Official",
35
+ confidence: "Confidence",
36
+ aliases: "Aliases",
37
+ source_url: "Source URL"
38
+ }
39
+ });
40
+ }
41
+ });
42
+ group
43
+ .command("validate")
44
+ .description("Validate address format, checksum, and optional bytecode presence")
45
+ .argument("<address>", "address to validate")
46
+ .option("--check-code", "check if deployed bytecode exists", false)
47
+ .action(async (address, opts, cmd) => {
48
+ const globals = cmd.optsWithGlobals();
49
+ const result = await allTools["mantle_validateAddress"].handler({
50
+ address,
51
+ check_code: opts.checkCode,
52
+ network: globals.network
53
+ });
54
+ if (globals.json) {
55
+ formatJson(result);
56
+ }
57
+ else {
58
+ const data = result;
59
+ formatKeyValue(data, {
60
+ order: [
61
+ "address", "valid_format", "is_checksummed",
62
+ "is_zero_address", "has_code", "registry_match"
63
+ ],
64
+ labels: {
65
+ address: "Address",
66
+ valid_format: "Valid Format",
67
+ is_checksummed: "Checksummed",
68
+ is_zero_address: "Zero Address",
69
+ has_code: "Has Code",
70
+ registry_match: "Registry Match"
71
+ }
72
+ });
73
+ }
74
+ });
75
+ }
76
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/commands/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from "commander";
2
+ export declare function registerToken(parent: Command): void;
3
+ //# sourceMappingURL=token.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.d.ts","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAKzC,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CA+FnD"}
@@ -0,0 +1,100 @@
1
+ import { allTools } from "@0xwh1sker/mantle-core/tools/index.js";
2
+ import { formatKeyValue, formatTable, formatJson } from "../formatter.js";
3
+ import { parseCommaList } from "../utils.js";
4
+ export function registerToken(parent) {
5
+ const group = parent.command("token").description("Token metadata and resolution");
6
+ group
7
+ .command("info")
8
+ .description("Read ERC-20 token metadata (name, symbol, decimals, total supply)")
9
+ .argument("<token>", "token symbol or address")
10
+ .action(async (token, _opts, cmd) => {
11
+ const globals = cmd.optsWithGlobals();
12
+ const result = await allTools["mantle_getTokenInfo"].handler({
13
+ token,
14
+ network: globals.network
15
+ });
16
+ if (globals.json) {
17
+ formatJson(result);
18
+ }
19
+ else {
20
+ const data = result;
21
+ formatKeyValue(data, {
22
+ order: ["name", "symbol", "address", "decimals", "total_supply_normalized", "network", "collected_at_utc"],
23
+ labels: {
24
+ name: "Name",
25
+ symbol: "Symbol",
26
+ address: "Address",
27
+ decimals: "Decimals",
28
+ total_supply_normalized: "Total Supply",
29
+ network: "Network",
30
+ collected_at_utc: "Collected At"
31
+ }
32
+ });
33
+ }
34
+ });
35
+ group
36
+ .command("prices")
37
+ .description("Read token prices for valuation (null when no trusted source)")
38
+ .requiredOption("--tokens <tokens>", "comma-separated token symbols or addresses")
39
+ .option("--base-currency <currency>", "quote currency (usd, mnt)", "usd")
40
+ .action(async (opts, cmd) => {
41
+ const globals = cmd.optsWithGlobals();
42
+ const tokens = parseCommaList(opts.tokens);
43
+ const result = await allTools["mantle_getTokenPrices"].handler({
44
+ tokens,
45
+ base_currency: opts.baseCurrency,
46
+ network: globals.network
47
+ });
48
+ if (globals.json) {
49
+ formatJson(result);
50
+ }
51
+ else {
52
+ const data = result;
53
+ const prices = (data.prices ?? []);
54
+ formatTable(prices, [
55
+ { key: "symbol", label: "Token" },
56
+ {
57
+ key: "price",
58
+ label: `Price (${data.base_currency.toUpperCase()})`,
59
+ align: "right",
60
+ format: (v) => (v === null ? "N/A" : String(v))
61
+ },
62
+ { key: "source", label: "Source" },
63
+ { key: "confidence", label: "Confidence" }
64
+ ]);
65
+ }
66
+ });
67
+ group
68
+ .command("resolve")
69
+ .description("Resolve token symbol via quick-ref + canonical token-list check")
70
+ .argument("<symbol>", "token symbol to resolve")
71
+ .option("--no-token-list-check", "skip canonical token-list match requirement")
72
+ .action(async (symbol, opts, cmd) => {
73
+ const globals = cmd.optsWithGlobals();
74
+ const result = await allTools["mantle_resolveToken"].handler({
75
+ symbol,
76
+ network: globals.network,
77
+ require_token_list_match: opts.tokenListCheck !== false
78
+ });
79
+ if (globals.json) {
80
+ formatJson(result);
81
+ }
82
+ else {
83
+ const data = result;
84
+ formatKeyValue(data, {
85
+ order: ["symbol", "address", "decimals", "source", "confidence", "token_list_match", "network"],
86
+ labels: {
87
+ symbol: "Symbol",
88
+ address: "Address",
89
+ decimals: "Decimals",
90
+ source: "Source",
91
+ confidence: "Confidence",
92
+ token_list_match: "Token List Match",
93
+ token_list_version: "Token List Version",
94
+ network: "Network"
95
+ }
96
+ });
97
+ }
98
+ });
99
+ }
100
+ //# sourceMappingURL=token.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token.js","sourceRoot":"","sources":["../../src/commands/token.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export interface KeyValueOptions {
2
+ labels?: Record<string, string>;
3
+ order?: string[];
4
+ }
5
+ export declare function formatKeyValue(data: Record<string, unknown>, options?: KeyValueOptions): void;
6
+ export interface TableColumn {
7
+ key: string;
8
+ label: string;
9
+ align?: "left" | "right";
10
+ format?: (value: unknown) => string;
11
+ }
12
+ export declare function formatTable(rows: Record<string, unknown>[], columns: TableColumn[]): void;
13
+ export declare function formatJson(data: unknown): void;
14
+ export declare function formatError(error: {
15
+ code?: string;
16
+ message: string;
17
+ suggestion?: string;
18
+ }): void;
19
+ export declare function disableColors(): void;
20
+ //# sourceMappingURL=formatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.d.ts","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,eAAe;IAC9B,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB;AA6BD,wBAAgB,cAAc,CAC5B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,OAAO,GAAE,eAAoB,GAC5B,IAAI,CAiBN;AAED,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IACzB,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,MAAM,CAAC;CACrC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAsCzF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,CAE9C;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,IAAI,CASP;AAED,wBAAgB,aAAa,IAAI,IAAI,CAEpC"}
@@ -0,0 +1,98 @@
1
+ import chalk from "chalk";
2
+ function getLabelWidth(entries) {
3
+ return Math.max(...entries.map(([label]) => label.length), 0);
4
+ }
5
+ function formatValue(value) {
6
+ if (value === null || value === undefined) {
7
+ return chalk.dim("null");
8
+ }
9
+ if (typeof value === "boolean") {
10
+ return value ? chalk.green("true") : chalk.red("false");
11
+ }
12
+ if (typeof value === "number") {
13
+ return chalk.cyan(String(value));
14
+ }
15
+ if (typeof value === "string") {
16
+ if (/^0x[a-fA-F0-9]{40}$/.test(value)) {
17
+ return chalk.yellow(value);
18
+ }
19
+ return value;
20
+ }
21
+ if (Array.isArray(value)) {
22
+ if (value.length === 0)
23
+ return chalk.dim("[]");
24
+ return value.map((item) => formatValue(item)).join(", ");
25
+ }
26
+ return JSON.stringify(value);
27
+ }
28
+ export function formatKeyValue(data, options = {}) {
29
+ const { labels = {}, order } = options;
30
+ const keys = order ?? Object.keys(data);
31
+ const entries = [];
32
+ for (const key of keys) {
33
+ if (!(key in data))
34
+ continue;
35
+ const label = labels[key] ?? key;
36
+ entries.push([label, formatValue(data[key])]);
37
+ }
38
+ const width = getLabelWidth(entries);
39
+ console.log();
40
+ for (const [label, value] of entries) {
41
+ console.log(` ${chalk.bold(label.padEnd(width))} ${value}`);
42
+ }
43
+ console.log();
44
+ }
45
+ export function formatTable(rows, columns) {
46
+ if (rows.length === 0) {
47
+ console.log(chalk.dim("\n No results.\n"));
48
+ return;
49
+ }
50
+ const widths = columns.map((col) => {
51
+ const headerWidth = col.label.length;
52
+ const maxDataWidth = Math.max(...rows.map((row) => {
53
+ const formatted = col.format ? col.format(row[col.key]) : formatValue(row[col.key]);
54
+ return stripAnsi(formatted).length;
55
+ }), 0);
56
+ return Math.max(headerWidth, maxDataWidth);
57
+ });
58
+ const header = columns
59
+ .map((col, i) => chalk.bold(col.label.padEnd(widths[i])))
60
+ .join(" ");
61
+ console.log(`\n ${header}`);
62
+ for (const row of rows) {
63
+ const line = columns
64
+ .map((col, i) => {
65
+ const raw = col.format ? col.format(row[col.key]) : formatValue(row[col.key]);
66
+ const stripped = stripAnsi(raw);
67
+ const padding = widths[i] - stripped.length;
68
+ if (col.align === "right") {
69
+ return " ".repeat(Math.max(padding, 0)) + raw;
70
+ }
71
+ return raw + " ".repeat(Math.max(padding, 0));
72
+ })
73
+ .join(" ");
74
+ console.log(` ${line}`);
75
+ }
76
+ console.log();
77
+ }
78
+ export function formatJson(data) {
79
+ console.log(JSON.stringify(data, null, 2));
80
+ }
81
+ export function formatError(error) {
82
+ console.error(chalk.red(`\nError: ${error.message}`));
83
+ if (error.code) {
84
+ console.error(chalk.dim(`Code: ${error.code}`));
85
+ }
86
+ if (error.suggestion) {
87
+ console.error(chalk.yellow(`Suggestion: ${error.suggestion}`));
88
+ }
89
+ console.error();
90
+ }
91
+ export function disableColors() {
92
+ chalk.level = 0;
93
+ }
94
+ function stripAnsi(str) {
95
+ // eslint-disable-next-line no-control-regex
96
+ return str.replace(/\x1B\[[0-9;]*m/g, "");
97
+ }
98
+ //# sourceMappingURL=formatter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatter.js","sourceRoot":"","sources":["../src/formatter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":""}
package/dist/index.js ADDED
@@ -0,0 +1,76 @@
1
+ #!/usr/bin/env node
2
+ import { readFileSync } from "node:fs";
3
+ import { Command } from "commander";
4
+ import { MantleMcpError } from "@0xwh1sker/mantle-core/errors.js";
5
+ import { disableColors, formatError, formatJson } from "./formatter.js";
6
+ import { applyRpcOverride } from "./utils.js";
7
+ import { registerChain } from "./commands/chain.js";
8
+ import { registerRegistry } from "./commands/registry.js";
9
+ import { registerAccount } from "./commands/account.js";
10
+ import { registerToken } from "./commands/token.js";
11
+ import { registerDefi } from "./commands/defi.js";
12
+ import { registerSwap } from "./commands/defi-swap.js";
13
+ import { registerAave } from "./commands/defi-aave.js";
14
+ import { registerLp } from "./commands/defi-lp.js";
15
+ import { registerIndexer } from "./commands/indexer.js";
16
+ import { registerDiagnostics } from "./commands/diagnostics.js";
17
+ import { registerCatalog } from "./commands/catalog.js";
18
+ const pkg = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf-8"));
19
+ const program = new Command();
20
+ program
21
+ .name("mantle-cli")
22
+ .description("CLI for Mantle L2 chain reads, DeFi queries, swaps, LP, and Aave operations")
23
+ .version(pkg.version)
24
+ .option("-n, --network <network>", "target network (mainnet, sepolia)", "mainnet")
25
+ .option("--json", "output raw JSON", false)
26
+ .option("--no-color", "disable colored output")
27
+ .option("--rpc-url <url>", "override RPC endpoint")
28
+ .hook("preAction", (thisCommand) => {
29
+ const opts = thisCommand.opts();
30
+ if (opts.color === false) {
31
+ disableColors();
32
+ }
33
+ applyRpcOverride(opts.rpcUrl, opts.network);
34
+ });
35
+ registerChain(program);
36
+ registerRegistry(program);
37
+ registerAccount(program);
38
+ registerToken(program);
39
+ registerDefi(program);
40
+ registerSwap(program);
41
+ registerAave(program);
42
+ registerLp(program);
43
+ registerIndexer(program);
44
+ registerDiagnostics(program);
45
+ registerCatalog(program);
46
+ program.parseAsync(process.argv).catch((error) => {
47
+ const globals = program.opts();
48
+ if (error instanceof MantleMcpError) {
49
+ if (globals.json) {
50
+ formatJson({
51
+ error: true,
52
+ code: error.code,
53
+ message: error.message,
54
+ suggestion: error.suggestion,
55
+ details: error.details
56
+ });
57
+ }
58
+ else {
59
+ formatError({ code: error.code, message: error.message, suggestion: error.suggestion });
60
+ }
61
+ process.exit(1);
62
+ }
63
+ if (globals.json) {
64
+ formatJson({
65
+ error: true,
66
+ code: "INTERNAL_ERROR",
67
+ message: error instanceof Error ? error.message : String(error),
68
+ suggestion: "Retry the operation or check server logs."
69
+ });
70
+ }
71
+ else {
72
+ formatError({ message: error instanceof Error ? error.message : String(error) });
73
+ }
74
+ process.exit(2);
75
+ });
76
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export declare function parseCommaList(value: string): string[];
2
+ export declare function parseJsonString(value: string, fieldName: string): Record<string, unknown>;
3
+ export declare function applyRpcOverride(rpcUrl: string | undefined, network: string): void;
4
+ export declare function parseJsonArray(value: string, fieldName: string): unknown[];
5
+ export declare function parseIntegerOption(value: string, optionName: string): number;
6
+ export declare function parseNumberOption(value: string, optionName: string): number;
7
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAGA,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAKtD;AAED,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAezF;AAED,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAOlF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,EAAE,CAe1E;AAED,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAW5E;AAED,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAO3E"}