@shieldedtech/moth-cli 0.2.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 (173) hide show
  1. package/README.md +67 -0
  2. package/dist/adapters/passphrase.d.ts +2 -0
  3. package/dist/adapters/passphrase.d.ts.map +1 -0
  4. package/dist/adapters/passphrase.js +62 -0
  5. package/dist/adapters/passphrase.js.map +1 -0
  6. package/dist/base-command.d.ts +155 -0
  7. package/dist/base-command.d.ts.map +1 -0
  8. package/dist/base-command.js +497 -0
  9. package/dist/base-command.js.map +1 -0
  10. package/dist/commands/airdrop.d.ts +18 -0
  11. package/dist/commands/airdrop.d.ts.map +1 -0
  12. package/dist/commands/airdrop.js +36 -0
  13. package/dist/commands/airdrop.js.map +1 -0
  14. package/dist/commands/balance.d.ts +18 -0
  15. package/dist/commands/balance.d.ts.map +1 -0
  16. package/dist/commands/balance.js +124 -0
  17. package/dist/commands/balance.js.map +1 -0
  18. package/dist/commands/call.d.ts +26 -0
  19. package/dist/commands/call.d.ts.map +1 -0
  20. package/dist/commands/call.js +102 -0
  21. package/dist/commands/call.js.map +1 -0
  22. package/dist/commands/config.d.ts +22 -0
  23. package/dist/commands/config.d.ts.map +1 -0
  24. package/dist/commands/config.js +50 -0
  25. package/dist/commands/config.js.map +1 -0
  26. package/dist/commands/daemon/call.d.ts +27 -0
  27. package/dist/commands/daemon/call.d.ts.map +1 -0
  28. package/dist/commands/daemon/call.js +108 -0
  29. package/dist/commands/daemon/call.js.map +1 -0
  30. package/dist/commands/daemon/deploy.d.ts +27 -0
  31. package/dist/commands/daemon/deploy.d.ts.map +1 -0
  32. package/dist/commands/daemon/deploy.js +105 -0
  33. package/dist/commands/daemon/deploy.js.map +1 -0
  34. package/dist/commands/daemon/dust/deregister.d.ts +19 -0
  35. package/dist/commands/daemon/dust/deregister.d.ts.map +1 -0
  36. package/dist/commands/daemon/dust/deregister.js +52 -0
  37. package/dist/commands/daemon/dust/deregister.js.map +1 -0
  38. package/dist/commands/daemon/dust/register.d.ts +20 -0
  39. package/dist/commands/daemon/dust/register.d.ts.map +1 -0
  40. package/dist/commands/daemon/dust/register.js +60 -0
  41. package/dist/commands/daemon/dust/register.js.map +1 -0
  42. package/dist/commands/daemon/key/gen.d.ts +19 -0
  43. package/dist/commands/daemon/key/gen.d.ts.map +1 -0
  44. package/dist/commands/daemon/key/gen.js +66 -0
  45. package/dist/commands/daemon/key/gen.js.map +1 -0
  46. package/dist/commands/daemon/key/list.d.ts +17 -0
  47. package/dist/commands/daemon/key/list.d.ts.map +1 -0
  48. package/dist/commands/daemon/key/list.js +43 -0
  49. package/dist/commands/daemon/key/list.js.map +1 -0
  50. package/dist/commands/daemon/key/revoke.d.ts +20 -0
  51. package/dist/commands/daemon/key/revoke.d.ts.map +1 -0
  52. package/dist/commands/daemon/key/revoke.js +37 -0
  53. package/dist/commands/daemon/key/revoke.js.map +1 -0
  54. package/dist/commands/daemon/maintenance/insert-vk.d.ts +24 -0
  55. package/dist/commands/daemon/maintenance/insert-vk.d.ts.map +1 -0
  56. package/dist/commands/daemon/maintenance/insert-vk.js +87 -0
  57. package/dist/commands/daemon/maintenance/insert-vk.js.map +1 -0
  58. package/dist/commands/daemon/maintenance/insert-vks-batch.d.ts +24 -0
  59. package/dist/commands/daemon/maintenance/insert-vks-batch.d.ts.map +1 -0
  60. package/dist/commands/daemon/maintenance/insert-vks-batch.js +117 -0
  61. package/dist/commands/daemon/maintenance/insert-vks-batch.js.map +1 -0
  62. package/dist/commands/daemon/serve.d.ts +23 -0
  63. package/dist/commands/daemon/serve.d.ts.map +1 -0
  64. package/dist/commands/daemon/serve.js +289 -0
  65. package/dist/commands/daemon/serve.js.map +1 -0
  66. package/dist/commands/daemon/submit-tx.d.ts +22 -0
  67. package/dist/commands/daemon/submit-tx.d.ts.map +1 -0
  68. package/dist/commands/daemon/submit-tx.js +89 -0
  69. package/dist/commands/daemon/submit-tx.js.map +1 -0
  70. package/dist/commands/daemon/transfer.d.ts +24 -0
  71. package/dist/commands/daemon/transfer.d.ts.map +1 -0
  72. package/dist/commands/daemon/transfer.js +135 -0
  73. package/dist/commands/daemon/transfer.js.map +1 -0
  74. package/dist/commands/deploy.d.ts +26 -0
  75. package/dist/commands/deploy.d.ts.map +1 -0
  76. package/dist/commands/deploy.js +135 -0
  77. package/dist/commands/deploy.js.map +1 -0
  78. package/dist/commands/dust/deregister.d.ts +18 -0
  79. package/dist/commands/dust/deregister.d.ts.map +1 -0
  80. package/dist/commands/dust/deregister.js +48 -0
  81. package/dist/commands/dust/deregister.js.map +1 -0
  82. package/dist/commands/dust/register.d.ts +21 -0
  83. package/dist/commands/dust/register.d.ts.map +1 -0
  84. package/dist/commands/dust/register.js +120 -0
  85. package/dist/commands/dust/register.js.map +1 -0
  86. package/dist/commands/dust/status.d.ts +17 -0
  87. package/dist/commands/dust/status.d.ts.map +1 -0
  88. package/dist/commands/dust/status.js +47 -0
  89. package/dist/commands/dust/status.js.map +1 -0
  90. package/dist/commands/info.d.ts +17 -0
  91. package/dist/commands/info.d.ts.map +1 -0
  92. package/dist/commands/info.js +37 -0
  93. package/dist/commands/info.js.map +1 -0
  94. package/dist/commands/maintenance/insert-vk.d.ts +23 -0
  95. package/dist/commands/maintenance/insert-vk.d.ts.map +1 -0
  96. package/dist/commands/maintenance/insert-vk.js +92 -0
  97. package/dist/commands/maintenance/insert-vk.js.map +1 -0
  98. package/dist/commands/maintenance/insert-vks-batch.d.ts +23 -0
  99. package/dist/commands/maintenance/insert-vks-batch.d.ts.map +1 -0
  100. package/dist/commands/maintenance/insert-vks-batch.js +130 -0
  101. package/dist/commands/maintenance/insert-vks-batch.js.map +1 -0
  102. package/dist/commands/mint.d.ts +24 -0
  103. package/dist/commands/mint.d.ts.map +1 -0
  104. package/dist/commands/mint.js +116 -0
  105. package/dist/commands/mint.js.map +1 -0
  106. package/dist/commands/state.d.ts +20 -0
  107. package/dist/commands/state.d.ts.map +1 -0
  108. package/dist/commands/state.js +36 -0
  109. package/dist/commands/state.js.map +1 -0
  110. package/dist/commands/transfer/batch.d.ts +21 -0
  111. package/dist/commands/transfer/batch.d.ts.map +1 -0
  112. package/dist/commands/transfer/batch.js +71 -0
  113. package/dist/commands/transfer/batch.js.map +1 -0
  114. package/dist/commands/transfer.d.ts +24 -0
  115. package/dist/commands/transfer.d.ts.map +1 -0
  116. package/dist/commands/transfer.js +123 -0
  117. package/dist/commands/transfer.js.map +1 -0
  118. package/dist/commands/tui.d.ts +17 -0
  119. package/dist/commands/tui.d.ts.map +1 -0
  120. package/dist/commands/tui.js +18 -0
  121. package/dist/commands/tui.js.map +1 -0
  122. package/dist/commands/wallet/address.d.ts +25 -0
  123. package/dist/commands/wallet/address.d.ts.map +1 -0
  124. package/dist/commands/wallet/address.js +47 -0
  125. package/dist/commands/wallet/address.js.map +1 -0
  126. package/dist/commands/wallet/generate.d.ts +20 -0
  127. package/dist/commands/wallet/generate.d.ts.map +1 -0
  128. package/dist/commands/wallet/generate.js +75 -0
  129. package/dist/commands/wallet/generate.js.map +1 -0
  130. package/dist/commands/wallet/import.d.ts +20 -0
  131. package/dist/commands/wallet/import.d.ts.map +1 -0
  132. package/dist/commands/wallet/import.js +85 -0
  133. package/dist/commands/wallet/import.js.map +1 -0
  134. package/dist/commands/wallet/list.d.ts +17 -0
  135. package/dist/commands/wallet/list.d.ts.map +1 -0
  136. package/dist/commands/wallet/list.js +23 -0
  137. package/dist/commands/wallet/list.js.map +1 -0
  138. package/dist/commands/wallet/remove.d.ts +21 -0
  139. package/dist/commands/wallet/remove.d.ts.map +1 -0
  140. package/dist/commands/wallet/remove.js +31 -0
  141. package/dist/commands/wallet/remove.js.map +1 -0
  142. package/dist/commands/wallet/status.d.ts +18 -0
  143. package/dist/commands/wallet/status.d.ts.map +1 -0
  144. package/dist/commands/wallet/status.js +62 -0
  145. package/dist/commands/wallet/status.js.map +1 -0
  146. package/dist/commands/wallet/use.d.ts +20 -0
  147. package/dist/commands/wallet/use.d.ts.map +1 -0
  148. package/dist/commands/wallet/use.js +19 -0
  149. package/dist/commands/wallet/use.js.map +1 -0
  150. package/dist/formatters/index.d.ts +5 -0
  151. package/dist/formatters/index.d.ts.map +1 -0
  152. package/dist/formatters/index.js +68 -0
  153. package/dist/formatters/index.js.map +1 -0
  154. package/dist/index.d.ts +3 -0
  155. package/dist/index.d.ts.map +1 -0
  156. package/dist/index.js +4 -0
  157. package/dist/index.js.map +1 -0
  158. package/package.json +53 -0
  159. package/templates/dapp/api/package.json +21 -0
  160. package/templates/dapp/api/src/index.ts +2 -0
  161. package/templates/dapp/api/src/providers.ts +23 -0
  162. package/templates/dapp/api/src/types.ts +23 -0
  163. package/templates/dapp/api/tsconfig.json +11 -0
  164. package/templates/dapp/root/README.md +20 -0
  165. package/templates/dapp/root/tsconfig.json +15 -0
  166. package/templates/dapp/ui/index.html +13 -0
  167. package/templates/dapp/ui/package.json +24 -0
  168. package/templates/dapp/ui/public/vite.svg +1 -0
  169. package/templates/dapp/ui/src/App.tsx +36 -0
  170. package/templates/dapp/ui/src/index.css +29 -0
  171. package/templates/dapp/ui/src/main.tsx +10 -0
  172. package/templates/dapp/ui/tsconfig.json +8 -0
  173. package/templates/dapp/ui/vite.config.ts +14 -0
@@ -0,0 +1,87 @@
1
+ // Insert a single verifier key on a deployed contract via the running
2
+ // TUI daemon. The TUI's facade does the build + sign + submit; the CLI
3
+ // only sends paths + the circuit id. Spending keys never leave the
4
+ // TUI. Triggers an L3 confirmation modal showing the contract,
5
+ // circuit, artifact, and VK file path.
6
+ import { Flags } from '@oclif/core';
7
+ import { resolve } from 'node:path';
8
+ import { BaseCommand, daemonClientFlags } from '../../../base-command.js';
9
+ export default class DaemonMaintenanceInsertVk extends BaseCommand {
10
+ static description = 'Insert a verifier key on a deployed contract through the running TUI daemon. The TUI signs and submits the maintenance update; spending keys never leave the TUI.';
11
+ static flags = {
12
+ ...BaseCommand.baseFlags,
13
+ ...daemonClientFlags,
14
+ address: Flags.string({
15
+ description: 'Deployed contract address (bech32m)',
16
+ required: true,
17
+ }),
18
+ 'circuit-id': Flags.string({
19
+ description: 'Name of the circuit whose verifier key is being inserted',
20
+ required: true,
21
+ }),
22
+ 'vk-file': Flags.string({
23
+ description: 'Path to the .verifier file (raw bytes from compact compile)',
24
+ required: true,
25
+ }),
26
+ artifact: Flags.string({
27
+ description: 'Path to the FULL compiled contract artifact (the one declaring this circuit)',
28
+ required: true,
29
+ }),
30
+ 'project-dir': Flags.string({
31
+ description: 'Project directory for SDK dependency resolution',
32
+ env: 'MOTH_PROJECT_DIR',
33
+ }),
34
+ 'timeout-ms': Flags.integer({
35
+ description: 'Override the RPC timeout (default: 600000)',
36
+ default: 600_000,
37
+ }),
38
+ };
39
+ async run() {
40
+ const { flags } = await this.parse(DaemonMaintenanceInsertVk);
41
+ this.outputFormat = flags.output ?? 'text';
42
+ this.verbose = flags.verbose;
43
+ const walletName = await this.resolveWalletName(flags);
44
+ const network = await this.getNetworkConfig(flags.network, this.getNetworkOverrides(flags));
45
+ const artifactPath = resolve(flags.artifact);
46
+ const verifierKeyPath = resolve(flags['vk-file']);
47
+ const projectDir = flags['project-dir'] ? resolve(flags['project-dir']) : undefined;
48
+ const client = await this.connectDaemonOrExit(network.id, walletName, { bind: flags.bind });
49
+ if (!client)
50
+ return;
51
+ try {
52
+ const state = await client.call('getState');
53
+ if (!state.ready) {
54
+ this.outputError('WALLET_ERROR', `TUI is running but the wallet facade for "${walletName}" is still initializing on ${network.id}. Wait for sync and retry.`);
55
+ this.exit(1);
56
+ return;
57
+ }
58
+ const result = await client.call('insertVerifierKey', {
59
+ contractAddress: flags.address,
60
+ circuitId: flags['circuit-id'],
61
+ verifierKeyPath,
62
+ artifactPath,
63
+ projectDir,
64
+ }, { timeoutMs: flags['timeout-ms'] });
65
+ if (this.outputFormat === 'json') {
66
+ this.outputSuccess(result);
67
+ }
68
+ else {
69
+ this.log(`Inserted verifier key for ${flags['circuit-id']}.`);
70
+ this.log(`Transaction hash: ${result.txHash}`);
71
+ this.log(`Status: ${result.status}`);
72
+ if (result.blockHeight !== null)
73
+ this.log(`Block height: ${result.blockHeight}`);
74
+ }
75
+ }
76
+ catch (err) {
77
+ const { category, message } = this.renderDaemonError(err);
78
+ this.outputError(category, message);
79
+ this.exit(1);
80
+ return;
81
+ }
82
+ finally {
83
+ client.close();
84
+ }
85
+ }
86
+ }
87
+ //# sourceMappingURL=insert-vk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert-vk.js","sourceRoot":"","sources":["../../../../src/commands/daemon/maintenance/insert-vk.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ import { BaseCommand } from '../../../base-command.js';
2
+ export default class DaemonMaintenanceInsertVksBatch extends BaseCommand {
3
+ static description: string;
4
+ static flags: {
5
+ address: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
+ artifact: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ circuits: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ 'skip-existing': import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ 'project-dir': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ 'timeout-ms': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
11
+ bind: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
12
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
+ network: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
14
+ wallet: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
16
+ timeout: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ 'proof-server': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ prover: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ indexer: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ 'node-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
21
+ };
22
+ run(): Promise<void>;
23
+ }
24
+ //# sourceMappingURL=insert-vks-batch.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert-vks-batch.d.ts","sourceRoot":"","sources":["../../../../src/commands/daemon/maintenance/insert-vks-batch.ts"],"names":[],"mappings":"AAUA,OAAO,EAAC,WAAW,EAAoB,MAAM,0BAA0B,CAAC;AAmBxE,MAAM,CAAC,OAAO,OAAO,+BAAgC,SAAQ,WAAW;IACtE,OAAgB,WAAW,SACiO;IAE5P,OAAgB,KAAK;;;;;;;;;;;;;;;;;MAuBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAuF3B"}
@@ -0,0 +1,117 @@
1
+ // Batch verifier-key insert through the running TUI daemon. Same
2
+ // shape as the in-process `moth maintenance insert-vks-batch` but
3
+ // routed through the daemon's RPC. CLI enumerates the .verifier
4
+ // files (so the user can preview the circuit list on the CLI side
5
+ // before approving) and sends an explicit entries array to the
6
+ // daemon — the TUI doesn't have to re-scan the directory.
7
+ import { Flags } from '@oclif/core';
8
+ import { resolve, join } from 'node:path';
9
+ import { readdirSync, existsSync } from 'node:fs';
10
+ import { BaseCommand, daemonClientFlags } from '../../../base-command.js';
11
+ export default class DaemonMaintenanceInsertVksBatch extends BaseCommand {
12
+ static description = 'Insert multiple verifier keys on a deployed contract through the running TUI daemon (Level 1 batching — one tx per VK, shared wallet sync). Use for staged deployment of contracts whose verifier-key payload would exceed the per-tx block weight cap.';
13
+ static flags = {
14
+ ...BaseCommand.baseFlags,
15
+ ...daemonClientFlags,
16
+ address: Flags.string({ required: true, description: 'Deployed contract address (bech32m)' }),
17
+ artifact: Flags.string({
18
+ required: true,
19
+ description: 'Path to the FULL compiled artifact directory (contains keys/*.verifier)',
20
+ }),
21
+ circuits: Flags.string({
22
+ description: 'Comma-separated circuit names. Default: every .verifier in <artifact>/keys.',
23
+ }),
24
+ 'skip-existing': Flags.boolean({
25
+ default: false,
26
+ description: 'Query the chain first and skip circuits already defined.',
27
+ }),
28
+ 'project-dir': Flags.string({
29
+ description: 'Project directory for SDK dependency resolution',
30
+ env: 'MOTH_PROJECT_DIR',
31
+ }),
32
+ 'timeout-ms': Flags.integer({
33
+ description: 'Override the RPC timeout (default: 1800000 — 30 minutes for large batches)',
34
+ default: 1_800_000,
35
+ }),
36
+ };
37
+ async run() {
38
+ const { flags } = await this.parse(DaemonMaintenanceInsertVksBatch);
39
+ this.outputFormat = flags.output ?? 'text';
40
+ this.verbose = flags.verbose;
41
+ const walletName = await this.resolveWalletName(flags);
42
+ const network = await this.getNetworkConfig(flags.network, this.getNetworkOverrides(flags));
43
+ const artifactPath = resolve(flags.artifact);
44
+ const keysDir = join(artifactPath, 'keys');
45
+ if (!existsSync(keysDir)) {
46
+ this.outputError('INVALID_INPUT', `No keys/ directory in artifact: ${keysDir}`);
47
+ this.exit(2);
48
+ return;
49
+ }
50
+ const allKeyFiles = readdirSync(keysDir).filter((f) => f.endsWith('.verifier'));
51
+ const allCircuitNames = allKeyFiles.map((f) => f.replace(/\.verifier$/, ''));
52
+ let circuitsToInsert;
53
+ if (flags.circuits && flags.circuits.trim()) {
54
+ circuitsToInsert = flags.circuits.split(',').map((s) => s.trim()).filter(Boolean);
55
+ const missing = circuitsToInsert.filter((c) => !allCircuitNames.includes(c));
56
+ if (missing.length > 0) {
57
+ this.outputError('INVALID_INPUT', `Requested circuits not found in artifact keys/: ${missing.join(', ')}`);
58
+ this.exit(2);
59
+ return;
60
+ }
61
+ }
62
+ else {
63
+ circuitsToInsert = allCircuitNames;
64
+ }
65
+ if (circuitsToInsert.length === 0) {
66
+ this.outputError('INVALID_INPUT', 'No circuits to insert.');
67
+ this.exit(2);
68
+ return;
69
+ }
70
+ const entries = circuitsToInsert.map((circuitId) => ({
71
+ circuitId,
72
+ verifierKeyPath: join(keysDir, `${circuitId}.verifier`),
73
+ }));
74
+ const client = await this.connectDaemonOrExit(network.id, walletName, { bind: flags.bind });
75
+ if (!client)
76
+ return;
77
+ try {
78
+ const state = await client.call('getState');
79
+ if (!state.ready) {
80
+ this.outputError('WALLET_ERROR', `TUI is running but the wallet facade for "${walletName}" is still initializing on ${network.id}. Wait for sync and retry.`);
81
+ this.exit(1);
82
+ return;
83
+ }
84
+ const result = await client.call('insertVerifierKeysBatch', {
85
+ contractAddress: flags.address,
86
+ entries,
87
+ artifactPath,
88
+ projectDir: flags['project-dir'] ? resolve(flags['project-dir']) : undefined,
89
+ skipExisting: flags['skip-existing'],
90
+ }, { timeoutMs: flags['timeout-ms'] });
91
+ if (this.outputFormat === 'json') {
92
+ this.outputSuccess(result);
93
+ }
94
+ else {
95
+ this.log(`Total: ${result.total} inserted: ${result.inserted} skipped: ${result.skipped} failed: ${result.failed}`);
96
+ for (const e of result.entries) {
97
+ let line = ` ${e.status.padEnd(16)} ${e.circuitId}`;
98
+ if (e.txHash)
99
+ line += ` tx=${e.txHash}`;
100
+ if (e.error)
101
+ line += ` error=${e.error}`;
102
+ this.log(line);
103
+ }
104
+ }
105
+ }
106
+ catch (err) {
107
+ const { category, message } = this.renderDaemonError(err);
108
+ this.outputError(category, message);
109
+ this.exit(1);
110
+ return;
111
+ }
112
+ finally {
113
+ client.close();
114
+ }
115
+ }
116
+ }
117
+ //# sourceMappingURL=insert-vks-batch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"insert-vks-batch.js","sourceRoot":"","sources":["../../../../src/commands/daemon/maintenance/insert-vks-batch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class DaemonServe extends BaseCommand {
3
+ static description: string;
4
+ static flags: {
5
+ 'auto-approve': import("@oclif/core/interfaces").BooleanFlag<boolean>;
6
+ 'max-spend': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
+ 'idle-timeout': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
8
+ 'wait-for-sync': import("@oclif/core/interfaces").BooleanFlag<boolean>;
9
+ transport: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
10
+ bind: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
11
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
+ network: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
13
+ wallet: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
14
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
15
+ timeout: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ 'proof-server': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ prover: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ indexer: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ 'node-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
20
+ };
21
+ run(): Promise<void>;
22
+ }
23
+ //# sourceMappingURL=serve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/serve.ts"],"names":[],"mappings":"AA6BA,OAAO,EAAC,WAAW,EAAC,MAAM,uBAAuB,CAAC;AAMlD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,WAAW;IAClD,OAAgB,WAAW,SAC8L;IAEzN,OAAgB,KAAK;;;;;;;;;;;;;;;;MA+BnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAsQ3B"}
@@ -0,0 +1,289 @@
1
+ // Headless wallet daemon — same socket protocol the TUI hosts, but no
2
+ // Ink renderer in front of it. Used by integration tests and by the
3
+ // future Web2 service deployment. The wallet is unlocked from
4
+ // MOTH_PASSPHRASE and the daemon stays alive until SIGINT/SIGTERM.
5
+ //
6
+ // L3 (human-in-the-loop confirmation) is not meaningful in headless
7
+ // mode — there's no user to answer the modal. The command therefore
8
+ // requires `--auto-approve` AND `MOTH_DAEMON_AUTO_APPROVE=1` together,
9
+ // belt-and-suspenders, to make it inarguable that the operator
10
+ // understood there's no consent gate. Every auto-approval is logged.
11
+ //
12
+ // The verb handler bodies live in core (buildWalletHandlers); this
13
+ // command just wires the unlocked wallet + sync into the dependency
14
+ // bundle and owns the process lifecycle.
15
+ import { Flags } from '@oclif/core';
16
+ import { startDaemon, daemonSocketPath, ConfirmationQueue, startWalletSync, buildWalletHandlers, AuditLog, ApiKeyStore, } from '@shieldedtech/moth-wallet';
17
+ import { BaseCommand } from '../../base-command.js';
18
+ import { getPassphrase } from '../../adapters/passphrase.js';
19
+ const DAEMON_VERSION = '0.1.0';
20
+ const AUTO_APPROVE_ENV = 'MOTH_DAEMON_AUTO_APPROVE';
21
+ export default class DaemonServe extends BaseCommand {
22
+ static description = 'Start a headless wallet daemon hosting the same RPC verbs the TUI exposes. Used by integration tests and by service-mode deployments. Requires the wallet passphrase via MOTH_PASSPHRASE; runs until SIGINT/SIGTERM.';
23
+ static flags = {
24
+ ...BaseCommand.baseFlags,
25
+ 'auto-approve': Flags.boolean({
26
+ description: `Auto-approve every L3 confirmation modal. REQUIRED in headless mode because there is no human to answer modals. Must also set the ${AUTO_APPROVE_ENV}=1 environment variable to make consent loss explicit.`,
27
+ default: false,
28
+ }),
29
+ 'max-spend': Flags.string({
30
+ description: 'Per-transaction NIGHT spend cap enforced under --auto-approve. Any NIGHT transfer above this amount is refused, bounding blast radius when there is no human to approve. REQUIRED with --auto-approve. Example: --max-spend 100 (NIGHT).',
31
+ }),
32
+ 'idle-timeout': Flags.integer({
33
+ description: 'Minutes of client inactivity after which the daemon locks the wallet (drops keys from memory) and exits, matching the extension\'s auto-lock. Set 0 to disable for always-on service deployments. Default 15.',
34
+ default: 15,
35
+ }),
36
+ 'wait-for-sync': Flags.boolean({
37
+ description: 'Block until the wallet reports synced=true before binding the socket. Useful in tests.',
38
+ default: true,
39
+ allowNo: true,
40
+ }),
41
+ transport: Flags.string({
42
+ description: 'Transport to bind. `unix` (default) uses ~/.moth/sync/<network>/<wallet>.sock with 0600 perms. `tcp` exposes the same JSON-RPC frames over a TCP listener — combine with --bind to set the host:port. Stage-2 deployments behind a reverse proxy or in a private network use tcp.',
43
+ options: ['unix', 'tcp'],
44
+ default: 'unix',
45
+ }),
46
+ bind: Flags.string({
47
+ description: 'TCP bind address in <host>:<port> form (e.g. 127.0.0.1:8765). Required when --transport tcp. Loopback only — the daemon refuses to bind a non-loopback host because the transport is unencrypted. For remote access, put a reverse proxy that terminates TLS in front of a loopback bind. TCP also requires at least one active API key in ~/.moth/api-keys/ — generate one with `moth daemon key gen --label "<purpose>"` first.',
48
+ }),
49
+ };
50
+ async run() {
51
+ const { flags } = await this.parse(DaemonServe);
52
+ this.outputFormat = flags.output ?? 'text';
53
+ this.verbose = flags.verbose;
54
+ if (!flags['auto-approve']) {
55
+ this.outputError('INVALID_INPUT', `Headless serve mode has no human to answer L3 modals. Pass --auto-approve AND set ${AUTO_APPROVE_ENV}=1 to acknowledge that approval is automated.`);
56
+ this.exit(2);
57
+ return;
58
+ }
59
+ if (process.env[AUTO_APPROVE_ENV] !== '1') {
60
+ this.outputError('INVALID_INPUT', `${AUTO_APPROVE_ENV}=1 environment variable is required alongside --auto-approve. Belt-and-suspenders so a stray flag in a shell history doesn't disable consent on prod.`);
61
+ this.exit(2);
62
+ return;
63
+ }
64
+ // With no human to approve L3 modals, an unbounded auto-approve daemon
65
+ // would move any amount on request. Require an explicit per-tx NIGHT cap
66
+ // so the blast radius is bounded; enforced in the transferTokens handler.
67
+ if (!flags['max-spend']) {
68
+ this.outputError('INVALID_INPUT', '--max-spend <NIGHT> is required with --auto-approve: it caps the NIGHT any single transfer can move without a human in the loop.');
69
+ this.exit(2);
70
+ return;
71
+ }
72
+ const maxSpendRaw = parseNightToRaw(flags['max-spend']);
73
+ if (maxSpendRaw === null || maxSpendRaw <= 0n) {
74
+ this.outputError('INVALID_INPUT', `--max-spend must be a positive NIGHT amount (up to 6 decimals); got "${flags['max-spend']}".`);
75
+ this.exit(2);
76
+ return;
77
+ }
78
+ const walletName = await this.resolveWalletName(flags);
79
+ const network = await this.getNetworkConfig(flags.network, this.getNetworkOverrides(flags));
80
+ const passphrase = await getPassphrase();
81
+ // Persistent audit log at ~/.moth/daemon-audit.log. Captures
82
+ // every RPC's verb / summary / decision / outcome plus daemon
83
+ // lifecycle events. Survives the daemon process — the next stage
84
+ // (TCP transport + API-key AuthN) will key its policy decisions
85
+ // on this same record.
86
+ const auditLog = new AuditLog();
87
+ auditLog.recordLifecycle({
88
+ wallet: walletName,
89
+ network: network.id,
90
+ event: 'daemon-start',
91
+ message: `PID ${process.pid}`,
92
+ });
93
+ process.stderr.write(`[daemon-serve] unlocking wallet "${walletName}" on ${network.id}\n`);
94
+ const unlocked = await this.walletManager.unlock(walletName, passphrase);
95
+ // The typed key bundle built at unlock time. Write verbs read this;
96
+ // the raw seedHex was dropped inside walletManager.unlock and is
97
+ // never exposed (D-KM-3).
98
+ const walletKeys = unlocked.walletKeys;
99
+ process.stderr.write('[daemon-serve] starting wallet sync\n');
100
+ const synced = await startWalletSync(walletKeys, network, (msg) => this.log_verbose(`[sync] ${msg}`), walletName);
101
+ if (flags['wait-for-sync']) {
102
+ process.stderr.write('[daemon-serve] waiting for wallet to report synced=true\n');
103
+ await waitForSynced(synced);
104
+ process.stderr.write('[daemon-serve] wallet synced\n');
105
+ auditLog.recordLifecycle({ wallet: walletName, network: network.id, event: 'sync-complete' });
106
+ }
107
+ // Auto-approving queue — log every grant for audit.
108
+ const queue = new ConfirmationQueue({
109
+ autoApprove: true,
110
+ onAutoApprove: (req) => {
111
+ process.stderr.write(`[daemon-serve auto-approve] ${req.summary}\n`);
112
+ for (const d of req.details ?? []) {
113
+ process.stderr.write(`[daemon-serve auto-approve] · ${d}\n`);
114
+ }
115
+ },
116
+ });
117
+ const handlers = buildWalletHandlers({
118
+ walletName,
119
+ network,
120
+ getFacade: () => synced.facade,
121
+ getWalletKeys: () => walletKeys,
122
+ getBalances: () => synced.balances,
123
+ queue,
124
+ auditLog,
125
+ maxSpendRaw,
126
+ log: (level, msg) => {
127
+ if (level === 'info')
128
+ this.log_verbose(`[daemon] ${msg}`);
129
+ else
130
+ process.stderr.write(`[daemon ${level}] ${msg}\n`);
131
+ },
132
+ });
133
+ let bind;
134
+ if (flags.transport === 'tcp') {
135
+ if (!flags.bind) {
136
+ this.outputError('INVALID_INPUT', '--bind <host>:<port> is required when --transport tcp');
137
+ this.exit(2);
138
+ return;
139
+ }
140
+ const sep = flags.bind.lastIndexOf(':');
141
+ if (sep <= 0) {
142
+ this.outputError('INVALID_INPUT', `--bind must be <host>:<port>; got "${flags.bind}"`);
143
+ this.exit(2);
144
+ return;
145
+ }
146
+ const host = flags.bind.slice(0, sep);
147
+ const port = Number.parseInt(flags.bind.slice(sep + 1), 10);
148
+ if (!Number.isInteger(port) || port < 1 || port > 65535) {
149
+ this.outputError('INVALID_INPUT', `--bind port must be an integer in [1, 65535]; got "${flags.bind.slice(sep + 1)}"`);
150
+ this.exit(2);
151
+ return;
152
+ }
153
+ // Loopback only: the TCP transport is unencrypted, so binding a
154
+ // routable interface (0.0.0.0 or a LAN/public IP) would expose
155
+ // transfers and tokens in cleartext. Remote deployments front a
156
+ // loopback bind with a reverse proxy that terminates TLS.
157
+ const LOOPBACK_HOSTS = new Set(['127.0.0.1', '::1', 'localhost', '::ffff:127.0.0.1']);
158
+ if (!LOOPBACK_HOSTS.has(host)) {
159
+ this.outputError('INVALID_INPUT', `Refusing to bind "${host}": the daemon binds loopback only (127.0.0.1, ::1, localhost). The TCP transport is unencrypted — for remote access, put a reverse proxy terminating TLS in front of a loopback bind rather than binding a routable interface.`);
160
+ this.exit(2);
161
+ return;
162
+ }
163
+ bind = { transport: 'tcp', host, port };
164
+ }
165
+ else {
166
+ bind = { transport: 'unix', socketPath: daemonSocketPath(network.id, walletName) };
167
+ }
168
+ // Stage-2 AuthN policy:
169
+ // - TCP transport REQUIRES an auth handler. Without an
170
+ // ApiKeyStore with at least one active key, refuse to bind.
171
+ // - Unix transport runs unauthenticated by default (kernel UID
172
+ // is sufficient on the 0600 socket). Operators can still opt
173
+ // into key-based auth on Unix for parity with TCP if they
174
+ // want — that's `--require-auth` (future), not the default.
175
+ let authHandler;
176
+ if (bind.transport === 'tcp') {
177
+ const store = new ApiKeyStore();
178
+ if (!store.hasActiveKey()) {
179
+ this.outputError('INVALID_INPUT', `Refusing to bind ${bind.host}:${bind.port}: TCP transport requires at least one active API key. Generate one with \`moth daemon key gen --label "<purpose>"\`, capture the printed token (shown ONCE), and start the daemon again. Loopback bind (127.0.0.1, ::1, localhost) is also fine if you want unauthenticated localhost-only access — use --transport unix instead.`);
180
+ this.exit(2);
181
+ return;
182
+ }
183
+ authHandler = (token) => store.verify(token);
184
+ }
185
+ // Idle auto-lock: reset on any client activity; a watchdog below
186
+ // locks + exits once inactivity exceeds the timeout. 0 disables it.
187
+ const idleMs = flags['idle-timeout'] > 0 ? flags['idle-timeout'] * 60_000 : 0;
188
+ let lastActivity = Date.now();
189
+ const handle = await startDaemon({
190
+ bind,
191
+ daemonVersion: DAEMON_VERSION,
192
+ handlers,
193
+ auth: authHandler,
194
+ onActivity: () => {
195
+ lastActivity = Date.now();
196
+ },
197
+ // Permanent trail of authentication attempts (#11) — the live log
198
+ // alone left no record of break-in attempts.
199
+ onAuthEvent: (e) => auditLog.recordLifecycle({
200
+ wallet: walletName,
201
+ network: network.id,
202
+ event: e.outcome === 'success' ? 'auth-success' : 'auth-failure',
203
+ apiKeyId: e.apiKeyId,
204
+ message: e.peer ? `peer ${e.peer}` : undefined,
205
+ }),
206
+ onLog: (level, msg) => process.stderr.write(`[daemon ${level}] ${msg}\n`),
207
+ });
208
+ process.stderr.write(`[daemon-serve] listening at ${handle.listenAddress}\n`);
209
+ process.stderr.write(`[daemon-serve] PID ${process.pid}; SIGINT/SIGTERM to stop\n`);
210
+ auditLog.recordLifecycle({
211
+ wallet: walletName,
212
+ network: network.id,
213
+ event: 'socket-bound',
214
+ message: handle.listenAddress,
215
+ });
216
+ let shuttingDown = false;
217
+ const shutdown = async (reason) => {
218
+ if (shuttingDown)
219
+ return;
220
+ shuttingDown = true;
221
+ process.stderr.write(`\n[daemon-serve] ${reason === 'idle-timeout' ? 'idle timeout reached' : `received ${reason}`}, shutting down\n`);
222
+ auditLog.recordLifecycle({
223
+ wallet: walletName,
224
+ network: network.id,
225
+ event: 'shutdown-signal',
226
+ message: reason,
227
+ });
228
+ // Order: stop accepting clients first so no in-flight RPC tries
229
+ // to read seedHex after lock() zeros it. Then stop the sync.
230
+ // Then lock the wallet, clearing the seed from memory.
231
+ await handle.close().catch((err) => {
232
+ process.stderr.write(`[daemon-serve] handle.close error: ${err}\n`);
233
+ });
234
+ await synced.stop().catch((err) => {
235
+ process.stderr.write(`[daemon-serve] synced.stop error: ${err}\n`);
236
+ });
237
+ try {
238
+ unlocked.lock();
239
+ }
240
+ catch (err) {
241
+ process.stderr.write(`[daemon-serve] wallet lock error: ${err}\n`);
242
+ }
243
+ auditLog.recordLifecycle({ wallet: walletName, network: network.id, event: 'daemon-stop' });
244
+ process.stderr.write('[daemon-serve] stopped\n');
245
+ // Exit cleanly past oclif's catch chain.
246
+ process.exit(0);
247
+ };
248
+ process.on('SIGINT', () => void shutdown('SIGINT'));
249
+ process.on('SIGTERM', () => void shutdown('SIGTERM'));
250
+ if (idleMs > 0) {
251
+ process.stderr.write(`[daemon-serve] idle auto-lock after ${flags['idle-timeout']} min of inactivity\n`);
252
+ }
253
+ // Hold the event loop open until shutdown; also the idle watchdog.
254
+ await new Promise((resolveOuter) => {
255
+ const tick = setInterval(() => {
256
+ if (shuttingDown) {
257
+ clearInterval(tick);
258
+ resolveOuter();
259
+ return;
260
+ }
261
+ if (idleMs > 0 && Date.now() - lastActivity > idleMs) {
262
+ void shutdown('idle-timeout');
263
+ }
264
+ }, 1000);
265
+ });
266
+ }
267
+ }
268
+ /** Parse a decimal NIGHT amount (up to 6 dp) to raw base units, or null if
269
+ * malformed. NIGHT has 6 decimals (see NIGHT_DENOMINATION). */
270
+ function parseNightToRaw(input) {
271
+ const m = input.trim().match(/^(\d+)(?:\.(\d{1,6}))?$/);
272
+ if (!m)
273
+ return null;
274
+ const frac = (m[2] ?? '').padEnd(6, '0');
275
+ return BigInt(m[1]) * 1000000n + BigInt(frac);
276
+ }
277
+ async function waitForSynced(synced) {
278
+ return new Promise((resolveOuter) => {
279
+ if (synced.balances.synced)
280
+ return resolveOuter();
281
+ const unsub = synced.subscribe((b) => {
282
+ if (b.synced) {
283
+ unsub();
284
+ resolveOuter();
285
+ }
286
+ });
287
+ });
288
+ }
289
+ //# sourceMappingURL=serve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serve.js","sourceRoot":"","sources":["../../../src/commands/daemon/serve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { BaseCommand } from '../../base-command.js';
2
+ export default class DaemonSubmitTx extends BaseCommand {
3
+ static description: string;
4
+ static flags: {
5
+ hex: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
+ summary: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
7
+ detail: import("@oclif/core/interfaces").OptionFlag<string[] | undefined, import("@oclif/core/interfaces").CustomOptions>;
8
+ 'timeout-ms': import("@oclif/core/interfaces").OptionFlag<number, import("@oclif/core/interfaces").CustomOptions>;
9
+ bind: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
10
+ output: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
11
+ network: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
12
+ wallet: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
13
+ verbose: import("@oclif/core/interfaces").BooleanFlag<boolean>;
14
+ timeout: import("@oclif/core/interfaces").OptionFlag<number | undefined, import("@oclif/core/interfaces").CustomOptions>;
15
+ 'proof-server': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
16
+ prover: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ indexer: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
18
+ 'node-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ };
20
+ run(): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=submit-tx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit-tx.d.ts","sourceRoot":"","sources":["../../../src/commands/daemon/submit-tx.ts"],"names":[],"mappings":"AAQA,OAAO,EAAC,WAAW,EAAoB,MAAM,uBAAuB,CAAC;AAMrE,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,WAAW;IACrD,OAAgB,WAAW,SACoI;IAE/J,OAAgB,KAAK;;;;;;;;;;;;;;;MAkBnB;IAEI,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqE3B"}