@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,501 @@
1
+ /**
2
+ * @module @walletmesh/aztec-rpc-wallet/wallet/serializers
3
+ *
4
+ * This module provides the primary JSON-RPC serializer (`AztecWalletSerializer`)
5
+ * for handling Aztec-specific data types over JSON-RPC. It leverages Zod schemas
6
+ * from `@aztec/foundation/schemas` and `@aztec/aztec.js` for robust serialization
7
+ * and deserialization of parameters and results for all Aztec wallet methods.
8
+ *
9
+ * It also includes a helper function `registerAztecSerializers` for applying these
10
+ * serializers to a `JSONRPCNode` instance, typically used on the wallet-side
11
+ * implementation (e.g., in `createAztecWalletNode`).
12
+ *
13
+ * The serialization strategy involves:
14
+ * - Using Aztec's `jsonStringify` and `jsonParseWithSchema` for types that have
15
+ * corresponding Zod schemas.
16
+ * - Custom logic for arrays of specific types (e.g., `AztecAddress[]`).
17
+ * - A fallback serializer for parameters and results not explicitly covered.
18
+ * - Detailed parameter deserialization logic within `AztecWalletSerializer.params.deserialize`
19
+ * to reconstruct complex Aztec objects from their JSON representations.
20
+ */
21
+ import { JSONRPCError } from '@walletmesh/jsonrpc';
22
+ import { AztecAddress, CompleteAddress, TxExecutionRequest, Fr, Tx, TxHash, AuthWitness, } from '@aztec/aztec.js';
23
+ import { AbiTypeSchema, ContractArtifactSchema, FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
24
+ import { schemas } from '@aztec/stdlib/schemas';
25
+ import { ContractClassWithIdSchema, ContractInstanceWithAddressSchema, NodeInfoSchema, ProtocolContractAddressesSchema, } from '@aztec/stdlib/contract';
26
+ import { GasFees } from '@aztec/stdlib/gas';
27
+ import { L2Block } from '@aztec/stdlib/block';
28
+ import { Capsule, HashedValues, PrivateExecutionResult, TxProfileResult, TxProvingResult, TxReceipt, TxSimulationResult, UtilitySimulationResult, } from '@aztec/stdlib/tx';
29
+ import { jsonStringify, jsonParseWithSchema } from '@aztec/foundation/json-rpc';
30
+ import { createLogger } from '@aztec/foundation/log';
31
+ import { z } from 'zod';
32
+ // These aren't exported by @aztec/stdlib/interfaces/client, we've copied them here
33
+ const ContractMetadataSchema = z.object({
34
+ contractInstance: z.union([ContractInstanceWithAddressSchema, z.undefined()]),
35
+ isContractInitialized: z.boolean(),
36
+ isContractPubliclyDeployed: z.boolean(),
37
+ });
38
+ const ContractClassMetadataSchema = z.object({
39
+ contractClass: z.union([ContractClassWithIdSchema, z.undefined()]),
40
+ isContractClassPubliclyRegistered: z.boolean(),
41
+ artifact: z.union([ContractArtifactSchema, z.undefined()]),
42
+ });
43
+ const PXEInfoSchema = z.object({
44
+ pxeVersion: z.string(),
45
+ protocolContractAddresses: ProtocolContractAddressesSchema,
46
+ });
47
+ const EventMetadataDefinitionSchema = z.object({
48
+ eventSelector: schemas.EventSelector,
49
+ abiType: AbiTypeSchema,
50
+ fieldNames: z.array(z.string()),
51
+ });
52
+ // Schema for FunctionCall (since it doesn't have one in the Aztec codebase)
53
+ const FunctionCallSchema = z.object({
54
+ name: z.string(),
55
+ to: schemas.AztecAddress,
56
+ selector: FunctionSelector.schema,
57
+ type: z.nativeEnum(FunctionType),
58
+ isStatic: z.boolean(),
59
+ args: z.array(schemas.Fr),
60
+ returnTypes: z.array(AbiTypeSchema),
61
+ });
62
+ // Schema for ExecutionPayload
63
+ const ExecutionPayloadSchema = z.object({
64
+ calls: z.array(FunctionCallSchema),
65
+ authWitnesses: z.array(AuthWitness.schema),
66
+ capsules: z.array(Capsule.schema),
67
+ extraHashedArgs: z.array(HashedValues.schema).default([]),
68
+ });
69
+ // Schema for DeployContractParams
70
+ const DeployContractParamsSchema = z.object({
71
+ artifact: ContractArtifactSchema,
72
+ args: z.array(z.any()),
73
+ constructorName: z.string().optional(),
74
+ });
75
+ const DeployContractResultSchema = z.object({
76
+ txHash: TxHash.schema,
77
+ contractAddress: AztecAddress.schema,
78
+ });
79
+ const logger = createLogger('aztec-rpc-wallet:serializers');
80
+ function createResultSerializer(resultSchema) {
81
+ return {
82
+ result: {
83
+ serialize: async (method, value) => ({ method, serialized: jsonStringify(value) }),
84
+ deserialize: async (method, data) => {
85
+ if (resultSchema) {
86
+ return await jsonParseWithSchema(data.serialized, resultSchema);
87
+ }
88
+ // If no schema is provided, parse as JSON
89
+ logger.debug(`Deserializing result for method without schema: ${method}`);
90
+ return JSON.parse(data.serialized);
91
+ },
92
+ },
93
+ };
94
+ }
95
+ const RESULT_SERIALIZERS = {
96
+ aztec_getAddress: createResultSerializer(AztecAddress.schema),
97
+ aztec_getCompleteAddress: createResultSerializer(CompleteAddress.schema),
98
+ aztec_getChainId: createResultSerializer(Fr.schema),
99
+ aztec_getVersion: createResultSerializer(Fr.schema),
100
+ aztec_getBlockNumber: createResultSerializer(),
101
+ aztec_getProvenBlockNumber: createResultSerializer(),
102
+ aztec_getSenders: {
103
+ result: {
104
+ serialize: async (_m, v) => ({
105
+ method: _m,
106
+ serialized: jsonStringify(v.map((a) => a.toString())),
107
+ }),
108
+ deserialize: async (_m, d) => JSON.parse(d.serialized).map((s) => AztecAddress.fromString(s)),
109
+ },
110
+ },
111
+ aztec_getContracts: {
112
+ result: {
113
+ serialize: async (_m, v) => ({
114
+ method: _m,
115
+ serialized: jsonStringify(v.map((a) => a.toString())),
116
+ }),
117
+ deserialize: async (_m, d) => JSON.parse(d.serialized).map((s) => AztecAddress.fromString(s)),
118
+ },
119
+ },
120
+ aztec_registerSender: createResultSerializer(AztecAddress.schema),
121
+ aztec_removeSender: createResultSerializer(),
122
+ aztec_registerContract: createResultSerializer(),
123
+ aztec_registerContractClass: createResultSerializer(),
124
+ aztec_createAuthWit: createResultSerializer(AuthWitness.schema),
125
+ aztec_profileTx: createResultSerializer(TxProfileResult.schema),
126
+ aztec_simulateUtility: createResultSerializer(UtilitySimulationResult.schema),
127
+ aztec_proveTx: createResultSerializer(TxProvingResult.schema),
128
+ aztec_sendTx: createResultSerializer(TxHash.schema),
129
+ aztec_getTxReceipt: createResultSerializer(TxReceipt.schema),
130
+ aztec_simulateTx: createResultSerializer(TxSimulationResult.schema),
131
+ aztec_getNodeInfo: createResultSerializer(NodeInfoSchema),
132
+ aztec_getPXEInfo: createResultSerializer(PXEInfoSchema),
133
+ aztec_getCurrentBaseFees: createResultSerializer(GasFees.schema),
134
+ aztec_getBlock: createResultSerializer(L2Block.schema.optional()),
135
+ aztec_getContractMetadata: createResultSerializer(ContractMetadataSchema),
136
+ aztec_getContractClassMetadata: createResultSerializer(ContractClassMetadataSchema),
137
+ aztec_getPrivateEvents: {
138
+ result: {
139
+ serialize: async (m, v) => ({ method: m, serialized: jsonStringify(v) }),
140
+ deserialize: async (_, d) => JSON.parse(d.serialized),
141
+ },
142
+ },
143
+ aztec_getPublicEvents: {
144
+ result: {
145
+ serialize: async (m, v) => ({ method: m, serialized: jsonStringify(v) }),
146
+ deserialize: async (_, d) => JSON.parse(d.serialized),
147
+ },
148
+ },
149
+ aztec_wmExecuteTx: createResultSerializer(TxHash.schema),
150
+ aztec_wmSimulateTx: createResultSerializer(TxSimulationResult.schema),
151
+ aztec_wmDeployContract: createResultSerializer(DeployContractResultSchema),
152
+ wm_getSupportedMethods: {
153
+ result: {
154
+ serialize: async (m, v) => ({ method: m, serialized: jsonStringify(v) }),
155
+ deserialize: async (_, d) => JSON.parse(d.serialized),
156
+ },
157
+ },
158
+ };
159
+ async function createFallbackSerializer(method, value) {
160
+ try {
161
+ return { method, serialized: jsonStringify(value) };
162
+ }
163
+ catch (error) {
164
+ return {
165
+ method,
166
+ serialized: JSON.stringify({
167
+ error: 'Serialization failed',
168
+ message: error instanceof Error ? error.message : String(error),
169
+ }),
170
+ };
171
+ }
172
+ }
173
+ /**
174
+ * A comprehensive {@link JSONRPCSerializer} for all Aztec wallet methods.
175
+ *
176
+ * This serializer handles both parameters and results:
177
+ *
178
+ * **Parameters (`params`):**
179
+ * - `serialize`: Currently uses a fallback mechanism (`createFallbackSerializer`) which
180
+ * stringifies parameters using `jsonStringify`. This assumes the client-side
181
+ * (e.g., {@link AztecDappWallet} via {@link AztecRouterProvider}) sends parameters
182
+ * already in a format that can be processed by the `deserialize` logic after
183
+ * basic JSON parsing.
184
+ * - `deserialize`: Contains detailed, method-specific logic to parse the JSON string
185
+ * of incoming parameters and reconstruct them into their correct Aztec types
186
+ * (e.g., `AztecAddress.fromString`, `TxExecutionRequest.schema.parse`). It uses
187
+ * Zod schemas and helper functions (`ensureParam`, `getOptionalParam`) for
188
+ * validation and type conversion.
189
+ *
190
+ * **Results (`result`):**
191
+ * - `serialize`: For each method, it attempts to use a specific serializer defined in
192
+ * `RESULT_SERIALIZERS`. These typically use `jsonStringify` with a Zod schema
193
+ * for the specific result type (e.g., `AztecAddress.schema`, `TxHash.schema`).
194
+ * If no specific serializer is found, it uses `createFallbackSerializer`.
195
+ * - `deserialize`: Similar to result serialization, it uses `RESULT_SERIALIZERS`
196
+ * to find a method-specific deserializer, often employing `jsonParseWithSchema`
197
+ * with the appropriate Zod schema. If no specific deserializer exists, it may
198
+ * return the raw data or attempt a simple JSON parse.
199
+ *
200
+ * This serializer is crucial for ensuring that complex Aztec objects maintain their
201
+ * type integrity and structure when transmitted over JSON-RPC.
202
+ *
203
+ * @see {@link AztecWalletMethodMap} for the definitions of methods, params, and results.
204
+ * @see {@link JSONRPCSerializer} for the interface it implements.
205
+ */
206
+ export const AztecWalletSerializer = {
207
+ params: {
208
+ serialize: async (method, value) => {
209
+ logger.debug(`Serializing params for method: ${method} (current fallback)`, value);
210
+ return createFallbackSerializer(method, value);
211
+ },
212
+ deserialize: async (method, data) => {
213
+ logger.debug(`Deserializing params for method: ${method}, data: ${data.serialized.substring(0, 100)}...`);
214
+ const dAppParams = JSON.parse(data.serialized);
215
+ // Helper function to validate types using string literals
216
+ const validateType = (val, expectedType) => {
217
+ switch (expectedType) {
218
+ case 'string':
219
+ return typeof val === 'string';
220
+ case 'number':
221
+ return typeof val === 'number';
222
+ case 'boolean':
223
+ return typeof val === 'boolean';
224
+ case 'object':
225
+ return typeof val === 'object';
226
+ case 'function':
227
+ return typeof val === 'function';
228
+ case 'undefined':
229
+ return typeof val === 'undefined';
230
+ default:
231
+ return true; // If unknown type is specified, don't validate
232
+ }
233
+ };
234
+ const ensureParam = (obj, key, type) => {
235
+ if (!(key in obj)) {
236
+ throw new JSONRPCError(-32602, `Invalid params for ${method}: Missing required parameter '${key}'.`);
237
+ }
238
+ const val = obj[key];
239
+ if (type && !validateType(val, type)) {
240
+ throw new JSONRPCError(-32602, `Invalid params for ${method}: Parameter '${key}' has wrong type. Expected ${type}, got ${typeof val}.`);
241
+ }
242
+ return val;
243
+ };
244
+ const getOptionalParam = (obj, key, type) => {
245
+ if (key in obj && obj[key] !== undefined) {
246
+ const val = obj[key];
247
+ if (type && !validateType(val, type)) {
248
+ throw new JSONRPCError(-32602, `Invalid params for ${method}: Parameter '${key}' has wrong type. Expected ${type}, got ${typeof val}.`);
249
+ }
250
+ return val;
251
+ }
252
+ return undefined;
253
+ };
254
+ switch (method) {
255
+ case 'aztec_getBlock': {
256
+ const blockNum = ensureParam(dAppParams, 'number', 'number');
257
+ return [blockNum];
258
+ }
259
+ case 'aztec_getBlockNumber':
260
+ case 'aztec_getChainId':
261
+ case 'aztec_getVersion':
262
+ case 'aztec_getNodeInfo':
263
+ case 'aztec_getProvenBlockNumber':
264
+ case 'aztec_getPXEInfo':
265
+ case 'aztec_getCurrentBaseFees':
266
+ case 'aztec_getAddress':
267
+ case 'aztec_getCompleteAddress':
268
+ case 'aztec_getSenders':
269
+ case 'aztec_getContracts':
270
+ return [];
271
+ case 'aztec_createAuthWit': {
272
+ const intentRaw = ensureParam(dAppParams, 'intent');
273
+ let intentInput;
274
+ if (typeof intentRaw === 'string' &&
275
+ (intentRaw.startsWith('0x') || !Number.isNaN(Number(intentRaw)))) {
276
+ intentInput = Fr.fromString(intentRaw);
277
+ }
278
+ else if (intentRaw instanceof Buffer) {
279
+ intentInput = intentRaw;
280
+ }
281
+ else if (typeof intentRaw === 'object' && intentRaw !== null) {
282
+ intentInput = intentRaw;
283
+ }
284
+ else {
285
+ throw new JSONRPCError(-32602, `Invalid 'intent' parameter type for ${method}.`);
286
+ }
287
+ return [intentInput];
288
+ }
289
+ case 'aztec_registerSender':
290
+ case 'aztec_removeSender': {
291
+ const senderStr = ensureParam(dAppParams, 'sender', 'string');
292
+ const sender = AztecAddress.fromString(senderStr);
293
+ return [sender];
294
+ }
295
+ case 'aztec_getContractMetadata': {
296
+ const addressStr = ensureParam(dAppParams, 'address', 'string');
297
+ const address = AztecAddress.fromString(addressStr);
298
+ return [address];
299
+ }
300
+ case 'aztec_getContractClassMetadata': {
301
+ const idStr = ensureParam(dAppParams, 'id', 'string');
302
+ const id = Fr.fromString(idStr);
303
+ const includeArtifact = getOptionalParam(dAppParams, 'includeArtifact', 'boolean');
304
+ return [id, includeArtifact];
305
+ }
306
+ case 'aztec_registerContract': {
307
+ const instanceRaw = ensureParam(dAppParams, 'instance');
308
+ const artifactRaw = getOptionalParam(dAppParams, 'artifact');
309
+ const instance = ContractInstanceWithAddressSchema.parse(instanceRaw);
310
+ const artifact = artifactRaw ? ContractArtifactSchema.parse(artifactRaw) : undefined;
311
+ return [instance, artifact];
312
+ }
313
+ case 'aztec_registerContractClass': {
314
+ const artifactRaw = ensureParam(dAppParams, 'artifact');
315
+ const artifact = ContractArtifactSchema.parse(artifactRaw);
316
+ return [artifact];
317
+ }
318
+ case 'aztec_proveTx': {
319
+ const txRequestRaw = ensureParam(dAppParams, 'txRequest');
320
+ // Ensure txRequestRaw is a valid TxExecutionRequest
321
+ // Use getOptionalParam for privateExecutionResult
322
+ const privateExecutionResultRaw = getOptionalParam(dAppParams, 'privateExecutionResult');
323
+ const txRequest = TxExecutionRequest.schema.parse(txRequestRaw);
324
+ // Conditionally parse if privateExecutionResultRaw is present
325
+ const privateExecutionResult = privateExecutionResultRaw
326
+ ? PrivateExecutionResult.schema.parse(privateExecutionResultRaw)
327
+ : undefined;
328
+ return [txRequest, privateExecutionResult];
329
+ }
330
+ case 'aztec_sendTx': {
331
+ const txRaw = ensureParam(dAppParams, 'tx');
332
+ const tx = Tx.schema.parse(txRaw);
333
+ return [tx];
334
+ }
335
+ case 'aztec_getTxReceipt': {
336
+ const txHashStr = ensureParam(dAppParams, 'txHash', 'string');
337
+ const txHash = TxHash.fromString(txHashStr);
338
+ return [txHash];
339
+ }
340
+ case 'aztec_simulateTx': {
341
+ const txRequestRaw = ensureParam(dAppParams, 'txRequest');
342
+ const txRequest = TxExecutionRequest.schema.parse(txRequestRaw);
343
+ const simulatePublic = getOptionalParam(dAppParams, 'simulatePublic', 'boolean');
344
+ const msgSenderStr = getOptionalParam(dAppParams, 'msgSender', 'string');
345
+ const msgSender = msgSenderStr ? AztecAddress.fromString(msgSenderStr) : undefined;
346
+ const skipTxValidation = getOptionalParam(dAppParams, 'skipTxValidation', 'boolean');
347
+ const skipFeeEnforcement = getOptionalParam(dAppParams, 'skipFeeEnforcement', 'boolean');
348
+ const scopesRaw = getOptionalParam(dAppParams, 'scopes');
349
+ const scopes = scopesRaw?.map((s) => AztecAddress.fromString(s));
350
+ return [txRequest, simulatePublic, msgSender, skipTxValidation, skipFeeEnforcement, scopes];
351
+ }
352
+ case 'aztec_profileTx': {
353
+ const txRequestRaw = ensureParam(dAppParams, 'txRequest');
354
+ const txRequest = TxExecutionRequest.schema.parse(txRequestRaw);
355
+ const profileMode = getOptionalParam(dAppParams, 'profileMode', 'string');
356
+ const skipProofGeneration = getOptionalParam(dAppParams, 'skipProofGeneration', 'boolean');
357
+ const msgSenderStr = getOptionalParam(dAppParams, 'msgSender', 'string');
358
+ const msgSender = msgSenderStr ? AztecAddress.fromString(msgSenderStr) : undefined;
359
+ return [txRequest, profileMode, skipProofGeneration, msgSender];
360
+ }
361
+ case 'aztec_simulateUtility': {
362
+ const functionName = ensureParam(dAppParams, 'functionName', 'string');
363
+ const args = ensureParam(dAppParams, 'args');
364
+ const toStr = ensureParam(dAppParams, 'to', 'string');
365
+ const to = AztecAddress.fromString(toStr);
366
+ const authWitsRaw = getOptionalParam(dAppParams, 'authWits');
367
+ const authWits = authWitsRaw?.map((aw) => AuthWitness.schema.parse(aw)); // Use AuthWitness from @aztec/aztec.js
368
+ const fromStr = getOptionalParam(dAppParams, 'from', 'string');
369
+ const from = fromStr ? AztecAddress.fromString(fromStr) : undefined;
370
+ return [functionName, args, to, authWits, from];
371
+ }
372
+ case 'aztec_getPrivateEvents': {
373
+ const contractAddressStr = ensureParam(dAppParams, 'contractAddress', 'string');
374
+ const contractAddress = AztecAddress.fromString(contractAddressStr);
375
+ const eventMetadataRaw = ensureParam(dAppParams, 'eventMetadata');
376
+ const eventMetadata = jsonParseWithSchema(eventMetadataRaw, EventMetadataDefinitionSchema);
377
+ const fromBlock = ensureParam(dAppParams, 'from', 'number');
378
+ const numBlocks = ensureParam(dAppParams, 'numBlocks', 'number');
379
+ const recipientsRaw = ensureParam(dAppParams, 'recipients');
380
+ const recipients = recipientsRaw.map((r) => AztecAddress.fromString(r));
381
+ return [contractAddress, eventMetadata, fromBlock, numBlocks, recipients];
382
+ }
383
+ case 'aztec_getPublicEvents': {
384
+ const eventMetadataRaw = ensureParam(dAppParams, 'eventMetadata');
385
+ const eventMetadata = jsonParseWithSchema(eventMetadataRaw, EventMetadataDefinitionSchema);
386
+ const fromBlock = ensureParam(dAppParams, 'from', 'number');
387
+ const limit = ensureParam(dAppParams, 'limit', 'number');
388
+ return [eventMetadata, fromBlock, limit];
389
+ }
390
+ case 'aztec_wmExecuteTx': {
391
+ const executionPayloadRaw = ensureParam(dAppParams, 'executionPayload');
392
+ const executionPayload = ExecutionPayloadSchema.parse(executionPayloadRaw);
393
+ return [executionPayload];
394
+ }
395
+ case 'aztec_wmSimulateTx': {
396
+ const executionPayloadRaw = ensureParam(dAppParams, 'executionPayload');
397
+ const executionPayload = ExecutionPayloadSchema.parse(executionPayloadRaw);
398
+ return [executionPayload];
399
+ }
400
+ case 'aztec_wmDeployContract': {
401
+ const deployParams = DeployContractParamsSchema.parse(dAppParams);
402
+ return [deployParams];
403
+ }
404
+ case 'wm_getSupportedMethods':
405
+ return [];
406
+ default:
407
+ logger.error(`Unhandled method in params.deserialize: ${method}`);
408
+ throw new JSONRPCError(-32601, `Method not found or not supported by serializer: ${method}`);
409
+ }
410
+ },
411
+ },
412
+ result: {
413
+ serialize: async (method, value) => {
414
+ const serializer = RESULT_SERIALIZERS[method];
415
+ if (serializer?.result) {
416
+ try {
417
+ const typedValue = value;
418
+ const serialized = await serializer.result.serialize(method, typedValue);
419
+ return serialized;
420
+ }
421
+ catch (error) {
422
+ logger.error(`Failed to serialize result for ${method}:`, error);
423
+ throw new Error(`Failed to serialize result for ${method}: ${error}`);
424
+ }
425
+ }
426
+ logger.debug(`Using fallback serializer for result of method: ${method}`);
427
+ return createFallbackSerializer(method, value);
428
+ },
429
+ deserialize: async (method, data) => {
430
+ const serializer = RESULT_SERIALIZERS[method];
431
+ if (serializer?.result) {
432
+ try {
433
+ return await serializer.result.deserialize(method, data);
434
+ }
435
+ catch (error) {
436
+ logger.error(`Failed to deserialize result for ${method}:`, error);
437
+ throw new Error(`Failed to deserialize result for ${method}: ${error}`);
438
+ }
439
+ }
440
+ logger.debug(`No specific deserializer found for result of method: ${method}, returning raw data`);
441
+ return data;
442
+ },
443
+ },
444
+ };
445
+ /**
446
+ * Registers the {@link AztecWalletSerializer} for all relevant Aztec JSON-RPC methods
447
+ * on a given {@link JSONRPCNode} instance.
448
+ *
449
+ * This function is typically called on the wallet-side (e.g., within
450
+ * `createAztecWalletNode`) to equip the node with the necessary serialization
451
+ * capabilities for handling Aztec methods.
452
+ *
453
+ * It iterates through a predefined list of Aztec methods and associates each
454
+ * with the `AztecWalletSerializer`.
455
+ *
456
+ * @param node - The {@link JSONRPCNode} instance on which to register the serializers.
457
+ * This node should be typed with {@link AztecWalletMethodMap}.
458
+ *
459
+ * @see {@link createAztecWalletNode} where this function is used.
460
+ * @see {@link AztecWalletSerializer} which provides the serialization logic.
461
+ */
462
+ export function registerAztecSerializers(node) {
463
+ // This list should ideally cover all methods in AztecWalletMethodMap that require
464
+ // specific Aztec type serialization.
465
+ const aztecMethods = [
466
+ 'aztec_getBlock',
467
+ 'aztec_getBlockNumber',
468
+ 'aztec_getChainId',
469
+ 'aztec_getVersion',
470
+ 'aztec_getNodeInfo',
471
+ 'aztec_getProvenBlockNumber',
472
+ 'aztec_getPXEInfo',
473
+ 'aztec_getCurrentBaseFees',
474
+ 'aztec_getAddress',
475
+ 'aztec_getCompleteAddress',
476
+ 'aztec_createAuthWit',
477
+ 'aztec_registerSender',
478
+ 'aztec_getSenders',
479
+ 'aztec_removeSender',
480
+ 'aztec_getContracts',
481
+ 'aztec_getContractMetadata',
482
+ 'aztec_getContractClassMetadata',
483
+ 'aztec_registerContract',
484
+ 'aztec_registerContractClass',
485
+ 'aztec_proveTx',
486
+ 'aztec_sendTx',
487
+ 'aztec_getTxReceipt',
488
+ 'aztec_simulateTx',
489
+ 'aztec_profileTx',
490
+ 'aztec_simulateUtility',
491
+ 'aztec_getPrivateEvents',
492
+ 'aztec_getPublicEvents',
493
+ 'aztec_wmExecuteTx',
494
+ 'aztec_wmDeployContract',
495
+ 'wm_getSupportedMethods',
496
+ ];
497
+ for (const method of aztecMethods) {
498
+ node.registerSerializer(method, AztecWalletSerializer);
499
+ }
500
+ }
501
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvd2FsbGV0L3NlcmlhbGl6ZXJzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBbUJHO0FBVUgsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBRW5ELE9BQU8sRUFDTCxZQUFZLEVBQ1osZUFBZSxFQUNmLGtCQUFrQixFQUNsQixFQUFFLEVBQ0YsRUFBRSxFQUNGLE1BQU0sRUFDTixXQUFXLEdBQ1osTUFBTSxpQkFBaUIsQ0FBQztBQUt6QixPQUFPLEVBQUUsYUFBYSxFQUFFLHNCQUFzQixFQUFFLGdCQUFnQixFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzFHLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUdoRCxPQUFPLEVBQ0wseUJBQXlCLEVBQ3pCLGlDQUFpQyxFQUNqQyxjQUFjLEVBQ2QsK0JBQStCLEdBQ2hDLE1BQU0sd0JBQXdCLENBQUM7QUFDaEMsT0FBTyxFQUFFLE9BQU8sRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUM5QyxPQUFPLEVBQ0wsT0FBTyxFQUNQLFlBQVksRUFDWixzQkFBc0IsRUFDdEIsZUFBZSxFQUNmLGVBQWUsRUFDZixTQUFTLEVBQ1Qsa0JBQWtCLEVBQ2xCLHVCQUF1QixHQUN4QixNQUFNLGtCQUFrQixDQUFDO0FBRTFCLE9BQU8sRUFBRSxhQUFhLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNoRixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFHckQsT0FBTyxFQUFFLENBQUMsRUFBbUIsTUFBTSxLQUFLLENBQUM7QUFFekMsbUZBQW1GO0FBQ25GLE1BQU0sc0JBQXNCLEdBQUcsQ0FBQyxDQUFDLE1BQU0s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