@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,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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
|