@walletmesh/aztec-rpc-wallet 0.3.0 → 0.4.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.
Files changed (185) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +290 -228
  3. package/dist/.tsbuildinfo +1 -1
  4. package/dist/client/aztec-dapp-wallet.d.ts +401 -0
  5. package/dist/client/aztec-dapp-wallet.d.ts.map +1 -0
  6. package/dist/client/aztec-dapp-wallet.js +705 -0
  7. package/dist/client/aztec-router-provider.d.ts +58 -0
  8. package/dist/client/aztec-router-provider.d.ts.map +1 -0
  9. package/dist/client/aztec-router-provider.js +62 -0
  10. package/dist/client/helpers.d.ts +44 -0
  11. package/dist/client/helpers.d.ts.map +1 -0
  12. package/dist/client/helpers.js +79 -0
  13. package/dist/client/register-serializers.d.ts +41 -0
  14. package/dist/client/register-serializers.d.ts.map +1 -0
  15. package/dist/client/register-serializers.js +97 -0
  16. package/dist/contractArtifactCache.d.ts +49 -32
  17. package/dist/contractArtifactCache.d.ts.map +1 -1
  18. package/dist/contractArtifactCache.js +47 -34
  19. package/dist/errors.d.ts +50 -8
  20. package/dist/errors.d.ts.map +1 -1
  21. package/dist/errors.js +50 -10
  22. package/dist/index.d.ts +53 -40
  23. package/dist/index.d.ts.map +1 -1
  24. package/dist/index.js +52 -17
  25. package/dist/types.d.ts +345 -268
  26. package/dist/types.d.ts.map +1 -1
  27. package/dist/types.js +10 -8
  28. package/dist/wallet/create-node.d.ts +73 -0
  29. package/dist/wallet/create-node.d.ts.map +1 -0
  30. package/dist/wallet/create-node.js +99 -0
  31. package/dist/wallet/handlers/account.d.ts +67 -0
  32. package/dist/wallet/handlers/account.d.ts.map +1 -0
  33. package/dist/wallet/handlers/account.js +85 -0
  34. package/dist/wallet/handlers/contract-interaction.d.ts +77 -0
  35. package/dist/wallet/handlers/contract-interaction.d.ts.map +1 -0
  36. package/dist/wallet/handlers/contract-interaction.js +219 -0
  37. package/dist/wallet/handlers/contract.d.ts +96 -0
  38. package/dist/wallet/handlers/contract.d.ts.map +1 -0
  39. package/dist/wallet/handlers/contract.js +146 -0
  40. package/dist/wallet/handlers/event.d.ts +62 -0
  41. package/dist/wallet/handlers/event.d.ts.map +1 -0
  42. package/dist/wallet/handlers/event.js +85 -0
  43. package/dist/wallet/handlers/index.d.ts +88 -0
  44. package/dist/wallet/handlers/index.d.ts.map +1 -0
  45. package/dist/wallet/handlers/index.js +47 -0
  46. package/dist/wallet/handlers/node.d.ts +117 -0
  47. package/dist/wallet/handlers/node.d.ts.map +1 -0
  48. package/dist/wallet/handlers/node.js +196 -0
  49. package/dist/wallet/handlers/senders.d.ts +70 -0
  50. package/dist/wallet/handlers/senders.d.ts.map +1 -0
  51. package/dist/wallet/handlers/senders.js +92 -0
  52. package/dist/wallet/handlers/transaction.d.ts +123 -0
  53. package/dist/wallet/handlers/transaction.d.ts.map +1 -0
  54. package/dist/wallet/handlers/transaction.js +191 -0
  55. package/dist/wallet/serializers.d.ts +75 -0
  56. package/dist/wallet/serializers.d.ts.map +1 -0
  57. package/dist/wallet/serializers.js +501 -0
  58. package/docs/README.md +290 -229
  59. package/docs/classes/AztecDappWallet.md +1304 -0
  60. package/docs/classes/AztecRouterProvider.md +1058 -0
  61. package/docs/classes/AztecWalletError.md +124 -47
  62. package/docs/classes/ContractArtifactCache.md +48 -31
  63. package/docs/functions/connectAztec.md +62 -0
  64. package/docs/functions/createAztecWallet.md +46 -0
  65. package/docs/functions/createAztecWalletNode.md +96 -0
  66. package/docs/functions/registerAztecSerializers.md +61 -0
  67. package/docs/functions/registerWalletAztecSerializers.md +39 -0
  68. package/docs/globals.md +16 -14
  69. package/docs/interfaces/AztecHandlerContext.md +54 -0
  70. package/docs/interfaces/AztecWalletContext.md +50 -0
  71. package/docs/interfaces/AztecWalletMethodMap.md +471 -470
  72. package/docs/type-aliases/AztecChainId.md +16 -3
  73. package/docs/variables/ALL_AZTEC_METHODS.md +20 -0
  74. package/docs/variables/AztecWalletErrorMap.md +9 -4
  75. package/docs/variables/AztecWalletSerializer.md +45 -0
  76. package/package.json +9 -9
  77. package/src/client/aztec-dapp-wallet.test.ts +628 -0
  78. package/src/client/aztec-dapp-wallet.ts +879 -0
  79. package/src/client/aztec-router-provider.test.ts +235 -0
  80. package/src/client/aztec-router-provider.ts +64 -0
  81. package/src/client/helpers.test.ts +187 -0
  82. package/src/client/helpers.ts +91 -0
  83. package/src/client/register-serializers.ts +108 -0
  84. package/src/contractArtifactCache.test.ts +21 -10
  85. package/src/contractArtifactCache.ts +54 -35
  86. package/src/errors.ts +58 -10
  87. package/src/index.test.ts +2 -6
  88. package/src/index.ts +73 -37
  89. package/src/types.ts +379 -217
  90. package/src/wallet/create-node.test.ts +332 -0
  91. package/src/wallet/create-node.ts +120 -0
  92. package/src/wallet/handlers/account.test.ts +172 -0
  93. package/src/wallet/handlers/account.ts +99 -0
  94. package/src/wallet/handlers/contract-interaction.test.ts +248 -0
  95. package/src/wallet/handlers/contract-interaction.ts +269 -0
  96. package/src/wallet/handlers/contract.test.ts +245 -0
  97. package/src/wallet/handlers/contract.ts +174 -0
  98. package/src/wallet/handlers/event.test.ts +216 -0
  99. package/src/wallet/handlers/event.ts +99 -0
  100. package/src/wallet/handlers/index.ts +84 -0
  101. package/src/wallet/handlers/node.test.ts +304 -0
  102. package/src/wallet/handlers/node.ts +230 -0
  103. package/src/wallet/handlers/senders.test.ts +172 -0
  104. package/src/wallet/handlers/senders.ts +106 -0
  105. package/src/wallet/handlers/transaction.test.ts +371 -0
  106. package/src/wallet/handlers/transaction.ts +239 -0
  107. package/src/wallet/serializers.test.ts +253 -0
  108. package/src/wallet/serializers.ts +586 -0
  109. package/typedoc.json +23 -1
  110. package/dist/aztecRemoteWallet.d.ts +0 -70
  111. package/dist/aztecRemoteWallet.d.ts.map +0 -1
  112. package/dist/aztecRemoteWallet.js +0 -335
  113. package/dist/chainProvider.d.ts +0 -56
  114. package/dist/chainProvider.d.ts.map +0 -1
  115. package/dist/chainProvider.js +0 -98
  116. package/dist/handlers/aztecAccountWallet.d.ts +0 -4
  117. package/dist/handlers/aztecAccountWallet.d.ts.map +0 -1
  118. package/dist/handlers/aztecAccountWallet.js +0 -296
  119. package/dist/handlers/transactions.d.ts +0 -21
  120. package/dist/handlers/transactions.d.ts.map +0 -1
  121. package/dist/handlers/transactions.js +0 -98
  122. package/dist/handlers.d.ts +0 -27
  123. package/dist/handlers.d.ts.map +0 -1
  124. package/dist/handlers.js +0 -55
  125. package/dist/provider.d.ts +0 -105
  126. package/dist/provider.d.ts.map +0 -1
  127. package/dist/provider.js +0 -160
  128. package/dist/serializers/account.d.ts +0 -164
  129. package/dist/serializers/account.d.ts.map +0 -1
  130. package/dist/serializers/account.js +0 -244
  131. package/dist/serializers/contract.d.ts +0 -62
  132. package/dist/serializers/contract.d.ts.map +0 -1
  133. package/dist/serializers/contract.js +0 -130
  134. package/dist/serializers/index.d.ts +0 -21
  135. package/dist/serializers/index.d.ts.map +0 -1
  136. package/dist/serializers/index.js +0 -154
  137. package/dist/serializers/log.d.ts +0 -66
  138. package/dist/serializers/log.d.ts.map +0 -1
  139. package/dist/serializers/log.js +0 -222
  140. package/dist/serializers/note.d.ts +0 -124
  141. package/dist/serializers/note.d.ts.map +0 -1
  142. package/dist/serializers/note.js +0 -208
  143. package/dist/serializers/transaction.d.ts +0 -99
  144. package/dist/serializers/transaction.d.ts.map +0 -1
  145. package/dist/serializers/transaction.js +0 -275
  146. package/dist/wallet.d.ts +0 -62
  147. package/dist/wallet.d.ts.map +0 -1
  148. package/dist/wallet.js +0 -77
  149. package/docs/classes/AztecChainProvider.md +0 -553
  150. package/docs/classes/AztecChainWallet.md +0 -409
  151. package/docs/classes/AztecProvider.md +0 -1112
  152. package/docs/interfaces/AztecWalletBaseMethodMap.md +0 -135
  153. package/docs/interfaces/AztecWalletEventMap.md +0 -17
  154. package/docs/type-aliases/AztecChainWalletMiddleware.md +0 -13
  155. package/docs/type-aliases/AztecWalletContext.md +0 -29
  156. package/docs/type-aliases/AztecWalletMethodHandler.md +0 -37
  157. package/docs/type-aliases/AztecWalletMiddleware.md +0 -13
  158. package/docs/type-aliases/AztecWalletRouterClient.md +0 -13
  159. package/docs/type-aliases/TransactionFunctionCall.md +0 -33
  160. package/docs/type-aliases/TransactionParams.md +0 -27
  161. package/src/aztecRemoteWallet.test.ts +0 -504
  162. package/src/aztecRemoteWallet.ts +0 -467
  163. package/src/chainProvider.test.ts +0 -401
  164. package/src/chainProvider.ts +0 -116
  165. package/src/handlers/aztecAccountWallet.test.ts +0 -649
  166. package/src/handlers/aztecAccountWallet.ts +0 -532
  167. package/src/handlers/transactions.ts +0 -124
  168. package/src/handlers.test.ts +0 -270
  169. package/src/handlers.ts +0 -70
  170. package/src/provider.test.ts +0 -274
  171. package/src/provider.ts +0 -189
  172. package/src/serializers/account.test.ts +0 -125
  173. package/src/serializers/account.ts +0 -301
  174. package/src/serializers/contract.test.ts +0 -24
  175. package/src/serializers/contract.ts +0 -183
  176. package/src/serializers/index.test.ts +0 -136
  177. package/src/serializers/index.ts +0 -191
  178. package/src/serializers/log.test.ts +0 -286
  179. package/src/serializers/log.ts +0 -292
  180. package/src/serializers/note.test.ts +0 -125
  181. package/src/serializers/note.ts +0 -250
  182. package/src/serializers/transaction.test.ts +0 -320
  183. package/src/serializers/transaction.ts +0 -409
  184. package/src/wallet.test.ts +0 -275
  185. package/src/wallet.ts +0 -94
@@ -0,0 +1,332 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { createAztecWalletNode } from './create-node.js';
3
+ import { JSONRPCNode } from '@walletmesh/jsonrpc';
4
+ import type { AccountWallet, PXE } from '@aztec/aztec.js';
5
+ import type { JSONRPCTransport } from '@walletmesh/jsonrpc';
6
+ import { ContractArtifactCache } from '../contractArtifactCache.js';
7
+ import type { AztecHandlerContext } from './handlers/index.js';
8
+
9
+ // Mock dependencies
10
+ vi.mock('@walletmesh/jsonrpc', async () => {
11
+ const actual = await vi.importActual('@walletmesh/jsonrpc');
12
+ return {
13
+ ...actual,
14
+ JSONRPCNode: vi.fn().mockImplementation(() => ({
15
+ registerMethod: vi.fn(),
16
+ registerSerializer: vi.fn(),
17
+ transport: {},
18
+ context: {},
19
+ methodManager: {},
20
+ eventManager: {},
21
+ requestManager: {},
22
+ middlewareManager: {},
23
+ parameterSerializer: {},
24
+ messageValidator: {},
25
+ requestHandler: {},
26
+ send: vi.fn(),
27
+ on: vi.fn(),
28
+ off: vi.fn(),
29
+ emit: vi.fn(),
30
+ handle: vi.fn(),
31
+ registerMiddleware: vi.fn(),
32
+ removeMiddleware: vi.fn(),
33
+ registerEvent: vi.fn(),
34
+ removeEvent: vi.fn(),
35
+ close: vi.fn(),
36
+ })),
37
+ };
38
+ });
39
+
40
+ vi.mock('../contractArtifactCache.js', () => ({
41
+ ContractArtifactCache: vi.fn().mockImplementation(() => ({
42
+ // Mock cache methods if needed
43
+ })),
44
+ }));
45
+
46
+ vi.mock('./handlers/index.js', () => ({
47
+ createAztecHandlers: vi.fn().mockReturnValue({
48
+ aztec_getAddress: vi.fn(),
49
+ aztec_getCompleteAddress: vi.fn(),
50
+ aztec_createAuthWit: vi.fn(),
51
+ aztec_sendTx: vi.fn(),
52
+ aztec_getTxReceipt: vi.fn(),
53
+ aztec_getNodeInfo: vi.fn(),
54
+ aztec_getBlockNumber: vi.fn(),
55
+ aztec_registerContract: vi.fn(),
56
+ aztec_getContracts: vi.fn(),
57
+ }),
58
+ }));
59
+
60
+ vi.mock('./serializers.js', () => ({
61
+ registerAztecSerializers: vi.fn(),
62
+ }));
63
+
64
+ // Mock wallet and PXE
65
+ const createMockWallet = () =>
66
+ ({
67
+ getAddress: vi.fn(),
68
+ getCompleteAddress: vi.fn(),
69
+ createAuthWit: vi.fn(),
70
+ registerSender: vi.fn(),
71
+ getSenders: vi.fn(),
72
+ removeSender: vi.fn(),
73
+ }) as unknown as AccountWallet;
74
+
75
+ const createMockPXE = () =>
76
+ ({
77
+ getNodeInfo: vi.fn(),
78
+ getPXEInfo: vi.fn(),
79
+ getBlock: vi.fn(),
80
+ getBlocks: vi.fn(),
81
+ getBlockNumber: vi.fn(),
82
+ getProvenBlockNumber: vi.fn(),
83
+ getEpochNumber: vi.fn(),
84
+ getChainId: vi.fn(),
85
+ getVersion: vi.fn(),
86
+ getProtocolContractAddresses: vi.fn(),
87
+ registerContract: vi.fn(),
88
+ registerContractClass: vi.fn(),
89
+ getContracts: vi.fn(),
90
+ getContractInstance: vi.fn(),
91
+ getContractClass: vi.fn(),
92
+ getContract: vi.fn(),
93
+ }) as unknown as PXE;
94
+
95
+ const createMockTransport = () =>
96
+ ({
97
+ send: vi.fn(),
98
+ on: vi.fn(),
99
+ off: vi.fn(),
100
+ }) as unknown as JSONRPCTransport;
101
+
102
+ describe('createAztecWalletNode', () => {
103
+ let wallet: ReturnType<typeof createMockWallet>;
104
+ let pxe: ReturnType<typeof createMockPXE>;
105
+ let transport: ReturnType<typeof createMockTransport>;
106
+ let mockNode: {
107
+ registerMethod: ReturnType<typeof vi.fn>;
108
+ registerSerializer: ReturnType<typeof vi.fn>;
109
+ transport: object;
110
+ context: object;
111
+ methodManager: object;
112
+ eventManager: object;
113
+ requestManager: object;
114
+ middlewareManager: object;
115
+ parameterSerializer: object;
116
+ messageValidator: object;
117
+ requestHandler: object;
118
+ send: ReturnType<typeof vi.fn>;
119
+ on: ReturnType<typeof vi.fn>;
120
+ off: ReturnType<typeof vi.fn>;
121
+ emit: ReturnType<typeof vi.fn>;
122
+ handle: ReturnType<typeof vi.fn>;
123
+ registerMiddleware: ReturnType<typeof vi.fn>;
124
+ removeMiddleware: ReturnType<typeof vi.fn>;
125
+ registerEvent: ReturnType<typeof vi.fn>;
126
+ removeEvent: ReturnType<typeof vi.fn>;
127
+ close: ReturnType<typeof vi.fn>;
128
+ };
129
+ let mockHandlers: Record<string, (ctx: AztecHandlerContext, params: unknown) => Promise<unknown>>;
130
+
131
+ beforeEach(async () => {
132
+ wallet = createMockWallet();
133
+ pxe = createMockPXE();
134
+ transport = createMockTransport();
135
+
136
+ mockNode = {
137
+ registerMethod: vi.fn(),
138
+ registerSerializer: vi.fn(),
139
+ transport: {},
140
+ context: {},
141
+ methodManager: {},
142
+ eventManager: {},
143
+ requestManager: {},
144
+ middlewareManager: {},
145
+ parameterSerializer: {},
146
+ messageValidator: {},
147
+ requestHandler: {},
148
+ send: vi.fn(),
149
+ on: vi.fn(),
150
+ off: vi.fn(),
151
+ emit: vi.fn(),
152
+ handle: vi.fn(),
153
+ registerMiddleware: vi.fn(),
154
+ removeMiddleware: vi.fn(),
155
+ registerEvent: vi.fn(),
156
+ removeEvent: vi.fn(),
157
+ close: vi.fn(),
158
+ };
159
+
160
+ mockHandlers = {
161
+ aztec_getAddress: vi.fn().mockResolvedValue({} as unknown),
162
+ aztec_getCompleteAddress: vi.fn().mockResolvedValue({} as unknown),
163
+ aztec_createAuthWit: vi.fn().mockResolvedValue({} as unknown),
164
+ aztec_sendTx: vi.fn().mockResolvedValue({} as unknown),
165
+ aztec_getTxReceipt: vi.fn().mockResolvedValue({} as unknown),
166
+ aztec_getNodeInfo: vi.fn().mockResolvedValue({} as unknown),
167
+ aztec_getBlockNumber: vi.fn().mockResolvedValue({} as unknown),
168
+ aztec_registerContract: vi.fn().mockResolvedValue({} as unknown),
169
+ aztec_getContracts: vi.fn().mockResolvedValue({} as unknown),
170
+ };
171
+
172
+ // biome-ignore lint/suspicious/noExplicitAny: Mock implementation requires type coercion
173
+ vi.mocked(JSONRPCNode).mockImplementation(() => mockNode as any);
174
+
175
+ // Reset mocks but keep the mock implementations
176
+ vi.clearAllMocks();
177
+
178
+ // Set the return value for createAztecHandlers
179
+ const { createAztecHandlers } = await import('./handlers/index.js');
180
+ // biome-ignore lint/suspicious/noExplicitAny: Mock implementation requires type coercion
181
+ vi.mocked(createAztecHandlers).mockReturnValue(mockHandlers as any);
182
+ });
183
+
184
+ it('should create a JSONRPCNode with transport and context', () => {
185
+ createAztecWalletNode(wallet, pxe, transport);
186
+
187
+ expect(JSONRPCNode).toHaveBeenCalledWith(
188
+ transport,
189
+ expect.objectContaining({
190
+ wallet,
191
+ pxe,
192
+ cache: expect.any(Object),
193
+ }),
194
+ );
195
+ });
196
+
197
+ it('should create ContractArtifactCache with wallet', () => {
198
+ createAztecWalletNode(wallet, pxe, transport);
199
+
200
+ expect(ContractArtifactCache).toHaveBeenCalledWith(wallet);
201
+ });
202
+
203
+ it('should call createAztecHandlers to get all handlers', async () => {
204
+ const { createAztecHandlers } = await import('./handlers/index.js');
205
+
206
+ createAztecWalletNode(wallet, pxe, transport);
207
+
208
+ expect(createAztecHandlers).toHaveBeenCalled();
209
+ });
210
+
211
+ it('should register all handlers from createAztecHandlers', () => {
212
+ createAztecWalletNode(wallet, pxe, transport);
213
+
214
+ // Verify each handler was registered
215
+ const handlerKeys = Object.keys(mockHandlers);
216
+ for (const method of handlerKeys) {
217
+ expect(mockNode.registerMethod).toHaveBeenCalledWith(method, expect.any(Function));
218
+ }
219
+ });
220
+
221
+ it('should bind handlers with the correct context', () => {
222
+ createAztecWalletNode(wallet, pxe, transport);
223
+
224
+ // Get the first registered handler
225
+ const calls = mockNode.registerMethod.mock.calls;
226
+ if (calls && calls.length > 0) {
227
+ const firstCall = calls[0];
228
+ if (firstCall && firstCall.length > 1) {
229
+ const [, registeredHandler] = firstCall;
230
+
231
+ // Call the registered handler with test params
232
+ const testParams = { test: 'value' };
233
+ registeredHandler(testParams);
234
+
235
+ // The handler should have been called with context and params
236
+ // (We can't directly test the binding, but we verify the handler was wrapped)
237
+ expect(typeof registeredHandler).toBe('function');
238
+ }
239
+ }
240
+ });
241
+
242
+ it('should register serializers on the node', async () => {
243
+ const { registerAztecSerializers } = await import('./serializers.js');
244
+
245
+ createAztecWalletNode(wallet, pxe, transport);
246
+
247
+ expect(registerAztecSerializers).toHaveBeenCalledWith(mockNode);
248
+ });
249
+
250
+ it('should return the created node as JSONRPCWallet', () => {
251
+ const result = createAztecWalletNode(wallet, pxe, transport);
252
+
253
+ expect(result).toBe(mockNode);
254
+ });
255
+
256
+ it('should create a properly configured wallet node', async () => {
257
+ const { createAztecHandlers } = await import('./handlers/index.js');
258
+ const { registerAztecSerializers } = await import('./serializers.js');
259
+
260
+ createAztecWalletNode(wallet, pxe, transport);
261
+
262
+ // Verify all components were initialized in correct order
263
+ expect(ContractArtifactCache).toHaveBeenCalledBefore(JSONRPCNode as unknown as ReturnType<typeof vi.fn>);
264
+ expect(JSONRPCNode).toHaveBeenCalledBefore(createAztecHandlers as unknown as ReturnType<typeof vi.fn>);
265
+ expect(createAztecHandlers).toHaveBeenCalledBefore(
266
+ registerAztecSerializers as unknown as ReturnType<typeof vi.fn>,
267
+ );
268
+
269
+ // Verify the context contains all required properties
270
+ expect(JSONRPCNode).toHaveBeenCalledWith(
271
+ transport,
272
+ expect.objectContaining({
273
+ wallet,
274
+ pxe,
275
+ cache: expect.any(Object),
276
+ }),
277
+ );
278
+ });
279
+
280
+ it('should handle handler registration with proper parameter wrapping', async () => {
281
+ const testHandler = vi.fn().mockReturnValue('test-result');
282
+ const testMethod = 'aztec_testMethod';
283
+
284
+ const { createAztecHandlers } = await import('./handlers/index.js');
285
+ const testHandlers = {
286
+ ...mockHandlers,
287
+ [testMethod]: testHandler,
288
+ };
289
+ // biome-ignore lint/suspicious/noExplicitAny: Mock implementation requires type coercion
290
+ vi.mocked(createAztecHandlers).mockReturnValue(testHandlers as any);
291
+
292
+ createAztecWalletNode(wallet, pxe, transport);
293
+
294
+ // Get the registered handler
295
+ const registeredCall = mockNode.registerMethod.mock.calls.find(([method]) => method === testMethod);
296
+ if (!registeredCall) {
297
+ throw new Error(`Method ${testMethod} was not registered`);
298
+ }
299
+ const [, wrappedHandler] = registeredCall;
300
+
301
+ // Call the wrapped handler - JSONRPCNode will pass context and params
302
+ const testParams = { foo: 'bar' };
303
+ const context = { wallet, pxe, cache: expect.any(Object) };
304
+ wrappedHandler(context, testParams);
305
+
306
+ // Verify the original handler was called with context and params
307
+ expect(testHandler).toHaveBeenCalledWith(
308
+ expect.objectContaining({
309
+ wallet,
310
+ pxe,
311
+ cache: expect.any(Object),
312
+ }),
313
+ testParams,
314
+ );
315
+ });
316
+
317
+ it('should create a context that is shared across all handlers', () => {
318
+ createAztecWalletNode(wallet, pxe, transport);
319
+
320
+ // Get all registered handlers
321
+ const registeredHandlers = mockNode.registerMethod.mock.calls;
322
+
323
+ // Create a test to verify they all share the same context
324
+ // This is implicit in the implementation but good to verify
325
+ if (registeredHandlers) {
326
+ expect(registeredHandlers.length).toBeGreaterThan(0);
327
+
328
+ // All handlers should have been registered
329
+ expect(registeredHandlers.length).toBe(Object.keys(mockHandlers).length);
330
+ }
331
+ });
332
+ });
@@ -0,0 +1,120 @@
1
+ /**
2
+ * @module aztec-rpc-wallet/wallet/create-node
3
+ *
4
+ * Factory module for creating Aztec wallet nodes that integrate with the WalletRouter system.
5
+ * This module provides the wallet-side implementation for handling Aztec JSON-RPC requests.
6
+ */
7
+
8
+ import type { AccountWallet, PXE } from '@aztec/aztec.js';
9
+ import { JSONRPCNode, type JSONRPCTransport, type JSONRPCEventMap } from '@walletmesh/jsonrpc';
10
+
11
+ import type { AztecWalletMethodMap } from '../types.js';
12
+ import { ContractArtifactCache } from '../contractArtifactCache.js';
13
+ import { createAztecHandlers, type AztecHandlerContext } from './handlers/index.js';
14
+ import { registerAztecSerializers } from './serializers.js';
15
+
16
+ /**
17
+ * Creates and configures a {@link JSONRPCNode} to serve as an Aztec wallet endpoint.
18
+ * This node is intended to be used on the wallet-side (e.g., in a browser extension
19
+ * or a backend service managing user accounts) and can be connected to a
20
+ * {@link WalletRouter} instance.
21
+ *
22
+ * The created node is equipped with:
23
+ * - Handlers for all Aztec RPC methods defined in {@link AztecWalletMethodMap}.
24
+ * - Serializers for Aztec-specific data types, ensuring correct data exchange
25
+ * over JSON-RPC.
26
+ * - A context ({@link AztecHandlerContext}) providing handlers with access to the
27
+ * necessary {@link AccountWallet}, {@link PXE} client, and a {@link ContractArtifactCache}.
28
+ *
29
+ * @param wallet - An instance of {@link AccountWallet} from `aztec.js`, representing
30
+ * the user's Aztec account and signing capabilities.
31
+ * @param pxe - An instance of {@link PXE} (Private Execution Environment) client from
32
+ * `aztec.js`, used for interacting with the Aztec network (e.g., simulating
33
+ * transactions, getting node info).
34
+ * @param transport - A {@link JSONRPCTransport} instance that the node will use for
35
+ * sending and receiving JSON-RPC messages. This transport typically
36
+ * connects to a corresponding transport on the client/dApp side,
37
+ * often via the {@link WalletRouter}.
38
+ * @returns A fully configured {@link JSONRPCNode} instance, typed with
39
+ * {@link AztecWalletMethodMap} and {@link AztecHandlerContext}, ready to
40
+ * process Aztec wallet requests.
41
+ *
42
+ * @example
43
+ * ```typescript
44
+ * import { createAztecWalletNode } from '@walletmesh/aztec-rpc-wallet';
45
+ * import { WalletRouter, createLocalTransportPair } from '@walletmesh/router';
46
+ * import { MyAccountWallet, MyPXE, MyRouterTransport, MyPermissionManager } from './my-setup'; // User's setup
47
+ *
48
+ * // 1. Initialize Aztec AccountWallet and PXE
49
+ * const accountWallet = new MyAccountWallet();
50
+ * const pxe = new MyPXE();
51
+ *
52
+ * // 2. Create a local transport pair for communication between router and wallet node
53
+ * const [routerSideTransport, walletNodeSideTransport] = createLocalTransportPair();
54
+ *
55
+ * // 3. Create the Aztec Wallet Node
56
+ * const aztecNode = createAztecWalletNode(accountWallet, pxe, walletNodeSideTransport);
57
+ * // aztecNode will start listening for requests on walletNodeSideTransport
58
+ *
59
+ * // 4. Create and configure the WalletRouter
60
+ * const routerTransport = new MyRouterTransport(); // Transport for dApp to router communication
61
+ * const permissionManager = new MyPermissionManager();
62
+ * const router = new WalletRouter(
63
+ * routerTransport,
64
+ * new Map([['aztec:testnet', routerSideTransport]]), // Route 'aztec:testnet' to our node
65
+ * permissionManager
66
+ * );
67
+ *
68
+ * // The system is now set up. DApps can connect to 'routerTransport'
69
+ * // and send requests to 'aztec:testnet', which will be handled by 'aztecNode'.
70
+ * ```
71
+ * @see {@link JSONRPCNode}
72
+ * @see {@link AztecWalletMethodMap}
73
+ * @see {@link AztecHandlerContext}
74
+ * @see {@link createAztecHandlers}
75
+ * @see {@link registerAztecSerializers} (wallet-side version)
76
+ */
77
+ export function createAztecWalletNode(
78
+ wallet: AccountWallet,
79
+ pxe: PXE,
80
+ transport: JSONRPCTransport,
81
+ ): JSONRPCNode<AztecWalletMethodMap, JSONRPCEventMap, AztecHandlerContext> {
82
+ // Initialize the contract artifact cache for this wallet
83
+ const cache = new ContractArtifactCache(wallet);
84
+
85
+ // Create the handler context that will be passed to all method handlers
86
+ // This context provides access to the wallet, PXE, and cache instances
87
+ const context: AztecHandlerContext = { wallet, pxe, cache };
88
+
89
+ // Create the JSON-RPC node with typed method map and handler context
90
+ const node = new JSONRPCNode<AztecWalletMethodMap, JSONRPCEventMap, AztecHandlerContext>(
91
+ transport,
92
+ context,
93
+ );
94
+
95
+ // Register all Aztec method handlers
96
+ // The createAztecHandlers function returns a map of all available Aztec methods
97
+ const handlers = createAztecHandlers();
98
+ for (const [methodStr, handlerFunc] of Object.entries(handlers)) {
99
+ const typedMethodKey = methodStr as keyof AztecWalletMethodMap;
100
+ // Cast the handler to the specific type expected by registerMethod
101
+ // This relies on createAztecHandlers() providing correctly typed handlers
102
+ // for each method string.
103
+ // methodStr is already a string, which is expected by the first param of registerMethod.
104
+ // typedMethodKey is used for strong typing of params and result.
105
+ node.registerMethod(
106
+ methodStr, // Use the string key here
107
+ handlerFunc as (
108
+ context: AztecHandlerContext,
109
+ params: AztecWalletMethodMap[typeof typedMethodKey]['params'],
110
+ ) => Promise<AztecWalletMethodMap[typeof typedMethodKey]['result']>,
111
+ );
112
+ }
113
+
114
+ // Register serializers for all Aztec types
115
+ // This enables proper serialization/deserialization of Aztec objects over JSON-RPC
116
+ registerAztecSerializers(node);
117
+
118
+ // Return the configured node
119
+ return node;
120
+ }
@@ -0,0 +1,172 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { createAccountHandlers } from './account.js';
3
+ import type {
4
+ AccountWallet,
5
+ PXE,
6
+ AztecAddress,
7
+ CompleteAddress,
8
+ AuthWitness,
9
+ FunctionSelector,
10
+ FunctionType,
11
+ } from '@aztec/aztec.js';
12
+ import type { AztecHandlerContext } from './index.js';
13
+ import type { ContractArtifactCache } from '../../contractArtifactCache.js';
14
+ import { Fr } from '@aztec/aztec.js';
15
+
16
+ // Mock dependencies
17
+ const createMockWallet = () =>
18
+ ({
19
+ getAddress: vi.fn(),
20
+ getCompleteAddress: vi.fn(),
21
+ createAuthWit: vi.fn(),
22
+ }) as unknown as AccountWallet;
23
+
24
+ const createMockContext = (wallet: AccountWallet): AztecHandlerContext => ({
25
+ wallet,
26
+ pxe: {} as PXE,
27
+ cache: {} as ContractArtifactCache,
28
+ });
29
+
30
+ describe('Account Handlers', () => {
31
+ let mockWallet: AccountWallet;
32
+ let context: AztecHandlerContext;
33
+ let handlers: ReturnType<typeof createAccountHandlers>;
34
+
35
+ beforeEach(() => {
36
+ mockWallet = createMockWallet();
37
+ context = createMockContext(mockWallet);
38
+ handlers = createAccountHandlers();
39
+ });
40
+
41
+ describe('aztec_getAddress', () => {
42
+ it('should call wallet.getAddress and return the result', async () => {
43
+ const expectedAddress = '0x1234567890abcdef' as unknown as AztecAddress;
44
+ vi.mocked(mockWallet.getAddress).mockResolvedValue(expectedAddress);
45
+
46
+ const result = await handlers.aztec_getAddress(context, []);
47
+
48
+ expect(mockWallet.getAddress).toHaveBeenCalledOnce();
49
+ expect(result).toBe(expectedAddress);
50
+ });
51
+
52
+ it('should propagate errors from wallet.getAddress', async () => {
53
+ const error = new Error('Failed to get address');
54
+ vi.mocked(mockWallet.getAddress).mockRejectedValue(error);
55
+
56
+ await expect(handlers.aztec_getAddress(context, [])).rejects.toThrow('Failed to get address');
57
+ expect(mockWallet.getAddress).toHaveBeenCalledOnce();
58
+ });
59
+ });
60
+
61
+ describe('aztec_getCompleteAddress', () => {
62
+ it('should call wallet.getCompleteAddress and return the result', async () => {
63
+ const expectedCompleteAddress = {
64
+ address: '0x1234567890abcdef' as unknown as AztecAddress,
65
+ publicKeysHash: new Fr(0x123n),
66
+ partialAddress: new Fr(0x456n),
67
+ } as unknown as CompleteAddress;
68
+ vi.mocked(mockWallet.getCompleteAddress).mockResolvedValue(expectedCompleteAddress);
69
+
70
+ const result = await handlers.aztec_getCompleteAddress(context, []);
71
+
72
+ expect(mockWallet.getCompleteAddress).toHaveBeenCalledOnce();
73
+ expect(result).toBe(expectedCompleteAddress);
74
+ });
75
+
76
+ it('should propagate errors from wallet.getCompleteAddress', async () => {
77
+ const error = new Error('Failed to get complete address');
78
+ vi.mocked(mockWallet.getCompleteAddress).mockRejectedValue(error);
79
+
80
+ await expect(handlers.aztec_getCompleteAddress(context, [])).rejects.toThrow(
81
+ 'Failed to get complete address',
82
+ );
83
+ expect(mockWallet.getCompleteAddress).toHaveBeenCalledOnce();
84
+ });
85
+ });
86
+
87
+ describe('aztec_createAuthWit', () => {
88
+ it('should create AuthWit with Fr intent', async () => {
89
+ const frIntent = new Fr(42n);
90
+ const expectedAuthWit = {
91
+ witness: [new Fr(0x123n)],
92
+ predicate: '0xabc' as unknown as AztecAddress,
93
+ } as unknown as AuthWitness;
94
+ vi.mocked(mockWallet.createAuthWit).mockResolvedValue(expectedAuthWit);
95
+
96
+ const result = await handlers.aztec_createAuthWit(context, [frIntent]);
97
+
98
+ expect(mockWallet.createAuthWit).toHaveBeenCalledWith(frIntent);
99
+ expect(result).toBe(expectedAuthWit);
100
+ });
101
+
102
+ it('should create AuthWit with Buffer intent', async () => {
103
+ const bufferIntent = Buffer.from('test intent');
104
+ const expectedAuthWit = {
105
+ witness: [new Fr(0x456n)],
106
+ predicate: '0xdef' as unknown as AztecAddress,
107
+ } as unknown as AuthWitness;
108
+ vi.mocked(mockWallet.createAuthWit).mockResolvedValue(expectedAuthWit);
109
+
110
+ const result = await handlers.aztec_createAuthWit(context, [bufferIntent]);
111
+
112
+ expect(mockWallet.createAuthWit).toHaveBeenCalledWith(bufferIntent);
113
+ expect(result).toBe(expectedAuthWit);
114
+ });
115
+
116
+ it('should create AuthWit with IntentAction intent', async () => {
117
+ const intentAction = {
118
+ caller: '0x0987654321fedcba' as unknown as AztecAddress,
119
+ action: {
120
+ to: '0x1234567890abcdef' as unknown as AztecAddress,
121
+ selector: { toField: () => new Fr(0xabcdefn) } as FunctionSelector,
122
+ args: [new Fr(0x123n), new Fr(0x456n)],
123
+ name: 'transfer',
124
+ type: 'private' as FunctionType,
125
+ isStatic: false,
126
+ returnTypes: [],
127
+ },
128
+ };
129
+ const expectedAuthWit = {
130
+ witness: [new Fr(0x789n)],
131
+ predicate: '0x012' as unknown as AztecAddress,
132
+ } as unknown as AuthWitness;
133
+ vi.mocked(mockWallet.createAuthWit).mockResolvedValue(expectedAuthWit);
134
+
135
+ const result = await handlers.aztec_createAuthWit(context, [intentAction]);
136
+
137
+ expect(mockWallet.createAuthWit).toHaveBeenCalledWith(intentAction);
138
+ expect(result).toBe(expectedAuthWit);
139
+ });
140
+
141
+ it('should create AuthWit with IntentInnerHash intent', async () => {
142
+ const intentInnerHash = {
143
+ innerHash: new Fr(123n),
144
+ consumer: '0x1234567890abcdef' as unknown as AztecAddress,
145
+ };
146
+ const expectedAuthWit = {
147
+ witness: [new Fr(0xabcn)],
148
+ predicate: '0x123' as unknown as AztecAddress,
149
+ } as unknown as AuthWitness;
150
+ vi.mocked(mockWallet.createAuthWit).mockResolvedValue(expectedAuthWit);
151
+
152
+ const result = await handlers.aztec_createAuthWit(context, [intentInnerHash]);
153
+
154
+ expect(mockWallet.createAuthWit).toHaveBeenCalledWith(intentInnerHash);
155
+ expect(result).toBe(expectedAuthWit);
156
+ });
157
+
158
+ it('should propagate errors from wallet.createAuthWit', async () => {
159
+ const error = new Error('Failed to create AuthWit');
160
+ vi.mocked(mockWallet.createAuthWit).mockRejectedValue(error);
161
+
162
+ await expect(handlers.aztec_createAuthWit(context, [new Fr(42n)])).rejects.toThrow(
163
+ 'Failed to create AuthWit',
164
+ );
165
+ expect(mockWallet.createAuthWit).toHaveBeenCalledOnce();
166
+ });
167
+
168
+ it('should handle missing intent parameter', async () => {
169
+ await expect(handlers.aztec_createAuthWit(context, [] as never)).rejects.toThrow();
170
+ });
171
+ });
172
+ });