@aztec/end-to-end 0.0.1-commit.684755437 → 0.0.1-commit.6b113946b

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 (43) hide show
  1. package/dest/e2e_epochs/epochs_test.d.ts +3 -1
  2. package/dest/e2e_epochs/epochs_test.d.ts.map +1 -1
  3. package/dest/e2e_epochs/epochs_test.js +5 -2
  4. package/dest/e2e_p2p/reqresp/utils.d.ts +1 -1
  5. package/dest/e2e_p2p/reqresp/utils.d.ts.map +1 -1
  6. package/dest/e2e_p2p/reqresp/utils.js +15 -2
  7. package/dest/e2e_p2p/shared.d.ts +12 -6
  8. package/dest/e2e_p2p/shared.d.ts.map +1 -1
  9. package/dest/e2e_p2p/shared.js +17 -9
  10. package/dest/fixtures/setup.d.ts +6 -1
  11. package/dest/fixtures/setup.d.ts.map +1 -1
  12. package/dest/fixtures/setup.js +2 -1
  13. package/dest/shared/uniswap_l1_l2.d.ts +1 -1
  14. package/dest/shared/uniswap_l1_l2.d.ts.map +1 -1
  15. package/dest/shared/uniswap_l1_l2.js +9 -12
  16. package/dest/simulators/token_simulator.js +1 -1
  17. package/dest/spartan/setup_test_wallets.d.ts +4 -2
  18. package/dest/spartan/setup_test_wallets.d.ts.map +1 -1
  19. package/dest/spartan/setup_test_wallets.js +19 -7
  20. package/dest/spartan/utils/config.d.ts +4 -1
  21. package/dest/spartan/utils/config.d.ts.map +1 -1
  22. package/dest/spartan/utils/config.js +1 -0
  23. package/dest/spartan/utils/index.d.ts +2 -1
  24. package/dest/spartan/utils/index.d.ts.map +1 -1
  25. package/dest/spartan/utils/index.js +2 -0
  26. package/dest/spartan/utils/pod_logs.d.ts +25 -0
  27. package/dest/spartan/utils/pod_logs.d.ts.map +1 -0
  28. package/dest/spartan/utils/pod_logs.js +74 -0
  29. package/dest/test-wallet/test_wallet.d.ts +10 -17
  30. package/dest/test-wallet/test_wallet.d.ts.map +1 -1
  31. package/dest/test-wallet/test_wallet.js +31 -31
  32. package/package.json +39 -40
  33. package/src/e2e_epochs/epochs_test.ts +14 -2
  34. package/src/e2e_p2p/reqresp/utils.ts +23 -2
  35. package/src/e2e_p2p/shared.ts +20 -10
  36. package/src/fixtures/setup.ts +6 -0
  37. package/src/shared/uniswap_l1_l2.ts +29 -24
  38. package/src/simulators/token_simulator.ts +1 -1
  39. package/src/spartan/setup_test_wallets.ts +44 -6
  40. package/src/spartan/utils/config.ts +1 -0
  41. package/src/spartan/utils/index.ts +3 -0
  42. package/src/spartan/utils/pod_logs.ts +99 -0
  43. package/src/test-wallet/test_wallet.ts +29 -41
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spartan/utils/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,8BAA8B,EAC9B,sBAAsB,EACtB,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,EACX,KAAK,eAAe,EACpB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,mCAAmC,EACnC,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAGhF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,8BAA8B,EAC9B,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG5F,OAAO,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/spartan/utils/index.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAGhE,OAAO,EAAE,KAAK,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAGhH,OAAO,EACL,gBAAgB,EAChB,aAAa,EACb,8BAA8B,EAC9B,sBAAsB,EACtB,2BAA2B,EAC3B,oBAAoB,EACpB,qBAAqB,EACrB,sBAAsB,EACtB,qBAAqB,EACrB,sBAAsB,EACtB,WAAW,EACX,KAAK,eAAe,EACpB,kBAAkB,EAClB,cAAc,EACd,mBAAmB,EACnB,mCAAmC,EACnC,iBAAiB,GAClB,MAAM,UAAU,CAAC;AAGlB,OAAO,EACL,kBAAkB,EAClB,qBAAqB,EACrB,kBAAkB,EAClB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,oBAAoB,EACpB,kBAAkB,EAClB,mBAAmB,GACpB,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,sBAAsB,EAAE,MAAM,WAAW,CAAC;AAGnD,OAAO,EAAE,UAAU,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAC;AAGhF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,EACtB,aAAa,EACb,sBAAsB,EACtB,mBAAmB,EACnB,mBAAmB,EACnB,kBAAkB,EAClB,iBAAiB,EACjB,8BAA8B,EAC9B,aAAa,GACd,MAAM,YAAY,CAAC;AAGpB,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG5F,OAAO,EAAE,WAAW,EAAE,KAAK,mBAAmB,EAAE,MAAM,aAAa,CAAC;AAGpE,OAAO,EAAE,KAAK,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC"}
@@ -18,3 +18,5 @@ export { awaitCheckpointNumber, waitForProvenToAdvance, getSequencers, updateSeq
18
18
  export { getPublicViemClient, getL1DeploymentAddresses, getNodeClient } from './clients.js';
19
19
  // Health checks
20
20
  export { ChainHealth } from './health.js';
21
+ // Pod log extraction
22
+ export { fetchBlockBuiltLogs } from './pod_logs.js';
@@ -0,0 +1,25 @@
1
+ import type { Logger } from '@aztec/foundation/log';
2
+ /** Parsed l2-block-built stats from a sequencer pod log line. */
3
+ export type BlockBuiltLogEntry = {
4
+ blockNumber: number;
5
+ txCount: number;
6
+ duration: number;
7
+ publicProcessDuration: number;
8
+ manaPerSec: number;
9
+ privateLogCount: number;
10
+ publicLogCount: number;
11
+ contractClassLogCount: number;
12
+ contractClassLogSize: number;
13
+ };
14
+ /**
15
+ * Fetches l2-block-built log entries from sequencer pods for given block numbers.
16
+ * Queries all validator pods (only the proposer will have the log for a given block).
17
+ *
18
+ * @param namespace - Kubernetes namespace
19
+ * @param sinceTime - ISO 8601 timestamp to limit log search (e.g., from before block building was re-enabled)
20
+ * @param blockNumbers - Set of block numbers to filter for
21
+ * @param logger - Logger instance
22
+ * @returns Array of parsed BlockBuiltLogEntry, de-duplicated by blockNumber, sorted ascending
23
+ */
24
+ export declare function fetchBlockBuiltLogs(namespace: string, sinceTime: string, blockNumbers: Set<number>, logger: Logger): Promise<BlockBuiltLogEntry[]>;
25
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicG9kX2xvZ3MuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9zcGFydGFuL3V0aWxzL3BvZF9sb2dzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBU3BELGlFQUFpRTtBQUNqRSxNQUFNLE1BQU0sa0JBQWtCLEdBQUc7SUFDL0IsV0FBVyxFQUFFLE1BQU0sQ0FBQztJQUNwQixPQUFPLEVBQUUsTUFBTSxDQUFDO0lBQ2hCLFFBQVEsRUFBRSxNQUFNLENBQUM7SUFDakIscUJBQXFCLEVBQUUsTUFBTSxDQUFDO0lBQzlCLFVBQVUsRUFBRSxNQUFNLENBQUM7SUFDbkIsZUFBZSxFQUFFLE1BQU0sQ0FBQztJQUN4QixjQUFjLEVBQUUsTUFBTSxDQUFDO0lBQ3ZCLHFCQUFxQixFQUFFLE1BQU0sQ0FBQztJQUM5QixvQkFBb0IsRUFBRSxNQUFNLENBQUM7Q0FDOUIsQ0FBQztBQWNGOzs7Ozs7Ozs7R0FTRztBQUNILHdCQUFzQixtQkFBbUIsQ0FDdkMsU0FBUyxFQUFFLE1BQU0sRUFDakIsU0FBUyxFQUFFLE1BQU0sRUFDakIsWUFBWSxFQUFFLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFDekIsTUFBTSxFQUFFLE1BQU0sR0FDYixPQUFPLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQWlEL0IifQ==
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pod_logs.d.ts","sourceRoot":"","sources":["../../../src/spartan/utils/pod_logs.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AASpD,iEAAiE;AACjE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;IACxB,cAAc,EAAE,MAAM,CAAC;IACvB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,oBAAoB,EAAE,MAAM,CAAC;CAC9B,CAAC;AAcF;;;;;;;;;GASG;AACH,wBAAsB,mBAAmB,CACvC,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,GAAG,CAAC,MAAM,CAAC,EACzB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,kBAAkB,EAAE,CAAC,CAiD/B"}
@@ -0,0 +1,74 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { getSequencers } from './nodes.js';
4
+ const execAsync = promisify(exec);
5
+ const FIELDS = [
6
+ 'blockNumber',
7
+ 'txCount',
8
+ 'duration',
9
+ 'publicProcessDuration',
10
+ 'manaPerSec',
11
+ 'privateLogCount',
12
+ 'publicLogCount',
13
+ 'contractClassLogCount',
14
+ 'contractClassLogSize'
15
+ ];
16
+ /**
17
+ * Fetches l2-block-built log entries from sequencer pods for given block numbers.
18
+ * Queries all validator pods (only the proposer will have the log for a given block).
19
+ *
20
+ * @param namespace - Kubernetes namespace
21
+ * @param sinceTime - ISO 8601 timestamp to limit log search (e.g., from before block building was re-enabled)
22
+ * @param blockNumbers - Set of block numbers to filter for
23
+ * @param logger - Logger instance
24
+ * @returns Array of parsed BlockBuiltLogEntry, de-duplicated by blockNumber, sorted ascending
25
+ */ export async function fetchBlockBuiltLogs(namespace, sinceTime, blockNumbers, logger) {
26
+ const pods = await getSequencers(namespace);
27
+ const entriesByBlock = new Map();
28
+ // Subtract 60s from sinceTime to account for clock skew between test runner and k8s pods.
29
+ // Block number filtering ensures we only match the right blocks, so extra lines are harmless.
30
+ const sinceDate = new Date(new Date(sinceTime).getTime() - 60_000);
31
+ const sinceFlag = sinceDate.toISOString();
32
+ for (const pod of pods){
33
+ try {
34
+ const cmd = `kubectl logs ${pod} -n ${namespace} -c aztec --since-time=${sinceFlag}`;
35
+ logger.info(`Fetching logs: ${cmd}`);
36
+ const { stdout } = await execAsync(cmd, {
37
+ maxBuffer: 10 * 1024 * 1024
38
+ });
39
+ const lines = stdout.split('\n');
40
+ const matchingLines = lines.filter((l)=>l.includes('l2-block-built'));
41
+ logger.info(`Pod ${pod}: ${lines.length} log lines, ${matchingLines.length} contain l2-block-built`);
42
+ for (const line of matchingLines){
43
+ try {
44
+ const parsed = JSON.parse(line);
45
+ if (parsed.eventName !== 'l2-block-built' || !blockNumbers.has(parsed.blockNumber)) {
46
+ continue;
47
+ }
48
+ if (entriesByBlock.has(parsed.blockNumber)) {
49
+ continue;
50
+ }
51
+ const entry = {};
52
+ for (const field of FIELDS){
53
+ entry[field] = parsed[field] ?? 0;
54
+ }
55
+ entriesByBlock.set(entry.blockNumber, entry);
56
+ logger.verbose(`Parsed l2-block-built log for block ${entry.blockNumber}`, entry);
57
+ } catch {
58
+ // Not valid JSON, skip
59
+ }
60
+ }
61
+ } catch (err) {
62
+ logger.warn(`Failed to fetch logs from pod ${pod}: ${err}`);
63
+ }
64
+ }
65
+ if (entriesByBlock.size < blockNumbers.size) {
66
+ const missing = [
67
+ ...blockNumbers
68
+ ].filter((bn)=>!entriesByBlock.has(bn));
69
+ logger.warn(`Missing l2-block-built logs for block(s): ${missing.join(', ')}`);
70
+ }
71
+ return [
72
+ ...entriesByBlock.values()
73
+ ].sort((a, b)=>a.blockNumber - b.blockNumber);
74
+ }
@@ -3,7 +3,7 @@ import { type CallIntent, type ContractFunctionInteractionCallIntent, type Inten
3
3
  import type { AztecNode } from '@aztec/aztec.js/node';
4
4
  import { AccountManager, type SendOptions } from '@aztec/aztec.js/wallet';
5
5
  import { Fq, Fr } from '@aztec/foundation/curves/bn254';
6
- import type { AccessScopes, NotesFilter } from '@aztec/pxe/client/lazy';
6
+ import type { NotesFilter } from '@aztec/pxe/client/lazy';
7
7
  import { type PXEConfig } from '@aztec/pxe/config';
8
8
  import { PXE, type PXECreationOptions } from '@aztec/pxe/server';
9
9
  import { AuthWitness } from '@aztec/stdlib/auth-witness';
@@ -11,7 +11,7 @@ import { AztecAddress } from '@aztec/stdlib/aztec-address';
11
11
  import type { NoteDao } from '@aztec/stdlib/note';
12
12
  import type { BlockHeader, TxHash, TxReceipt, TxSimulationResult } from '@aztec/stdlib/tx';
13
13
  import { ExecutionPayload } from '@aztec/stdlib/tx';
14
- import { BaseWallet, type FeeOptions } from '@aztec/wallet-sdk/base-wallet';
14
+ import { BaseWallet, type SimulateViaEntrypointOptions } from '@aztec/wallet-sdk/base-wallet';
15
15
  import { AztecNodeProxy, ProvenTx } from './utils.js';
16
16
  /**
17
17
  * Data for generating an account.
@@ -45,16 +45,13 @@ export declare class TestWallet extends BaseWallet {
45
45
  }>;
46
46
  protected accounts: Map<string, Account>;
47
47
  /**
48
- * Toggle for running "simulated simulations" when calling simulateTx.
49
- *
50
- * When this flag is true, simulateViaEntrypoint constructs a request using a fake account
51
- * (and accepts contract overrides on the input) and the PXE emulates kernel effects without
52
- * generating kernel witnesses. When false, simulateViaEntrypoint defers to the standard
53
- * simulation path via the real account entrypoint.
48
+ * Controls how the test wallet simulates transactions:
49
+ * - `kernelless`: Skips kernel circuits but uses the real account contract. Default.
50
+ * - `kernelless-override`: Skips kernels and replaces the account with a stub that doesn't do authwit validation.
51
+ * - `full`: Uses real kernel circuits and real account contracts. Slow!
54
52
  */
55
- private simulatedSimulations;
56
- enableSimulatedSimulations(): void;
57
- disableSimulatedSimulations(): void;
53
+ private simulationMode;
54
+ setSimulationMode(mode: 'kernelless' | 'kernelless-override' | 'full'): void;
58
55
  setMinFeePadding(value?: number): void;
59
56
  protected getAccountFromAddress(address: AztecAddress): Promise<Account>;
60
57
  getAccounts(): Promise<{
@@ -68,11 +65,7 @@ export declare class TestWallet extends BaseWallet {
68
65
  }>;
69
66
  setPublicAuthWit(from: AztecAddress, messageHashOrIntent: Fr | IntentInnerHash | CallIntent | ContractFunctionInteractionCallIntent, authorized: boolean): Promise<SetPublicAuthwitContractInteraction>;
70
67
  createAuthWit(from: AztecAddress, intent: IntentInnerHash | CallIntent | ContractFunctionInteractionCallIntent): Promise<AuthWitness>;
71
- /**
72
- * Override simulateViaEntrypoint to use fake accounts for kernelless simulation
73
- * when simulatedSimulations is enabled. Otherwise falls through to the real entrypoint path.
74
- */
75
- protected simulateViaEntrypoint(executionPayload: ExecutionPayload, from: AztecAddress, feeOptions: FeeOptions, scopes: AccessScopes, skipTxValidation?: boolean, skipFeeEnforcement?: boolean): Promise<TxSimulationResult>;
68
+ protected simulateViaEntrypoint(executionPayload: ExecutionPayload, opts: SimulateViaEntrypointOptions): Promise<TxSimulationResult>;
76
69
  proveTx(exec: ExecutionPayload, opts: Omit<SendOptions, 'wait'>): Promise<ProvenTx>;
77
70
  getTxReceipt(txHash: TxHash): Promise<TxReceipt>;
78
71
  getNotes(filter: NotesFilter): Promise<NoteDao[]>;
@@ -80,4 +73,4 @@ export declare class TestWallet extends BaseWallet {
80
73
  sync(): Promise<void>;
81
74
  stop(): Promise<void>;
82
75
  }
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF93YWxsZXQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0LXdhbGxldC90ZXN0X3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7QUFDaEcsT0FBTyxFQUNMLEtBQUssVUFBVSxFQUNmLEtBQUsscUNBQXFDLEVBQzFDLEtBQUssZUFBZSxFQUNwQixtQ0FBbUMsRUFJcEMsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFMUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RCxPQUFPLEtBQUssRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFDeEUsT0FBTyxFQUFFLEtBQUssU0FBUyxFQUFnQixNQUFNLG1CQUFtQixDQUFDO0FBQ2pFLE9BQU8sRUFBRSxHQUFHLEVBQUUsS0FBSyxrQkFBa0IsRUFBYSxNQUFNLG1CQUFtQixDQUFDO0FBQzVFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFHM0QsT0FBTyxLQUFLLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbEQsT0FBTyxLQUFLLEVBQUUsV0FBVyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUMzRixPQUFPLEVBQUUsZ0JBQWdCLEVBQTBCLE1BQU0sa0JBQWtCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxL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
76
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdF93YWxsZXQuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0LXdhbGxldC90ZXN0X3dhbGxldC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsS0FBSyxPQUFPLEVBQUUsS0FBSyxlQUFlLEVBQXFCLE1BQU0seUJBQXlCLENBQUM7QUFDaEcsT0FBTyxFQUNMLEtBQUssVUFBVSxFQUNmLEtBQUsscUNBQXFDLEVBQzFDLEtBQUssZUFBZSxFQUNwQixtQ0FBbUMsRUFJcEMsTUFBTSwrQkFBK0IsQ0FBQztBQUN2QyxPQUFPLEtBQUssRUFBRSxTQUFTLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsY0FBYyxFQUFFLEtBQUssV0FBVyxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFMUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUV4RCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUMxRCxPQUFPLEVBQUUsS0FBSyxTQUFTLEVBQWdCLE1BQU0sbUJBQW1CLENBQUM7QUFDakUsT0FBTyxFQUFFLEdBQUcsRUFBRSxLQUFLLGtCQUFrQixFQUFhLE1BQU0sbUJBQW1CLENBQUM7QUFDNUUsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQ3pELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUczRCxPQUFPLEtBQUssRUFBRSxPQUFPLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEtBQUssRUFBRSxXQUFXLEVBQXVCLE1BQU0sRUFBRSxTQUFTLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUNoSCxPQUFPLEVBQUUsZ0JBQWdCLEVBQTBCLE1BQU0sa0JBQWtCLENBQUM7QUFDNUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxLQUFLLDRCQUE0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
@@ -1 +1 @@
1
- {"version":3,"file":"test_wallet.d.ts","sourceRoot":"","sources":["../../src/test-wallet/test_wallet.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test_wallet.d.ts","sourceRoot":"","sources":["../../src/test-wallet/test_wallet.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,7 @@ import { AztecNodeProxy, ProvenTx } from './utils.js';
21
21
  */ export class TestWallet extends BaseWallet {
22
22
  nodeRef;
23
23
  constructor(pxe, nodeRef){
24
- super(pxe, nodeRef), this.nodeRef = nodeRef, this.accounts = new Map(), this.simulatedSimulations = false;
24
+ super(pxe, nodeRef), this.nodeRef = nodeRef, this.accounts = new Map(), this.simulationMode = 'kernelless';
25
25
  }
26
26
  static async create(node, overridePXEConfig, options = {
27
27
  loggers: {}
@@ -87,18 +87,13 @@ import { AztecNodeProxy, ProvenTx } from './utils.js';
87
87
  }
88
88
  accounts;
89
89
  /**
90
- * Toggle for running "simulated simulations" when calling simulateTx.
91
- *
92
- * When this flag is true, simulateViaEntrypoint constructs a request using a fake account
93
- * (and accepts contract overrides on the input) and the PXE emulates kernel effects without
94
- * generating kernel witnesses. When false, simulateViaEntrypoint defers to the standard
95
- * simulation path via the real account entrypoint.
96
- */ simulatedSimulations;
97
- enableSimulatedSimulations() {
98
- this.simulatedSimulations = true;
99
- }
100
- disableSimulatedSimulations() {
101
- this.simulatedSimulations = false;
90
+ * Controls how the test wallet simulates transactions:
91
+ * - `kernelless`: Skips kernel circuits but uses the real account contract. Default.
92
+ * - `kernelless-override`: Skips kernels and replaces the account with a stub that doesn't do authwit validation.
93
+ * - `full`: Uses real kernel circuits and real account contracts. Slow!
94
+ */ simulationMode;
95
+ setSimulationMode(mode) {
96
+ this.simulationMode = mode;
102
97
  }
103
98
  setMinFeePadding(value) {
104
99
  this.minFeePadding = value ?? 0.5;
@@ -154,12 +149,25 @@ import { AztecNodeProxy, ProvenTx } from './utils.js';
154
149
  }
155
150
  return account.createAuthWit(intentInnerHash, chainInfo);
156
151
  }
157
- /**
158
- * Override simulateViaEntrypoint to use fake accounts for kernelless simulation
159
- * when simulatedSimulations is enabled. Otherwise falls through to the real entrypoint path.
160
- */ async simulateViaEntrypoint(executionPayload, from, feeOptions, scopes, skipTxValidation, skipFeeEnforcement) {
161
- if (!this.simulatedSimulations) {
162
- return super.simulateViaEntrypoint(executionPayload, from, feeOptions, scopes, skipTxValidation, skipFeeEnforcement);
152
+ async simulateViaEntrypoint(executionPayload, opts) {
153
+ const { from, feeOptions, scopes, skipTxValidation, skipFeeEnforcement } = opts;
154
+ const skipKernels = this.simulationMode !== 'full';
155
+ const useOverride = this.simulationMode === 'kernelless-override' && !from.equals(AztecAddress.ZERO);
156
+ let overrides;
157
+ let fromAccount;
158
+ if (useOverride) {
159
+ const { account, instance, artifact } = await this.getFakeAccountDataFor(from);
160
+ fromAccount = account;
161
+ overrides = {
162
+ contracts: {
163
+ [from.toString()]: {
164
+ instance,
165
+ artifact
166
+ }
167
+ }
168
+ };
169
+ } else {
170
+ fromAccount = await this.getAccountFromAddress(from);
163
171
  }
164
172
  const feeExecutionPayload = await feeOptions.walletFeePaymentMethod?.getExecutionPayload();
165
173
  const executionOptions = {
@@ -171,22 +179,14 @@ import { AztecNodeProxy, ProvenTx } from './utils.js';
171
179
  feeExecutionPayload,
172
180
  executionPayload
173
181
  ]) : executionPayload;
174
- const { account: fromAccount, instance, artifact } = await this.getFakeAccountDataFor(from);
175
182
  const chainInfo = await this.getChainInfo();
176
183
  const txRequest = await fromAccount.createTxExecutionRequest(finalExecutionPayload, feeOptions.gasSettings, chainInfo, executionOptions);
177
- const contractOverrides = {
178
- [from.toString()]: {
179
- instance,
180
- artifact
181
- }
182
- };
183
184
  return this.pxe.simulateTx(txRequest, {
184
185
  simulatePublic: true,
185
- skipFeeEnforcement: true,
186
- skipTxValidation: true,
187
- overrides: {
188
- contracts: contractOverrides
189
- },
186
+ skipKernels,
187
+ skipFeeEnforcement,
188
+ skipTxValidation,
189
+ overrides,
190
190
  scopes
191
191
  });
192
192
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aztec/end-to-end",
3
- "version": "0.0.1-commit.684755437",
3
+ "version": "0.0.1-commit.6b113946b",
4
4
  "type": "module",
5
5
  "exports": "./dest/index.js",
6
6
  "inherits": [
@@ -26,45 +26,44 @@
26
26
  "formatting": "run -T prettier --check ./src && run -T eslint ./src"
27
27
  },
28
28
  "dependencies": {
29
- "@aztec/accounts": "0.0.1-commit.684755437",
30
- "@aztec/archiver": "0.0.1-commit.684755437",
31
- "@aztec/aztec": "0.0.1-commit.684755437",
32
- "@aztec/aztec-node": "0.0.1-commit.684755437",
33
- "@aztec/aztec.js": "0.0.1-commit.684755437",
34
- "@aztec/bb-prover": "0.0.1-commit.684755437",
35
- "@aztec/bb.js": "0.0.1-commit.684755437",
36
- "@aztec/blob-client": "0.0.1-commit.684755437",
37
- "@aztec/blob-lib": "0.0.1-commit.684755437",
38
- "@aztec/bot": "0.0.1-commit.684755437",
39
- "@aztec/cli": "0.0.1-commit.684755437",
40
- "@aztec/constants": "0.0.1-commit.684755437",
41
- "@aztec/entrypoints": "0.0.1-commit.684755437",
42
- "@aztec/epoch-cache": "0.0.1-commit.684755437",
43
- "@aztec/ethereum": "0.0.1-commit.684755437",
44
- "@aztec/foundation": "0.0.1-commit.684755437",
45
- "@aztec/kv-store": "0.0.1-commit.684755437",
46
- "@aztec/l1-artifacts": "0.0.1-commit.684755437",
47
- "@aztec/merkle-tree": "0.0.1-commit.684755437",
48
- "@aztec/node-keystore": "0.0.1-commit.684755437",
49
- "@aztec/noir-contracts.js": "0.0.1-commit.684755437",
50
- "@aztec/noir-noirc_abi": "0.0.1-commit.684755437",
51
- "@aztec/noir-protocol-circuits-types": "0.0.1-commit.684755437",
52
- "@aztec/noir-test-contracts.js": "0.0.1-commit.684755437",
53
- "@aztec/p2p": "0.0.1-commit.684755437",
54
- "@aztec/protocol-contracts": "0.0.1-commit.684755437",
55
- "@aztec/prover-client": "0.0.1-commit.684755437",
56
- "@aztec/prover-node": "0.0.1-commit.684755437",
57
- "@aztec/pxe": "0.0.1-commit.684755437",
58
- "@aztec/sequencer-client": "0.0.1-commit.684755437",
59
- "@aztec/simulator": "0.0.1-commit.684755437",
60
- "@aztec/slasher": "0.0.1-commit.684755437",
61
- "@aztec/stdlib": "0.0.1-commit.684755437",
62
- "@aztec/telemetry-client": "0.0.1-commit.684755437",
63
- "@aztec/validator-client": "0.0.1-commit.684755437",
64
- "@aztec/validator-ha-signer": "0.0.1-commit.684755437",
65
- "@aztec/wallet-sdk": "0.0.1-commit.684755437",
66
- "@aztec/wallets": "0.0.1-commit.684755437",
67
- "@aztec/world-state": "0.0.1-commit.684755437",
29
+ "@aztec/accounts": "0.0.1-commit.6b113946b",
30
+ "@aztec/archiver": "0.0.1-commit.6b113946b",
31
+ "@aztec/aztec": "0.0.1-commit.6b113946b",
32
+ "@aztec/aztec-node": "0.0.1-commit.6b113946b",
33
+ "@aztec/aztec.js": "0.0.1-commit.6b113946b",
34
+ "@aztec/bb-prover": "0.0.1-commit.6b113946b",
35
+ "@aztec/bb.js": "0.0.1-commit.6b113946b",
36
+ "@aztec/blob-client": "0.0.1-commit.6b113946b",
37
+ "@aztec/blob-lib": "0.0.1-commit.6b113946b",
38
+ "@aztec/bot": "0.0.1-commit.6b113946b",
39
+ "@aztec/cli": "0.0.1-commit.6b113946b",
40
+ "@aztec/constants": "0.0.1-commit.6b113946b",
41
+ "@aztec/entrypoints": "0.0.1-commit.6b113946b",
42
+ "@aztec/epoch-cache": "0.0.1-commit.6b113946b",
43
+ "@aztec/ethereum": "0.0.1-commit.6b113946b",
44
+ "@aztec/foundation": "0.0.1-commit.6b113946b",
45
+ "@aztec/kv-store": "0.0.1-commit.6b113946b",
46
+ "@aztec/l1-artifacts": "0.0.1-commit.6b113946b",
47
+ "@aztec/node-keystore": "0.0.1-commit.6b113946b",
48
+ "@aztec/noir-contracts.js": "0.0.1-commit.6b113946b",
49
+ "@aztec/noir-noirc_abi": "0.0.1-commit.6b113946b",
50
+ "@aztec/noir-protocol-circuits-types": "0.0.1-commit.6b113946b",
51
+ "@aztec/noir-test-contracts.js": "0.0.1-commit.6b113946b",
52
+ "@aztec/p2p": "0.0.1-commit.6b113946b",
53
+ "@aztec/protocol-contracts": "0.0.1-commit.6b113946b",
54
+ "@aztec/prover-client": "0.0.1-commit.6b113946b",
55
+ "@aztec/prover-node": "0.0.1-commit.6b113946b",
56
+ "@aztec/pxe": "0.0.1-commit.6b113946b",
57
+ "@aztec/sequencer-client": "0.0.1-commit.6b113946b",
58
+ "@aztec/simulator": "0.0.1-commit.6b113946b",
59
+ "@aztec/slasher": "0.0.1-commit.6b113946b",
60
+ "@aztec/stdlib": "0.0.1-commit.6b113946b",
61
+ "@aztec/telemetry-client": "0.0.1-commit.6b113946b",
62
+ "@aztec/validator-client": "0.0.1-commit.6b113946b",
63
+ "@aztec/validator-ha-signer": "0.0.1-commit.6b113946b",
64
+ "@aztec/wallet-sdk": "0.0.1-commit.6b113946b",
65
+ "@aztec/wallets": "0.0.1-commit.6b113946b",
66
+ "@aztec/world-state": "0.0.1-commit.6b113946b",
68
67
  "@iarna/toml": "^2.2.5",
69
68
  "@jest/globals": "^30.0.0",
70
69
  "@noble/curves": "=1.0.0",
@@ -28,6 +28,7 @@ import { type SequencerClient, type SequencerEvents, SequencerState } from '@azt
28
28
  import { type BlockParameter, EthAddress } from '@aztec/stdlib/block';
29
29
  import { type L1RollupConstants, getProofSubmissionDeadlineTimestamp } from '@aztec/stdlib/epoch-helpers';
30
30
  import { tryStop } from '@aztec/stdlib/interfaces/server';
31
+ import type { SlashingProtectionDatabase } from '@aztec/validator-ha-signer/types';
31
32
 
32
33
  import { join } from 'path';
33
34
  import type { Hex } from 'viem';
@@ -181,6 +182,7 @@ export class EpochsTestContext {
181
182
  ethereumSlotDuration,
182
183
  proofSubmissionEpochs: Number(await this.rollup.getProofSubmissionEpochs()),
183
184
  targetCommitteeSize: await this.rollup.getTargetCommitteeSize(),
185
+ rollupManaLimit: Number(await this.rollup.getManaLimit()),
184
186
  };
185
187
 
186
188
  this.logger.info(
@@ -237,13 +239,21 @@ export class EpochsTestContext {
237
239
 
238
240
  public createValidatorNode(
239
241
  privateKeys: `0x${string}`[],
240
- opts: Partial<AztecNodeConfig> & { dontStartSequencer?: boolean } = {},
242
+ opts: Partial<AztecNodeConfig> & {
243
+ dontStartSequencer?: boolean;
244
+ slashingProtectionDb?: SlashingProtectionDatabase;
245
+ } = {},
241
246
  ) {
242
247
  this.logger.warn('Creating and syncing a validator node...');
243
248
  return this.createNode({ ...opts, disableValidator: false, validatorPrivateKeys: new SecretValue(privateKeys) });
244
249
  }
245
250
 
246
- private async createNode(opts: Partial<AztecNodeConfig> & { dontStartSequencer?: boolean } = {}) {
251
+ private async createNode(
252
+ opts: Partial<AztecNodeConfig> & {
253
+ dontStartSequencer?: boolean;
254
+ slashingProtectionDb?: SlashingProtectionDatabase;
255
+ } = {},
256
+ ) {
247
257
  const nodeIndex = this.nodes.length + 1;
248
258
  const actorPrefix = opts.disableValidator ? 'node' : 'validator';
249
259
  const { mockGossipSubNetwork } = this.context;
@@ -256,6 +266,7 @@ export class EpochsTestContext {
256
266
  ...resolvedConfig,
257
267
  dataDirectory: join(this.context.config.dataDirectory!, randomBytes(8).toString('hex')),
258
268
  validatorPrivateKeys: opts.validatorPrivateKeys ?? new SecretValue([]),
269
+ nodeId: resolvedConfig.nodeId || `${actorPrefix}-${nodeIndex}`,
259
270
  p2pEnabled,
260
271
  p2pIp,
261
272
  },
@@ -264,6 +275,7 @@ export class EpochsTestContext {
264
275
  p2pClientDeps: {
265
276
  p2pServiceFactory: mockGossipSubNetwork ? getMockPubSubP2PServiceFactory(mockGossipSubNetwork) : undefined,
266
277
  },
278
+ slashingProtectionDb: opts.slashingProtectionDb,
267
279
  },
268
280
  {
269
281
  prefilledPublicData: this.context.prefilledPublicData,
@@ -149,6 +149,13 @@ export async function runReqrespTxTest(params: {
149
149
  const submittedTxs = await Promise.all(
150
150
  txBatches.map(async (batch, batchIndex) => {
151
151
  const proposerNode = nodes[proposerIndexes[batchIndex]];
152
+ for (const tx of batch) {
153
+ t.logger.info(`Tx ${tx.getTxHash().toString()} base64: ${tx.toBuffer().toString('base64')}`);
154
+ }
155
+ const txHashes = batch.map(tx => tx.getTxHash().toString());
156
+ t.logger.info(
157
+ `Sending batch ${batchIndex} to proposer ${getNodePort(proposerIndexes[batchIndex])}: ${txHashes.join(', ')}`,
158
+ );
152
159
  await Promise.all(
153
160
  batch.map(async tx => {
154
161
  try {
@@ -163,6 +170,12 @@ export async function runReqrespTxTest(params: {
163
170
  }),
164
171
  );
165
172
 
173
+ // Log pool state per node after sending
174
+ for (let i = 0; i < NUM_VALIDATORS; i++) {
175
+ const count = await nodes[i].getPendingTxCount();
176
+ t.logger.info(`Node ${getNodePort(i)} pool has ${count} pending txs`);
177
+ }
178
+
166
179
  t.logger.info('Waiting for all transactions to be mined');
167
180
  await Promise.all(
168
181
  submittedTxs.flatMap((batch, batchIndex) =>
@@ -178,8 +191,16 @@ export async function runReqrespTxTest(params: {
178
191
 
179
192
  // Assert that multiple blocks were built for at least one slot
180
193
  t.logger.info('Verifying multiple blocks for at least one checkpoint');
181
- const checkpoints = await nodes[0].getCheckpoints(CheckpointNumber(1), 50);
182
- expect(checkpoints.length).toBeGreaterThan(0);
194
+ // Wait for L1 checkpoint sync, which may lag behind P2P block propagation.
195
+ const checkpoints = await retryUntil(
196
+ async () => {
197
+ const cps = await nodes[0].getCheckpoints(CheckpointNumber(1), 50);
198
+ return cps.length > 0 && cps.some(cp => cp.checkpoint.blocks.length >= 2) ? cps : undefined;
199
+ },
200
+ 'waiting for multi-block checkpoint to sync from L1',
201
+ 30,
202
+ 1,
203
+ );
183
204
 
184
205
  let mbpsFound = false;
185
206
  let expectedBlockNumber = checkpoints[0].checkpoint.blocks[0].number;
@@ -152,11 +152,14 @@ export async function awaitCommitteeExists({
152
152
  }
153
153
 
154
154
  /**
155
- * Advance epochs until we find one where the target proposer is selected for at least one slot.
156
- * With N validators and M slots per epoch, a specific proposer may not be selected in any given epoch.
157
- * For example, with 4 validators and 2 slots/epoch, there is about a 44% chance per epoch.
155
+ * Advance epochs until we find one where the target proposer is selected for at least one slot,
156
+ * then stop one epoch before it. This leaves time for the caller to start sequencers before
157
+ * warping to the target epoch, avoiding the race where the target epoch passes before sequencers
158
+ * are ready.
159
+ *
160
+ * Returns the target epoch number so the caller can warp to it after starting sequencers.
158
161
  */
159
- export async function awaitEpochWithProposer({
162
+ export async function advanceToEpochBeforeProposer({
160
163
  epochCache,
161
164
  cheatCodes,
162
165
  targetProposer,
@@ -168,25 +171,32 @@ export async function awaitEpochWithProposer({
168
171
  targetProposer: EthAddress;
169
172
  logger: Logger;
170
173
  maxAttempts?: number;
171
- }): Promise<void> {
174
+ }): Promise<{ targetEpoch: EpochNumber }> {
172
175
  const { epochDuration } = await cheatCodes.getConfig();
173
176
 
174
177
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
175
178
  const currentEpoch = await cheatCodes.getEpoch();
176
- const startSlot = Number(currentEpoch) * Number(epochDuration);
179
+ // Check the NEXT epoch's slots so we stay one epoch before the target,
180
+ // giving the caller time to start sequencers before the target epoch arrives.
181
+ const nextEpoch = Number(currentEpoch) + 1;
182
+ const startSlot = nextEpoch * Number(epochDuration);
177
183
  const endSlot = startSlot + Number(epochDuration);
178
184
 
179
- logger.info(`Checking epoch ${currentEpoch} (slots ${startSlot}-${endSlot - 1}) for proposer ${targetProposer}`);
185
+ logger.info(
186
+ `Checking next epoch ${nextEpoch} (slots ${startSlot}-${endSlot - 1}) for proposer ${targetProposer} (current epoch: ${currentEpoch})`,
187
+ );
180
188
 
181
189
  for (let s = startSlot; s < endSlot; s++) {
182
190
  const proposer = await epochCache.getProposerAttesterAddressInSlot(SlotNumber(s));
183
191
  if (proposer && proposer.equals(targetProposer)) {
184
- logger.warn(`Found target proposer ${targetProposer} in slot ${s} of epoch ${currentEpoch}`);
185
- return;
192
+ logger.warn(
193
+ `Found target proposer ${targetProposer} in slot ${s} of epoch ${nextEpoch}. Staying at epoch ${currentEpoch} to allow sequencer startup.`,
194
+ );
195
+ return { targetEpoch: EpochNumber(nextEpoch) };
186
196
  }
187
197
  }
188
198
 
189
- logger.info(`Target proposer not found in epoch ${currentEpoch}, advancing to next epoch`);
199
+ logger.info(`Target proposer not found in epoch ${nextEpoch}, advancing to next epoch`);
190
200
  await cheatCodes.advanceToNextEpoch();
191
201
  }
192
202
 
@@ -185,6 +185,11 @@ export type SetupOptions = {
185
185
  anvilAccounts?: number;
186
186
  /** Port to start anvil (defaults to 8545) */
187
187
  anvilPort?: number;
188
+ /**
189
+ * Number of slots per epoch for Anvil's finality simulation.
190
+ * Anvil reports `finalized = latest - slotsInAnEpoch * 2`.
191
+ */
192
+ anvilSlotsInAnEpoch?: number;
188
193
  /** Key to use for publishing L1 contracts */
189
194
  l1PublisherKey?: SecretValue<`0x${string}`>;
190
195
  /** ZkPassport configuration (domain, scope, mock verifier) */
@@ -305,6 +310,7 @@ export async function setup(
305
310
  l1BlockTime: opts.ethereumSlotDuration,
306
311
  accounts: opts.anvilAccounts,
307
312
  port: opts.anvilPort ?? (process.env.ANVIL_PORT ? parseInt(process.env.ANVIL_PORT) : undefined),
313
+ slotsInAnEpoch: opts.anvilSlotsInAnEpoch,
308
314
  });
309
315
  anvil = res.anvil;
310
316
  config.l1RpcUrls = [res.rpcUrl];