@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,705 @@
1
+ import { Contract, DeploySentTx, SentTx } from '@aztec/aztec.js';
2
+ import { DefaultAccountEntrypoint } from '@aztec/entrypoints/account';
3
+ import { createLogger } from '@aztec/foundation/log';
4
+ const logger = createLogger('aztec-rpc-wallet:dapp-wallet');
5
+ /**
6
+ * RPC-based AuthWitnessProvider that delegates auth witness creation to the wallet via RPC.
7
+ * This allows the DefaultAccountEntrypoint to create auth witnesses through the remote wallet.
8
+ * @internal
9
+ */
10
+ class RPCAuthWitnessProvider {
11
+ constructor(wallet) {
12
+ this.wallet = wallet;
13
+ }
14
+ /**
15
+ * Creates an authorization witness for the given message hash.
16
+ * Delegates the call to the underlying AztecDappWallet instance.
17
+ * @param messageHash - The message hash to authorize.
18
+ * @returns A promise that resolves to the AuthWitness.
19
+ */
20
+ async createAuthWit(messageHash) {
21
+ return this.wallet.createAuthWit(messageHash);
22
+ }
23
+ }
24
+ /**
25
+ * Aztec DApp Wallet that implements the aztec.js {@link Wallet} interface.
26
+ * This class provides a client-side representation of an Aztec wallet,
27
+ * interacting with a remote wallet implementation (typically an {@link AccountWallet}
28
+ * managed by a {@link JSONRPCNode} created via `createAztecWalletNode`)
29
+ * through the WalletMesh router system.
30
+ *
31
+ * It requires an {@link AztecRouterProvider} instance to handle the
32
+ * serialization and deserialization of Aztec-specific types (e.g., `AztecAddress`, `Fr`)
33
+ * when communicating with the router.
34
+ *
35
+ * An instance of this wallet should typically be created using the
36
+ * {@link createAztecWallet} helper function, which also handles initialization.
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * // Assuming 'provider' is an initialized AztecRouterProvider
41
+ * const wallet = await createAztecWallet(provider, 'aztec:mainnet');
42
+ * const address = wallet.getAddress(); // Synchronous access after initialization
43
+ * const txHash = await wallet.sendTx(someTx);
44
+ * ```
45
+ */
46
+ export class AztecDappWallet {
47
+ /**
48
+ * Creates an instance of AztecDappWallet.
49
+ * Note: Prefer using the {@link createAztecWallet} helper function for creating
50
+ * and initializing wallet instances.
51
+ *
52
+ * @param routerProvider - The AztecRouterProvider instance used for communication.
53
+ * @param chainId - The Aztec chain ID this wallet is associated with.
54
+ */
55
+ constructor(routerProvider, chainId) {
56
+ this.routerProvider = routerProvider;
57
+ this.chainId = chainId;
58
+ }
59
+ /**
60
+ * Gets the chain ID for this wallet.
61
+ * This value is cached during initialization.
62
+ * @returns The chain ID as an Fr.
63
+ * @throws If the wallet is not initialized (e.g., if not created via `createAztecWallet`).
64
+ */
65
+ getChainId() {
66
+ if (!this.cachedChainId) {
67
+ throw new Error('Chain ID not initialized. Call createAztecWallet() to properly initialize the wallet.');
68
+ }
69
+ return this.cachedChainId;
70
+ }
71
+ /**
72
+ * Asynchronously fetches the chain ID from the remote wallet via an RPC call.
73
+ * This method directly queries the connected wallet node.
74
+ *
75
+ * @returns A promise that resolves to the chain ID as an {@link Fr}.
76
+ * @see {@link AztecWalletMethodMap.aztec_getChainId}
77
+ */
78
+ async getChainIdAsync() {
79
+ const chainId = await this.routerProvider.call(this.chainId, {
80
+ method: 'aztec_getChainId',
81
+ });
82
+ return chainId;
83
+ }
84
+ /**
85
+ * Gets the version of the wallet (typically PXE version).
86
+ * This value is cached during initialization.
87
+ * @returns The wallet version as an Fr.
88
+ * @throws If the wallet is not initialized.
89
+ */
90
+ getVersion() {
91
+ if (!this.cachedVersion) {
92
+ throw new Error('Wallet version not initialized. Call createAztecWallet() to properly initialize the wallet.');
93
+ }
94
+ return this.cachedVersion;
95
+ }
96
+ /**
97
+ * Asynchronously fetches the wallet version (typically the PXE version) from the remote wallet via an RPC call.
98
+ * This method directly queries the connected wallet node.
99
+ *
100
+ * @returns A promise that resolves to the wallet version as an {@link Fr}.
101
+ * @see {@link AztecWalletMethodMap.aztec_getVersion}
102
+ */
103
+ async getVersionAsync() {
104
+ const version = await this.routerProvider.call(this.chainId, {
105
+ method: 'aztec_getVersion',
106
+ });
107
+ return version;
108
+ }
109
+ /**
110
+ * Gets the primary Aztec address for this wallet.
111
+ * This value is cached during initialization.
112
+ * Implements {@link Wallet.getAddress}.
113
+ * @returns The wallet's AztecAddress.
114
+ * @throws If the wallet is not initialized.
115
+ */
116
+ getAddress() {
117
+ if (!this.cachedAddress) {
118
+ throw new Error('Wallet not initialized. Call createAztecWallet() to properly initialize the wallet.');
119
+ }
120
+ return this.cachedAddress;
121
+ }
122
+ /**
123
+ * Asynchronously fetches the primary Aztec address from the remote wallet via an RPC call.
124
+ * This method directly queries the connected wallet node.
125
+ *
126
+ * @returns A promise that resolves to the wallet's {@link AztecAddress}.
127
+ * @see {@link AztecWalletMethodMap.aztec_getAddress}
128
+ */
129
+ async getAddressAsync() {
130
+ const address = await this.routerProvider.call(this.chainId, {
131
+ method: 'aztec_getAddress',
132
+ });
133
+ return address;
134
+ }
135
+ /**
136
+ * Gets the complete address (including public keys) for this wallet.
137
+ * This value is cached during initialization.
138
+ * Implements {@link Wallet.getCompleteAddress}.
139
+ * @returns The wallet's CompleteAddress.
140
+ * @throws If the wallet is not initialized.
141
+ */
142
+ getCompleteAddress() {
143
+ if (!this.cachedCompleteAddress) {
144
+ throw new Error('Wallet not initialized. Call createAztecWallet() to properly initialize the wallet.');
145
+ }
146
+ return this.cachedCompleteAddress;
147
+ }
148
+ /**
149
+ * Asynchronously fetches the complete address (including public keys) from the remote wallet via an RPC call.
150
+ * This method directly queries the connected wallet node.
151
+ *
152
+ * @returns A promise that resolves to the wallet's {@link CompleteAddress}.
153
+ * @see {@link AztecWalletMethodMap.aztec_getCompleteAddress}
154
+ */
155
+ async getCompleteAddressAsync() {
156
+ const result = await this.routerProvider.call(this.chainId, {
157
+ method: 'aztec_getCompleteAddress',
158
+ });
159
+ return result;
160
+ }
161
+ /**
162
+ * Fetches and caches values (address, chain ID, version) that are accessed synchronously.
163
+ * @internal
164
+ */
165
+ async fetchCachedValues() {
166
+ const completeAddress = await this.getCompleteAddressAsync();
167
+ this.cachedCompleteAddress = completeAddress;
168
+ this.cachedAddress = completeAddress.address;
169
+ this.cachedChainId = await this.getChainIdAsync();
170
+ this.cachedVersion = await this.getVersionAsync();
171
+ }
172
+ /**
173
+ * Initializes the wallet instance by fetching and caching necessary values.
174
+ * This method is called by {@link createAztecWallet}.
175
+ * @internal
176
+ */
177
+ async initialize() {
178
+ try {
179
+ await this.fetchCachedValues();
180
+ // Initialize the auth provider and entrypoint
181
+ if (!this.cachedAddress || !this.cachedChainId || !this.cachedVersion) {
182
+ throw new Error('Failed to initialize wallet: missing required cached values');
183
+ }
184
+ this.authProvider = new RPCAuthWitnessProvider(this);
185
+ this.entrypoint = new DefaultAccountEntrypoint(this.cachedAddress, this.authProvider, this.cachedChainId.toNumber(), this.cachedVersion.toNumber());
186
+ logger.debug(`AztecDappWallet initialized: ${this.cachedAddress?.toString()}`);
187
+ }
188
+ catch (error) {
189
+ logger.warn('AztecDappWallet.initialize: Failed to initialize wallet addresses:', error);
190
+ throw error;
191
+ }
192
+ }
193
+ /**
194
+ * Registers an authorized sender for this account by making an RPC call to the remote wallet.
195
+ * Implements {@link Wallet.registerSender}.
196
+ * @param address - The {@link AztecAddress} of the sender to register.
197
+ * @returns A promise that resolves to the registered sender's {@link AztecAddress}.
198
+ * @see {@link AztecWalletMethodMap.aztec_registerSender}
199
+ */
200
+ async registerSender(address) {
201
+ await this.routerProvider.call(this.chainId, {
202
+ method: 'aztec_registerSender',
203
+ params: { sender: address },
204
+ });
205
+ return address; // Return the registered address
206
+ }
207
+ /**
208
+ * Retrieves the list of registered senders for this account by making an RPC call to the remote wallet.
209
+ * Implements {@link Wallet.getSenders}.
210
+ * @returns A promise that resolves to an array of {@link AztecAddress} objects.
211
+ * @see {@link AztecWalletMethodMap.aztec_getSenders}
212
+ */
213
+ async getSenders() {
214
+ const result = await this.routerProvider.call(this.chainId, {
215
+ method: 'aztec_getSenders',
216
+ });
217
+ return result;
218
+ }
219
+ /**
220
+ * Removes an authorized sender from this account by making an RPC call to the remote wallet.
221
+ * Implements {@link Wallet.removeSender}.
222
+ * @param sender - The {@link AztecAddress} of the sender to remove.
223
+ * @returns A promise that resolves when the sender is removed by the remote wallet.
224
+ * @see {@link AztecWalletMethodMap.aztec_removeSender}
225
+ */
226
+ async removeSender(sender) {
227
+ await this.routerProvider.call(this.chainId, {
228
+ method: 'aztec_removeSender',
229
+ params: { sender },
230
+ });
231
+ }
232
+ /**
233
+ * Registers a deployed contract instance with the remote wallet via an RPC call.
234
+ * Implements {@link Wallet.registerContract}.
235
+ * @param contract - An object containing the contract's {@link ContractInstanceWithAddress} and optionally its {@link ContractArtifact}.
236
+ * @returns A promise that resolves when the contract is registered by the remote wallet.
237
+ * @see {@link AztecWalletMethodMap.aztec_registerContract}
238
+ */
239
+ async registerContract(contract) {
240
+ const params = {
241
+ instance: contract.instance,
242
+ };
243
+ if (contract.artifact !== undefined) {
244
+ params.artifact = contract.artifact;
245
+ }
246
+ await this.routerProvider.call(this.chainId, {
247
+ method: 'aztec_registerContract',
248
+ params,
249
+ });
250
+ }
251
+ /**
252
+ * Registers a contract class (artifact/bytecode) with the remote wallet via an RPC call.
253
+ * Implements {@link Wallet.registerContractClass}.
254
+ * @param artifact - The {@link ContractArtifact} to register.
255
+ * @returns A promise that resolves when the class is registered by the remote wallet.
256
+ * @see {@link AztecWalletMethodMap.aztec_registerContractClass}
257
+ */
258
+ async registerContractClass(artifact) {
259
+ await this.routerProvider.call(this.chainId, {
260
+ method: 'aztec_registerContractClass',
261
+ params: { artifact },
262
+ });
263
+ }
264
+ /**
265
+ * Retrieves information about the connected Aztec node via an RPC call.
266
+ * Implements {@link Wallet.getNodeInfo}.
267
+ * @returns A promise that resolves to the {@link NodeInfo}.
268
+ * @see {@link AztecWalletMethodMap.aztec_getNodeInfo}
269
+ */
270
+ async getNodeInfo() {
271
+ const result = await this.routerProvider.call(this.chainId, {
272
+ method: 'aztec_getNodeInfo',
273
+ });
274
+ return result;
275
+ }
276
+ /**
277
+ * Retrieves information about the PXE service via an RPC call.
278
+ * Implements {@link Wallet.getPXEInfo}.
279
+ * @returns A promise that resolves to the {@link PXEInfo}.
280
+ * @see {@link AztecWalletMethodMap.aztec_getPXEInfo}
281
+ */
282
+ async getPXEInfo() {
283
+ const result = await this.routerProvider.call(this.chainId, {
284
+ method: 'aztec_getPXEInfo',
285
+ });
286
+ return result;
287
+ }
288
+ /**
289
+ * Retrieves a specific L2 block by its number via an RPC call.
290
+ * Implements {@link Wallet.getBlock}.
291
+ * @param number - The block number to retrieve.
292
+ * @returns A promise that resolves to the {@link L2Block} or `undefined` if not found.
293
+ * @see {@link AztecWalletMethodMap.aztec_getBlock}
294
+ */
295
+ async getBlock(number) {
296
+ const result = await this.routerProvider.call(this.chainId, {
297
+ method: 'aztec_getBlock',
298
+ params: { number },
299
+ });
300
+ return result;
301
+ }
302
+ /**
303
+ * Retrieves the current L2 block number via an RPC call.
304
+ * Implements {@link Wallet.getBlockNumber}.
305
+ * @returns A promise that resolves to the current block number.
306
+ * @see {@link AztecWalletMethodMap.aztec_getBlockNumber}
307
+ */
308
+ async getBlockNumber() {
309
+ const result = await this.routerProvider.call(this.chainId, {
310
+ method: 'aztec_getBlockNumber',
311
+ });
312
+ return result;
313
+ }
314
+ /**
315
+ * Retrieves the current base gas fees on the network via an RPC call.
316
+ * Implements {@link Wallet.getCurrentBaseFees}.
317
+ * @returns A promise that resolves to the {@link GasFees}.
318
+ * @see {@link AztecWalletMethodMap.aztec_getCurrentBaseFees}
319
+ */
320
+ async getCurrentBaseFees() {
321
+ const result = await this.routerProvider.call(this.chainId, {
322
+ method: 'aztec_getCurrentBaseFees',
323
+ });
324
+ return result;
325
+ }
326
+ /**
327
+ * Creates a transaction execution request using the wallet's entrypoint.
328
+ * Implements {@link Wallet.createTxExecutionRequest}.
329
+ * @param exec - The execution payload.
330
+ * @param fee - Fee payment options.
331
+ * @param options - Transaction execution options.
332
+ * @returns A promise that resolves to the TxExecutionRequest.
333
+ * @throws If the wallet or its entrypoint is not initialized.
334
+ */
335
+ async createTxExecutionRequest(exec, fee, options) {
336
+ if (!this.entrypoint) {
337
+ throw new Error('Wallet not initialized. Call createAztecWallet() to properly initialize the wallet.');
338
+ }
339
+ // Use the local entrypoint to create the transaction execution request
340
+ // The entrypoint will use the RPCAuthWitnessProvider to create auth witnesses via RPC
341
+ return this.entrypoint.createTxExecutionRequest(exec, fee, options);
342
+ }
343
+ async createAuthWit(intent) {
344
+ const result = await this.routerProvider.call(this.chainId, {
345
+ method: 'aztec_createAuthWit',
346
+ params: { intent },
347
+ });
348
+ return result;
349
+ }
350
+ /**
351
+ * Proves a transaction execution request by making an RPC call to the remote wallet.
352
+ * Implements {@link Wallet.proveTx}.
353
+ * @param txRequest - The {@link TxExecutionRequest} to prove.
354
+ * @param privateExecutionResult - Optional {@link PrivateExecutionResult} from a private execution phase.
355
+ * @returns A promise that resolves to the {@link TxProvingResult}.
356
+ * @see {@link AztecWalletMethodMap.aztec_proveTx}
357
+ */
358
+ async proveTx(txRequest, privateExecutionResult) {
359
+ logger.debug('AztecDappWallet.proveTx: Proving transaction with request:', txRequest);
360
+ if (privateExecutionResult) {
361
+ logger.debug('AztecDappWallet.proveTx: Proving transaction with privateExecutionResult:', privateExecutionResult);
362
+ }
363
+ else {
364
+ logger.debug('AztecDappWallet.proveTx: Proving transaction without privateExecutionResult.');
365
+ }
366
+ const params = {
367
+ txRequest,
368
+ };
369
+ if (privateExecutionResult) {
370
+ params.privateExecutionResult = privateExecutionResult;
371
+ }
372
+ const result = await this.routerProvider.call(this.chainId, {
373
+ method: 'aztec_proveTx',
374
+ params,
375
+ });
376
+ return result;
377
+ }
378
+ /**
379
+ * Sends a proven transaction to the network via an RPC call to the remote wallet.
380
+ * Implements {@link Wallet.sendTx}.
381
+ * @param tx - The proven {@link Tx} to send.
382
+ * @returns A promise that resolves to the {@link TxHash}.
383
+ * @see {@link AztecWalletMethodMap.aztec_sendTx}
384
+ */
385
+ async sendTx(tx) {
386
+ const result = await this.routerProvider.call(this.chainId, {
387
+ method: 'aztec_sendTx',
388
+ params: { tx },
389
+ });
390
+ return result;
391
+ }
392
+ /**
393
+ * Retrieves the receipt for a given transaction hash via an RPC call to the remote wallet.
394
+ * Implements {@link Wallet.getTxReceipt}.
395
+ * @param txHash - The {@link TxHash} of the transaction.
396
+ * @returns A promise that resolves to the {@link TxReceipt}.
397
+ * @see {@link AztecWalletMethodMap.aztec_getTxReceipt}
398
+ */
399
+ async getTxReceipt(txHash) {
400
+ const result = await this.routerProvider.call(this.chainId, {
401
+ method: 'aztec_getTxReceipt',
402
+ params: { txHash },
403
+ });
404
+ return result;
405
+ }
406
+ /**
407
+ * Simulates a transaction by making an RPC call to the remote wallet.
408
+ * Implements {@link Wallet.simulateTx}.
409
+ * @param txRequest - The {@link TxExecutionRequest} to simulate.
410
+ * @param simulatePublic - Whether to simulate public parts of the transaction.
411
+ * @param msgSender - Optional {@link AztecAddress} of the message sender for simulation context.
412
+ * @param skipTxValidation - Optional flag to skip transaction validation during simulation.
413
+ * @param skipFeeEnforcement - Optional flag to skip fee enforcement during simulation.
414
+ * @param scopes - Optional array of {@link AztecAddress} scopes for the simulation.
415
+ * @returns A promise that resolves to the {@link TxSimulationResult}.
416
+ * @see {@link AztecWalletMethodMap.aztec_simulateTx}
417
+ */
418
+ async simulateTx(txRequest, simulatePublic, msgSender, skipTxValidation, skipFeeEnforcement, scopes) {
419
+ const params = {
420
+ txRequest,
421
+ };
422
+ if (simulatePublic !== undefined)
423
+ params.simulatePublic = simulatePublic;
424
+ if (msgSender !== undefined)
425
+ params.msgSender = msgSender;
426
+ if (skipTxValidation !== undefined)
427
+ params.skipTxValidation = skipTxValidation;
428
+ if (skipFeeEnforcement !== undefined)
429
+ params.skipFeeEnforcement = skipFeeEnforcement;
430
+ if (scopes !== undefined)
431
+ params.scopes = scopes;
432
+ const result = await this.routerProvider.call(this.chainId, {
433
+ method: 'aztec_simulateTx',
434
+ params,
435
+ });
436
+ return result;
437
+ }
438
+ /**
439
+ * Profiles a transaction for performance analysis by making an RPC call to the remote wallet.
440
+ * Implements {@link Wallet.profileTx}.
441
+ * @param txRequest - The {@link TxExecutionRequest} to profile.
442
+ * @param profileMode - The mode for profiling: 'gates', 'execution-steps', or 'full'.
443
+ * @param skipProofGeneration - Optional flag to skip proof generation during profiling.
444
+ * @param msgSender - Optional {@link AztecAddress} of the message sender for profiling context.
445
+ * @returns A promise that resolves to the {@link TxProfileResult}.
446
+ * @see {@link AztecWalletMethodMap.aztec_profileTx}
447
+ */
448
+ async profileTx(txRequest, profileMode, skipProofGeneration, msgSender) {
449
+ const params = {
450
+ txRequest,
451
+ };
452
+ if (profileMode !== undefined)
453
+ params.profileMode = profileMode;
454
+ if (skipProofGeneration !== undefined)
455
+ params.skipProofGeneration = skipProofGeneration;
456
+ if (msgSender !== undefined)
457
+ params.msgSender = msgSender;
458
+ const result = await this.routerProvider.call(this.chainId, {
459
+ method: 'aztec_profileTx',
460
+ params,
461
+ });
462
+ return result;
463
+ }
464
+ /**
465
+ * Simulates a utility function call (view function) by making an RPC call to the remote wallet.
466
+ * Implements {@link Wallet.simulateUtility}.
467
+ * @param functionName - The name of the utility function to call.
468
+ * @param args - Arguments for the function call.
469
+ * @param to - The {@link AztecAddress} of the contract or account to call.
470
+ * @param authWits - Optional array of {@link AuthWitness} for authorization.
471
+ * @param from - Optional {@link AztecAddress} of the sender.
472
+ * @returns A promise that resolves to the {@link UtilitySimulationResult}.
473
+ * @see {@link AztecWalletMethodMap.aztec_simulateUtility}
474
+ */
475
+ async simulateUtility(functionName, args, to, authWits, from) {
476
+ const params = {
477
+ functionName,
478
+ args,
479
+ to,
480
+ };
481
+ if (authWits !== undefined)
482
+ params.authWits = authWits;
483
+ if (from !== undefined)
484
+ params.from = from;
485
+ const result = await this.routerProvider.call(this.chainId, {
486
+ method: 'aztec_simulateUtility',
487
+ params,
488
+ });
489
+ return result;
490
+ }
491
+ /**
492
+ * Retrieves private events (encrypted logs) by making an RPC call to the remote wallet.
493
+ * Implements {@link Wallet.getPrivateEvents}.
494
+ * @template T - The expected type of the decoded event data.
495
+ * @param contractAddress - The {@link AztecAddress} of the contract emitting the events.
496
+ * @param eventMetadata - {@link EventMetadataDefinition} of the event to query.
497
+ * @param from - Starting block number (inclusive).
498
+ * @param numBlocks - Number of blocks to query from the `from` block.
499
+ * @param recipients - Array of {@link AztecAddress} recipients for the events.
500
+ * @returns A promise that resolves to an array of decoded event data of type `T`.
501
+ * @see {@link AztecWalletMethodMap.aztec_getPrivateEvents}
502
+ */
503
+ async getPrivateEvents(contractAddress, eventMetadata, from, numBlocks, recipients) {
504
+ const result = await this.routerProvider.call(this.chainId, {
505
+ method: 'aztec_getPrivateEvents',
506
+ params: { contractAddress, eventMetadata, from, numBlocks, recipients },
507
+ });
508
+ return result;
509
+ }
510
+ /**
511
+ * Retrieves public events (unencrypted logs) by making an RPC call to the remote wallet.
512
+ * Implements {@link Wallet.getPublicEvents}.
513
+ * @template T - The expected type of the decoded event data.
514
+ * @param eventMetadata - {@link EventMetadataDefinition} of the event to query.
515
+ * @param from - Starting block number (inclusive).
516
+ * @param limit - Maximum number of events to return.
517
+ * @returns A promise that resolves to an array of decoded event data of type `T`.
518
+ * @see {@link AztecWalletMethodMap.aztec_getPublicEvents}
519
+ */
520
+ async getPublicEvents(eventMetadata, from, limit) {
521
+ const result = await this.routerProvider.call(this.chainId, {
522
+ method: 'aztec_getPublicEvents',
523
+ params: { eventMetadata, from, limit },
524
+ });
525
+ return result;
526
+ }
527
+ /**
528
+ * Retrieves metadata for a specific contract by making an RPC call to the remote wallet.
529
+ * Implements {@link Wallet.getContractMetadata}.
530
+ * @param address - The {@link AztecAddress} of the contract.
531
+ * @returns A promise that resolves to the {@link ContractMetadata}.
532
+ * @see {@link AztecWalletMethodMap.aztec_getContractMetadata}
533
+ */
534
+ async getContractMetadata(address) {
535
+ const result = await this.routerProvider.call(this.chainId, {
536
+ method: 'aztec_getContractMetadata',
537
+ params: { address },
538
+ });
539
+ return result;
540
+ }
541
+ /**
542
+ * Retrieves metadata for a contract class by making an RPC call to the remote wallet.
543
+ * Implements {@link Wallet.getContractClassMetadata}.
544
+ * @param id - The {@link Fr} ID of the contract class.
545
+ * @param includeArtifact - Optional flag to include the {@link ContractArtifact} in the metadata.
546
+ * @returns A promise that resolves to the {@link ContractClassMetadata}.
547
+ * @see {@link AztecWalletMethodMap.aztec_getContractClassMetadata}
548
+ */
549
+ async getContractClassMetadata(id, includeArtifact) {
550
+ const params = { id };
551
+ if (includeArtifact !== undefined) {
552
+ params.includeArtifact = includeArtifact;
553
+ }
554
+ const result = await this.routerProvider.call(this.chainId, {
555
+ method: 'aztec_getContractClassMetadata',
556
+ params,
557
+ });
558
+ return result;
559
+ }
560
+ /**
561
+ * Updates a contract's artifact by re-registering its class with the remote wallet via an RPC call.
562
+ * Implements {@link Wallet.updateContract}.
563
+ * @param _contractAddress - The {@link AztecAddress} of the contract to update (often unused if primarily updating the class).
564
+ * @param artifact - The new {@link ContractArtifact}.
565
+ * @returns A promise that resolves when the update is complete on the remote wallet.
566
+ * @see {@link AztecWalletMethodMap.aztec_registerContractClass} (as this is what it typically calls)
567
+ */
568
+ async updateContract(_contractAddress, artifact) {
569
+ await this.routerProvider.call(this.chainId, {
570
+ method: 'aztec_registerContractClass',
571
+ params: { artifact },
572
+ });
573
+ }
574
+ /**
575
+ * Retrieves a list of all contracts registered with the remote wallet via an RPC call.
576
+ * Implements {@link Wallet.getContracts}.
577
+ * @returns A promise that resolves to an array of {@link AztecAddress} objects for the contracts.
578
+ * @see {@link AztecWalletMethodMap.aztec_getContracts}
579
+ */
580
+ async getContracts() {
581
+ const result = await this.routerProvider.call(this.chainId, {
582
+ method: 'aztec_getContracts',
583
+ });
584
+ return result;
585
+ }
586
+ /**
587
+ * Executes a transaction based on a {@link ContractFunctionInteraction}.
588
+ * This WalletMesh-specific helper method simplifies sending a transaction by deriving
589
+ * the necessary {@link ExecutionPayload} from the interaction and making an RPC call
590
+ * to the `aztec_wmExecuteTx` method on the remote wallet.
591
+ * The remote wallet is expected to handle fee configuration, proof generation, and submission.
592
+ *
593
+ * @param interaction - The {@link ContractFunctionInteraction} representing the desired contract call.
594
+ * @returns A {@link SentTx} object that can be used to track the transaction.
595
+ * @see {@link AztecWalletMethodMap.aztec_wmExecuteTx}
596
+ */
597
+ async wmExecuteTx(interaction) {
598
+ // Extract the execution payload which contains the encoded function call
599
+ const executionPayload = await interaction.request();
600
+ // Send the high-level interaction details to the remote wallet
601
+ // Note: opts is not sent - the server-side wallet will handle fee configuration
602
+ const result = await this.routerProvider.call(this.chainId, {
603
+ method: 'aztec_wmExecuteTx',
604
+ params: {
605
+ executionPayload,
606
+ },
607
+ });
608
+ const txHashPromise = Promise.resolve(result);
609
+ return new SentTx(this, txHashPromise);
610
+ }
611
+ /**
612
+ * Simulates a transaction based on a {@link ContractFunctionInteraction}.
613
+ * This WalletMesh-specific helper method simplifies simulating a transaction by deriving
614
+ * the necessary {@link ExecutionPayload} from the interaction and making an RPC call
615
+ * to the `aztec_wmSimulateTx` method on the remote wallet.
616
+ *
617
+ * @param interaction - The {@link ContractFunctionInteraction} representing the desired contract call.
618
+ * @returns A promise that resolves to the {@link TxSimulationResult}.
619
+ * @remarks TODO(twt): This should return a more useful result, not the raw TxSimulationResult.
620
+ * Copying the logic from `aztec.js/src/contract/contract_function_interaction.ts`
621
+ * could work if we can get the Function ABI or maybe have `aztec_wmSimulateTx` return hints
622
+ * about how to interpret the result.
623
+ * @see {@link AztecWalletMethodMap.aztec_wmSimulateTx}
624
+ */
625
+ async wmSimulateTx(interaction) {
626
+ // Extract the execution payload which contains the encoded function call
627
+ const executionPayload = await interaction.request();
628
+ // Send the high-level interaction details to the remote wallet for simulation
629
+ const result = (await this.routerProvider.call(this.chainId, {
630
+ method: 'aztec_wmSimulateTx',
631
+ params: {
632
+ executionPayload,
633
+ },
634
+ }));
635
+ // TODO(twt): This should return a more useful result, not the raw TxSimulationResult
636
+ // Copying the logic from https://github.com/AztecProtocol/aztec-packages/blob/next/yarn-project/aztec.js/src/contract/contract_function_interaction.ts
637
+ // could work if we can get the Function ABI or maybe have aztec_wmSimulateTx return hints about how to interpret the result.
638
+ return result;
639
+ }
640
+ /**
641
+ * Deploys a contract using its artifact and constructor arguments.
642
+ * This WalletMesh-specific helper method makes an RPC call to the `aztec_wmDeployContract`
643
+ * method on the remote wallet. The remote wallet handles the deployment process.
644
+ *
645
+ * @param artifact - The {@link ContractArtifact} of the contract to deploy.
646
+ * @param args - An array of arguments for the contract's constructor.
647
+ * @param constructorName - Optional name of the constructor function if the artifact has multiple.
648
+ * @returns A {@link DeploySentTx} object that can be used to track the deployment transaction
649
+ * and get the deployed contract instance.
650
+ * @see {@link AztecWalletMethodMap.aztec_wmDeployContract}
651
+ */
652
+ async deployContract(artifact, args, constructorName) {
653
+ // Send the deployment request to the remote wallet
654
+ const result = (await this.routerProvider.call(this.chainId, {
655
+ method: 'aztec_wmDeployContract',
656
+ params: {
657
+ artifact,
658
+ args,
659
+ constructorName,
660
+ },
661
+ }));
662
+ // Create a promise that resolves with the transaction hash
663
+ const txHashPromise = Promise.resolve(result.txHash);
664
+ // Create the post-deploy constructor function
665
+ const postDeployCtor = async (address, wallet) => {
666
+ return Contract.at(address, artifact, wallet);
667
+ };
668
+ // Create the instance getter function
669
+ // This will compute the contract address from the artifact and deployment args
670
+ const instanceGetter = async () => {
671
+ // Use the deployed contract address returned by the server
672
+ // Only the address is used from this result by DeploySentTx
673
+ return {
674
+ address: result.contractAddress,
675
+ };
676
+ };
677
+ // Return a DeploySentTx instance
678
+ return new DeploySentTx(this, txHashPromise, postDeployCtor, instanceGetter);
679
+ }
680
+ }
681
+ /**
682
+ * Helper function to create and initialize an AztecDappWallet instance.
683
+ * This is the recommended way to instantiate an Aztec wallet for dApp use,
684
+ * as it ensures all necessary asynchronous setup (like fetching initial
685
+ * address and chain ID) is completed.
686
+ *
687
+ * @param provider - An {@link AztecRouterProvider} instance, which handles Aztec-specific type serialization.
688
+ * @param chainId - The Aztec chain ID (e.g., 'aztec:mainnet', 'aztec:31337') for the wallet. Defaults to 'aztec:mainnet'.
689
+ * @returns A promise that resolves to a fully initialized {@link AztecDappWallet} instance.
690
+ *
691
+ * @example
692
+ * ```typescript
693
+ * const dAppTransport = { send: ..., onMessage: ... }; // User-defined transport
694
+ * const provider = new AztecRouterProvider(dAppTransport);
695
+ * await provider.connect({ 'aztec:mainnet': ['aztec_getAddress'] }); // Connect first
696
+ * const wallet = await createAztecWallet(provider, 'aztec:mainnet');
697
+ * const address = wallet.getAddress(); // Now usable
698
+ * ```
699
+ */
700
+ export async function createAztecWallet(provider, chainId = 'aztec:mainnet') {
701
+ const wallet = new AztecDappWallet(provider, chainId);
702
+ await wallet.initialize();
703
+ return wallet;
704
+ }
705
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXp0ZWMtZGFwcC13YWxsZXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2F6dGVjLWRhcHAtd2FsbGV0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQWVBLE9BQU8sRUFBRSxRQUFRLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBbUJqRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFLckQsTUFBTSxNQUFNLEdBQUcsWUFBWSxDQUFDLDhCQUE4QixDQUFDLENBQUM7QUFFNUQ7Ozs7R0FJRztBQUNILE1BQU0sc0JBQXNCO0lBQzFCLFlBQW9CLE1BQXVCO1FBQXZCLFdBQU0sR0FBTixNQUFNLENBQWlCO0lBQUcsQ0FBQztJQUUvQzs7Ozs7T0FLRztJQUNILEtBQUssQ0FBQyxhQUFhLENBQUMsV0FBd0I7UUFDMUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLGFBQWEsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNoRCxDQUFDO0NBQ0Y7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBcUJHO0FBQ0gsTUFBTSxPQUFPLGVBQWU7SUFRMUI7Ozs7Ozs7T0FPRztJQUNILFlBQ1UsY0FBbUMsRUFDbkMsT0FBcUI7UUFEckIsbUJBQWMsR0FBZCxjQUFjLENBQXFCO1FBQ25DLFlBQU8sR0FBUCxPQUFPLENBQWM7SUFDNUIsQ0FBQztJQUVKOzs7OztPQUtHO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDeEIsTUFBTSxJQUFJLEtBQUssQ0FDYix1RkFBdUYsQ0FDeEYsQ0FBQztRQUNKLENBQUM7UUFDRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNILEtBQUssQ0FBQyxlQUFlO1FBQ25CLE1B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