@walletmesh/aztec-rpc-wallet 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (108) hide show
  1. package/CHANGELOG.md +7 -0
  2. package/LICENSE +201 -0
  3. package/README.md +260 -0
  4. package/dist/.tsbuildinfo +1 -0
  5. package/dist/aztecRemoteWallet.d.ts +73 -0
  6. package/dist/aztecRemoteWallet.d.ts.map +1 -0
  7. package/dist/aztecRemoteWallet.js +354 -0
  8. package/dist/chainProvider.d.ts +56 -0
  9. package/dist/chainProvider.d.ts.map +1 -0
  10. package/dist/chainProvider.js +98 -0
  11. package/dist/contractArtifactCache.d.ts +50 -0
  12. package/dist/contractArtifactCache.d.ts.map +1 -0
  13. package/dist/contractArtifactCache.js +66 -0
  14. package/dist/errors.d.ts +50 -0
  15. package/dist/errors.d.ts.map +1 -0
  16. package/dist/errors.js +62 -0
  17. package/dist/handlers/aztecAccountWallet.d.ts +4 -0
  18. package/dist/handlers/aztecAccountWallet.d.ts.map +1 -0
  19. package/dist/handlers/aztecAccountWallet.js +329 -0
  20. package/dist/handlers/transactions.d.ts +21 -0
  21. package/dist/handlers/transactions.d.ts.map +1 -0
  22. package/dist/handlers/transactions.js +90 -0
  23. package/dist/handlers.d.ts +27 -0
  24. package/dist/handlers.d.ts.map +1 -0
  25. package/dist/handlers.js +55 -0
  26. package/dist/index.d.ts +58 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +33 -0
  29. package/dist/provider.d.ts +105 -0
  30. package/dist/provider.d.ts.map +1 -0
  31. package/dist/provider.js +160 -0
  32. package/dist/serializers/account.d.ts +167 -0
  33. package/dist/serializers/account.d.ts.map +1 -0
  34. package/dist/serializers/account.js +245 -0
  35. package/dist/serializers/contract-utils.d.ts +40 -0
  36. package/dist/serializers/contract-utils.d.ts.map +1 -0
  37. package/dist/serializers/contract-utils.js +102 -0
  38. package/dist/serializers/contract.d.ts +168 -0
  39. package/dist/serializers/contract.d.ts.map +1 -0
  40. package/dist/serializers/contract.js +268 -0
  41. package/dist/serializers/core.d.ts +110 -0
  42. package/dist/serializers/core.d.ts.map +1 -0
  43. package/dist/serializers/core.js +130 -0
  44. package/dist/serializers/index.d.ts +28 -0
  45. package/dist/serializers/index.d.ts.map +1 -0
  46. package/dist/serializers/index.js +159 -0
  47. package/dist/serializers/log.d.ts +113 -0
  48. package/dist/serializers/log.d.ts.map +1 -0
  49. package/dist/serializers/log.js +231 -0
  50. package/dist/serializers/note.d.ts +127 -0
  51. package/dist/serializers/note.d.ts.map +1 -0
  52. package/dist/serializers/note.js +182 -0
  53. package/dist/serializers/transaction-utils.d.ts +107 -0
  54. package/dist/serializers/transaction-utils.d.ts.map +1 -0
  55. package/dist/serializers/transaction-utils.js +130 -0
  56. package/dist/serializers/transaction.d.ts +103 -0
  57. package/dist/serializers/transaction.d.ts.map +1 -0
  58. package/dist/serializers/transaction.js +238 -0
  59. package/dist/serializers/types.d.ts +49 -0
  60. package/dist/serializers/types.d.ts.map +1 -0
  61. package/dist/serializers/types.js +22 -0
  62. package/dist/types.d.ts +391 -0
  63. package/dist/types.d.ts.map +1 -0
  64. package/dist/types.js +8 -0
  65. package/dist/wallet.d.ts +62 -0
  66. package/dist/wallet.d.ts.map +1 -0
  67. package/dist/wallet.js +77 -0
  68. package/package.json +44 -0
  69. package/src/aztecRemoteWallet.test.ts +542 -0
  70. package/src/aztecRemoteWallet.ts +484 -0
  71. package/src/chainProvider.test.ts +322 -0
  72. package/src/chainProvider.ts +122 -0
  73. package/src/contractArtifactCache.test.ts +126 -0
  74. package/src/contractArtifactCache.ts +75 -0
  75. package/src/errors.ts +71 -0
  76. package/src/handlers/aztecAccountWallet.test.ts +720 -0
  77. package/src/handlers/aztecAccountWallet.ts +593 -0
  78. package/src/handlers/transactions.ts +110 -0
  79. package/src/handlers.test.ts +270 -0
  80. package/src/handlers.ts +70 -0
  81. package/src/index.test.ts +23 -0
  82. package/src/index.ts +64 -0
  83. package/src/provider.test.ts +276 -0
  84. package/src/provider.ts +189 -0
  85. package/src/serializers/account.test.ts +125 -0
  86. package/src/serializers/account.ts +319 -0
  87. package/src/serializers/contract-utils.ts +104 -0
  88. package/src/serializers/contract.test.ts +162 -0
  89. package/src/serializers/contract.ts +350 -0
  90. package/src/serializers/core.test.ts +56 -0
  91. package/src/serializers/core.ts +141 -0
  92. package/src/serializers/index.test.ts +122 -0
  93. package/src/serializers/index.ts +213 -0
  94. package/src/serializers/log.test.ts +119 -0
  95. package/src/serializers/log.ts +283 -0
  96. package/src/serializers/note.test.ts +100 -0
  97. package/src/serializers/note.ts +227 -0
  98. package/src/serializers/transaction-utils.ts +237 -0
  99. package/src/serializers/transaction.test.ts +153 -0
  100. package/src/serializers/transaction.ts +342 -0
  101. package/src/serializers/types.ts +58 -0
  102. package/src/types.ts +295 -0
  103. package/src/wallet.test.ts +275 -0
  104. package/src/wallet.ts +94 -0
  105. package/tsconfig.build.json +6 -0
  106. package/tsconfig.json +11 -0
  107. package/typedoc.json +15 -0
  108. package/vitest.config.ts +10 -0
@@ -0,0 +1,542 @@
1
+ import { describe, expect, it, vi, beforeEach } from 'vitest';
2
+ import { Fr, getContractClassFromArtifact } from '@aztec/aztec.js';
3
+ import type {
4
+ AztecAddress,
5
+ TxExecutionRequest,
6
+ ContractInstanceWithAddress,
7
+ ContractClassWithId,
8
+ ContractArtifact,
9
+ ExtendedNote,
10
+ TxHash,
11
+ L2Block,
12
+ NodeInfo,
13
+ Point,
14
+ LogFilter,
15
+ TxReceipt,
16
+ Tx,
17
+ CompleteAddress,
18
+ PartialAddress,
19
+ AuthWitness,
20
+ } from '@aztec/aztec.js';
21
+ import type {
22
+ GetUnencryptedLogsResponse,
23
+ PrivateExecutionResult,
24
+ TxProvingResult,
25
+ TxSimulationResult,
26
+ InBlock,
27
+ TxEffect,
28
+ EventMetadataDefinition,
29
+ PXEInfo,
30
+ IncomingNotesFilter,
31
+ UniqueNote,
32
+ } from '@aztec/circuit-types';
33
+ import { randomDeployedContract } from '@aztec/circuit-types';
34
+
35
+ import type { ExecutionRequestInit } from '@aztec/aztec.js/entrypoint';
36
+ import type { GasFees } from '@aztec/circuits.js';
37
+ import { AztecRemoteWallet, createAztecRPCWallet } from './aztecRemoteWallet.js';
38
+ import type { AztecProvider } from './provider.js';
39
+ import type { JSONRPCTransport } from '@walletmesh/jsonrpc';
40
+
41
+ describe('AztecRemoteWallet', () => {
42
+ let provider: AztecProvider;
43
+ let wallet: AztecRemoteWallet;
44
+ let mockChainBuilder: { call: ReturnType<typeof vi.fn>; execute: ReturnType<typeof vi.fn> };
45
+ const chainId = 'aztec:testnet';
46
+ const mockAddress = { toString: () => '0x1234' } as unknown as AztecAddress;
47
+ const mockChainIdFr = Fr.fromString('1');
48
+ const mockVersionFr = Fr.fromString('1');
49
+
50
+ beforeEach(() => {
51
+ // Mock provider and chain builder
52
+ mockChainBuilder = {
53
+ call: vi.fn().mockReturnThis(),
54
+ execute: vi.fn().mockResolvedValue(undefined),
55
+ };
56
+ provider = {
57
+ chain: vi.fn().mockReturnValue(mockChainBuilder),
58
+ } as unknown as AztecProvider;
59
+
60
+ wallet = new AztecRemoteWallet(provider, chainId);
61
+ });
62
+
63
+ describe('core operations', () => {
64
+ it('gets address', async () => {
65
+ mockChainBuilder.execute.mockResolvedValueOnce(mockAddress);
66
+
67
+ // First call should throw and trigger async load
68
+ expect(() => wallet.getAddress()).toThrow('Address not yet available');
69
+
70
+ // Wait for promise to resolve
71
+ await new Promise(process.nextTick);
72
+
73
+ // Second call should return cached value
74
+ expect(wallet.getAddress()).toBe(mockAddress);
75
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getAddress');
76
+ });
77
+
78
+ it('gets complete address', async () => {
79
+ const mockCompleteAddress = { toString: () => '0x1234' } as unknown as CompleteAddress;
80
+ mockChainBuilder.execute.mockResolvedValueOnce(mockCompleteAddress);
81
+
82
+ expect(() => wallet.getCompleteAddress()).toThrow('Complete address not yet available');
83
+ await new Promise(process.nextTick);
84
+ expect(wallet.getCompleteAddress()).toBe(mockCompleteAddress);
85
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getCompleteAddress');
86
+ });
87
+
88
+ it('gets chain ID', async () => {
89
+ mockChainBuilder.execute.mockResolvedValueOnce(mockChainIdFr);
90
+
91
+ expect(() => wallet.getChainId()).toThrow('Chain ID not yet available');
92
+ await new Promise(process.nextTick);
93
+ expect(wallet.getChainId()).toStrictEqual(mockChainIdFr);
94
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getChainId');
95
+ });
96
+
97
+ it('gets version', async () => {
98
+ mockChainBuilder.execute.mockResolvedValueOnce(mockVersionFr);
99
+
100
+ expect(() => wallet.getVersion()).toThrow('Version not yet available');
101
+ await new Promise(process.nextTick);
102
+ expect(wallet.getVersion()).toStrictEqual(mockVersionFr);
103
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getVersion');
104
+ });
105
+
106
+ it('gets scopes', async () => {
107
+ const mockScopes = [mockAddress];
108
+ mockChainBuilder.execute.mockResolvedValueOnce(mockScopes);
109
+
110
+ expect(() => wallet.getScopes()).toThrow('Scopes not yet available');
111
+ await new Promise(process.nextTick);
112
+ expect(wallet.getScopes()).toBe(mockScopes);
113
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getScopes');
114
+ });
115
+
116
+ it('gets scopes async', async () => {
117
+ const mockScopes = [mockAddress];
118
+ mockChainBuilder.execute.mockResolvedValueOnce(mockScopes);
119
+
120
+ const result = await wallet.getScopesAsync();
121
+ expect(result).toBe(mockScopes);
122
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getScopes');
123
+ });
124
+
125
+ it('checks if L1 to L2 message is synced', async () => {
126
+ const mockL1ToL2Message = Fr.fromString('1');
127
+ const mockResult = true;
128
+ mockChainBuilder.execute.mockResolvedValueOnce(mockResult);
129
+
130
+ const result = await wallet.isL1ToL2MessageSynced(mockL1ToL2Message);
131
+ expect(result).toBe(mockResult);
132
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_isL1ToL2MessageSynced', {
133
+ l1ToL2Message: mockL1ToL2Message,
134
+ });
135
+ });
136
+
137
+ it('creates tx execution request', async () => {
138
+ const mockExec = { someParam: 'value' } as unknown as ExecutionRequestInit;
139
+ const mockRequest = { id: '123' } as unknown as TxExecutionRequest;
140
+ mockChainBuilder.execute.mockResolvedValueOnce(mockRequest);
141
+
142
+ const result = await wallet.createTxExecutionRequest(mockExec);
143
+ expect(result).toBe(mockRequest);
144
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_createTxExecutionRequest', {
145
+ exec: mockExec,
146
+ });
147
+ });
148
+
149
+ it('creates auth wit', async () => {
150
+ const mockIntent = Fr.fromString('1');
151
+ const mockAuthWitness = { witness: '0x1234' } as unknown as AuthWitness;
152
+ mockChainBuilder.execute.mockResolvedValueOnce(mockAuthWitness);
153
+
154
+ const result = await wallet.createAuthWit(mockIntent);
155
+ expect(result).toBe(mockAuthWitness);
156
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_createAuthWit', { intent: mockIntent });
157
+ });
158
+
159
+ it('sets scopes', async () => {
160
+ const mockScopes = [mockAddress];
161
+ const mockResult = true;
162
+ mockChainBuilder.execute.mockResolvedValueOnce(mockResult);
163
+
164
+ wallet.setScopes(mockScopes);
165
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_setScopes', { scopes: mockScopes });
166
+ });
167
+
168
+ it('adds capsule', async () => {
169
+ const mockCapsule = [Fr.fromString('1')];
170
+ mockChainBuilder.execute.mockResolvedValueOnce(true);
171
+ await wallet.addCapsule(mockCapsule);
172
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_addCapsule', { capsule: mockCapsule });
173
+ });
174
+
175
+ it('registers account', async () => {
176
+ const mockSecretKey = Fr.fromString('1');
177
+ const mockPartialAddress = {} as PartialAddress;
178
+ const mockCompleteAddress = {} as CompleteAddress;
179
+ mockChainBuilder.execute.mockResolvedValueOnce(mockCompleteAddress);
180
+
181
+ const result = await wallet.registerAccount(mockSecretKey, mockPartialAddress);
182
+ expect(result).toBe(mockCompleteAddress);
183
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_registerAccount', {
184
+ secretKey: mockSecretKey,
185
+ partialAddress: mockPartialAddress,
186
+ });
187
+ });
188
+
189
+ it('gets registered accounts', async () => {
190
+ const mockAccounts = [{} as CompleteAddress];
191
+ mockChainBuilder.execute.mockResolvedValueOnce(mockAccounts);
192
+
193
+ const result = await wallet.getRegisteredAccounts();
194
+ expect(result).toBe(mockAccounts);
195
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getRegisteredAccounts');
196
+ });
197
+ });
198
+
199
+ describe('contract operations', () => {
200
+ const { instance, artifact } = randomDeployedContract();
201
+ const contractClass = getContractClassFromArtifact(artifact);
202
+
203
+ it('gets contract instance', async () => {
204
+ mockChainBuilder.execute.mockResolvedValueOnce(instance);
205
+
206
+ const result = await wallet.getContractInstance(instance.address);
207
+ expect(result).toBe(instance);
208
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getContractInstance', {
209
+ address: instance.address,
210
+ });
211
+ });
212
+
213
+ it('gets contract class', async () => {
214
+ mockChainBuilder.execute.mockResolvedValueOnce(contractClass);
215
+
216
+ const result = await wallet.getContractClass(contractClass.id);
217
+ expect(result).toBe(contractClass);
218
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getContractClass', { id: contractClass.id });
219
+ });
220
+
221
+ it('gets contract artifact', async () => {
222
+ mockChainBuilder.execute.mockResolvedValueOnce(artifact);
223
+
224
+ const result = await wallet.getContractArtifact(contractClass.id);
225
+ expect(result).toBe(artifact);
226
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getContractArtifact', {
227
+ id: contractClass.id,
228
+ });
229
+ });
230
+
231
+ it('registers contract', async () => {
232
+ mockChainBuilder.execute.mockResolvedValueOnce(true);
233
+ await wallet.registerContract({ instance: instance, artifact: artifact });
234
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_registerContract', {
235
+ instance,
236
+ artifact,
237
+ });
238
+ });
239
+
240
+ it('registers contract class', async () => {
241
+ mockChainBuilder.execute.mockResolvedValueOnce(true);
242
+ await wallet.registerContractClass(artifact);
243
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_registerContractClass', {
244
+ artifact: artifact,
245
+ });
246
+ });
247
+
248
+ it('gets contracts', async () => {
249
+ const mockContracts = [instance.address];
250
+ mockChainBuilder.execute.mockResolvedValueOnce(mockContracts);
251
+
252
+ const result = await wallet.getContracts();
253
+ expect(result).toBe(mockContracts);
254
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getContracts');
255
+ });
256
+ });
257
+
258
+ describe('auth witness operations', () => {
259
+ const mockAuthWitness = { witness: '0x1234' } as unknown as AuthWitness;
260
+ const mockMessageHash = Fr.fromString('1');
261
+
262
+ it('adds auth witness', async () => {
263
+ mockChainBuilder.execute.mockResolvedValueOnce(true);
264
+ await wallet.addAuthWitness(mockAuthWitness);
265
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_addAuthWitness', {
266
+ authWitness: mockAuthWitness,
267
+ });
268
+ });
269
+
270
+ it('gets auth witness', async () => {
271
+ const mockWitness = [Fr.fromString('1')];
272
+ mockChainBuilder.execute.mockResolvedValueOnce(mockWitness);
273
+ const result = await wallet.getAuthWitness(mockMessageHash);
274
+ expect(result).toBe(mockWitness);
275
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getAuthWitness', {
276
+ messageHash: mockMessageHash,
277
+ });
278
+ });
279
+ });
280
+
281
+ describe('transaction operations', () => {
282
+ const mockTxRequest = {} as TxExecutionRequest;
283
+ const mockPrivateExecutionResult = {} as PrivateExecutionResult;
284
+ const mockTxHash = {} as TxHash;
285
+ const mockTx = {} as Tx;
286
+ const mockTxEffect = {} as InBlock<TxEffect>;
287
+ const mockTxReceipt = {} as TxReceipt;
288
+ const mockSimulationResult = {} as TxSimulationResult;
289
+ const mockProvingResult = {} as TxProvingResult;
290
+
291
+ it('simulates tx', async () => {
292
+ const mockScopes = [mockAddress];
293
+ mockChainBuilder.execute.mockResolvedValueOnce(mockScopes).mockResolvedValueOnce(mockSimulationResult);
294
+
295
+ const result = await wallet.simulateTx(mockTxRequest, true);
296
+ expect(result).toBe(mockSimulationResult);
297
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_simulateTx', {
298
+ txRequest: mockTxRequest,
299
+ simulatePublic: true,
300
+ msgSender: undefined,
301
+ skipTxValidation: undefined,
302
+ enforceFeePayment: undefined,
303
+ profile: undefined,
304
+ });
305
+ });
306
+
307
+ it('proves tx', async () => {
308
+ mockChainBuilder.execute.mockResolvedValueOnce(mockProvingResult);
309
+
310
+ const result = await wallet.proveTx(mockTxRequest, mockPrivateExecutionResult);
311
+ expect(result).toBe(mockProvingResult);
312
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_proveTx', {
313
+ txRequest: mockTxRequest,
314
+ privateExecutionResult: mockPrivateExecutionResult,
315
+ });
316
+ });
317
+
318
+ it('sends tx', async () => {
319
+ mockChainBuilder.execute.mockResolvedValueOnce(mockTxHash);
320
+
321
+ const result = await wallet.sendTx(mockTx);
322
+ expect(result).toBe(mockTxHash);
323
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_sendTx', { tx: mockTx });
324
+ });
325
+
326
+ it('gets tx effect', async () => {
327
+ mockChainBuilder.execute.mockResolvedValueOnce(mockTxEffect);
328
+
329
+ const result = await wallet.getTxEffect(mockTxHash);
330
+ expect(result).toBe(mockTxEffect);
331
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getTxEffect', { txHash: mockTxHash });
332
+ });
333
+
334
+ it('gets tx receipt', async () => {
335
+ mockChainBuilder.execute.mockResolvedValueOnce(mockTxReceipt);
336
+
337
+ const result = await wallet.getTxReceipt(mockTxHash);
338
+ expect(result).toBe(mockTxReceipt);
339
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getTxReceipt', { txHash: mockTxHash });
340
+ });
341
+ });
342
+
343
+ describe('storage and block operations', () => {
344
+ const mockStorageSlot = Fr.fromString('1');
345
+ const mockStorageValue = Fr.fromString('2');
346
+ const mockBlock = {} as L2Block;
347
+ const mockGasFees = {} as GasFees;
348
+ const mockBlockNumber = 123;
349
+
350
+ it('gets public storage at', async () => {
351
+ mockChainBuilder.execute.mockResolvedValueOnce(mockStorageValue);
352
+
353
+ const result = await wallet.getPublicStorageAt(mockAddress, mockStorageSlot);
354
+ expect(result).toBe(mockStorageValue);
355
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getPublicStorageAt', {
356
+ contract: mockAddress,
357
+ storageSlot: mockStorageSlot,
358
+ });
359
+ });
360
+
361
+ it('gets block', async () => {
362
+ mockChainBuilder.execute.mockResolvedValueOnce(mockBlock);
363
+
364
+ const result = await wallet.getBlock(mockBlockNumber);
365
+ expect(result).toBe(mockBlock);
366
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getBlock', { number: mockBlockNumber });
367
+ });
368
+
369
+ it('gets current base fees', async () => {
370
+ mockChainBuilder.execute.mockResolvedValueOnce(mockGasFees);
371
+
372
+ const result = await wallet.getCurrentBaseFees();
373
+ expect(result).toBe(mockGasFees);
374
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getCurrentBaseFees');
375
+ });
376
+
377
+ it('gets block number', async () => {
378
+ mockChainBuilder.execute.mockResolvedValueOnce(mockBlockNumber);
379
+
380
+ const result = await wallet.getBlockNumber();
381
+ expect(result).toBe(mockBlockNumber);
382
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getBlockNumber');
383
+ });
384
+
385
+ it('gets proven block number', async () => {
386
+ mockChainBuilder.execute.mockResolvedValueOnce(mockBlockNumber);
387
+
388
+ const result = await wallet.getProvenBlockNumber();
389
+ expect(result).toBe(mockBlockNumber);
390
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getProvenBlockNumber');
391
+ });
392
+ });
393
+
394
+ describe('contract verification operations', () => {
395
+ it('checks if contract class is publicly registered', async () => {
396
+ const mockId = Fr.fromString('1');
397
+ mockChainBuilder.execute.mockResolvedValueOnce(true);
398
+
399
+ const result = await wallet.isContractClassPubliclyRegistered(mockId);
400
+ expect(result).toBe(true);
401
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_isContractClassPubliclyRegistered', {
402
+ id: mockId,
403
+ });
404
+ });
405
+
406
+ it('checks if contract is publicly deployed', async () => {
407
+ mockChainBuilder.execute.mockResolvedValueOnce(true);
408
+
409
+ const result = await wallet.isContractPubliclyDeployed(mockAddress);
410
+ expect(result).toBe(true);
411
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_isContractPubliclyDeployed', {
412
+ address: mockAddress,
413
+ });
414
+ });
415
+
416
+ it('checks if contract is initialized', async () => {
417
+ mockChainBuilder.execute.mockResolvedValueOnce(true);
418
+
419
+ const result = await wallet.isContractInitialized(mockAddress);
420
+ expect(result).toBe(true);
421
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_isContractInitialized', {
422
+ address: mockAddress,
423
+ });
424
+ });
425
+ });
426
+
427
+ describe('PXE operations', () => {
428
+ it('gets PXE info', async () => {
429
+ const mockInfo = { version: '1.0.0' } as unknown as PXEInfo;
430
+ mockChainBuilder.execute.mockResolvedValueOnce(mockInfo);
431
+ const result = await wallet.getPXEInfo();
432
+ expect(result).toBe(mockInfo);
433
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getPXEInfo');
434
+ });
435
+ });
436
+
437
+ describe('note operations', () => {
438
+ const mockNote = {} as ExtendedNote;
439
+ const mockFilter = {} as IncomingNotesFilter;
440
+
441
+ it('adds note', async () => {
442
+ mockChainBuilder.execute.mockResolvedValueOnce(true);
443
+ await wallet.addNote(mockNote);
444
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_addNote', { note: mockNote });
445
+ });
446
+
447
+ it('adds nullified note', async () => {
448
+ mockChainBuilder.execute.mockResolvedValueOnce(true);
449
+ await wallet.addNullifiedNote(mockNote);
450
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_addNullifiedNote', { note: mockNote });
451
+ });
452
+
453
+ it('gets incoming notes', async () => {
454
+ const mockNotes = [{}] as UniqueNote[];
455
+ mockChainBuilder.execute.mockResolvedValueOnce(mockNotes);
456
+ const result = await wallet.getIncomingNotes(mockFilter);
457
+ expect(result).toBe(mockNotes);
458
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getIncomingNotes', { filter: mockFilter });
459
+ });
460
+ });
461
+
462
+ describe('event operations', () => {
463
+ const mockEvent = {
464
+ eventSelector: Fr.fromString('1') as unknown as Fr & { _branding: 'EventSelector' },
465
+ abiType: 'array',
466
+ fieldNames: ['field1', 'field2'],
467
+ } as unknown as EventMetadataDefinition;
468
+ const mockVpks = [{}] as Point[];
469
+ const mockCompleteAddress = { publicKeys: { masterIncomingViewingPublicKey: {} } } as CompleteAddress;
470
+
471
+ it('gets encrypted events with default vpks', async () => {
472
+ const mockEvents = [{ data: '0x1234' }];
473
+ mockChainBuilder.execute.mockResolvedValueOnce(mockCompleteAddress).mockResolvedValueOnce(mockEvents);
474
+
475
+ // Initialize complete address
476
+ try {
477
+ wallet.getCompleteAddress();
478
+ } catch (e) {
479
+ // Expected error
480
+ }
481
+
482
+ // Wait for promise to resolve
483
+ await new Promise(process.nextTick);
484
+
485
+ const result = await wallet.getEncryptedEvents(mockEvent, 0, 10);
486
+ expect(result).toBe(mockEvents);
487
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getEncryptedEvents', {
488
+ event: mockEvent,
489
+ from: 0,
490
+ limit: 10,
491
+ vpks: [mockCompleteAddress.publicKeys.masterIncomingViewingPublicKey],
492
+ });
493
+ });
494
+
495
+ it('gets encrypted events with custom vpks', async () => {
496
+ const mockEvents = [{ data: '0x1234' }];
497
+ mockChainBuilder.execute.mockResolvedValueOnce(mockCompleteAddress).mockResolvedValueOnce(mockEvents);
498
+
499
+ // Initialize complete address
500
+ try {
501
+ wallet.getCompleteAddress();
502
+ } catch (e) {
503
+ // Expected error
504
+ }
505
+
506
+ // Wait for promise to resolve
507
+ await new Promise(process.nextTick);
508
+
509
+ const result = await wallet.getEncryptedEvents(mockEvent, 0, 10, mockVpks);
510
+ expect(result).toBe(mockEvents);
511
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getEncryptedEvents', {
512
+ event: mockEvent,
513
+ from: 0,
514
+ limit: 10,
515
+ vpks: mockVpks,
516
+ });
517
+ });
518
+
519
+ it('gets unencrypted events', async () => {
520
+ const mockEvents = [{ data: '0x1234' }];
521
+ mockChainBuilder.execute.mockResolvedValueOnce(mockEvents);
522
+ const result = await wallet.getUnencryptedEvents(mockEvent, 0, 10);
523
+ expect(result).toBe(mockEvents);
524
+ expect(mockChainBuilder.call).toHaveBeenCalledWith('aztec_getUnencryptedEvents', {
525
+ event: mockEvent,
526
+ from: 0,
527
+ limit: 10,
528
+ });
529
+ });
530
+ });
531
+ });
532
+
533
+ describe('createAztecRPCWallet', () => {
534
+ it('creates wallet instance with transport and chain ID', () => {
535
+ const transport = {} as JSONRPCTransport;
536
+ const chainId = 'aztec:testnet';
537
+
538
+ const wallet = createAztecRPCWallet(transport, chainId);
539
+
540
+ expect(wallet).toBeInstanceOf(AztecRemoteWallet);
541
+ });
542
+ });