@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.
- package/CHANGELOG.md +226 -0
- package/dist/base-command.d.ts +21 -0
- package/dist/base-command.d.ts.map +1 -1
- package/dist/base-command.js +53 -17
- package/dist/base-command.js.map +1 -1
- package/dist/commands/balance.d.ts.map +1 -1
- package/dist/commands/balance.js +20 -2
- package/dist/commands/balance.js.map +1 -1
- package/dist/commands/call.js +1 -1
- package/dist/commands/call.js.map +1 -1
- package/dist/commands/config.d.ts +1 -1
- package/dist/commands/config.d.ts.map +1 -1
- package/dist/commands/config.js +13 -1
- package/dist/commands/config.js.map +1 -1
- package/dist/commands/daemon/serve.d.ts.map +1 -1
- package/dist/commands/daemon/serve.js +1 -1
- package/dist/commands/daemon/serve.js.map +1 -1
- package/dist/commands/deploy.js +1 -1
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/diagnostics/timings.d.ts +28 -0
- package/dist/commands/diagnostics/timings.d.ts.map +1 -0
- package/dist/commands/diagnostics/timings.js +77 -0
- package/dist/commands/diagnostics/timings.js.map +1 -0
- package/dist/commands/dust/deregister.js +1 -1
- package/dist/commands/dust/deregister.js.map +1 -1
- package/dist/commands/dust/register.d.ts.map +1 -1
- package/dist/commands/dust/register.js +15 -2
- package/dist/commands/dust/register.js.map +1 -1
- package/dist/commands/maintenance/insert-vk.js +1 -1
- package/dist/commands/maintenance/insert-vk.js.map +1 -1
- package/dist/commands/maintenance/insert-vks-batch.js +1 -1
- package/dist/commands/maintenance/insert-vks-batch.js.map +1 -1
- package/dist/commands/mint.js +1 -1
- package/dist/commands/mint.js.map +1 -1
- package/dist/commands/preseed/build.d.ts +28 -0
- package/dist/commands/preseed/build.d.ts.map +1 -0
- package/dist/commands/preseed/build.js +51 -0
- package/dist/commands/preseed/build.js.map +1 -0
- package/dist/commands/preseed/export.d.ts +28 -0
- package/dist/commands/preseed/export.d.ts.map +1 -0
- package/dist/commands/preseed/export.js +47 -0
- package/dist/commands/preseed/export.js.map +1 -0
- package/dist/commands/preseed/import.d.ts +29 -0
- package/dist/commands/preseed/import.d.ts.map +1 -0
- package/dist/commands/preseed/import.js +81 -0
- package/dist/commands/preseed/import.js.map +1 -0
- package/dist/commands/preseed/refresh.d.ts +25 -0
- package/dist/commands/preseed/refresh.d.ts.map +1 -0
- package/dist/commands/preseed/refresh.js +37 -0
- package/dist/commands/preseed/refresh.js.map +1 -0
- package/dist/commands/preseed/status.d.ts +26 -0
- package/dist/commands/preseed/status.d.ts.map +1 -0
- package/dist/commands/preseed/status.js +34 -0
- package/dist/commands/preseed/status.js.map +1 -0
- package/dist/commands/transfer/batch.js +1 -1
- package/dist/commands/transfer/batch.js.map +1 -1
- package/dist/commands/transfer.d.ts +2 -0
- package/dist/commands/transfer.d.ts.map +1 -1
- package/dist/commands/transfer.js +86 -15
- package/dist/commands/transfer.js.map +1 -1
- package/dist/commands/tui.d.ts.map +1 -1
- package/dist/commands/tui.js +4 -1
- package/dist/commands/tui.js.map +1 -1
- package/dist/commands/wallet/address.d.ts +1 -1
- package/dist/commands/wallet/address.d.ts.map +1 -1
- package/dist/commands/wallet/address.js +11 -2
- package/dist/commands/wallet/address.js.map +1 -1
- package/dist/commands/wallet/export-phrase.d.ts +35 -0
- package/dist/commands/wallet/export-phrase.d.ts.map +1 -0
- package/dist/commands/wallet/export-phrase.js +93 -0
- package/dist/commands/wallet/export-phrase.js.map +1 -0
- package/dist/commands/wallet/generate.d.ts.map +1 -1
- package/dist/commands/wallet/generate.js +14 -2
- package/dist/commands/wallet/generate.js.map +1 -1
- package/dist/mainnet-guard.d.ts +29 -0
- package/dist/mainnet-guard.d.ts.map +1 -0
- package/dist/mainnet-guard.js +48 -0
- package/dist/mainnet-guard.js.map +1 -0
- 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;
|
|
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
|
-
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
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
|
-
|
|
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 ${
|
|
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':
|
|
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
|
|
118
|
+
tokenId,
|
|
72
119
|
amount,
|
|
73
120
|
to,
|
|
74
121
|
};
|
|
75
|
-
|
|
76
|
-
|
|
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
|
-
|
|
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":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,kBAAkB,EAClB,eAAe,EACf,cAAc,
|
|
1
|
+
{"version":3,"file":"transfer.js","sourceRoot":"","sources":["../../src/commands/transfer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EACL,mBAAmB,EACnB,eAAe,EACf,aAAa,EACb,kBAAkB,EAClB,kBAAkB,EAClB,eAAe,EACf,cAAc,EACd,kBAAkB,EAClB,gBAAgB,GAIjB,MAAM,2BAA2B,CAAC;AAEnC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,WAAW;IAC/C,MAAM,CAAU,WAAW,GAAG,uBAAuB,CAAC;IAEtD,MAAM,CAAU,IAAI,GAAG;QACrB,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,+BAA+B,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KACvF,CAAC;IAEF,MAAM,CAAU,KAAK,GAAG;QACtB,GAAG,WAAW,CAAC,SAAS;QACxB,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,CAAC;QACvE,wEAAwE;QACxE,4EAA4E;QAC5E,2DAA2D;QAC3D,UAAU,EAAE,KAAK,CAAC,MAAM,CAAC;YACvB,WAAW,EAAE,4CAA4C;YACzD,OAAO,EAAE,cAAc;SACxB,CAAC;QACF,wEAAwE;QACxE,qEAAqE;QACrE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;YACnB,WAAW,EAAE,8DAA8D;SAC5E,CAAC;QACF,QAAQ,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,uBAAuB,EAAE,CAAC;QACjF,GAAG,EAAE,KAAK,CAAC,OAAO,CAAC;YACjB,IAAI,EAAE,GAAG;YACT,OAAO,EAAE,KAAK;YACd,WAAW,EAAE,0BAA0B;SACxC,CAAC;QACF,iBAAiB,EAAE,KAAK,CAAC,OAAO,CAAC;YAC/B,WAAW,EACT,qFAAqF;gBACrF,uFAAuF;gBACvF,uFAAuF;gBACvF,qCAAqC;YACvC,OAAO,EAAE,OAAO;SACjB,CAAC;KACH,CAAC;IAEF,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACnD,IAAI,CAAC,YAAY,GAAI,KAAK,CAAC,MAA0B,IAAI,MAAM,CAAC;QAChE,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAE7B,MAAM,EAAE,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,EAAE,EAAE,mBAAmB,CAAC,CAAC;QACrE,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,cAAc,CAAC;QACpD,MAAM,OAAO,GAAG,OAAO,KAAK,cAAc,CAAC;QAE3C,2EAA2E;QAC3E,8EAA8E;QAC9E,sEAAsE;QACtE,IAAI,MAAc,CAAC;QACnB,IAAI,WAAmB,CAAC;QACxB,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;gBACvC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,uDAAuD,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;gBAC1G,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACb,OAAO;YACT,CAAC;YACD,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;YACrC,IAAI,MAAM,KAAK,EAAE,EAAE,CAAC;gBAClB,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,0DAA0D,CAAC,CAAC;gBAC9F,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACb,OAAO;YACT,CAAC;YACD,WAAW,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,MAAM,aAAa,CAAC;QAC9F,CAAC;aAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,CAAC,WAAW,CACd,eAAe,EACf,qDAAqD,EACrD,0FAA0F,CAC3F,CAAC;YACF,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACb,OAAO;QACT,CAAC;aAAM,CAAC;YACN,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,MAAM,EAAE,4BAA4B,CAAC,CAAC;YACxF,IAAI,CAAC;gBACH,wEAAwE;gBACxE,6DAA6D;gBAC7D,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;YACvC,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,GAAG,YAAY,kBAAkB,EAAE,CAAC;oBACtC,IAAI,CAAC,WAAW,CAAC,eAAe,EAAE,GAAG,CAAC,OAAO,CAAC,CAAC;oBAC/C,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;oBACb,OAAO;gBACT,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;YACD,WAAW,GAAG,GAAG,SAAS,QAAQ,CAAC;QACrC,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,UAAU,GAAG,MAAM,aAAa,EAAE,CAAC;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QACvE,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC;QAE5F,IAAI,CAAC,WAAW,CAAC,gBAAgB,WAAW,OAAO,EAAE,eAAe,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC;QAEvF,gDAAgD;QAChD,MAAM,IAAI,CAAC,kBAAkB,CAAC;YAC5B,WAAW,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC,qBAAqB;YACzE,QAAQ,EAAE,WAAW;YACrB,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAC,OAAO,EAAE,OAAO,EAAC,CAAC;YACtC,WAAW,EAAE,EAAE;YACf,SAAS,EAAE,OAAO,CAAC,EAAE;YACrB,QAAQ,EAAE,UAAU;SACrB,EAAE,KAAK,CAAC,CAAC;QAEV,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QAC5D,MAAM,YAAY,GAAG,MAAM,eAAe,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YAC7E,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;QACxB,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;QAEvE,IAAI,CAAC;YACH,mEAAmE;YACnE,yEAAyE;YACzE,2EAA2E;YAC3E,0EAA0E;YAC1E,2EAA2E;YAC3E,4EAA4E;YAC5E,MAAM,aAAa,CAAC,YAAY,EAAE,KAAK,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC5D,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;gBAClC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,mGAAmG,CACpG,CAAC;YACJ,CAAC;YAED,MAAM,GAAG,GAAgB;gBACvB,IAAI,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,YAAY;gBAChD,OAAO;gBACP,MAAM;gBACN,EAAE;aACH,CAAC;YAEF,IAAI,MAAc,CAAC;YACnB,IAAI,CAAC;gBACH,MAAM,GAAG,MAAM,kBAAkB,CAAC,YAAY,CAAC,MAAM,EAAE,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;oBACrG,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,KAAK,IAAI,CAAC,CAAC;gBAC/C,CAAC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,mEAAmE;gBACnE,uEAAuE;gBACvE,uEAAuE;gBACvE,0EAA0E;gBAC1E,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,IAAI,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;oBACxC,MAAM,KAAK,GAAG,eAAe,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;oBACpE,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE,CACxD,OAAO,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC,GAAG,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,GAAG,aAAa,CAClF,CAAC;oBACF,IAAI,MAAM,EAAE,CAAC;wBACX,IAAI,CAAC,WAAW,CAAC,cAAc,EAAE,iCAAiC,MAAM,EAAE,CAAC,CAAC;wBAC5E,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;wBACb,OAAO;oBACT,CAAC;gBACH,CAAC;gBACD,MAAM,GAAG,CAAC;YACZ,CAAC;YAED,IAAI,CAAC,aAAa,CAAC;gBACjB,MAAM;gBACN,0EAA0E;gBAC1E,wDAAwD;gBACxD,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE;gBACzB,WAAW;gBACX,OAAO;gBACP,SAAS,EAAE,EAAE;gBACb,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,OAAO,EAAE,OAAO,CAAC,EAAE;aACpB,CAAC,CAAC;QACL,CAAC;gBAAS,CAAC;YACT,MAAM,YAAY,CAAC,IAAI,EAAE,CAAC;YAC1B,MAAM,CAAC,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;;AAGH;;;;;GAKG;AACH,SAAS,aAAa,CAAC,MAAoB,EAAE,SAAiB;IAC5D,OAAO,IAAI,OAAO,CAAO,CAAC,YAAY,EAAE,EAAE;QACxC,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM;YAAE,OAAO,YAAY,EAAE,CAAC;QAClD,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC;gBACH,KAAK,EAAE,CAAC;YACV,CAAC;YAAC,MAAM,CAAC;gBACP,gBAAgB;YAClB,CAAC;YACD,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,YAAY,EAAE,CAAC;QACjB,CAAC,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,CAAC,SAAS,CAAC,CAAC,CAAiB,EAAE,EAAE;YACnD,IAAI,CAAC,CAAC,MAAM;gBAAE,MAAM,EAAE,CAAC;QACzB,CAAC,CAAC,CAAC;QACH,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC,KAAK,EAAE,CAAC;IACtD,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/commands/tui.ts"],"names":[],"mappings":"
|
|
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"}
|
package/dist/commands/tui.js
CHANGED
|
@@ -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
|
-
|
|
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');
|
package/dist/commands/tui.js.map
CHANGED
|
@@ -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;
|
|
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;;;;;;;;;;;
|
|
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"}
|