@shieldedtech/moth-tui 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 (194) hide show
  1. package/README.md +65 -0
  2. package/dist/app.d.ts +7 -0
  3. package/dist/app.d.ts.map +1 -0
  4. package/dist/app.js +474 -0
  5. package/dist/app.js.map +1 -0
  6. package/dist/components/BackHint.d.ts +5 -0
  7. package/dist/components/BackHint.d.ts.map +1 -0
  8. package/dist/components/BackHint.js +6 -0
  9. package/dist/components/BackHint.js.map +1 -0
  10. package/dist/components/BalanceTable.d.ts +9 -0
  11. package/dist/components/BalanceTable.d.ts.map +1 -0
  12. package/dist/components/BalanceTable.js +8 -0
  13. package/dist/components/BalanceTable.js.map +1 -0
  14. package/dist/components/ConfirmationModal.d.ts +8 -0
  15. package/dist/components/ConfirmationModal.d.ts.map +1 -0
  16. package/dist/components/ConfirmationModal.js +33 -0
  17. package/dist/components/ConfirmationModal.js.map +1 -0
  18. package/dist/components/HelpFooter.d.ts +16 -0
  19. package/dist/components/HelpFooter.d.ts.map +1 -0
  20. package/dist/components/HelpFooter.js +7 -0
  21. package/dist/components/HelpFooter.js.map +1 -0
  22. package/dist/components/Loader.d.ts +5 -0
  23. package/dist/components/Loader.d.ts.map +1 -0
  24. package/dist/components/Loader.js +7 -0
  25. package/dist/components/Loader.js.map +1 -0
  26. package/dist/components/SectionHeader.d.ts +19 -0
  27. package/dist/components/SectionHeader.d.ts.map +1 -0
  28. package/dist/components/SectionHeader.js +11 -0
  29. package/dist/components/SectionHeader.js.map +1 -0
  30. package/dist/components/Select.d.ts +35 -0
  31. package/dist/components/Select.d.ts.map +1 -0
  32. package/dist/components/Select.js +49 -0
  33. package/dist/components/Select.js.map +1 -0
  34. package/dist/components/TxStatus.d.ts +8 -0
  35. package/dist/components/TxStatus.d.ts.map +1 -0
  36. package/dist/components/TxStatus.js +22 -0
  37. package/dist/components/TxStatus.js.map +1 -0
  38. package/dist/hooks/useBalance.d.ts +19 -0
  39. package/dist/hooks/useBalance.d.ts.map +1 -0
  40. package/dist/hooks/useBalance.js +119 -0
  41. package/dist/hooks/useBalance.js.map +1 -0
  42. package/dist/hooks/useChainStatus.d.ts +13 -0
  43. package/dist/hooks/useChainStatus.d.ts.map +1 -0
  44. package/dist/hooks/useChainStatus.js +97 -0
  45. package/dist/hooks/useChainStatus.js.map +1 -0
  46. package/dist/hooks/useDaemonHost.d.ts +30 -0
  47. package/dist/hooks/useDaemonHost.d.ts.map +1 -0
  48. package/dist/hooks/useDaemonHost.js +122 -0
  49. package/dist/hooks/useDaemonHost.js.map +1 -0
  50. package/dist/hooks/useLogs.d.ts +11 -0
  51. package/dist/hooks/useLogs.d.ts.map +1 -0
  52. package/dist/hooks/useLogs.js +44 -0
  53. package/dist/hooks/useLogs.js.map +1 -0
  54. package/dist/hooks/useNetwork.d.ts +14 -0
  55. package/dist/hooks/useNetwork.d.ts.map +1 -0
  56. package/dist/hooks/useNetwork.js +100 -0
  57. package/dist/hooks/useNetwork.js.map +1 -0
  58. package/dist/hooks/useWallet.d.ts +29 -0
  59. package/dist/hooks/useWallet.d.ts.map +1 -0
  60. package/dist/hooks/useWallet.js +135 -0
  61. package/dist/hooks/useWallet.js.map +1 -0
  62. package/dist/index.d.ts +4 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +2 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/navigation/index.d.ts +3 -0
  67. package/dist/navigation/index.d.ts.map +1 -0
  68. package/dist/navigation/index.js +2 -0
  69. package/dist/navigation/index.js.map +1 -0
  70. package/dist/navigation/types.d.ts +84 -0
  71. package/dist/navigation/types.d.ts.map +1 -0
  72. package/dist/navigation/types.js +3 -0
  73. package/dist/navigation/types.js.map +1 -0
  74. package/dist/navigation/useStackNavigator.d.ts +3 -0
  75. package/dist/navigation/useStackNavigator.d.ts.map +1 -0
  76. package/dist/navigation/useStackNavigator.js +20 -0
  77. package/dist/navigation/useStackNavigator.js.map +1 -0
  78. package/dist/persistent-log.d.ts +5 -0
  79. package/dist/persistent-log.d.ts.map +1 -0
  80. package/dist/persistent-log.js +55 -0
  81. package/dist/persistent-log.js.map +1 -0
  82. package/dist/screens/contract.d.ts +8 -0
  83. package/dist/screens/contract.d.ts.map +1 -0
  84. package/dist/screens/contract.js +104 -0
  85. package/dist/screens/contract.js.map +1 -0
  86. package/dist/screens/dashboard/DashboardHub.d.ts +35 -0
  87. package/dist/screens/dashboard/DashboardHub.d.ts.map +1 -0
  88. package/dist/screens/dashboard/DashboardHub.js +67 -0
  89. package/dist/screens/dashboard/DashboardHub.js.map +1 -0
  90. package/dist/screens/dashboard/StateView.d.ts +24 -0
  91. package/dist/screens/dashboard/StateView.d.ts.map +1 -0
  92. package/dist/screens/dashboard/StateView.js +79 -0
  93. package/dist/screens/dashboard/StateView.js.map +1 -0
  94. package/dist/screens/dashboard/index.d.ts +3 -0
  95. package/dist/screens/dashboard/index.d.ts.map +1 -0
  96. package/dist/screens/dashboard/index.js +3 -0
  97. package/dist/screens/dashboard/index.js.map +1 -0
  98. package/dist/screens/deploy.d.ts +8 -0
  99. package/dist/screens/deploy.d.ts.map +1 -0
  100. package/dist/screens/deploy.js +125 -0
  101. package/dist/screens/deploy.js.map +1 -0
  102. package/dist/screens/dust.d.ts +21 -0
  103. package/dist/screens/dust.d.ts.map +1 -0
  104. package/dist/screens/dust.js +289 -0
  105. package/dist/screens/dust.js.map +1 -0
  106. package/dist/screens/keys.d.ts +21 -0
  107. package/dist/screens/keys.d.ts.map +1 -0
  108. package/dist/screens/keys.js +126 -0
  109. package/dist/screens/keys.js.map +1 -0
  110. package/dist/screens/logs.d.ts +10 -0
  111. package/dist/screens/logs.d.ts.map +1 -0
  112. package/dist/screens/logs.js +62 -0
  113. package/dist/screens/logs.js.map +1 -0
  114. package/dist/screens/mint.d.ts +13 -0
  115. package/dist/screens/mint.d.ts.map +1 -0
  116. package/dist/screens/mint.js +151 -0
  117. package/dist/screens/mint.js.map +1 -0
  118. package/dist/screens/network.d.ts +12 -0
  119. package/dist/screens/network.d.ts.map +1 -0
  120. package/dist/screens/network.js +117 -0
  121. package/dist/screens/network.js.map +1 -0
  122. package/dist/screens/onboarding/InitializingScreen.d.ts +10 -0
  123. package/dist/screens/onboarding/InitializingScreen.d.ts.map +1 -0
  124. package/dist/screens/onboarding/InitializingScreen.js +7 -0
  125. package/dist/screens/onboarding/InitializingScreen.js.map +1 -0
  126. package/dist/screens/onboarding/MnemonicDisplayScreen.d.ts +9 -0
  127. package/dist/screens/onboarding/MnemonicDisplayScreen.d.ts.map +1 -0
  128. package/dist/screens/onboarding/MnemonicDisplayScreen.js +23 -0
  129. package/dist/screens/onboarding/MnemonicDisplayScreen.js.map +1 -0
  130. package/dist/screens/onboarding/NameScreen.d.ts +9 -0
  131. package/dist/screens/onboarding/NameScreen.d.ts.map +1 -0
  132. package/dist/screens/onboarding/NameScreen.js +32 -0
  133. package/dist/screens/onboarding/NameScreen.js.map +1 -0
  134. package/dist/screens/onboarding/NetworkSelectScreen.d.ts +9 -0
  135. package/dist/screens/onboarding/NetworkSelectScreen.d.ts.map +1 -0
  136. package/dist/screens/onboarding/NetworkSelectScreen.js +20 -0
  137. package/dist/screens/onboarding/NetworkSelectScreen.js.map +1 -0
  138. package/dist/screens/onboarding/OnboardingHost.d.ts +15 -0
  139. package/dist/screens/onboarding/OnboardingHost.d.ts.map +1 -0
  140. package/dist/screens/onboarding/OnboardingHost.js +42 -0
  141. package/dist/screens/onboarding/OnboardingHost.js.map +1 -0
  142. package/dist/screens/onboarding/PassphraseScreen.d.ts +9 -0
  143. package/dist/screens/onboarding/PassphraseScreen.d.ts.map +1 -0
  144. package/dist/screens/onboarding/PassphraseScreen.js +46 -0
  145. package/dist/screens/onboarding/PassphraseScreen.js.map +1 -0
  146. package/dist/screens/onboarding/SeedEntryScreen.d.ts +9 -0
  147. package/dist/screens/onboarding/SeedEntryScreen.d.ts.map +1 -0
  148. package/dist/screens/onboarding/SeedEntryScreen.js +49 -0
  149. package/dist/screens/onboarding/SeedEntryScreen.js.map +1 -0
  150. package/dist/screens/onboarding/SeedSourceScreen.d.ts +9 -0
  151. package/dist/screens/onboarding/SeedSourceScreen.d.ts.map +1 -0
  152. package/dist/screens/onboarding/SeedSourceScreen.js +22 -0
  153. package/dist/screens/onboarding/SeedSourceScreen.js.map +1 -0
  154. package/dist/screens/onboarding/UnlockScreen.d.ts +9 -0
  155. package/dist/screens/onboarding/UnlockScreen.d.ts.map +1 -0
  156. package/dist/screens/onboarding/UnlockScreen.js +29 -0
  157. package/dist/screens/onboarding/UnlockScreen.js.map +1 -0
  158. package/dist/screens/onboarding/WalletSelectScreen.d.ts +9 -0
  159. package/dist/screens/onboarding/WalletSelectScreen.d.ts.map +1 -0
  160. package/dist/screens/onboarding/WalletSelectScreen.js +30 -0
  161. package/dist/screens/onboarding/WalletSelectScreen.js.map +1 -0
  162. package/dist/screens/onboarding/index.d.ts +2 -0
  163. package/dist/screens/onboarding/index.d.ts.map +1 -0
  164. package/dist/screens/onboarding/index.js +2 -0
  165. package/dist/screens/onboarding/index.js.map +1 -0
  166. package/dist/screens/send.d.ts +12 -0
  167. package/dist/screens/send.d.ts.map +1 -0
  168. package/dist/screens/send.js +187 -0
  169. package/dist/screens/send.js.map +1 -0
  170. package/dist/settings.d.ts +16 -0
  171. package/dist/settings.d.ts.map +1 -0
  172. package/dist/settings.js +23 -0
  173. package/dist/settings.js.map +1 -0
  174. package/dist/types.d.ts +30 -0
  175. package/dist/types.d.ts.map +1 -0
  176. package/dist/types.js +2 -0
  177. package/dist/types.js.map +1 -0
  178. package/dist/utils/balance.d.ts +48 -0
  179. package/dist/utils/balance.d.ts.map +1 -0
  180. package/dist/utils/balance.js +61 -0
  181. package/dist/utils/balance.js.map +1 -0
  182. package/dist/utils/display.d.ts +3 -0
  183. package/dist/utils/display.d.ts.map +1 -0
  184. package/dist/utils/display.js +17 -0
  185. package/dist/utils/display.js.map +1 -0
  186. package/dist/utils/sync.d.ts +7 -0
  187. package/dist/utils/sync.d.ts.map +1 -0
  188. package/dist/utils/sync.js +11 -0
  189. package/dist/utils/sync.js.map +1 -0
  190. package/dist/utils/synced-wallet-stub.d.ts +3 -0
  191. package/dist/utils/synced-wallet-stub.d.ts.map +1 -0
  192. package/dist/utils/synced-wallet-stub.js +35 -0
  193. package/dist/utils/synced-wallet-stub.js.map +1 -0
  194. package/package.json +42 -0
package/README.md ADDED
@@ -0,0 +1,65 @@
1
+ # @shieldedtech/moth-tui
2
+
3
+ Interactive terminal dashboard for the [Midnight Network](https://midnight.network), built with
4
+ [React](https://react.dev) and [Ink](https://github.com/vadimdemedes/ink). It powers the
5
+ `moth tui` command in [`@shieldedtech/moth-cli`](https://www.npmjs.com/package/@shieldedtech/moth-cli)
6
+ and is published as a reusable component so you can embed it in your own Ink app.
7
+
8
+ Part of [Moth](https://github.com/shieldedtech/moth-wallet).
9
+
10
+ > **Experimental — use at your own risk.** This is unaudited software provided AS-IS with no
11
+ > warranty, for development and testing only. Do not use it with real funds on mainnet.
12
+
13
+ ## Install
14
+
15
+ ```bash
16
+ npm install @shieldedtech/moth-tui
17
+ ```
18
+
19
+ ## Usage
20
+
21
+ The package exports the `App` component (the full dashboard). Render it with Ink — this is exactly
22
+ what `moth tui` does under the hood:
23
+
24
+ ```typescript
25
+ import React from 'react';
26
+ import { render } from 'ink';
27
+ import { App } from '@shieldedtech/moth-tui';
28
+
29
+ render(React.createElement(App, { walletName: 'dev', networkId: 'preview' }));
30
+ ```
31
+
32
+ `AppProps` is `{ walletName?: string; networkId?: string }`.
33
+
34
+ The dashboard provides wallet onboarding, balances, token send, contract deploy/call, DUST
35
+ operations, and network settings. The proving method selected on the Network
36
+ screen is used for wallet and dApp transactions. Local WASM proving is
37
+ recommended for simple transactions, such as token transfers; complex
38
+ transactions, such as contract calls, require a configured proof server.
39
+
40
+ ### Keybindings
41
+
42
+ | Key | Action |
43
+ | --- | --- |
44
+ | `M-m` (Alt+M) | Toggle navigation menu |
45
+ | `1`–`9` | Navigate to screen (when menu is open) |
46
+ | `M-p` (Alt+P) | Pause/resume wallet sync |
47
+ | `M-q` (Alt+Q) | Quit |
48
+ | `Esc` | Back/cancel within screens |
49
+
50
+ Screens: 1 Dashboard, 2 Send, 3 Deploy, 4 Mint, 5 Contract, 6 Keys, 7 DUST, 8 Network, 9 Logs.
51
+
52
+ ## Documentation
53
+
54
+ See the [project README](https://github.com/shieldedtech/moth-wallet#readme) for full usage and
55
+ architecture.
56
+
57
+ ## Acknowledgements
58
+
59
+ The TUI draws on patterns and screen designs from
60
+ [mn-tui](https://github.com/input-output-hk/arc-mn-tui) (Apache-2.0). See
61
+ [NOTICE](https://github.com/shieldedtech/moth-wallet/blob/main/NOTICE) for attribution.
62
+
63
+ ## License
64
+
65
+ Apache-2.0 — see [LICENSE](https://github.com/shieldedtech/moth-wallet/blob/main/LICENSE).
package/dist/app.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ export interface AppProps {
3
+ walletName?: string;
4
+ networkId?: string;
5
+ }
6
+ export declare function App({ networkId: networkIdProp }: AppProps): React.JSX.Element;
7
+ //# sourceMappingURL=app.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.d.ts","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"AAIA,OAAO,KAA4D,MAAM,OAAO,CAAC;AAqCjF,MAAM,WAAW,QAAQ;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,GAAG,CAAC,EAAE,SAAS,EAAE,aAAa,EAAE,EAAE,QAAQ,qBA6fzD"}
package/dist/app.js ADDED
@@ -0,0 +1,474 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ // Moth TUI — interactive terminal wallet for the Midnight Network
3
+ // Screen layouts and navigation patterns inspired by mn-tui (Apache-2.0)
4
+ // https://github.com/input-output-hk/arc-mn-tui — see NOTICE for attribution
5
+ import { useState, useMemo, useEffect, useCallback, useRef } from 'react';
6
+ import { Box, useApp, useInput, useWindowSize } from 'ink';
7
+ import { FilesystemStorageAdapter, sendTokensWithKeys, designateForDustWithKeys, dedesignateFromDustWithKeys, listNightUtxos, clearSyncCache, NIGHT_TOKEN_ID, } from '@shieldedtech/moth-wallet';
8
+ import { syncedWalletStub } from './utils/synced-wallet-stub.js';
9
+ import { parseNightAmount } from './utils/balance.js';
10
+ import { useStackNavigator } from './navigation/index.js';
11
+ import { OnboardingHost, isOnboardingRoute } from './screens/onboarding/index.js';
12
+ import { DashboardHub } from './screens/dashboard/index.js';
13
+ import { ConfirmationModal } from './components/ConfirmationModal.js';
14
+ import { ConfirmationQueue } from '@shieldedtech/moth-wallet';
15
+ import { useDaemonHost } from './hooks/useDaemonHost.js';
16
+ import { Send } from './screens/send.js';
17
+ import { Deploy } from './screens/deploy.js';
18
+ import { Mint } from './screens/mint.js';
19
+ import { Contract } from './screens/contract.js';
20
+ import { Keys } from './screens/keys.js';
21
+ import { Dust } from './screens/dust.js';
22
+ import { Network } from './screens/network.js';
23
+ import { Logs } from './screens/logs.js';
24
+ import { useWallet } from './hooks/useWallet.js';
25
+ import { useNetwork } from './hooks/useNetwork.js';
26
+ import { useBalance } from './hooks/useBalance.js';
27
+ import { useLogs } from './hooks/useLogs.js';
28
+ import { useChainStatus } from './hooks/useChainStatus.js';
29
+ import { loadSettings, saveSettings } from './settings.js';
30
+ export function App({ networkId: networkIdProp }) {
31
+ const { exit } = useApp();
32
+ const { rows: termHeight } = useWindowSize();
33
+ const nav = useStackNavigator({ name: 'dashboard', params: undefined });
34
+ const inOnboarding = isOnboardingRoute(nav.route.name);
35
+ const [lastLogsSeen, setLastLogsSeen] = useState(0);
36
+ const [settingsLoaded, setSettingsLoaded] = useState(false);
37
+ const [initialNetwork, setInitialNetwork] = useState(networkIdProp ?? 'devnet');
38
+ const [paused, setPaused] = useState(false);
39
+ const [onboardingError, setOnboardingError] = useState();
40
+ const firstRunHandledRef = useRef(false);
41
+ const storage = useMemo(() => new FilesystemStorageAdapter(), []);
42
+ const wallet = useWallet(storage);
43
+ const network = useNetwork(initialNetwork);
44
+ const logs = useLogs();
45
+ const connectNetwork = useCallback(async (id) => {
46
+ const settings = await loadSettings(storage).catch(() => null);
47
+ await network.connect(id, settings?.networkOverrides?.[id]);
48
+ }, [network.connect, storage]);
49
+ // getConfig() builds a fresh object per call; memoize on the callback's
50
+ // identity (stable until a network field changes) so effects keyed on the
51
+ // config object — useDaemonHost in particular — don't re-fire every render.
52
+ const networkConfig = useMemo(() => network.getConfig(), [network.getConfig]);
53
+ const chain = useChainStatus(networkConfig);
54
+ const activeWalletKeys = wallet.getActiveWalletKeys();
55
+ const balance = useBalance(activeWalletKeys, networkConfig, logs.info, wallet.activeWallet?.name, wallet.isActiveWalletNew());
56
+ const [lastWalletName, setLastWalletName] = useState(null);
57
+ // Daemon: keep a ref to the latest WalletBalances snapshot so daemon
58
+ // handlers (which live outside the React render tree) can read current
59
+ // state at call time, not at bind time.
60
+ const balancesRef = useRef(null);
61
+ balancesRef.current = {
62
+ shielded: balance.shieldedBalances,
63
+ unshielded: balance.unshieldedBalances,
64
+ dust: balance.dustRaw,
65
+ dustGeneration: balance.dustGeneration,
66
+ syncProgress: balance.syncProgress ?? {
67
+ percentage: 0,
68
+ etaSeconds: null,
69
+ slowest: null,
70
+ shieldedSynced: false,
71
+ unshieldedSynced: false,
72
+ dustSynced: false,
73
+ },
74
+ synced: balance.synced,
75
+ coins: balance.coins,
76
+ subProgress: balance.subProgress,
77
+ };
78
+ const confirmationQueue = useMemo(() => new ConfirmationQueue(), []);
79
+ const [hasPendingConfirmation, setHasPendingConfirmation] = useState(false);
80
+ useEffect(() => {
81
+ const sync = () => setHasPendingConfirmation(confirmationQueue.size > 0);
82
+ sync();
83
+ return confirmationQueue.subscribe(sync);
84
+ }, [confirmationQueue]);
85
+ useDaemonHost({
86
+ network: networkConfig,
87
+ walletName: wallet.activeWallet?.name,
88
+ balancesRef,
89
+ getFacade: balance.getFacade,
90
+ getWalletKeys: wallet.getActiveWalletKeys,
91
+ queue: confirmationQueue,
92
+ daemonVersion: '0.1.0',
93
+ logs: { info: logs.info, warn: logs.warn, error: logs.error },
94
+ });
95
+ useEffect(() => {
96
+ loadSettings(storage).then(settings => {
97
+ const targetNetwork = networkIdProp ?? settings.lastNetwork ?? 'devnet';
98
+ setInitialNetwork(targetNetwork);
99
+ network.connect(targetNetwork, settings.networkOverrides?.[targetNetwork]);
100
+ setLastWalletName(settings.lastWallet ?? null);
101
+ setSettingsLoaded(true);
102
+ logs.info(`Session started (network: ${targetNetwork}, wallet: ${settings.lastWallet ?? 'none'})`);
103
+ }).catch(err => {
104
+ // Storage failure (permissions, corrupt file): surface it and still start
105
+ // with defaults so the app never hangs waiting on settingsLoaded.
106
+ const msg = err instanceof Error ? err.message : String(err);
107
+ logs.error(`Failed to load settings — starting with defaults: ${msg}`);
108
+ const targetNetwork = networkIdProp ?? 'devnet';
109
+ setInitialNetwork(targetNetwork);
110
+ network.connect(targetNetwork);
111
+ setLastWalletName(null);
112
+ setSettingsLoaded(true);
113
+ });
114
+ }, []); // eslint-disable-line react-hooks/exhaustive-deps
115
+ const persistSettings = useCallback(async () => {
116
+ if (!settingsLoaded)
117
+ return;
118
+ try {
119
+ const existing = await loadSettings(storage);
120
+ const settings = {
121
+ ...existing,
122
+ lastNetwork: network.id,
123
+ lastWallet: wallet.activeWallet?.name ?? null,
124
+ };
125
+ await saveSettings(storage, settings);
126
+ }
127
+ catch (err) {
128
+ // Non-fatal background write — warn but don't disrupt the session.
129
+ const msg = err instanceof Error ? err.message : String(err);
130
+ logs.warn(`Failed to persist settings: ${msg}`);
131
+ }
132
+ }, [storage, network.id, wallet.activeWallet?.name, settingsLoaded]);
133
+ useEffect(() => { persistSettings(); }, [persistSettings]);
134
+ useEffect(() => {
135
+ return () => { wallet.lockAll(); };
136
+ }, [wallet.lockAll]);
137
+ // Onboarding handler — fired by the wizard's final step. Uses a ref so
138
+ // route params can hold a stable callback while we still see latest state.
139
+ const onboardingHandlerRef = useRef(() => { });
140
+ onboardingHandlerRef.current = async (state) => {
141
+ setOnboardingError(undefined);
142
+ try {
143
+ if (state.source === 'random') {
144
+ const info = await wallet.generate(state.name, state.passphrase, state.network);
145
+ nav.replace('onboarding-mnemonic-display', {
146
+ onComplete: onboardingCompleteStable,
147
+ partial: { ...state, generatedMnemonic: info.mnemonic },
148
+ });
149
+ }
150
+ else if (state.source === 'mnemonic') {
151
+ await wallet.importWallet(state.name, state.seedInput, state.passphrase, state.network);
152
+ nav.reset('dashboard', undefined);
153
+ }
154
+ else if (state.source === 'hex') {
155
+ await wallet.importFromSeed(state.name, state.seedInput, state.passphrase, state.network);
156
+ nav.reset('dashboard', undefined);
157
+ }
158
+ await wallet.switchWallet(state.name);
159
+ if (state.network !== network.id) {
160
+ await connectNetwork(state.network);
161
+ }
162
+ logs.info(`Wallet "${state.name}" created on ${state.network}`);
163
+ }
164
+ catch (err) {
165
+ const msg = err instanceof Error ? err.message : String(err);
166
+ setOnboardingError(msg);
167
+ logs.error(`Onboarding failed: ${msg}`);
168
+ if (nav.route.name === 'onboarding-initializing')
169
+ nav.pop();
170
+ }
171
+ };
172
+ const onboardingCompleteStable = useCallback((state) => {
173
+ onboardingHandlerRef.current(state);
174
+ }, []);
175
+ // Unlock handler used by the onboarding-unlock screen. Activates the
176
+ // selected wallet (if needed) and unlocks it; throws on bad passphrase
177
+ // so the screen can show an error.
178
+ const onUnlockHandlerRef = useRef(async () => { });
179
+ onUnlockHandlerRef.current = async (name, passphrase) => {
180
+ // Only the decrypt can fail with a bad passphrase — await it so the
181
+ // screen can show the error, then report success immediately. The
182
+ // activation + network switch (which kicks off the multi-second sync
183
+ // restore) continues in the background; the dashboard renders sync
184
+ // progress as it goes.
185
+ await wallet.unlock(name, passphrase);
186
+ logs.info(`Wallet unlocked: ${name}`);
187
+ void (async () => {
188
+ try {
189
+ if (wallet.activeWallet?.name !== name) {
190
+ await wallet.switchWallet(name);
191
+ }
192
+ const target = wallet.wallets.find(w => w.name === name);
193
+ if (target && target.network !== network.id) {
194
+ await connectNetwork(target.network);
195
+ logs.info(`Switched to network: ${target.network}`);
196
+ }
197
+ }
198
+ catch (err) {
199
+ const msg = err instanceof Error ? err.message : String(err);
200
+ logs.error(`Post-unlock activation failed for ${name}: ${msg}`);
201
+ }
202
+ })();
203
+ };
204
+ const onUnlockStable = useCallback((name, pass) => {
205
+ return onUnlockHandlerRef.current(name, pass);
206
+ }, []);
207
+ // First-run: kick off the right onboarding flow on cold start.
208
+ // No wallets → create flow. Wallets present → pick-and-unlock flow.
209
+ useEffect(() => {
210
+ if (!settingsLoaded || firstRunHandledRef.current)
211
+ return;
212
+ if (wallet.loading)
213
+ return;
214
+ if (nav.route.name !== 'dashboard')
215
+ return;
216
+ firstRunHandledRef.current = true;
217
+ if (wallet.wallets.length === 0) {
218
+ nav.push('onboarding-network', { onComplete: onboardingCompleteStable, partial: {} });
219
+ }
220
+ else {
221
+ nav.push('onboarding-select', {
222
+ wallets: wallet.wallets,
223
+ lastWallet: lastWalletName,
224
+ onComplete: onboardingCompleteStable,
225
+ onUnlock: onUnlockStable,
226
+ });
227
+ }
228
+ }, [settingsLoaded, wallet.loading, wallet.wallets, lastWalletName, nav, onboardingCompleteStable, onUnlockStable]);
229
+ const unreadLogs = logs.count - lastLogsSeen;
230
+ const walletState = wallet.activeWallet ? {
231
+ ...wallet.activeWallet,
232
+ nightBalance: balance.nightBalance,
233
+ dustBalance: balance.dustBalance,
234
+ synced: balance.synced,
235
+ syncProgress: balance.synced ? 1 : 0,
236
+ } : null;
237
+ // Global hotkeys — Esc walks back through onboarding; Meta combos as before.
238
+ useInput((input, key) => {
239
+ if (key.escape && inOnboarding && nav.canGoBack()) {
240
+ setOnboardingError(undefined);
241
+ nav.pop();
242
+ return;
243
+ }
244
+ if (!key.meta)
245
+ return;
246
+ if (input === 'q') {
247
+ wallet.lockAll();
248
+ exit();
249
+ return;
250
+ }
251
+ if (input === 'p') {
252
+ setPaused(p => !p);
253
+ logs.info(paused ? 'Resumed' : 'Paused');
254
+ return;
255
+ }
256
+ });
257
+ // A daemon-issued confirmation takes over the screen until answered.
258
+ // Rendering the modal instead of (not on top of) the current view means
259
+ // its useInput handler is the only one active — the underlying screen
260
+ // can't race with the y/n keystroke. Approving/denying advances the
261
+ // queue and this branch flips back to the dashboard or onboarding view.
262
+ if (hasPendingConfirmation) {
263
+ return (_jsx(Box, { flexDirection: "column", height: termHeight, children: _jsx(ConfirmationModal, { queue: confirmationQueue }) }));
264
+ }
265
+ if (inOnboarding) {
266
+ return (_jsx(Box, { flexDirection: "column", height: termHeight, children: _jsx(OnboardingHost, { route: nav.route, nav: nav, initError: onboardingError }) }));
267
+ }
268
+ const unlocked = walletState ? wallet.isUnlocked(walletState.name) : false;
269
+ const entry = walletState ? wallet.getUnlocked(walletState.name) : undefined;
270
+ const addrs = entry ? {
271
+ unshielded: entry.addresses.nightExternal.bech32m[network.id] ?? '(unknown)',
272
+ shielded: entry.addresses.zswap.bech32m[network.id] ?? '(unknown)',
273
+ dust: entry.addresses.dust.bech32m[network.id] ?? '(unknown)',
274
+ } : undefined;
275
+ return (_jsx(Box, { flexDirection: "column", height: termHeight, children: _jsx(DashboardHub, { wallet: walletState, isUnlocked: unlocked, network: network, chain: chain, paused: paused, addresses: addrs, shieldedBalances: balance.shieldedBalances, unshieldedBalances: balance.unshieldedBalances, dustBalance: balance.dustRaw, coins: balance.coins, subProgress: balance.subProgress, unreadLogs: unreadLogs, onQuit: () => { wallet.lockAll(); exit(); }, onViewLogs: () => setLastLogsSeen(logs.count), renderSend: (onBack) => (_jsx(Send, { wallet: walletState, shieldedBalances: balance.shieldedBalances, unshieldedBalances: balance.unshieldedBalances, onSend: async (to, amount, shielded, tokenId) => {
276
+ const facade = balance.getFacade();
277
+ if (!facade || !activeWalletKeys) {
278
+ logs.error('Wallet not synced — unlock and wait for sync');
279
+ return;
280
+ }
281
+ // NIGHT is only the native unshielded token; shielded all-zeros is a custom raw-integer token.
282
+ const isNight = !shielded && tokenId === NIGHT_TOKEN_ID;
283
+ const raw = isNight ? parseNightAmount(amount) : BigInt(amount);
284
+ logs.info(`Transfer ${amount} ${isNight ? 'NIGHT' : tokenId.slice(0, 8)} to ${to.slice(0, 16)}... (shielded: ${shielded})`);
285
+ const req = { type: shielded ? 'shielded' : 'unshielded', tokenId, amount: raw, to };
286
+ const txHash = await sendTokensWithKeys(facade, activeWalletKeys, network.id, [req], (stage) => {
287
+ logs.info(`Send: ${stage}`);
288
+ });
289
+ logs.info(`Transfer submitted: ${txHash}`);
290
+ await balance.refresh();
291
+ }, onBack: onBack })), renderDeploy: (onBack) => (_jsx(Deploy, { onDeploy: async (path, witnesses, projDir) => {
292
+ logs.info(`Deploying ${path}${witnesses ? ` with ${witnesses}` : ''}`);
293
+ const { deployContract, loadContractArtifact } = await import('@shieldedtech/moth-wallet');
294
+ const artifact = await loadContractArtifact(path);
295
+ const walletEntry = wallet.getUnlocked(wallet.activeWallet?.name ?? '');
296
+ if (!walletEntry)
297
+ throw new Error('Wallet not unlocked');
298
+ const facade = balance.getFacade();
299
+ if (!facade)
300
+ throw new Error('Wallet not synced — wait for sync to complete');
301
+ const result = await deployContract({
302
+ artifact,
303
+ walletKeys: walletEntry.wallet.walletKeys,
304
+ network: networkConfig,
305
+ syncedWallet: syncedWalletStub(facade),
306
+ witnessPath: witnesses ?? undefined,
307
+ projectDir: projDir ?? undefined,
308
+ onProgress: (stage) => logs.info(`Deploy: ${stage}`),
309
+ });
310
+ logs.info(`Deployed: ${result.contractAddress}`);
311
+ return result.contractAddress ?? result.hash;
312
+ }, onBack: onBack })), renderMint: (onBack) => (_jsx(Mint, { defaultShieldedRecipient: wallet.getUnlocked(wallet.activeWallet?.name ?? '')?.addresses.zswap.bech32m[network.id], defaultUnshieldedRecipient: wallet.getUnlocked(wallet.activeWallet?.name ?? '')?.addresses.nightExternal.bech32m[network.id], onMint: async (addr, amount, shielded, recipient) => {
313
+ const { mintFungibleToken } = await import('@shieldedtech/moth-wallet');
314
+ const walletEntry = wallet.getUnlocked(wallet.activeWallet?.name ?? '');
315
+ if (!walletEntry)
316
+ throw new Error('Wallet not unlocked');
317
+ const facade = balance.getFacade();
318
+ if (!facade)
319
+ throw new Error('Wallet not synced — wait for sync to complete');
320
+ logs.info(`Minting ${amount} ${shielded ? 'shielded' : 'unshielded'} token(s) on ${addr.slice(0, 16)}… → ${recipient.slice(0, 16)}…`);
321
+ const result = await mintFungibleToken({
322
+ contractAddress: addr,
323
+ recipientAddress: recipient,
324
+ amount: BigInt(amount),
325
+ shielded,
326
+ keys: walletEntry.wallet.keys,
327
+ walletKeys: walletEntry.wallet.walletKeys,
328
+ network: networkConfig,
329
+ syncedWallet: syncedWalletStub(facade),
330
+ });
331
+ logs.info(`Mint submitted: ${result.hash}`);
332
+ await balance.refresh();
333
+ }, onDeployFT: async () => {
334
+ const { deployFungibleToken } = await import('@shieldedtech/moth-wallet');
335
+ const walletEntry = wallet.getUnlocked(wallet.activeWallet?.name ?? '');
336
+ if (!walletEntry)
337
+ throw new Error('Wallet not unlocked');
338
+ const facade = balance.getFacade();
339
+ if (!facade)
340
+ throw new Error('Wallet not synced — wait for sync to complete');
341
+ logs.info('Auto-deploying fungible token contract...');
342
+ const result = await deployFungibleToken({
343
+ walletKeys: walletEntry.wallet.walletKeys,
344
+ network: networkConfig,
345
+ syncedWallet: syncedWalletStub(facade),
346
+ onProgress: (stage) => logs.info(`Deploy FT: ${stage}`),
347
+ });
348
+ const address = result.contractAddress ?? result.hash;
349
+ logs.info(`FT contract deployed: ${address}`);
350
+ return address;
351
+ }, onBack: onBack })), renderContract: (onBack) => (_jsx(Contract, { indexerUrl: network.indexerUrl, onBack: onBack })), renderKeys: (onBack) => (_jsx(Keys, { wallets: wallet.wallets, isUnlocked: wallet.isUnlocked, getAddresses: (name) => {
352
+ const e = wallet.getUnlocked(name);
353
+ if (!e)
354
+ return null;
355
+ const w = wallet.wallets.find(x => x.name === name);
356
+ const net = w?.network ?? network.id;
357
+ return {
358
+ unshielded: e.addresses.nightExternal.bech32m[net] ?? '(unknown)',
359
+ shielded: e.addresses.zswap.bech32m[net] ?? '(unknown)',
360
+ dust: e.addresses.dust.bech32m[net] ?? '(unknown)',
361
+ };
362
+ }, onUnlock: async (name, pass) => {
363
+ // Await only the decrypt (bad-passphrase errors surface on the
364
+ // screen); activation + network switch continue in the
365
+ // background so the unlock prompt isn't held hostage by the
366
+ // sync-cache restore.
367
+ await wallet.unlock(name, pass);
368
+ logs.info(`Wallet unlocked: ${name}`);
369
+ void (async () => {
370
+ try {
371
+ if (wallet.activeWallet?.name !== name) {
372
+ await wallet.switchWallet(name);
373
+ logs.info(`Switched to wallet: ${name}`);
374
+ }
375
+ const target = wallet.wallets.find(w => w.name === name);
376
+ if (target && target.network !== network.id) {
377
+ await connectNetwork(target.network);
378
+ logs.info(`Switched to network: ${target.network}`);
379
+ }
380
+ }
381
+ catch (err) {
382
+ const msg = err instanceof Error ? err.message : String(err);
383
+ logs.error(`Post-unlock activation failed for ${name}: ${msg}`);
384
+ }
385
+ })();
386
+ }, onLock: (name) => {
387
+ wallet.lockOne(name);
388
+ logs.info(`Wallet locked: ${name}`);
389
+ }, onSwitch: async (name) => {
390
+ await wallet.switchWallet(name);
391
+ logs.info(`Switched to wallet: ${name}`);
392
+ const target = wallet.wallets.find(w => w.name === name);
393
+ if (target && target.network !== network.id) {
394
+ await connectNetwork(target.network);
395
+ logs.info(`Switched to network: ${target.network}`);
396
+ }
397
+ }, onRemove: async (name) => {
398
+ await wallet.removeWallet(name);
399
+ logs.info(`Wallet removed: ${name}`);
400
+ }, onClearCache: (name) => {
401
+ void clearSyncCache(name, network.id).then(() => {
402
+ logs.info(`Sync cache cleared for ${name} on ${network.id}`);
403
+ });
404
+ }, onCreateNew: () => {
405
+ nav.push('onboarding-network', { onComplete: onboardingCompleteStable, partial: {} });
406
+ }, onBack: onBack })), renderDust: (onBack) => (_jsx(Dust, { dustAddress: addrs?.dust ?? '',
407
+ // DUST registration only reads unshielded NIGHT UTXOs (see
408
+ // designateForDust), so gate on the unshielded sub-wallet being
409
+ // synced — not the aggregate `synced`, which never completes for a
410
+ // fresh NIGHT-only wallet whose empty shielded/DUST streams never
411
+ // reach strict completion.
412
+ synced: balance.syncProgress?.unshieldedSynced ?? balance.synced, syncStatus: balance.syncStatus, loadUtxos: async () => {
413
+ const facade = balance.getFacade();
414
+ if (!facade)
415
+ throw new Error('Wallet not synced — wait for sync to complete');
416
+ return listNightUtxos(facade);
417
+ }, onRegister: async (utxos, receiver) => {
418
+ const facade = balance.getFacade();
419
+ if (!facade || !activeWalletKeys)
420
+ return { success: false, error: 'Wallet not synced' };
421
+ logs.info(`Registering ${utxos.length} UTXO(s) for DUST${receiver ? ` (receiver: ${receiver.slice(0, 20)}...)` : ''}`);
422
+ try {
423
+ const txHash = await designateForDustWithKeys(facade, activeWalletKeys, network.id, receiver, (s) => logs.info(`DUST register: ${s}`), utxos);
424
+ if (!txHash)
425
+ return { success: false, error: 'No UTXOs registered' };
426
+ logs.info(`DUST registration submitted: ${txHash}`);
427
+ await balance.refresh();
428
+ return { success: true, txId: txHash };
429
+ }
430
+ catch (err) {
431
+ const msg = err instanceof Error ? err.message : String(err);
432
+ logs.error(`DUST register failed: ${msg}`);
433
+ return { success: false, error: msg };
434
+ }
435
+ }, onDeregister: async (utxos) => {
436
+ const facade = balance.getFacade();
437
+ if (!facade || !activeWalletKeys)
438
+ return { success: false, error: 'Wallet not synced' };
439
+ logs.info(`Deregistering ${utxos.length} UTXO(s) from DUST`);
440
+ try {
441
+ const txHash = await dedesignateFromDustWithKeys(facade, activeWalletKeys, network.id, (s) => logs.info(`DUST deregister: ${s}`), utxos);
442
+ logs.info(`DUST deregistration submitted: ${txHash}`);
443
+ await balance.refresh();
444
+ return { success: true, txId: txHash };
445
+ }
446
+ catch (err) {
447
+ const msg = err instanceof Error ? err.message : String(err);
448
+ logs.error(`DUST deregister failed: ${msg}`);
449
+ return { success: false, error: msg };
450
+ }
451
+ }, onBack: onBack })), renderNetwork: (onBack) => (_jsx(Network, { network: network, onSwitch: (id) => {
452
+ void connectNetwork(id).then(() => {
453
+ logs.info(`Switched to network: ${id}`);
454
+ });
455
+ }, onSaveOverrides: async (netId, overrides) => {
456
+ try {
457
+ const settings = await loadSettings(storage);
458
+ settings.networkOverrides = settings.networkOverrides ?? {};
459
+ settings.networkOverrides[netId] = {
460
+ ...settings.networkOverrides[netId],
461
+ ...overrides,
462
+ };
463
+ await saveSettings(storage, settings);
464
+ logs.info(`Network overrides saved for ${netId}`);
465
+ network.connect(netId, settings.networkOverrides[netId]);
466
+ }
467
+ catch (err) {
468
+ // User-initiated save — surface the failure as an error.
469
+ const msg = err instanceof Error ? err.message : String(err);
470
+ logs.error(`Failed to save network overrides for ${netId}: ${msg}`);
471
+ }
472
+ }, onBack: onBack })), renderLogs: (onBack) => (_jsx(Logs, { entries: logs.entries, onClear: logs.clear, onBack: onBack })) }) }));
473
+ }
474
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../src/app.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import React from 'react';
2
+ export declare function BackHint({ label }: {
3
+ label?: string;
4
+ }): React.JSX.Element;
5
+ //# sourceMappingURL=BackHint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackHint.d.ts","sourceRoot":"","sources":["../../src/components/BackHint.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,wBAAgB,QAAQ,CAAC,EAAE,KAAc,EAAE,EAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,qBAM9D"}
@@ -0,0 +1,6 @@
1
+ import { jsxs as _jsxs, jsx as _jsx } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export function BackHint({ label = 'back' }) {
4
+ return (_jsx(Box, { marginTop: 1, children: _jsxs(Text, { dimColor: true, children: ["Press Esc to ", label] }) }));
5
+ }
6
+ //# sourceMappingURL=BackHint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackHint.js","sourceRoot":"","sources":["../../src/components/BackHint.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAEhC,MAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,GAAG,MAAM,EAAsB;IAC7D,OAAO,CACL,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,YACf,MAAC,IAAI,IAAC,QAAQ,oCAAe,KAAK,IAAQ,GACtC,CACP,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ interface BalanceTableProps {
3
+ nightBalance: string;
4
+ dustBalance: string;
5
+ synced: boolean;
6
+ }
7
+ export declare function BalanceTable({ nightBalance, dustBalance, synced }: BalanceTableProps): React.JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=BalanceTable.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BalanceTable.d.ts","sourceRoot":"","sources":["../../src/components/BalanceTable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,UAAU,iBAAiB;IACzB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,OAAO,CAAC;CACjB;AAED,wBAAgB,YAAY,CAAC,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,EAAE,EAAE,iBAAiB,qBAuBpF"}
@@ -0,0 +1,8 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export function BalanceTable({ nightBalance, dustBalance, synced }) {
4
+ const syncIndicator = synced ? '●' : '○';
5
+ const syncColor = synced ? 'green' : 'yellow';
6
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { bold: true, children: 'Token'.padEnd(10) }), _jsx(Text, { bold: true, children: 'Balance'.padEnd(20) }), _jsx(Text, { bold: true, children: "Sync" })] }), _jsxs(Box, { children: [_jsx(Text, { children: 'NIGHT'.padEnd(10) }), _jsx(Text, { color: "yellow", children: (nightBalance || '0').padEnd(20) }), _jsx(Text, { color: syncColor, children: syncIndicator })] }), _jsxs(Box, { children: [_jsx(Text, { children: 'DUST'.padEnd(10) }), _jsx(Text, { color: "magenta", children: (dustBalance || '0').padEnd(20) }), _jsx(Text, { color: syncColor, children: syncIndicator })] })] }));
7
+ }
8
+ //# sourceMappingURL=BalanceTable.js.map