@aztec/txe 0.0.1-commit.179ed20 → 0.0.1-commit.189eedb3

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 (158) hide show
  1. package/dest/ContractClassRegistry-PII7Q556.js +3 -0
  2. package/dest/ContractClassRegistry-PII7Q556.js.map +7 -0
  3. package/dest/ContractInstanceRegistry-3MHLGFNZ.js +3 -0
  4. package/dest/ContractInstanceRegistry-3MHLGFNZ.js.map +7 -0
  5. package/dest/FeeJuice-TQV5AQK7.js +3 -0
  6. package/dest/FeeJuice-TQV5AQK7.js.map +7 -0
  7. package/dest/MultiCallEntrypoint-SBJUIJY7.js +3 -0
  8. package/dest/MultiCallEntrypoint-SBJUIJY7.js.map +7 -0
  9. package/dest/SchnorrAccount-MQXPIZ44.js +3 -0
  10. package/dest/SchnorrAccount-MQXPIZ44.js.map +7 -0
  11. package/dest/bin/check_txe_oracle_version.d.ts +2 -0
  12. package/dest/bin/check_txe_oracle_version.d.ts.map +1 -0
  13. package/dest/bin/check_txe_oracle_version.js +61 -0
  14. package/dest/bin/index.js +3 -30
  15. package/dest/bin/index.js.map +7 -0
  16. package/dest/bin/oracle_test_server.d.ts +3 -0
  17. package/dest/bin/oracle_test_server.d.ts.map +1 -0
  18. package/dest/bin/oracle_test_server.js +41 -0
  19. package/dest/chunk-6DNQGQKE.js +265 -0
  20. package/dest/chunk-6DNQGQKE.js.map +7 -0
  21. package/dest/chunk-BJVAAXNA.js +3 -0
  22. package/dest/chunk-BJVAAXNA.js.map +7 -0
  23. package/dest/chunk-IGFYWSUP.js +304 -0
  24. package/dest/chunk-IGFYWSUP.js.map +7 -0
  25. package/dest/constants.d.ts +5 -1
  26. package/dest/constants.d.ts.map +1 -1
  27. package/dest/constants.js +8 -0
  28. package/dest/dispatcher_pool.d.ts +67 -0
  29. package/dest/dispatcher_pool.d.ts.map +1 -0
  30. package/dest/dispatcher_pool.js +284 -0
  31. package/dest/index.d.ts +185 -7
  32. package/dest/index.d.ts.map +1 -1
  33. package/dest/index.js +71 -157
  34. package/dest/metafile.json +38642 -0
  35. package/dest/msgpackr_fr_extension.d.ts +2 -0
  36. package/dest/msgpackr_fr_extension.d.ts.map +1 -0
  37. package/dest/msgpackr_fr_extension.js +21 -0
  38. package/dest/oracle/interfaces.d.ts +56 -30
  39. package/dest/oracle/interfaces.d.ts.map +1 -1
  40. package/dest/oracle/test-resolver/fixtures.d.ts +43 -0
  41. package/dest/oracle/test-resolver/fixtures.d.ts.map +1 -0
  42. package/dest/oracle/test-resolver/fixtures.js +39 -0
  43. package/dest/oracle/test-resolver/index.d.ts +9 -0
  44. package/dest/oracle/test-resolver/index.d.ts.map +1 -0
  45. package/dest/oracle/test-resolver/index.js +33 -0
  46. package/dest/oracle/test-resolver/resolver.d.ts +34 -0
  47. package/dest/oracle/test-resolver/resolver.d.ts.map +1 -0
  48. package/dest/oracle/test-resolver/resolver.js +114 -0
  49. package/dest/oracle/txe_oracle_public_context.d.ts +38 -14
  50. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  51. package/dest/oracle/txe_oracle_public_context.js +55 -13
  52. package/dest/oracle/txe_oracle_registry.d.ts +147 -0
  53. package/dest/oracle/txe_oracle_registry.d.ts.map +1 -0
  54. package/dest/oracle/txe_oracle_registry.js +562 -0
  55. package/dest/oracle/txe_oracle_top_level_context.d.ts +45 -26
  56. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  57. package/dest/oracle/txe_oracle_top_level_context.js +243 -80
  58. package/dest/oracle/txe_oracle_version.d.ts +17 -0
  59. package/dest/oracle/txe_oracle_version.d.ts.map +1 -0
  60. package/dest/oracle/txe_oracle_version.js +14 -0
  61. package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
  62. package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
  63. package/dest/oracle/txe_private_execution_oracle.js +15 -0
  64. package/dest/rpc_server.d.ts +14 -0
  65. package/dest/rpc_server.d.ts.map +1 -0
  66. package/dest/rpc_server.js +78 -0
  67. package/dest/rpc_translator.d.ts +96 -228
  68. package/dest/rpc_translator.d.ts.map +1 -1
  69. package/dest/rpc_translator.js +815 -612
  70. package/dest/server.bundle.js +3 -0
  71. package/dest/server.bundle.js.map +7 -0
  72. package/dest/state_machine/archiver.d.ts +6 -5
  73. package/dest/state_machine/archiver.d.ts.map +1 -1
  74. package/dest/state_machine/archiver.js +32 -21
  75. package/dest/state_machine/dummy_p2p_client.d.ts +26 -16
  76. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  77. package/dest/state_machine/dummy_p2p_client.js +44 -20
  78. package/dest/state_machine/global_variable_builder.d.ts +9 -4
  79. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  80. package/dest/state_machine/global_variable_builder.js +9 -3
  81. package/dest/state_machine/index.d.ts +10 -6
  82. package/dest/state_machine/index.d.ts.map +1 -1
  83. package/dest/state_machine/index.js +35 -12
  84. package/dest/state_machine/mock_epoch_cache.d.ts +18 -3
  85. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  86. package/dest/state_machine/mock_epoch_cache.js +33 -2
  87. package/dest/state_machine/synchronizer.d.ts +5 -5
  88. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  89. package/dest/state_machine/synchronizer.js +4 -4
  90. package/dest/txe_session.d.ts +80 -15
  91. package/dest/txe_session.d.ts.map +1 -1
  92. package/dest/txe_session.js +240 -43
  93. package/dest/utils/block_creation.d.ts +1 -1
  94. package/dest/utils/block_creation.d.ts.map +1 -1
  95. package/dest/utils/block_creation.js +3 -1
  96. package/dest/utils/encoding.d.ts +191 -0
  97. package/dest/utils/encoding.d.ts.map +1 -0
  98. package/dest/{util → utils}/encoding.js +7 -2
  99. package/dest/{util → utils}/expected_failure_error.d.ts +1 -1
  100. package/dest/utils/expected_failure_error.d.ts.map +1 -0
  101. package/dest/{util → utils}/txe_account_store.d.ts +1 -1
  102. package/dest/utils/txe_account_store.d.ts.map +1 -0
  103. package/dest/utils/txe_artifact_resolver.d.ts +37 -0
  104. package/dest/utils/txe_artifact_resolver.d.ts.map +1 -0
  105. package/dest/utils/txe_artifact_resolver.js +161 -0
  106. package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
  107. package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
  108. package/dest/{util → utils}/txe_public_contract_data_source.js +6 -25
  109. package/dest/worker.bundle.js +3 -0
  110. package/dest/worker.bundle.js.map +7 -0
  111. package/dest/worker.d.ts +2 -0
  112. package/dest/worker.d.ts.map +1 -0
  113. package/dest/worker.js +92 -0
  114. package/package.json +38 -21
  115. package/src/bin/check_txe_oracle_version.ts +70 -0
  116. package/src/bin/index.ts +11 -2
  117. package/src/bin/oracle_test_server.ts +51 -0
  118. package/src/constants.ts +10 -0
  119. package/src/dispatcher_pool.ts +316 -0
  120. package/src/index.ts +97 -190
  121. package/src/msgpackr_fr_extension.ts +23 -0
  122. package/src/oracle/interfaces.ts +58 -35
  123. package/src/oracle/test-resolver/fixtures.ts +84 -0
  124. package/src/oracle/test-resolver/index.ts +45 -0
  125. package/src/oracle/test-resolver/resolver.ts +165 -0
  126. package/src/oracle/txe_oracle_public_context.ts +72 -12
  127. package/src/oracle/txe_oracle_registry.ts +401 -0
  128. package/src/oracle/txe_oracle_top_level_context.ts +293 -139
  129. package/src/oracle/txe_oracle_version.ts +17 -0
  130. package/src/oracle/txe_private_execution_oracle.ts +30 -0
  131. package/src/rpc_server.ts +87 -0
  132. package/src/rpc_translator.ts +1000 -995
  133. package/src/state_machine/archiver.ts +44 -20
  134. package/src/state_machine/dummy_p2p_client.ts +70 -32
  135. package/src/state_machine/global_variable_builder.ts +18 -3
  136. package/src/state_machine/index.ts +48 -13
  137. package/src/state_machine/mock_epoch_cache.ts +43 -3
  138. package/src/state_machine/synchronizer.ts +5 -5
  139. package/src/txe_session.ts +356 -96
  140. package/src/utils/block_creation.ts +3 -1
  141. package/src/{util → utils}/encoding.ts +8 -2
  142. package/src/utils/txe_artifact_resolver.ts +217 -0
  143. package/src/{util → utils}/txe_public_contract_data_source.ts +10 -38
  144. package/src/worker.ts +98 -0
  145. package/dest/util/encoding.d.ts +0 -720
  146. package/dest/util/encoding.d.ts.map +0 -1
  147. package/dest/util/expected_failure_error.d.ts.map +0 -1
  148. package/dest/util/txe_account_store.d.ts.map +0 -1
  149. package/dest/util/txe_contract_store.d.ts +0 -12
  150. package/dest/util/txe_contract_store.d.ts.map +0 -1
  151. package/dest/util/txe_contract_store.js +0 -22
  152. package/dest/util/txe_public_contract_data_source.d.ts +0 -21
  153. package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
  154. package/src/util/txe_contract_store.ts +0 -36
  155. /package/dest/{util → utils}/expected_failure_error.js +0 -0
  156. /package/dest/{util → utils}/txe_account_store.js +0 -0
  157. /package/src/{util → utils}/expected_failure_error.ts +0 -0
  158. /package/src/{util → utils}/txe_account_store.ts +0 -0
@@ -2,31 +2,42 @@ import { BlockNumber } from '@aztec/foundation/branded-types';
2
2
  import { Fr } from '@aztec/foundation/curves/bn254';
3
3
  import { createLogger } from '@aztec/foundation/log';
4
4
  import { KeyStore } from '@aztec/key-store';
5
- import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
6
- import { AddressStore, CapsuleStore, JobCoordinator, NoteService, NoteStore, PrivateEventStore, RecipientTaggingStore, SenderAddressBookStore, SenderTaggingStore } from '@aztec/pxe/server';
7
- import { ExecutionNoteCache, ExecutionTaggingIndexCache, HashedValuesCache, Oracle, PrivateExecutionOracle, UtilityExecutionOracle } from '@aztec/pxe/simulator';
5
+ import { openEphemeralStore } from '@aztec/kv-store/lmdb-v2';
6
+ import { AddressStore, AnchorBlockStore, CapsuleService, CapsuleStore, JobCoordinator, NoteService, NoteStore, PrivateEventStore, RecipientTaggingStore, SenderAddressBookStore, SenderTaggingStore } from '@aztec/pxe/server';
7
+ import { ExecutionNoteCache, ExecutionTaggingIndexCache, HashedValuesCache, Oracle, UtilityExecutionOracle } from '@aztec/pxe/simulator';
8
8
  import { ExecutionError, WASMSimulator, createSimulationError, extractCallStack, resolveAssertionMessageFromError, toACVMWitness } from '@aztec/simulator/client';
9
+ import { STANDARD_AUTH_REGISTRY_ADDRESS } from '@aztec/standard-contracts/auth-registry/constants';
9
10
  import { FunctionSelector, FunctionType } from '@aztec/stdlib/abi';
10
11
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
11
- import { GasSettings } from '@aztec/stdlib/gas';
12
12
  import { computeProtocolNullifier } from '@aztec/stdlib/hash';
13
13
  import { makeGlobalVariables } from '@aztec/stdlib/testing';
14
- import { CallContext, TxContext } from '@aztec/stdlib/tx';
14
+ import { CallContext, OFFCHAIN_MESSAGE_IDENTIFIER, TxContext } from '@aztec/stdlib/tx';
15
15
  import { z } from 'zod';
16
- import { DEFAULT_ADDRESS } from './constants.js';
16
+ import { DEFAULT_ADDRESS, MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY, MAX_OFFCHAIN_EFFECT_LEN } from './constants.js';
17
17
  import { TXEOraclePublicContext } from './oracle/txe_oracle_public_context.js';
18
18
  import { TXEOracleTopLevelContext } from './oracle/txe_oracle_top_level_context.js';
19
+ import { TXE_ORACLE_VERSION_MAJOR, TXE_ORACLE_VERSION_MINOR } from './oracle/txe_oracle_version.js';
20
+ import { TXEPrivateExecutionOracle } from './oracle/txe_private_execution_oracle.js';
19
21
  import { RPCTranslator } from './rpc_translator.js';
22
+ import { TXEArchiver } from './state_machine/archiver.js';
20
23
  import { TXEStateMachine } from './state_machine/index.js';
21
- import { TXEAccountStore } from './util/txe_account_store.js';
22
- import { TXEContractStore } from './util/txe_contract_store.js';
23
24
  import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from './utils/block_creation.js';
24
25
  import { makeTxEffect } from './utils/tx_effect_creation.js';
26
+ import { TXEAccountStore } from './utils/txe_account_store.js';
27
+ function emptyLastCallState() {
28
+ return {
29
+ offchainEffects: [],
30
+ queried: false,
31
+ txHash: Fr.ZERO,
32
+ anchorBlockTimestamp: 0n
33
+ };
34
+ }
25
35
  /**
26
36
  * A `TXESession` corresponds to a Noir `#[test]` function, and handles all of its oracle calls, stores test-specific
27
37
  * state, etc., independent of all other tests running in parallel.
28
38
  */ export class TXESession {
29
39
  logger;
40
+ sessionStore;
30
41
  stateMachine;
31
42
  oracleHandler;
32
43
  contractStore;
@@ -44,10 +55,17 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
44
55
  chainId;
45
56
  version;
46
57
  nextBlockTimestamp;
58
+ artifactResolver;
59
+ rootPath;
60
+ packageName;
47
61
  state;
48
62
  authwits;
49
- constructor(logger, stateMachine, oracleHandler, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, jobCoordinator, currentJobId, chainId, version, nextBlockTimestamp){
63
+ lastCallInfo;
64
+ txeOracleVersion;
65
+ disposed;
66
+ constructor(logger, sessionStore, stateMachine, oracleHandler, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, jobCoordinator, currentJobId, chainId, version, nextBlockTimestamp, artifactResolver, rootPath, packageName){
50
67
  this.logger = logger;
68
+ this.sessionStore = sessionStore;
51
69
  this.stateMachine = stateMachine;
52
70
  this.oracleHandler = oracleHandler;
53
71
  this.contractStore = contractStore;
@@ -65,16 +83,43 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
65
83
  this.chainId = chainId;
66
84
  this.version = version;
67
85
  this.nextBlockTimestamp = nextBlockTimestamp;
86
+ this.artifactResolver = artifactResolver;
87
+ this.rootPath = rootPath;
88
+ this.packageName = packageName;
68
89
  this.state = {
69
90
  name: 'TOP_LEVEL'
70
91
  };
71
92
  this.authwits = new Map();
93
+ this.lastCallInfo = emptyLastCallState();
94
+ this.disposed = false;
72
95
  }
73
- static async init(protocolContracts) {
74
- const store = await openTmpStore('txe-session');
96
+ /**
97
+ * Closes the per-session `txe-session` LMDB and the `NativeWorldStateService` .
98
+ * Called via IPC when the dispatcher detects the end of a test. Idempotent.
99
+ */ async dispose() {
100
+ if (this.disposed) {
101
+ return;
102
+ }
103
+ this.disposed = true;
104
+ try {
105
+ await this.stateMachine.synchronizer.nativeWorldStateService.close();
106
+ } catch (err) {
107
+ this.logger.warn(`Error closing native world state during session dispose`, err);
108
+ }
109
+ try {
110
+ await this.sessionStore.close();
111
+ } catch (err) {
112
+ this.logger.warn(`Error closing session LMDB during dispose`, err);
113
+ }
114
+ }
115
+ static async init(contractStore, artifactResolver, rootPath, packageName) {
116
+ // Size LMDB's reader slots to the libuv pool (capped to 2 in bin/index.ts via
117
+ // HARDWARE_CONCURRENCY): each native LMDB read needs a libuv worker thread to run, so any
118
+ // slot beyond the pool size would sit idle while still consuming a semaphore + reader-table
119
+ // entry per session.
120
+ const store = await openEphemeralStore('txe-session', undefined, 2);
75
121
  const addressStore = new AddressStore(store);
76
122
  const privateEventStore = new PrivateEventStore(store);
77
- const contractStore = new TXEContractStore(store);
78
123
  const noteStore = new NoteStore(store);
79
124
  const senderTaggingStore = new SenderTaggingStore(store);
80
125
  const recipientTaggingStore = new RecipientTaggingStore(store);
@@ -82,7 +127,6 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
82
127
  const capsuleStore = new CapsuleStore(store);
83
128
  const keyStore = new KeyStore(store);
84
129
  const accountStore = new TXEAccountStore(store);
85
- // Create job coordinator and register staged stores
86
130
  const jobCoordinator = new JobCoordinator(store);
87
131
  jobCoordinator.registerStores([
88
132
  capsuleStore,
@@ -91,19 +135,19 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
91
135
  privateEventStore,
92
136
  noteStore
93
137
  ]);
94
- // Register protocol contracts.
95
- for (const { contractClass, instance, artifact } of protocolContracts){
96
- await contractStore.addContractArtifact(contractClass.id, artifact);
97
- await contractStore.addContractInstance(instance);
98
- }
99
- const stateMachine = await TXEStateMachine.create(store);
138
+ const archiver = new TXEArchiver(store);
139
+ const anchorBlockStore = new AnchorBlockStore(store);
140
+ const stateMachine = await TXEStateMachine.create(archiver, anchorBlockStore, contractStore, noteStore);
100
141
  const nextBlockTimestamp = BigInt(Math.floor(new Date().getTime() / 1000));
101
142
  const version = new Fr(await stateMachine.node.getVersion());
102
143
  const chainId = new Fr(await stateMachine.node.getChainId());
103
144
  const initialJobId = jobCoordinator.beginJob();
104
- const topLevelOracleHandler = new TXEOracleTopLevelContext(stateMachine, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, initialJobId, nextBlockTimestamp, version, chainId, new Map());
105
- await topLevelOracleHandler.txeAdvanceBlocksBy(1);
106
- return new TXESession(createLogger('txe:session'), stateMachine, topLevelOracleHandler, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, jobCoordinator, initialJobId, version, chainId, nextBlockTimestamp);
145
+ const logger = createLogger('txe:session');
146
+ const topLevelOracleHandler = new TXEOracleTopLevelContext(stateMachine, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, nextBlockTimestamp, version, chainId, new Map(), artifactResolver, rootPath, packageName);
147
+ await topLevelOracleHandler.mineDeploymentNullifiers([
148
+ STANDARD_AUTH_REGISTRY_ADDRESS
149
+ ]);
150
+ return new TXESession(logger, store, stateMachine, topLevelOracleHandler, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, jobCoordinator, initialJobId, version, chainId, nextBlockTimestamp, artifactResolver, rootPath, packageName);
107
151
  }
108
152
  /**
109
153
  * Processes an oracle function invoked by the Noir test associated to this session.
@@ -118,7 +162,15 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
118
162
  return translator[validatedFunctionName](...inputs);
119
163
  } catch (error) {
120
164
  if (error instanceof z.ZodError) {
121
- throw new Error(`${functionName} does not correspond to any oracle handler available on RPCTranslator`);
165
+ let versionHint;
166
+ if (!this.txeOracleVersion) {
167
+ versionHint = ' The test appears to use an older version of Aztec.nr that does not' + ' support test environment oracle versioning. Update Aztec.nr to a compatible version.' + ' See https://docs.aztec.network/errors/12';
168
+ } else if (this.txeOracleVersion.minor > TXE_ORACLE_VERSION_MINOR) {
169
+ versionHint = ` The test uses Aztec.nr test oracle version` + ` ${this.txeOracleVersion.major}.${this.txeOracleVersion.minor}, but this test environment` + ` only supports up to ${TXE_ORACLE_VERSION_MAJOR}.${TXE_ORACLE_VERSION_MINOR}.` + ` Upgrade the Aztec CLI to a compatible version.` + ` See https://docs.aztec.network/errors/12`;
170
+ } else {
171
+ versionHint = ` The test's oracle version (${this.txeOracleVersion.major}.${this.txeOracleVersion.minor})` + ` is compatible with this test environment` + ` (${TXE_ORACLE_VERSION_MAJOR}.${TXE_ORACLE_VERSION_MINOR}), so this oracle should be` + ` available. This is an unexpected error, please report it.` + ` See https://docs.aztec.network/errors/13`;
172
+ }
173
+ throw new Error(`Unknown oracle '${functionName}'.${versionHint}`);
122
174
  } else if (error instanceof Error) {
123
175
  throw new Error(`Execution error while processing function ${functionName} in state ${this.state.name}: ${error.message}`);
124
176
  } else {
@@ -126,6 +178,68 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
126
178
  }
127
179
  }
128
180
  }
181
+ getCurrentJob() {
182
+ return this.currentJobId;
183
+ }
184
+ /** Commits the current job and begins a new one. Returns the new job ID. */ async cycleJob() {
185
+ await this.jobCoordinator.commitJob(this.currentJobId);
186
+ this.currentJobId = this.jobCoordinator.beginJob();
187
+ return this.currentJobId;
188
+ }
189
+ resetLastCall() {
190
+ const notQueriedMessageCount = this.lastCallInfo.queried ? 0 : this.lastCallInfo.offchainEffects.filter((payload)=>payload[0]?.equals(OFFCHAIN_MESSAGE_IDENTIFIER)).length;
191
+ if (notQueriedMessageCount > 0) {
192
+ this.logger.warn(`Dropping ${notQueriedMessageCount} unqueried offchain message(s) from the previous top-level call. ` + `To deliver them, call \`env.offchain_messages()\` and forward the result to the recipient contract's ` + `\`offchain_receive\` utility before issuing another top-level call. To intentionally discard, assign ` + `to \`let _ = env.offchain_messages()\` to silence this warning.`);
193
+ }
194
+ this.lastCallInfo = emptyLastCallState();
195
+ }
196
+ recordOffchainEffect(data) {
197
+ this.lastCallInfo.offchainEffects.push(data);
198
+ }
199
+ setLastCallContext(txHash, anchorBlockTimestamp) {
200
+ this.lastCallInfo.txHash = txHash;
201
+ this.lastCallInfo.anchorBlockTimestamp = anchorBlockTimestamp;
202
+ }
203
+ async withTopLevelCallTracking(work) {
204
+ this.resetLastCall();
205
+ // Capture the anchor *before* `work` runs: private/public executor calls mine a new block as a
206
+ // side effect, and that block's timestamp should not be attributed to this call's anchor.
207
+ const anchorBlockTimestamp = (await this.stateMachine.node.getBlockData('latest')).header.globalVariables.timestamp;
208
+ const { result, txHash } = await work();
209
+ this.setLastCallContext(txHash ?? Fr.ZERO, anchorBlockTimestamp);
210
+ return result;
211
+ }
212
+ getLastCallOffchainEffects() {
213
+ this.lastCallInfo.queried = true;
214
+ const effects = this.lastCallInfo.offchainEffects;
215
+ if (effects.length > MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY) {
216
+ throw new Error(`${effects.length} offchain effects exceed max ${MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY}`);
217
+ }
218
+ if (effects.some((e)=>e.length > MAX_OFFCHAIN_EFFECT_LEN)) {
219
+ throw new Error(`Some offchain effect has length larger than max ${MAX_OFFCHAIN_EFFECT_LEN}`);
220
+ }
221
+ return {
222
+ effects
223
+ };
224
+ }
225
+ getLastCallContext() {
226
+ const { txHash, anchorBlockTimestamp } = this.lastCallInfo;
227
+ return {
228
+ txHash,
229
+ anchorBlockTimestamp
230
+ };
231
+ }
232
+ setTxeOracleVersion(major, minor) {
233
+ if (major !== TXE_ORACLE_VERSION_MAJOR) {
234
+ const hint = major > TXE_ORACLE_VERSION_MAJOR ? 'The test was compiled with a newer version of Aztec.nr than your test environment supports. Upgrade your test environment to a compatible version.' : 'The test was compiled with an older version of Aztec.nr than your test environment supports. Recompile the test with a compatible version of Aztec.nr.';
235
+ throw new Error(`Incompatible test environment version: ${hint} See https://docs.aztec.network/errors/12 (expected test oracle major version ${TXE_ORACLE_VERSION_MAJOR}, got ${major})`);
236
+ }
237
+ this.txeOracleVersion = {
238
+ major,
239
+ minor
240
+ };
241
+ this.logger.debug(`Test compiled with test oracle version ${major}.${minor}`);
242
+ }
129
243
  async enterTopLevelState() {
130
244
  switch(this.state.name){
131
245
  case 'PRIVATE':
@@ -153,22 +267,24 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
153
267
  }
154
268
  }
155
269
  // Commit all staged stores from the job that was just completed, then begin a new job
156
- await this.jobCoordinator.commitJob(this.currentJobId);
157
- this.currentJobId = this.jobCoordinator.beginJob();
158
- this.oracleHandler = new TXEOracleTopLevelContext(this.stateMachine, this.contractStore, this.noteStore, this.keyStore, this.addressStore, this.accountStore, this.senderTaggingStore, this.recipientTaggingStore, this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, this.currentJobId, this.nextBlockTimestamp, this.version, this.chainId, this.authwits);
270
+ await this.cycleJob();
271
+ this.oracleHandler = new TXEOracleTopLevelContext(this.stateMachine, this.contractStore, this.noteStore, this.keyStore, this.addressStore, this.accountStore, this.senderTaggingStore, this.recipientTaggingStore, this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, this.nextBlockTimestamp, this.version, this.chainId, this.authwits, this.artifactResolver, this.rootPath, this.packageName);
159
272
  this.state = {
160
273
  name: 'TOP_LEVEL'
161
274
  };
162
275
  this.logger.debug(`Entered state ${this.state.name}`);
163
276
  }
164
- async enterPrivateState(contractAddress = DEFAULT_ADDRESS, anchorBlockNumber) {
277
+ async enterPrivateState(contractAddressOpt, anchorBlockNumberOpt, gasSettings) {
278
+ const contractAddress = contractAddressOpt?.value ?? DEFAULT_ADDRESS;
279
+ const anchorBlockNumber = anchorBlockNumberOpt?.value;
165
280
  this.exitTopLevelState();
281
+ this.resetLastCall();
166
282
  // Private execution has two associated block numbers: the anchor block (i.e. the historical block that is used to
167
283
  // build the proof), and the *next* block, i.e. the one we'll create once the execution ends, and which will contain
168
284
  // a single transaction with the effects of what was done in the test.
169
- const anchorBlock = await this.stateMachine.node.getBlockHeader(anchorBlockNumber ?? 'latest');
170
- await new NoteService(this.noteStore, this.stateMachine.node, anchorBlock, this.currentJobId).syncNoteNullifiers(contractAddress);
171
- const latestBlock = await this.stateMachine.node.getBlockHeader('latest');
285
+ const anchorBlock = await this.stateMachine.node.getBlock(anchorBlockNumber ?? 'latest').then((b)=>b?.header);
286
+ await new NoteService(this.noteStore, this.stateMachine.node, anchorBlock, this.currentJobId).syncNoteNullifiers(contractAddress, await this.keyStore.getAccounts());
287
+ const latestBlock = await this.stateMachine.node.getBlock('latest').then((b)=>b?.header);
172
288
  const nextBlockGlobalVariables = makeGlobalVariables(undefined, {
173
289
  blockNumber: BlockNumber(latestBlock.globalVariables.blockNumber + 1),
174
290
  timestamp: this.nextBlockTimestamp,
@@ -180,7 +296,34 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
180
296
  const noteCache = new ExecutionNoteCache(protocolNullifier);
181
297
  const taggingIndexCache = new ExecutionTaggingIndexCache();
182
298
  const utilityExecutor = this.utilityExecutorForContractSync(anchorBlock);
183
- this.oracleHandler = new PrivateExecutionOracle(Fr.ZERO, new TxContext(this.chainId, this.version, GasSettings.empty()), new CallContext(AztecAddress.ZERO, contractAddress, FunctionSelector.empty(), false), anchorBlock, utilityExecutor, [], [], new HashedValuesCache(), noteCache, taggingIndexCache, this.contractStore, this.noteStore, this.keyStore, this.addressStore, this.stateMachine.node, this.senderTaggingStore, this.recipientTaggingStore, this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, this.currentJobId);
299
+ this.oracleHandler = new TXEPrivateExecutionOracle({
300
+ argsHash: Fr.ZERO,
301
+ txContext: new TxContext(this.chainId, this.version, gasSettings),
302
+ callContext: new CallContext(AztecAddress.ZERO, contractAddress, FunctionSelector.empty(), false),
303
+ anchorBlockHeader: anchorBlock,
304
+ utilityExecutor,
305
+ authWitnesses: [],
306
+ capsules: [],
307
+ executionCache: new HashedValuesCache(),
308
+ noteCache,
309
+ taggingIndexCache,
310
+ contractStore: this.contractStore,
311
+ noteStore: this.noteStore,
312
+ keyStore: this.keyStore,
313
+ addressStore: this.addressStore,
314
+ aztecNode: this.stateMachine.node,
315
+ senderTaggingStore: this.senderTaggingStore,
316
+ recipientTaggingStore: this.recipientTaggingStore,
317
+ senderAddressBookStore: this.senderAddressBookStore,
318
+ capsuleService: new CapsuleService(this.capsuleStore, await this.keyStore.getAccounts()),
319
+ privateEventStore: this.privateEventStore,
320
+ contractSyncService: this.stateMachine.contractSyncService,
321
+ l2TipsStore: this.stateMachine.l2TipsProvider,
322
+ jobId: this.currentJobId,
323
+ scopes: await this.keyStore.getAccounts(),
324
+ messageContextService: this.stateMachine.messageContextService,
325
+ simulator: new WASMSimulator()
326
+ });
184
327
  // We store the note and tagging index caches fed into the PrivateExecutionOracle (along with some other auxiliary
185
328
  // data) in order to refer to it later, mimicking the way this object is used by the ContractFunctionSimulator. The
186
329
  // difference resides in that the simulator has all information needed in order to run the simulation, while ours
@@ -193,39 +336,71 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
193
336
  taggingIndexCache
194
337
  };
195
338
  this.logger.debug(`Entered state ${this.state.name}`);
339
+ // Record the *resolved* anchor's timestamp — if the caller pinned the anchor to a past block
340
+ // via `anchorBlockNumber`, "latest" would be the wrong anchor for offchain-message semantics.
341
+ this.setLastCallContext(Fr.ZERO, anchorBlock.globalVariables.timestamp);
196
342
  return this.oracleHandler.getPrivateContextInputs();
197
343
  }
198
- async enterPublicState(contractAddress) {
344
+ async enterPublicState(contractAddressOpt) {
345
+ const contractAddress = contractAddressOpt?.value ?? DEFAULT_ADDRESS;
199
346
  this.exitTopLevelState();
347
+ this.resetLastCall();
200
348
  // The PublicContext will create a block with a single transaction in it, containing the effects of what was done in
201
349
  // the test. The block therefore gets the *next* block number and timestamp.
202
- const latestBlockNumber = (await this.stateMachine.node.getBlockHeader('latest')).globalVariables.blockNumber;
350
+ const latestHeader = (await this.stateMachine.node.getBlockData('latest')).header;
203
351
  const globalVariables = makeGlobalVariables(undefined, {
204
- blockNumber: BlockNumber(latestBlockNumber + 1),
352
+ blockNumber: BlockNumber(latestHeader.globalVariables.blockNumber + 1),
205
353
  timestamp: this.nextBlockTimestamp,
206
354
  version: this.version,
207
355
  chainId: this.chainId
208
356
  });
209
- this.oracleHandler = new TXEOraclePublicContext(contractAddress ?? DEFAULT_ADDRESS, await this.stateMachine.synchronizer.nativeWorldStateService.fork(), getSingleTxBlockRequestHash(globalVariables.blockNumber), globalVariables);
357
+ this.oracleHandler = new TXEOraclePublicContext(contractAddress, await this.stateMachine.synchronizer.nativeWorldStateService.fork(), getSingleTxBlockRequestHash(globalVariables.blockNumber), globalVariables, this.contractStore);
210
358
  this.state = {
211
359
  name: 'PUBLIC'
212
360
  };
213
361
  this.logger.debug(`Entered state ${this.state.name}`);
362
+ // Public state is anchored at the latest block.
363
+ this.setLastCallContext(Fr.ZERO, latestHeader.globalVariables.timestamp);
214
364
  }
215
- async enterUtilityState(contractAddress = DEFAULT_ADDRESS) {
365
+ async enterUtilityState(contractAddressOpt) {
366
+ const contractAddress = contractAddressOpt?.value ?? DEFAULT_ADDRESS;
216
367
  this.exitTopLevelState();
368
+ this.resetLastCall();
217
369
  const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
218
370
  // There is no automatic message discovery and contract-driven syncing process in inlined private or utility
219
371
  // contexts, which means that known nullifiers are also not searched for, since it is during the tagging sync that
220
372
  // we perform this. We therefore search for known nullifiers now, as otherwise notes that were nullified would not
221
373
  // be removed from the database.
222
374
  // TODO(#12553): make the synchronizer sync here instead and remove this
223
- await new NoteService(this.noteStore, this.stateMachine.node, anchorBlockHeader, this.currentJobId).syncNoteNullifiers(contractAddress);
224
- this.oracleHandler = new UtilityExecutionOracle(contractAddress, [], [], anchorBlockHeader, this.contractStore, this.noteStore, this.keyStore, this.addressStore, this.stateMachine.node, this.recipientTaggingStore, this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, this.currentJobId);
375
+ await new NoteService(this.noteStore, this.stateMachine.node, anchorBlockHeader, this.currentJobId).syncNoteNullifiers(contractAddress, await this.keyStore.getAccounts());
376
+ this.oracleHandler = new UtilityExecutionOracle({
377
+ contractAddress,
378
+ authWitnesses: [],
379
+ capsules: [],
380
+ anchorBlockHeader,
381
+ contractStore: this.contractStore,
382
+ noteStore: this.noteStore,
383
+ keyStore: this.keyStore,
384
+ addressStore: this.addressStore,
385
+ aztecNode: this.stateMachine.node,
386
+ recipientTaggingStore: this.recipientTaggingStore,
387
+ senderAddressBookStore: this.senderAddressBookStore,
388
+ capsuleService: new CapsuleService(this.capsuleStore, await this.keyStore.getAccounts()),
389
+ privateEventStore: this.privateEventStore,
390
+ messageContextService: this.stateMachine.messageContextService,
391
+ contractSyncService: this.stateMachine.contractSyncService,
392
+ l2TipsStore: this.stateMachine.l2TipsProvider,
393
+ jobId: this.currentJobId,
394
+ scopes: await this.keyStore.getAccounts(),
395
+ simulator: new WASMSimulator(),
396
+ utilityExecutor: this.utilityExecutorForContractSync(anchorBlockHeader)
397
+ });
225
398
  this.state = {
226
399
  name: 'UTILITY'
227
400
  };
228
401
  this.logger.debug(`Entered state ${this.state.name}`);
402
+ // Utility state anchors at whatever the anchor block store is pointing to (tracked as latest).
403
+ this.setLastCallContext(Fr.ZERO, anchorBlockHeader.globalVariables.timestamp);
229
404
  }
230
405
  exitTopLevelState() {
231
406
  if (this.state.name != 'TOP_LEVEL') {
@@ -233,8 +408,8 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
233
408
  }
234
409
  // Note that while all public and private contexts do is build a single block that we then process when exiting
235
410
  // those, the top level context performs a large number of actions not captured in the following 'close' call. Among
236
- // others, it will create empty blocks (via `txeAdvanceBlocksBy` and `deploy`), create blocks with transactions via
237
- // `txePrivateCallNewFlow` and `txePublicCallNewFlow`, add accounts to PXE via `txeAddAccount`, etc. This is a
411
+ // others, it will create empty blocks (via `advanceBlocksBy` and `deploy`), create blocks with transactions via
412
+ // `privateCallNewFlow` and `publicCallNewFlow`, add accounts to PXE via `addAccount`, etc. This is a
238
413
  // slight inconsistency in the working model of this class, but is not too bad.
239
414
  // TODO: it's quite unfortunate that we need to capture the authwits created to later pass them again when the top
240
415
  // level context is re-created. This is because authwits create a temporary utility context that'd otherwise reset
@@ -278,14 +453,36 @@ import { makeTxEffect } from './utils/tx_effect_creation.js';
278
453
  }
279
454
  }
280
455
  utilityExecutorForContractSync(anchorBlock) {
281
- return async (call)=>{
456
+ return async (call, scopes)=>{
282
457
  const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
283
458
  if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
284
459
  throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
285
460
  }
286
461
  try {
287
- const oracle = new UtilityExecutionOracle(call.to, [], [], anchorBlock, this.contractStore, this.noteStore, this.keyStore, this.addressStore, this.stateMachine.node, this.recipientTaggingStore, this.senderAddressBookStore, this.capsuleStore, this.privateEventStore, this.currentJobId);
288
- await new WASMSimulator().executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback()).catch((err)=>{
462
+ const simulator = new WASMSimulator();
463
+ const oracle = new UtilityExecutionOracle({
464
+ contractAddress: call.to,
465
+ authWitnesses: [],
466
+ capsules: [],
467
+ anchorBlockHeader: anchorBlock,
468
+ contractStore: this.contractStore,
469
+ noteStore: this.noteStore,
470
+ keyStore: this.keyStore,
471
+ addressStore: this.addressStore,
472
+ aztecNode: this.stateMachine.node,
473
+ recipientTaggingStore: this.recipientTaggingStore,
474
+ senderAddressBookStore: this.senderAddressBookStore,
475
+ capsuleService: new CapsuleService(this.capsuleStore, scopes),
476
+ privateEventStore: this.privateEventStore,
477
+ messageContextService: this.stateMachine.messageContextService,
478
+ contractSyncService: this.stateMachine.contractSyncService,
479
+ l2TipsStore: this.stateMachine.l2TipsProvider,
480
+ jobId: this.currentJobId,
481
+ scopes,
482
+ simulator,
483
+ utilityExecutor: this.utilityExecutorForContractSync(anchorBlock)
484
+ });
485
+ await simulator.executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback()).catch((err)=>{
289
486
  err.message = resolveAssertionMessageFromError(err, entryPointArtifact);
290
487
  throw new ExecutionError(err.message, {
291
488
  contractAddress: call.to,
@@ -25,4 +25,4 @@ export declare function makeTXEBlockHeader(worldTrees: MerkleTreeWriteOperations
25
25
  * @returns The created L2Block with proper archive chaining
26
26
  */
27
27
  export declare function makeTXEBlock(worldTrees: MerkleTreeWriteOperations, globalVariables: GlobalVariables, txEffects: TxEffect[]): Promise<L2Block>;
28
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfY3JlYXRpb24uZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9ibG9ja19jcmVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsV0FBVyxFQUEyQyxNQUFNLGlDQUFpQyxDQUFDO0FBRXZHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQVEsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUF3QyxLQUFLLHlCQUF5QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0csT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFMUU7Ozs7R0FJRztBQUNILHdCQUFnQiwyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLEVBQUUsQ0FFeEU7QUFFRCx3QkFBc0IsNEJBQTRCLENBQ2hELFFBQVEsRUFBRSxRQUFRLEVBQ2xCLFVBQVUsRUFBRSx5QkFBeUIsR0FDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWtCZjtBQUVELHdCQUFzQixrQkFBa0IsQ0FDdEMsVUFBVSxFQUFFLHlCQUF5QixFQUNyQyxlQUFlLEVBQUUsZUFBZSxHQUMvQixPQUFPLENBQUMsV0FBVyxDQUFDLENBWXRCO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsd0JBQXNCLFlBQVksQ0FDaEMsVUFBVSxFQUFFLHlCQUF5QixFQUNyQyxlQUFlLEVBQUUsZUFBZSxFQUNoQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQ3BCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FlbEIifQ==
28
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmxvY2tfY3JlYXRpb24uZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9ibG9ja19jcmVhdGlvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFNQSxPQUFPLEVBQUUsV0FBVyxFQUEyQyxNQUFNLGlDQUFpQyxDQUFDO0FBRXZHLE9BQU8sRUFBRSxFQUFFLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRCxPQUFPLEVBQVEsT0FBTyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDcEQsT0FBTyxFQUF3QyxLQUFLLHlCQUF5QixFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDM0csT0FBTyxFQUFFLFdBQVcsRUFBRSxlQUFlLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFMUU7Ozs7R0FJRztBQUNILHdCQUFnQiwyQkFBMkIsQ0FBQyxXQUFXLEVBQUUsV0FBVyxHQUFHLEVBQUUsQ0FFeEU7QUFFRCx3QkFBc0IsNEJBQTRCLENBQ2hELFFBQVEsRUFBRSxRQUFRLEVBQ2xCLFVBQVUsRUFBRSx5QkFBeUIsR0FDcEMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQWtCZjtBQUVELHdCQUFzQixrQkFBa0IsQ0FDdEMsVUFBVSxFQUFFLHlCQUF5QixFQUNyQyxlQUFlLEVBQUUsZUFBZSxHQUMvQixPQUFPLENBQUMsV0FBVyxDQUFDLENBWXRCO0FBRUQ7Ozs7Ozs7Ozs7OztHQVlHO0FBQ0gsd0JBQXNCLFlBQVksQ0FDaEMsVUFBVSxFQUFFLHlCQUF5QixFQUNyQyxlQUFlLEVBQUUsZUFBZSxFQUNoQyxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQ3BCLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FpQmxCIn0=
@@ -1 +1 @@
1
- {"version":3,"file":"block_creation.d.ts","sourceRoot":"","sources":["../../src/utils/block_creation.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAA2C,MAAM,iCAAiC,CAAC;AAEvG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAQ,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAwC,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,EAAE,CAExE;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,yBAAyB,GACpC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,yBAAyB,EACrC,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,WAAW,CAAC,CAYtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,yBAAyB,EACrC,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,OAAO,CAAC,CAelB"}
1
+ {"version":3,"file":"block_creation.d.ts","sourceRoot":"","sources":["../../src/utils/block_creation.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAA2C,MAAM,iCAAiC,CAAC;AAEvG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,EAAQ,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAwC,KAAK,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAC3G,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE1E;;;;GAIG;AACH,wBAAgB,2BAA2B,CAAC,WAAW,EAAE,WAAW,GAAG,EAAE,CAExE;AAED,wBAAsB,4BAA4B,CAChD,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,yBAAyB,GACpC,OAAO,CAAC,IAAI,CAAC,CAkBf;AAED,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,yBAAyB,EACrC,eAAe,EAAE,eAAe,GAC/B,OAAO,CAAC,WAAW,CAAC,CAYtB;AAED;;;;;;;;;;;;GAYG;AACH,wBAAsB,YAAY,CAChC,UAAU,EAAE,yBAAyB,EACrC,eAAe,EAAE,eAAe,EAChC,SAAS,EAAE,QAAQ,EAAE,GACpB,OAAO,CAAC,OAAO,CAAC,CAiBlB"}
@@ -49,7 +49,9 @@ export async function makeTXEBlockHeader(worldTrees, globalVariables) {
49
49
  // Get the new archive state after updating
50
50
  const newArchiveInfo = await worldTrees.getTreeInfo(MerkleTreeId.ARCHIVE);
51
51
  const newArchive = new AppendOnlyTreeSnapshot(new Fr(newArchiveInfo.root), Number(newArchiveInfo.size));
52
- // L2Block requires checkpointNumber and indexWithinCheckpoint
52
+ // L2Block requires checkpointNumber and indexWithinCheckpoint.
53
+ // TXE uses 1-block-per-checkpoint for testing simplicity, so we can use block number as checkpoint number.
54
+ // This uses the deprecated fromBlockNumber method intentionally for the TXE testing environment.
53
55
  const checkpointNumber = CheckpointNumber.fromBlockNumber(globalVariables.blockNumber);
54
56
  const indexWithinCheckpoint = IndexWithinCheckpoint(0);
55
57
  return new L2Block(newArchive, header, new Body(txEffects), checkpointNumber, indexWithinCheckpoint);