@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,230 @@
1
+ import type { AztecHandlerContext } from './index.js';
2
+ import type { AztecWalletMethodMap } from '../../types.js';
3
+ import { createLogger } from '@aztec/foundation/log';
4
+
5
+ const logger = createLogger('aztec-rpc-wallet:node');
6
+
7
+ /**
8
+ * A constant array listing all JSON-RPC methods supported by this Aztec wallet implementation.
9
+ * This list is returned by the `wm_getSupportedMethods` RPC call, allowing clients (dApps)
10
+ * to discover the capabilities of the connected wallet node.
11
+ * It should be kept in sync with the methods defined in {@link AztecWalletMethodMap}
12
+ * and implemented by the various handler creation functions.
13
+ *
14
+ * Note: `aztec_createTxExecutionRequest` is intentionally omitted as it's a client-side
15
+ * convenience method in `AztecDappWallet` rather than a direct RPC method handled here.
16
+ * The actual RPC methods for transactions are `aztec_proveTx`, `aztec_sendTx`, etc.,
17
+ * or the higher-level `aztec_wmExecuteTx`.
18
+ */
19
+ const SUPPORTED_AZTEC_METHODS = [
20
+ 'wm_getSupportedMethods',
21
+ 'aztec_getChainId',
22
+ 'aztec_getVersion',
23
+ 'aztec_getNodeInfo',
24
+ 'aztec_getCurrentBaseFees',
25
+ 'aztec_getPXEInfo',
26
+ 'aztec_getBlock',
27
+ 'aztec_getBlockNumber',
28
+ 'aztec_getAddress',
29
+ 'aztec_getCompleteAddress',
30
+ 'aztec_createAuthWit',
31
+ 'aztec_registerSender',
32
+ 'aztec_getSenders',
33
+ 'aztec_removeSender',
34
+ 'aztec_getContracts',
35
+ 'aztec_getContractMetadata',
36
+ 'aztec_getContractClassMetadata',
37
+ 'aztec_registerContract',
38
+ 'aztec_registerContractClass',
39
+ // 'aztec_createTxExecutionRequest', // This is a client-side method, not an RPC method.
40
+ 'aztec_proveTx',
41
+ 'aztec_sendTx',
42
+ 'aztec_getTxReceipt',
43
+ 'aztec_simulateTx',
44
+ 'aztec_profileTx',
45
+ 'aztec_simulateUtility',
46
+ 'aztec_getPrivateEvents',
47
+ 'aztec_getPublicEvents',
48
+ 'aztec_wmExecuteTx',
49
+ 'aztec_wmSimulateTx',
50
+ 'aztec_wmDeployContract',
51
+ ] as const;
52
+
53
+ /**
54
+ * Creates handlers for node and network information-related Aztec wallet JSON-RPC methods.
55
+ * These handlers provide dApps with insights into the connected Aztec node's state,
56
+ * network parameters (like chain ID, version, fees), and block information.
57
+ *
58
+ * Each handler function receives an {@link AztecHandlerContext} which provides access
59
+ * to the {@link AccountWallet} and {@link PXE} client.
60
+ *
61
+ * @returns An object where keys are node-related method names
62
+ * (e.g., "aztec_getNodeInfo", "aztec_getBlockNumber") and values are their
63
+ * corresponding handler functions.
64
+ * @see {@link AztecWalletMethodMap} for method definitions.
65
+ */
66
+ export function createNodeHandlers() {
67
+ return {
68
+ /**
69
+ * Handles the "wm_getSupportedMethods" JSON-RPC method.
70
+ * Returns a list of all JSON-RPC methods supported by this wallet implementation.
71
+ * This allows clients to discover the capabilities of the wallet.
72
+ *
73
+ * @param _ctx - The {@link AztecHandlerContext} (unused for this method).
74
+ * @param _paramsTuple - Parameters for this method (expected to be an empty array).
75
+ * Defined by {@link AztecWalletMethodMap.wm_getSupportedMethods.params}.
76
+ * @returns A promise that resolves to an array of strings, where each string is a
77
+ * supported method name.
78
+ * Type defined by {@link AztecWalletMethodMap.wm_getSupportedMethods.result}.
79
+ * @see {@link SUPPORTED_AZTEC_METHODS}
80
+ */
81
+ wm_getSupportedMethods: async (
82
+ _ctx: AztecHandlerContext,
83
+ _paramsTuple: AztecWalletMethodMap['wm_getSupportedMethods']['params'], // Will be `[]`
84
+ ): Promise<AztecWalletMethodMap['wm_getSupportedMethods']['result']> => {
85
+ logger.debug('[HANDLER] wm_getSupportedMethods');
86
+ return Array.from(SUPPORTED_AZTEC_METHODS);
87
+ },
88
+
89
+ /**
90
+ * Handles the "aztec_getChainId" JSON-RPC method.
91
+ * Retrieves the chain ID of the Aztec network to which the {@link AccountWallet}
92
+ * in the context is connected.
93
+ *
94
+ * @param ctx - The {@link AztecHandlerContext} containing the `wallet` instance.
95
+ * @param _paramsTuple - Parameters for this method (expected to be an empty array).
96
+ * Defined by {@link AztecWalletMethodMap.aztec_getChainId.params}.
97
+ * @returns A promise that resolves to the chain ID as an {@link Fr} (Field element).
98
+ * Type defined by {@link AztecWalletMethodMap.aztec_getChainId.result}.
99
+ */
100
+ aztec_getChainId: async (
101
+ ctx: AztecHandlerContext,
102
+ _paramsTuple: AztecWalletMethodMap['aztec_getChainId']['params'], // Will be `[]`
103
+ ): Promise<AztecWalletMethodMap['aztec_getChainId']['result']> => {
104
+ logger.debug('[HANDLER] aztec_getChainId');
105
+ return ctx.wallet.getChainId();
106
+ },
107
+
108
+ /**
109
+ * Handles the "aztec_getVersion" JSON-RPC method.
110
+ * Retrieves the version of the Aztec software stack, typically the version of the
111
+ * PXE (Private Execution Environment) or the node the wallet is interacting with.
112
+ *
113
+ * @param ctx - The {@link AztecHandlerContext} containing the `wallet` instance.
114
+ * @param _paramsTuple - Parameters for this method (expected to be an empty array).
115
+ * Defined by {@link AztecWalletMethodMap.aztec_getVersion.params}.
116
+ * @returns A promise that resolves to the version as an {@link Fr} (Field element).
117
+ * Type defined by {@link AztecWalletMethodMap.aztec_getVersion.result}.
118
+ */
119
+ aztec_getVersion: async (
120
+ ctx: AztecHandlerContext,
121
+ _paramsTuple: AztecWalletMethodMap['aztec_getVersion']['params'], // Will be `[]`
122
+ ): Promise<AztecWalletMethodMap['aztec_getVersion']['result']> => {
123
+ logger.debug('[HANDLER] aztec_getVersion');
124
+ return ctx.wallet.getVersion();
125
+ },
126
+
127
+ /**
128
+ * Handles the "aztec_getNodeInfo" JSON-RPC method.
129
+ * Retrieves comprehensive information about the connected Aztec node, such as
130
+ * protocol version, chain ID, and addresses of core protocol contracts.
131
+ *
132
+ * @param ctx - The {@link AztecHandlerContext} containing the `wallet` instance.
133
+ * @param _paramsTuple - Parameters for this method (expected to be an empty array).
134
+ * Defined by {@link AztecWalletMethodMap.aztec_getNodeInfo.params}.
135
+ * @returns A promise that resolves to a {@link NodeInfo} object.
136
+ * Type defined by {@link AztecWalletMethodMap.aztec_getNodeInfo.result}.
137
+ */
138
+ aztec_getNodeInfo: async (
139
+ ctx: AztecHandlerContext,
140
+ _paramsTuple: AztecWalletMethodMap['aztec_getNodeInfo']['params'], // Will be `[]`
141
+ ): Promise<AztecWalletMethodMap['aztec_getNodeInfo']['result']> => {
142
+ logger.debug('[HANDLER] aztec_getNodeInfo');
143
+ return await ctx.wallet.getNodeInfo();
144
+ },
145
+
146
+ /**
147
+ * Handles the "aztec_getCurrentBaseFees" JSON-RPC method.
148
+ * Retrieves the current base gas fees applicable on the Aztec network.
149
+ * This information is essential for estimating transaction costs.
150
+ *
151
+ * @param ctx - The {@link AztecHandlerContext} containing the `wallet` instance.
152
+ * @param _paramsTuple - Parameters for this method (expected to be an empty array).
153
+ * Defined by {@link AztecWalletMethodMap.aztec_getCurrentBaseFees.params}.
154
+ * @returns A promise that resolves to a {@link GasFees} object.
155
+ * Type defined by {@link AztecWalletMethodMap.aztec_getCurrentBaseFees.result}.
156
+ */
157
+ aztec_getCurrentBaseFees: async (
158
+ ctx: AztecHandlerContext,
159
+ _paramsTuple: AztecWalletMethodMap['aztec_getCurrentBaseFees']['params'], // Will be `[]`
160
+ ): Promise<AztecWalletMethodMap['aztec_getCurrentBaseFees']['result']> => {
161
+ logger.debug('[HANDLER] aztec_getCurrentBaseFees');
162
+ return await ctx.wallet.getCurrentBaseFees();
163
+ },
164
+
165
+ /**
166
+ * Handles the "aztec_getPXEInfo" JSON-RPC method.
167
+ * Retrieves information about the Private Execution Environment (PXE) service
168
+ * that the wallet is connected to, including its version and core contract addresses.
169
+ *
170
+ * @param ctx - The {@link AztecHandlerContext} containing the `pxe` instance.
171
+ * @param _paramsTuple - Parameters for this method (expected to be an empty array).
172
+ * Defined by {@link AztecWalletMethodMap.aztec_getPXEInfo.params}.
173
+ * @returns A promise that resolves to a {@link PXEInfo} object.
174
+ * Type defined by {@link AztecWalletMethodMap.aztec_getPXEInfo.result}.
175
+ */
176
+ aztec_getPXEInfo: async (
177
+ ctx: AztecHandlerContext,
178
+ _paramsTuple: AztecWalletMethodMap['aztec_getPXEInfo']['params'], // Will be `[]`
179
+ ): Promise<AztecWalletMethodMap['aztec_getPXEInfo']['result']> => {
180
+ logger.debug('[HANDLER] aztec_getPXEInfo');
181
+ return await ctx.pxe.getPXEInfo();
182
+ },
183
+
184
+ /**
185
+ * Handles the "aztec_getBlock" JSON-RPC method.
186
+ * Retrieves a specific L2 block by its number from the connected PXE.
187
+ *
188
+ * @param ctx - The {@link AztecHandlerContext} containing the `pxe` instance.
189
+ * @param paramsTuple - A tuple containing the block number.
190
+ * Defined by {@link AztecWalletMethodMap.aztec_getBlock.params}.
191
+ * @param paramsTuple.0 - The number of the block to retrieve.
192
+ * @returns A promise that resolves to the {@link L2Block} data, or `null` / `undefined`
193
+ * if the block is not found (behavior depends on PXE implementation, typically throws).
194
+ * Type defined by {@link AztecWalletMethodMap.aztec_getBlock.result}.
195
+ * @throws {Error} If the `blockNumber` parameter is missing or invalid, or if the block is not found.
196
+ */
197
+ aztec_getBlock: async (
198
+ ctx: AztecHandlerContext,
199
+ paramsTuple: AztecWalletMethodMap['aztec_getBlock']['params'],
200
+ ): Promise<AztecWalletMethodMap['aztec_getBlock']['result']> => {
201
+ const [blockNumber] = paramsTuple;
202
+ logger.debug(`[HANDLER] aztec_getBlock: blockNumber = ${blockNumber}`);
203
+ if (blockNumber === undefined) {
204
+ // Should be caught by TS if tuple type is `[number]`
205
+ throw new Error('Missing required parameter: number');
206
+ }
207
+ const block = await ctx.pxe.getBlock(blockNumber);
208
+ if (!block) throw new Error('Block not found');
209
+ return block;
210
+ },
211
+
212
+ /**
213
+ * Handles the "aztec_getBlockNumber" JSON-RPC method.
214
+ * Retrieves the current (latest) L2 block number from the connected PXE.
215
+ *
216
+ * @param ctx - The {@link AztecHandlerContext} containing the `pxe` instance.
217
+ * @param _paramsTuple - Parameters for this method (expected to be an empty array).
218
+ * Defined by {@link AztecWalletMethodMap.aztec_getBlockNumber.params}.
219
+ * @returns A promise that resolves to the current block number (a `number`).
220
+ * Type defined by {@link AztecWalletMethodMap.aztec_getBlockNumber.result}.
221
+ */
222
+ aztec_getBlockNumber: async (
223
+ ctx: AztecHandlerContext,
224
+ _paramsTuple: AztecWalletMethodMap['aztec_getBlockNumber']['params'], // Will be `[]`
225
+ ): Promise<AztecWalletMethodMap['aztec_getBlockNumber']['result']> => {
226
+ logger.debug('[HANDLER] aztec_getBlockNumber');
227
+ return await ctx.pxe.getBlockNumber();
228
+ },
229
+ };
230
+ }
@@ -0,0 +1,172 @@
1
+ import { describe, it, expect, vi, beforeEach } from 'vitest';
2
+ import { createSenderHandlers } from './senders.js';
3
+ import type { AccountWallet, PXE, AztecAddress } from '@aztec/aztec.js';
4
+ import type { AztecHandlerContext } from './index.js';
5
+ import type { ContractArtifactCache } from '../../contractArtifactCache.js';
6
+
7
+ // Mock dependencies
8
+ const createMockWallet = () =>
9
+ ({
10
+ registerSender: vi.fn(),
11
+ getSenders: vi.fn(),
12
+ removeSender: vi.fn(),
13
+ }) as unknown as AccountWallet;
14
+
15
+ const createMockPXE = () =>
16
+ ({
17
+ // No specific methods needed for sender handlers
18
+ }) as unknown as PXE;
19
+
20
+ const createMockContext = (wallet: AccountWallet, pxe: PXE): AztecHandlerContext => ({
21
+ wallet,
22
+ pxe,
23
+ cache: {} as ContractArtifactCache,
24
+ });
25
+
26
+ describe('Sender Handlers', () => {
27
+ let mockWallet: AccountWallet;
28
+ let mockPXE: PXE;
29
+ let context: AztecHandlerContext;
30
+ let handlers: ReturnType<typeof createSenderHandlers>;
31
+
32
+ beforeEach(() => {
33
+ mockWallet = createMockWallet();
34
+ mockPXE = createMockPXE();
35
+ context = createMockContext(mockWallet, mockPXE);
36
+ handlers = createSenderHandlers();
37
+ });
38
+
39
+ describe('aztec_registerSender', () => {
40
+ it('should register a sender and return the sender address', async () => {
41
+ const senderAddress = '0x1234567890abcdef' as unknown as AztecAddress;
42
+ vi.mocked(mockWallet.registerSender).mockResolvedValue(senderAddress);
43
+
44
+ const result = await handlers.aztec_registerSender(context, [senderAddress]);
45
+
46
+ expect(mockWallet.registerSender).toHaveBeenCalledWith(senderAddress);
47
+ expect(result).toBe(senderAddress);
48
+ });
49
+
50
+ it('should handle different sender addresses', async () => {
51
+ const senderAddress = '0xabcdef1234567890' as unknown as AztecAddress;
52
+ vi.mocked(mockWallet.registerSender).mockResolvedValue(senderAddress);
53
+
54
+ const result = await handlers.aztec_registerSender(context, [senderAddress]);
55
+
56
+ expect(mockWallet.registerSender).toHaveBeenCalledWith(senderAddress);
57
+ expect(result).toBe(senderAddress);
58
+ });
59
+
60
+ it('should propagate errors from wallet.registerSender', async () => {
61
+ const senderAddress = '0x1234567890abcdef' as unknown as AztecAddress;
62
+ const error = new Error('Failed to register sender');
63
+ vi.mocked(mockWallet.registerSender).mockRejectedValue(error);
64
+
65
+ await expect(handlers.aztec_registerSender(context, [senderAddress])).rejects.toThrow(
66
+ 'Failed to register sender',
67
+ );
68
+ expect(mockWallet.registerSender).toHaveBeenCalledWith(senderAddress);
69
+ });
70
+
71
+ it('should handle missing sender parameter', async () => {
72
+ await expect(handlers.aztec_registerSender(context, [] as never)).rejects.toThrow();
73
+ });
74
+ });
75
+
76
+ describe('aztec_getSenders', () => {
77
+ it('should get all registered senders', async () => {
78
+ const senders = [
79
+ '0x1234567890abcdef' as unknown as AztecAddress,
80
+ '0xabcdef1234567890' as unknown as AztecAddress,
81
+ '0x567890abcdef1234' as unknown as AztecAddress,
82
+ ];
83
+ vi.mocked(mockWallet.getSenders).mockResolvedValue(senders);
84
+
85
+ const result = await handlers.aztec_getSenders(context, []);
86
+
87
+ expect(mockWallet.getSenders).toHaveBeenCalledOnce();
88
+ expect(result).toBe(senders);
89
+ expect(Array.isArray(result)).toBe(true);
90
+ expect(result).toHaveLength(3);
91
+ });
92
+
93
+ it('should handle empty senders list', async () => {
94
+ const senders: AztecAddress[] = [];
95
+ vi.mocked(mockWallet.getSenders).mockResolvedValue(senders);
96
+
97
+ const result = await handlers.aztec_getSenders(context, []);
98
+
99
+ expect(mockWallet.getSenders).toHaveBeenCalledOnce();
100
+ expect(result).toBe(senders);
101
+ expect(Array.isArray(result)).toBe(true);
102
+ expect(result).toHaveLength(0);
103
+ });
104
+
105
+ it('should handle single sender', async () => {
106
+ const senders = ['0x1234567890abcdef' as unknown as AztecAddress];
107
+ vi.mocked(mockWallet.getSenders).mockResolvedValue(senders);
108
+
109
+ const result = await handlers.aztec_getSenders(context, []);
110
+
111
+ expect(mockWallet.getSenders).toHaveBeenCalledOnce();
112
+ expect(result).toBe(senders);
113
+ expect(Array.isArray(result)).toBe(true);
114
+ expect(result).toHaveLength(1);
115
+ expect(result[0]).toBe(senders[0]);
116
+ });
117
+
118
+ it('should propagate errors from wallet.getSenders', async () => {
119
+ const error = new Error('Failed to get senders');
120
+ vi.mocked(mockWallet.getSenders).mockRejectedValue(error);
121
+
122
+ await expect(handlers.aztec_getSenders(context, [])).rejects.toThrow('Failed to get senders');
123
+ expect(mockWallet.getSenders).toHaveBeenCalledOnce();
124
+ });
125
+ });
126
+
127
+ describe('aztec_removeSender', () => {
128
+ it('should remove a sender and return true', async () => {
129
+ const senderAddress = '0x1234567890abcdef' as unknown as AztecAddress;
130
+ vi.mocked(mockWallet.removeSender).mockResolvedValue(undefined);
131
+
132
+ const result = await handlers.aztec_removeSender(context, [senderAddress]);
133
+
134
+ expect(mockWallet.removeSender).toHaveBeenCalledWith(senderAddress);
135
+ expect(result).toBe(true);
136
+ });
137
+
138
+ it('should handle different sender addresses for removal', async () => {
139
+ const senderAddress = '0xabcdef1234567890' as unknown as AztecAddress;
140
+ vi.mocked(mockWallet.removeSender).mockResolvedValue(undefined);
141
+
142
+ const result = await handlers.aztec_removeSender(context, [senderAddress]);
143
+
144
+ expect(mockWallet.removeSender).toHaveBeenCalledWith(senderAddress);
145
+ expect(result).toBe(true);
146
+ });
147
+
148
+ it('should propagate errors from wallet.removeSender', async () => {
149
+ const senderAddress = '0x1234567890abcdef' as unknown as AztecAddress;
150
+ const error = new Error('Failed to remove sender');
151
+ vi.mocked(mockWallet.removeSender).mockRejectedValue(error);
152
+
153
+ await expect(handlers.aztec_removeSender(context, [senderAddress])).rejects.toThrow(
154
+ 'Failed to remove sender',
155
+ );
156
+ expect(mockWallet.removeSender).toHaveBeenCalledWith(senderAddress);
157
+ });
158
+
159
+ it('should handle missing sender parameter', async () => {
160
+ await expect(handlers.aztec_removeSender(context, [] as never)).rejects.toThrow();
161
+ });
162
+
163
+ it('should handle removal of non-existent sender', async () => {
164
+ const senderAddress = '0xnonexistent123456' as unknown as AztecAddress;
165
+ const error = new Error('Sender not found');
166
+ vi.mocked(mockWallet.removeSender).mockRejectedValue(error);
167
+
168
+ await expect(handlers.aztec_removeSender(context, [senderAddress])).rejects.toThrow('Sender not found');
169
+ expect(mockWallet.removeSender).toHaveBeenCalledWith(senderAddress);
170
+ });
171
+ });
172
+ });
@@ -0,0 +1,106 @@
1
+ import type { AztecHandlerContext } from './index.js';
2
+ import type { AztecWalletMethodMap } from '../../types.js';
3
+ import { createLogger } from '@aztec/foundation/log';
4
+
5
+ const logger = createLogger('aztec-rpc-wallet:senders');
6
+
7
+ /**
8
+ * Creates handlers for managing authorized senders in an Aztec wallet via JSON-RPC.
9
+ * Authorized senders are {@link AztecAddress}es permitted to submit transactions
10
+ * on behalf of the user's account. This functionality is crucial for delegation,
11
+ * enabling other accounts or smart contracts to act for the user under controlled conditions.
12
+ *
13
+ * Each handler function receives an {@link AztecHandlerContext}, providing access to the
14
+ * {@link AccountWallet} instance necessary for sender management.
15
+ *
16
+ * @returns An object where keys are sender-related method names
17
+ * (e.g., "aztec_registerSender", "aztec_getSenders", "aztec_removeSender")
18
+ * and values are their corresponding handler functions.
19
+ * @see {@link AztecWalletMethodMap} for method definitions.
20
+ */
21
+ export function createSenderHandlers() {
22
+ return {
23
+ /**
24
+ * Handles the "aztec_registerSender" JSON-RPC method.
25
+ * Registers a new {@link AztecAddress} as an authorized sender for the account
26
+ * managed by the {@link AccountWallet} in the context.
27
+ *
28
+ * This allows the specified sender address to initiate transactions on behalf of the user.
29
+ * Common use cases include:
30
+ * - Delegating transaction submission to a different account.
31
+ * - Authorizing a smart contract to perform actions for the user.
32
+ * - Setting up automated transaction systems or relayers.
33
+ *
34
+ * @param ctx - The {@link AztecHandlerContext} containing the `wallet` instance.
35
+ * @param paramsTuple - A tuple containing the sender's address to register.
36
+ * Defined by {@link AztecWalletMethodMap.aztec_registerSender.params}.
37
+ * @param paramsTuple.0 - The {@link AztecAddress} to authorize as a sender.
38
+ * @returns A promise that resolves to the registered {@link AztecAddress}.
39
+ * Type defined by {@link AztecWalletMethodMap.aztec_registerSender.result}.
40
+ * @throws {Error} If the `sender` parameter is missing or invalid, though type checking
41
+ * and serializer validation should catch this earlier.
42
+ */
43
+ aztec_registerSender: async (
44
+ ctx: AztecHandlerContext,
45
+ paramsTuple: AztecWalletMethodMap['aztec_registerSender']['params'],
46
+ ): Promise<AztecWalletMethodMap['aztec_registerSender']['result']> => {
47
+ const [sender] = paramsTuple;
48
+ logger.debug(`[HANDLER] aztec_registerSender: sender = ${sender?.toString()}`);
49
+ if (!sender || typeof sender.toString !== 'function') {
50
+ // Basic check
51
+ throw new Error('Invalid sender parameter received in tuple');
52
+ }
53
+ return await ctx.wallet.registerSender(sender);
54
+ },
55
+
56
+ /**
57
+ * Handles the "aztec_getSenders" JSON-RPC method.
58
+ * Retrieves a list of all {@link AztecAddress}es currently authorized to send
59
+ * transactions on behalf of the account managed by the {@link AccountWallet} in the context.
60
+ * This is useful for auditing and managing delegation permissions.
61
+ *
62
+ * @param ctx - The {@link AztecHandlerContext} containing the `wallet` instance.
63
+ * @param _paramsTuple - Parameters for this method (expected to be an empty array).
64
+ * Defined by {@link AztecWalletMethodMap.aztec_getSenders.params}.
65
+ * @returns A promise that resolves to an array of authorized {@link AztecAddress}es.
66
+ * Type defined by {@link AztecWalletMethodMap.aztec_getSenders.result}.
67
+ */
68
+ aztec_getSenders: async (
69
+ ctx: AztecHandlerContext,
70
+ _paramsTuple: AztecWalletMethodMap['aztec_getSenders']['params'], // Will be `[]`
71
+ ): Promise<AztecWalletMethodMap['aztec_getSenders']['result']> => {
72
+ logger.debug('[HANDLER] aztec_getSenders');
73
+ return await ctx.wallet.getSenders();
74
+ },
75
+
76
+ /**
77
+ * Handles the "aztec_removeSender" JSON-RPC method.
78
+ * Revokes the authorization for a previously registered sender for the account
79
+ * managed by the {@link AccountWallet} in the context.
80
+ * After successful removal, the specified address will no longer be able to
81
+ * submit transactions on behalf of this wallet.
82
+ *
83
+ * @param ctx - The {@link AztecHandlerContext} containing the `wallet` instance.
84
+ * @param paramsTuple - A tuple containing the sender's address to remove.
85
+ * Defined by {@link AztecWalletMethodMap.aztec_removeSender.params}.
86
+ * @param paramsTuple.0 - The {@link AztecAddress} to remove from the list of authorized senders.
87
+ * @returns A promise that resolves to `true` if the removal was successful.
88
+ * Type defined by {@link AztecWalletMethodMap.aztec_removeSender.result}.
89
+ * @throws {Error} If the `sender` parameter is missing or invalid, though type checking
90
+ * and serializer validation should catch this earlier.
91
+ */
92
+ aztec_removeSender: async (
93
+ ctx: AztecHandlerContext,
94
+ paramsTuple: AztecWalletMethodMap['aztec_removeSender']['params'],
95
+ ): Promise<AztecWalletMethodMap['aztec_removeSender']['result']> => {
96
+ const [sender] = paramsTuple;
97
+ logger.debug(`[HANDLER] aztec_removeSender: sender = ${sender?.toString()}`);
98
+ if (!sender || typeof sender.toString !== 'function') {
99
+ // Basic check
100
+ throw new Error('Invalid sender parameter received in tuple');
101
+ }
102
+ await ctx.wallet.removeSender(sender);
103
+ return true;
104
+ },
105
+ };
106
+ }