@shieldedtech/moth-cli 0.12.1 → 0.13.0-canary.20260903151454-e3385c4

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 (79) hide show
  1. package/CHANGELOG.md +226 -0
  2. package/dist/base-command.d.ts +21 -0
  3. package/dist/base-command.d.ts.map +1 -1
  4. package/dist/base-command.js +53 -17
  5. package/dist/base-command.js.map +1 -1
  6. package/dist/commands/balance.d.ts.map +1 -1
  7. package/dist/commands/balance.js +20 -2
  8. package/dist/commands/balance.js.map +1 -1
  9. package/dist/commands/call.js +1 -1
  10. package/dist/commands/call.js.map +1 -1
  11. package/dist/commands/config.d.ts +1 -1
  12. package/dist/commands/config.d.ts.map +1 -1
  13. package/dist/commands/config.js +13 -1
  14. package/dist/commands/config.js.map +1 -1
  15. package/dist/commands/daemon/serve.d.ts.map +1 -1
  16. package/dist/commands/daemon/serve.js +1 -1
  17. package/dist/commands/daemon/serve.js.map +1 -1
  18. package/dist/commands/deploy.js +1 -1
  19. package/dist/commands/deploy.js.map +1 -1
  20. package/dist/commands/diagnostics/timings.d.ts +28 -0
  21. package/dist/commands/diagnostics/timings.d.ts.map +1 -0
  22. package/dist/commands/diagnostics/timings.js +77 -0
  23. package/dist/commands/diagnostics/timings.js.map +1 -0
  24. package/dist/commands/dust/deregister.js +1 -1
  25. package/dist/commands/dust/deregister.js.map +1 -1
  26. package/dist/commands/dust/register.d.ts.map +1 -1
  27. package/dist/commands/dust/register.js +15 -2
  28. package/dist/commands/dust/register.js.map +1 -1
  29. package/dist/commands/maintenance/insert-vk.js +1 -1
  30. package/dist/commands/maintenance/insert-vk.js.map +1 -1
  31. package/dist/commands/maintenance/insert-vks-batch.js +1 -1
  32. package/dist/commands/maintenance/insert-vks-batch.js.map +1 -1
  33. package/dist/commands/mint.js +1 -1
  34. package/dist/commands/mint.js.map +1 -1
  35. package/dist/commands/preseed/build.d.ts +28 -0
  36. package/dist/commands/preseed/build.d.ts.map +1 -0
  37. package/dist/commands/preseed/build.js +51 -0
  38. package/dist/commands/preseed/build.js.map +1 -0
  39. package/dist/commands/preseed/export.d.ts +28 -0
  40. package/dist/commands/preseed/export.d.ts.map +1 -0
  41. package/dist/commands/preseed/export.js +47 -0
  42. package/dist/commands/preseed/export.js.map +1 -0
  43. package/dist/commands/preseed/import.d.ts +29 -0
  44. package/dist/commands/preseed/import.d.ts.map +1 -0
  45. package/dist/commands/preseed/import.js +81 -0
  46. package/dist/commands/preseed/import.js.map +1 -0
  47. package/dist/commands/preseed/refresh.d.ts +25 -0
  48. package/dist/commands/preseed/refresh.d.ts.map +1 -0
  49. package/dist/commands/preseed/refresh.js +37 -0
  50. package/dist/commands/preseed/refresh.js.map +1 -0
  51. package/dist/commands/preseed/status.d.ts +26 -0
  52. package/dist/commands/preseed/status.d.ts.map +1 -0
  53. package/dist/commands/preseed/status.js +34 -0
  54. package/dist/commands/preseed/status.js.map +1 -0
  55. package/dist/commands/transfer/batch.js +1 -1
  56. package/dist/commands/transfer/batch.js.map +1 -1
  57. package/dist/commands/transfer.d.ts +2 -0
  58. package/dist/commands/transfer.d.ts.map +1 -1
  59. package/dist/commands/transfer.js +86 -15
  60. package/dist/commands/transfer.js.map +1 -1
  61. package/dist/commands/tui.d.ts.map +1 -1
  62. package/dist/commands/tui.js +4 -1
  63. package/dist/commands/tui.js.map +1 -1
  64. package/dist/commands/wallet/address.d.ts +1 -1
  65. package/dist/commands/wallet/address.d.ts.map +1 -1
  66. package/dist/commands/wallet/address.js +11 -2
  67. package/dist/commands/wallet/address.js.map +1 -1
  68. package/dist/commands/wallet/export-phrase.d.ts +35 -0
  69. package/dist/commands/wallet/export-phrase.d.ts.map +1 -0
  70. package/dist/commands/wallet/export-phrase.js +93 -0
  71. package/dist/commands/wallet/export-phrase.js.map +1 -0
  72. package/dist/commands/wallet/generate.d.ts.map +1 -1
  73. package/dist/commands/wallet/generate.js +14 -2
  74. package/dist/commands/wallet/generate.js.map +1 -1
  75. package/dist/mainnet-guard.d.ts +29 -0
  76. package/dist/mainnet-guard.d.ts.map +1 -0
  77. package/dist/mainnet-guard.js +48 -0
  78. package/dist/mainnet-guard.js.map +1 -0
  79. package/package.json +11 -6
@@ -0,0 +1,47 @@
1
+ import { mkdirSync, writeFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import { Args } from '@oclif/core';
4
+ import { BaseCommand } from '../../base-command.js';
5
+ import { exportReference, resolveSyncStore } from '@shieldedtech/moth-wallet';
6
+ /**
7
+ * Write this machine's reference out as a portable directory.
8
+ *
9
+ * What makes one machine's hour every other machine's seconds — including CI,
10
+ * where a persistent per-network cache plus `preseed refresh` costs seconds per
11
+ * run.
12
+ */
13
+ export default class PreseedExport extends BaseCommand {
14
+ static description = 'Write this machine\'s pre-seed reference to a directory';
15
+ static examples = ['<%= config.bin %> preseed export ./ref --network preprod'];
16
+ static args = {
17
+ path: Args.string({ description: 'Directory to write the reference into', required: true }),
18
+ };
19
+ static flags = { ...BaseCommand.baseFlags };
20
+ async run() {
21
+ const { args, flags } = await this.parse(PreseedExport);
22
+ this.outputFormat = flags.output ?? 'text';
23
+ this.verbose = flags.verbose;
24
+ const network = await this.getNetworkConfig(flags.network, this.getNetworkOverrides(flags));
25
+ const bundle = await exportReference(await resolveSyncStore(), network.id);
26
+ if (!bundle) {
27
+ this.outputError('WALLET_ERROR', `No usable reference for ${network.id} to export.`, 'Import or build one first.');
28
+ this.exit(1);
29
+ return;
30
+ }
31
+ mkdirSync(args.path, { recursive: true });
32
+ for (const [name, bytes] of bundle.files) {
33
+ writeFileSync(join(args.path, name), bytes);
34
+ }
35
+ writeFileSync(join(args.path, 'manifest.json'), `${JSON.stringify(bundle.manifest, null, 2)}\n`);
36
+ this.outputSuccess({
37
+ network: network.id,
38
+ height: bundle.manifest.height,
39
+ directory: args.path,
40
+ files: [...bundle.files.keys(), 'manifest.json'],
41
+ // Said out loud because the whole point of exporting is to hand it to
42
+ // someone, and people are right to ask what they are handing over.
43
+ note: 'State only — the reference wallet mnemonic is never exported.',
44
+ });
45
+ }
46
+ }
47
+ //# sourceMappingURL=export.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../../src/commands/preseed/export.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACnC,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAE9E;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAU,WAAW,GAAG,yDAAyD,CAAC;IAExF,MAAM,CAAU,QAAQ,GAAG,CAAC,0DAA0D,CAAC,CAAC;IAExF,MAAM,CAAU,IAAI,GAAG;QACrB,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,uCAAuC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;KAC5F,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;IAErD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QACxD,IAAI,CAAC,YAAY,GAAI,KAAK,CAAC,MAA0B,IAAI,MAAM,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAE7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,MAAM,gBAAgB,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;QAC3E,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,IAAI,CAAC,WAAW,CACd,cAAc,EACd,2BAA2B,OAAO,CAAC,EAAE,aAAa,EAClD,4BAA4B,CAC7B,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1C,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACzC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9C,CAAC;QACD,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;QAEjG,IAAI,CAAC,aAAa,CAAC;YACjB,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM;YAC9B,SAAS,EAAE,IAAI,CAAC,IAAI;YACpB,KAAK,EAAE,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,eAAe,CAAC;YAChD,sEAAsE;YACtE,mEAAmE;YACnE,IAAI,EAAE,+DAA+D;SACtE,CAAC,CAAC;IACL,CAAC"}
@@ -0,0 +1,29 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ /**
3
+ * Load a reference produced elsewhere.
4
+ *
5
+ * The route to prefer over `preseed build`: the same serialized state arrives in
6
+ * seconds where a build walks the chain for tens of minutes. Accepts a directory
7
+ * from `preseed export`, or the extension's committed `preseed/<network>/`.
8
+ */
9
+ export default class PreseedImport extends BaseCommand {
10
+ static description: string;
11
+ static examples: string[];
12
+ static args: {
13
+ path: import("@oclif/core/interfaces").Arg<string, Record<string, unknown>>;
14
+ };
15
+ static flags: {
16
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
18
+ network: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
19
+ wallet: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
21
+ timeout: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ 'proof-server': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ prover: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
24
+ indexer: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
25
+ 'node-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
26
+ };
27
+ run(): Promise<void>;
28
+ }
29
+ //# sourceMappingURL=import.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.d.ts","sourceRoot":"","sources":["../../../src/commands/preseed/import.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AASpD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,OAAgB,WAAW,SAAgD;IAE3E,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;;;;;;MAMnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2D3B"}
@@ -0,0 +1,81 @@
1
+ import { existsSync, readFileSync, statSync } from 'node:fs';
2
+ import { basename, join } from 'node:path';
3
+ import { Args, Flags } from '@oclif/core';
4
+ import { BaseCommand } from '../../base-command.js';
5
+ import { importReference, ReferenceImportError, resolveSyncStore, } from '@shieldedtech/moth-wallet';
6
+ /**
7
+ * Load a reference produced elsewhere.
8
+ *
9
+ * The route to prefer over `preseed build`: the same serialized state arrives in
10
+ * seconds where a build walks the chain for tens of minutes. Accepts a directory
11
+ * from `preseed export`, or the extension's committed `preseed/<network>/`.
12
+ */
13
+ export default class PreseedImport extends BaseCommand {
14
+ static description = 'Load a pre-seed reference from a directory';
15
+ static examples = [
16
+ '<%= config.bin %> preseed import ./ref --network preprod',
17
+ '<%= config.bin %> preseed import packages/extension/public/preseed/preprod --network preprod',
18
+ ];
19
+ static args = {
20
+ path: Args.string({ description: 'Directory holding manifest.json and the parts', required: true }),
21
+ };
22
+ static flags = {
23
+ ...BaseCommand.baseFlags,
24
+ force: Flags.boolean({
25
+ description: 'Import a reference older than the one already here',
26
+ default: false,
27
+ }),
28
+ };
29
+ async run() {
30
+ const { args, flags } = await this.parse(PreseedImport);
31
+ this.outputFormat = flags.output ?? 'text';
32
+ this.verbose = flags.verbose;
33
+ const network = await this.getNetworkConfig(flags.network, this.getNetworkOverrides(flags));
34
+ const dir = args.path;
35
+ const manifestPath = join(dir, 'manifest.json');
36
+ if (!existsSync(manifestPath)) {
37
+ this.outputError('INVALID_INPUT', `No manifest.json in ${dir}.`, 'Point this at a directory produced by `preseed export`, or an extension preseed/<network>/ directory.');
38
+ this.exit(1);
39
+ return;
40
+ }
41
+ let manifest;
42
+ try {
43
+ manifest = JSON.parse(readFileSync(manifestPath, 'utf8'));
44
+ }
45
+ catch (err) {
46
+ this.outputError('INVALID_INPUT', `manifest.json is not readable JSON: ${String(err)}`);
47
+ this.exit(1);
48
+ return;
49
+ }
50
+ const files = new Map();
51
+ for (const name of ['shielded.dat.gz', 'unshielded.dat.gz', 'dust.dat.gz']) {
52
+ const at = join(dir, name);
53
+ if (existsSync(at) && statSync(at).isFile()) {
54
+ files.set(basename(at), new Uint8Array(readFileSync(at)));
55
+ }
56
+ }
57
+ const bundle = { manifest, files };
58
+ try {
59
+ const result = await importReference(await resolveSyncStore(), network.id, bundle, {
60
+ force: flags.force,
61
+ });
62
+ this.outputSuccess({
63
+ network: network.id,
64
+ height: result.height,
65
+ replacedHeight: result.replacedHeight,
66
+ message: result.replacedHeight === null
67
+ ? `Imported a reference at height ${result.height}. Wallets created from now on start there.`
68
+ : `Replaced height ${result.replacedHeight} with ${result.height}.`,
69
+ });
70
+ }
71
+ catch (err) {
72
+ if (err instanceof ReferenceImportError) {
73
+ this.outputError('INVALID_INPUT', err.message);
74
+ this.exit(1);
75
+ return;
76
+ }
77
+ throw err;
78
+ }
79
+ }
80
+ }
81
+ //# sourceMappingURL=import.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"import.js","sourceRoot":"","sources":["../../../src/commands/preseed/import.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ /**
3
+ * Advance an existing reference to the current chain tip.
4
+ *
5
+ * Catches one up rather than rebuilding it: measured at 9.1s to advance 25,660
6
+ * blocks, against 53.6 min to rebuild the same reference from genesis — which is
7
+ * what this command exists to stop anyone doing by hand.
8
+ */
9
+ export default class PreseedRefresh extends BaseCommand {
10
+ static description: string;
11
+ static examples: string[];
12
+ static flags: {
13
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
+ network: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ wallet: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ timeout: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ 'proof-server': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ prover: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ indexer: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ 'node-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ };
23
+ run(): Promise<void>;
24
+ }
25
+ //# sourceMappingURL=refresh.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.d.ts","sourceRoot":"","sources":["../../../src/commands/preseed/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,OAAgB,WAAW,SAAiE;IAE5F,OAAgB,QAAQ,WAA2D;IAEnF,OAAgB,KAAK;;;;;;;;;;MAAgC;IAE/C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA6B3B"}
@@ -0,0 +1,37 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ import { preseedReferenceStatus, refreshEmptyRefCache } from '@shieldedtech/moth-wallet';
3
+ /**
4
+ * Advance an existing reference to the current chain tip.
5
+ *
6
+ * Catches one up rather than rebuilding it: measured at 9.1s to advance 25,660
7
+ * blocks, against 53.6 min to rebuild the same reference from genesis — which is
8
+ * what this command exists to stop anyone doing by hand.
9
+ */
10
+ export default class PreseedRefresh extends BaseCommand {
11
+ static description = 'Advance this machine\'s pre-seed reference to the chain tip';
12
+ static examples = ['<%= config.bin %> preseed refresh --network preprod'];
13
+ static flags = { ...BaseCommand.baseFlags };
14
+ async run() {
15
+ const { flags } = await this.parse(PreseedRefresh);
16
+ this.outputFormat = flags.output ?? 'text';
17
+ this.verbose = flags.verbose;
18
+ const network = await this.getNetworkConfig(flags.network, this.getNetworkOverrides(flags));
19
+ const before = await preseedReferenceStatus(network);
20
+ if (!before.ready) {
21
+ this.outputError('WALLET_ERROR', `No reference to refresh for ${network.id}.`, 'Import one with `preseed import`, or build one with `preseed build`.');
22
+ this.exit(1);
23
+ return;
24
+ }
25
+ const started = Date.now();
26
+ await refreshEmptyRefCache(network, (msg) => this.log_verbose(msg));
27
+ const after = await preseedReferenceStatus(network);
28
+ this.outputSuccess({
29
+ network: network.id,
30
+ heightBefore: before.height,
31
+ heightAfter: after.height,
32
+ advancedBlocks: (after.height ?? 0) - (before.height ?? 0),
33
+ seconds: Math.round((Date.now() - started) / 1000),
34
+ });
35
+ }
36
+ }
37
+ //# sourceMappingURL=refresh.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"refresh.js","sourceRoot":"","sources":["../../../src/commands/preseed/refresh.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAEzF;;;;;;GAMG;AACH,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,MAAM,CAAU,WAAW,GAAG,6DAA6D,CAAC;IAE5F,MAAM,CAAU,QAAQ,GAAG,CAAC,qDAAqD,CAAC,CAAC;IAEnF,MAAM,CAAU,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;IAErD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,GAAI,KAAK,CAAC,MAA0B,IAAI,MAAM,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAE7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;YAClB,IAAI,CAAC,WAAW,CACd,cAAc,EACd,+BAA+B,OAAO,CAAC,EAAE,GAAG,EAC5C,sEAAsE,CACvE,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,OAAO;QACT,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,MAAM,oBAAoB,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC;QACpE,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAEpD,IAAI,CAAC,aAAa,CAAC;YACjB,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,YAAY,EAAE,MAAM,CAAC,MAAM;YAC3B,WAAW,EAAE,KAAK,CAAC,MAAM;YACzB,cAAc,EAAE,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,CAAC;YAC1D,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC;SACnD,CAAC,CAAC;IACL,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ /**
3
+ * Report whether this machine holds a usable pre-seed reference.
4
+ *
5
+ * A reference is one empty wallet synced to chain tip. Wallets created after it
6
+ * start from its state instead of walking the chain — 78.6 min of DUST sync
7
+ * becomes 29.3s on preprod. Worth its own command because the absence is silent:
8
+ * a wallet with no reference to use just syncs slowly.
9
+ */
10
+ export default class PreseedStatus extends BaseCommand {
11
+ static description: string;
12
+ static examples: string[];
13
+ static flags: {
14
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
15
+ network: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
16
+ wallet: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
+ timeout: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ 'proof-server': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ prover: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ indexer: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
22
+ 'node-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
23
+ };
24
+ run(): Promise<void>;
25
+ }
26
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../../src/commands/preseed/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAGpD;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,OAAgB,WAAW,SAA0D;IAErF,OAAgB,QAAQ,WAGtB;IAEF,OAAgB,KAAK;;;;;;;;;;MAAgC;IAE/C,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAiB3B"}
@@ -0,0 +1,34 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ import { preseedReferenceStatus } from '@shieldedtech/moth-wallet';
3
+ /**
4
+ * Report whether this machine holds a usable pre-seed reference.
5
+ *
6
+ * A reference is one empty wallet synced to chain tip. Wallets created after it
7
+ * start from its state instead of walking the chain — 78.6 min of DUST sync
8
+ * becomes 29.3s on preprod. Worth its own command because the absence is silent:
9
+ * a wallet with no reference to use just syncs slowly.
10
+ */
11
+ export default class PreseedStatus extends BaseCommand {
12
+ static description = "Show this machine's pre-seed reference for a network";
13
+ static examples = [
14
+ '<%= config.bin %> preseed status',
15
+ '<%= config.bin %> preseed status --network preprod',
16
+ ];
17
+ static flags = { ...BaseCommand.baseFlags };
18
+ async run() {
19
+ const { flags } = await this.parse(PreseedStatus);
20
+ this.outputFormat = flags.output ?? 'text';
21
+ this.verbose = flags.verbose;
22
+ const network = await this.getNetworkConfig(flags.network, this.getNetworkOverrides(flags));
23
+ const status = await preseedReferenceStatus(network);
24
+ this.outputSuccess({
25
+ network: network.id,
26
+ ready: status.ready,
27
+ height: status.height,
28
+ message: status.ready
29
+ ? `Reference at height ${status.height}. Wallets created from now on start there.`
30
+ : 'No usable reference for this network. Import one with `preseed import`, or build one with `preseed build`.',
31
+ });
32
+ }
33
+ }
34
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../../../src/commands/preseed/status.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACpD,OAAO,EAAE,sBAAsB,EAAE,MAAM,2BAA2B,CAAC;AAEnE;;;;;;;GAOG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,MAAM,CAAU,WAAW,GAAG,sDAAsD,CAAC;IAErF,MAAM,CAAU,QAAQ,GAAG;QACzB,kCAAkC;QAClC,oDAAoD;KACrD,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG,EAAE,GAAG,WAAW,CAAC,SAAS,EAAE,CAAC;IAErD,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAClD,IAAI,CAAC,YAAY,GAAI,KAAK,CAAC,MAA0B,IAAI,MAAM,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAE7B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5F,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC,OAAO,CAAC,CAAC;QAErD,IAAI,CAAC,aAAa,CAAC;YACjB,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,OAAO,EAAE,MAAM,CAAC,KAAK;gBACnB,CAAC,CAAC,uBAAuB,MAAM,CAAC,MAAM,4CAA4C;gBAClF,CAAC,CAAC,4GAA4G;SACjH,CAAC,CAAC;IACL,CAAC"}
@@ -51,7 +51,7 @@ export default class TransferBatch extends BaseCommand {
51
51
  process.stderr.write('Syncing wallet before batch transfer...\n');
52
52
  const syncedWallet = await startWalletSync(wallet.walletKeys, network, (msg) => {
53
53
  this.log_verbose(msg);
54
- }, walletName);
54
+ }, walletName, false, await this.syncBirthday(walletName, network.id));
55
55
  try {
56
56
  const summary = await executeBatchTransfer(syncedWallet.facade, wallet.walletKeys, network.id, entries, (index, stage) => {
57
57
  process.stderr.write(`Transfer ${index + 1}/${entries.length}: ${stage}\n`);
@@ -1 +1 @@
1
- {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/commands/transfer/batch.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"batch.js","sourceRoot":"","sources":["../../../src/commands/transfer/batch.ts"],"names":[],"mappings":"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"}
@@ -6,6 +6,8 @@ export default class Transfer extends BaseCommand {
6
6
  };
7
7
  static flags: {
8
8
  to: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
+ 'token-id': import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ amount: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
9
11
  shielded: import("@oclif/core/interfaces").BooleanFlag<boolean>;
10
12
  yes: import("@oclif/core/interfaces").BooleanFlag<boolean>;
11
13
  'wait-timeout-ms': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/commands/transfer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAWjD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,OAAgB,WAAW,SAA2B;IAEtD,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;;;;;;;;;MAiBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CA2E3B"}
1
+ {"version":3,"file":"transfer.d.ts","sourceRoot":"","sources":["../../src/commands/transfer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAiBjD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,OAAgB,WAAW,SAA2B;IAEtD,OAAgB,IAAI;;MAElB;IAEF,OAAgB,KAAK;;;;;;;;;;;;;;;;MA6BnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwI3B"}
@@ -1,7 +1,7 @@
1
1
  import { Args, Flags } from '@oclif/core';
2
2
  import { BaseCommand } from '../base-command.js';
3
3
  import { getPassphrase } from '../adapters/passphrase.js';
4
- import { sendTokensWithKeys, startWalletSync, NIGHT_TOKEN_ID, } from '@shieldedtech/moth-wallet';
4
+ import { describeReservation, unshieldedSplit, formatBalance, NIGHT_DENOMINATION, sendTokensWithKeys, startWalletSync, NIGHT_TOKEN_ID, InvalidAmountError, parseNightAmount, } from '@shieldedtech/moth-wallet';
5
5
  export default class Transfer extends BaseCommand {
6
6
  static description = 'Transfer NIGHT tokens';
7
7
  static args = {
@@ -10,6 +10,18 @@ export default class Transfer extends BaseCommand {
10
10
  static flags = {
11
11
  ...BaseCommand.baseFlags,
12
12
  to: Flags.string({ required: false, description: 'Recipient address' }),
13
+ // #62: the token was hardcoded, so a wallet holding anything other than
14
+ // NIGHT could spend it only through `daemon transfer --token-id`. Same flag
15
+ // name and the same NIGHT default, so the two paths agree.
16
+ 'token-id': Flags.string({
17
+ description: 'Token id (64-char hex). Defaults to NIGHT.',
18
+ default: NIGHT_TOKEN_ID,
19
+ }),
20
+ // Raw smallest units, for tokens whose decimals moth does not know. The
21
+ // positional amount is a NIGHT decimal and is meaningless for those.
22
+ amount: Flags.string({
23
+ description: 'Amount in raw smallest units (required for non-NIGHT tokens)',
24
+ }),
13
25
  shielded: Flags.boolean({ default: false, description: 'Use shielded transfer' }),
14
26
  yes: Flags.boolean({
15
27
  char: 'y',
@@ -28,25 +40,60 @@ export default class Transfer extends BaseCommand {
28
40
  const { args, flags } = await this.parse(Transfer);
29
41
  this.outputFormat = flags.output ?? 'text';
30
42
  this.verbose = flags.verbose;
31
- const amountStr = await this.promptIfMissing(args.amount, 'Amount to transfer (NIGHT)');
32
43
  const to = await this.promptIfMissing(flags.to, 'Recipient address');
33
- // Parse amount: support decimal (e.g. "1.5") → multiply by 10^6 for base units
34
- const parsed = parseFloat(amountStr);
35
- if (Number.isNaN(parsed) || parsed <= 0) {
36
- this.outputError('INVALID_INPUT', `Invalid amount: ${amountStr}`);
44
+ const tokenId = flags['token-id'] ?? NIGHT_TOKEN_ID;
45
+ const isNight = tokenId === NIGHT_TOKEN_ID;
46
+ // Two ways in, and only one is valid per token. --amount is raw base units
47
+ // and works for anything; the positional is a NIGHT decimal, so it is refused
48
+ // for other tokens rather than silently scaled by NIGHT's 10^6 (#62).
49
+ let amount;
50
+ let amountLabel;
51
+ if (flags.amount !== undefined) {
52
+ if (!/^\d+$/.test(flags.amount.trim())) {
53
+ this.outputError('INVALID_INPUT', `--amount must be a whole number of base units, got "${flags.amount}"`);
54
+ this.exit(1);
55
+ return;
56
+ }
57
+ amount = BigInt(flags.amount.trim());
58
+ if (amount === 0n) {
59
+ this.outputError('INVALID_INPUT', 'Amount is zero — that moves nothing and still pays a fee');
60
+ this.exit(1);
61
+ return;
62
+ }
63
+ amountLabel = isNight ? `${flags.amount} base units (NIGHT)` : `${flags.amount} base units`;
64
+ }
65
+ else if (!isNight) {
66
+ this.outputError('INVALID_INPUT', 'A non-NIGHT token needs --amount in raw base units.', 'The positional amount is a NIGHT decimal, and moth does not know this token\'s decimals.');
37
67
  this.exit(1);
38
68
  return;
39
69
  }
40
- const amount = BigInt(Math.round(parsed * 1_000_000));
70
+ else {
71
+ const amountStr = await this.promptIfMissing(args.amount, 'Amount to transfer (NIGHT)');
72
+ try {
73
+ // Strict, shared with the daemon path. The previous parseFloat accepted
74
+ // "1,5" as 1 NIGHT and "0.0000001" as a zero transfer (#63).
75
+ amount = parseNightAmount(amountStr);
76
+ }
77
+ catch (err) {
78
+ if (err instanceof InvalidAmountError) {
79
+ this.outputError('INVALID_INPUT', err.message);
80
+ this.exit(1);
81
+ return;
82
+ }
83
+ throw err;
84
+ }
85
+ amountLabel = `${amountStr} NIGHT`;
86
+ }
41
87
  const walletName = await this.resolveWalletName(flags);
42
88
  const passphrase = await getPassphrase();
43
89
  const wallet = await this.walletManager.unlock(walletName, passphrase);
44
90
  const network = await this.getNetworkConfig(flags.network, this.getNetworkOverrides(flags));
45
- this.log_verbose(`Transferring ${amountStr} NIGHT to ${to} (shielded: ${flags.shielded})`);
91
+ this.log_verbose(`Transferring ${amountLabel} to ${to} (shielded: ${flags.shielded})`);
46
92
  // SR-003: Confirm transaction before proceeding
47
93
  await this.confirmTransaction({
48
94
  'Operation': flags.shielded ? 'Shielded transfer' : 'Unshielded transfer',
49
- 'Amount': `${amountStr} NIGHT`,
95
+ 'Amount': amountLabel,
96
+ ...(isNight ? {} : { 'Token': tokenId }),
50
97
  'Recipient': to,
51
98
  'Network': network.id,
52
99
  'Wallet': walletName,
@@ -54,7 +101,7 @@ export default class Transfer extends BaseCommand {
54
101
  process.stderr.write('Syncing wallet before transfer...\n');
55
102
  const syncedWallet = await startWalletSync(wallet.walletKeys, network, (msg) => {
56
103
  this.log_verbose(msg);
57
- }, walletName);
104
+ }, walletName, false, await this.syncBirthday(walletName, network.id));
58
105
  try {
59
106
  // Wait for the wallet to reach synced=true BEFORE building the tx.
60
107
  // startWalletSync only kicks off syncing; without this wait the transfer
@@ -68,16 +115,40 @@ export default class Transfer extends BaseCommand {
68
115
  }
69
116
  const req = {
70
117
  type: flags.shielded ? 'shielded' : 'unshielded',
71
- tokenId: NIGHT_TOKEN_ID,
118
+ tokenId,
72
119
  amount,
73
120
  to,
74
121
  };
75
- const txHash = await sendTokensWithKeys(syncedWallet.facade, wallet.walletKeys, network.id, [req], (stage) => {
76
- process.stderr.write(`Transfer: ${stage}\n`);
77
- });
122
+ let txHash;
123
+ try {
124
+ txHash = await sendTokensWithKeys(syncedWallet.facade, wallet.walletKeys, network.id, [req], (stage) => {
125
+ process.stderr.write(`Transfer: ${stage}\n`);
126
+ });
127
+ }
128
+ catch (err) {
129
+ // "Insufficient funds" on a wallet that just reported a sufficient
130
+ // balance is not a contradiction: the balance counts coins reserved by
131
+ // transactions in flight, and only available coins can be spent (#72).
132
+ // Say which number blocked it rather than leaving the two irreconcilable.
133
+ const message = err instanceof Error ? err.message : String(err);
134
+ if (/insufficient funds/i.test(message)) {
135
+ const split = unshieldedSplit(syncedWallet.balances.coins, tokenId);
136
+ const detail = describeReservation(split, amount, (raw) => isNight ? `${formatBalance(raw, NIGHT_DENOMINATION)} NIGHT` : `${raw} base units`);
137
+ if (detail) {
138
+ this.outputError('WALLET_ERROR', `Insufficient available funds. ${detail}`);
139
+ this.exit(1);
140
+ return;
141
+ }
142
+ }
143
+ throw err;
144
+ }
78
145
  this.outputSuccess({
79
146
  txHash,
80
- amount: amountStr,
147
+ // Base units, unambiguously — the previous field echoed whatever the user
148
+ // typed, which is a different thing from what was sent.
149
+ amount: amount.toString(),
150
+ amountLabel,
151
+ tokenId,
81
152
  recipient: to,
82
153
  shielded: flags.shielded,
83
154
  network: network.id,
@@ -1 +1 @@
1
- {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/commands/transfer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/commands/transfer.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAW;IAC1C,OAAgB,WAAW,SAA2C;IAEtE,OAAgB,KAAK;;;;;;;;;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAa3B"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAW;IAC1C,OAAgB,WAAW,SAA2C;IAEtE,OAAgB,KAAK;;;;;;;;;;MAEnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAe3B"}
@@ -1,3 +1,4 @@
1
+ import { canonicalNetworkId } from '@shieldedtech/moth-wallet';
1
2
  import { BaseCommand } from '../base-command.js';
2
3
  export default class Tui extends BaseCommand {
3
4
  static description = 'Launch interactive terminal dashboard';
@@ -7,7 +8,9 @@ export default class Tui extends BaseCommand {
7
8
  async run() {
8
9
  const { flags } = await this.parse(Tui);
9
10
  const walletName = await this.resolveWalletName(flags).catch(() => 'none');
10
- const networkId = flags.network;
11
+ // The TUI is handed the flag value directly rather than a resolved config,
12
+ // so a renamed id is resolved here instead.
13
+ const networkId = canonicalNetworkId(flags.network);
11
14
  // Dynamic imports — TUI, React, and Ink loaded only when this command runs
12
15
  const { render } = await import('ink');
13
16
  const { createElement } = await import('react');
@@ -1 +1 @@
1
- {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAW;IAC1C,MAAM,CAAU,WAAW,GAAG,uCAAuC,CAAC;IAEtE,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,WAAW,CAAC,SAAS;KACzB,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAExC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3E,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC;QAEhC,2EAA2E;QAC3E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,wBAAwB,CAAQ,CAAC;QAEpF,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC"}
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEjD,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,WAAW;IAC1C,MAAM,CAAU,WAAW,GAAG,uCAAuC,CAAC;IAEtE,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,WAAW,CAAC,SAAS;KACzB,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAExC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC;QAC3E,2EAA2E;QAC3E,4CAA4C;QAC5C,MAAM,SAAS,GAAG,kBAAkB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAEpD,2EAA2E;QAC3E,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC,CAAC;QACvC,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,CAAC;QAChD,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,yBAAyB,CAAC,wBAAwB,CAAQ,CAAC;QAEpF,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;IAC5D,CAAC"}
@@ -8,7 +8,7 @@ import { BaseCommand } from '../../base-command.js';
8
8
  export default class WalletAddress extends BaseCommand {
9
9
  static description: string;
10
10
  static flags: {
11
- name: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
12
  output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
13
  network: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
14
  wallet: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
@@ -1 +1 @@
1
- {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../src/commands/wallet/address.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,OAAgB,WAAW,SAAyE;IAEpG,OAAgB,KAAK;;;;;;;;;;;MAGnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IAuB1B,OAAO,CAAC,UAAU;CAOnB"}
1
+ {"version":3,"file":"address.d.ts","sourceRoot":"","sources":["../../../src/commands/wallet/address.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAIpD;;;;;GAKG;AACH,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,WAAW;IACpD,OAAgB,WAAW,SAAyE;IAEpG,OAAgB,KAAK;;;;;;;;;;;MAUnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;IA0B1B,OAAO,CAAC,UAAU;CAOnB"}