@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,119 @@
1
+ /**
2
+ * Account Service
3
+ *
4
+ * Handles account method calls through the worklet.
5
+ * This service provides a generic interface for calling account methods
6
+ * like getBalance, getTokenBalance, signMessage, signTransaction, etc.
7
+ */
8
+ import { convertBigIntToString } from '../utils/balanceUtils';
9
+ import { handleServiceError } from '../utils/errorHandling';
10
+ import { safeStringify } from '../utils/jsonUtils';
11
+ import { workletResponseSchema } from '../utils/schemas';
12
+ import { requireInitialized } from '../utils/storeHelpers';
13
+ import { validateAccountIndex, validateNetworkName } from '../utils/validation';
14
+ /**
15
+ * Account Service
16
+ *
17
+ * Provides methods for calling account operations through the worklet.
18
+ */
19
+ export class AccountService {
20
+ /**
21
+ * Call a method on a wallet account
22
+ * Generic method for calling any account method through the worklet
23
+ *
24
+ * The worklet should already have the correct wallet loaded via `initializeWDK`.
25
+ * Wallet switching is handled at the hook level before calling this service.
26
+ *
27
+ * @param network - Network name
28
+ * @param accountIndex - Account index
29
+ * @param methodName - Method name
30
+ * @param args - Optional arguments for the method
31
+ * @param walletId - Optional wallet identifier (for consistency, worklet should already have correct wallet loaded)
32
+ * @returns Promise with the method result
33
+ * @throws Error if validation fails
34
+ *
35
+ * @example
36
+ * ```typescript
37
+ * // Get balance
38
+ * const balance = await AccountService.callAccountMethod('ethereum', 0, 'getBalance', null)
39
+ *
40
+ * // Get token balance
41
+ * const tokenBalance = await AccountService.callAccountMethod(
42
+ * 'ethereum',
43
+ * 0,
44
+ * 'getTokenBalance',
45
+ * '0x...'
46
+ * )
47
+ *
48
+ * // Sign a message
49
+ * const signature = await AccountService.callAccountMethod(
50
+ * 'ethereum',
51
+ * 0,
52
+ * 'signMessage',
53
+ * { message: 'Hello World' }
54
+ * )
55
+ * ```
56
+ */
57
+ static async callAccountMethod(network, accountIndex, methodName, args, walletId) {
58
+ // Validate methodName parameter
59
+ if (typeof methodName !== 'string' || methodName.trim().length === 0) {
60
+ throw new Error('methodName must be a non-empty string');
61
+ }
62
+ // Validate inputs
63
+ validateNetworkName(network);
64
+ validateAccountIndex(accountIndex);
65
+ // Require initialized worklet
66
+ const hrpc = requireInitialized();
67
+ // Validate and sanitize args before stringification
68
+ let argsString = null;
69
+ if (args !== undefined && args !== null) {
70
+ // Validate structure and stringify safely
71
+ argsString = safeStringify(args);
72
+ }
73
+ try {
74
+ const response = await hrpc.callMethod({
75
+ methodName,
76
+ network,
77
+ accountIndex,
78
+ args: argsString,
79
+ });
80
+ // Validate response structure
81
+ const validatedResponse = workletResponseSchema.parse(response);
82
+ if (!validatedResponse.result) {
83
+ throw new Error(`Method ${methodName} returned no result`);
84
+ }
85
+ // Parse the result and handle BigInt values
86
+ let parsed;
87
+ try {
88
+ parsed = JSON.parse(validatedResponse.result);
89
+ // Basic validation: ensure parsed is not null/undefined
90
+ if (parsed === null || parsed === undefined) {
91
+ throw new Error('Parsed result is null or undefined');
92
+ }
93
+ }
94
+ catch (error) {
95
+ if (error instanceof Error && error.message.includes('Parsed result is null')) {
96
+ throw error;
97
+ }
98
+ throw new Error(`Failed to parse result from ${methodName}: ${error instanceof Error ? error.message : String(error)}`);
99
+ }
100
+ // Runtime type validation based on method type
101
+ if (methodName === 'getBalance' || methodName === 'getTokenBalance') {
102
+ // Validate balance format
103
+ if (typeof parsed !== 'string' || !/^\d+$/.test(parsed)) {
104
+ throw new Error(`Invalid balance format: ${parsed}`);
105
+ }
106
+ }
107
+ // Recursively convert BigInt values to strings to prevent serialization errors
108
+ return convertBigIntToString(parsed);
109
+ }
110
+ catch (error) {
111
+ handleServiceError(error, 'AccountService', `callAccountMethod:${methodName}`, {
112
+ network,
113
+ accountIndex,
114
+ methodName,
115
+ });
116
+ }
117
+ }
118
+ }
119
+ //# sourceMappingURL=accountService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"accountService.js","sourceRoot":"","sources":["../../src/services/accountService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Address Service
3
+ *
4
+ * Handles address retrieval and caching operations.
5
+ * This service is focused solely on address management.
6
+ */
7
+ /**
8
+ * Address Service
9
+ *
10
+ * Provides methods for retrieving and caching wallet addresses.
11
+ */
12
+ export declare class AddressService {
13
+ /**
14
+ * Get address for a specific network and account index
15
+ * Caches the address in walletStore for future use
16
+ *
17
+ * @param network - Network name
18
+ * @param accountIndex - Account index (default: 0)
19
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
20
+ */
21
+ static getAddress(network: string, accountIndex?: number, walletId?: string): Promise<string>;
22
+ }
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Address Service
3
+ *
4
+ * Handles address retrieval and caching operations.
5
+ * This service is focused solely on address management.
6
+ */
7
+ import { getWalletStore } from '../store/walletStore';
8
+ import { handleServiceError } from '../utils/errorHandling';
9
+ import { requireInitialized, resolveWalletId, updateAddressInState } from '../utils/storeHelpers';
10
+ import { isValidAddress } from '../utils/typeGuards';
11
+ import { validateAccountIndex, validateNetworkName } from '../utils/validation';
12
+ /**
13
+ * Address Service
14
+ *
15
+ * Provides methods for retrieving and caching wallet addresses.
16
+ */
17
+ export class AddressService {
18
+ /**
19
+ * Get address for a specific network and account index
20
+ * Caches the address in walletStore for future use
21
+ *
22
+ * @param network - Network name
23
+ * @param accountIndex - Account index (default: 0)
24
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
25
+ */
26
+ static async getAddress(network, accountIndex = 0, walletId) {
27
+ // Validate inputs
28
+ validateNetworkName(network);
29
+ validateAccountIndex(accountIndex);
30
+ const walletStore = getWalletStore();
31
+ const walletState = walletStore.getState();
32
+ // Resolve walletId from parameter or store
33
+ const targetWalletId = resolveWalletId(walletId);
34
+ // Check cache first (per-wallet)
35
+ const cachedAddress = walletState.addresses[targetWalletId]?.[network]?.[accountIndex];
36
+ if (cachedAddress) {
37
+ // Validate cached address format
38
+ if (!isValidAddress(cachedAddress)) {
39
+ throw new Error(`Cached address for ${targetWalletId}:${network}:${accountIndex} has invalid format`);
40
+ }
41
+ return cachedAddress;
42
+ }
43
+ // Require initialized worklet
44
+ const hrpc = requireInitialized();
45
+ const loadingKey = `${network}-${accountIndex}`;
46
+ try {
47
+ // Update loading state (per-wallet)
48
+ walletStore.setState((prev) => ({
49
+ walletLoading: {
50
+ ...prev.walletLoading,
51
+ [targetWalletId]: {
52
+ ...(prev.walletLoading[targetWalletId] || {}),
53
+ [loadingKey]: true,
54
+ },
55
+ },
56
+ }));
57
+ // Call getAddress method on the account
58
+ const response = await hrpc.callMethod({
59
+ methodName: 'getAddress',
60
+ network,
61
+ accountIndex,
62
+ args: null,
63
+ });
64
+ if (!response.result) {
65
+ throw new Error('Failed to get address from worklet');
66
+ }
67
+ let address;
68
+ try {
69
+ const parsed = JSON.parse(response.result);
70
+ if (typeof parsed !== 'string') {
71
+ throw new Error('Address must be a string');
72
+ }
73
+ // Runtime validation of address format
74
+ if (!isValidAddress(parsed)) {
75
+ throw new Error(`Address from worklet has invalid format: ${parsed}`);
76
+ }
77
+ address = parsed;
78
+ }
79
+ catch (error) {
80
+ throw new Error(`Failed to parse address from worklet response: ${error instanceof Error ? error.message : String(error)}`);
81
+ }
82
+ // Cache the address using helper (per-wallet)
83
+ walletStore.setState((prev) => ({
84
+ ...updateAddressInState(prev, targetWalletId, network, accountIndex, address),
85
+ walletLoading: {
86
+ ...prev.walletLoading,
87
+ [targetWalletId]: {
88
+ ...(prev.walletLoading[targetWalletId] || {}),
89
+ [loadingKey]: false,
90
+ },
91
+ },
92
+ }));
93
+ return address;
94
+ }
95
+ catch (error) {
96
+ // Update loading state on error (per-wallet)
97
+ walletStore.setState((prev) => ({
98
+ walletLoading: {
99
+ ...prev.walletLoading,
100
+ [targetWalletId]: {
101
+ ...(prev.walletLoading[targetWalletId] || {}),
102
+ [loadingKey]: false,
103
+ },
104
+ },
105
+ }));
106
+ handleServiceError(error, 'AddressService', 'getAddress', { network, accountIndex, walletId: targetWalletId });
107
+ }
108
+ }
109
+ }
110
+ //# sourceMappingURL=addressService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"addressService.js","sourceRoot":"","sources":["../../src/services/addressService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Balance Service
3
+ *
4
+ * Handles balance operations: getting, setting, updating, and managing balance state.
5
+ * This service is focused solely on balance management.
6
+ *
7
+ * ## Storage Strategy - Single Source of Truth
8
+ *
9
+ * This service manages balances in the Zustand store (walletStore.balances), which is
10
+ * the **single source of truth** for all balance data.
11
+ *
12
+ * **Architecture**:
13
+ * - **Zustand Store (Single Source of Truth)**: Stores and persists balances across app restarts (via MMKV)
14
+ * - **TanStack Query (Fetching Layer)**: Handles fetching, caching, and refetching (reads from and updates Zustand)
15
+ *
16
+ * **Data Flow**:
17
+ * 1. TanStack Query reads initial data from Zustand (via `initialData` in useBalance hooks)
18
+ * 2. TanStack Query fetches fresh balance from worklet when needed
19
+ * 3. After successful fetch, TanStack Query updates Zustand via this service (single source of truth update)
20
+ * 4. Components read from TanStack Query, which ensures consistency with Zustand
21
+ *
22
+ * **Sync Guarantees**:
23
+ * - Zustand is always the source of truth - all reads and writes go through Zustand
24
+ * - TanStack Query updates Zustand directly after fetch (no separate sync step)
25
+ * - Initial data consistency - TanStack Query uses Zustand's persisted data on app start
26
+ * - No race conditions - all updates are atomic through Zustand
27
+ *
28
+ * **Usage**:
29
+ * - Direct access: Use `BalanceService.getBalance()` to read from Zustand directly (rare, prefer TanStack Query hooks)
30
+ * - Updates: TanStack Query calls `BalanceService.updateBalance()` after fetch (automatic)
31
+ * - Preferred: Use `useBalance()` hooks which handle Zustand integration automatically
32
+ */
33
+ /**
34
+ * Balance Service
35
+ *
36
+ * Provides methods for managing wallet balances.
37
+ */
38
+ export declare class BalanceService {
39
+ /**
40
+ * Validate wallet parameters and balance (if provided)
41
+ * Helper to reduce repetitive validation calls
42
+ */
43
+ private static validateBalanceParams;
44
+ /**
45
+ * Get token key from token address (native or token address)
46
+ */
47
+ private static getTokenKey;
48
+ /**
49
+ * Update balance for a specific wallet, network, and token
50
+ *
51
+ * @param accountIndex - Account index
52
+ * @param network - Network name
53
+ * @param tokenAddress - Token address (null for native)
54
+ * @param balance - Balance value
55
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
56
+ */
57
+ static updateBalance(accountIndex: number, network: string, tokenAddress: string | null, balance: string, walletId?: string): void;
58
+ /**
59
+ * Get balance for a specific wallet, network, and token
60
+ *
61
+ * @param accountIndex - Account index
62
+ * @param network - Network name
63
+ * @param tokenAddress - Token address (null for native)
64
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
65
+ */
66
+ static getBalance(accountIndex: number, network: string, tokenAddress: string | null, walletId?: string): string | null;
67
+ /**
68
+ * Get all balances for a specific wallet and network
69
+ *
70
+ * @param accountIndex - Account index
71
+ * @param network - Network name
72
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
73
+ */
74
+ static getBalancesForWallet(accountIndex: number, network: string, walletId?: string): Record<string, string> | null;
75
+ /**
76
+ * Set balance loading state
77
+ *
78
+ * @param network - Network name
79
+ * @param accountIndex - Account index
80
+ * @param tokenAddress - Token address (null for native)
81
+ * @param loading - Loading state
82
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
83
+ */
84
+ static setBalanceLoading(network: string, accountIndex: number, tokenAddress: string | null, loading: boolean, walletId?: string): void;
85
+ /**
86
+ * Check if balance is loading
87
+ *
88
+ * @param network - Network name
89
+ * @param accountIndex - Account index
90
+ * @param tokenAddress - Token address (null for native)
91
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
92
+ */
93
+ static isBalanceLoading(network: string, accountIndex: number, tokenAddress: string | null, walletId?: string): boolean;
94
+ /**
95
+ * Update last balance update timestamp
96
+ *
97
+ * @param network - Network name
98
+ * @param accountIndex - Account index
99
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
100
+ */
101
+ static updateLastBalanceUpdate(network: string, accountIndex: number, walletId?: string): void;
102
+ /**
103
+ * Get last balance update timestamp
104
+ *
105
+ * @param network - Network name
106
+ * @param accountIndex - Account index
107
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
108
+ */
109
+ static getLastBalanceUpdate(network: string, accountIndex: number, walletId?: string): number | null;
110
+ /**
111
+ * Clear all balances (useful for wallet reset)
112
+ */
113
+ static clearBalances(): void;
114
+ }
@@ -0,0 +1,208 @@
1
+ /**
2
+ * Balance Service
3
+ *
4
+ * Handles balance operations: getting, setting, updating, and managing balance state.
5
+ * This service is focused solely on balance management.
6
+ *
7
+ * ## Storage Strategy - Single Source of Truth
8
+ *
9
+ * This service manages balances in the Zustand store (walletStore.balances), which is
10
+ * the **single source of truth** for all balance data.
11
+ *
12
+ * **Architecture**:
13
+ * - **Zustand Store (Single Source of Truth)**: Stores and persists balances across app restarts (via MMKV)
14
+ * - **TanStack Query (Fetching Layer)**: Handles fetching, caching, and refetching (reads from and updates Zustand)
15
+ *
16
+ * **Data Flow**:
17
+ * 1. TanStack Query reads initial data from Zustand (via `initialData` in useBalance hooks)
18
+ * 2. TanStack Query fetches fresh balance from worklet when needed
19
+ * 3. After successful fetch, TanStack Query updates Zustand via this service (single source of truth update)
20
+ * 4. Components read from TanStack Query, which ensures consistency with Zustand
21
+ *
22
+ * **Sync Guarantees**:
23
+ * - Zustand is always the source of truth - all reads and writes go through Zustand
24
+ * - TanStack Query updates Zustand directly after fetch (no separate sync step)
25
+ * - Initial data consistency - TanStack Query uses Zustand's persisted data on app start
26
+ * - No race conditions - all updates are atomic through Zustand
27
+ *
28
+ * **Usage**:
29
+ * - Direct access: Use `BalanceService.getBalance()` to read from Zustand directly (rare, prefer TanStack Query hooks)
30
+ * - Updates: TanStack Query calls `BalanceService.updateBalance()` after fetch (automatic)
31
+ * - Preferred: Use `useBalance()` hooks which handle Zustand integration automatically
32
+ */
33
+ import { getWalletStore } from '../store/walletStore';
34
+ import { resolveWalletId, updateBalanceInState, getNestedState } from '../utils/storeHelpers';
35
+ import { NATIVE_TOKEN_KEY } from '../utils/constants';
36
+ import { validateBalance, validateWalletParams } from '../utils/validation';
37
+ /**
38
+ * Balance Service
39
+ *
40
+ * Provides methods for managing wallet balances.
41
+ */
42
+ export class BalanceService {
43
+ /**
44
+ * Validate wallet parameters and balance (if provided)
45
+ * Helper to reduce repetitive validation calls
46
+ */
47
+ static validateBalanceParams(network, accountIndex, tokenAddress, balance) {
48
+ validateWalletParams(network, accountIndex, tokenAddress);
49
+ if (balance !== undefined) {
50
+ validateBalance(balance);
51
+ }
52
+ }
53
+ /**
54
+ * Get token key from token address (native or token address)
55
+ */
56
+ static getTokenKey(tokenAddress) {
57
+ return tokenAddress || NATIVE_TOKEN_KEY;
58
+ }
59
+ /**
60
+ * Update balance for a specific wallet, network, and token
61
+ *
62
+ * @param accountIndex - Account index
63
+ * @param network - Network name
64
+ * @param tokenAddress - Token address (null for native)
65
+ * @param balance - Balance value
66
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
67
+ */
68
+ static updateBalance(accountIndex, network, tokenAddress, balance, walletId) {
69
+ this.validateBalanceParams(network, accountIndex, tokenAddress, balance);
70
+ const walletStore = getWalletStore();
71
+ const walletState = walletStore.getState();
72
+ const targetWalletId = resolveWalletId(walletId);
73
+ const tokenKey = this.getTokenKey(tokenAddress);
74
+ walletStore.setState((prev) => ({
75
+ ...updateBalanceInState(prev, targetWalletId, network, accountIndex, tokenKey, balance),
76
+ }));
77
+ }
78
+ /**
79
+ * Get balance for a specific wallet, network, and token
80
+ *
81
+ * @param accountIndex - Account index
82
+ * @param network - Network name
83
+ * @param tokenAddress - Token address (null for native)
84
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
85
+ */
86
+ static getBalance(accountIndex, network, tokenAddress, walletId) {
87
+ this.validateBalanceParams(network, accountIndex, tokenAddress);
88
+ const walletStore = getWalletStore();
89
+ const walletState = walletStore.getState();
90
+ const targetWalletId = resolveWalletId(walletId);
91
+ const tokenKey = this.getTokenKey(tokenAddress);
92
+ return getNestedState(walletState.balances, [targetWalletId, network, accountIndex, tokenKey], null);
93
+ }
94
+ /**
95
+ * Get all balances for a specific wallet and network
96
+ *
97
+ * @param accountIndex - Account index
98
+ * @param network - Network name
99
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
100
+ */
101
+ static getBalancesForWallet(accountIndex, network, walletId) {
102
+ // Validate inputs
103
+ validateWalletParams(network, accountIndex);
104
+ const walletStore = getWalletStore();
105
+ const walletState = walletStore.getState();
106
+ const targetWalletId = resolveWalletId(walletId);
107
+ return getNestedState(walletState.balances, [targetWalletId, network, accountIndex], null);
108
+ }
109
+ /**
110
+ * Set balance loading state
111
+ *
112
+ * @param network - Network name
113
+ * @param accountIndex - Account index
114
+ * @param tokenAddress - Token address (null for native)
115
+ * @param loading - Loading state
116
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
117
+ */
118
+ static setBalanceLoading(network, accountIndex, tokenAddress, loading, walletId) {
119
+ this.validateBalanceParams(network, accountIndex, tokenAddress);
120
+ const walletStore = getWalletStore();
121
+ const walletState = walletStore.getState();
122
+ const targetWalletId = resolveWalletId(walletId);
123
+ const tokenKey = this.getTokenKey(tokenAddress);
124
+ const loadingKey = `${network}-${accountIndex}-${tokenKey}`;
125
+ walletStore.setState((prev) => ({
126
+ balanceLoading: {
127
+ ...prev.balanceLoading,
128
+ [targetWalletId]: loading
129
+ ? { ...(prev.balanceLoading[targetWalletId] || {}), [loadingKey]: true }
130
+ : Object.fromEntries(Object.entries(prev.balanceLoading[targetWalletId] || {}).filter(([key]) => key !== loadingKey)),
131
+ },
132
+ }));
133
+ }
134
+ /**
135
+ * Check if balance is loading
136
+ *
137
+ * @param network - Network name
138
+ * @param accountIndex - Account index
139
+ * @param tokenAddress - Token address (null for native)
140
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
141
+ */
142
+ static isBalanceLoading(network, accountIndex, tokenAddress, walletId) {
143
+ this.validateBalanceParams(network, accountIndex, tokenAddress);
144
+ const walletStore = getWalletStore();
145
+ const walletState = walletStore.getState();
146
+ const targetWalletId = walletId || walletState.activeWalletId;
147
+ if (!targetWalletId) {
148
+ return false;
149
+ }
150
+ const tokenKey = this.getTokenKey(tokenAddress);
151
+ const loadingKey = `${network}-${accountIndex}-${tokenKey}`;
152
+ return getNestedState(walletState.balanceLoading, [targetWalletId, loadingKey], false);
153
+ }
154
+ /**
155
+ * Update last balance update timestamp
156
+ *
157
+ * @param network - Network name
158
+ * @param accountIndex - Account index
159
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
160
+ */
161
+ static updateLastBalanceUpdate(network, accountIndex, walletId) {
162
+ // Validate inputs
163
+ validateWalletParams(network, accountIndex);
164
+ const walletStore = getWalletStore();
165
+ const walletState = walletStore.getState();
166
+ const targetWalletId = resolveWalletId(walletId);
167
+ const now = Date.now();
168
+ walletStore.setState((prev) => ({
169
+ lastBalanceUpdate: {
170
+ ...prev.lastBalanceUpdate,
171
+ [targetWalletId]: {
172
+ ...(prev.lastBalanceUpdate[targetWalletId] || {}),
173
+ [network]: {
174
+ ...(prev.lastBalanceUpdate[targetWalletId]?.[network] || {}),
175
+ [accountIndex]: now,
176
+ },
177
+ },
178
+ },
179
+ }));
180
+ }
181
+ /**
182
+ * Get last balance update timestamp
183
+ *
184
+ * @param network - Network name
185
+ * @param accountIndex - Account index
186
+ * @param walletId - Optional wallet identifier (defaults to activeWalletId from store)
187
+ */
188
+ static getLastBalanceUpdate(network, accountIndex, walletId) {
189
+ // Validate inputs
190
+ validateWalletParams(network, accountIndex);
191
+ const walletStore = getWalletStore();
192
+ const walletState = walletStore.getState();
193
+ const targetWalletId = resolveWalletId(walletId);
194
+ return getNestedState(walletState.lastBalanceUpdate, [targetWalletId, network, accountIndex], null);
195
+ }
196
+ /**
197
+ * Clear all balances (useful for wallet reset)
198
+ */
199
+ static clearBalances() {
200
+ const walletStore = getWalletStore();
201
+ walletStore.setState({
202
+ balances: {},
203
+ balanceLoading: {},
204
+ lastBalanceUpdate: {},
205
+ });
206
+ }
207
+ }
208
+ //# sourceMappingURL=balanceService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"balanceService.js","sourceRoot":"","sources":["../../src/services/balanceService.ts"],"names":[],"mappings":"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"}