@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.
- package/CHANGELOG.md +26 -0
- package/README.md +290 -228
- package/dist/.tsbuildinfo +1 -1
- package/dist/client/aztec-dapp-wallet.d.ts +401 -0
- package/dist/client/aztec-dapp-wallet.d.ts.map +1 -0
- package/dist/client/aztec-dapp-wallet.js +705 -0
- package/dist/client/aztec-router-provider.d.ts +58 -0
- package/dist/client/aztec-router-provider.d.ts.map +1 -0
- package/dist/client/aztec-router-provider.js +62 -0
- package/dist/client/helpers.d.ts +44 -0
- package/dist/client/helpers.d.ts.map +1 -0
- package/dist/client/helpers.js +79 -0
- package/dist/client/register-serializers.d.ts +41 -0
- package/dist/client/register-serializers.d.ts.map +1 -0
- package/dist/client/register-serializers.js +97 -0
- package/dist/contractArtifactCache.d.ts +49 -32
- package/dist/contractArtifactCache.d.ts.map +1 -1
- package/dist/contractArtifactCache.js +47 -34
- package/dist/errors.d.ts +50 -8
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +50 -10
- package/dist/index.d.ts +53 -40
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +52 -17
- package/dist/types.d.ts +345 -268
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +10 -8
- package/dist/wallet/create-node.d.ts +73 -0
- package/dist/wallet/create-node.d.ts.map +1 -0
- package/dist/wallet/create-node.js +99 -0
- package/dist/wallet/handlers/account.d.ts +67 -0
- package/dist/wallet/handlers/account.d.ts.map +1 -0
- package/dist/wallet/handlers/account.js +85 -0
- package/dist/wallet/handlers/contract-interaction.d.ts +77 -0
- package/dist/wallet/handlers/contract-interaction.d.ts.map +1 -0
- package/dist/wallet/handlers/contract-interaction.js +219 -0
- package/dist/wallet/handlers/contract.d.ts +96 -0
- package/dist/wallet/handlers/contract.d.ts.map +1 -0
- package/dist/wallet/handlers/contract.js +146 -0
- package/dist/wallet/handlers/event.d.ts +62 -0
- package/dist/wallet/handlers/event.d.ts.map +1 -0
- package/dist/wallet/handlers/event.js +85 -0
- package/dist/wallet/handlers/index.d.ts +88 -0
- package/dist/wallet/handlers/index.d.ts.map +1 -0
- package/dist/wallet/handlers/index.js +47 -0
- package/dist/wallet/handlers/node.d.ts +117 -0
- package/dist/wallet/handlers/node.d.ts.map +1 -0
- package/dist/wallet/handlers/node.js +196 -0
- package/dist/wallet/handlers/senders.d.ts +70 -0
- package/dist/wallet/handlers/senders.d.ts.map +1 -0
- package/dist/wallet/handlers/senders.js +92 -0
- package/dist/wallet/handlers/transaction.d.ts +123 -0
- package/dist/wallet/handlers/transaction.d.ts.map +1 -0
- package/dist/wallet/handlers/transaction.js +191 -0
- package/dist/wallet/serializers.d.ts +75 -0
- package/dist/wallet/serializers.d.ts.map +1 -0
- package/dist/wallet/serializers.js +501 -0
- package/docs/README.md +290 -229
- package/docs/classes/AztecDappWallet.md +1304 -0
- package/docs/classes/AztecRouterProvider.md +1058 -0
- package/docs/classes/AztecWalletError.md +124 -47
- package/docs/classes/ContractArtifactCache.md +48 -31
- package/docs/functions/connectAztec.md +62 -0
- package/docs/functions/createAztecWallet.md +46 -0
- package/docs/functions/createAztecWalletNode.md +96 -0
- package/docs/functions/registerAztecSerializers.md +61 -0
- package/docs/functions/registerWalletAztecSerializers.md +39 -0
- package/docs/globals.md +16 -14
- package/docs/interfaces/AztecHandlerContext.md +54 -0
- package/docs/interfaces/AztecWalletContext.md +50 -0
- package/docs/interfaces/AztecWalletMethodMap.md +471 -470
- package/docs/type-aliases/AztecChainId.md +16 -3
- package/docs/variables/ALL_AZTEC_METHODS.md +20 -0
- package/docs/variables/AztecWalletErrorMap.md +9 -4
- package/docs/variables/AztecWalletSerializer.md +45 -0
- package/package.json +9 -9
- package/src/client/aztec-dapp-wallet.test.ts +628 -0
- package/src/client/aztec-dapp-wallet.ts +879 -0
- package/src/client/aztec-router-provider.test.ts +235 -0
- package/src/client/aztec-router-provider.ts +64 -0
- package/src/client/helpers.test.ts +187 -0
- package/src/client/helpers.ts +91 -0
- package/src/client/register-serializers.ts +108 -0
- package/src/contractArtifactCache.test.ts +21 -10
- package/src/contractArtifactCache.ts +54 -35
- package/src/errors.ts +58 -10
- package/src/index.test.ts +2 -6
- package/src/index.ts +73 -37
- package/src/types.ts +379 -217
- package/src/wallet/create-node.test.ts +332 -0
- package/src/wallet/create-node.ts +120 -0
- package/src/wallet/handlers/account.test.ts +172 -0
- package/src/wallet/handlers/account.ts +99 -0
- package/src/wallet/handlers/contract-interaction.test.ts +248 -0
- package/src/wallet/handlers/contract-interaction.ts +269 -0
- package/src/wallet/handlers/contract.test.ts +245 -0
- package/src/wallet/handlers/contract.ts +174 -0
- package/src/wallet/handlers/event.test.ts +216 -0
- package/src/wallet/handlers/event.ts +99 -0
- package/src/wallet/handlers/index.ts +84 -0
- package/src/wallet/handlers/node.test.ts +304 -0
- package/src/wallet/handlers/node.ts +230 -0
- package/src/wallet/handlers/senders.test.ts +172 -0
- package/src/wallet/handlers/senders.ts +106 -0
- package/src/wallet/handlers/transaction.test.ts +371 -0
- package/src/wallet/handlers/transaction.ts +239 -0
- package/src/wallet/serializers.test.ts +253 -0
- package/src/wallet/serializers.ts +586 -0
- package/typedoc.json +23 -1
- package/dist/aztecRemoteWallet.d.ts +0 -70
- package/dist/aztecRemoteWallet.d.ts.map +0 -1
- package/dist/aztecRemoteWallet.js +0 -335
- package/dist/chainProvider.d.ts +0 -56
- package/dist/chainProvider.d.ts.map +0 -1
- package/dist/chainProvider.js +0 -98
- package/dist/handlers/aztecAccountWallet.d.ts +0 -4
- package/dist/handlers/aztecAccountWallet.d.ts.map +0 -1
- package/dist/handlers/aztecAccountWallet.js +0 -296
- package/dist/handlers/transactions.d.ts +0 -21
- package/dist/handlers/transactions.d.ts.map +0 -1
- package/dist/handlers/transactions.js +0 -98
- package/dist/handlers.d.ts +0 -27
- package/dist/handlers.d.ts.map +0 -1
- package/dist/handlers.js +0 -55
- package/dist/provider.d.ts +0 -105
- package/dist/provider.d.ts.map +0 -1
- package/dist/provider.js +0 -160
- package/dist/serializers/account.d.ts +0 -164
- package/dist/serializers/account.d.ts.map +0 -1
- package/dist/serializers/account.js +0 -244
- package/dist/serializers/contract.d.ts +0 -62
- package/dist/serializers/contract.d.ts.map +0 -1
- package/dist/serializers/contract.js +0 -130
- package/dist/serializers/index.d.ts +0 -21
- package/dist/serializers/index.d.ts.map +0 -1
- package/dist/serializers/index.js +0 -154
- package/dist/serializers/log.d.ts +0 -66
- package/dist/serializers/log.d.ts.map +0 -1
- package/dist/serializers/log.js +0 -222
- package/dist/serializers/note.d.ts +0 -124
- package/dist/serializers/note.d.ts.map +0 -1
- package/dist/serializers/note.js +0 -208
- package/dist/serializers/transaction.d.ts +0 -99
- package/dist/serializers/transaction.d.ts.map +0 -1
- package/dist/serializers/transaction.js +0 -275
- package/dist/wallet.d.ts +0 -62
- package/dist/wallet.d.ts.map +0 -1
- package/dist/wallet.js +0 -77
- package/docs/classes/AztecChainProvider.md +0 -553
- package/docs/classes/AztecChainWallet.md +0 -409
- package/docs/classes/AztecProvider.md +0 -1112
- package/docs/interfaces/AztecWalletBaseMethodMap.md +0 -135
- package/docs/interfaces/AztecWalletEventMap.md +0 -17
- package/docs/type-aliases/AztecChainWalletMiddleware.md +0 -13
- package/docs/type-aliases/AztecWalletContext.md +0 -29
- package/docs/type-aliases/AztecWalletMethodHandler.md +0 -37
- package/docs/type-aliases/AztecWalletMiddleware.md +0 -13
- package/docs/type-aliases/AztecWalletRouterClient.md +0 -13
- package/docs/type-aliases/TransactionFunctionCall.md +0 -33
- package/docs/type-aliases/TransactionParams.md +0 -27
- package/src/aztecRemoteWallet.test.ts +0 -504
- package/src/aztecRemoteWallet.ts +0 -467
- package/src/chainProvider.test.ts +0 -401
- package/src/chainProvider.ts +0 -116
- package/src/handlers/aztecAccountWallet.test.ts +0 -649
- package/src/handlers/aztecAccountWallet.ts +0 -532
- package/src/handlers/transactions.ts +0 -124
- package/src/handlers.test.ts +0 -270
- package/src/handlers.ts +0 -70
- package/src/provider.test.ts +0 -274
- package/src/provider.ts +0 -189
- package/src/serializers/account.test.ts +0 -125
- package/src/serializers/account.ts +0 -301
- package/src/serializers/contract.test.ts +0 -24
- package/src/serializers/contract.ts +0 -183
- package/src/serializers/index.test.ts +0 -136
- package/src/serializers/index.ts +0 -191
- package/src/serializers/log.test.ts +0 -286
- package/src/serializers/log.ts +0 -292
- package/src/serializers/note.test.ts +0 -125
- package/src/serializers/note.ts +0 -250
- package/src/serializers/transaction.test.ts +0 -320
- package/src/serializers/transaction.ts +0 -409
- package/src/wallet.test.ts +0 -275
- 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
|
+
});
|