@grimoirelabs/cli 0.1.0

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 (53) hide show
  1. package/dist/commands/advisor-skill-helpers.d.ts +2 -0
  2. package/dist/commands/advisor-skill-helpers.d.ts.map +1 -0
  3. package/dist/commands/advisor-skill-helpers.js +24 -0
  4. package/dist/commands/advisor-skill-helpers.js.map +1 -0
  5. package/dist/commands/cast.d.ts +26 -0
  6. package/dist/commands/cast.d.ts.map +1 -0
  7. package/dist/commands/cast.js +334 -0
  8. package/dist/commands/cast.js.map +1 -0
  9. package/dist/commands/compile-all.d.ts +11 -0
  10. package/dist/commands/compile-all.d.ts.map +1 -0
  11. package/dist/commands/compile-all.js +84 -0
  12. package/dist/commands/compile-all.js.map +1 -0
  13. package/dist/commands/compile.d.ts +11 -0
  14. package/dist/commands/compile.d.ts.map +1 -0
  15. package/dist/commands/compile.js +63 -0
  16. package/dist/commands/compile.js.map +1 -0
  17. package/dist/commands/history.d.ts +12 -0
  18. package/dist/commands/history.d.ts.map +1 -0
  19. package/dist/commands/history.js +68 -0
  20. package/dist/commands/history.js.map +1 -0
  21. package/dist/commands/init.d.ts +10 -0
  22. package/dist/commands/init.d.ts.map +1 -0
  23. package/dist/commands/init.js +174 -0
  24. package/dist/commands/init.js.map +1 -0
  25. package/dist/commands/log.d.ts +11 -0
  26. package/dist/commands/log.d.ts.map +1 -0
  27. package/dist/commands/log.js +95 -0
  28. package/dist/commands/log.js.map +1 -0
  29. package/dist/commands/simulate.d.ts +15 -0
  30. package/dist/commands/simulate.d.ts.map +1 -0
  31. package/dist/commands/simulate.js +110 -0
  32. package/dist/commands/simulate.js.map +1 -0
  33. package/dist/commands/state-helpers.d.ts +18 -0
  34. package/dist/commands/state-helpers.d.ts.map +1 -0
  35. package/dist/commands/state-helpers.js +34 -0
  36. package/dist/commands/state-helpers.js.map +1 -0
  37. package/dist/commands/validate.d.ts +10 -0
  38. package/dist/commands/validate.d.ts.map +1 -0
  39. package/dist/commands/validate.js +67 -0
  40. package/dist/commands/validate.js.map +1 -0
  41. package/dist/commands/venues.d.ts +10 -0
  42. package/dist/commands/venues.d.ts.map +1 -0
  43. package/dist/commands/venues.js +31 -0
  44. package/dist/commands/venues.js.map +1 -0
  45. package/dist/commands/wallet.d.ts +7 -0
  46. package/dist/commands/wallet.d.ts.map +1 -0
  47. package/dist/commands/wallet.js +437 -0
  48. package/dist/commands/wallet.js.map +1 -0
  49. package/dist/index.d.ts +7 -0
  50. package/dist/index.d.ts.map +1 -0
  51. package/dist/index.js +105 -0
  52. package/dist/index.js.map +1 -0
  53. package/package.json +27 -0
@@ -0,0 +1,67 @@
1
+ /**
2
+ * Validate Command
3
+ * Validates a .spell file
4
+ */
5
+ import { compileFile } from "@grimoirelabs/core";
6
+ import chalk from "chalk";
7
+ import ora from "ora";
8
+ export async function validateCommand(spellPath, options) {
9
+ const spinner = ora(`Validating ${spellPath}...`).start();
10
+ try {
11
+ const result = await compileFile(spellPath);
12
+ // Count issues
13
+ const errorCount = result.errors.length;
14
+ const warningCount = result.warnings.length;
15
+ // Report warnings
16
+ if (warningCount > 0) {
17
+ spinner.info(chalk.yellow(`${warningCount} warning(s)`));
18
+ for (const warning of result.warnings) {
19
+ console.log(chalk.yellow(` [${warning.code}] ${warning.message}`));
20
+ if (warning.line !== undefined) {
21
+ console.log(chalk.dim(` at line ${warning.line}`));
22
+ }
23
+ }
24
+ }
25
+ // Report errors
26
+ if (errorCount > 0) {
27
+ spinner.fail(chalk.red(`${errorCount} error(s)`));
28
+ for (const error of result.errors) {
29
+ console.log(chalk.red(` [${error.code}] ${error.message}`));
30
+ if (error.line !== undefined) {
31
+ console.log(chalk.dim(` at line ${error.line}`));
32
+ }
33
+ }
34
+ }
35
+ // Final result
36
+ if (!result.success) {
37
+ console.log();
38
+ console.log(chalk.red("✗ Validation failed"));
39
+ process.exit(1);
40
+ }
41
+ if (options.strict && warningCount > 0) {
42
+ console.log();
43
+ console.log(chalk.red("✗ Validation failed (strict mode)"));
44
+ process.exit(1);
45
+ }
46
+ if (errorCount === 0 && warningCount === 0) {
47
+ spinner.succeed(chalk.green("✓ Spell is valid"));
48
+ }
49
+ else {
50
+ spinner.succeed(chalk.green("✓ Spell is valid (with warnings)"));
51
+ }
52
+ // Show spell info
53
+ if (result.ir) {
54
+ console.log();
55
+ console.log(chalk.dim("Spell info:"));
56
+ console.log(chalk.dim(` Name: ${result.ir.meta.name}`));
57
+ console.log(chalk.dim(` Version: ${result.ir.version}`));
58
+ console.log(chalk.dim(` Steps: ${result.ir.steps.length}`));
59
+ console.log(chalk.dim(` Guards: ${result.ir.guards.length}`));
60
+ }
61
+ }
62
+ catch (error) {
63
+ spinner.fail(chalk.red(`Failed to validate: ${error.message}`));
64
+ process.exit(1);
65
+ }
66
+ }
67
+ //# sourceMappingURL=validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/commands/validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Venues Command
3
+ * Lists available adapters and supported chains
4
+ */
5
+ interface VenuesOptions {
6
+ json?: boolean;
7
+ }
8
+ export declare function venuesCommand(options: VenuesOptions): Promise<void>;
9
+ export {};
10
+ //# sourceMappingURL=venues.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"venues.d.ts","sourceRoot":"","sources":["../../src/commands/venues.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,UAAU,aAAa;IACrB,IAAI,CAAC,EAAE,OAAO,CAAC;CAChB;AAED,wBAAsB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BzE"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Venues Command
3
+ * Lists available adapters and supported chains
4
+ */
5
+ import { adapters } from "@grimoirelabs/venues";
6
+ import chalk from "chalk";
7
+ export async function venuesCommand(options) {
8
+ const metas = adapters
9
+ .map((adapter) => adapter.meta)
10
+ .sort((a, b) => a.name.localeCompare(b.name));
11
+ if (options.json) {
12
+ console.log(JSON.stringify(metas, null, 2));
13
+ return;
14
+ }
15
+ const headers = ["Name", "Exec", "Actions", "Chains", "Description"];
16
+ const rows = metas.map((meta) => [
17
+ meta.name,
18
+ meta.executionType ?? "evm",
19
+ meta.actions.join(", "),
20
+ meta.supportedChains.join(", "),
21
+ meta.description ?? "",
22
+ ]);
23
+ const widths = headers.map((header, index) => Math.max(header.length, ...rows.map((row) => row[index]?.length ?? 0)));
24
+ const formatRow = (row) => row.map((cell, index) => cell.padEnd(widths[index] ?? 0)).join(" ");
25
+ console.log(chalk.bold(formatRow(headers)));
26
+ console.log(chalk.dim(widths.map((width) => "-".repeat(width)).join(" ")));
27
+ for (const row of rows) {
28
+ console.log(formatRow(row));
29
+ }
30
+ }
31
+ //# sourceMappingURL=venues.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"venues.js","sourceRoot":"","sources":["../../src/commands/venues.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAM1B,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,OAAsB;IACxD,MAAM,KAAK,GAAG,QAAQ;SACnB,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;SAC9B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;IAEhD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;QACjB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,OAAO;IACT,CAAC;IAED,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,aAAa,CAAC,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;QAC/B,IAAI,CAAC,IAAI;QACT,IAAI,CAAC,aAAa,IAAI,KAAK;QAC3B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QACvB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC;QAC/B,IAAI,CAAC,WAAW,IAAI,EAAE;KACvB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,CAC3C,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,IAAI,CAAC,CAAC,CAAC,CACvE,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,GAAa,EAAU,EAAE,CAC1C,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC5E,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,CAAC;AACH,CAAC"}
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Wallet Command
3
+ * Manage wallet lifecycle: generate, address, balance, import
4
+ */
5
+ import { Command } from "commander";
6
+ export declare const walletCommand: Command;
7
+ //# sourceMappingURL=wallet.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.d.ts","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAmBH,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAwdpC,eAAO,MAAM,aAAa,SAAoE,CAAC"}
@@ -0,0 +1,437 @@
1
+ /**
2
+ * Wallet Command
3
+ * Manage wallet lifecycle: generate, address, balance, import
4
+ */
5
+ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
6
+ import { homedir } from "node:os";
7
+ import { dirname, join } from "node:path";
8
+ import * as readline from "node:readline";
9
+ import { Writable } from "node:stream";
10
+ import { createKeystore, createProvider, createWalletFromConfig, formatWei, generatePrivateKey, getAddressFromConfig, getChainName, getNativeCurrencySymbol, } from "@grimoirelabs/core";
11
+ import chalk from "chalk";
12
+ import { Command } from "commander";
13
+ import ora from "ora";
14
+ const DEFAULT_KEYSTORE_DIR = join(homedir(), ".grimoire");
15
+ const DEFAULT_KEYSTORE_PATH = join(DEFAULT_KEYSTORE_DIR, "keystore.json");
16
+ /**
17
+ * Resolve the keystore file path from options or default
18
+ */
19
+ function resolveKeystorePath(options) {
20
+ return options.keystore ?? DEFAULT_KEYSTORE_PATH;
21
+ }
22
+ /**
23
+ * Prompt for a password interactively (hides input)
24
+ */
25
+ async function promptPassword(message) {
26
+ return new Promise((resolve) => {
27
+ process.stdout.write(message);
28
+ const silentOutput = new Writable({
29
+ write(_chunk, _encoding, cb) {
30
+ cb();
31
+ },
32
+ });
33
+ const rl = readline.createInterface({
34
+ input: process.stdin,
35
+ output: silentOutput,
36
+ terminal: true,
37
+ });
38
+ rl.question("", (answer) => {
39
+ rl.close();
40
+ process.stdout.write("\n");
41
+ resolve(answer);
42
+ });
43
+ });
44
+ }
45
+ /**
46
+ * Resolve keystore password from env var, interactive prompt, or error
47
+ */
48
+ async function resolveKeystorePassword(options) {
49
+ const envName = options.passwordEnv ?? "KEYSTORE_PASSWORD";
50
+ const envValue = process.env[envName];
51
+ if (envValue) {
52
+ return envValue;
53
+ }
54
+ if (process.stdin.isTTY) {
55
+ return await promptPassword("Keystore password: ");
56
+ }
57
+ throw new Error(`No password available. Set ${envName} or run interactively.`);
58
+ }
59
+ /**
60
+ * Prompt for password with confirmation (for create/import flows)
61
+ */
62
+ async function resolveNewKeystorePassword(options) {
63
+ const envName = options.passwordEnv ?? "KEYSTORE_PASSWORD";
64
+ const envValue = process.env[envName];
65
+ if (envValue) {
66
+ return envValue;
67
+ }
68
+ if (process.stdin.isTTY) {
69
+ const password = await promptPassword("New keystore password: ");
70
+ const confirm = await promptPassword("Confirm password: ");
71
+ if (password !== confirm) {
72
+ throw new Error("Passwords do not match.");
73
+ }
74
+ if (!password) {
75
+ throw new Error("Password must not be empty.");
76
+ }
77
+ return password;
78
+ }
79
+ throw new Error(`No password available. Set ${envName} or run interactively.`);
80
+ }
81
+ // ── Subcommands ─────────────────────────────────────────────────────
82
+ async function generateAction(options) {
83
+ const spinner = ora("Generating wallet...").start();
84
+ try {
85
+ // 1. Generate key
86
+ const privateKey = generatePrivateKey();
87
+ // 2. Derive address (use viem via getAddressFromConfig with raw key)
88
+ const address = getAddressFromConfig({ type: "raw", source: privateKey });
89
+ spinner.text = "Waiting for password...";
90
+ spinner.stop();
91
+ // 3. Prompt password
92
+ const password = await resolveNewKeystorePassword(options);
93
+ spinner.start("Encrypting keystore...");
94
+ // 4. Encrypt
95
+ const keystoreJson = await createKeystore(privateKey, password);
96
+ // 5. Write file
97
+ const keystorePath = resolveKeystorePath(options);
98
+ const dir = dirname(keystorePath);
99
+ if (!existsSync(dir)) {
100
+ mkdirSync(dir, { recursive: true });
101
+ }
102
+ writeFileSync(keystorePath, keystoreJson, "utf-8");
103
+ spinner.succeed(chalk.green("Wallet generated"));
104
+ if (options.json) {
105
+ const output = {
106
+ address,
107
+ keystore: keystorePath,
108
+ };
109
+ if (options.printKey) {
110
+ output.privateKey = privateKey;
111
+ }
112
+ console.log(JSON.stringify(output, null, 2));
113
+ }
114
+ else {
115
+ console.log(` ${chalk.dim("Address:")} ${address}`);
116
+ console.log(` ${chalk.dim("Keystore:")} ${keystorePath}`);
117
+ if (options.printKey) {
118
+ console.log();
119
+ console.log(chalk.yellow(" WARNING: Store this private key securely. It will not be shown again."));
120
+ console.log(` ${chalk.dim("Private key:")} ${privateKey}`);
121
+ }
122
+ }
123
+ }
124
+ catch (error) {
125
+ spinner.fail(chalk.red(`Failed: ${error.message}`));
126
+ process.exit(1);
127
+ }
128
+ }
129
+ async function addressAction(options) {
130
+ try {
131
+ let keyConfig;
132
+ if (options.mnemonic) {
133
+ keyConfig = { type: "mnemonic", source: options.mnemonic };
134
+ }
135
+ else if (options.keyEnv) {
136
+ keyConfig = { type: "env", source: options.keyEnv };
137
+ }
138
+ else {
139
+ // Default: keystore
140
+ const keystorePath = resolveKeystorePath(options);
141
+ if (!existsSync(keystorePath)) {
142
+ console.error(chalk.red(`Keystore not found: ${keystorePath}`));
143
+ console.error(chalk.dim("Run 'grimoire wallet generate' to create one."));
144
+ process.exit(1);
145
+ }
146
+ const password = await resolveKeystorePassword(options);
147
+ const keystoreJson = readFileSync(keystorePath, "utf-8");
148
+ keyConfig = { type: "keystore", source: keystoreJson, password };
149
+ }
150
+ const address = getAddressFromConfig(keyConfig);
151
+ if (options.json) {
152
+ console.log(JSON.stringify({ address }));
153
+ }
154
+ else {
155
+ console.log(address);
156
+ }
157
+ }
158
+ catch (error) {
159
+ console.error(chalk.red(`Failed: ${error.message}`));
160
+ process.exit(1);
161
+ }
162
+ }
163
+ async function balanceAction(options) {
164
+ try {
165
+ let keyConfig;
166
+ if (options.mnemonic) {
167
+ keyConfig = { type: "mnemonic", source: options.mnemonic };
168
+ }
169
+ else if (options.keyEnv) {
170
+ keyConfig = { type: "env", source: options.keyEnv };
171
+ }
172
+ else {
173
+ const keystorePath = resolveKeystorePath(options);
174
+ if (!existsSync(keystorePath)) {
175
+ console.error(chalk.red(`Keystore not found: ${keystorePath}`));
176
+ console.error(chalk.dim("Run 'grimoire wallet generate' to create one."));
177
+ process.exit(1);
178
+ }
179
+ const password = await resolveKeystorePassword(options);
180
+ const keystoreJson = readFileSync(keystorePath, "utf-8");
181
+ keyConfig = { type: "keystore", source: keystoreJson, password };
182
+ }
183
+ const address = getAddressFromConfig(keyConfig);
184
+ const chainId = Number.parseInt(options.chain ?? "1", 10);
185
+ const chainName = getChainName(chainId);
186
+ const spinner = ora(`Fetching balance on ${chainName}...`).start();
187
+ const provider = createProvider(chainId, options.rpcUrl);
188
+ const balance = await provider.getBalance(address);
189
+ spinner.succeed(chalk.green("Balance retrieved"));
190
+ if (options.json) {
191
+ console.log(JSON.stringify({
192
+ address,
193
+ chain: chainId,
194
+ chainName,
195
+ balanceWei: balance.toString(),
196
+ balance: formatWei(balance),
197
+ }));
198
+ }
199
+ else {
200
+ console.log(` ${chalk.dim("Address:")} ${address}`);
201
+ console.log(` ${chalk.dim("Chain:")} ${chainName} (${chainId})`);
202
+ console.log(` ${chalk.dim("Balance:")} ${formatWei(balance)} ${getNativeCurrencySymbol(chainId)}`);
203
+ }
204
+ }
205
+ catch (error) {
206
+ console.error(chalk.red(`Failed: ${error.message}`));
207
+ process.exit(1);
208
+ }
209
+ }
210
+ async function importAction(options) {
211
+ const spinner = ora("Importing wallet...").start();
212
+ try {
213
+ // Load existing key from env
214
+ const envName = options.keyEnv ?? "PRIVATE_KEY";
215
+ const rawKey = process.env[envName];
216
+ if (!rawKey) {
217
+ spinner.fail(chalk.red(`Environment variable ${envName} is not set`));
218
+ process.exit(1);
219
+ }
220
+ // Derive address for validation
221
+ const address = getAddressFromConfig({ type: "raw", source: rawKey });
222
+ spinner.text = "Waiting for password...";
223
+ spinner.stop();
224
+ // Prompt new keystore password
225
+ const password = await resolveNewKeystorePassword(options);
226
+ spinner.start("Encrypting keystore...");
227
+ // Normalize key
228
+ const normalizedKey = rawKey.startsWith("0x") ? rawKey : `0x${rawKey}`;
229
+ // Encrypt
230
+ const keystoreJson = await createKeystore(normalizedKey, password);
231
+ // Write file
232
+ const keystorePath = resolveKeystorePath(options);
233
+ const dir = dirname(keystorePath);
234
+ if (!existsSync(dir)) {
235
+ mkdirSync(dir, { recursive: true });
236
+ }
237
+ writeFileSync(keystorePath, keystoreJson, "utf-8");
238
+ spinner.succeed(chalk.green("Wallet imported"));
239
+ if (options.json) {
240
+ console.log(JSON.stringify({ address, keystore: keystorePath }));
241
+ }
242
+ else {
243
+ console.log(` ${chalk.dim("Address:")} ${address}`);
244
+ console.log(` ${chalk.dim("Keystore:")} ${keystorePath}`);
245
+ }
246
+ }
247
+ catch (error) {
248
+ spinner.fail(chalk.red(`Failed: ${error.message}`));
249
+ process.exit(1);
250
+ }
251
+ }
252
+ // ── WETH Constants ──────────────────────────────────────────────────
253
+ const WETH_ADDRESSES = {
254
+ 1: "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2",
255
+ 8453: "0x4200000000000000000000000000000000000006",
256
+ 10: "0x4200000000000000000000000000000000000006",
257
+ 42161: "0x82aF49447D8a07e3bd95BD0d56f35241523fBab1",
258
+ };
259
+ const WETH_DEPOSIT_SELECTOR = "0xd0e30db0";
260
+ const WETH_WITHDRAW_SELECTOR = "0x2e1a7d4d";
261
+ function ethToWei(eth) {
262
+ const [whole = "0", frac = ""] = eth.split(".");
263
+ const padded = frac.padEnd(18, "0").slice(0, 18);
264
+ return BigInt(whole) * 10n ** 18n + BigInt(padded);
265
+ }
266
+ async function wrapAction(options) {
267
+ try {
268
+ const keystorePath = resolveKeystorePath(options);
269
+ if (!existsSync(keystorePath)) {
270
+ console.error(chalk.red(`Keystore not found: ${keystorePath}`));
271
+ console.error(chalk.dim("Run 'grimoire wallet generate' to create one."));
272
+ process.exit(1);
273
+ }
274
+ const password = await resolveKeystorePassword(options);
275
+ const keystoreJson = readFileSync(keystorePath, "utf-8");
276
+ const keyConfig = { type: "keystore", source: keystoreJson, password };
277
+ const chainId = Number.parseInt(options.chain ?? "8453", 10);
278
+ const nativeSymbol = getNativeCurrencySymbol(chainId);
279
+ if (nativeSymbol !== "ETH") {
280
+ console.error(chalk.red(`WETH only exists on ETH-native chains. Chain ${chainId} uses ${nativeSymbol}.`));
281
+ process.exit(1);
282
+ }
283
+ const wethAddress = WETH_ADDRESSES[chainId];
284
+ if (!wethAddress) {
285
+ console.error(chalk.red(`No known WETH address for chain ${chainId}`));
286
+ process.exit(1);
287
+ }
288
+ const provider = createProvider(chainId, options.rpcUrl);
289
+ const wallet = createWalletFromConfig(keyConfig, chainId, provider.rpcUrl);
290
+ const amountWei = ethToWei(options.amount);
291
+ const spinner = ora(`Wrapping ${options.amount} ETH → WETH on chain ${chainId}...`).start();
292
+ const receipt = await wallet.sendTransaction({
293
+ to: wethAddress,
294
+ value: amountWei,
295
+ data: WETH_DEPOSIT_SELECTOR,
296
+ });
297
+ if (receipt.status === "reverted") {
298
+ spinner.fail(chalk.red("Transaction reverted"));
299
+ console.error(` Tx: ${receipt.hash}`);
300
+ process.exit(1);
301
+ }
302
+ spinner.succeed(chalk.green(`Wrapped ${options.amount} ETH → WETH`));
303
+ const balance = await provider.getBalance(wallet.address);
304
+ if (options.json) {
305
+ console.log(JSON.stringify({
306
+ tx: receipt.hash,
307
+ amount: options.amount,
308
+ chain: chainId,
309
+ balance: formatWei(balance),
310
+ }));
311
+ }
312
+ else {
313
+ console.log(` ${chalk.dim("Tx:")} ${receipt.hash}`);
314
+ console.log(` ${chalk.dim("Balance:")} ${formatWei(balance)} ETH`);
315
+ }
316
+ }
317
+ catch (error) {
318
+ console.error(chalk.red(`Failed: ${error.message}`));
319
+ process.exit(1);
320
+ }
321
+ }
322
+ async function unwrapAction(options) {
323
+ try {
324
+ const keystorePath = resolveKeystorePath(options);
325
+ if (!existsSync(keystorePath)) {
326
+ console.error(chalk.red(`Keystore not found: ${keystorePath}`));
327
+ console.error(chalk.dim("Run 'grimoire wallet generate' to create one."));
328
+ process.exit(1);
329
+ }
330
+ const password = await resolveKeystorePassword(options);
331
+ const keystoreJson = readFileSync(keystorePath, "utf-8");
332
+ const keyConfig = { type: "keystore", source: keystoreJson, password };
333
+ const chainId = Number.parseInt(options.chain ?? "8453", 10);
334
+ const nativeSymbol = getNativeCurrencySymbol(chainId);
335
+ if (nativeSymbol !== "ETH") {
336
+ console.error(chalk.red(`WETH only exists on ETH-native chains. Chain ${chainId} uses ${nativeSymbol}.`));
337
+ process.exit(1);
338
+ }
339
+ const wethAddress = WETH_ADDRESSES[chainId];
340
+ if (!wethAddress) {
341
+ console.error(chalk.red(`No known WETH address for chain ${chainId}`));
342
+ process.exit(1);
343
+ }
344
+ const provider = createProvider(chainId, options.rpcUrl);
345
+ const wallet = createWalletFromConfig(keyConfig, chainId, provider.rpcUrl);
346
+ const amountWei = ethToWei(options.amount);
347
+ const amountHex = amountWei.toString(16).padStart(64, "0");
348
+ const data = `${WETH_WITHDRAW_SELECTOR}${amountHex}`;
349
+ const spinner = ora(`Unwrapping ${options.amount} WETH → ETH on chain ${chainId}...`).start();
350
+ const receipt = await wallet.sendTransaction({
351
+ to: wethAddress,
352
+ data,
353
+ });
354
+ if (receipt.status === "reverted") {
355
+ spinner.fail(chalk.red("Transaction reverted"));
356
+ console.error(` Tx: ${receipt.hash}`);
357
+ process.exit(1);
358
+ }
359
+ spinner.succeed(chalk.green(`Unwrapped ${options.amount} WETH → ETH`));
360
+ const balance = await provider.getBalance(wallet.address);
361
+ if (options.json) {
362
+ console.log(JSON.stringify({
363
+ tx: receipt.hash,
364
+ amount: options.amount,
365
+ chain: chainId,
366
+ balance: formatWei(balance),
367
+ }));
368
+ }
369
+ else {
370
+ console.log(` ${chalk.dim("Tx:")} ${receipt.hash}`);
371
+ console.log(` ${chalk.dim("Balance:")} ${formatWei(balance)} ETH`);
372
+ }
373
+ }
374
+ catch (error) {
375
+ console.error(chalk.red(`Failed: ${error.message}`));
376
+ process.exit(1);
377
+ }
378
+ }
379
+ // ── Command tree ────────────────────────────────────────────────────
380
+ export const walletCommand = new Command("wallet").description("Manage wallets and keystores");
381
+ walletCommand
382
+ .command("generate")
383
+ .description("Generate a new wallet and save to keystore")
384
+ .option("--keystore <path>", "Path to keystore file")
385
+ .option("--password-env <name>", "Environment variable for keystore password")
386
+ .option("--print-key", "Print the private key (one-time backup)")
387
+ .option("--json", "Output as JSON")
388
+ .action(generateAction);
389
+ walletCommand
390
+ .command("address")
391
+ .description("Show wallet address")
392
+ .option("--keystore <path>", "Path to keystore file")
393
+ .option("--password-env <name>", "Environment variable for keystore password")
394
+ .option("--key-env <name>", "Environment variable containing private key")
395
+ .option("--mnemonic <phrase>", "Mnemonic phrase")
396
+ .option("--json", "Output as JSON")
397
+ .action(addressAction);
398
+ walletCommand
399
+ .command("balance")
400
+ .description("Check wallet balance")
401
+ .option("--keystore <path>", "Path to keystore file")
402
+ .option("--password-env <name>", "Environment variable for keystore password")
403
+ .option("--key-env <name>", "Environment variable containing private key")
404
+ .option("--mnemonic <phrase>", "Mnemonic phrase")
405
+ .option("--chain <id>", "Chain ID", "1")
406
+ .option("--rpc-url <url>", "RPC URL")
407
+ .option("--json", "Output as JSON")
408
+ .action(balanceAction);
409
+ walletCommand
410
+ .command("import")
411
+ .description("Import an existing private key into a keystore")
412
+ .option("--keystore <path>", "Path to keystore file")
413
+ .option("--password-env <name>", "Environment variable for keystore password")
414
+ .option("--key-env <name>", "Environment variable containing private key", "PRIVATE_KEY")
415
+ .option("--json", "Output as JSON")
416
+ .action(importAction);
417
+ walletCommand
418
+ .command("wrap")
419
+ .description("Wrap native currency to WETH")
420
+ .requiredOption("--amount <eth>", "Amount to wrap")
421
+ .option("--chain <id>", "Chain ID", "8453")
422
+ .option("--keystore <path>", "Path to keystore file")
423
+ .option("--password-env <name>", "Environment variable for keystore password")
424
+ .option("--rpc-url <url>", "RPC URL")
425
+ .option("--json", "Output as JSON")
426
+ .action(wrapAction);
427
+ walletCommand
428
+ .command("unwrap")
429
+ .description("Unwrap WETH to native currency")
430
+ .requiredOption("--amount <eth>", "Amount to unwrap")
431
+ .option("--chain <id>", "Chain ID", "8453")
432
+ .option("--keystore <path>", "Path to keystore file")
433
+ .option("--password-env <name>", "Environment variable for keystore password")
434
+ .option("--rpc-url <url>", "RPC URL")
435
+ .option("--json", "Output as JSON")
436
+ .action(unwrapAction);
437
+ //# sourceMappingURL=wallet.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wallet.js","sourceRoot":"","sources":["../../src/commands/wallet.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Grimoire CLI
4
+ * Command-line interface for spell management and execution
5
+ */
6
+ export {};
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;GAGG"}