@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.
- package/README.md +551 -0
- package/dist/__mocks__/react.d.ts +40 -0
- package/dist/__mocks__/react.js +33 -0
- package/dist/__mocks__/react.js.map +1 -0
- package/dist/__mocks__/secureStorage.d.ts +26 -0
- package/dist/__mocks__/secureStorage.js +80 -0
- package/dist/__mocks__/secureStorage.js.map +1 -0
- package/dist/__tests__/hooks/useBalance.test.d.ts +6 -0
- package/dist/__tests__/hooks/useBalance.test.js +217 -0
- package/dist/__tests__/hooks/useBalance.test.js.map +1 -0
- package/dist/__tests__/hooks/useWallet.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWallet.test.js +105 -0
- package/dist/__tests__/hooks/useWallet.test.js.map +1 -0
- package/dist/__tests__/hooks/useWalletManager.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWalletManager.test.js +193 -0
- package/dist/__tests__/hooks/useWalletManager.test.js.map +1 -0
- package/dist/__tests__/hooks/useWdkApp.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWdkApp.test.js +55 -0
- package/dist/__tests__/hooks/useWdkApp.test.js.map +1 -0
- package/dist/__tests__/hooks/useWorklet.test.d.ts +6 -0
- package/dist/__tests__/hooks/useWorklet.test.js +168 -0
- package/dist/__tests__/hooks/useWorklet.test.js.map +1 -0
- package/dist/__tests__/provider/WdkAppProvider.test.d.ts +6 -0
- package/dist/__tests__/provider/WdkAppProvider.test.js +57 -0
- package/dist/__tests__/provider/WdkAppProvider.test.js.map +1 -0
- package/dist/__tests__/services/accountService.test.d.ts +6 -0
- package/dist/__tests__/services/accountService.test.js +216 -0
- package/dist/__tests__/services/accountService.test.js.map +1 -0
- package/dist/__tests__/services/addressService.test.d.ts +6 -0
- package/dist/__tests__/services/addressService.test.js +246 -0
- package/dist/__tests__/services/addressService.test.js.map +1 -0
- package/dist/__tests__/services/balanceService.test.d.ts +6 -0
- package/dist/__tests__/services/balanceService.test.js +333 -0
- package/dist/__tests__/services/balanceService.test.js.map +1 -0
- package/dist/__tests__/services/walletSetupService.test.d.ts +6 -0
- package/dist/__tests__/services/walletSetupService.test.js +304 -0
- package/dist/__tests__/services/walletSetupService.test.js.map +1 -0
- package/dist/__tests__/services/walletSwitchingService.test.d.ts +6 -0
- package/dist/__tests__/services/walletSwitchingService.test.js +209 -0
- package/dist/__tests__/services/walletSwitchingService.test.js.map +1 -0
- package/dist/__tests__/services/workletLifecycleService.test.d.ts +6 -0
- package/dist/__tests__/services/workletLifecycleService.test.js +451 -0
- package/dist/__tests__/services/workletLifecycleService.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +7 -0
- package/dist/__tests__/setup.js +49 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/storage/mmkvStorage.test.d.ts +6 -0
- package/dist/__tests__/storage/mmkvStorage.test.js +213 -0
- package/dist/__tests__/storage/mmkvStorage.test.js.map +1 -0
- package/dist/__tests__/store/walletStore.test.d.ts +4 -0
- package/dist/__tests__/store/walletStore.test.js +86 -0
- package/dist/__tests__/store/walletStore.test.js.map +1 -0
- package/dist/__tests__/store/workletStore.test.d.ts +4 -0
- package/dist/__tests__/store/workletStore.test.js +255 -0
- package/dist/__tests__/store/workletStore.test.js.map +1 -0
- package/dist/__tests__/types/hrpc.test.d.ts +4 -0
- package/dist/__tests__/types/hrpc.test.js +99 -0
- package/dist/__tests__/types/hrpc.test.js.map +1 -0
- package/dist/__tests__/utils/balanceUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/balanceUtils.test.js +133 -0
- package/dist/__tests__/utils/balanceUtils.test.js.map +1 -0
- package/dist/__tests__/utils/errorHandling.test.d.ts +6 -0
- package/dist/__tests__/utils/errorHandling.test.js +119 -0
- package/dist/__tests__/utils/errorHandling.test.js.map +1 -0
- package/dist/__tests__/utils/errorUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/errorUtils.test.js +133 -0
- package/dist/__tests__/utils/errorUtils.test.js.map +1 -0
- package/dist/__tests__/utils/initializationState.test.d.ts +6 -0
- package/dist/__tests__/utils/initializationState.test.js +243 -0
- package/dist/__tests__/utils/initializationState.test.js.map +1 -0
- package/dist/__tests__/utils/jsonUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/jsonUtils.test.js +118 -0
- package/dist/__tests__/utils/jsonUtils.test.js.map +1 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.d.ts +6 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.js +158 -0
- package/dist/__tests__/utils/mmkvKeyManager.test.js.map +1 -0
- package/dist/__tests__/utils/mnemonicUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/mnemonicUtils.test.js +40 -0
- package/dist/__tests__/utils/mnemonicUtils.test.js.map +1 -0
- package/dist/__tests__/utils/raceConditions.test.d.ts +6 -0
- package/dist/__tests__/utils/raceConditions.test.js +239 -0
- package/dist/__tests__/utils/raceConditions.test.js.map +1 -0
- package/dist/__tests__/utils/result.test.d.ts +4 -0
- package/dist/__tests__/utils/result.test.js +66 -0
- package/dist/__tests__/utils/result.test.js.map +1 -0
- package/dist/__tests__/utils/schemas.test.d.ts +4 -0
- package/dist/__tests__/utils/schemas.test.js +66 -0
- package/dist/__tests__/utils/schemas.test.js.map +1 -0
- package/dist/__tests__/utils/storeHelpers.test.d.ts +4 -0
- package/dist/__tests__/utils/storeHelpers.test.js +227 -0
- package/dist/__tests__/utils/storeHelpers.test.js.map +1 -0
- package/dist/__tests__/utils/typeGuards.test.d.ts +4 -0
- package/dist/__tests__/utils/typeGuards.test.js +175 -0
- package/dist/__tests__/utils/typeGuards.test.js.map +1 -0
- package/dist/__tests__/utils/validation.test.d.ts +4 -0
- package/dist/__tests__/utils/validation.test.js +126 -0
- package/dist/__tests__/utils/validation.test.js.map +1 -0
- package/dist/__tests__/utils/walletUtils.test.d.ts +4 -0
- package/dist/__tests__/utils/walletUtils.test.js +156 -0
- package/dist/__tests__/utils/walletUtils.test.js.map +1 -0
- package/dist/hooks/useBalance.d.ts +170 -0
- package/dist/hooks/useBalance.js +442 -0
- package/dist/hooks/useBalance.js.map +1 -0
- package/dist/hooks/useWallet.d.ts +43 -0
- package/dist/hooks/useWallet.js +193 -0
- package/dist/hooks/useWallet.js.map +1 -0
- package/dist/hooks/useWalletManager.d.ts +100 -0
- package/dist/hooks/useWalletManager.js +526 -0
- package/dist/hooks/useWalletManager.js.map +1 -0
- package/dist/hooks/useWdkApp.d.ts +66 -0
- package/dist/hooks/useWdkApp.js +74 -0
- package/dist/hooks/useWdkApp.js.map +1 -0
- package/dist/hooks/useWorklet.d.ts +66 -0
- package/dist/hooks/useWorklet.js +42 -0
- package/dist/hooks/useWorklet.js.map +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.js +36 -0
- package/dist/index.js.map +1 -0
- package/dist/provider/WdkAppProvider.d.ts +112 -0
- package/dist/provider/WdkAppProvider.js +558 -0
- package/dist/provider/WdkAppProvider.js.map +1 -0
- package/dist/services/accountService.d.ts +52 -0
- package/dist/services/accountService.js +119 -0
- package/dist/services/accountService.js.map +1 -0
- package/dist/services/addressService.d.ts +22 -0
- package/dist/services/addressService.js +110 -0
- package/dist/services/addressService.js.map +1 -0
- package/dist/services/balanceService.d.ts +114 -0
- package/dist/services/balanceService.js +208 -0
- package/dist/services/balanceService.js.map +1 -0
- package/dist/services/walletSetupService.d.ts +217 -0
- package/dist/services/walletSetupService.js +535 -0
- package/dist/services/walletSetupService.js.map +1 -0
- package/dist/services/walletSwitchingService.d.ts +48 -0
- package/dist/services/walletSwitchingService.js +143 -0
- package/dist/services/walletSwitchingService.js.map +1 -0
- package/dist/services/workletLifecycleService.d.ts +117 -0
- package/dist/services/workletLifecycleService.js +433 -0
- package/dist/services/workletLifecycleService.js.map +1 -0
- package/dist/storage/mmkvStorage.d.ts +44 -0
- package/dist/storage/mmkvStorage.js +348 -0
- package/dist/storage/mmkvStorage.js.map +1 -0
- package/dist/store/walletStore.d.ts +130 -0
- package/dist/store/walletStore.js +204 -0
- package/dist/store/walletStore.js.map +1 -0
- package/dist/store/workletStore.d.ts +121 -0
- package/dist/store/workletStore.js +256 -0
- package/dist/store/workletStore.js.map +1 -0
- package/dist/types/hrpc.d.ts +60 -0
- package/dist/types/hrpc.js +26 -0
- package/dist/types/hrpc.js.map +1 -0
- package/dist/types.d.ts +168 -0
- package/dist/types.js +7 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/balanceUtils.d.ts +30 -0
- package/dist/utils/balanceUtils.js +86 -0
- package/dist/utils/balanceUtils.js.map +1 -0
- package/dist/utils/constants.d.ts +66 -0
- package/dist/utils/constants.js +73 -0
- package/dist/utils/constants.js.map +1 -0
- package/dist/utils/errorHandling.d.ts +47 -0
- package/dist/utils/errorHandling.js +54 -0
- package/dist/utils/errorHandling.js.map +1 -0
- package/dist/utils/errorUtils.d.ts +89 -0
- package/dist/utils/errorUtils.js +264 -0
- package/dist/utils/errorUtils.js.map +1 -0
- package/dist/utils/initializationState.d.ts +129 -0
- package/dist/utils/initializationState.js +220 -0
- package/dist/utils/initializationState.js.map +1 -0
- package/dist/utils/jsonUtils.d.ts +21 -0
- package/dist/utils/jsonUtils.js +67 -0
- package/dist/utils/jsonUtils.js.map +1 -0
- package/dist/utils/logger.d.ts +27 -0
- package/dist/utils/logger.js +50 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/mmkvKeyManager.d.ts +57 -0
- package/dist/utils/mmkvKeyManager.js +214 -0
- package/dist/utils/mmkvKeyManager.js.map +1 -0
- package/dist/utils/mnemonicUtils.d.ts +17 -0
- package/dist/utils/mnemonicUtils.js +28 -0
- package/dist/utils/mnemonicUtils.js.map +1 -0
- package/dist/utils/operationMutex.d.ts +69 -0
- package/dist/utils/operationMutex.js +150 -0
- package/dist/utils/operationMutex.js.map +1 -0
- package/dist/utils/result.d.ts +34 -0
- package/dist/utils/result.js +43 -0
- package/dist/utils/result.js.map +1 -0
- package/dist/utils/schemas.d.ts +365 -0
- package/dist/utils/schemas.js +152 -0
- package/dist/utils/schemas.js.map +1 -0
- package/dist/utils/storeHelpers.d.ts +112 -0
- package/dist/utils/storeHelpers.js +198 -0
- package/dist/utils/storeHelpers.js.map +1 -0
- package/dist/utils/typeGuards.d.ts +70 -0
- package/dist/utils/typeGuards.js +95 -0
- package/dist/utils/typeGuards.js.map +1 -0
- package/dist/utils/validation.d.ts +53 -0
- package/dist/utils/validation.js +152 -0
- package/dist/utils/validation.js.map +1 -0
- package/dist/utils/walletStateHelpers.d.ts +62 -0
- package/dist/utils/walletStateHelpers.js +81 -0
- package/dist/utils/walletStateHelpers.js.map +1 -0
- package/dist/utils/walletUtils.d.ts +38 -0
- package/dist/utils/walletUtils.js +87 -0
- package/dist/utils/walletUtils.js.map +1 -0
- package/package.json +79 -0
- package/src/__mocks__/react.ts +34 -0
- package/src/__mocks__/secureStorage.ts +87 -0
- package/src/__tests__/hooks/useBalance.test.ts +286 -0
- package/src/__tests__/hooks/useWallet.test.ts +122 -0
- package/src/__tests__/hooks/useWalletManager.test.ts +271 -0
- package/src/__tests__/hooks/useWdkApp.test.tsx +59 -0
- package/src/__tests__/hooks/useWorklet.test.ts +195 -0
- package/src/__tests__/provider/WdkAppProvider.test.tsx +67 -0
- package/src/__tests__/services/accountService.test.ts +337 -0
- package/src/__tests__/services/addressService.test.ts +312 -0
- package/src/__tests__/services/balanceService.test.ts +411 -0
- package/src/__tests__/services/walletSetupService.test.ts +463 -0
- package/src/__tests__/services/walletSwitchingService.test.ts +258 -0
- package/src/__tests__/services/workletLifecycleService.test.ts +514 -0
- package/src/__tests__/setup.ts +54 -0
- package/src/__tests__/storage/mmkvStorage.test.ts +325 -0
- package/src/__tests__/store/walletStore.test.ts +101 -0
- package/src/__tests__/store/workletStore.test.ts +329 -0
- package/src/__tests__/types/hrpc.test.ts +125 -0
- package/src/__tests__/utils/balanceUtils.test.ts +151 -0
- package/src/__tests__/utils/errorHandling.test.ts +147 -0
- package/src/__tests__/utils/errorUtils.test.ts +170 -0
- package/src/__tests__/utils/initializationState.test.ts +337 -0
- package/src/__tests__/utils/jsonUtils.test.ts +131 -0
- package/src/__tests__/utils/mmkvKeyManager.test.ts +205 -0
- package/src/__tests__/utils/mnemonicUtils.test.ts +48 -0
- package/src/__tests__/utils/raceConditions.test.ts +292 -0
- package/src/__tests__/utils/result.test.ts +73 -0
- package/src/__tests__/utils/schemas.test.ts +82 -0
- package/src/__tests__/utils/storeHelpers.test.ts +323 -0
- package/src/__tests__/utils/typeGuards.test.ts +209 -0
- package/src/__tests__/utils/validation.test.ts +152 -0
- package/src/__tests__/utils/walletUtils.test.ts +195 -0
- package/src/hooks/useBalance.ts +597 -0
- package/src/hooks/useWallet.ts +288 -0
- package/src/hooks/useWalletManager.ts +654 -0
- package/src/hooks/useWdkApp.ts +78 -0
- package/src/hooks/useWorklet.ts +109 -0
- package/src/index.ts +112 -0
- package/src/provider/WdkAppProvider.tsx +764 -0
- package/src/services/accountService.ts +134 -0
- package/src/services/addressService.ts +125 -0
- package/src/services/balanceService.ts +291 -0
- package/src/services/walletSetupService.ts +695 -0
- package/src/services/walletSwitchingService.ts +157 -0
- package/src/services/workletLifecycleService.ts +561 -0
- package/src/storage/mmkvStorage.ts +417 -0
- package/src/store/walletStore.ts +301 -0
- package/src/store/workletStore.ts +340 -0
- package/src/types/hrpc.ts +78 -0
- package/src/types.ts +188 -0
- package/src/utils/balanceUtils.ts +96 -0
- package/src/utils/constants.ts +84 -0
- package/src/utils/errorHandling.md +163 -0
- package/src/utils/errorHandling.ts +61 -0
- package/src/utils/errorUtils.ts +300 -0
- package/src/utils/initializationState.ts +242 -0
- package/src/utils/jsonUtils.ts +75 -0
- package/src/utils/logger.ts +54 -0
- package/src/utils/mmkvKeyManager.ts +256 -0
- package/src/utils/mnemonicUtils.ts +35 -0
- package/src/utils/operationMutex.ts +181 -0
- package/src/utils/result.ts +57 -0
- package/src/utils/schemas.ts +190 -0
- package/src/utils/storeHelpers.ts +236 -0
- package/src/utils/typeGuards.ts +129 -0
- package/src/utils/validation.ts +174 -0
- package/src/utils/walletStateHelpers.ts +104 -0
- package/src/utils/walletUtils.ts +107 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Zod Schemas for Runtime Validation
|
|
3
|
+
*
|
|
4
|
+
* Provides Zod schemas for all WDK types to replace manual if/else type guards.
|
|
5
|
+
* These schemas provide better error messages and are easier to maintain.
|
|
6
|
+
*/
|
|
7
|
+
import { z } from 'zod';
|
|
8
|
+
/**
|
|
9
|
+
* Ethereum address schema (0x followed by 40 hex characters)
|
|
10
|
+
*/
|
|
11
|
+
export const ethereumAddressSchema = z.string().regex(/^0x[a-fA-F0-9]{40}$/, {
|
|
12
|
+
message: 'Must be a valid Ethereum address (0x followed by 40 hex characters)',
|
|
13
|
+
});
|
|
14
|
+
/**
|
|
15
|
+
* Spark address schema (Bech32 format: spark1/sparkt1/sparkrt1 followed by base32 characters)
|
|
16
|
+
*/
|
|
17
|
+
export const sparkAddressSchema = z.string().regex(/^spark(1|t1|rt1|test1)[a-z0-9]+$/, {
|
|
18
|
+
message: 'Must be a valid Spark address (spark1/sparkt1/sparkrt1 followed by base32 characters)',
|
|
19
|
+
}).min(14).max(90);
|
|
20
|
+
/**
|
|
21
|
+
* Address schema (Ethereum or Spark)
|
|
22
|
+
*/
|
|
23
|
+
export const addressSchema = z.union([ethereumAddressSchema, sparkAddressSchema]);
|
|
24
|
+
/**
|
|
25
|
+
* Network configuration schema
|
|
26
|
+
*/
|
|
27
|
+
export const networkConfigSchema = z.object({
|
|
28
|
+
chainId: z.number().int().positive(),
|
|
29
|
+
blockchain: z.string().min(1),
|
|
30
|
+
provider: z.string().min(1).optional(),
|
|
31
|
+
bundlerUrl: z.string().min(1).optional(),
|
|
32
|
+
paymasterUrl: z.string().min(1).optional(),
|
|
33
|
+
paymasterAddress: ethereumAddressSchema.optional(),
|
|
34
|
+
entryPointAddress: ethereumAddressSchema.optional(),
|
|
35
|
+
transferMaxFee: z.number().nonnegative().optional(),
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* Network configurations schema
|
|
39
|
+
*/
|
|
40
|
+
export const networkConfigsSchema = z.record(z.string().regex(/^[a-zA-Z0-9_-]+$/, {
|
|
41
|
+
message: 'Network name must contain only alphanumeric characters, hyphens, and underscores',
|
|
42
|
+
}), networkConfigSchema).refine((configs) => Object.keys(configs).length > 0, {
|
|
43
|
+
message: 'NetworkConfigs must contain at least one network',
|
|
44
|
+
});
|
|
45
|
+
/**
|
|
46
|
+
* Token configuration schema
|
|
47
|
+
*/
|
|
48
|
+
export const tokenConfigSchema = z.object({
|
|
49
|
+
symbol: z.string().min(1),
|
|
50
|
+
name: z.string().min(1),
|
|
51
|
+
decimals: z.number().int().min(0).max(18),
|
|
52
|
+
address: z.union([ethereumAddressSchema, z.null()]),
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Network tokens schema
|
|
56
|
+
*/
|
|
57
|
+
export const networkTokensSchema = z.object({
|
|
58
|
+
native: tokenConfigSchema,
|
|
59
|
+
tokens: z.array(tokenConfigSchema),
|
|
60
|
+
});
|
|
61
|
+
/**
|
|
62
|
+
* Token configurations schema
|
|
63
|
+
*/
|
|
64
|
+
export const tokenConfigsSchema = z.record(z.string().min(1), networkTokensSchema).refine((configs) => Object.keys(configs).length > 0, {
|
|
65
|
+
message: 'TokenConfigs must contain at least one network',
|
|
66
|
+
});
|
|
67
|
+
/**
|
|
68
|
+
* Account index schema
|
|
69
|
+
*/
|
|
70
|
+
export const accountIndexSchema = z.number().int().nonnegative();
|
|
71
|
+
/**
|
|
72
|
+
* Network name schema
|
|
73
|
+
*/
|
|
74
|
+
export const networkNameSchema = z.string().regex(/^[a-zA-Z0-9_-]+$/, {
|
|
75
|
+
message: 'Network name must contain only alphanumeric characters, hyphens, and underscores',
|
|
76
|
+
}).min(1);
|
|
77
|
+
/**
|
|
78
|
+
* Balance string schema (valid number string)
|
|
79
|
+
*/
|
|
80
|
+
export const balanceStringSchema = z.string().regex(/^-?\d+(\.\d+)?$/, {
|
|
81
|
+
message: 'Balance must be a valid number string',
|
|
82
|
+
});
|
|
83
|
+
/**
|
|
84
|
+
* Wallet addresses schema
|
|
85
|
+
* Maps network -> accountIndex -> address
|
|
86
|
+
*/
|
|
87
|
+
export const walletAddressesSchema = z.record(networkNameSchema, z.record(z.string().transform((val) => {
|
|
88
|
+
const num = parseInt(val, 10);
|
|
89
|
+
if (isNaN(num) || num < 0) {
|
|
90
|
+
throw new Error('Account index must be a non-negative integer');
|
|
91
|
+
}
|
|
92
|
+
return num;
|
|
93
|
+
}), addressSchema));
|
|
94
|
+
/**
|
|
95
|
+
* Wallet balances schema
|
|
96
|
+
* Maps network -> accountIndex -> tokenAddress -> balance
|
|
97
|
+
*/
|
|
98
|
+
export const walletBalancesSchema = z.record(networkNameSchema, z.record(z.string().transform((val) => {
|
|
99
|
+
const num = parseInt(val, 10);
|
|
100
|
+
if (isNaN(num) || num < 0) {
|
|
101
|
+
throw new Error('Account index must be a non-negative integer');
|
|
102
|
+
}
|
|
103
|
+
return num;
|
|
104
|
+
}), z.record(z.string(), balanceStringSchema)));
|
|
105
|
+
/**
|
|
106
|
+
* Balance loading states schema
|
|
107
|
+
* Maps "network-accountIndex-tokenAddress" -> boolean
|
|
108
|
+
*/
|
|
109
|
+
export const balanceLoadingStatesSchema = z.record(z.string(), z.boolean());
|
|
110
|
+
/**
|
|
111
|
+
* Balance fetch result schema
|
|
112
|
+
*/
|
|
113
|
+
export const balanceFetchResultSchema = z.object({
|
|
114
|
+
success: z.boolean(),
|
|
115
|
+
network: networkNameSchema,
|
|
116
|
+
accountIndex: accountIndexSchema,
|
|
117
|
+
tokenAddress: z.union([ethereumAddressSchema, z.null()]),
|
|
118
|
+
balance: z.union([balanceStringSchema, z.null()]),
|
|
119
|
+
error: z.string().optional(),
|
|
120
|
+
});
|
|
121
|
+
/**
|
|
122
|
+
* Wallet schema
|
|
123
|
+
*/
|
|
124
|
+
export const walletSchema = z.object({
|
|
125
|
+
accountIndex: accountIndexSchema,
|
|
126
|
+
identifier: z.string().min(1),
|
|
127
|
+
name: z.string().min(1),
|
|
128
|
+
createdAt: z.number().int().nonnegative(),
|
|
129
|
+
updatedAt: z.number().int().nonnegative(),
|
|
130
|
+
});
|
|
131
|
+
/**
|
|
132
|
+
* Worklet response schemas for runtime validation
|
|
133
|
+
*/
|
|
134
|
+
export const workletResponseSchema = z.object({
|
|
135
|
+
result: z.string(),
|
|
136
|
+
error: z.string().optional(),
|
|
137
|
+
});
|
|
138
|
+
/**
|
|
139
|
+
* Balance response schema (numeric string)
|
|
140
|
+
*/
|
|
141
|
+
export const balanceResponseSchema = z.string().regex(/^\d+$/, {
|
|
142
|
+
message: 'Balance must be a numeric string',
|
|
143
|
+
});
|
|
144
|
+
/**
|
|
145
|
+
* Account method response schema (union of possible return types)
|
|
146
|
+
*/
|
|
147
|
+
export const accountMethodResponseSchema = z.union([
|
|
148
|
+
balanceResponseSchema,
|
|
149
|
+
z.string(), // For addresses
|
|
150
|
+
z.object({}).passthrough(), // For other responses (objects)
|
|
151
|
+
]);
|
|
152
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../src/utils/schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store helper utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides common patterns for accessing and validating store state
|
|
5
|
+
* to reduce code duplication across services.
|
|
6
|
+
*/
|
|
7
|
+
import type { HRPC } from '@spacesops/pear-wrk-wdk';
|
|
8
|
+
import { asExtendedHRPC } from '../types/hrpc';
|
|
9
|
+
import type { WalletState } from '../store/walletStore';
|
|
10
|
+
/**
|
|
11
|
+
* Require that worklet is initialized and return HRPC instance
|
|
12
|
+
*
|
|
13
|
+
* @throws Error if worklet is not initialized
|
|
14
|
+
* @returns HRPC instance
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const hrpc = requireInitialized()
|
|
19
|
+
* await hrpc.callMethod(...)
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare function requireInitialized(): HRPC;
|
|
23
|
+
/**
|
|
24
|
+
* Require that worklet is initialized and return extended HRPC instance
|
|
25
|
+
*
|
|
26
|
+
* @throws Error if worklet is not initialized
|
|
27
|
+
* @returns Extended HRPC instance
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* const hrpc = requireExtendedHRPC()
|
|
32
|
+
* await hrpc.initializeWDK(...)
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare function requireExtendedHRPC(): ReturnType<typeof asExtendedHRPC>;
|
|
36
|
+
/**
|
|
37
|
+
* Check if worklet is initialized
|
|
38
|
+
*
|
|
39
|
+
* @returns true if worklet is initialized, false otherwise
|
|
40
|
+
*/
|
|
41
|
+
export declare function isInitialized(): boolean;
|
|
42
|
+
/**
|
|
43
|
+
* Update balance in wallet state (helper for nested state updates)
|
|
44
|
+
*
|
|
45
|
+
* @param prev - Previous wallet state
|
|
46
|
+
* @param walletId - Wallet identifier
|
|
47
|
+
* @param network - Network name
|
|
48
|
+
* @param accountIndex - Account index
|
|
49
|
+
* @param tokenKey - Token key (address or 'native')
|
|
50
|
+
* @param balance - Balance value
|
|
51
|
+
* @returns Partial state update
|
|
52
|
+
*/
|
|
53
|
+
export declare function updateBalanceInState(prev: WalletState, walletId: string, network: string, accountIndex: number, tokenKey: string, balance: string): Partial<WalletState>;
|
|
54
|
+
/**
|
|
55
|
+
* Update address in wallet state (helper for nested state updates)
|
|
56
|
+
*
|
|
57
|
+
* @param prev - Previous wallet state
|
|
58
|
+
* @param walletId - Wallet identifier
|
|
59
|
+
* @param network - Network name
|
|
60
|
+
* @param accountIndex - Account index
|
|
61
|
+
* @param address - Address value
|
|
62
|
+
* @returns Partial state update
|
|
63
|
+
*/
|
|
64
|
+
export declare function updateAddressInState(prev: WalletState, walletId: string, network: string, accountIndex: number, address: string): Partial<WalletState>;
|
|
65
|
+
/**
|
|
66
|
+
* Resolve wallet identifier from parameter or store
|
|
67
|
+
*
|
|
68
|
+
* This helper function standardizes the pattern for resolving walletId across the codebase.
|
|
69
|
+
* It checks the provided walletId parameter first, then falls back to activeWalletId from store,
|
|
70
|
+
* and finally to '__temporary__' if no wallet is active.
|
|
71
|
+
*
|
|
72
|
+
* @param walletId - Optional wallet identifier parameter
|
|
73
|
+
* @returns Resolved wallet identifier (never null)
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* ```typescript
|
|
77
|
+
* const targetWalletId = resolveWalletId(walletId)
|
|
78
|
+
* // Use targetWalletId for operations
|
|
79
|
+
* ```
|
|
80
|
+
*/
|
|
81
|
+
export declare function resolveWalletId(walletId?: string): string;
|
|
82
|
+
/**
|
|
83
|
+
* Safely get nested property from an object
|
|
84
|
+
*
|
|
85
|
+
* @param obj - Object to access
|
|
86
|
+
* @param path - Array of keys representing the path
|
|
87
|
+
* @param defaultValue - Default value if path doesn't exist
|
|
88
|
+
* @returns Value at path or default value
|
|
89
|
+
*
|
|
90
|
+
* @example
|
|
91
|
+
* ```typescript
|
|
92
|
+
* const balance = getNestedState(state.balances, [walletId, network, accountIndex, tokenKey], null)
|
|
93
|
+
* ```
|
|
94
|
+
*/
|
|
95
|
+
export declare function getNestedState<T>(obj: Record<string, unknown>, path: (string | number)[], defaultValue: T): T;
|
|
96
|
+
/**
|
|
97
|
+
* Update nested state structure (generic helper for deep state updates)
|
|
98
|
+
*
|
|
99
|
+
* Creates a new nested object structure with the updated value at the specified path.
|
|
100
|
+
* All intermediate objects are shallow copied to maintain immutability.
|
|
101
|
+
*
|
|
102
|
+
* @param prev - Previous state object
|
|
103
|
+
* @param path - Array of keys representing the path to update
|
|
104
|
+
* @param value - Value to set at the path
|
|
105
|
+
* @returns New state object with updated value
|
|
106
|
+
*
|
|
107
|
+
* @example
|
|
108
|
+
* ```typescript
|
|
109
|
+
* const newState = updateNestedState(prev, ['balances', walletId, network, accountIndex, tokenKey], balance)
|
|
110
|
+
* ```
|
|
111
|
+
*/
|
|
112
|
+
export declare function updateNestedState<T extends Record<string, unknown>>(prev: T, path: (string | number)[], value: unknown): Partial<T>;
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Store helper utilities
|
|
3
|
+
*
|
|
4
|
+
* Provides common patterns for accessing and validating store state
|
|
5
|
+
* to reduce code duplication across services.
|
|
6
|
+
*/
|
|
7
|
+
import { getWorkletStore } from '../store/workletStore';
|
|
8
|
+
import { getWalletStore } from '../store/walletStore';
|
|
9
|
+
import { asExtendedHRPC } from '../types/hrpc';
|
|
10
|
+
/**
|
|
11
|
+
* Require that worklet is initialized and return HRPC instance
|
|
12
|
+
*
|
|
13
|
+
* @throws Error if worklet is not initialized
|
|
14
|
+
* @returns HRPC instance
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const hrpc = requireInitialized()
|
|
19
|
+
* await hrpc.callMethod(...)
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export function requireInitialized() {
|
|
23
|
+
const state = getWorkletStore().getState();
|
|
24
|
+
if (!state.isInitialized || !state.hrpc) {
|
|
25
|
+
throw new Error('WDK not initialized');
|
|
26
|
+
}
|
|
27
|
+
return state.hrpc;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Require that worklet is initialized and return extended HRPC instance
|
|
31
|
+
*
|
|
32
|
+
* @throws Error if worklet is not initialized
|
|
33
|
+
* @returns Extended HRPC instance
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* const hrpc = requireExtendedHRPC()
|
|
38
|
+
* await hrpc.initializeWDK(...)
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
export function requireExtendedHRPC() {
|
|
42
|
+
const hrpc = requireInitialized();
|
|
43
|
+
return asExtendedHRPC(hrpc);
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Check if worklet is initialized
|
|
47
|
+
*
|
|
48
|
+
* @returns true if worklet is initialized, false otherwise
|
|
49
|
+
*/
|
|
50
|
+
export function isInitialized() {
|
|
51
|
+
const state = getWorkletStore().getState();
|
|
52
|
+
return state.isInitialized && state.hrpc !== null;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Update balance in wallet state (helper for nested state updates)
|
|
56
|
+
*
|
|
57
|
+
* @param prev - Previous wallet state
|
|
58
|
+
* @param walletId - Wallet identifier
|
|
59
|
+
* @param network - Network name
|
|
60
|
+
* @param accountIndex - Account index
|
|
61
|
+
* @param tokenKey - Token key (address or 'native')
|
|
62
|
+
* @param balance - Balance value
|
|
63
|
+
* @returns Partial state update
|
|
64
|
+
*/
|
|
65
|
+
export function updateBalanceInState(prev, walletId, network, accountIndex, tokenKey, balance) {
|
|
66
|
+
const walletBalances = prev.balances[walletId] || {};
|
|
67
|
+
const networkBalances = walletBalances[network] || {};
|
|
68
|
+
const accountBalances = networkBalances[accountIndex] || {};
|
|
69
|
+
return {
|
|
70
|
+
balances: {
|
|
71
|
+
...prev.balances,
|
|
72
|
+
[walletId]: {
|
|
73
|
+
...walletBalances,
|
|
74
|
+
[network]: {
|
|
75
|
+
...networkBalances,
|
|
76
|
+
[accountIndex]: {
|
|
77
|
+
...accountBalances,
|
|
78
|
+
[tokenKey]: balance,
|
|
79
|
+
},
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Update address in wallet state (helper for nested state updates)
|
|
87
|
+
*
|
|
88
|
+
* @param prev - Previous wallet state
|
|
89
|
+
* @param walletId - Wallet identifier
|
|
90
|
+
* @param network - Network name
|
|
91
|
+
* @param accountIndex - Account index
|
|
92
|
+
* @param address - Address value
|
|
93
|
+
* @returns Partial state update
|
|
94
|
+
*/
|
|
95
|
+
export function updateAddressInState(prev, walletId, network, accountIndex, address) {
|
|
96
|
+
const walletAddresses = prev.addresses[walletId] || {};
|
|
97
|
+
const networkAddresses = walletAddresses[network] || {};
|
|
98
|
+
return {
|
|
99
|
+
addresses: {
|
|
100
|
+
...prev.addresses,
|
|
101
|
+
[walletId]: {
|
|
102
|
+
...walletAddresses,
|
|
103
|
+
[network]: {
|
|
104
|
+
...networkAddresses,
|
|
105
|
+
[accountIndex]: address,
|
|
106
|
+
},
|
|
107
|
+
},
|
|
108
|
+
},
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Resolve wallet identifier from parameter or store
|
|
113
|
+
*
|
|
114
|
+
* This helper function standardizes the pattern for resolving walletId across the codebase.
|
|
115
|
+
* It checks the provided walletId parameter first, then falls back to activeWalletId from store,
|
|
116
|
+
* and finally to '__temporary__' if no wallet is active.
|
|
117
|
+
*
|
|
118
|
+
* @param walletId - Optional wallet identifier parameter
|
|
119
|
+
* @returns Resolved wallet identifier (never null)
|
|
120
|
+
*
|
|
121
|
+
* @example
|
|
122
|
+
* ```typescript
|
|
123
|
+
* const targetWalletId = resolveWalletId(walletId)
|
|
124
|
+
* // Use targetWalletId for operations
|
|
125
|
+
* ```
|
|
126
|
+
*/
|
|
127
|
+
export function resolveWalletId(walletId) {
|
|
128
|
+
if (walletId) {
|
|
129
|
+
return walletId;
|
|
130
|
+
}
|
|
131
|
+
const walletStore = getWalletStore();
|
|
132
|
+
const activeWalletId = walletStore.getState().activeWalletId;
|
|
133
|
+
return activeWalletId || '__temporary__';
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Safely get nested property from an object
|
|
137
|
+
*
|
|
138
|
+
* @param obj - Object to access
|
|
139
|
+
* @param path - Array of keys representing the path
|
|
140
|
+
* @param defaultValue - Default value if path doesn't exist
|
|
141
|
+
* @returns Value at path or default value
|
|
142
|
+
*
|
|
143
|
+
* @example
|
|
144
|
+
* ```typescript
|
|
145
|
+
* const balance = getNestedState(state.balances, [walletId, network, accountIndex, tokenKey], null)
|
|
146
|
+
* ```
|
|
147
|
+
*/
|
|
148
|
+
export function getNestedState(obj, path, defaultValue) {
|
|
149
|
+
let current = obj;
|
|
150
|
+
for (const key of path) {
|
|
151
|
+
if (current == null || typeof current !== 'object') {
|
|
152
|
+
return defaultValue;
|
|
153
|
+
}
|
|
154
|
+
if (!(key in current)) {
|
|
155
|
+
return defaultValue;
|
|
156
|
+
}
|
|
157
|
+
current = current[key];
|
|
158
|
+
}
|
|
159
|
+
return current ?? defaultValue;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Update nested state structure (generic helper for deep state updates)
|
|
163
|
+
*
|
|
164
|
+
* Creates a new nested object structure with the updated value at the specified path.
|
|
165
|
+
* All intermediate objects are shallow copied to maintain immutability.
|
|
166
|
+
*
|
|
167
|
+
* @param prev - Previous state object
|
|
168
|
+
* @param path - Array of keys representing the path to update
|
|
169
|
+
* @param value - Value to set at the path
|
|
170
|
+
* @returns New state object with updated value
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```typescript
|
|
174
|
+
* const newState = updateNestedState(prev, ['balances', walletId, network, accountIndex, tokenKey], balance)
|
|
175
|
+
* ```
|
|
176
|
+
*/
|
|
177
|
+
export function updateNestedState(prev, path, value) {
|
|
178
|
+
if (path.length === 0) {
|
|
179
|
+
if (typeof value === 'object' && value !== null && !Array.isArray(value)) {
|
|
180
|
+
return { ...prev, ...value };
|
|
181
|
+
}
|
|
182
|
+
return prev;
|
|
183
|
+
}
|
|
184
|
+
const [firstKey, ...restPath] = path;
|
|
185
|
+
const keyString = String(firstKey);
|
|
186
|
+
const currentValue = prev[keyString];
|
|
187
|
+
const currentValueObj = (typeof currentValue === 'object' && currentValue !== null && !Array.isArray(currentValue))
|
|
188
|
+
? currentValue
|
|
189
|
+
: {};
|
|
190
|
+
const updatedValue = restPath.length > 0
|
|
191
|
+
? updateNestedState(currentValueObj, restPath, value)
|
|
192
|
+
: value;
|
|
193
|
+
return {
|
|
194
|
+
...prev,
|
|
195
|
+
[keyString]: updatedValue,
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=storeHelpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"storeHelpers.js","sourceRoot":"","sources":["../../src/utils/storeHelpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Type Guards
|
|
3
|
+
*
|
|
4
|
+
* Provides runtime type checking for critical data paths to ensure type safety
|
|
5
|
+
* beyond TypeScript's compile-time checks.
|
|
6
|
+
*
|
|
7
|
+
* NOTE: These type guards now use Zod schemas internally for validation.
|
|
8
|
+
* They are kept for backward compatibility but may be deprecated in the future.
|
|
9
|
+
*/
|
|
10
|
+
import type { NetworkConfig, NetworkConfigs, TokenConfig, TokenConfigs, WalletAddresses, WalletBalances } from '../types';
|
|
11
|
+
/**
|
|
12
|
+
* Type guard to check if a value is a valid NetworkConfig
|
|
13
|
+
* Uses Zod schema internally for validation
|
|
14
|
+
*/
|
|
15
|
+
export declare function isNetworkConfig(value: unknown): value is NetworkConfig;
|
|
16
|
+
/**
|
|
17
|
+
* Type guard to check if a value is a valid NetworkConfigs
|
|
18
|
+
* Uses Zod schema internally for validation
|
|
19
|
+
*/
|
|
20
|
+
export declare function isNetworkConfigs(value: unknown): value is NetworkConfigs;
|
|
21
|
+
/**
|
|
22
|
+
* Type guard to check if a value is a valid TokenConfig
|
|
23
|
+
* Uses Zod schema internally for validation
|
|
24
|
+
*/
|
|
25
|
+
export declare function isTokenConfig(value: unknown): value is TokenConfig;
|
|
26
|
+
/**
|
|
27
|
+
* Type guard to check if a value is a valid TokenConfigs
|
|
28
|
+
* Uses Zod schema internally for validation
|
|
29
|
+
*/
|
|
30
|
+
export declare function isTokenConfigs(value: unknown): value is TokenConfigs;
|
|
31
|
+
/**
|
|
32
|
+
* Type guard to check if a value is a valid WalletAddresses structure
|
|
33
|
+
* Uses Zod schema internally for validation
|
|
34
|
+
*/
|
|
35
|
+
export declare function isWalletAddresses(value: unknown): value is WalletAddresses;
|
|
36
|
+
/**
|
|
37
|
+
* Type guard to check if a value is a valid WalletBalances structure
|
|
38
|
+
* Uses Zod schema internally for validation
|
|
39
|
+
*/
|
|
40
|
+
export declare function isWalletBalances(value: unknown): value is WalletBalances;
|
|
41
|
+
/**
|
|
42
|
+
* Type guard to check if a value is a valid Ethereum address
|
|
43
|
+
* Uses Zod schema internally for validation
|
|
44
|
+
*/
|
|
45
|
+
export declare function isEthereumAddress(value: unknown): value is string;
|
|
46
|
+
/**
|
|
47
|
+
* Type guard to check if a value is a valid Spark address (Bech32 format)
|
|
48
|
+
* Spark addresses start with "spark1" followed by Bech32-encoded characters
|
|
49
|
+
* Uses Zod schema internally for validation
|
|
50
|
+
*/
|
|
51
|
+
export declare function isSparkAddress(value: unknown): value is string;
|
|
52
|
+
/**
|
|
53
|
+
* Type guard to check if a value is a valid address (Ethereum or Spark format)
|
|
54
|
+
*/
|
|
55
|
+
export declare function isValidAddress(value: unknown): value is string;
|
|
56
|
+
/**
|
|
57
|
+
* Type guard to check if a value is a valid account index
|
|
58
|
+
* Uses Zod schema internally for validation
|
|
59
|
+
*/
|
|
60
|
+
export declare function isValidAccountIndex(value: unknown): value is number;
|
|
61
|
+
/**
|
|
62
|
+
* Type guard to check if a value is a valid network name
|
|
63
|
+
* Uses Zod schema internally for validation
|
|
64
|
+
*/
|
|
65
|
+
export declare function isValidNetworkName(value: unknown): value is string;
|
|
66
|
+
/**
|
|
67
|
+
* Type guard to check if a value is a valid balance string
|
|
68
|
+
* Uses Zod schema internally for validation
|
|
69
|
+
*/
|
|
70
|
+
export declare function isValidBalanceString(value: unknown): value is string;
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime Type Guards
|
|
3
|
+
*
|
|
4
|
+
* Provides runtime type checking for critical data paths to ensure type safety
|
|
5
|
+
* beyond TypeScript's compile-time checks.
|
|
6
|
+
*
|
|
7
|
+
* NOTE: These type guards now use Zod schemas internally for validation.
|
|
8
|
+
* They are kept for backward compatibility but may be deprecated in the future.
|
|
9
|
+
*/
|
|
10
|
+
import { networkConfigSchema, networkConfigsSchema, tokenConfigSchema, tokenConfigsSchema, walletAddressesSchema, walletBalancesSchema, ethereumAddressSchema, sparkAddressSchema, accountIndexSchema, networkNameSchema, balanceStringSchema, } from './schemas';
|
|
11
|
+
/**
|
|
12
|
+
* Type guard to check if a value is a valid NetworkConfig
|
|
13
|
+
* Uses Zod schema internally for validation
|
|
14
|
+
*/
|
|
15
|
+
export function isNetworkConfig(value) {
|
|
16
|
+
return networkConfigSchema.safeParse(value).success;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Type guard to check if a value is a valid NetworkConfigs
|
|
20
|
+
* Uses Zod schema internally for validation
|
|
21
|
+
*/
|
|
22
|
+
export function isNetworkConfigs(value) {
|
|
23
|
+
return networkConfigsSchema.safeParse(value).success;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Type guard to check if a value is a valid TokenConfig
|
|
27
|
+
* Uses Zod schema internally for validation
|
|
28
|
+
*/
|
|
29
|
+
export function isTokenConfig(value) {
|
|
30
|
+
return tokenConfigSchema.safeParse(value).success;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Type guard to check if a value is a valid TokenConfigs
|
|
34
|
+
* Uses Zod schema internally for validation
|
|
35
|
+
*/
|
|
36
|
+
export function isTokenConfigs(value) {
|
|
37
|
+
return tokenConfigsSchema.safeParse(value).success;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Type guard to check if a value is a valid WalletAddresses structure
|
|
41
|
+
* Uses Zod schema internally for validation
|
|
42
|
+
*/
|
|
43
|
+
export function isWalletAddresses(value) {
|
|
44
|
+
return walletAddressesSchema.safeParse(value).success;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Type guard to check if a value is a valid WalletBalances structure
|
|
48
|
+
* Uses Zod schema internally for validation
|
|
49
|
+
*/
|
|
50
|
+
export function isWalletBalances(value) {
|
|
51
|
+
return walletBalancesSchema.safeParse(value).success;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Type guard to check if a value is a valid Ethereum address
|
|
55
|
+
* Uses Zod schema internally for validation
|
|
56
|
+
*/
|
|
57
|
+
export function isEthereumAddress(value) {
|
|
58
|
+
return ethereumAddressSchema.safeParse(value).success;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Type guard to check if a value is a valid Spark address (Bech32 format)
|
|
62
|
+
* Spark addresses start with "spark1" followed by Bech32-encoded characters
|
|
63
|
+
* Uses Zod schema internally for validation
|
|
64
|
+
*/
|
|
65
|
+
export function isSparkAddress(value) {
|
|
66
|
+
return sparkAddressSchema.safeParse(value).success;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Type guard to check if a value is a valid address (Ethereum or Spark format)
|
|
70
|
+
*/
|
|
71
|
+
export function isValidAddress(value) {
|
|
72
|
+
return isEthereumAddress(value) || isSparkAddress(value);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Type guard to check if a value is a valid account index
|
|
76
|
+
* Uses Zod schema internally for validation
|
|
77
|
+
*/
|
|
78
|
+
export function isValidAccountIndex(value) {
|
|
79
|
+
return accountIndexSchema.safeParse(value).success;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Type guard to check if a value is a valid network name
|
|
83
|
+
* Uses Zod schema internally for validation
|
|
84
|
+
*/
|
|
85
|
+
export function isValidNetworkName(value) {
|
|
86
|
+
return networkNameSchema.safeParse(value).success;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Type guard to check if a value is a valid balance string
|
|
90
|
+
* Uses Zod schema internally for validation
|
|
91
|
+
*/
|
|
92
|
+
export function isValidBalanceString(value) {
|
|
93
|
+
return balanceStringSchema.safeParse(value).success;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=typeGuards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"typeGuards.js","sourceRoot":"","sources":["../../src/utils/typeGuards.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,mBAAmB,EACnB,oBAAoB,EACpB,iBAAiB,EACjB,kBAAkB,EAClB,qBAAqB,EACrB,oBAAoB,EACpB,qBAAqB,EACrB,kBAAkB,EAClB,kBAAkB,EAClB,iBAAiB,EACjB,mBAAmB,GACpB,MAAM,WAAW,CAAA;AAUlB;;;GAGG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC5C,OAAO,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACrD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,OAAO,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACvD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,OAAO,oBAAoB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACtD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAc;IAC9C,OAAO,qBAAqB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACvD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACpD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,KAAc;IAC3C,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,cAAc,CAAC,KAAK,CAAC,CAAA;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CAAC,KAAc;IAChD,OAAO,kBAAkB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACpD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,kBAAkB,CAAC,KAAc;IAC/C,OAAO,iBAAiB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAc;IACjD,OAAO,mBAAmB,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAA;AACrD,CAAC"}
|