@spacesops/wdk-react-native-core 1.0.0-beta.40

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 (275) hide show
  1. package/README.md +551 -0
  2. package/dist/__mocks__/react.d.ts +40 -0
  3. package/dist/__mocks__/react.js +33 -0
  4. package/dist/__mocks__/react.js.map +1 -0
  5. package/dist/__mocks__/secureStorage.d.ts +26 -0
  6. package/dist/__mocks__/secureStorage.js +80 -0
  7. package/dist/__mocks__/secureStorage.js.map +1 -0
  8. package/dist/__tests__/hooks/useBalance.test.d.ts +6 -0
  9. package/dist/__tests__/hooks/useBalance.test.js +217 -0
  10. package/dist/__tests__/hooks/useBalance.test.js.map +1 -0
  11. package/dist/__tests__/hooks/useWallet.test.d.ts +6 -0
  12. package/dist/__tests__/hooks/useWallet.test.js +105 -0
  13. package/dist/__tests__/hooks/useWallet.test.js.map +1 -0
  14. package/dist/__tests__/hooks/useWalletManager.test.d.ts +6 -0
  15. package/dist/__tests__/hooks/useWalletManager.test.js +193 -0
  16. package/dist/__tests__/hooks/useWalletManager.test.js.map +1 -0
  17. package/dist/__tests__/hooks/useWdkApp.test.d.ts +6 -0
  18. package/dist/__tests__/hooks/useWdkApp.test.js +55 -0
  19. package/dist/__tests__/hooks/useWdkApp.test.js.map +1 -0
  20. package/dist/__tests__/hooks/useWorklet.test.d.ts +6 -0
  21. package/dist/__tests__/hooks/useWorklet.test.js +168 -0
  22. package/dist/__tests__/hooks/useWorklet.test.js.map +1 -0
  23. package/dist/__tests__/provider/WdkAppProvider.test.d.ts +6 -0
  24. package/dist/__tests__/provider/WdkAppProvider.test.js +57 -0
  25. package/dist/__tests__/provider/WdkAppProvider.test.js.map +1 -0
  26. package/dist/__tests__/services/accountService.test.d.ts +6 -0
  27. package/dist/__tests__/services/accountService.test.js +216 -0
  28. package/dist/__tests__/services/accountService.test.js.map +1 -0
  29. package/dist/__tests__/services/addressService.test.d.ts +6 -0
  30. package/dist/__tests__/services/addressService.test.js +246 -0
  31. package/dist/__tests__/services/addressService.test.js.map +1 -0
  32. package/dist/__tests__/services/balanceService.test.d.ts +6 -0
  33. package/dist/__tests__/services/balanceService.test.js +333 -0
  34. package/dist/__tests__/services/balanceService.test.js.map +1 -0
  35. package/dist/__tests__/services/walletSetupService.test.d.ts +6 -0
  36. package/dist/__tests__/services/walletSetupService.test.js +304 -0
  37. package/dist/__tests__/services/walletSetupService.test.js.map +1 -0
  38. package/dist/__tests__/services/walletSwitchingService.test.d.ts +6 -0
  39. package/dist/__tests__/services/walletSwitchingService.test.js +209 -0
  40. package/dist/__tests__/services/walletSwitchingService.test.js.map +1 -0
  41. package/dist/__tests__/services/workletLifecycleService.test.d.ts +6 -0
  42. package/dist/__tests__/services/workletLifecycleService.test.js +451 -0
  43. package/dist/__tests__/services/workletLifecycleService.test.js.map +1 -0
  44. package/dist/__tests__/setup.d.ts +7 -0
  45. package/dist/__tests__/setup.js +49 -0
  46. package/dist/__tests__/setup.js.map +1 -0
  47. package/dist/__tests__/storage/mmkvStorage.test.d.ts +6 -0
  48. package/dist/__tests__/storage/mmkvStorage.test.js +213 -0
  49. package/dist/__tests__/storage/mmkvStorage.test.js.map +1 -0
  50. package/dist/__tests__/store/walletStore.test.d.ts +4 -0
  51. package/dist/__tests__/store/walletStore.test.js +86 -0
  52. package/dist/__tests__/store/walletStore.test.js.map +1 -0
  53. package/dist/__tests__/store/workletStore.test.d.ts +4 -0
  54. package/dist/__tests__/store/workletStore.test.js +255 -0
  55. package/dist/__tests__/store/workletStore.test.js.map +1 -0
  56. package/dist/__tests__/types/hrpc.test.d.ts +4 -0
  57. package/dist/__tests__/types/hrpc.test.js +99 -0
  58. package/dist/__tests__/types/hrpc.test.js.map +1 -0
  59. package/dist/__tests__/utils/balanceUtils.test.d.ts +4 -0
  60. package/dist/__tests__/utils/balanceUtils.test.js +133 -0
  61. package/dist/__tests__/utils/balanceUtils.test.js.map +1 -0
  62. package/dist/__tests__/utils/errorHandling.test.d.ts +6 -0
  63. package/dist/__tests__/utils/errorHandling.test.js +119 -0
  64. package/dist/__tests__/utils/errorHandling.test.js.map +1 -0
  65. package/dist/__tests__/utils/errorUtils.test.d.ts +4 -0
  66. package/dist/__tests__/utils/errorUtils.test.js +133 -0
  67. package/dist/__tests__/utils/errorUtils.test.js.map +1 -0
  68. package/dist/__tests__/utils/initializationState.test.d.ts +6 -0
  69. package/dist/__tests__/utils/initializationState.test.js +243 -0
  70. package/dist/__tests__/utils/initializationState.test.js.map +1 -0
  71. package/dist/__tests__/utils/jsonUtils.test.d.ts +4 -0
  72. package/dist/__tests__/utils/jsonUtils.test.js +118 -0
  73. package/dist/__tests__/utils/jsonUtils.test.js.map +1 -0
  74. package/dist/__tests__/utils/mmkvKeyManager.test.d.ts +6 -0
  75. package/dist/__tests__/utils/mmkvKeyManager.test.js +158 -0
  76. package/dist/__tests__/utils/mmkvKeyManager.test.js.map +1 -0
  77. package/dist/__tests__/utils/mnemonicUtils.test.d.ts +4 -0
  78. package/dist/__tests__/utils/mnemonicUtils.test.js +40 -0
  79. package/dist/__tests__/utils/mnemonicUtils.test.js.map +1 -0
  80. package/dist/__tests__/utils/raceConditions.test.d.ts +6 -0
  81. package/dist/__tests__/utils/raceConditions.test.js +239 -0
  82. package/dist/__tests__/utils/raceConditions.test.js.map +1 -0
  83. package/dist/__tests__/utils/result.test.d.ts +4 -0
  84. package/dist/__tests__/utils/result.test.js +66 -0
  85. package/dist/__tests__/utils/result.test.js.map +1 -0
  86. package/dist/__tests__/utils/schemas.test.d.ts +4 -0
  87. package/dist/__tests__/utils/schemas.test.js +66 -0
  88. package/dist/__tests__/utils/schemas.test.js.map +1 -0
  89. package/dist/__tests__/utils/storeHelpers.test.d.ts +4 -0
  90. package/dist/__tests__/utils/storeHelpers.test.js +227 -0
  91. package/dist/__tests__/utils/storeHelpers.test.js.map +1 -0
  92. package/dist/__tests__/utils/typeGuards.test.d.ts +4 -0
  93. package/dist/__tests__/utils/typeGuards.test.js +175 -0
  94. package/dist/__tests__/utils/typeGuards.test.js.map +1 -0
  95. package/dist/__tests__/utils/validation.test.d.ts +4 -0
  96. package/dist/__tests__/utils/validation.test.js +126 -0
  97. package/dist/__tests__/utils/validation.test.js.map +1 -0
  98. package/dist/__tests__/utils/walletUtils.test.d.ts +4 -0
  99. package/dist/__tests__/utils/walletUtils.test.js +156 -0
  100. package/dist/__tests__/utils/walletUtils.test.js.map +1 -0
  101. package/dist/hooks/useBalance.d.ts +170 -0
  102. package/dist/hooks/useBalance.js +442 -0
  103. package/dist/hooks/useBalance.js.map +1 -0
  104. package/dist/hooks/useWallet.d.ts +43 -0
  105. package/dist/hooks/useWallet.js +193 -0
  106. package/dist/hooks/useWallet.js.map +1 -0
  107. package/dist/hooks/useWalletManager.d.ts +100 -0
  108. package/dist/hooks/useWalletManager.js +526 -0
  109. package/dist/hooks/useWalletManager.js.map +1 -0
  110. package/dist/hooks/useWdkApp.d.ts +66 -0
  111. package/dist/hooks/useWdkApp.js +74 -0
  112. package/dist/hooks/useWdkApp.js.map +1 -0
  113. package/dist/hooks/useWorklet.d.ts +66 -0
  114. package/dist/hooks/useWorklet.js +42 -0
  115. package/dist/hooks/useWorklet.js.map +1 -0
  116. package/dist/index.d.ts +33 -0
  117. package/dist/index.js +36 -0
  118. package/dist/index.js.map +1 -0
  119. package/dist/provider/WdkAppProvider.d.ts +112 -0
  120. package/dist/provider/WdkAppProvider.js +558 -0
  121. package/dist/provider/WdkAppProvider.js.map +1 -0
  122. package/dist/services/accountService.d.ts +52 -0
  123. package/dist/services/accountService.js +119 -0
  124. package/dist/services/accountService.js.map +1 -0
  125. package/dist/services/addressService.d.ts +22 -0
  126. package/dist/services/addressService.js +110 -0
  127. package/dist/services/addressService.js.map +1 -0
  128. package/dist/services/balanceService.d.ts +114 -0
  129. package/dist/services/balanceService.js +208 -0
  130. package/dist/services/balanceService.js.map +1 -0
  131. package/dist/services/walletSetupService.d.ts +217 -0
  132. package/dist/services/walletSetupService.js +535 -0
  133. package/dist/services/walletSetupService.js.map +1 -0
  134. package/dist/services/walletSwitchingService.d.ts +48 -0
  135. package/dist/services/walletSwitchingService.js +143 -0
  136. package/dist/services/walletSwitchingService.js.map +1 -0
  137. package/dist/services/workletLifecycleService.d.ts +117 -0
  138. package/dist/services/workletLifecycleService.js +433 -0
  139. package/dist/services/workletLifecycleService.js.map +1 -0
  140. package/dist/storage/mmkvStorage.d.ts +44 -0
  141. package/dist/storage/mmkvStorage.js +348 -0
  142. package/dist/storage/mmkvStorage.js.map +1 -0
  143. package/dist/store/walletStore.d.ts +130 -0
  144. package/dist/store/walletStore.js +204 -0
  145. package/dist/store/walletStore.js.map +1 -0
  146. package/dist/store/workletStore.d.ts +121 -0
  147. package/dist/store/workletStore.js +256 -0
  148. package/dist/store/workletStore.js.map +1 -0
  149. package/dist/types/hrpc.d.ts +60 -0
  150. package/dist/types/hrpc.js +26 -0
  151. package/dist/types/hrpc.js.map +1 -0
  152. package/dist/types.d.ts +168 -0
  153. package/dist/types.js +7 -0
  154. package/dist/types.js.map +1 -0
  155. package/dist/utils/balanceUtils.d.ts +30 -0
  156. package/dist/utils/balanceUtils.js +86 -0
  157. package/dist/utils/balanceUtils.js.map +1 -0
  158. package/dist/utils/constants.d.ts +66 -0
  159. package/dist/utils/constants.js +73 -0
  160. package/dist/utils/constants.js.map +1 -0
  161. package/dist/utils/errorHandling.d.ts +47 -0
  162. package/dist/utils/errorHandling.js +54 -0
  163. package/dist/utils/errorHandling.js.map +1 -0
  164. package/dist/utils/errorUtils.d.ts +89 -0
  165. package/dist/utils/errorUtils.js +264 -0
  166. package/dist/utils/errorUtils.js.map +1 -0
  167. package/dist/utils/initializationState.d.ts +129 -0
  168. package/dist/utils/initializationState.js +220 -0
  169. package/dist/utils/initializationState.js.map +1 -0
  170. package/dist/utils/jsonUtils.d.ts +21 -0
  171. package/dist/utils/jsonUtils.js +67 -0
  172. package/dist/utils/jsonUtils.js.map +1 -0
  173. package/dist/utils/logger.d.ts +27 -0
  174. package/dist/utils/logger.js +50 -0
  175. package/dist/utils/logger.js.map +1 -0
  176. package/dist/utils/mmkvKeyManager.d.ts +57 -0
  177. package/dist/utils/mmkvKeyManager.js +214 -0
  178. package/dist/utils/mmkvKeyManager.js.map +1 -0
  179. package/dist/utils/mnemonicUtils.d.ts +17 -0
  180. package/dist/utils/mnemonicUtils.js +28 -0
  181. package/dist/utils/mnemonicUtils.js.map +1 -0
  182. package/dist/utils/operationMutex.d.ts +69 -0
  183. package/dist/utils/operationMutex.js +150 -0
  184. package/dist/utils/operationMutex.js.map +1 -0
  185. package/dist/utils/result.d.ts +34 -0
  186. package/dist/utils/result.js +43 -0
  187. package/dist/utils/result.js.map +1 -0
  188. package/dist/utils/schemas.d.ts +365 -0
  189. package/dist/utils/schemas.js +152 -0
  190. package/dist/utils/schemas.js.map +1 -0
  191. package/dist/utils/storeHelpers.d.ts +112 -0
  192. package/dist/utils/storeHelpers.js +198 -0
  193. package/dist/utils/storeHelpers.js.map +1 -0
  194. package/dist/utils/typeGuards.d.ts +70 -0
  195. package/dist/utils/typeGuards.js +95 -0
  196. package/dist/utils/typeGuards.js.map +1 -0
  197. package/dist/utils/validation.d.ts +53 -0
  198. package/dist/utils/validation.js +152 -0
  199. package/dist/utils/validation.js.map +1 -0
  200. package/dist/utils/walletStateHelpers.d.ts +62 -0
  201. package/dist/utils/walletStateHelpers.js +81 -0
  202. package/dist/utils/walletStateHelpers.js.map +1 -0
  203. package/dist/utils/walletUtils.d.ts +38 -0
  204. package/dist/utils/walletUtils.js +87 -0
  205. package/dist/utils/walletUtils.js.map +1 -0
  206. package/package.json +79 -0
  207. package/src/__mocks__/react.ts +34 -0
  208. package/src/__mocks__/secureStorage.ts +87 -0
  209. package/src/__tests__/hooks/useBalance.test.ts +286 -0
  210. package/src/__tests__/hooks/useWallet.test.ts +122 -0
  211. package/src/__tests__/hooks/useWalletManager.test.ts +271 -0
  212. package/src/__tests__/hooks/useWdkApp.test.tsx +59 -0
  213. package/src/__tests__/hooks/useWorklet.test.ts +195 -0
  214. package/src/__tests__/provider/WdkAppProvider.test.tsx +67 -0
  215. package/src/__tests__/services/accountService.test.ts +337 -0
  216. package/src/__tests__/services/addressService.test.ts +312 -0
  217. package/src/__tests__/services/balanceService.test.ts +411 -0
  218. package/src/__tests__/services/walletSetupService.test.ts +463 -0
  219. package/src/__tests__/services/walletSwitchingService.test.ts +258 -0
  220. package/src/__tests__/services/workletLifecycleService.test.ts +514 -0
  221. package/src/__tests__/setup.ts +54 -0
  222. package/src/__tests__/storage/mmkvStorage.test.ts +325 -0
  223. package/src/__tests__/store/walletStore.test.ts +101 -0
  224. package/src/__tests__/store/workletStore.test.ts +329 -0
  225. package/src/__tests__/types/hrpc.test.ts +125 -0
  226. package/src/__tests__/utils/balanceUtils.test.ts +151 -0
  227. package/src/__tests__/utils/errorHandling.test.ts +147 -0
  228. package/src/__tests__/utils/errorUtils.test.ts +170 -0
  229. package/src/__tests__/utils/initializationState.test.ts +337 -0
  230. package/src/__tests__/utils/jsonUtils.test.ts +131 -0
  231. package/src/__tests__/utils/mmkvKeyManager.test.ts +205 -0
  232. package/src/__tests__/utils/mnemonicUtils.test.ts +48 -0
  233. package/src/__tests__/utils/raceConditions.test.ts +292 -0
  234. package/src/__tests__/utils/result.test.ts +73 -0
  235. package/src/__tests__/utils/schemas.test.ts +82 -0
  236. package/src/__tests__/utils/storeHelpers.test.ts +323 -0
  237. package/src/__tests__/utils/typeGuards.test.ts +209 -0
  238. package/src/__tests__/utils/validation.test.ts +152 -0
  239. package/src/__tests__/utils/walletUtils.test.ts +195 -0
  240. package/src/hooks/useBalance.ts +597 -0
  241. package/src/hooks/useWallet.ts +288 -0
  242. package/src/hooks/useWalletManager.ts +654 -0
  243. package/src/hooks/useWdkApp.ts +78 -0
  244. package/src/hooks/useWorklet.ts +109 -0
  245. package/src/index.ts +112 -0
  246. package/src/provider/WdkAppProvider.tsx +764 -0
  247. package/src/services/accountService.ts +134 -0
  248. package/src/services/addressService.ts +125 -0
  249. package/src/services/balanceService.ts +291 -0
  250. package/src/services/walletSetupService.ts +695 -0
  251. package/src/services/walletSwitchingService.ts +157 -0
  252. package/src/services/workletLifecycleService.ts +561 -0
  253. package/src/storage/mmkvStorage.ts +417 -0
  254. package/src/store/walletStore.ts +301 -0
  255. package/src/store/workletStore.ts +340 -0
  256. package/src/types/hrpc.ts +78 -0
  257. package/src/types.ts +188 -0
  258. package/src/utils/balanceUtils.ts +96 -0
  259. package/src/utils/constants.ts +84 -0
  260. package/src/utils/errorHandling.md +163 -0
  261. package/src/utils/errorHandling.ts +61 -0
  262. package/src/utils/errorUtils.ts +300 -0
  263. package/src/utils/initializationState.ts +242 -0
  264. package/src/utils/jsonUtils.ts +75 -0
  265. package/src/utils/logger.ts +54 -0
  266. package/src/utils/mmkvKeyManager.ts +256 -0
  267. package/src/utils/mnemonicUtils.ts +35 -0
  268. package/src/utils/operationMutex.ts +181 -0
  269. package/src/utils/result.ts +57 -0
  270. package/src/utils/schemas.ts +190 -0
  271. package/src/utils/storeHelpers.ts +236 -0
  272. package/src/utils/typeGuards.ts +129 -0
  273. package/src/utils/validation.ts +174 -0
  274. package/src/utils/walletStateHelpers.ts +104 -0
  275. package/src/utils/walletUtils.ts +107 -0
@@ -0,0 +1,204 @@
1
+ /**
2
+ * Wallet Store - Source of Truth for Wallet Data
3
+ *
4
+ * IMPORTANT: This is the ONLY place where addresses and balances are actually stored.
5
+ *
6
+ * ## Store Boundaries
7
+ *
8
+ * **walletStore** (this file):
9
+ * - Wallet addresses: { [walletId]: { [network]: { [accountIndex]: address } } }
10
+ * - Wallet balances: { [walletId]: { [network]: { [accountIndex]: { [tokenAddress]: balance } } } }
11
+ * - Address loading states: { [walletId]: { [network-accountIndex]: boolean } }
12
+ * - Balance loading states: { [walletId]: { [network-accountIndex-tokenAddress]: boolean } }
13
+ * - Last balance update timestamps: { [walletId]: { [network]: { [accountIndex]: timestamp } } }
14
+ * - Account list: { [walletId]: Array of account info }
15
+ * - Wallet list: Array of wallet info (multiple wallets)
16
+ * - Active wallet ID: Currently active wallet identifier
17
+ *
18
+ * Note: Loading states for wallet list operations are managed locally in hooks
19
+ * (useWalletManager) since they're ephemeral and only used within those hooks.
20
+ *
21
+ * **workletStore** (workletStore.ts):
22
+ * - Worklet lifecycle state (isWorkletStarted, isInitialized, etc.)
23
+ * - Worklet runtime instances (worklet, hrpc, ipc)
24
+ * - Worklet configuration
25
+ *
26
+ * ## Separation of Concerns
27
+ *
28
+ * - **walletStore**: Manages wallet data (addresses, balances) - derived/computed from worklet
29
+ * - **workletStore**: Manages worklet runtime and lifecycle
30
+ *
31
+ * These stores are intentionally separate to:
32
+ * 1. Prevent cross-contamination of lifecycle and data concerns
33
+ * 2. Allow independent persistence strategies
34
+ * 3. Enable clear boundaries for testing and debugging
35
+ *
36
+ * ## Important Notes
37
+ *
38
+ * - Addresses: Stored in Zustand (derived/computed state, deterministic, no refetching needed)
39
+ * - Balances: Stored in Zustand (single source of truth), use TanStack Query via useBalance() hook for fetching
40
+ * - Zustand is the single source of truth for balances
41
+ * - TanStack Query reads from Zustand (initialData) and updates Zustand after fetch
42
+ * - No sync logic needed - TanStack Query directly updates the source of truth
43
+ * - NEVER store worklet lifecycle state in walletStore
44
+ * - NEVER store worklet runtime instances in walletStore
45
+ * - All operations are handled by focused services (AddressService, BalanceService), not the store itself
46
+ */
47
+ // External packages
48
+ import { create } from 'zustand';
49
+ import { persist, createJSONStorage, devtools } from 'zustand/middleware';
50
+ import { createMMKVStorageAdapter } from '../storage/mmkvStorage';
51
+ import { log, logError } from '../utils/logger';
52
+ const initialState = {
53
+ addresses: {}, // walletId -> addresses
54
+ walletLoading: {}, // walletId -> loading states
55
+ balances: {}, // walletId -> balances
56
+ balanceLoading: {}, // walletId -> loading states
57
+ lastBalanceUpdate: {}, // walletId -> network -> accountIndex -> timestamp
58
+ accountList: {}, // walletId -> account list
59
+ walletList: [],
60
+ activeWalletId: null,
61
+ walletLoadingState: { type: 'not_loaded' },
62
+ isOperationInProgress: false,
63
+ currentOperation: null,
64
+ };
65
+ const defaultStorageAdapter = createMMKVStorageAdapter();
66
+ let walletStoreInstance = null;
67
+ /**
68
+ * Creates singleton wallet store instance.
69
+ * All operations are handled by focused services (AddressService, BalanceService), not the store itself.
70
+ */
71
+ export function createWalletStore() {
72
+ if (walletStoreInstance) {
73
+ return walletStoreInstance;
74
+ }
75
+ const store = create()(devtools(persist((set, get) => ({
76
+ ...initialState,
77
+ }), {
78
+ name: 'wallet-storage',
79
+ storage: createJSONStorage(() => defaultStorageAdapter),
80
+ partialize: (state) => ({
81
+ addresses: state.addresses,
82
+ balances: state.balances,
83
+ balanceLoading: {},
84
+ lastBalanceUpdate: state.lastBalanceUpdate,
85
+ accountList: state.accountList,
86
+ walletList: state.walletList,
87
+ activeWalletId: state.activeWalletId,
88
+ // Don't persist loading state or operation mutex - these are runtime-only
89
+ }),
90
+ onRehydrateStorage: () => {
91
+ return (state) => {
92
+ if (state) {
93
+ log('🔄 Rehydrating wallet state - resetting loading states');
94
+ state.walletLoading = {};
95
+ state.balanceLoading = {};
96
+ // Reset runtime-only state
97
+ state.walletLoadingState = { type: 'not_loaded' };
98
+ state.isOperationInProgress = false;
99
+ state.currentOperation = null;
100
+ }
101
+ };
102
+ },
103
+ }), { name: 'WalletStore' }));
104
+ walletStoreInstance = store;
105
+ return store;
106
+ }
107
+ export function getWalletStore() {
108
+ return createWalletStore();
109
+ }
110
+ /**
111
+ * Wallet state actions - helper functions for updating wallet loading state
112
+ * These provide a clean API for state transitions with validation
113
+ */
114
+ /**
115
+ * Validate state transition
116
+ * Returns true if transition is valid, false otherwise
117
+ */
118
+ function isValidStateTransition(current, next) {
119
+ // Allow reset from any state
120
+ if (next === 'not_loaded')
121
+ return true;
122
+ // Allow error from any state
123
+ if (next === 'error')
124
+ return true;
125
+ // After early returns, TypeScript narrows the type, but we need to check all transitions
126
+ // Use type assertion to tell TypeScript that 'not_loaded' and 'error' are still possible
127
+ // (even though they're handled by early returns, they're valid from all states)
128
+ const nextType = next;
129
+ switch (current.type) {
130
+ case 'not_loaded':
131
+ return nextType === 'checking' || nextType === 'loading';
132
+ case 'checking':
133
+ return nextType === 'loading' || nextType === 'error';
134
+ case 'loading':
135
+ return nextType === 'ready' || nextType === 'error';
136
+ case 'ready':
137
+ return nextType === 'not_loaded' || nextType === 'loading' || nextType === 'checking';
138
+ case 'error':
139
+ return nextType === 'not_loaded' || nextType === 'checking' || nextType === 'loading';
140
+ default:
141
+ return false;
142
+ }
143
+ }
144
+ /**
145
+ * Update wallet loading state with validation
146
+ * Throws error if transition is invalid
147
+ * Logs state transitions for debugging
148
+ */
149
+ export function updateWalletLoadingState(state, newState) {
150
+ // Log state transition for debugging
151
+ if (state.walletLoadingState.type !== newState.type) {
152
+ log(`[WalletState] Transition: ${state.walletLoadingState.type} -> ${newState.type}`, {
153
+ from: state.walletLoadingState,
154
+ to: newState,
155
+ });
156
+ }
157
+ if (!isValidStateTransition(state.walletLoadingState, newState.type)) {
158
+ const error = new Error(`Invalid state transition from ${state.walletLoadingState.type} to ${newState.type}`);
159
+ logError(`⚠️ Invalid state transition: ${error.message}`, {
160
+ currentState: state.walletLoadingState,
161
+ attemptedState: newState,
162
+ });
163
+ // In development, throw error. In production, log and allow transition
164
+ // Note: __DEV__ is a React Native global, may not be available in all environments
165
+ if (typeof __DEV__ !== 'undefined' && __DEV__) {
166
+ throw error;
167
+ }
168
+ }
169
+ return { walletLoadingState: newState };
170
+ }
171
+ /**
172
+ * Get wallet identifier from loading state
173
+ */
174
+ export function getWalletIdFromLoadingState(state) {
175
+ switch (state.type) {
176
+ case 'checking':
177
+ case 'loading':
178
+ case 'ready':
179
+ return state.identifier;
180
+ case 'error':
181
+ return state.identifier;
182
+ case 'not_loaded':
183
+ return null;
184
+ }
185
+ }
186
+ /**
187
+ * Check if wallet is in a loading state
188
+ */
189
+ export function isWalletLoadingState(state) {
190
+ return state.type === 'checking' || state.type === 'loading';
191
+ }
192
+ /**
193
+ * Check if wallet is ready
194
+ */
195
+ export function isWalletReadyState(state) {
196
+ return state.type === 'ready';
197
+ }
198
+ /**
199
+ * Check if wallet is in error state
200
+ */
201
+ export function isWalletErrorState(state) {
202
+ return state.type === 'error';
203
+ }
204
+ //# sourceMappingURL=walletStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletStore.js","sourceRoot":"","sources":["../../src/store/walletStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Worklet Store - Source of Truth for Worklet Lifecycle
3
+ *
4
+ * This store manages worklet lifecycle state (initialization, configuration, runtime instances).
5
+ *
6
+ * ## Store Boundaries
7
+ *
8
+ * **workletStore** (this file):
9
+ * - Worklet lifecycle state (isWorkletStarted, isInitialized, isLoading)
10
+ * - Worklet runtime instances (worklet, hrpc, ipc)
11
+ * - Worklet configuration (networkConfigs)
12
+ * - Worklet initialization results (workletStartResult, wdkInitResult)
13
+ * - Encrypted credentials in memory (encryptedSeed, encryptionKey) - for active wallet
14
+ * - Multi-wallet credential cache (credentialsCache) - for multiple wallets
15
+ *
16
+ * **walletStore** (walletStore.ts):
17
+ * - Wallet data (addresses, balances)
18
+ * - Wallet loading states
19
+ * - Balance loading states
20
+ * - Last balance update timestamps
21
+ *
22
+ * ## Separation of Concerns
23
+ *
24
+ * - **workletStore**: Manages the worklet runtime and its lifecycle
25
+ * - **walletStore**: Manages wallet data derived from the worklet
26
+ *
27
+ * These stores are intentionally separate to:
28
+ * 1. Prevent cross-contamination of lifecycle and data concerns
29
+ * 2. Allow independent persistence strategies
30
+ * 3. Enable clear boundaries for testing and debugging
31
+ *
32
+ * ## Important Notes
33
+ *
34
+ * - NEVER store wallet data (addresses, balances) in workletStore
35
+ * - NEVER store worklet lifecycle state in walletStore
36
+ * - All worklet state is runtime-only - state resets completely on app restart
37
+ * - Worklets must be recreated when the app restarts
38
+ * - Encrypted credentials are runtime-only (loaded from secure storage when needed)
39
+ * - All operations are handled by WorkletLifecycleService, not the store itself
40
+ */
41
+ import { create } from 'zustand';
42
+ import { Worklet } from '@spacesops/react-native-bare-kit';
43
+ import { HRPC } from '@spacesops/pear-wrk-wdk';
44
+ import type { WorkletStartResponse } from '@spacesops/pear-wrk-wdk/types/rpc';
45
+ import type { NetworkConfigs } from '../types';
46
+ /**
47
+ * Cached credentials interface for multi-wallet support
48
+ * Credentials are cached in workletStore to avoid repeated biometric prompts
49
+ */
50
+ export interface CachedCredentials {
51
+ encryptionKey?: string;
52
+ encryptedSeed?: string;
53
+ encryptedEntropy?: string;
54
+ expiresAt: number;
55
+ }
56
+ export interface WorkletState {
57
+ worklet: Worklet | null;
58
+ hrpc: HRPC | null;
59
+ ipc: unknown | null;
60
+ isWorkletStarted: boolean;
61
+ isInitialized: boolean;
62
+ isLoading: boolean;
63
+ error: string | null;
64
+ encryptedSeed: string | null;
65
+ encryptionKey: string | null;
66
+ networkConfigs: NetworkConfigs | null;
67
+ workletStartResult: WorkletStartResponse | null;
68
+ wdkInitResult: {
69
+ status?: string | null;
70
+ } | null;
71
+ credentialsCache: Record<string, CachedCredentials>;
72
+ credentialsCacheTTL: number;
73
+ }
74
+ export type WorkletStore = WorkletState;
75
+ type WorkletStoreInstance = ReturnType<ReturnType<typeof create<WorkletStore>>>;
76
+ /**
77
+ * Creates singleton worklet store instance.
78
+ *
79
+ * This store is runtime-only - all state resets on app restart.
80
+ * All operations are handled by WorkletLifecycleService, not the store itself.
81
+ */
82
+ export declare function createWorkletStore(): WorkletStoreInstance;
83
+ export declare function getWorkletStore(): import("zustand").UseBoundStore<import("zustand").StoreApi<WorkletState>>;
84
+ /**
85
+ * Get cached credentials for a wallet identifier
86
+ * Returns null if not cached or expired
87
+ * Updates access time for LRU tracking
88
+ */
89
+ export declare function getCachedCredentials(identifier: string): CachedCredentials | null;
90
+ /**
91
+ * Set cached credentials for a wallet identifier
92
+ * Evicts LRU entries if cache size limit is reached
93
+ * Logs cache size for monitoring
94
+ */
95
+ export declare function setCachedCredentials(identifier: string, credentials: Partial<CachedCredentials>): void;
96
+ /**
97
+ * Clear credentials cache for a specific wallet or all wallets
98
+ * Also clears access tracking
99
+ */
100
+ export declare function clearCredentialsCache(identifier?: string): void;
101
+ /**
102
+ * Clear all sensitive data from memory (active wallet credentials + cache)
103
+ * This should be called when sensitive data is no longer needed
104
+ * to minimize exposure in memory dumps or debugging
105
+ *
106
+ * Note: In JavaScript, we cannot overwrite memory. Setting to null and clearing
107
+ * references allows garbage collection, but the old values may remain in memory
108
+ * until GC runs. This is a JavaScript limitation.
109
+ */
110
+ export declare function clearAllSensitiveData(): void;
111
+ /**
112
+ * Reset the worklet store instance (useful for testing)
113
+ * Also resets access tracking
114
+ */
115
+ export declare function resetWorkletStore(): void;
116
+ /**
117
+ * Get current credentials cache size
118
+ * Useful for monitoring and debugging
119
+ */
120
+ export declare function getCredentialsCacheSize(): number;
121
+ export {};
@@ -0,0 +1,256 @@
1
+ /**
2
+ * Worklet Store - Source of Truth for Worklet Lifecycle
3
+ *
4
+ * This store manages worklet lifecycle state (initialization, configuration, runtime instances).
5
+ *
6
+ * ## Store Boundaries
7
+ *
8
+ * **workletStore** (this file):
9
+ * - Worklet lifecycle state (isWorkletStarted, isInitialized, isLoading)
10
+ * - Worklet runtime instances (worklet, hrpc, ipc)
11
+ * - Worklet configuration (networkConfigs)
12
+ * - Worklet initialization results (workletStartResult, wdkInitResult)
13
+ * - Encrypted credentials in memory (encryptedSeed, encryptionKey) - for active wallet
14
+ * - Multi-wallet credential cache (credentialsCache) - for multiple wallets
15
+ *
16
+ * **walletStore** (walletStore.ts):
17
+ * - Wallet data (addresses, balances)
18
+ * - Wallet loading states
19
+ * - Balance loading states
20
+ * - Last balance update timestamps
21
+ *
22
+ * ## Separation of Concerns
23
+ *
24
+ * - **workletStore**: Manages the worklet runtime and its lifecycle
25
+ * - **walletStore**: Manages wallet data derived from the worklet
26
+ *
27
+ * These stores are intentionally separate to:
28
+ * 1. Prevent cross-contamination of lifecycle and data concerns
29
+ * 2. Allow independent persistence strategies
30
+ * 3. Enable clear boundaries for testing and debugging
31
+ *
32
+ * ## Important Notes
33
+ *
34
+ * - NEVER store wallet data (addresses, balances) in workletStore
35
+ * - NEVER store worklet lifecycle state in walletStore
36
+ * - All worklet state is runtime-only - state resets completely on app restart
37
+ * - Worklets must be recreated when the app restarts
38
+ * - Encrypted credentials are runtime-only (loaded from secure storage when needed)
39
+ * - All operations are handled by WorkletLifecycleService, not the store itself
40
+ */
41
+ // External packages
42
+ import { create } from 'zustand';
43
+ import { devtools } from 'zustand/middleware';
44
+ import { log } from '../utils/logger';
45
+ /**
46
+ * Maximum number of credentials to cache before evicting least recently used
47
+ * This prevents unbounded memory growth while maintaining performance
48
+ * Recommended: 10-20 wallets for typical use cases
49
+ *
50
+ * Cache Management:
51
+ * - Size Limit: When cache exceeds MAX_CREDENTIALS_CACHE_SIZE, LRU entries are evicted
52
+ * - TTL (Time To Live): Each credential has an expiration timestamp (default: 5 minutes)
53
+ * - Automatic Expiration: Expired credentials are removed on access
54
+ * - LRU Eviction: Least recently used credentials are evicted when size limit is reached
55
+ *
56
+ * These safeguards ensure:
57
+ * 1. Memory usage remains bounded
58
+ * 2. Credentials don't persist indefinitely in memory
59
+ * 3. Frequently used wallets remain cached for better UX
60
+ */
61
+ const MAX_CREDENTIALS_CACHE_SIZE = 15;
62
+ /**
63
+ * Access tracking for LRU eviction
64
+ * Tracks when each credential was last accessed
65
+ */
66
+ const credentialsAccessOrder = new Map();
67
+ let credentialsAccessCounter = 0;
68
+ const initialState = {
69
+ worklet: null,
70
+ hrpc: null,
71
+ ipc: null,
72
+ isWorkletStarted: false,
73
+ isInitialized: false,
74
+ isLoading: false,
75
+ error: null,
76
+ encryptedSeed: null,
77
+ encryptionKey: null,
78
+ networkConfigs: null,
79
+ workletStartResult: null,
80
+ wdkInitResult: null,
81
+ credentialsCache: {},
82
+ credentialsCacheTTL: 5 * 60 * 1000, // 5 minutes
83
+ };
84
+ let workletStoreInstance = null;
85
+ /**
86
+ * Creates singleton worklet store instance.
87
+ *
88
+ * This store is runtime-only - all state resets on app restart.
89
+ * All operations are handled by WorkletLifecycleService, not the store itself.
90
+ */
91
+ export function createWorkletStore() {
92
+ if (workletStoreInstance) {
93
+ return workletStoreInstance;
94
+ }
95
+ const store = create()(devtools(() => ({
96
+ ...initialState,
97
+ }), { name: 'WorkletStore' }));
98
+ workletStoreInstance = store;
99
+ return store;
100
+ }
101
+ export function getWorkletStore() {
102
+ return createWorkletStore();
103
+ }
104
+ /**
105
+ * Evict least recently used credentials from cache when limit is reached
106
+ * Logs eviction for monitoring
107
+ */
108
+ function evictLRUCredentials() {
109
+ const store = getWorkletStore();
110
+ const state = store.getState();
111
+ const cacheSize = Object.keys(state.credentialsCache).length;
112
+ if (cacheSize < MAX_CREDENTIALS_CACHE_SIZE) {
113
+ return;
114
+ }
115
+ // Find the least recently used credential
116
+ let oldestIdentifier = null;
117
+ let oldestAccess = Infinity;
118
+ for (const [identifier, accessTime] of credentialsAccessOrder.entries()) {
119
+ if (accessTime < oldestAccess && state.credentialsCache[identifier]) {
120
+ oldestAccess = accessTime;
121
+ oldestIdentifier = identifier;
122
+ }
123
+ }
124
+ // Remove the least recently used credential
125
+ if (oldestIdentifier !== null) {
126
+ const { [oldestIdentifier]: _, ...rest } = state.credentialsCache;
127
+ credentialsAccessOrder.delete(oldestIdentifier);
128
+ store.setState({ credentialsCache: rest });
129
+ log(`[WorkletStore] Evicted LRU credentials cache entry: ${oldestIdentifier} (cache size: ${cacheSize}/${MAX_CREDENTIALS_CACHE_SIZE})`);
130
+ }
131
+ }
132
+ /**
133
+ * Log cache size if it exceeds warning threshold (50% of max)
134
+ * Useful for monitoring cache growth in production
135
+ */
136
+ function logCacheSizeIfNeeded(cacheSize) {
137
+ const warningThreshold = Math.ceil(MAX_CREDENTIALS_CACHE_SIZE * 0.5);
138
+ if (cacheSize >= warningThreshold) {
139
+ log(`[WorkletStore] Credentials cache size: ${cacheSize}/${MAX_CREDENTIALS_CACHE_SIZE} (${Math.round(cacheSize / MAX_CREDENTIALS_CACHE_SIZE * 100)}% full)`);
140
+ }
141
+ }
142
+ /**
143
+ * Get cached credentials for a wallet identifier
144
+ * Returns null if not cached or expired
145
+ * Updates access time for LRU tracking
146
+ */
147
+ export function getCachedCredentials(identifier) {
148
+ const store = getWorkletStore();
149
+ const state = store.getState();
150
+ const cached = state.credentialsCache[identifier];
151
+ if (!cached)
152
+ return null;
153
+ // Check expiration
154
+ if (Date.now() > cached.expiresAt) {
155
+ // Remove expired entry
156
+ const { [identifier]: _, ...rest } = state.credentialsCache;
157
+ credentialsAccessOrder.delete(identifier);
158
+ store.setState({
159
+ credentialsCache: rest,
160
+ });
161
+ return null;
162
+ }
163
+ // Update access time for LRU tracking
164
+ credentialsAccessCounter++;
165
+ credentialsAccessOrder.set(identifier, credentialsAccessCounter);
166
+ return cached;
167
+ }
168
+ /**
169
+ * Set cached credentials for a wallet identifier
170
+ * Evicts LRU entries if cache size limit is reached
171
+ * Logs cache size for monitoring
172
+ */
173
+ export function setCachedCredentials(identifier, credentials) {
174
+ const store = getWorkletStore();
175
+ const state = store.getState();
176
+ const existing = state.credentialsCache[identifier] || {};
177
+ // Evict LRU credentials if needed before adding new entry
178
+ // Check if we're adding a new entry (not just updating existing)
179
+ const isNewEntry = !state.credentialsCache[identifier];
180
+ if (isNewEntry) {
181
+ evictLRUCredentials();
182
+ }
183
+ // Update access time for LRU tracking
184
+ credentialsAccessCounter++;
185
+ credentialsAccessOrder.set(identifier, credentialsAccessCounter);
186
+ store.setState({
187
+ credentialsCache: {
188
+ ...state.credentialsCache,
189
+ [identifier]: {
190
+ ...existing,
191
+ ...credentials,
192
+ expiresAt: Date.now() + state.credentialsCacheTTL,
193
+ }
194
+ }
195
+ });
196
+ // Log cache size for monitoring (after state update)
197
+ const newCacheSize = Object.keys(store.getState().credentialsCache).length;
198
+ logCacheSizeIfNeeded(newCacheSize);
199
+ }
200
+ /**
201
+ * Clear credentials cache for a specific wallet or all wallets
202
+ * Also clears access tracking
203
+ */
204
+ export function clearCredentialsCache(identifier) {
205
+ const store = getWorkletStore();
206
+ const state = store.getState();
207
+ if (identifier) {
208
+ // Clear specific wallet
209
+ const { [identifier]: _, ...rest } = state.credentialsCache;
210
+ credentialsAccessOrder.delete(identifier);
211
+ store.setState({ credentialsCache: rest });
212
+ }
213
+ else {
214
+ // Clear all
215
+ credentialsAccessOrder.clear();
216
+ credentialsAccessCounter = 0;
217
+ store.setState({ credentialsCache: {} });
218
+ }
219
+ }
220
+ /**
221
+ * Clear all sensitive data from memory (active wallet credentials + cache)
222
+ * This should be called when sensitive data is no longer needed
223
+ * to minimize exposure in memory dumps or debugging
224
+ *
225
+ * Note: In JavaScript, we cannot overwrite memory. Setting to null and clearing
226
+ * references allows garbage collection, but the old values may remain in memory
227
+ * until GC runs. This is a JavaScript limitation.
228
+ */
229
+ export function clearAllSensitiveData() {
230
+ const store = getWorkletStore();
231
+ credentialsAccessOrder.clear();
232
+ credentialsAccessCounter = 0;
233
+ store.setState({
234
+ encryptedSeed: null,
235
+ encryptionKey: null,
236
+ credentialsCache: {},
237
+ });
238
+ }
239
+ /**
240
+ * Reset the worklet store instance (useful for testing)
241
+ * Also resets access tracking
242
+ */
243
+ export function resetWorkletStore() {
244
+ credentialsAccessOrder.clear();
245
+ credentialsAccessCounter = 0;
246
+ workletStoreInstance = null;
247
+ }
248
+ /**
249
+ * Get current credentials cache size
250
+ * Useful for monitoring and debugging
251
+ */
252
+ export function getCredentialsCacheSize() {
253
+ const store = getWorkletStore();
254
+ return Object.keys(store.getState().credentialsCache).length;
255
+ }
256
+ //# sourceMappingURL=workletStore.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workletStore.js","sourceRoot":"","sources":["../../src/store/workletStore.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * HRPC Type Extensions
3
+ *
4
+ * Type definitions for HRPC methods that may not be in the @spacesops/pear-wrk-wdk types yet.
5
+ * These types extend the HRPC interface to provide proper type safety.
6
+ */
7
+ import type { HRPC } from '@spacesops/pear-wrk-wdk';
8
+ /**
9
+ * Extended HRPC interface with additional methods
10
+ */
11
+ export interface ExtendedHRPC extends HRPC {
12
+ /**
13
+ * Initialize WDK with encrypted seed
14
+ */
15
+ initializeWDK: (options: {
16
+ encryptionKey: string;
17
+ encryptedSeed: string;
18
+ config: string;
19
+ }) => Promise<{
20
+ status?: string | null;
21
+ }>;
22
+ /**
23
+ * Generate entropy and encrypt it
24
+ */
25
+ generateEntropyAndEncrypt: (options: {
26
+ wordCount: number;
27
+ }) => Promise<{
28
+ encryptionKey: string;
29
+ encryptedSeedBuffer: string;
30
+ encryptedEntropyBuffer: string;
31
+ }>;
32
+ /**
33
+ * Get mnemonic from encrypted entropy
34
+ */
35
+ getMnemonicFromEntropy: (options: {
36
+ encryptedEntropy: string;
37
+ encryptionKey: string;
38
+ }) => Promise<{
39
+ mnemonic: string;
40
+ }>;
41
+ /**
42
+ * Get seed and entropy from mnemonic phrase
43
+ */
44
+ getSeedAndEntropyFromMnemonic: (options: {
45
+ mnemonic: string;
46
+ }) => Promise<{
47
+ encryptionKey: string;
48
+ encryptedSeedBuffer: string;
49
+ encryptedEntropyBuffer: string;
50
+ }>;
51
+ }
52
+ /**
53
+ * Type guard to check if HRPC instance has extended methods
54
+ */
55
+ export declare function isExtendedHRPC(hrpc: HRPC): hrpc is ExtendedHRPC;
56
+ /**
57
+ * Safely cast HRPC to ExtendedHRPC
58
+ * Throws if the HRPC instance doesn't have the required methods
59
+ */
60
+ export declare function asExtendedHRPC(hrpc: HRPC): ExtendedHRPC;
@@ -0,0 +1,26 @@
1
+ /**
2
+ * HRPC Type Extensions
3
+ *
4
+ * Type definitions for HRPC methods that may not be in the @spacesops/pear-wrk-wdk types yet.
5
+ * These types extend the HRPC interface to provide proper type safety.
6
+ */
7
+ /**
8
+ * Type guard to check if HRPC instance has extended methods
9
+ */
10
+ export function isExtendedHRPC(hrpc) {
11
+ return (typeof hrpc.initializeWDK === 'function' &&
12
+ typeof hrpc.generateEntropyAndEncrypt === 'function' &&
13
+ typeof hrpc.getMnemonicFromEntropy === 'function' &&
14
+ typeof hrpc.getSeedAndEntropyFromMnemonic === 'function');
15
+ }
16
+ /**
17
+ * Safely cast HRPC to ExtendedHRPC
18
+ * Throws if the HRPC instance doesn't have the required methods
19
+ */
20
+ export function asExtendedHRPC(hrpc) {
21
+ if (!isExtendedHRPC(hrpc)) {
22
+ throw new Error('HRPC instance does not have required extended methods');
23
+ }
24
+ return hrpc;
25
+ }
26
+ //# sourceMappingURL=hrpc.js.map