Skip to content

Commit 5c55805

Browse files
authored
fix(pxe): support custom PrivateKernelProver and unify EmbeddedWalletOptions (backport #22348) (#22391)
## Summary Backport of #22348 to v4-next. Cherry-pick of merge commit cac2411 with one conflict in `migration_notes.md` (trivially resolved — empty HEAD side, accepted incoming migration note). ### Changes - Replace `instanceof BBPrivateKernelProver` with duck-type `isPrivateKernelProver()` check using `createChonkProof` as distinguishing method - Unify `pxeConfig`/`pxeOptions` into single `pxe` field on `EmbeddedWalletOptions` - Add `splitPxeOptions` helper and `EmbeddedWalletPXEOptions` type - Add migration note for the API change ### Commit structure (3-commit backport) 1. Cherry-pick with conflict markers as-is 2. Conflict resolution (accept migration note) ClaudeBox log: https://claudebox.work/s/947bc828b6966f6c?run=1
2 parents 8630b41 + d24175e commit 5c55805

8 files changed

Lines changed: 76 additions & 23 deletions

File tree

docs/docs-developers/docs/resources/migration_notes.md

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,22 @@ FPCs that use only Fee Juice still work on all networks, since FeeJuice is a pro
9191

9292
Similarly, the `fpc-public` and `fpc-private` CLI wallet payment methods use the reference Token-based FPC and will not work on public networks. Use `fee_juice` for direct Fee Juice payment, or `fpc-sponsored` on devnet and local network.
9393

94+
### [aztec.js] `EmbeddedWalletOptions` now uses a unified `pxe` field
95+
96+
The `pxeConfig` and `pxeOptions` fields on `EmbeddedWalletOptions` have been deprecated in favor of a single `pxe` field that accepts both PXE configuration and dependency overrides (custom prover, store, simulator):
97+
98+
```diff
99+
const wallet = await EmbeddedWallet.create(nodeUrl, {
100+
- pxeConfig: { proverEnabled: true },
101+
- pxeOptions: { proverOrOptions: myCustomProver },
102+
+ pxe: {
103+
+ proverEnabled: true,
104+
+ proverOrOptions: myCustomProver,
105+
+ },
106+
});
107+
```
108+
109+
The old fields still work but will be removed in a future release.
94110

95111
### [Aztec.nr] Domain-separated tags on log emission
96112

yarn-project/pxe/src/entrypoints/client/bundle/utils.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
21
import { BBBundlePrivateKernelProver } from '@aztec/bb-prover/client/bundle';
32
import { createLogger } from '@aztec/foundation/log';
43
import { createStore } from '@aztec/kv-store/indexeddb';
@@ -9,7 +8,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
98
import type { PXEConfig } from '../../../config/index.js';
109
import { PXE } from '../../../pxe.js';
1110
import { PXE_DATA_SCHEMA_VERSION } from '../../../storage/metadata.js';
12-
import type { PXECreationOptions } from '../../pxe_creation_options.js';
11+
import { type PXECreationOptions, isPrivateKernelProver } from '../../pxe_creation_options.js';
1312

1413
/**
1514
* Create and start an PXE instance with the given AztecNode.
@@ -44,7 +43,7 @@ export async function createPXE(
4443
const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
4544

4645
let prover;
47-
if (options.proverOrOptions instanceof BBPrivateKernelProver) {
46+
if (isPrivateKernelProver(options.proverOrOptions)) {
4847
prover = options.proverOrOptions;
4948
} else {
5049
prover = new BBBundlePrivateKernelProver(simulator, { ...options.proverOrOptions, logger: proverLogger });

yarn-project/pxe/src/entrypoints/client/lazy/utils.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
21
import { BBLazyPrivateKernelProver } from '@aztec/bb-prover/client/lazy';
32
import { createLogger } from '@aztec/foundation/log';
43
import { createStore } from '@aztec/kv-store/indexeddb';
@@ -9,7 +8,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
98
import type { PXEConfig } from '../../../config/index.js';
109
import { PXE } from '../../../pxe.js';
1110
import { PXE_DATA_SCHEMA_VERSION } from '../../../storage/metadata.js';
12-
import type { PXECreationOptions } from '../../pxe_creation_options.js';
11+
import { type PXECreationOptions, isPrivateKernelProver } from '../../pxe_creation_options.js';
1312

1413
/**
1514
* Create and start an PXE instance with the given AztecNode.
@@ -44,7 +43,7 @@ export async function createPXE(
4443
const proverLogger = loggers.prover ?? createLogger('pxe:bb:wasm:bundle', { actor });
4544

4645
let prover;
47-
if (options.proverOrOptions instanceof BBPrivateKernelProver) {
46+
if (isPrivateKernelProver(options.proverOrOptions)) {
4847
prover = options.proverOrOptions;
4948
} else {
5049
prover = new BBLazyPrivateKernelProver(simulator, { ...options.proverOrOptions, logger: proverLogger });

yarn-project/pxe/src/entrypoints/pxe_creation_options.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,10 @@ export type PXECreationOptions = {
1212
store?: AztecAsyncKVStore;
1313
simulator?: CircuitSimulator;
1414
};
15+
16+
/** Checks if the given value implements the PrivateKernelProver interface via duck-typing. */
17+
export function isPrivateKernelProver(value: unknown): value is PrivateKernelProver {
18+
return (
19+
typeof value === 'object' && value !== null && typeof (value as PrivateKernelProver).createChonkProof === 'function'
20+
);
21+
}

yarn-project/pxe/src/entrypoints/server/utils.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { BBPrivateKernelProver } from '@aztec/bb-prover/client';
21
import { BBBundlePrivateKernelProver } from '@aztec/bb-prover/client/bundle';
32
import { createLogger } from '@aztec/foundation/log';
43
import { createStore } from '@aztec/kv-store/lmdb-v2';
@@ -10,7 +9,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
109
import type { PXEConfig } from '../../config/index.js';
1110
import { PXE } from '../../pxe.js';
1211
import { PXE_DATA_SCHEMA_VERSION } from '../../storage/index.js';
13-
import type { PXECreationOptions } from '../pxe_creation_options.js';
12+
import { type PXECreationOptions, isPrivateKernelProver } from '../pxe_creation_options.js';
1413

1514
type PXEConfigWithoutDefaults = Omit<PXEConfig, 'l1Contracts' | 'l1ChainId' | 'l2BlockBatchSize' | 'rollupVersion'>;
1615

@@ -49,7 +48,7 @@ export async function createPXE(
4948
const proverLogger = loggers.prover ?? createLogger('pxe:bb:native', { actor });
5049

5150
let prover;
52-
if (options.proverOrOptions instanceof BBPrivateKernelProver) {
51+
if (isPrivateKernelProver(options.proverOrOptions)) {
5352
prover = options.proverOrOptions;
5453
} else {
5554
prover = new BBBundlePrivateKernelProver(simulator, { ...options.proverOrOptions, logger: proverLogger });

yarn-project/wallets/src/embedded/embedded_wallet.ts

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,14 +29,37 @@ import { BaseWallet, type SimulateViaEntrypointOptions } from '@aztec/wallet-sdk
2929
import type { AccountContractsProvider } from './account-contract-providers/types.js';
3030
import { type AccountType, WalletDB } from './wallet_db.js';
3131

32+
/** Options for the PXE instance created by the EmbeddedWallet. */
33+
export type EmbeddedWalletPXEOptions = Partial<PXEConfig> & PXECreationOptions;
34+
35+
/** Splits a unified EmbeddedWalletPXEOptions into PXEConfig overrides and PXECreationOptions. */
36+
export function splitPxeOptions(pxe?: EmbeddedWalletPXEOptions): {
37+
config: Partial<PXEConfig>;
38+
creation: PXECreationOptions;
39+
} {
40+
if (!pxe) {
41+
return { config: {}, creation: {} };
42+
}
43+
const { loggers, loggerActorLabel, proverOrOptions, store, simulator, ...config } = pxe;
44+
return { config, creation: { loggers, loggerActorLabel, proverOrOptions, store, simulator } };
45+
}
46+
3247
export type EmbeddedWalletOptions = {
3348
/** Parent logger. Child loggers are derived via createChild() for each subsystem. */
3449
logger?: Logger;
3550
/** Use ephemeral (in-memory) stores. Data will not persist across sessions. */
3651
ephemeral?: boolean;
37-
/** Override PXE configuration. */
52+
/** PXE configuration and dependency overrides (custom store, prover, simulator). */
53+
pxe?: EmbeddedWalletPXEOptions;
54+
/**
55+
* Override PXE configuration.
56+
* @deprecated Use `pxe` instead.
57+
*/
3858
pxeConfig?: Partial<PXEConfig>;
39-
/** Advanced PXE creation options (custom store, prover, simulator). */
59+
/**
60+
* Advanced PXE creation options (custom store, prover, simulator).
61+
* @deprecated Use `pxe` instead.
62+
*/
4063
pxeOptions?: PXECreationOptions;
4164
};
4265

yarn-project/wallets/src/embedded/entrypoints/browser.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import { type PXEConfig, getPXEConfig } from '@aztec/pxe/config';
66

77
import { LazyAccountContractsProvider } from '../account-contract-providers/lazy.js';
88
import type { AccountContractsProvider } from '../account-contract-providers/types.js';
9-
import { EmbeddedWallet, type EmbeddedWalletOptions } from '../embedded_wallet.js';
9+
import { EmbeddedWallet, type EmbeddedWalletOptions, splitPxeOptions } from '../embedded_wallet.js';
1010
import { WalletDB } from '../wallet_db.js';
1111

1212
export class BrowserEmbeddedWallet extends EmbeddedWallet {
@@ -26,23 +26,28 @@ export class BrowserEmbeddedWallet extends EmbeddedWallet {
2626
const aztecNode = typeof nodeOrUrl === 'string' ? createAztecNodeClient(nodeOrUrl) : nodeOrUrl;
2727
const l1Contracts = await aztecNode.getL1ContractAddresses();
2828

29+
// Support both the new unified `pxe` option and the deprecated `pxeConfig`/`pxeOptions`.
30+
const { config: pxeConfigFromPxe, creation: pxeCreationFromPxe } = splitPxeOptions(options.pxe);
31+
const mergedConfigOverrides = { ...options.pxeConfig, ...pxeConfigFromPxe };
32+
const mergedCreationOverrides: PXECreationOptions = { ...options.pxeOptions, ...pxeCreationFromPxe };
33+
2934
const pxeConfig: PXEConfig = Object.assign(getPXEConfig(), {
30-
proverEnabled: options.pxeConfig?.proverEnabled ?? false,
35+
proverEnabled: mergedConfigOverrides.proverEnabled ?? false,
3136
dataDirectory: `pxe_data_${l1Contracts.rollupAddress}`,
32-
...options.pxeConfig,
37+
...mergedConfigOverrides,
3338
});
3439

3540
if (options.ephemeral) {
3641
delete pxeConfig.dataDirectory;
3742
}
3843

3944
const pxeOptions: PXECreationOptions = {
40-
...options.pxeOptions,
45+
...mergedCreationOverrides,
4146
loggers: {
4247
store: rootLogger.createChild('pxe:data'),
4348
pxe: rootLogger.createChild('pxe:service'),
4449
prover: rootLogger.createChild('pxe:prover'),
45-
...options.pxeOptions?.loggers,
50+
...mergedCreationOverrides.loggers,
4651
},
4752
};
4853

@@ -67,6 +72,6 @@ export class BrowserEmbeddedWallet extends EmbeddedWallet {
6772
}
6873

6974
export { BrowserEmbeddedWallet as EmbeddedWallet };
70-
export type { EmbeddedWalletOptions } from '../embedded_wallet.js';
75+
export type { EmbeddedWalletOptions, EmbeddedWalletPXEOptions } from '../embedded_wallet.js';
7176
export { WalletDB } from '../wallet_db.js';
7277
export type { AccountType } from '../wallet_db.js';

yarn-project/wallets/src/embedded/entrypoints/node.ts

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import type { AztecNode } from '@aztec/stdlib/interfaces/client';
77

88
import { BundleAccountContractsProvider } from '../account-contract-providers/bundle.js';
99
import type { AccountContractsProvider } from '../account-contract-providers/types.js';
10-
import { EmbeddedWallet, type EmbeddedWalletOptions } from '../embedded_wallet.js';
10+
import { EmbeddedWallet, type EmbeddedWalletOptions, splitPxeOptions } from '../embedded_wallet.js';
1111
import { WalletDB } from '../wallet_db.js';
1212

1313
export class NodeEmbeddedWallet extends EmbeddedWallet {
@@ -27,23 +27,28 @@ export class NodeEmbeddedWallet extends EmbeddedWallet {
2727
const aztecNode = typeof nodeOrUrl === 'string' ? createAztecNodeClient(nodeOrUrl) : nodeOrUrl;
2828
const l1Contracts = await aztecNode.getL1ContractAddresses();
2929

30+
// Support both the new unified `pxe` option and the deprecated `pxeConfig`/`pxeOptions`.
31+
const { config: pxeConfigFromPxe, creation: pxeCreationFromPxe } = splitPxeOptions(options.pxe);
32+
const mergedConfigOverrides = { ...options.pxeConfig, ...pxeConfigFromPxe };
33+
const mergedCreationOverrides: PXECreationOptions = { ...options.pxeOptions, ...pxeCreationFromPxe };
34+
3035
const pxeConfig: PXEConfig = Object.assign(getPXEConfig(), {
31-
proverEnabled: options.pxeConfig?.proverEnabled ?? false,
36+
proverEnabled: mergedConfigOverrides.proverEnabled ?? false,
3237
dataDirectory: `pxe_data_${l1Contracts.rollupAddress}`,
33-
...options.pxeConfig,
38+
...mergedConfigOverrides,
3439
});
3540

3641
if (options.ephemeral) {
3742
delete pxeConfig.dataDirectory;
3843
}
3944

4045
const pxeOptions: PXECreationOptions = {
41-
...options.pxeOptions,
46+
...mergedCreationOverrides,
4247
loggers: {
4348
store: rootLogger.createChild('pxe:data'),
4449
pxe: rootLogger.createChild('pxe:service'),
4550
prover: rootLogger.createChild('pxe:prover'),
46-
...options.pxeOptions?.loggers,
51+
...mergedCreationOverrides.loggers,
4752
},
4853
};
4954

@@ -74,6 +79,6 @@ export class NodeEmbeddedWallet extends EmbeddedWallet {
7479
}
7580

7681
export { NodeEmbeddedWallet as EmbeddedWallet };
77-
export type { EmbeddedWalletOptions } from '../embedded_wallet.js';
82+
export type { EmbeddedWalletOptions, EmbeddedWalletPXEOptions } from '../embedded_wallet.js';
7883
export { WalletDB } from '../wallet_db.js';
7984
export type { AccountType } from '../wallet_db.js';

0 commit comments

Comments
 (0)