@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,535 @@
1
+ import { getWorkletStore, getCachedCredentials, setCachedCredentials, clearCredentialsCache as clearWorkletCredentialsCache } from '../store/workletStore';
2
+ import { WorkletLifecycleService } from './workletLifecycleService';
3
+ import { DEFAULT_MNEMONIC_WORD_COUNT } from '../utils/constants';
4
+ import { log, logError } from '../utils/logger';
5
+ /**
6
+ * Wallet setup service
7
+ * Handles creating new wallets and loading existing wallets with biometric authentication
8
+ * Caches credentials in ephemeral memory to avoid repeated biometric prompts
9
+ *
10
+ * ## Biometric Authentication Lifecycle
11
+ *
12
+ * ### When Biometric Authentication is Required
13
+ *
14
+ * 1. **Creating a new wallet** (`createNewWallet`)
15
+ * - Always requires biometric authentication before wallet creation
16
+ * - Ensures only authorized users can create wallets
17
+ * - Credentials are cached after successful authentication
18
+ *
19
+ * 2. **Loading existing wallet** (`loadExistingWallet`)
20
+ * - Requires biometric authentication if credentials are not cached
21
+ * - If credentials are in cache, authentication is skipped (better UX)
22
+ * - Cache is checked first before prompting for biometrics
23
+ *
24
+ * 3. **Importing wallet from mnemonic** (`initializeFromMnemonic`)
25
+ * - Always requires biometric authentication before import
26
+ * - Ensures only authorized users can import wallets
27
+ * - Credentials are cached after successful authentication
28
+ *
29
+ * ### Credential Caching Behavior
30
+ *
31
+ * - **Cache Location**: Ephemeral memory only (Map<string, CachedCredentials>)
32
+ * - Cache is keyed by `identifier` (user email/ID) for multi-wallet support
33
+ * - Cache persists for the lifetime of the app session
34
+ * - Cache is cleared when app is terminated (not persisted to disk)
35
+ *
36
+ * - **Cache Contents**:
37
+ * - `encryptionKey`: Cached after first retrieval (most sensitive, requires biometrics)
38
+ * - `encryptedSeed`: Cached after first retrieval
39
+ * - `encryptedEntropy`: Cached after first retrieval
40
+ *
41
+ * - **Cache Benefits**:
42
+ * - Avoids repeated biometric prompts during the same app session
43
+ * - Improves UX for operations that need credentials multiple times
44
+ * - Reduces security surface (fewer biometric prompts = fewer attack vectors)
45
+ *
46
+ * ### When Cache is Cleared
47
+ *
48
+ * Cache is automatically cleared in the following scenarios:
49
+ *
50
+ * 1. **Explicit cache clearing** (`clearCredentialsCache`)
51
+ * - Called when wallet data is corrupted or invalid
52
+ * - Called during wallet deletion
53
+ * - Can be called manually for security (e.g., on logout)
54
+ *
55
+ * 2. **App termination**
56
+ * - Cache is in-memory only, so it's cleared when app closes
57
+ * - Next app launch will require biometric authentication again
58
+ *
59
+ * 3. **Wallet deletion** (`deleteWallet`)
60
+ * - Cache for the deleted wallet identifier is cleared
61
+ * - Other wallet caches remain intact
62
+ *
63
+ * ### Security Considerations
64
+ *
65
+ * - **Cache Lifetime**: Ephemeral (in-memory only, cleared on app termination)
66
+ * - **Cache Scope**: Per-identifier (multi-wallet support)
67
+ * - **Cache Invalidation**: Manual via `clearCredentialsCache()` or automatic on app termination
68
+ * - **Biometric Prompt Frequency**:
69
+ * - First access per app session: Always required
70
+ * - Subsequent accesses in same session: Cached (no prompt)
71
+ * - After app restart: Always required again
72
+ *
73
+ * ### Best Practices
74
+ *
75
+ * 1. **Clear cache on logout**: Call `clearCredentialsCache(identifier)` when user logs out
76
+ * 2. **Clear cache on errors**: Clear cache if decryption fails (may indicate corrupted data)
77
+ * 3. **Don't persist cache**: Cache is intentionally in-memory only for security
78
+ * 4. **Handle cache misses**: Always handle the case where cache is empty (will prompt for biometrics)
79
+ *
80
+ * ### Example Usage
81
+ *
82
+ * ```typescript
83
+ * // Create new wallet (always requires biometrics)
84
+ * await WalletSetupService.createNewWallet(networkConfigs, walletId)
85
+ *
86
+ * // Load existing wallet (biometrics only if not cached)
87
+ * const credentials = await WalletSetupService.loadExistingWallet(walletId)
88
+ *
89
+ * // Clear cache (e.g., on logout)
90
+ * WalletSetupService.clearCredentialsCache(walletId)
91
+ * ```
92
+ */
93
+ export class WalletSetupService {
94
+ /**
95
+ * Set the secureStorage singleton instance
96
+ * Called by WdkAppProvider during initialization
97
+ * Also exposed publicly for testing purposes
98
+ *
99
+ * @param secureStorage - SecureStorage instance to use
100
+ * @param allowOverwrite - If false, warns when overwriting existing instance (default: true)
101
+ */
102
+ static setSecureStorage(secureStorage, allowOverwrite = true) {
103
+ if (this.secureStorageInstance && !allowOverwrite) {
104
+ log('⚠️ SecureStorage already set. This may indicate multiple WdkAppProviders are mounted.', {
105
+ hasExisting: !!this.secureStorageInstance
106
+ });
107
+ }
108
+ else if (this.secureStorageInstance) {
109
+ log('⚠️ SecureStorage being overwritten. This may indicate multiple WdkAppProviders are mounted.');
110
+ }
111
+ this.secureStorageInstance = secureStorage;
112
+ log('✅ SecureStorage singleton set in WalletSetupService');
113
+ }
114
+ /**
115
+ * Get the secureStorage singleton instance
116
+ * Throws error if not initialized (should only happen if called before WdkAppProvider mounts)
117
+ */
118
+ static getSecureStorage() {
119
+ if (!this.secureStorageInstance) {
120
+ throw new Error('SecureStorage not initialized. Ensure WdkAppProvider is mounted.');
121
+ }
122
+ return this.secureStorageInstance;
123
+ }
124
+ /**
125
+ * Check if secureStorage is initialized
126
+ * Useful for testing or debugging
127
+ */
128
+ static isSecureStorageInitialized() {
129
+ return this.secureStorageInstance !== null;
130
+ }
131
+ /**
132
+ * Get cache key for walletId
133
+ */
134
+ static getCacheKey(walletId) {
135
+ return walletId || 'default';
136
+ }
137
+ /**
138
+ * Cache credentials after retrieval
139
+ */
140
+ static cacheCredentials(walletId, encryptionKey, encryptedSeed, encryptedEntropy) {
141
+ const cacheKey = this.getCacheKey(walletId);
142
+ const existing = getCachedCredentials(cacheKey) || {};
143
+ // Use workletStore functions for all credential caching
144
+ setCachedCredentials(cacheKey, {
145
+ ...existing,
146
+ ...(encryptionKey && { encryptionKey }),
147
+ ...(encryptedSeed && { encryptedSeed }),
148
+ ...(encryptedEntropy && { encryptedEntropy }),
149
+ });
150
+ log('Credentials cached', { hasWalletId: !!walletId });
151
+ }
152
+ /**
153
+ * Generic helper to retrieve a credential value (checks cache first, then secureStorage)
154
+ */
155
+ static async getCredential(walletId, credentialType, fetchFn, cacheKey) {
156
+ const secureStorage = this.getSecureStorage();
157
+ const cacheKeyStr = this.getCacheKey(walletId);
158
+ const cached = getCachedCredentials(cacheKeyStr);
159
+ if (cached?.[cacheKey]) {
160
+ const logMessage = credentialType === 'encryptionKey'
161
+ ? '✅ Encryption key retrieved from cache (no biometrics needed)'
162
+ : `✅ ${credentialType} retrieved from cache`;
163
+ log(logMessage);
164
+ return cached[cacheKey];
165
+ }
166
+ if (credentialType === 'encryptionKey') {
167
+ log('Encryption key not in cache, fetching from secureStorage...');
168
+ }
169
+ const value = await fetchFn(walletId);
170
+ if (value) {
171
+ // Cache it for future use
172
+ if (credentialType === 'encryptionKey') {
173
+ this.cacheCredentials(walletId, value);
174
+ }
175
+ else if (credentialType === 'encryptedSeed') {
176
+ this.cacheCredentials(walletId, undefined, value);
177
+ }
178
+ else {
179
+ this.cacheCredentials(walletId, undefined, undefined, value);
180
+ }
181
+ }
182
+ return value;
183
+ }
184
+ /**
185
+ * Validate that encrypted data can be decrypted with the encryption key
186
+ * Attempts to initialize WDK with the provided credentials to verify compatibility
187
+ *
188
+ * @param networkConfigs - Network configurations for worklet
189
+ * @param encryptionKey - Encryption key to test
190
+ * @param encryptedSeed - Encrypted seed to test
191
+ * @param encryptedEntropy - Optional encrypted entropy to test
192
+ * @throws Error if validation fails (decryption fails)
193
+ */
194
+ static async validateEncryptionCompatibility(networkConfigs, encryptionKey, encryptedSeed, encryptedEntropy) {
195
+ const store = getWorkletStore();
196
+ // Ensure worklet is started
197
+ if (!store.getState().isWorkletStarted) {
198
+ await WorkletLifecycleService.startWorklet(networkConfigs);
199
+ }
200
+ const wasInitialized = store.getState().isInitialized;
201
+ const previousEncryptionKey = store.getState().encryptionKey;
202
+ const previousEncryptedSeed = store.getState().encryptedSeed;
203
+ try {
204
+ // Attempt to initialize WDK with the credentials
205
+ // This will fail if the encryption key cannot decrypt the seed
206
+ await WorkletLifecycleService.initializeWDK({
207
+ encryptionKey,
208
+ encryptedSeed,
209
+ });
210
+ log('✅ Encryption compatibility validation passed');
211
+ }
212
+ catch (error) {
213
+ const errorMessage = error instanceof Error ? error.message : String(error);
214
+ const isDecryptionError = errorMessage.toLowerCase().includes('decryption failed') ||
215
+ errorMessage.toLowerCase().includes('failed to decrypt');
216
+ if (isDecryptionError) {
217
+ log('❌ Encryption compatibility validation failed - decryption error detected');
218
+ throw new Error(`Failed to validate encryption compatibility: The encryption key cannot decrypt the encrypted seed. ` +
219
+ `This indicates corrupted or mismatched wallet data. Error: ${errorMessage}`);
220
+ }
221
+ throw error;
222
+ }
223
+ finally {
224
+ // Restore previous state if wallet was already initialized
225
+ // Only restore if we're not overwriting with the same credentials
226
+ if (wasInitialized &&
227
+ (previousEncryptionKey !== encryptionKey || previousEncryptedSeed !== encryptedSeed)) {
228
+ try {
229
+ if (previousEncryptionKey && previousEncryptedSeed) {
230
+ await WorkletLifecycleService.initializeWDK({
231
+ encryptionKey: previousEncryptionKey,
232
+ encryptedSeed: previousEncryptedSeed,
233
+ });
234
+ }
235
+ else {
236
+ WorkletLifecycleService.reset();
237
+ }
238
+ }
239
+ catch (restoreError) {
240
+ log('⚠️ Failed to restore previous wallet state after validation, resetting', restoreError);
241
+ WorkletLifecycleService.reset();
242
+ }
243
+ }
244
+ }
245
+ }
246
+ /**
247
+ * Create a new wallet
248
+ * Generates entropy, encrypts it, and stores credentials securely
249
+ * Requires biometric authentication to ensure authorized wallet creation
250
+ */
251
+ static async createNewWallet(networkConfigs, walletId) {
252
+ const store = getWorkletStore();
253
+ const secureStorage = this.getSecureStorage();
254
+ // Step 1: Require biometric authentication before creating wallet
255
+ log('🔐 Creating new wallet - biometric authentication required...');
256
+ try {
257
+ const authenticated = await secureStorage.authenticate();
258
+ if (!authenticated) {
259
+ throw new Error('Biometric authentication required to create wallet');
260
+ }
261
+ }
262
+ catch (error) {
263
+ // Re-throw authentication errors so they can be properly handled by the UI
264
+ // This includes AuthenticationError from secure storage
265
+ log('❌ Biometric authentication failed', error);
266
+ throw error;
267
+ }
268
+ // Step 2: Start worklet
269
+ if (!store.getState().isWorkletStarted) {
270
+ await WorkletLifecycleService.startWorklet(networkConfigs);
271
+ }
272
+ // Step 3: Generate entropy and encrypt
273
+ const result = await WorkletLifecycleService.generateEntropyAndEncrypt(DEFAULT_MNEMONIC_WORD_COUNT);
274
+ // Step 4: Validate encryption compatibility before saving to keychain
275
+ log('🔍 Validating encryption compatibility before saving to keychain...');
276
+ try {
277
+ await this.validateEncryptionCompatibility(networkConfigs, result.encryptionKey, result.encryptedSeedBuffer, result.encryptedEntropyBuffer);
278
+ }
279
+ catch (error) {
280
+ log('❌ Encryption validation failed - aborting wallet creation', error);
281
+ // Reset worklet state on validation failure
282
+ WorkletLifecycleService.reset();
283
+ throw error;
284
+ }
285
+ // Step 5: Store credentials securely with walletId for multi-wallet support
286
+ try {
287
+ await secureStorage.setEncryptionKey(result.encryptionKey, walletId);
288
+ await secureStorage.setEncryptedSeed(result.encryptedSeedBuffer, walletId);
289
+ await secureStorage.setEncryptedEntropy(result.encryptedEntropyBuffer, walletId);
290
+ }
291
+ catch (error) {
292
+ // Clean up any partial writes (deleteWallet is idempotent)
293
+ try {
294
+ await secureStorage.deleteWallet(walletId);
295
+ log('[WalletSetupService] Cleaned up partial wallet creation after storage failure');
296
+ }
297
+ catch (cleanupError) {
298
+ logError('[WalletSetupService] Failed to cleanup partial wallet creation:', cleanupError);
299
+ }
300
+ throw error;
301
+ }
302
+ this.cacheCredentials(walletId, result.encryptionKey, result.encryptedSeedBuffer, result.encryptedEntropyBuffer);
303
+ log('✅ New wallet created and stored securely');
304
+ return {
305
+ encryptionKey: result.encryptionKey,
306
+ encryptedSeed: result.encryptedSeedBuffer,
307
+ };
308
+ }
309
+ /**
310
+ * Load existing wallet from secure storage
311
+ * Checks cache first, only requires biometric authentication if not cached
312
+ */
313
+ static async loadExistingWallet(walletId) {
314
+ const secureStorage = this.getSecureStorage();
315
+ const cacheKey = this.getCacheKey(walletId);
316
+ const cached = getCachedCredentials(cacheKey);
317
+ // Check if all required credentials are cached
318
+ if (cached?.encryptionKey && cached?.encryptedSeed) {
319
+ log('✅ Wallet loaded from cache (no biometrics needed)');
320
+ return {
321
+ encryptionKey: cached.encryptionKey,
322
+ encryptedSeed: cached.encryptedSeed,
323
+ };
324
+ }
325
+ log('🔓 Loading existing wallet - biometric authentication required...');
326
+ // Get encrypted seed first (doesn't require biometrics)
327
+ const encryptedSeed = await secureStorage.getEncryptedSeed(walletId);
328
+ // Try to get encryption key from cache first
329
+ let encryptionKey = cached?.encryptionKey;
330
+ // If not in cache, get from secureStorage (will trigger biometrics)
331
+ if (!encryptionKey) {
332
+ log('Encryption key not in cache, fetching from secureStorage...');
333
+ try {
334
+ const allEncrypted = await secureStorage.getAllEncrypted(walletId);
335
+ encryptionKey = allEncrypted.encryptionKey || undefined;
336
+ }
337
+ catch (error) {
338
+ throw error;
339
+ }
340
+ }
341
+ else {
342
+ log('Using cached encryption key (no biometrics needed)');
343
+ }
344
+ if (!encryptionKey) {
345
+ throw new Error('Encryption key not found. Authentication may have failed or wallet does not exist.');
346
+ }
347
+ if (!encryptedSeed) {
348
+ throw new Error('Encrypted seed not found. Authentication may have failed or wallet does not exist.');
349
+ }
350
+ // Cache credentials for future use
351
+ this.cacheCredentials(walletId, encryptionKey, encryptedSeed);
352
+ log('✅ Wallet loaded successfully from secure storage');
353
+ return {
354
+ encryptionKey,
355
+ encryptedSeed,
356
+ };
357
+ }
358
+ /**
359
+ * Check if a wallet exists
360
+ */
361
+ static async hasWallet(walletId) {
362
+ const secureStorage = this.getSecureStorage();
363
+ const result = await secureStorage.hasWallet(walletId);
364
+ return result;
365
+ }
366
+ /**
367
+ * Initialize WDK from an existing mnemonic phrase
368
+ * Converts mnemonic to encrypted seed and entropy, stores them securely, and initializes WDK
369
+ * Requires biometric authentication to ensure authorized wallet import
370
+ */
371
+ static async initializeFromMnemonic(networkConfigs, mnemonic, walletId) {
372
+ const store = getWorkletStore();
373
+ const secureStorage = this.getSecureStorage();
374
+ // Step 1: Require biometric authentication before importing wallet
375
+ log('🔐 Importing wallet from mnemonic - biometric authentication required...');
376
+ try {
377
+ const authenticated = await secureStorage.authenticate();
378
+ if (!authenticated) {
379
+ throw new Error('Biometric authentication required to import wallet');
380
+ }
381
+ }
382
+ catch (error) {
383
+ // Re-throw authentication errors so they can be properly handled by the UI
384
+ // This includes AuthenticationError from secure storage
385
+ log('❌ Biometric authentication failed', error);
386
+ throw error;
387
+ }
388
+ // Step 2: Start worklet
389
+ if (!store.getState().isWorkletStarted) {
390
+ await WorkletLifecycleService.startWorklet(networkConfigs);
391
+ }
392
+ // Step 3: Get seed and entropy from mnemonic
393
+ const result = await WorkletLifecycleService.getSeedAndEntropyFromMnemonic(mnemonic);
394
+ // Step 4: Validate encryption compatibility before saving to keychain
395
+ log('🔍 Validating encryption compatibility before saving to keychain...');
396
+ try {
397
+ await this.validateEncryptionCompatibility(networkConfigs, result.encryptionKey, result.encryptedSeedBuffer, result.encryptedEntropyBuffer);
398
+ }
399
+ catch (error) {
400
+ log('❌ Encryption validation failed - aborting wallet import', error);
401
+ // Reset worklet state on validation failure
402
+ WorkletLifecycleService.reset();
403
+ throw error;
404
+ }
405
+ // Step 5: Store credentials securely with walletId for multi-wallet support
406
+ try {
407
+ await secureStorage.setEncryptionKey(result.encryptionKey, walletId);
408
+ await secureStorage.setEncryptedSeed(result.encryptedSeedBuffer, walletId);
409
+ await secureStorage.setEncryptedEntropy(result.encryptedEntropyBuffer, walletId);
410
+ }
411
+ catch (error) {
412
+ // Clean up any partial writes (deleteWallet is idempotent)
413
+ try {
414
+ await secureStorage.deleteWallet(walletId);
415
+ log('[WalletSetupService] Cleaned up partial wallet import after storage failure');
416
+ }
417
+ catch (cleanupError) {
418
+ logError('[WalletSetupService] Failed to cleanup partial wallet import:', cleanupError);
419
+ }
420
+ throw error;
421
+ }
422
+ this.cacheCredentials(walletId, result.encryptionKey, result.encryptedSeedBuffer, result.encryptedEntropyBuffer);
423
+ // Step 6: Initialize WDK with the credentials
424
+ await WorkletLifecycleService.initializeWDK({
425
+ encryptionKey: result.encryptionKey,
426
+ encryptedSeed: result.encryptedSeedBuffer,
427
+ });
428
+ log('✅ Wallet imported from mnemonic and stored securely');
429
+ return {
430
+ encryptionKey: result.encryptionKey,
431
+ encryptedSeed: result.encryptedSeedBuffer,
432
+ encryptedEntropy: result.encryptedEntropyBuffer,
433
+ };
434
+ }
435
+ /**
436
+ * Initialize WDK with wallet credentials
437
+ */
438
+ static async initializeWDK(networkConfigs, credentials) {
439
+ const store = getWorkletStore();
440
+ // Ensure worklet is started
441
+ if (!store.getState().isWorkletStarted) {
442
+ log('Starting worklet...');
443
+ await WorkletLifecycleService.startWorklet(networkConfigs);
444
+ log('Worklet started');
445
+ }
446
+ // Initialize WDK
447
+ await WorkletLifecycleService.initializeWDK(credentials);
448
+ }
449
+ /**
450
+ * Complete wallet initialization flow
451
+ * Either creates a new wallet or loads an existing one
452
+ */
453
+ static async initializeWallet(networkConfigs, options) {
454
+ // Remove the early return check - WorkletLifecycleService.initializeWDK() will handle
455
+ // checking if credentials match (it already has the correct logic to skip if same credentials)
456
+ let credentials;
457
+ if (options.createNew) {
458
+ credentials = await this.createNewWallet(networkConfigs, options.walletId);
459
+ }
460
+ else {
461
+ credentials = await this.loadExistingWallet(options.walletId);
462
+ }
463
+ // Initialize WDK with credentials
464
+ await this.initializeWDK(networkConfigs, credentials);
465
+ }
466
+ /**
467
+ * Delete wallet and clear all data
468
+ *
469
+ * @param identifier - Optional identifier for multi-wallet support. If provided, deletes wallet for that identifier.
470
+ * If not provided, deletes the default wallet.
471
+ */
472
+ static async deleteWallet(walletId) {
473
+ const secureStorage = this.getSecureStorage();
474
+ // Clear secure storage for the specified walletId
475
+ await secureStorage.deleteWallet(walletId);
476
+ // Reset store state
477
+ WorkletLifecycleService.reset();
478
+ // Clear credentials cache
479
+ this.clearCredentialsCache(walletId);
480
+ }
481
+ /**
482
+ * Get encryption key (checks cache first, then secureStorage with biometrics)
483
+ */
484
+ static async getEncryptionKey(walletId) {
485
+ const secureStorage = this.getSecureStorage();
486
+ return this.getCredential(walletId, 'encryptionKey', async (id) => {
487
+ const allEncrypted = await secureStorage.getAllEncrypted(id);
488
+ return allEncrypted.encryptionKey || null;
489
+ }, 'encryptionKey');
490
+ }
491
+ /**
492
+ * Get encrypted seed (checks cache first, then secureStorage)
493
+ */
494
+ static async getEncryptedSeed(walletId) {
495
+ const secureStorage = this.getSecureStorage();
496
+ return this.getCredential(walletId, 'encryptedSeed', (id) => secureStorage.getEncryptedSeed(id), 'encryptedSeed');
497
+ }
498
+ /**
499
+ * Get encrypted entropy (checks cache first, then secureStorage)
500
+ */
501
+ static async getEncryptedEntropy(walletId) {
502
+ const secureStorage = this.getSecureStorage();
503
+ return this.getCredential(walletId, 'encryptedEntropy', (id) => secureStorage.getEncryptedEntropy(id), 'encryptedEntropy');
504
+ }
505
+ /**
506
+ * Get mnemonic phrase from wallet
507
+ * Retrieves encrypted entropy and encryption key, then decrypts to get mnemonic
508
+ *
509
+ * @param walletId - Optional walletId for multi-wallet support
510
+ * @returns Promise<string | null> - The mnemonic phrase or null if not found
511
+ */
512
+ static async getMnemonic(walletId) {
513
+ const encryptedEntropy = await this.getEncryptedEntropy(walletId);
514
+ const encryptionKey = await this.getEncryptionKey(walletId);
515
+ if (!encryptedEntropy || !encryptionKey) {
516
+ return null;
517
+ }
518
+ const result = await WorkletLifecycleService.getMnemonicFromEntropy(encryptedEntropy, encryptionKey);
519
+ return result.mnemonic || null;
520
+ }
521
+ /**
522
+ * Clear all cached credentials
523
+ * Should be called on logout or app background for security
524
+ */
525
+ static clearCredentialsCache(walletId) {
526
+ clearWorkletCredentialsCache(walletId ? this.getCacheKey(walletId) : undefined);
527
+ log('Credentials cache cleared', { walletId });
528
+ }
529
+ }
530
+ /**
531
+ * SecureStorage singleton instance
532
+ * Set by WdkAppProvider during initialization
533
+ */
534
+ WalletSetupService.secureStorageInstance = null;
535
+ //# sourceMappingURL=walletSetupService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"walletSetupService.js","sourceRoot":"","sources":["../../src/services/walletSetupService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Wallet Switching Service
3
+ *
4
+ * Handles wallet switching operations: checking wallet existence, loading credentials,
5
+ * and initializing WDK with the new wallet.
6
+ *
7
+ * Architecture:
8
+ * - This service is the single source of truth for wallet switching logic
9
+ * - Used by useWallet hook for automatic wallet switching
10
+ * - Can be used by other components that need to switch wallets programmatically
11
+ */
12
+ /**
13
+ * Wallet Switching Service
14
+ *
15
+ * Provides methods for switching between wallets.
16
+ */
17
+ export declare class WalletSwitchingService {
18
+ /**
19
+ * Switch to a wallet by identifier
20
+ *
21
+ * This method:
22
+ * 1. Checks if the wallet exists (fail fast)
23
+ * 2. Ensures worklet is started
24
+ * 3. Loads credentials for the wallet
25
+ * 4. Initializes WDK with the credentials
26
+ * 5. Updates activeWalletId in the store
27
+ *
28
+ * @param walletId - Wallet identifier to switch to
29
+ * @param options - Optional configuration
30
+ * @param options.autoStartWorklet - If true, start worklet if not started (default: false)
31
+ * @throws Error if wallet doesn't exist or switching fails
32
+ *
33
+ * @example
34
+ * ```typescript
35
+ * await WalletSwitchingService.switchToWallet('user@example.com')
36
+ * ```
37
+ */
38
+ static switchToWallet(walletId: string, options?: {
39
+ autoStartWorklet?: boolean;
40
+ }): Promise<void>;
41
+ /**
42
+ * Check if a wallet can be switched to
43
+ *
44
+ * @param walletId - Wallet identifier to check
45
+ * @returns Promise resolving to true if wallet exists and can be switched to
46
+ */
47
+ static canSwitchToWallet(walletId: string): Promise<boolean>;
48
+ }