@cofhe/sdk 0.0.0-alpha-20260409113701

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 (132) hide show
  1. package/CHANGELOG.md +146 -0
  2. package/adapters/ethers5.test.ts +174 -0
  3. package/adapters/ethers5.ts +36 -0
  4. package/adapters/ethers6.test.ts +169 -0
  5. package/adapters/ethers6.ts +36 -0
  6. package/adapters/hardhat-node.ts +167 -0
  7. package/adapters/hardhat.hh2.test.ts +159 -0
  8. package/adapters/hardhat.ts +36 -0
  9. package/adapters/index.test.ts +20 -0
  10. package/adapters/index.ts +5 -0
  11. package/adapters/smartWallet.ts +99 -0
  12. package/adapters/test-utils.ts +53 -0
  13. package/adapters/types.ts +6 -0
  14. package/adapters/wagmi.test.ts +156 -0
  15. package/adapters/wagmi.ts +17 -0
  16. package/chains/chains/arbSepolia.ts +14 -0
  17. package/chains/chains/baseSepolia.ts +14 -0
  18. package/chains/chains/hardhat.ts +15 -0
  19. package/chains/chains/localcofhe.ts +14 -0
  20. package/chains/chains/sepolia.ts +14 -0
  21. package/chains/chains.test.ts +50 -0
  22. package/chains/defineChain.ts +18 -0
  23. package/chains/index.ts +35 -0
  24. package/chains/types.ts +32 -0
  25. package/core/baseBuilder.ts +119 -0
  26. package/core/client.test.ts +429 -0
  27. package/core/client.ts +341 -0
  28. package/core/clientTypes.ts +119 -0
  29. package/core/config.test.ts +242 -0
  30. package/core/config.ts +225 -0
  31. package/core/consts.ts +22 -0
  32. package/core/decrypt/MockThresholdNetworkAbi.ts +179 -0
  33. package/core/decrypt/cofheMocksDecryptForTx.ts +84 -0
  34. package/core/decrypt/cofheMocksDecryptForView.ts +48 -0
  35. package/core/decrypt/decryptForTxBuilder.ts +359 -0
  36. package/core/decrypt/decryptForViewBuilder.ts +332 -0
  37. package/core/decrypt/decryptUtils.ts +28 -0
  38. package/core/decrypt/pollCallbacks.test.ts +194 -0
  39. package/core/decrypt/polling.ts +14 -0
  40. package/core/decrypt/tnDecryptUtils.ts +65 -0
  41. package/core/decrypt/tnDecryptV1.ts +171 -0
  42. package/core/decrypt/tnDecryptV2.ts +365 -0
  43. package/core/decrypt/tnSealOutputV1.ts +59 -0
  44. package/core/decrypt/tnSealOutputV2.ts +324 -0
  45. package/core/decrypt/verifyDecryptResult.ts +52 -0
  46. package/core/encrypt/MockZkVerifierAbi.ts +106 -0
  47. package/core/encrypt/cofheMocksZkVerifySign.ts +281 -0
  48. package/core/encrypt/encryptInputsBuilder.test.ts +747 -0
  49. package/core/encrypt/encryptInputsBuilder.ts +583 -0
  50. package/core/encrypt/encryptUtils.ts +67 -0
  51. package/core/encrypt/zkPackProveVerify.ts +335 -0
  52. package/core/error.ts +168 -0
  53. package/core/fetchKeys.test.ts +195 -0
  54. package/core/fetchKeys.ts +144 -0
  55. package/core/index.ts +106 -0
  56. package/core/keyStore.test.ts +226 -0
  57. package/core/keyStore.ts +154 -0
  58. package/core/permits.test.ts +493 -0
  59. package/core/permits.ts +201 -0
  60. package/core/types.ts +419 -0
  61. package/core/utils.ts +130 -0
  62. package/dist/adapters.cjs +88 -0
  63. package/dist/adapters.d.cts +14576 -0
  64. package/dist/adapters.d.ts +14576 -0
  65. package/dist/adapters.js +83 -0
  66. package/dist/chains.cjs +111 -0
  67. package/dist/chains.d.cts +121 -0
  68. package/dist/chains.d.ts +121 -0
  69. package/dist/chains.js +1 -0
  70. package/dist/chunk-36FBWLUS.js +3310 -0
  71. package/dist/chunk-7HLGHV67.js +990 -0
  72. package/dist/chunk-TBLR7NNE.js +102 -0
  73. package/dist/clientTypes-AVSCBet7.d.cts +998 -0
  74. package/dist/clientTypes-flH1ju82.d.ts +998 -0
  75. package/dist/core.cjs +4362 -0
  76. package/dist/core.d.cts +138 -0
  77. package/dist/core.d.ts +138 -0
  78. package/dist/core.js +3 -0
  79. package/dist/node.cjs +4225 -0
  80. package/dist/node.d.cts +22 -0
  81. package/dist/node.d.ts +22 -0
  82. package/dist/node.js +91 -0
  83. package/dist/permit-jRirYqFt.d.cts +376 -0
  84. package/dist/permit-jRirYqFt.d.ts +376 -0
  85. package/dist/permits.cjs +1025 -0
  86. package/dist/permits.d.cts +353 -0
  87. package/dist/permits.d.ts +353 -0
  88. package/dist/permits.js +1 -0
  89. package/dist/types-YiAC4gig.d.cts +33 -0
  90. package/dist/types-YiAC4gig.d.ts +33 -0
  91. package/dist/web.cjs +4434 -0
  92. package/dist/web.d.cts +42 -0
  93. package/dist/web.d.ts +42 -0
  94. package/dist/web.js +256 -0
  95. package/dist/zkProve.worker.cjs +93 -0
  96. package/dist/zkProve.worker.d.cts +2 -0
  97. package/dist/zkProve.worker.d.ts +2 -0
  98. package/dist/zkProve.worker.js +91 -0
  99. package/node/client.test.ts +159 -0
  100. package/node/config.test.ts +68 -0
  101. package/node/encryptInputs.test.ts +155 -0
  102. package/node/index.ts +97 -0
  103. package/node/storage.ts +51 -0
  104. package/package.json +121 -0
  105. package/permits/index.ts +68 -0
  106. package/permits/localstorage.test.ts +113 -0
  107. package/permits/onchain-utils.ts +221 -0
  108. package/permits/permit.test.ts +534 -0
  109. package/permits/permit.ts +386 -0
  110. package/permits/sealing.test.ts +84 -0
  111. package/permits/sealing.ts +131 -0
  112. package/permits/signature.ts +79 -0
  113. package/permits/store.test.ts +88 -0
  114. package/permits/store.ts +156 -0
  115. package/permits/test-utils.ts +28 -0
  116. package/permits/types.ts +204 -0
  117. package/permits/utils.ts +58 -0
  118. package/permits/validation.test.ts +361 -0
  119. package/permits/validation.ts +327 -0
  120. package/web/client.web.test.ts +159 -0
  121. package/web/config.web.test.ts +69 -0
  122. package/web/const.ts +2 -0
  123. package/web/encryptInputs.web.test.ts +172 -0
  124. package/web/index.ts +166 -0
  125. package/web/storage.ts +49 -0
  126. package/web/worker.builder.web.test.ts +148 -0
  127. package/web/worker.config.web.test.ts +329 -0
  128. package/web/worker.output.web.test.ts +84 -0
  129. package/web/workerManager.test.ts +80 -0
  130. package/web/workerManager.ts +214 -0
  131. package/web/workerManager.web.test.ts +114 -0
  132. package/web/zkProve.worker.ts +133 -0
@@ -0,0 +1,429 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { createCofheClientBase } from './client.js';
3
+ import { type CofheClient, type CofheClientConnectionState } from './clientTypes.js';
4
+ import { createCofheConfigBase, type CofheEnvironment } from './config.js';
5
+ import { CofheError, CofheErrorCode } from './error.js';
6
+ import { type PublicClient, type WalletClient } from 'viem';
7
+ import { EncryptInputsBuilder } from './encrypt/encryptInputsBuilder.js';
8
+ import { Encryptable } from './types.js';
9
+
10
+ // Mock dependencies
11
+ vi.mock('./keyStore', () => ({
12
+ createKeysStore: vi.fn(() => ({
13
+ rehydrateKeysStore: vi.fn().mockResolvedValue(undefined),
14
+ getFheKey: vi.fn(),
15
+ getCrs: vi.fn(),
16
+ setFheKey: vi.fn(),
17
+ setCrs: vi.fn(),
18
+ clearKeysStorage: vi.fn(),
19
+ store: {} as any,
20
+ })),
21
+ }));
22
+
23
+ // Test helpers
24
+ const createMockPublicClient = (chainId = 11155111): PublicClient =>
25
+ ({
26
+ getChainId: vi.fn().mockResolvedValue(chainId),
27
+ }) as any;
28
+
29
+ const createMockWalletClient = (addresses = ['0x1234567890123456789012345678901234567890']): WalletClient =>
30
+ ({
31
+ getAddresses: vi.fn().mockResolvedValue(addresses),
32
+ }) as any;
33
+
34
+ const createTestClient = (): CofheClient => {
35
+ const config = createCofheConfigBase({ supportedChains: [] });
36
+ return createCofheClientBase({
37
+ config,
38
+ zkBuilderAndCrsGenerator: {} as any,
39
+ tfhePublicKeyDeserializer: {} as any,
40
+ compactPkeCrsDeserializer: {} as any,
41
+ initTfhe: () => Promise.resolve(false),
42
+ });
43
+ };
44
+
45
+ describe('createCofheClientBase', () => {
46
+ let client: CofheClient;
47
+
48
+ beforeEach(() => {
49
+ client = createTestClient();
50
+ });
51
+
52
+ describe('initial state', () => {
53
+ it('should start disconnected', () => {
54
+ const snapshot = client.getSnapshot();
55
+ expect(snapshot.connected).toBe(false);
56
+ expect(snapshot.connecting).toBe(false);
57
+ expect(snapshot.connectError).toBe(undefined);
58
+ expect(snapshot.chainId).toBe(undefined);
59
+ expect(snapshot.account).toBe(undefined);
60
+ expect(snapshot.publicClient).toBe(undefined);
61
+ expect(snapshot.walletClient).toBe(undefined);
62
+
63
+ const connection = client.connection;
64
+ expect(connection).toEqual(snapshot);
65
+ });
66
+
67
+ it('should expose convenience flags', () => {
68
+ expect(client.connected).toBe(false);
69
+ expect(client.connecting).toBe(false);
70
+ expect(client.connection.connected).toBe(false);
71
+ });
72
+
73
+ it('should expose config', () => {
74
+ expect(client.config).toBeDefined();
75
+ expect(client.config.supportedChains).toEqual([]);
76
+ });
77
+ });
78
+
79
+ describe('environment', () => {
80
+ it('should create a client with the correct environment', async () => {
81
+ const environments: CofheEnvironment[] = ['node', 'hardhat', 'web', 'react'];
82
+ for (const environment of environments) {
83
+ const config = createCofheConfigBase({ environment, supportedChains: [] });
84
+ const client = createCofheClientBase({
85
+ config,
86
+ zkBuilderAndCrsGenerator: {} as any,
87
+ tfhePublicKeyDeserializer: {} as any,
88
+ compactPkeCrsDeserializer: {} as any,
89
+ initTfhe: () => Promise.resolve(false),
90
+ });
91
+
92
+ expect(client.config.environment).toBe(environment);
93
+ }
94
+ });
95
+ });
96
+
97
+ describe('reactive state', () => {
98
+ it('should notify subscribers of state changes', async () => {
99
+ const states: CofheClientConnectionState[] = [];
100
+ client.subscribe((snapshot) => states.push(snapshot));
101
+
102
+ const publicClient = createMockPublicClient();
103
+ const walletClient = createMockWalletClient();
104
+ await client.connect(publicClient, walletClient);
105
+
106
+ // Expect states[0] to be the connecting state
107
+ expect(states[0].connecting).toBe(true);
108
+ expect(states[0].connected).toBe(false);
109
+ expect(states[0].chainId).toBe(undefined);
110
+ expect(states[0].account).toBe(undefined);
111
+ expect(states[0].publicClient).toBe(undefined);
112
+ expect(states[0].walletClient).toBe(undefined);
113
+
114
+ // Expect states[1] to be the connected state
115
+ expect(states[1].connected).toBe(true);
116
+ expect(states[1].connecting).toBe(false);
117
+ expect(states[1].chainId).toBe(11155111);
118
+ expect(states[1].account).toBe('0x1234567890123456789012345678901234567890');
119
+ expect(states[1].publicClient).toBe(publicClient);
120
+ expect(states[1].walletClient).toBe(walletClient);
121
+ });
122
+
123
+ it('should stop notifications after unsubscribe', async () => {
124
+ const states: CofheClientConnectionState[] = [];
125
+ const unsubscribe = client.subscribe((snapshot) => states.push(snapshot));
126
+
127
+ unsubscribe();
128
+
129
+ const publicClient = createMockPublicClient();
130
+ const walletClient = createMockWalletClient();
131
+ await client.connect(publicClient, walletClient);
132
+
133
+ // Should only have the initial notification
134
+ expect(states.length).toBe(0);
135
+ });
136
+ });
137
+
138
+ describe('connect', () => {
139
+ it('should successfully connect with valid clients', async () => {
140
+ const publicClient = createMockPublicClient(11155111);
141
+ const walletClient = createMockWalletClient(['0xabcd']);
142
+
143
+ await client.connect(publicClient, walletClient);
144
+
145
+ expect(client.connected).toBe(true);
146
+ expect(client.connecting).toBe(false);
147
+
148
+ const connection = client.connection;
149
+ expect(connection.chainId).toBe(11155111);
150
+ expect(connection.account).toBe('0xabcd');
151
+ expect(connection.publicClient).toBe(publicClient);
152
+ expect(connection.walletClient).toBe(walletClient);
153
+ });
154
+
155
+ it('should set connecting state during connection', async () => {
156
+ const publicClient = createMockPublicClient();
157
+ const walletClient = createMockWalletClient();
158
+
159
+ const connectPromise = client.connect(publicClient, walletClient);
160
+
161
+ // Check mid-connection state
162
+ expect(client.connecting).toBe(true);
163
+ expect(client.connected).toBe(false);
164
+
165
+ await connectPromise;
166
+
167
+ expect(client.connecting).toBe(false);
168
+ expect(client.connected).toBe(true);
169
+ });
170
+
171
+ it('should return existing promise if already connecting', async () => {
172
+ const publicClient = createMockPublicClient();
173
+ const walletClient = createMockWalletClient();
174
+
175
+ const promise1 = client.connect(publicClient, walletClient);
176
+ const promise2 = client.connect(publicClient, walletClient);
177
+
178
+ expect(promise1).toStrictEqual(promise2);
179
+
180
+ await promise1;
181
+ });
182
+
183
+ it('should ensure the latest connection attempt wins when connecting twice', async () => {
184
+ let resolveChainId1: (value: number) => void;
185
+ let resolveAddresses1: (value: string[]) => void;
186
+ let resolveChainId2: (value: number) => void;
187
+ let resolveAddresses2: (value: string[]) => void;
188
+
189
+ const chainIdPromise1 = new Promise<number>((resolve) => {
190
+ resolveChainId1 = resolve;
191
+ });
192
+ const addressesPromise1 = new Promise<string[]>((resolve) => {
193
+ resolveAddresses1 = resolve;
194
+ });
195
+
196
+ const chainIdPromise2 = new Promise<number>((resolve) => {
197
+ resolveChainId2 = resolve;
198
+ });
199
+ const addressesPromise2 = new Promise<string[]>((resolve) => {
200
+ resolveAddresses2 = resolve;
201
+ });
202
+
203
+ const publicClient1 = createMockPublicClient() as any;
204
+ publicClient1.getChainId = vi.fn().mockReturnValue(chainIdPromise1);
205
+ const walletClient1 = createMockWalletClient() as any;
206
+ walletClient1.getAddresses = vi.fn().mockReturnValue(addressesPromise1);
207
+
208
+ const publicClient2 = createMockPublicClient() as any;
209
+ publicClient2.getChainId = vi.fn().mockReturnValue(chainIdPromise2);
210
+ const walletClient2 = createMockWalletClient() as any;
211
+ walletClient2.getAddresses = vi.fn().mockReturnValue(addressesPromise2);
212
+
213
+ const promise1 = client.connect(publicClient1, walletClient1);
214
+ expect(client.connecting).toBe(true);
215
+
216
+ const promise2 = client.connect(publicClient2, walletClient2);
217
+
218
+ // Resolve the second connect first
219
+ resolveChainId2!(222);
220
+ resolveAddresses2!(['0x2222222222222222222222222222222222222222']);
221
+ await promise2;
222
+
223
+ expect(client.connected).toBe(true);
224
+ expect(client.connecting).toBe(false);
225
+ expect(client.connection.chainId).toBe(222);
226
+ expect(client.connection.account).toBe('0x2222222222222222222222222222222222222222');
227
+ expect(client.connection.publicClient).toBe(publicClient2);
228
+ expect(client.connection.walletClient).toBe(walletClient2);
229
+
230
+ // Now resolve the first connect; it must not overwrite the latest state.
231
+ resolveChainId1!(111);
232
+ resolveAddresses1!(['0x1111111111111111111111111111111111111111']);
233
+ await promise1;
234
+
235
+ expect(client.connection.chainId).toBe(222);
236
+ expect(client.connection.account).toBe('0x2222222222222222222222222222222222222222');
237
+ expect(client.connection.publicClient).toBe(publicClient2);
238
+ expect(client.connection.walletClient).toBe(walletClient2);
239
+ });
240
+
241
+ it('should allow disconnect while connecting and never end up connected afterwards', async () => {
242
+ let resolveChainId: (value: number) => void;
243
+ let resolveAddresses: (value: string[]) => void;
244
+
245
+ const chainIdPromise = new Promise<number>((resolve) => {
246
+ resolveChainId = resolve;
247
+ });
248
+ const addressesPromise = new Promise<string[]>((resolve) => {
249
+ resolveAddresses = resolve;
250
+ });
251
+
252
+ const publicClient = createMockPublicClient() as any;
253
+ publicClient.getChainId = vi.fn().mockReturnValue(chainIdPromise);
254
+
255
+ const walletClient = createMockWalletClient() as any;
256
+ walletClient.getAddresses = vi.fn().mockReturnValue(addressesPromise);
257
+
258
+ const connectPromise = client.connect(publicClient, walletClient);
259
+ expect(client.connecting).toBe(true);
260
+
261
+ client.disconnect();
262
+ expect(client.connected).toBe(false);
263
+ expect(client.connecting).toBe(false);
264
+
265
+ resolveChainId!(11155111);
266
+ resolveAddresses!(['0x1234567890123456789012345678901234567890']);
267
+
268
+ await connectPromise;
269
+
270
+ expect(client.connected).toBe(false);
271
+ expect(client.connecting).toBe(false);
272
+ });
273
+
274
+ it('should handle publicClient.getChainId throwing an error', async () => {
275
+ const publicClient = createMockPublicClient();
276
+ const getChainIdError = new Error('Network error');
277
+ publicClient.getChainId = vi.fn().mockRejectedValue(getChainIdError);
278
+ const walletClient = createMockWalletClient();
279
+
280
+ try {
281
+ await client.connect(publicClient, walletClient);
282
+ } catch (error) {
283
+ expect(error).toBeInstanceOf(CofheError);
284
+ expect((error as CofheError).code).toBe(CofheErrorCode.PublicWalletGetChainIdFailed);
285
+ expect((error as CofheError).message).toBe(
286
+ 'getting chain ID from public client failed | Caused by: Network error'
287
+ );
288
+ expect((error as CofheError).cause).toBe(getChainIdError);
289
+ }
290
+ });
291
+
292
+ it('should handle publicClient.getChainId returning null', async () => {
293
+ const publicClient = createMockPublicClient();
294
+ publicClient.getChainId = vi.fn().mockResolvedValue(null);
295
+ const walletClient = createMockWalletClient();
296
+
297
+ const connectPromise = client.connect(publicClient, walletClient);
298
+
299
+ try {
300
+ await connectPromise;
301
+ } catch (error) {
302
+ expect(error).toBeInstanceOf(CofheError);
303
+ expect((error as CofheError).code).toBe(CofheErrorCode.PublicWalletGetChainIdFailed);
304
+ expect((error as CofheError).message).toBe('chain ID from public client is null');
305
+ }
306
+ });
307
+
308
+ it('should handle walletClient.getAddresses throwing an error', async () => {
309
+ const publicClient = createMockPublicClient();
310
+ const getAddressesError = new Error('Network error');
311
+ const walletClient = createMockWalletClient();
312
+ walletClient.getAddresses = vi.fn().mockRejectedValue(getAddressesError);
313
+
314
+ const connectPromise = client.connect(publicClient, walletClient);
315
+
316
+ try {
317
+ await connectPromise;
318
+ } catch (error) {
319
+ expect(error).toBeInstanceOf(CofheError);
320
+ expect((error as CofheError).code).toBe(CofheErrorCode.PublicWalletGetAddressesFailed);
321
+ expect((error as CofheError).message).toBe(
322
+ 'getting address from wallet client failed | Caused by: Network error'
323
+ );
324
+ expect((error as CofheError).cause).toBe(getAddressesError);
325
+ }
326
+ });
327
+
328
+ it('should handle walletClient.getAddresses returning an empty array', async () => {
329
+ const publicClient = createMockPublicClient();
330
+ const walletClient = createMockWalletClient([]);
331
+
332
+ const connectPromise = client.connect(publicClient, walletClient);
333
+
334
+ try {
335
+ await connectPromise;
336
+ } catch (error) {
337
+ expect(error).toBeInstanceOf(CofheError);
338
+ expect((error as CofheError).code).toBe(CofheErrorCode.PublicWalletGetAddressesFailed);
339
+ expect((error as CofheError).message).toBe('address from wallet client is null');
340
+ }
341
+ });
342
+
343
+ it('should store error in state on failure', async () => {
344
+ const publicClient = createMockPublicClient();
345
+ const getChainIdError = new Error('Network error');
346
+ publicClient.getChainId = vi.fn().mockRejectedValue(getChainIdError);
347
+ const walletClient = createMockWalletClient();
348
+
349
+ const connectPromise = client.connect(publicClient, walletClient);
350
+
351
+ try {
352
+ await connectPromise;
353
+ } catch (error) {
354
+ expect(error).toBeInstanceOf(CofheError);
355
+ expect((error as CofheError).code).toBe(CofheErrorCode.PublicWalletGetChainIdFailed);
356
+ expect((error as CofheError).message).toBe(
357
+ 'getting chain ID from public client failed | Caused by: Network error'
358
+ );
359
+ expect((error as CofheError).cause).toBe(getChainIdError);
360
+ }
361
+ });
362
+
363
+ it('should disconnect and clear connection state', async () => {
364
+ const publicClient = createMockPublicClient(11155111);
365
+ const walletClient = createMockWalletClient(['0xabcd']);
366
+
367
+ await client.connect(publicClient, walletClient);
368
+ expect(client.connected).toBe(true);
369
+
370
+ client.disconnect();
371
+
372
+ expect(client.connected).toBe(false);
373
+ expect(client.connecting).toBe(false);
374
+
375
+ expect(client.connection.chainId).toBe(undefined);
376
+ expect(client.connection.account).toBe(undefined);
377
+ expect(client.connection.publicClient).toBe(undefined);
378
+ expect(client.connection.walletClient).toBe(undefined);
379
+ expect(client.connection.connectError).toBe(undefined);
380
+ });
381
+ });
382
+
383
+ describe('encryptInputs', () => {
384
+ it('should throw if not connected', async () => {
385
+ try {
386
+ await client.encryptInputs([Encryptable.uint8(1n), Encryptable.uint8(2n), Encryptable.uint8(3n)]).execute();
387
+ } catch (error) {
388
+ expect(error).toBeInstanceOf(CofheError);
389
+ expect((error as CofheError).code).toBe(CofheErrorCode.NotConnected);
390
+ }
391
+ });
392
+
393
+ it('should create EncryptInputsBuilder when connected', async () => {
394
+ const publicClient = createMockPublicClient(123);
395
+ const walletClient = createMockWalletClient(['0xtest']);
396
+
397
+ await client.connect(publicClient, walletClient);
398
+
399
+ const builder = await client.encryptInputs([Encryptable.uint8(1n), Encryptable.uint8(2n), Encryptable.uint8(3n)]);
400
+
401
+ expect(builder).toBeDefined();
402
+ expect(builder).toBeInstanceOf(EncryptInputsBuilder);
403
+ expect(builder).toHaveProperty('execute');
404
+ expect(builder.getChainId()).toBe(123);
405
+ expect(builder.getAccount()).toBe('0xtest');
406
+ });
407
+ });
408
+
409
+ describe('permits', () => {
410
+ it('should expose permits', () => {
411
+ expect(client.permits).toBeDefined();
412
+ expect(client.permits).toHaveProperty('getSnapshot');
413
+ expect(client.permits).toHaveProperty('subscribe');
414
+ expect(client.permits).toHaveProperty('createSelf');
415
+ expect(client.permits).toHaveProperty('createSharing');
416
+ expect(client.permits).toHaveProperty('importShared');
417
+ expect(client.permits).toHaveProperty('getHash');
418
+ expect(client.permits).toHaveProperty('serialize');
419
+ expect(client.permits).toHaveProperty('deserialize');
420
+ expect(client.permits).toHaveProperty('getPermit');
421
+ expect(client.permits).toHaveProperty('getPermits');
422
+ expect(client.permits).toHaveProperty('getActivePermit');
423
+ expect(client.permits).toHaveProperty('getActivePermitHash');
424
+ expect(client.permits).toHaveProperty('removePermit');
425
+ expect(client.permits).toHaveProperty('selectActivePermit');
426
+ expect(client.permits).toHaveProperty('removeActivePermit');
427
+ });
428
+ });
429
+ });