@walletmesh/aztec-rpc-wallet 0.1.0
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/CHANGELOG.md +7 -0
- package/LICENSE +201 -0
- package/README.md +260 -0
- package/dist/.tsbuildinfo +1 -0
- package/dist/aztecRemoteWallet.d.ts +73 -0
- package/dist/aztecRemoteWallet.d.ts.map +1 -0
- package/dist/aztecRemoteWallet.js +354 -0
- package/dist/chainProvider.d.ts +56 -0
- package/dist/chainProvider.d.ts.map +1 -0
- package/dist/chainProvider.js +98 -0
- package/dist/contractArtifactCache.d.ts +50 -0
- package/dist/contractArtifactCache.d.ts.map +1 -0
- package/dist/contractArtifactCache.js +66 -0
- package/dist/errors.d.ts +50 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +62 -0
- package/dist/handlers/aztecAccountWallet.d.ts +4 -0
- package/dist/handlers/aztecAccountWallet.d.ts.map +1 -0
- package/dist/handlers/aztecAccountWallet.js +329 -0
- package/dist/handlers/transactions.d.ts +21 -0
- package/dist/handlers/transactions.d.ts.map +1 -0
- package/dist/handlers/transactions.js +90 -0
- package/dist/handlers.d.ts +27 -0
- package/dist/handlers.d.ts.map +1 -0
- package/dist/handlers.js +55 -0
- package/dist/index.d.ts +58 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +33 -0
- package/dist/provider.d.ts +105 -0
- package/dist/provider.d.ts.map +1 -0
- package/dist/provider.js +160 -0
- package/dist/serializers/account.d.ts +167 -0
- package/dist/serializers/account.d.ts.map +1 -0
- package/dist/serializers/account.js +245 -0
- package/dist/serializers/contract-utils.d.ts +40 -0
- package/dist/serializers/contract-utils.d.ts.map +1 -0
- package/dist/serializers/contract-utils.js +102 -0
- package/dist/serializers/contract.d.ts +168 -0
- package/dist/serializers/contract.d.ts.map +1 -0
- package/dist/serializers/contract.js +268 -0
- package/dist/serializers/core.d.ts +110 -0
- package/dist/serializers/core.d.ts.map +1 -0
- package/dist/serializers/core.js +130 -0
- package/dist/serializers/index.d.ts +28 -0
- package/dist/serializers/index.d.ts.map +1 -0
- package/dist/serializers/index.js +159 -0
- package/dist/serializers/log.d.ts +113 -0
- package/dist/serializers/log.d.ts.map +1 -0
- package/dist/serializers/log.js +231 -0
- package/dist/serializers/note.d.ts +127 -0
- package/dist/serializers/note.d.ts.map +1 -0
- package/dist/serializers/note.js +182 -0
- package/dist/serializers/transaction-utils.d.ts +107 -0
- package/dist/serializers/transaction-utils.d.ts.map +1 -0
- package/dist/serializers/transaction-utils.js +130 -0
- package/dist/serializers/transaction.d.ts +103 -0
- package/dist/serializers/transaction.d.ts.map +1 -0
- package/dist/serializers/transaction.js +238 -0
- package/dist/serializers/types.d.ts +49 -0
- package/dist/serializers/types.d.ts.map +1 -0
- package/dist/serializers/types.js +22 -0
- package/dist/types.d.ts +391 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +8 -0
- package/dist/wallet.d.ts +62 -0
- package/dist/wallet.d.ts.map +1 -0
- package/dist/wallet.js +77 -0
- package/package.json +44 -0
- package/src/aztecRemoteWallet.test.ts +542 -0
- package/src/aztecRemoteWallet.ts +484 -0
- package/src/chainProvider.test.ts +322 -0
- package/src/chainProvider.ts +122 -0
- package/src/contractArtifactCache.test.ts +126 -0
- package/src/contractArtifactCache.ts +75 -0
- package/src/errors.ts +71 -0
- package/src/handlers/aztecAccountWallet.test.ts +720 -0
- package/src/handlers/aztecAccountWallet.ts +593 -0
- package/src/handlers/transactions.ts +110 -0
- package/src/handlers.test.ts +270 -0
- package/src/handlers.ts +70 -0
- package/src/index.test.ts +23 -0
- package/src/index.ts +64 -0
- package/src/provider.test.ts +276 -0
- package/src/provider.ts +189 -0
- package/src/serializers/account.test.ts +125 -0
- package/src/serializers/account.ts +319 -0
- package/src/serializers/contract-utils.ts +104 -0
- package/src/serializers/contract.test.ts +162 -0
- package/src/serializers/contract.ts +350 -0
- package/src/serializers/core.test.ts +56 -0
- package/src/serializers/core.ts +141 -0
- package/src/serializers/index.test.ts +122 -0
- package/src/serializers/index.ts +213 -0
- package/src/serializers/log.test.ts +119 -0
- package/src/serializers/log.ts +283 -0
- package/src/serializers/note.test.ts +100 -0
- package/src/serializers/note.ts +227 -0
- package/src/serializers/transaction-utils.ts +237 -0
- package/src/serializers/transaction.test.ts +153 -0
- package/src/serializers/transaction.ts +342 -0
- package/src/serializers/types.ts +58 -0
- package/src/types.ts +295 -0
- package/src/wallet.test.ts +275 -0
- package/src/wallet.ts +94 -0
- package/tsconfig.build.json +6 -0
- package/tsconfig.json +11 -0
- package/typedoc.json +15 -0
- 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
|
+
});
|