@aztec/wallets 0.0.1-commit.9ef841308 → 0.0.1-commit.a5db02d

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 (36) hide show
  1. package/dest/embedded/account-contract-providers/bundle.d.ts +6 -8
  2. package/dest/embedded/account-contract-providers/bundle.d.ts.map +1 -1
  3. package/dest/embedded/account-contract-providers/bundle.js +12 -10
  4. package/dest/embedded/account-contract-providers/lazy.d.ts +6 -8
  5. package/dest/embedded/account-contract-providers/lazy.d.ts.map +1 -1
  6. package/dest/embedded/account-contract-providers/lazy.js +20 -10
  7. package/dest/embedded/account-contract-providers/types.d.ts +6 -8
  8. package/dest/embedded/account-contract-providers/types.d.ts.map +1 -1
  9. package/dest/embedded/embedded_wallet.d.ts +53 -9
  10. package/dest/embedded/embedded_wallet.d.ts.map +1 -1
  11. package/dest/embedded/embedded_wallet.js +192 -50
  12. package/dest/embedded/entrypoints/browser.d.ts +2 -2
  13. package/dest/embedded/entrypoints/browser.d.ts.map +1 -1
  14. package/dest/embedded/entrypoints/browser.js +47 -17
  15. package/dest/embedded/entrypoints/node.d.ts +2 -2
  16. package/dest/embedded/entrypoints/node.d.ts.map +1 -1
  17. package/dest/embedded/entrypoints/node.js +50 -17
  18. package/dest/embedded/store_encryption.d.ts +67 -0
  19. package/dest/embedded/store_encryption.d.ts.map +1 -0
  20. package/dest/embedded/store_encryption.js +71 -0
  21. package/dest/embedded/wallet_db.d.ts +9 -6
  22. package/dest/embedded/wallet_db.d.ts.map +1 -1
  23. package/dest/embedded/wallet_db.js +13 -11
  24. package/dest/testing.d.ts +8 -4
  25. package/dest/testing.d.ts.map +1 -1
  26. package/dest/testing.js +8 -14
  27. package/package.json +12 -10
  28. package/src/embedded/account-contract-providers/bundle.ts +15 -12
  29. package/src/embedded/account-contract-providers/lazy.ts +23 -12
  30. package/src/embedded/account-contract-providers/types.ts +6 -4
  31. package/src/embedded/embedded_wallet.ts +237 -52
  32. package/src/embedded/entrypoints/browser.ts +42 -22
  33. package/src/embedded/entrypoints/node.ts +47 -26
  34. package/src/embedded/store_encryption.ts +107 -0
  35. package/src/embedded/wallet_db.ts +18 -12
  36. package/src/testing.ts +11 -17
@@ -1,21 +1,46 @@
1
1
  import { NO_FROM } from '@aztec/aztec.js/account';
2
2
  import { CallAuthorizationRequest } from '@aztec/aztec.js/authorization';
3
- import { getGasLimits } from '@aztec/aztec.js/contracts';
4
- import { AccountManager } from '@aztec/aztec.js/wallet';
3
+ import { ContractFunctionInteraction, NO_WAIT } from '@aztec/aztec.js/contracts';
4
+ import { AccountManager, TxSimulationResultWithAppOffset } from '@aztec/aztec.js/wallet';
5
5
  import { DefaultEntrypoint } from '@aztec/entrypoints/default';
6
+ import { poseidon2Hash } from '@aztec/foundation/crypto/poseidon';
7
+ import { Schnorr } from '@aztec/foundation/crypto/schnorr';
6
8
  import { Fq, Fr } from '@aztec/foundation/curves/bn254';
7
- import { getContractInstanceFromInstantiationParams } from '@aztec/stdlib/contract';
9
+ import { getContractClassFromArtifact } from '@aztec/stdlib/contract';
8
10
  import { GasSettings } from '@aztec/stdlib/gas';
9
- import { deriveSigningKey } from '@aztec/stdlib/keys';
10
- import { collectOffchainEffects, mergeExecutionPayloads } from '@aztec/stdlib/tx';
11
- import { BaseWallet } from '@aztec/wallet-sdk/base-wallet';
11
+ import { SimulationOverrides, TxStatus, collectOffchainEffects, mergeExecutionPayloads } from '@aztec/stdlib/tx';
12
+ import { BaseWallet, getGasLimits } from '@aztec/wallet-sdk/base-wallet';
13
+ /** Splits a unified EmbeddedWalletPXEOptions into PXEConfig overrides and PXECreationOptions. */ export function splitPxeOptions(pxe) {
14
+ if (!pxe) {
15
+ return {
16
+ config: {},
17
+ creation: {}
18
+ };
19
+ }
20
+ const { loggers, loggerActorLabel, proverOrOptions, store, simulator, hooks, preloadedContractsProvider, ...config } = pxe;
21
+ return {
22
+ config,
23
+ creation: {
24
+ loggers,
25
+ loggerActorLabel,
26
+ proverOrOptions,
27
+ store,
28
+ simulator,
29
+ hooks,
30
+ preloadedContractsProvider
31
+ }
32
+ };
33
+ }
12
34
  const DEFAULT_ESTIMATED_GAS_PADDING = 0.1;
13
35
  export class EmbeddedWallet extends BaseWallet {
14
36
  walletDB;
15
37
  accountContracts;
16
38
  estimatedGasPadding;
39
+ // Stub class ids, populated on wallet startup
40
+ // to avoid redundant work per simulation
41
+ stubClassIds;
17
42
  constructor(pxe, aztecNode, walletDB, accountContracts, log){
18
- super(pxe, aztecNode, log), this.walletDB = walletDB, this.accountContracts = accountContracts, this.estimatedGasPadding = DEFAULT_ESTIMATED_GAS_PADDING;
43
+ super(pxe, aztecNode, log), this.walletDB = walletDB, this.accountContracts = accountContracts, this.estimatedGasPadding = DEFAULT_ESTIMATED_GAS_PADDING, this.stubClassIds = new Map();
19
44
  }
20
45
  async getAccountFromAddress(address) {
21
46
  const { secretKey, salt, signingKey, type } = await this.walletDB.retrieveAccount(address);
@@ -31,14 +56,24 @@ export class EmbeddedWallet extends BaseWallet {
31
56
  }
32
57
  async registerSender(address, alias) {
33
58
  await this.walletDB.storeSender(address, alias);
34
- return this.pxe.registerSender(address);
59
+ await this.pxe.registerTaggingSecretSource({
60
+ kind: 'address-derived',
61
+ sender: address
62
+ });
63
+ return address;
35
64
  }
36
65
  async getAddressBook() {
37
- const senders = await this.pxe.getSenders();
66
+ const sources = await this.pxe.getTaggingSecretSources({
67
+ kind: 'address-derived'
68
+ });
69
+ const senders = sources.map((source)=>source.sender);
38
70
  const storedSenders = await this.walletDB.listSenders();
39
71
  for (const storedSender of storedSenders){
40
72
  if (senders.findIndex((sender)=>sender.equals(storedSender.item)) === -1) {
41
- await this.pxe.registerSender(storedSender.item);
73
+ await this.pxe.registerTaggingSecretSource({
74
+ kind: 'address-derived',
75
+ sender: storedSender.item
76
+ });
42
77
  }
43
78
  }
44
79
  return storedSenders;
@@ -48,14 +83,23 @@ export class EmbeddedWallet extends BaseWallet {
48
83
  * estimates actual gas usage and captures call authorization requests to generate
49
84
  * the necessary authwitnesses.
50
85
  */ async sendTx(executionPayload, opts) {
51
- const feeOptions = await this.completeFeeOptionsForEstimation(opts.from, executionPayload.feePayer, opts.fee?.gasSettings);
86
+ // PXE has autoSync disabled by the embedded wallet entrypoints, so we sync once here to cover
87
+ // both the inner simulateTx (via simulateViaEntrypoint) and the proveTx that super.sendTx
88
+ await this.pxe.sync();
89
+ const feeOptions = await this.completeFeeOptions({
90
+ from: opts.from,
91
+ feePayer: executionPayload.feePayer,
92
+ gasSettings: opts.fee?.gasSettings,
93
+ forEstimation: true
94
+ });
52
95
  // Simulate the transaction first to estimate gas and capture required
53
96
  // private authwitnesses based on offchain effects.
54
97
  const simulationResult = await this.simulateViaEntrypoint(executionPayload, {
55
98
  from: opts.from,
56
99
  feeOptions,
57
- scopes: this.scopesFrom(opts.from, opts.additionalScopes),
58
- skipTxValidation: true
100
+ additionalScopes: opts.additionalScopes,
101
+ skipTxValidation: true,
102
+ sendMessagesAs: opts.sendMessagesAs
59
103
  });
60
104
  const offchainEffects = collectOffchainEffects(simulationResult.privateExecutionResult);
61
105
  const authWitnesses = await Promise.all(offchainEffects.map(async (effect)=>{
@@ -74,7 +118,8 @@ export class EmbeddedWallet extends BaseWallet {
74
118
  executionPayload.authWitnesses.push(authwit);
75
119
  }
76
120
  }
77
- const estimated = getGasLimits(simulationResult, this.estimatedGasPadding);
121
+ const maxTxGasLimits = await this.getMaxTxGasLimits();
122
+ const estimated = getGasLimits(simulationResult.gasUsed, maxTxGasLimits, this.estimatedGasPadding);
78
123
  this.log.verbose(`Estimated gas limits for tx: DA=${estimated.gasLimits.daGas} L2=${estimated.gasLimits.l2Gas} teardownDA=${estimated.teardownGasLimits.daGas} teardownL2=${estimated.teardownGasLimits.l2Gas}`);
79
124
  const gasSettings = GasSettings.from({
80
125
  ...opts.fee?.gasSettings,
@@ -83,8 +128,24 @@ export class EmbeddedWallet extends BaseWallet {
83
128
  gasLimits: opts.fee?.gasSettings?.gasLimits ?? estimated.gasLimits,
84
129
  teardownGasLimits: opts.fee?.gasSettings?.teardownGasLimits ?? estimated.teardownGasLimits
85
130
  });
131
+ let wait = opts.wait;
132
+ if (wait !== NO_WAIT) {
133
+ const callerWaitOpts = typeof wait === 'object' ? wait : {};
134
+ wait = {
135
+ ...callerWaitOpts,
136
+ // Default to PROPOSED so the wait returns as soon as the tx lands in a proposed L2 block,
137
+ // rather than waiting until the end of the slot for the checkpoint to be published to L1.
138
+ // This is what makes MBPS (Multiple Blocks Per Slot) actually improve UX: with CHECKPOINTED
139
+ // we'd block until L1 inclusion regardless of how early in the slot the tx was sequenced.
140
+ // The tradeoff is a weaker guarantee — a proposed block only becomes canonical once it (or
141
+ // a later block in the same slot) is checkpointed, so a tx could be re-orged out if the
142
+ // proposer fails to publish to L1 (which should be rare, since they'd get slashed for it).
143
+ waitForStatus: callerWaitOpts.waitForStatus ?? TxStatus.PROPOSED
144
+ };
145
+ }
86
146
  return super.sendTx(executionPayload, {
87
147
  ...opts,
148
+ wait: wait,
88
149
  fee: {
89
150
  ...opts.fee,
90
151
  gasSettings
@@ -92,32 +153,96 @@ export class EmbeddedWallet extends BaseWallet {
92
153
  });
93
154
  }
94
155
  /**
156
+ * Overrides the base simulateTx to drive PXE syncing explicitly. The PXE created by the embedded
157
+ * wallet has autoSync disabled (so we can share one sync across simulate+send in sendTx); for
158
+ * standalone simulations we still need a fresh anchor block, which we provide here.
159
+ */ async simulateTx(executionPayload, opts) {
160
+ await this.pxe.sync();
161
+ return super.simulateTx(executionPayload, opts);
162
+ }
163
+ async profileTx(executionPayload, opts) {
164
+ await this.pxe.sync();
165
+ return super.profileTx(executionPayload, opts);
166
+ }
167
+ async executeUtility(call, opts) {
168
+ await this.pxe.sync();
169
+ return super.executeUtility(call, opts);
170
+ }
171
+ async getPrivateEvents(eventDef, eventFilter) {
172
+ await this.pxe.sync();
173
+ return super.getPrivateEvents(eventDef, eventFilter);
174
+ }
175
+ /**
176
+ * Hashes and registers the stub class for every supported account type with PXE, populating
177
+ * stubClassIds. Called on wallet initialization.
178
+ */ async initStubClasses() {
179
+ const schnorrArtifact = await this.accountContracts.getStubAccountContractArtifact('schnorr');
180
+ const { id: schnorrClassId } = await getContractClassFromArtifact(schnorrArtifact);
181
+ await this.pxe.registerContractClass(schnorrArtifact);
182
+ // ecdsa stubs share the same class id
183
+ const ecdsaArtifact = await this.accountContracts.getStubAccountContractArtifact('ecdsasecp256r1');
184
+ const { id: ecdsaClassId } = await getContractClassFromArtifact(ecdsaArtifact);
185
+ await this.pxe.registerContractClass(ecdsaArtifact);
186
+ this.stubClassIds.set('schnorr', schnorrClassId);
187
+ this.stubClassIds.set('schnorr_initializerless', schnorrClassId);
188
+ this.stubClassIds.set('ecdsasecp256k1', ecdsaClassId);
189
+ this.stubClassIds.set('ecdsasecp256r1', ecdsaClassId);
190
+ }
191
+ /**
192
+ * Builds contract overrides for all provided addresses by replacing their account contracts with stub implementations.
193
+ * Uses a type-specific stub artifact so that the stub's constructor selector matches the real account's constructor.
194
+ */ async buildAccountOverrides(addresses) {
195
+ const accounts = await this.getAccounts();
196
+ const contracts = {};
197
+ const filtered = accounts.filter((acc)=>addresses.some((addr)=>addr.equals(acc.item)));
198
+ for (const account of filtered){
199
+ const address = account.item;
200
+ const { type } = await this.walletDB.retrieveAccount(address);
201
+ const stubClassId = this.stubClassIds.get(type);
202
+ if (!stubClassId) {
203
+ throw new Error(`Stub class for account type '${type}' was not registered at wallet init. This is a bug — initStubClasses should cover every supported AccountType.`);
204
+ }
205
+ const originalAccount = await this.getAccountFromAddress(address);
206
+ const completeAddress = originalAccount.getCompleteAddress();
207
+ const contractInstance = await this.pxe.getContractInstance(completeAddress.address);
208
+ if (!contractInstance) {
209
+ throw new Error(`No contract instance found for address: ${completeAddress.address} during account override building. This is a bug!`);
210
+ }
211
+ contracts[address.toString()] = {
212
+ instance: {
213
+ ...contractInstance,
214
+ currentContractClassId: stubClassId
215
+ }
216
+ };
217
+ }
218
+ return contracts;
219
+ }
220
+ /**
95
221
  * Simulates calls via a stub account entrypoint, bypassing real account authorization.
96
222
  * This allows kernelless simulation with contract overrides, skipping expensive
97
223
  * private kernel circuit execution.
98
224
  */ async simulateViaEntrypoint(executionPayload, opts) {
99
- const { from, feeOptions, scopes, skipTxValidation, skipFeeEnforcement } = opts;
225
+ const { from, feeOptions, additionalScopes, skipTxValidation, skipFeeEnforcement, sendMessagesAs } = opts;
226
+ const scopes = this.scopesFrom(from, additionalScopes);
100
227
  const feeExecutionPayload = await feeOptions.walletFeePaymentMethod?.getExecutionPayload();
101
228
  const finalExecutionPayload = feeExecutionPayload ? mergeExecutionPayloads([
102
229
  feeExecutionPayload,
103
230
  executionPayload
104
231
  ]) : executionPayload;
105
232
  const chainInfo = await this.getChainInfo();
106
- let overrides;
233
+ const accountOverrides = await this.buildAccountOverrides(scopes);
234
+ const overrides = new SimulationOverrides({
235
+ contracts: accountOverrides
236
+ });
107
237
  let txRequest;
108
238
  if (from === NO_FROM) {
109
239
  const entrypoint = new DefaultEntrypoint();
110
240
  txRequest = await entrypoint.createTxExecutionRequest(finalExecutionPayload, feeOptions.gasSettings, chainInfo);
111
241
  } else {
112
- const { account, instance, artifact } = await this.getFakeAccountDataFor(from);
113
- overrides = {
114
- contracts: {
115
- [from.toString()]: {
116
- instance,
117
- artifact
118
- }
119
- }
120
- };
242
+ const { type } = await this.walletDB.retrieveAccount(from);
243
+ const originalAccount = await this.getAccountFromAddress(from);
244
+ const completeAddress = originalAccount.getCompleteAddress();
245
+ const account = await this.accountContracts.createStubAccount(completeAddress, type);
121
246
  const executionOptions = {
122
247
  txNonce: Fr.random(),
123
248
  cancellable: this.cancellableTransactions,
@@ -126,40 +251,37 @@ export class EmbeddedWallet extends BaseWallet {
126
251
  };
127
252
  txRequest = await account.createTxExecutionRequest(finalExecutionPayload, feeOptions.gasSettings, chainInfo, executionOptions);
128
253
  }
129
- return this.pxe.simulateTx(txRequest, {
254
+ const result = await this.pxe.simulateTx(txRequest, {
130
255
  simulatePublic: true,
131
256
  skipFeeEnforcement,
132
257
  skipTxValidation,
133
258
  overrides,
134
- scopes
259
+ scopes,
260
+ senderForTags: this.senderForTagsFrom(from, sendMessagesAs)
135
261
  });
136
- }
137
- async getFakeAccountDataFor(address) {
138
- const originalAccount = await this.getAccountFromAddress(address);
139
- const originalAddress = originalAccount.getCompleteAddress();
140
- const contractInstance = await this.pxe.getContractInstance(originalAddress.address);
141
- if (!contractInstance) {
142
- throw new Error(`No contract instance found for address: ${originalAddress.address}`);
143
- }
144
- const stubAccount = await this.accountContracts.createStubAccount(originalAddress);
145
- const stubArtifact = await this.accountContracts.getStubAccountContractArtifact();
146
- const instance = await getContractInstanceFromInstantiationParams(stubArtifact, {
147
- salt: Fr.random()
148
- });
149
- return {
150
- account: stubAccount,
151
- instance,
152
- artifact: stubArtifact
153
- };
262
+ const appCallOffset = await this.computeAppCallOffset(from, feeOptions);
263
+ return TxSimulationResultWithAppOffset.fromResultAndOffset(result, appCallOffset);
154
264
  }
155
265
  async createAccountInternal(type, secret, salt, signingKey) {
156
266
  let contract;
267
+ let immutablesHash;
268
+ let publicKey;
157
269
  switch(type){
158
270
  case 'schnorr':
159
271
  {
160
272
  contract = await this.accountContracts.getSchnorrAccountContract(Fq.fromBuffer(signingKey));
161
273
  break;
162
274
  }
275
+ case 'schnorr_initializerless':
276
+ {
277
+ contract = await this.accountContracts.getSchnorrInitializerlessAccountContract(Fq.fromBuffer(signingKey));
278
+ publicKey = await new Schnorr().computePublicKey(Fq.fromBuffer(signingKey));
279
+ immutablesHash = await poseidon2Hash([
280
+ publicKey.x,
281
+ publicKey.y
282
+ ]);
283
+ break;
284
+ }
163
285
  case 'ecdsasecp256k1':
164
286
  {
165
287
  contract = await this.accountContracts.getEcdsaKAccountContract(signingKey);
@@ -175,12 +297,29 @@ export class EmbeddedWallet extends BaseWallet {
175
297
  throw new Error(`Unknown account type ${type}`);
176
298
  }
177
299
  }
178
- const accountManager = await AccountManager.create(this, secret, contract, salt);
300
+ const accountManager = await AccountManager.create(this, secret, contract, {
301
+ salt,
302
+ immutablesHash
303
+ });
179
304
  const instance = accountManager.getInstance();
180
305
  const existingInstance = await this.pxe.getContractInstance(instance.address);
181
306
  if (!existingInstance) {
182
307
  const existingArtifact = await this.pxe.getContractArtifact(instance.currentContractClassId);
308
+ const artifact = existingArtifact ?? await accountManager.getAccountContract().getContractArtifact();
183
309
  await this.registerContract(instance, !existingArtifact ? await accountManager.getAccountContract().getContractArtifact() : undefined, accountManager.getSecretKey());
310
+ if (type === 'schnorr_initializerless') {
311
+ const constructor = artifact.functions.find((f)=>f.name === 'constructor');
312
+ if (!constructor) {
313
+ throw new Error('Could not create SchnorrInitializerlessAccountContract: constructor ABI not found');
314
+ }
315
+ const storeCall = new ContractFunctionInteraction(this, instance.address, constructor, [
316
+ publicKey.x,
317
+ publicKey.y
318
+ ]);
319
+ await storeCall.simulate({
320
+ from: instance.address
321
+ });
322
+ }
184
323
  }
185
324
  return accountManager;
186
325
  }
@@ -196,8 +335,10 @@ export class EmbeddedWallet extends BaseWallet {
196
335
  return accountManager;
197
336
  }
198
337
  createSchnorrAccount(secret, salt, signingKey, alias) {
199
- const sk = signingKey ?? deriveSigningKey(secret);
200
- return this.createAndStoreAccount(alias ?? '', 'schnorr', secret, salt, sk.toBuffer());
338
+ return this.createAndStoreAccount(alias ?? '', 'schnorr', secret, salt, signingKey.toBuffer());
339
+ }
340
+ createSchnorrInitializerlessAccount(secret, salt, signingKey, alias) {
341
+ return this.createAndStoreAccount(alias ?? '', 'schnorr_initializerless', secret, salt, signingKey.toBuffer());
201
342
  }
202
343
  createECDSARAccount(secret, salt, signingKey, alias) {
203
344
  return this.createAndStoreAccount(alias ?? '', 'ecdsasecp256r1', secret, salt, signingKey);
@@ -211,7 +352,8 @@ export class EmbeddedWallet extends BaseWallet {
211
352
  setEstimatedGasPadding(value) {
212
353
  this.estimatedGasPadding = value ?? DEFAULT_ESTIMATED_GAS_PADDING;
213
354
  }
214
- stop() {
215
- return this.pxe.stop();
355
+ async stop() {
356
+ await this.pxe.stop();
357
+ await this.walletDB.close();
216
358
  }
217
359
  }
@@ -8,7 +8,7 @@ export declare class BrowserEmbeddedWallet extends EmbeddedWallet {
8
8
  static create<T extends BrowserEmbeddedWallet = BrowserEmbeddedWallet>(this: new (pxe: PXE, aztecNode: AztecNode, walletDB: WalletDB, accountContracts: AccountContractsProvider, log?: Logger) => T, nodeOrUrl: string | AztecNode, options?: EmbeddedWalletOptions): Promise<T>;
9
9
  }
10
10
  export { BrowserEmbeddedWallet as EmbeddedWallet };
11
- export type { EmbeddedWalletOptions } from '../embedded_wallet.js';
11
+ export type { EmbeddedWalletOptions, EmbeddedWalletPXEOptions } from '../embedded_wallet.js';
12
12
  export { WalletDB } from '../wallet_db.js';
13
13
  export type { AccountType } from '../wallet_db.js';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VtYmVkZGVkL2VudHJ5cG9pbnRzL2Jyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsS0FBSyxHQUFHLEVBQXNDLE1BQU0sd0JBQXdCLENBQUM7QUFJdEYsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RixPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUsscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUNuRixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFFM0MscUJBQWEscUJBQXNCLFNBQVEsY0FBYztJQUN2RCxPQUFhLE1BQU0sQ0FBQyxDQUFDLFNBQVMscUJBQXFCLEdBQUcscUJBQXFCLEVBQ3pFLElBQUksRUFBRSxLQUNKLEdBQUcsRUFBRSxHQUFHLEVBQ1IsU0FBUyxFQUFFLFNBQVMsRUFDcEIsUUFBUSxFQUFFLFFBQVEsRUFDbEIsZ0JBQWdCLEVBQUUsd0JBQXdCLEVBQzFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sS0FDVCxDQUFDLEVBQ04sU0FBUyxFQUFFLE1BQU0sR0FBRyxTQUFTLEVBQzdCLE9BQU8sR0FBRSxxQkFBMEIsR0FDbEMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQTJDWjtDQUNGO0FBRUQsT0FBTyxFQUFFLHFCQUFxQixJQUFJLGNBQWMsRUFBRSxDQUFDO0FBQ25ELFlBQVksRUFBRSxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25FLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMzQyxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0saUJBQWlCLENBQUMifQ==
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnJvd3Nlci5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VtYmVkZGVkL2VudHJ5cG9pbnRzL2Jyb3dzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUF5QixNQUFNLHNCQUFzQixDQUFDO0FBQzdFLE9BQU8sRUFBRSxLQUFLLE1BQU0sRUFBZ0IsTUFBTSx1QkFBdUIsQ0FBQztBQUVsRSxPQUFPLEVBQUUsS0FBSyxHQUFHLEVBQXdELE1BQU0sd0JBQXdCLENBQUM7QUFPeEcsT0FBTyxLQUFLLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx3Q0FBd0MsQ0FBQztBQUN2RixPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUsscUJBQXFCLEVBQW1CLE1BQU0sdUJBQXVCLENBQUM7QUFDcEcsT0FBTyxFQUE4QixRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV2RSxxQkFBYSxxQkFBc0IsU0FBUSxjQUFjO0lBQ3ZELE9BQWEsTUFBTSxDQUFDLENBQUMsU0FBUyxxQkFBcUIsR0FBRyxxQkFBcUIsRUFDekUsSUFBSSxFQUFFLEtBQ0osR0FBRyxFQUFFLEdBQUcsRUFDUixTQUFTLEVBQUUsU0FBUyxFQUNwQixRQUFRLEVBQUUsUUFBUSxFQUNsQixnQkFBZ0IsRUFBRSx3QkFBd0IsRUFDMUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxLQUNULENBQUMsRUFDTixTQUFTLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDN0IsT0FBTyxHQUFFLHFCQUEwQixHQUNsQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBNERaO0NBQ0Y7QUFFRCxPQUFPLEVBQUUscUJBQXFCLElBQUksY0FBYyxFQUFFLENBQUM7QUFDbkQsWUFBWSxFQUFFLHFCQUFxQixFQUFFLHdCQUF3QixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDN0YsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyJ9
@@ -1 +1 @@
1
- {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/embedded/entrypoints/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,KAAK,GAAG,EAAsC,MAAM,wBAAwB,CAAC;AAItF,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,OAAa,MAAM,CAAC,CAAC,SAAS,qBAAqB,GAAG,qBAAqB,EACzE,IAAI,EAAE,KACJ,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,wBAAwB,EAC1C,GAAG,CAAC,EAAE,MAAM,KACT,CAAC,EACN,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,CAAC,CAAC,CA2CZ;CACF;AAED,OAAO,EAAE,qBAAqB,IAAI,cAAc,EAAE,CAAC;AACnD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"browser.d.ts","sourceRoot":"","sources":["../../../src/embedded/entrypoints/browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAyB,MAAM,sBAAsB,CAAC;AAC7E,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAElE,OAAO,EAAE,KAAK,GAAG,EAAwD,MAAM,wBAAwB,CAAC;AAOxG,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAmB,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAA8B,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAEvE,qBAAa,qBAAsB,SAAQ,cAAc;IACvD,OAAa,MAAM,CAAC,CAAC,SAAS,qBAAqB,GAAG,qBAAqB,EACzE,IAAI,EAAE,KACJ,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,wBAAwB,EAC1C,GAAG,CAAC,EAAE,MAAM,KACT,CAAC,EACN,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,CAAC,CAAC,CA4DZ;CACF;AAED,OAAO,EAAE,qBAAqB,IAAI,cAAc,EAAE,CAAC;AACnD,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,41 +1,71 @@
1
1
  import { createAztecNodeClient } from '@aztec/aztec.js/node';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
- import { createStore, openTmpStore } from '@aztec/kv-store/indexeddb';
4
- import { createPXE } from '@aztec/pxe/client/lazy';
3
+ import { openTmpStore } from '@aztec/kv-store/sqlite-opfs';
4
+ import { createPXE, openBrowserStore } from '@aztec/pxe/client/lazy';
5
5
  import { getPXEConfig } from '@aztec/pxe/config';
6
+ import { getStandardAuthRegistry } from '@aztec/standard-contracts/auth-registry/lazy';
7
+ import { getStandardHandshakeRegistry } from '@aztec/standard-contracts/handshake-registry/lazy';
8
+ import { getStandardMultiCallEntrypoint } from '@aztec/standard-contracts/multi-call-entrypoint/lazy';
6
9
  import { LazyAccountContractsProvider } from '../account-contract-providers/lazy.js';
7
- import { EmbeddedWallet } from '../embedded_wallet.js';
8
- import { WalletDB } from '../wallet_db.js';
10
+ import { EmbeddedWallet, splitPxeOptions } from '../embedded_wallet.js';
11
+ import { WALLET_DATA_SCHEMA_VERSION, WalletDB } from '../wallet_db.js';
9
12
  export class BrowserEmbeddedWallet extends EmbeddedWallet {
10
13
  static async create(nodeOrUrl, options = {}) {
11
14
  const rootLogger = options.logger ?? createLogger('embedded-wallet');
12
15
  const aztecNode = typeof nodeOrUrl === 'string' ? createAztecNodeClient(nodeOrUrl) : nodeOrUrl;
13
- const l1Contracts = await aztecNode.getL1ContractAddresses();
16
+ // Support both the new unified `pxe` option and the deprecated `pxeConfig`/`pxeOptions`.
17
+ const { config: pxeConfigFromPxe, creation: pxeCreationFromPxe } = splitPxeOptions(options.pxe);
18
+ const mergedConfigOverrides = {
19
+ ...options.pxeConfig,
20
+ ...pxeConfigFromPxe
21
+ };
22
+ const mergedCreationOverrides = {
23
+ ...options.pxeOptions,
24
+ ...pxeCreationFromPxe
25
+ };
14
26
  const pxeConfig = Object.assign(getPXEConfig(), {
15
- proverEnabled: options.pxeConfig?.proverEnabled ?? false,
16
- dataDirectory: `pxe_data_${l1Contracts.rollupAddress}`,
17
- ...options.pxeConfig
27
+ proverEnabled: mergedConfigOverrides.proverEnabled,
28
+ // Unused in the browser: sqlite-opfs keys stores by name, not directory.
29
+ dataDirectory: 'pxe_data',
30
+ autoSync: false,
31
+ ...mergedConfigOverrides
18
32
  });
19
33
  if (options.ephemeral) {
20
34
  delete pxeConfig.dataDirectory;
21
35
  }
22
36
  const pxeOptions = {
23
- ...options.pxeOptions,
37
+ ...mergedCreationOverrides,
38
+ preloadedContractsProvider: mergedCreationOverrides.preloadedContractsProvider ?? {
39
+ getPreloadedContracts: async ()=>[
40
+ await getStandardMultiCallEntrypoint(),
41
+ await getStandardAuthRegistry(),
42
+ await getStandardHandshakeRegistry()
43
+ ]
44
+ },
24
45
  loggers: {
25
46
  store: rootLogger.createChild('pxe:data'),
26
47
  pxe: rootLogger.createChild('pxe:service'),
27
48
  prover: rootLogger.createChild('pxe:prover'),
28
- ...options.pxeOptions?.loggers
49
+ ...mergedCreationOverrides.loggers
29
50
  }
30
51
  };
31
52
  const pxe = await createPXE(aztecNode, pxeConfig, pxeOptions);
32
- const walletDBStore = options.ephemeral ? await openTmpStore(true) : await createStore('wallet_data', {
33
- dataDirectory: `wallet_data_${l1Contracts.rollupAddress}`,
34
- dataStoreMapSizeKb: pxeConfig.dataStoreMapSizeKb,
35
- l1Contracts
36
- }, 1, rootLogger.createChild('wallet:data'));
37
- const walletDB = WalletDB.init(walletDBStore, rootLogger.createChild('wallet:db').info);
38
- return new this(pxe, aztecNode, walletDB, new LazyAccountContractsProvider(), rootLogger);
53
+ let walletDBStore = options.walletDb?.store;
54
+ if (!walletDBStore) {
55
+ if (options.ephemeral) {
56
+ walletDBStore = await openTmpStore(true);
57
+ } else {
58
+ const { l1ChainId, l1ContractAddresses } = await aztecNode.getNodeInfo();
59
+ walletDBStore = await openBrowserStore('wallet_data', WALLET_DATA_SCHEMA_VERSION, {
60
+ l1ChainId,
61
+ rollupAddress: l1ContractAddresses.rollupAddress
62
+ }, rootLogger.createChild('wallet:data'));
63
+ }
64
+ }
65
+ const walletDB = new WalletDB(walletDBStore, rootLogger.createChild('wallet:db').info);
66
+ const wallet = new this(pxe, aztecNode, walletDB, new LazyAccountContractsProvider(), rootLogger);
67
+ await wallet.initStubClasses();
68
+ return wallet;
39
69
  }
40
70
  }
41
71
  export { BrowserEmbeddedWallet as EmbeddedWallet };
@@ -8,7 +8,7 @@ export declare class NodeEmbeddedWallet extends EmbeddedWallet {
8
8
  static create<T extends NodeEmbeddedWallet = NodeEmbeddedWallet>(this: new (pxe: PXE, aztecNode: AztecNode, walletDB: WalletDB, accountContracts: AccountContractsProvider, log?: Logger) => T, nodeOrUrl: string | AztecNode, options?: EmbeddedWalletOptions): Promise<T>;
9
9
  }
10
10
  export { NodeEmbeddedWallet as EmbeddedWallet };
11
- export type { EmbeddedWalletOptions } from '../embedded_wallet.js';
11
+ export type { EmbeddedWalletOptions, EmbeddedWalletPXEOptions } from '../embedded_wallet.js';
12
12
  export { WalletDB } from '../wallet_db.js';
13
13
  export type { AccountType } from '../wallet_db.js';
14
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VtYmVkZGVkL2VudHJ5cG9pbnRzL25vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBR2xFLE9BQU8sRUFBRSxLQUFLLEdBQUcsRUFBc0MsTUFBTSxtQkFBbUIsQ0FBQztBQUNqRixPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUdqRSxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQUUsS0FBSyxxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQ25GLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUUzQyxxQkFBYSxrQkFBbUIsU0FBUSxjQUFjO0lBQ3BELE9BQWEsTUFBTSxDQUFDLENBQUMsU0FBUyxrQkFBa0IsR0FBRyxrQkFBa0IsRUFDbkUsSUFBSSxFQUFFLEtBQ0osR0FBRyxFQUFFLEdBQUcsRUFDUixTQUFTLEVBQUUsU0FBUyxFQUNwQixRQUFRLEVBQUUsUUFBUSxFQUNsQixnQkFBZ0IsRUFBRSx3QkFBd0IsRUFDMUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxLQUNULENBQUMsRUFDTixTQUFTLEVBQUUsTUFBTSxHQUFHLFNBQVMsRUFDN0IsT0FBTyxHQUFFLHFCQUEwQixHQUNsQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBaURaO0NBQ0Y7QUFFRCxPQUFPLEVBQUUsa0JBQWtCLElBQUksY0FBYyxFQUFFLENBQUM7QUFDaEQsWUFBWSxFQUFFLHFCQUFxQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDbkUsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLFlBQVksRUFBRSxXQUFXLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQyJ9
14
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm9kZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2VtYmVkZGVkL2VudHJ5cG9pbnRzL25vZGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLEtBQUssTUFBTSxFQUFnQixNQUFNLHVCQUF1QixDQUFDO0FBR2xFLE9BQU8sRUFBRSxLQUFLLEdBQUcsRUFBaUQsTUFBTSxtQkFBbUIsQ0FBQztBQUk1RixPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUdqRSxPQUFPLEtBQUssRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHdDQUF3QyxDQUFDO0FBQ3ZGLE9BQU8sRUFBRSxjQUFjLEVBQUUsS0FBSyxxQkFBcUIsRUFBbUIsTUFBTSx1QkFBdUIsQ0FBQztBQUNwRyxPQUFPLEVBQThCLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBSXZFLHFCQUFhLGtCQUFtQixTQUFRLGNBQWM7SUFDcEQsT0FBYSxNQUFNLENBQUMsQ0FBQyxTQUFTLGtCQUFrQixHQUFHLGtCQUFrQixFQUNuRSxJQUFJLEVBQUUsS0FDSixHQUFHLEVBQUUsR0FBRyxFQUNSLFNBQVMsRUFBRSxTQUFTLEVBQ3BCLFFBQVEsRUFBRSxRQUFRLEVBQ2xCLGdCQUFnQixFQUFFLHdCQUF3QixFQUMxQyxHQUFHLENBQUMsRUFBRSxNQUFNLEtBQ1QsQ0FBQyxFQUNOLFNBQVMsRUFBRSxNQUFNLEdBQUcsU0FBUyxFQUM3QixPQUFPLEdBQUUscUJBQTBCLEdBQ2xDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FpRVo7Q0FDRjtBQUVELE9BQU8sRUFBRSxrQkFBa0IsSUFBSSxjQUFjLEVBQUUsQ0FBQztBQUNoRCxZQUFZLEVBQUUscUJBQXFCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM3RixPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDM0MsWUFBWSxFQUFFLFdBQVcsRUFBRSxNQUFNLGlCQUFpQixDQUFDIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/embedded/entrypoints/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,KAAK,GAAG,EAAsC,MAAM,mBAAmB,CAAC;AACjF,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAE3C,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAa,MAAM,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,EACnE,IAAI,EAAE,KACJ,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,wBAAwB,EAC1C,GAAG,CAAC,EAAE,MAAM,KACT,CAAC,EACN,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,CAAC,CAAC,CAiDZ;CACF;AAED,OAAO,EAAE,kBAAkB,IAAI,cAAc,EAAE,CAAC;AAChD,YAAY,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"node.d.ts","sourceRoot":"","sources":["../../../src/embedded/entrypoints/node.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAgB,MAAM,uBAAuB,CAAC;AAGlE,OAAO,EAAE,KAAK,GAAG,EAAiD,MAAM,mBAAmB,CAAC;AAI5F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AAGjE,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AACvF,OAAO,EAAE,cAAc,EAAE,KAAK,qBAAqB,EAAmB,MAAM,uBAAuB,CAAC;AACpG,OAAO,EAA8B,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAIvE,qBAAa,kBAAmB,SAAQ,cAAc;IACpD,OAAa,MAAM,CAAC,CAAC,SAAS,kBAAkB,GAAG,kBAAkB,EACnE,IAAI,EAAE,KACJ,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,SAAS,EACpB,QAAQ,EAAE,QAAQ,EAClB,gBAAgB,EAAE,wBAAwB,EAC1C,GAAG,CAAC,EAAE,MAAM,KACT,CAAC,EACN,SAAS,EAAE,MAAM,GAAG,SAAS,EAC7B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,CAAC,CAAC,CAiEZ;CACF;AAED,OAAO,EAAE,kBAAkB,IAAI,cAAc,EAAE,CAAC;AAChD,YAAY,EAAE,qBAAqB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC7F,OAAO,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAC3C,YAAY,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC"}
@@ -1,41 +1,74 @@
1
1
  import { createAztecNodeClient } from '@aztec/aztec.js/node';
2
2
  import { createLogger } from '@aztec/foundation/log';
3
- import { createStore, openTmpStore } from '@aztec/kv-store/lmdb-v2';
3
+ import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
4
4
  import { getPXEConfig } from '@aztec/pxe/config';
5
- import { createPXE } from '@aztec/pxe/server';
5
+ import { createPXE, openStore } from '@aztec/pxe/server';
6
+ import { getStandardAuthRegistry } from '@aztec/standard-contracts/auth-registry';
7
+ import { getStandardHandshakeRegistry } from '@aztec/standard-contracts/handshake-registry';
8
+ import { getStandardMultiCallEntrypoint } from '@aztec/standard-contracts/multi-call-entrypoint';
6
9
  import { BundleAccountContractsProvider } from '../account-contract-providers/bundle.js';
7
- import { EmbeddedWallet } from '../embedded_wallet.js';
8
- import { WalletDB } from '../wallet_db.js';
10
+ import { EmbeddedWallet, splitPxeOptions } from '../embedded_wallet.js';
11
+ import { WALLET_DATA_SCHEMA_VERSION, WalletDB } from '../wallet_db.js';
12
+ const DEFAULT_WALLET_DATA_DIRECTORY = 'aztec-wallet-data';
9
13
  export class NodeEmbeddedWallet extends EmbeddedWallet {
10
14
  static async create(nodeOrUrl, options = {}) {
11
15
  const rootLogger = options.logger ?? createLogger('embedded-wallet');
12
16
  const aztecNode = typeof nodeOrUrl === 'string' ? createAztecNodeClient(nodeOrUrl) : nodeOrUrl;
13
- const l1Contracts = await aztecNode.getL1ContractAddresses();
17
+ // Support both the new unified `pxe` option and the deprecated `pxeConfig`/`pxeOptions`.
18
+ const { config: pxeConfigFromPxe, creation: pxeCreationFromPxe } = splitPxeOptions(options.pxe);
19
+ const mergedConfigOverrides = {
20
+ ...options.pxeConfig,
21
+ ...pxeConfigFromPxe
22
+ };
23
+ const mergedCreationOverrides = {
24
+ ...options.pxeOptions,
25
+ ...pxeCreationFromPxe
26
+ };
14
27
  const pxeConfig = Object.assign(getPXEConfig(), {
15
- proverEnabled: options.pxeConfig?.proverEnabled ?? false,
16
- dataDirectory: `pxe_data_${l1Contracts.rollupAddress}`,
17
- ...options.pxeConfig
28
+ proverEnabled: mergedConfigOverrides.proverEnabled,
29
+ dataDirectory: DEFAULT_WALLET_DATA_DIRECTORY,
30
+ autoSync: false,
31
+ ...mergedConfigOverrides
18
32
  });
19
33
  if (options.ephemeral) {
20
34
  delete pxeConfig.dataDirectory;
21
35
  }
22
36
  const pxeOptions = {
23
- ...options.pxeOptions,
37
+ ...mergedCreationOverrides,
38
+ preloadedContractsProvider: mergedCreationOverrides.preloadedContractsProvider ?? {
39
+ getPreloadedContracts: async ()=>[
40
+ await getStandardMultiCallEntrypoint(),
41
+ await getStandardAuthRegistry(),
42
+ await getStandardHandshakeRegistry()
43
+ ]
44
+ },
24
45
  loggers: {
25
46
  store: rootLogger.createChild('pxe:data'),
26
47
  pxe: rootLogger.createChild('pxe:service'),
27
48
  prover: rootLogger.createChild('pxe:prover'),
28
- ...options.pxeOptions?.loggers
49
+ ...mergedCreationOverrides.loggers
29
50
  }
30
51
  };
31
52
  const pxe = await createPXE(aztecNode, pxeConfig, pxeOptions);
32
- const walletDBStore = options.ephemeral ? await openTmpStore(`wallet_data_${l1Contracts.rollupAddress}`, true, undefined, undefined, rootLogger.createChild('wallet:data').getBindings()) : await createStore('wallet_data', 1, {
33
- dataDirectory: `wallet_data_${l1Contracts.rollupAddress}`,
34
- dataStoreMapSizeKb: pxeConfig.dataStoreMapSizeKb,
35
- l1Contracts
36
- }, rootLogger.createChild('wallet:data').getBindings());
37
- const walletDB = WalletDB.init(walletDBStore, rootLogger.createChild('wallet:db').info);
38
- return new this(pxe, aztecNode, walletDB, new BundleAccountContractsProvider(), rootLogger);
53
+ let walletDBStore = options.walletDb?.store;
54
+ if (!walletDBStore) {
55
+ const bindings = rootLogger.createChild('wallet:data').getBindings();
56
+ if (options.ephemeral) {
57
+ walletDBStore = await openTmpStore('wallet_data', true, undefined, undefined, bindings);
58
+ } else {
59
+ const { l1ChainId, l1ContractAddresses } = await aztecNode.getNodeInfo();
60
+ walletDBStore = await openStore('wallet_data', WALLET_DATA_SCHEMA_VERSION, {
61
+ dataDirectory: pxeConfig.dataDirectory ?? DEFAULT_WALLET_DATA_DIRECTORY,
62
+ dataStoreMapSizeKb: pxeConfig.dataStoreMapSizeKb,
63
+ l1ChainId,
64
+ rollupAddress: l1ContractAddresses.rollupAddress
65
+ }, bindings);
66
+ }
67
+ }
68
+ const walletDB = new WalletDB(walletDBStore, rootLogger.createChild('wallet:db').info);
69
+ const wallet = new this(pxe, aztecNode, walletDB, new BundleAccountContractsProvider(), rootLogger);
70
+ await wallet.initStubClasses();
71
+ return wallet;
39
72
  }
40
73
  }
41
74
  export { NodeEmbeddedWallet as EmbeddedWallet };