@aztec/txe 0.0.1-commit.f504929 → 0.0.1-commit.f650c0a5c

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/oracle/txe_oracle_top_level_context.d.ts +10 -4
  2. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  3. package/dest/oracle/txe_oracle_top_level_context.js +32 -17
  4. package/dest/rpc_translator.d.ts +58 -20
  5. package/dest/rpc_translator.d.ts.map +1 -1
  6. package/dest/rpc_translator.js +171 -41
  7. package/dest/state_machine/archiver.d.ts +3 -3
  8. package/dest/state_machine/archiver.d.ts.map +1 -1
  9. package/dest/state_machine/archiver.js +7 -8
  10. package/dest/state_machine/dummy_p2p_client.d.ts +3 -2
  11. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  12. package/dest/state_machine/dummy_p2p_client.js +5 -2
  13. package/dest/state_machine/global_variable_builder.d.ts +3 -3
  14. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  15. package/dest/state_machine/global_variable_builder.js +1 -1
  16. package/dest/state_machine/index.d.ts +4 -2
  17. package/dest/state_machine/index.d.ts.map +1 -1
  18. package/dest/state_machine/index.js +7 -3
  19. package/dest/state_machine/mock_epoch_cache.d.ts +18 -3
  20. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  21. package/dest/state_machine/mock_epoch_cache.js +35 -2
  22. package/dest/state_machine/synchronizer.d.ts +5 -5
  23. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  24. package/dest/state_machine/synchronizer.js +3 -3
  25. package/dest/txe_session.d.ts +4 -3
  26. package/dest/txe_session.d.ts.map +1 -1
  27. package/dest/txe_session.js +21 -12
  28. package/dest/util/encoding.d.ts +69 -1
  29. package/dest/util/encoding.d.ts.map +1 -1
  30. package/dest/util/txe_public_contract_data_source.d.ts +1 -1
  31. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  32. package/dest/util/txe_public_contract_data_source.js +1 -3
  33. package/package.json +15 -15
  34. package/src/oracle/txe_oracle_top_level_context.ts +42 -21
  35. package/src/rpc_translator.ts +216 -51
  36. package/src/state_machine/archiver.ts +6 -5
  37. package/src/state_machine/dummy_p2p_client.ts +6 -2
  38. package/src/state_machine/global_variable_builder.ts +7 -1
  39. package/src/state_machine/index.ts +6 -1
  40. package/src/state_machine/mock_epoch_cache.ts +46 -3
  41. package/src/state_machine/synchronizer.ts +4 -4
  42. package/src/txe_session.ts +23 -10
  43. package/src/util/txe_public_contract_data_source.ts +0 -2
@@ -3,7 +3,12 @@ import type { EthAddress } from '@aztec/foundation/eth-address';
3
3
  import type { AztecAddress } from '@aztec/stdlib/aztec-address';
4
4
  import { GasFees } from '@aztec/stdlib/gas';
5
5
  import { makeGlobalVariables } from '@aztec/stdlib/testing';
6
- import { type CheckpointGlobalVariables, type GlobalVariableBuilder, GlobalVariables } from '@aztec/stdlib/tx';
6
+ import {
7
+ type BuildCheckpointGlobalVariablesOpts,
8
+ type CheckpointGlobalVariables,
9
+ type GlobalVariableBuilder,
10
+ GlobalVariables,
11
+ } from '@aztec/stdlib/tx';
7
12
 
8
13
  export class TXEGlobalVariablesBuilder implements GlobalVariableBuilder {
9
14
  public getCurrentMinFees(): Promise<GasFees> {
@@ -23,6 +28,7 @@ export class TXEGlobalVariablesBuilder implements GlobalVariableBuilder {
23
28
  _coinbase: EthAddress,
24
29
  _feeRecipient: AztecAddress,
25
30
  _slotNumber: SlotNumber,
31
+ _opts?: BuildCheckpointGlobalVariablesOpts,
26
32
  ): Promise<CheckpointGlobalVariables> {
27
33
  const vars = makeGlobalVariables();
28
34
  return Promise.resolve({
@@ -4,6 +4,7 @@ import { CheckpointNumber } from '@aztec/foundation/branded-types';
4
4
  import { Fr } from '@aztec/foundation/curves/bn254';
5
5
  import { createLogger } from '@aztec/foundation/log';
6
6
  import { type AnchorBlockStore, type ContractStore, ContractSyncService, type NoteStore } from '@aztec/pxe/server';
7
+ import { MessageContextService } from '@aztec/pxe/simulator';
7
8
  import { L2Block } from '@aztec/stdlib/block';
8
9
  import { Checkpoint, L1PublishedData, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
9
10
  import type { AztecNode } from '@aztec/stdlib/interfaces/client';
@@ -26,6 +27,7 @@ export class TXEStateMachine {
26
27
  public archiver: TXEArchiver,
27
28
  public anchorBlockStore: AnchorBlockStore,
28
29
  public contractSyncService: ContractSyncService,
30
+ public messageContextService: MessageContextService,
29
31
  ) {}
30
32
 
31
33
  public static async create(
@@ -57,6 +59,7 @@ export class TXEStateMachine {
57
59
  new MockEpochCache(),
58
60
  getPackageVersion() ?? '',
59
61
  new TestCircuitVerifier(),
62
+ new TestCircuitVerifier(),
60
63
  undefined,
61
64
  log,
62
65
  );
@@ -68,7 +71,9 @@ export class TXEStateMachine {
68
71
  createLogger('txe:contract_sync'),
69
72
  );
70
73
 
71
- return new this(node, synchronizer, archiver, anchorBlockStore, contractSyncService);
74
+ const messageContextService = new MessageContextService(node);
75
+
76
+ return new this(node, synchronizer, archiver, anchorBlockStore, contractSyncService, messageContextService);
72
77
  }
73
78
 
74
79
  public async handleL2Block(block: L2Block) {
@@ -8,7 +8,7 @@ import { EmptyL1RollupConstants, type L1RollupConstants } from '@aztec/stdlib/ep
8
8
  * Since in TXE we don't validate transactions, mock suffices here.
9
9
  */
10
10
  export class MockEpochCache implements EpochCacheInterface {
11
- getCommittee(): Promise<EpochCommitteeInfo> {
11
+ getCommittee(_slot: SlotTag = 'now'): Promise<EpochCommitteeInfo> {
12
12
  return Promise.resolve({
13
13
  committee: undefined,
14
14
  seed: 0n,
@@ -17,6 +17,26 @@ export class MockEpochCache implements EpochCacheInterface {
17
17
  });
18
18
  }
19
19
 
20
+ getSlotNow(): SlotNumber {
21
+ return SlotNumber(0);
22
+ }
23
+
24
+ getTargetSlot(): SlotNumber {
25
+ return SlotNumber(0);
26
+ }
27
+
28
+ getEpochNow(): EpochNumber {
29
+ return EpochNumber.ZERO;
30
+ }
31
+
32
+ getTargetEpoch(): EpochNumber {
33
+ return EpochNumber.ZERO;
34
+ }
35
+
36
+ pipeliningOffset(): number {
37
+ return 0;
38
+ }
39
+
20
40
  getEpochAndSlotNow(): EpochAndSlot & { nowMs: bigint } {
21
41
  return {
22
42
  epoch: EpochNumber.ZERO,
@@ -26,15 +46,23 @@ export class MockEpochCache implements EpochCacheInterface {
26
46
  };
27
47
  }
28
48
 
29
- getEpochAndSlotInNextL1Slot(): EpochAndSlot & { now: bigint } {
49
+ getEpochAndSlotInNextL1Slot(): EpochAndSlot & { nowSeconds: bigint } {
30
50
  return {
31
51
  epoch: EpochNumber.ZERO,
32
52
  slot: SlotNumber(0),
33
53
  ts: 0n,
34
- now: 0n,
54
+ nowSeconds: 0n,
35
55
  };
36
56
  }
37
57
 
58
+ getTargetEpochAndSlotInNextL1Slot(): EpochAndSlot & { nowSeconds: bigint } {
59
+ return this.getEpochAndSlotInNextL1Slot();
60
+ }
61
+
62
+ isProposerPipeliningEnabled(): boolean {
63
+ return false;
64
+ }
65
+
38
66
  getProposerIndexEncoding(_epoch: EpochNumber, _slot: SlotNumber, _seed: bigint): `0x${string}` {
39
67
  return '0x00';
40
68
  }
@@ -50,6 +78,13 @@ export class MockEpochCache implements EpochCacheInterface {
50
78
  };
51
79
  }
52
80
 
81
+ getTargetAndNextSlot(): { targetSlot: SlotNumber; nextSlot: SlotNumber } {
82
+ return {
83
+ targetSlot: SlotNumber(0),
84
+ nextSlot: SlotNumber(0),
85
+ };
86
+ }
87
+
53
88
  getProposerAttesterAddressInSlot(_slot: SlotNumber): Promise<EthAddress | undefined> {
54
89
  return Promise.resolve(undefined);
55
90
  }
@@ -66,6 +101,14 @@ export class MockEpochCache implements EpochCacheInterface {
66
101
  return Promise.resolve([]);
67
102
  }
68
103
 
104
+ isEscapeHatchOpen(_epoch: EpochNumber): Promise<boolean> {
105
+ return Promise.resolve(false);
106
+ }
107
+
108
+ isEscapeHatchOpenAtSlot(_slot: SlotTag): Promise<boolean> {
109
+ return Promise.resolve(false);
110
+ }
111
+
69
112
  getL1Constants(): L1RollupConstants {
70
113
  return EmptyL1RollupConstants;
71
114
  }
@@ -1,7 +1,7 @@
1
1
  import { NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
2
2
  import { BlockNumber } from '@aztec/foundation/branded-types';
3
3
  import { Fr } from '@aztec/foundation/curves/bn254';
4
- import type { L2Block } from '@aztec/stdlib/block';
4
+ import type { BlockHash, L2Block } from '@aztec/stdlib/block';
5
5
  import type {
6
6
  MerkleTreeReadOperations,
7
7
  MerkleTreeWriteOperations,
@@ -33,12 +33,12 @@ export class TXESynchronizer implements WorldStateSynchronizer {
33
33
  }
34
34
 
35
35
  /**
36
- * Forces an immediate sync to an optionally provided minimum block number
36
+ * Forces an immediate sync to an optionally provided minimum block number.
37
37
  * @param targetBlockNumber - The target block number that we must sync to. Will download unproven blocks if needed to reach it.
38
- * @param skipThrowIfTargetNotReached - Whether to skip throwing if the target block number is not reached.
38
+ * @param blockHash - If provided, verifies the block at targetBlockNumber matches this hash.
39
39
  * @returns A promise that resolves with the block number the world state was synced to
40
40
  */
41
- public syncImmediate(_minBlockNumber?: BlockNumber, _skipThrowIfTargetNotReached?: boolean): Promise<BlockNumber> {
41
+ public syncImmediate(_minBlockNumber?: BlockNumber, _blockHash?: BlockHash): Promise<BlockNumber> {
42
42
  return Promise.resolve(this.blockNumber);
43
43
  }
44
44
 
@@ -3,12 +3,13 @@ import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { type Logger, createLogger } from '@aztec/foundation/log';
4
4
  import { KeyStore } from '@aztec/key-store';
5
5
  import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
6
- import type { AccessScopes } from '@aztec/pxe/client/lazy';
7
6
  import {
8
7
  AddressStore,
9
8
  AnchorBlockStore,
9
+ CapsuleService,
10
10
  CapsuleStore,
11
11
  ContractStore,
12
+ ContractSyncService,
12
13
  JobCoordinator,
13
14
  NoteService,
14
15
  NoteStore,
@@ -150,6 +151,7 @@ export class TXESession implements TXESessionStateHandler {
150
151
  private chainId: Fr,
151
152
  private version: Fr,
152
153
  private nextBlockTimestamp: bigint,
154
+ private contractSyncService: ContractSyncService,
153
155
  ) {}
154
156
 
155
157
  static async init(contractStore: ContractStore) {
@@ -185,6 +187,9 @@ export class TXESession implements TXESessionStateHandler {
185
187
 
186
188
  const initialJobId = jobCoordinator.beginJob();
187
189
 
190
+ const logger = createLogger('txe:session');
191
+ const contractSyncService = new ContractSyncService(stateMachine.node, contractStore, noteStore, logger);
192
+
188
193
  const topLevelOracleHandler = new TXEOracleTopLevelContext(
189
194
  stateMachine,
190
195
  contractStore,
@@ -201,11 +206,12 @@ export class TXESession implements TXESessionStateHandler {
201
206
  version,
202
207
  chainId,
203
208
  new Map(),
209
+ contractSyncService,
204
210
  );
205
211
  await topLevelOracleHandler.advanceBlocksBy(1);
206
212
 
207
213
  return new TXESession(
208
- createLogger('txe:session'),
214
+ logger,
209
215
  stateMachine,
210
216
  topLevelOracleHandler,
211
217
  contractStore,
@@ -223,6 +229,7 @@ export class TXESession implements TXESessionStateHandler {
223
229
  version,
224
230
  chainId,
225
231
  nextBlockTimestamp,
232
+ contractSyncService,
226
233
  );
227
234
  }
228
235
 
@@ -309,6 +316,7 @@ export class TXESession implements TXESessionStateHandler {
309
316
  this.version,
310
317
  this.chainId,
311
318
  this.authwits,
319
+ this.contractSyncService,
312
320
  );
313
321
 
314
322
  this.state = { name: 'TOP_LEVEL' };
@@ -328,7 +336,7 @@ export class TXESession implements TXESessionStateHandler {
328
336
 
329
337
  await new NoteService(this.noteStore, this.stateMachine.node, anchorBlock!, this.currentJobId).syncNoteNullifiers(
330
338
  contractAddress,
331
- 'ALL_SCOPES',
339
+ await this.keyStore.getAccounts(),
332
340
  );
333
341
  const latestBlock = await this.stateMachine.node.getBlockHeader('latest');
334
342
 
@@ -364,11 +372,12 @@ export class TXESession implements TXESessionStateHandler {
364
372
  senderTaggingStore: this.senderTaggingStore,
365
373
  recipientTaggingStore: this.recipientTaggingStore,
366
374
  senderAddressBookStore: this.senderAddressBookStore,
367
- capsuleStore: this.capsuleStore,
375
+ capsuleService: new CapsuleService(this.capsuleStore, await this.keyStore.getAccounts()),
368
376
  privateEventStore: this.privateEventStore,
369
377
  contractSyncService: this.stateMachine.contractSyncService,
370
378
  jobId: this.currentJobId,
371
- scopes: 'ALL_SCOPES',
379
+ scopes: await this.keyStore.getAccounts(),
380
+ messageContextService: this.stateMachine.messageContextService,
372
381
  });
373
382
 
374
383
  // We store the note and tagging index caches fed into the PrivateExecutionOracle (along with some other auxiliary
@@ -421,7 +430,7 @@ export class TXESession implements TXESessionStateHandler {
421
430
  this.stateMachine.node,
422
431
  anchorBlockHeader,
423
432
  this.currentJobId,
424
- ).syncNoteNullifiers(contractAddress, 'ALL_SCOPES');
433
+ ).syncNoteNullifiers(contractAddress, await this.keyStore.getAccounts());
425
434
 
426
435
  this.oracleHandler = new UtilityExecutionOracle({
427
436
  contractAddress,
@@ -435,10 +444,12 @@ export class TXESession implements TXESessionStateHandler {
435
444
  aztecNode: this.stateMachine.node,
436
445
  recipientTaggingStore: this.recipientTaggingStore,
437
446
  senderAddressBookStore: this.senderAddressBookStore,
438
- capsuleStore: this.capsuleStore,
447
+ capsuleService: new CapsuleService(this.capsuleStore, await this.keyStore.getAccounts()),
439
448
  privateEventStore: this.privateEventStore,
449
+ messageContextService: this.stateMachine.messageContextService,
450
+ contractSyncService: this.contractSyncService,
440
451
  jobId: this.currentJobId,
441
- scopes: 'ALL_SCOPES',
452
+ scopes: await this.keyStore.getAccounts(),
442
453
  });
443
454
 
444
455
  this.state = { name: 'UTILITY' };
@@ -507,7 +518,7 @@ export class TXESession implements TXESessionStateHandler {
507
518
  }
508
519
 
509
520
  private utilityExecutorForContractSync(anchorBlock: any) {
510
- return async (call: FunctionCall, scopes: AccessScopes) => {
521
+ return async (call: FunctionCall, scopes: AztecAddress[]) => {
511
522
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
512
523
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
513
524
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
@@ -526,8 +537,10 @@ export class TXESession implements TXESessionStateHandler {
526
537
  aztecNode: this.stateMachine.node,
527
538
  recipientTaggingStore: this.recipientTaggingStore,
528
539
  senderAddressBookStore: this.senderAddressBookStore,
529
- capsuleStore: this.capsuleStore,
540
+ capsuleService: new CapsuleService(this.capsuleStore, scopes),
530
541
  privateEventStore: this.privateEventStore,
542
+ messageContextService: this.stateMachine.messageContextService,
543
+ contractSyncService: this.contractSyncService,
531
544
  jobId: this.currentJobId,
532
545
  scopes,
533
546
  });
@@ -26,8 +26,6 @@ export class TXEPublicContractDataSource implements ContractDataSource {
26
26
  packedBytecode: contractClass.packedBytecode,
27
27
  privateFunctionsRoot: contractClass.privateFunctionsRoot,
28
28
  version: contractClass.version,
29
- privateFunctions: [],
30
- utilityFunctions: [],
31
29
  };
32
30
  }
33
31