@aztec/txe 0.0.1-commit.7b97ef96e → 0.0.1-commit.7cbc774

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 (126) hide show
  1. package/dest/ContractClassRegistry-KKNT527R.js +3 -0
  2. package/dest/ContractClassRegistry-KKNT527R.js.map +7 -0
  3. package/dest/ContractInstanceRegistry-GSKBNL3Q.js +3 -0
  4. package/dest/ContractInstanceRegistry-GSKBNL3Q.js.map +7 -0
  5. package/dest/FeeJuice-GUJ5O6GB.js +3 -0
  6. package/dest/FeeJuice-GUJ5O6GB.js.map +7 -0
  7. package/dest/MultiCallEntrypoint-ZQPCKVKL.js +3 -0
  8. package/dest/MultiCallEntrypoint-ZQPCKVKL.js.map +7 -0
  9. package/dest/SchnorrAccount-QIXE5DXA.js +3 -0
  10. package/dest/SchnorrAccount-QIXE5DXA.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 +32 -0
  14. package/dest/bin/index.js +3 -30
  15. package/dest/bin/index.js.map +7 -0
  16. package/dest/chunk-BJVAAXNA.js +3 -0
  17. package/dest/chunk-BJVAAXNA.js.map +7 -0
  18. package/dest/chunk-DF6RMOC6.js +304 -0
  19. package/dest/chunk-DF6RMOC6.js.map +7 -0
  20. package/dest/chunk-PPJTNNUG.js +265 -0
  21. package/dest/chunk-PPJTNNUG.js.map +7 -0
  22. package/dest/constants.d.ts +3 -1
  23. package/dest/constants.d.ts.map +1 -1
  24. package/dest/constants.js +5 -0
  25. package/dest/dispatcher_pool.d.ts +67 -0
  26. package/dest/dispatcher_pool.d.ts.map +1 -0
  27. package/dest/dispatcher_pool.js +284 -0
  28. package/dest/index.d.ts +188 -7
  29. package/dest/index.d.ts.map +1 -1
  30. package/dest/index.js +160 -119
  31. package/dest/metafile.json +38147 -0
  32. package/dest/msgpackr_fr_extension.d.ts +2 -0
  33. package/dest/msgpackr_fr_extension.d.ts.map +1 -0
  34. package/dest/msgpackr_fr_extension.js +21 -0
  35. package/dest/oracle/interfaces.d.ts +40 -28
  36. package/dest/oracle/interfaces.d.ts.map +1 -1
  37. package/dest/oracle/txe_oracle_public_context.d.ts +18 -13
  38. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  39. package/dest/oracle/txe_oracle_public_context.js +27 -12
  40. package/dest/oracle/txe_oracle_top_level_context.d.ts +38 -22
  41. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  42. package/dest/oracle/txe_oracle_top_level_context.js +141 -72
  43. package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
  44. package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
  45. package/dest/oracle/txe_private_execution_oracle.js +15 -0
  46. package/dest/rpc_server.d.ts +14 -0
  47. package/dest/rpc_server.d.ts.map +1 -0
  48. package/dest/rpc_server.js +78 -0
  49. package/dest/rpc_translator.d.ts +139 -83
  50. package/dest/rpc_translator.d.ts.map +1 -1
  51. package/dest/rpc_translator.js +574 -238
  52. package/dest/server.bundle.js +3 -0
  53. package/dest/server.bundle.js.map +7 -0
  54. package/dest/state_machine/archiver.d.ts +4 -4
  55. package/dest/state_machine/archiver.d.ts.map +1 -1
  56. package/dest/state_machine/archiver.js +22 -20
  57. package/dest/state_machine/dummy_p2p_client.d.ts +14 -8
  58. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  59. package/dest/state_machine/dummy_p2p_client.js +17 -5
  60. package/dest/state_machine/global_variable_builder.d.ts +9 -4
  61. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  62. package/dest/state_machine/global_variable_builder.js +9 -3
  63. package/dest/state_machine/index.d.ts +7 -3
  64. package/dest/state_machine/index.d.ts.map +1 -1
  65. package/dest/state_machine/index.js +23 -5
  66. package/dest/state_machine/mock_epoch_cache.d.ts +18 -3
  67. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  68. package/dest/state_machine/mock_epoch_cache.js +35 -2
  69. package/dest/state_machine/synchronizer.d.ts +5 -5
  70. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  71. package/dest/state_machine/synchronizer.js +4 -4
  72. package/dest/txe_oracle_version.d.ts +17 -0
  73. package/dest/txe_oracle_version.d.ts.map +1 -0
  74. package/dest/txe_oracle_version.js +14 -0
  75. package/dest/txe_session.d.ts +69 -6
  76. package/dest/txe_session.d.ts.map +1 -1
  77. package/dest/txe_session.js +170 -35
  78. package/dest/utils/encoding.d.ts +191 -0
  79. package/dest/utils/encoding.d.ts.map +1 -0
  80. package/dest/{util → utils}/encoding.js +7 -2
  81. package/dest/{util → utils}/expected_failure_error.d.ts +1 -1
  82. package/dest/utils/expected_failure_error.d.ts.map +1 -0
  83. package/dest/{util → utils}/txe_account_store.d.ts +1 -1
  84. package/dest/utils/txe_account_store.d.ts.map +1 -0
  85. package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
  86. package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
  87. package/dest/{util → utils}/txe_public_contract_data_source.js +1 -3
  88. package/dest/worker.bundle.js +3 -0
  89. package/dest/worker.bundle.js.map +7 -0
  90. package/dest/worker.d.ts +2 -0
  91. package/dest/worker.d.ts.map +1 -0
  92. package/dest/worker.js +92 -0
  93. package/package.json +37 -21
  94. package/src/bin/check_txe_oracle_version.ts +37 -0
  95. package/src/bin/index.ts +11 -2
  96. package/src/constants.ts +6 -0
  97. package/src/dispatcher_pool.ts +316 -0
  98. package/src/index.ts +178 -126
  99. package/src/msgpackr_fr_extension.ts +23 -0
  100. package/src/oracle/interfaces.ts +48 -34
  101. package/src/oracle/txe_oracle_public_context.ts +42 -12
  102. package/src/oracle/txe_oracle_top_level_context.ts +176 -83
  103. package/src/oracle/txe_private_execution_oracle.ts +30 -0
  104. package/src/rpc_server.ts +87 -0
  105. package/src/rpc_translator.ts +654 -319
  106. package/src/state_machine/archiver.ts +33 -18
  107. package/src/state_machine/dummy_p2p_client.ts +32 -12
  108. package/src/state_machine/global_variable_builder.ts +18 -3
  109. package/src/state_machine/index.ts +25 -6
  110. package/src/state_machine/mock_epoch_cache.ts +46 -3
  111. package/src/state_machine/synchronizer.ts +5 -5
  112. package/src/txe_oracle_version.ts +17 -0
  113. package/src/txe_session.ts +269 -37
  114. package/src/{util → utils}/encoding.ts +8 -2
  115. package/src/{util → utils}/txe_public_contract_data_source.ts +0 -2
  116. package/src/worker.ts +98 -0
  117. package/dest/util/encoding.d.ts +0 -720
  118. package/dest/util/encoding.d.ts.map +0 -1
  119. package/dest/util/expected_failure_error.d.ts.map +0 -1
  120. package/dest/util/txe_account_store.d.ts.map +0 -1
  121. package/dest/util/txe_public_contract_data_source.d.ts +0 -20
  122. package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
  123. /package/dest/{util → utils}/expected_failure_error.js +0 -0
  124. /package/dest/{util → utils}/txe_account_store.js +0 -0
  125. /package/src/{util → utils}/expected_failure_error.ts +0 -0
  126. /package/src/{util → utils}/txe_account_store.ts +0 -0
@@ -1,12 +1,14 @@
1
- import { Fr, Point } from '@aztec/aztec.js/fields';
2
- import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
1
+ import { Fr } from '@aztec/aztec.js/fields';
2
+ import { ARCHIVE_HEIGHT, MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_PRIVATE_LOGS_PER_TX, PRIVATE_LOG_SIZE_IN_FIELDS } from '@aztec/constants';
3
3
  import { BlockNumber } from '@aztec/foundation/branded-types';
4
- import { packAsHintedNote } from '@aztec/pxe/simulator';
4
+ import { MembershipWitness } from '@aztec/foundation/trees';
5
+ import { BoundedVec, Option, packAsHintedNote } from '@aztec/pxe/simulator';
5
6
  import { EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
6
7
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
7
- import { BlockHash } from '@aztec/stdlib/block';
8
- import { addressFromSingle, arrayOfArraysToBoundedVecOfArrays, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle } from './util/encoding.js';
9
- const MAX_EVENT_LEN = 12; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_RESERVED_FIELDS
8
+ import { GasSettings } from '@aztec/stdlib/gas';
9
+ import { MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY, MAX_OFFCHAIN_EFFECT_LEN } from './constants.js';
10
+ import { addressFromSingle, arrayOfArraysToBoundedVecOfArrays, arrayToBoundedVec, blockHashFromSingle, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle } from './utils/encoding.js';
11
+ const MAX_EVENT_LEN = 10; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_MSG_PLAINTEXT_RESERVED_FIELDS_LEN
10
12
  const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
11
13
  export class UnavailableOracleError extends Error {
12
14
  constructor(oracleName){
@@ -60,123 +62,190 @@ export class RPCTranslator {
60
62
  }
61
63
  return this.oracleHandler;
62
64
  }
65
+ // eslint-disable-next-line camelcase
66
+ aztec_txe_assertCompatibleOracleVersion(foreignMajor, foreignMinor) {
67
+ const major = fromSingle(foreignMajor).toNumber();
68
+ const minor = fromSingle(foreignMinor).toNumber();
69
+ this.stateHandler.setTxeOracleVersion(major, minor);
70
+ return toForeignCallResult([]);
71
+ }
63
72
  // TXE session state transition functions - these get handled by the state handler
64
- async txeSetTopLevelTXEContext() {
73
+ // eslint-disable-next-line camelcase
74
+ async aztec_txe_setTopLevelTXEContext() {
65
75
  await this.stateHandler.enterTopLevelState();
66
76
  return toForeignCallResult([]);
67
77
  }
68
- async txeSetPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignAnchorBlockNumberIsSome, foreignAnchorBlockNumberValue) {
78
+ // eslint-disable-next-line camelcase
79
+ async aztec_txe_setPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignAnchorBlockNumberIsSome, foreignAnchorBlockNumberValue, foreignGasSettings) {
69
80
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
70
81
  const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool() ? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber()) : undefined;
71
- const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber);
82
+ const gasSettings = GasSettings.fromFields(fromArray(foreignGasSettings));
83
+ const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber, gasSettings);
72
84
  return toForeignCallResult(privateContextInputs.toFields().map(toSingle));
73
85
  }
74
- async txeSetPublicTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
86
+ // eslint-disable-next-line camelcase
87
+ async aztec_txe_setPublicTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
75
88
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
76
89
  await this.stateHandler.enterPublicState(contractAddress);
77
90
  return toForeignCallResult([]);
78
91
  }
79
- async txeSetUtilityTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
92
+ // eslint-disable-next-line camelcase
93
+ async aztec_txe_setUtilityTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
80
94
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
81
95
  await this.stateHandler.enterUtilityState(contractAddress);
82
96
  return toForeignCallResult([]);
83
97
  }
84
98
  // Other oracles - these get handled by the oracle handler
85
99
  // TXE-specific oracles
86
- txeGetDefaultAddress() {
87
- const defaultAddress = this.handlerAsTxe().txeGetDefaultAddress();
100
+ // eslint-disable-next-line camelcase
101
+ aztec_txe_getDefaultAddress() {
102
+ const defaultAddress = this.handlerAsTxe().getDefaultAddress();
88
103
  return toForeignCallResult([
89
104
  toSingle(defaultAddress)
90
105
  ]);
91
106
  }
92
- async txeGetNextBlockNumber() {
93
- const nextBlockNumber = await this.handlerAsTxe().txeGetNextBlockNumber();
107
+ // eslint-disable-next-line camelcase
108
+ async aztec_txe_getNextBlockNumber() {
109
+ const nextBlockNumber = await this.handlerAsTxe().getNextBlockNumber();
94
110
  return toForeignCallResult([
95
111
  toSingle(nextBlockNumber)
96
112
  ]);
97
113
  }
98
- async txeGetNextBlockTimestamp() {
99
- const nextBlockTimestamp = await this.handlerAsTxe().txeGetNextBlockTimestamp();
114
+ // eslint-disable-next-line camelcase
115
+ async aztec_txe_getNextBlockTimestamp() {
116
+ const nextBlockTimestamp = await this.handlerAsTxe().getNextBlockTimestamp();
100
117
  return toForeignCallResult([
101
118
  toSingle(nextBlockTimestamp)
102
119
  ]);
103
120
  }
104
- async txeAdvanceBlocksBy(foreignBlocks) {
121
+ // eslint-disable-next-line camelcase
122
+ async aztec_txe_advanceBlocksBy(foreignBlocks) {
105
123
  const blocks = fromSingle(foreignBlocks).toNumber();
106
- await this.handlerAsTxe().txeAdvanceBlocksBy(blocks);
124
+ await this.handlerAsTxe().advanceBlocksBy(blocks);
107
125
  return toForeignCallResult([]);
108
126
  }
109
- txeAdvanceTimestampBy(foreignDuration) {
127
+ // eslint-disable-next-line camelcase
128
+ aztec_txe_advanceTimestampBy(foreignDuration) {
110
129
  const duration = fromSingle(foreignDuration).toBigInt();
111
- this.handlerAsTxe().txeAdvanceTimestampBy(duration);
130
+ this.handlerAsTxe().advanceTimestampBy(duration);
112
131
  return toForeignCallResult([]);
113
132
  }
114
- async txeDeploy(artifact, instance, foreignSecret) {
133
+ // eslint-disable-next-line camelcase
134
+ async aztec_txe_deploy(artifact, instance, foreignSecret) {
115
135
  const secret = fromSingle(foreignSecret);
116
- await this.handlerAsTxe().txeDeploy(artifact, instance, secret);
136
+ await this.handlerAsTxe().deploy(artifact, instance, secret);
117
137
  return toForeignCallResult([
118
138
  toArray([
119
139
  instance.salt,
120
140
  instance.deployer.toField(),
121
141
  instance.currentContractClassId,
122
142
  instance.initializationHash,
143
+ instance.immutablesHash,
123
144
  ...instance.publicKeys.toFields()
124
145
  ])
125
146
  ]);
126
147
  }
127
- async txeCreateAccount(foreignSecret) {
148
+ // eslint-disable-next-line camelcase
149
+ async aztec_txe_createAccount(foreignSecret) {
128
150
  const secret = fromSingle(foreignSecret);
129
- const completeAddress = await this.handlerAsTxe().txeCreateAccount(secret);
151
+ const completeAddress = await this.handlerAsTxe().createAccount(secret);
130
152
  return toForeignCallResult([
131
153
  toSingle(completeAddress.address),
132
154
  ...completeAddress.publicKeys.toFields().map(toSingle)
133
155
  ]);
134
156
  }
135
- async txeAddAccount(artifact, instance, foreignSecret) {
157
+ // eslint-disable-next-line camelcase
158
+ async aztec_txe_addAccount(artifact, instance, foreignSecret) {
136
159
  const secret = fromSingle(foreignSecret);
137
- const completeAddress = await this.handlerAsTxe().txeAddAccount(artifact, instance, secret);
160
+ const completeAddress = await this.handlerAsTxe().addAccount(artifact, instance, secret);
138
161
  return toForeignCallResult([
139
162
  toSingle(completeAddress.address),
140
163
  ...completeAddress.publicKeys.toFields().map(toSingle)
141
164
  ]);
142
165
  }
143
- async txeAddAuthWitness(foreignAddress, foreignMessageHash) {
166
+ // eslint-disable-next-line camelcase
167
+ async aztec_txe_addAuthWitness(foreignAddress, foreignMessageHash) {
144
168
  const address = addressFromSingle(foreignAddress);
145
169
  const messageHash = fromSingle(foreignMessageHash);
146
- await this.handlerAsTxe().txeAddAuthWitness(address, messageHash);
170
+ await this.handlerAsTxe().addAuthWitness(address, messageHash);
147
171
  return toForeignCallResult([]);
148
172
  }
149
173
  // PXE oracles
150
- utilityAssertCompatibleOracleVersion(foreignVersion) {
151
- const version = fromSingle(foreignVersion).toNumber();
152
- this.handlerAsMisc().utilityAssertCompatibleOracleVersion(version);
174
+ // eslint-disable-next-line camelcase
175
+ aztec_utl_assertCompatibleOracleVersion(foreignMajor, foreignMinor) {
176
+ const major = fromSingle(foreignMajor).toNumber();
177
+ const minor = fromSingle(foreignMinor).toNumber();
178
+ this.handlerAsMisc().assertCompatibleOracleVersion(major, minor);
153
179
  return toForeignCallResult([]);
154
180
  }
155
- utilityGetRandomField() {
156
- const randomField = this.handlerAsMisc().utilityGetRandomField();
181
+ // eslint-disable-next-line camelcase
182
+ aztec_utl_getRandomField() {
183
+ const randomField = this.handlerAsMisc().getRandomField();
157
184
  return toForeignCallResult([
158
185
  toSingle(randomField)
159
186
  ]);
160
187
  }
161
- async txeGetLastBlockTimestamp() {
162
- const timestamp = await this.handlerAsTxe().txeGetLastBlockTimestamp();
188
+ // eslint-disable-next-line camelcase
189
+ async aztec_txe_getLastBlockTimestamp() {
190
+ const timestamp = await this.handlerAsTxe().getLastBlockTimestamp();
163
191
  return toForeignCallResult([
164
192
  toSingle(new Fr(timestamp))
165
193
  ]);
166
194
  }
167
- async txeGetLastTxEffects() {
168
- const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().txeGetLastTxEffects();
195
+ // eslint-disable-next-line camelcase
196
+ async aztec_txe_getLastTxEffects() {
197
+ const { txHash, noteHashes, nullifiers, privateLogs } = await this.handlerAsTxe().getLastTxEffects();
198
+ // Same workaround as `aztec_txe_getPrivateEvents`: Noir cannot yet return nested structs with arrays, so we return
199
+ // a flat multidimensional array plus per-log lengths and the total count, and reassemble into a
200
+ // `BoundedVec<BoundedVec<T>>` on the Noir side. Each log contributes only its emitted fields. The rest
201
+ // is zero-padded to `PRIVATE_LOG_SIZE_IN_FIELDS`.
202
+ const emittedLogs = privateLogs.map((log)=>log.getEmittedFields());
203
+ const rawLogStorage = emittedLogs.map((fields)=>fields.concat(Array(PRIVATE_LOG_SIZE_IN_FIELDS - fields.length).fill(new Fr(0)))).concat(Array(MAX_PRIVATE_LOGS_PER_TX - emittedLogs.length).fill(Array(PRIVATE_LOG_SIZE_IN_FIELDS).fill(new Fr(0)))).flat();
204
+ const logLengths = emittedLogs.map((fields)=>new Fr(fields.length)).concat(Array(MAX_PRIVATE_LOGS_PER_TX - emittedLogs.length).fill(new Fr(0)));
205
+ const logCount = new Fr(emittedLogs.length);
169
206
  return toForeignCallResult([
170
207
  toSingle(txHash.hash),
171
208
  ...arrayToBoundedVec(toArray(noteHashes), MAX_NOTE_HASHES_PER_TX),
172
- ...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX)
209
+ ...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX),
210
+ toArray(rawLogStorage),
211
+ toArray(logLengths),
212
+ toSingle(logCount)
213
+ ]);
214
+ }
215
+ // eslint-disable-next-line camelcase
216
+ aztec_txe_getLastCallOffchainEffects() {
217
+ const { effects } = this.stateHandler.getLastCallOffchainEffects();
218
+ const rawArrayStorage = effects.map((e)=>e.concat(Array(MAX_OFFCHAIN_EFFECT_LEN - e.length).fill(new Fr(0)))).concat(Array(MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY - effects.length).fill(Array(MAX_OFFCHAIN_EFFECT_LEN).fill(new Fr(0)))).flat();
219
+ const effectLengths = effects.map((e)=>new Fr(e.length)).concat(Array(MAX_OFFCHAIN_EFFECTS_PER_TXE_QUERY - effects.length).fill(new Fr(0)));
220
+ const count = new Fr(effects.length);
221
+ return toForeignCallResult([
222
+ toArray(rawArrayStorage),
223
+ toArray(effectLengths),
224
+ toSingle(count)
225
+ ]);
226
+ }
227
+ // eslint-disable-next-line camelcase
228
+ aztec_txe_getLastCallContext() {
229
+ const { txHash, anchorBlockTimestamp } = this.stateHandler.getLastCallContext();
230
+ const isSome = txHash.isZero() ? 0 : 1;
231
+ return toForeignCallResult([
232
+ toSingle(isSome),
233
+ toSingle(txHash),
234
+ toSingle(new Fr(anchorBlockTimestamp))
173
235
  ]);
174
236
  }
175
- async txeGetPrivateEvents(foreignSelector, foreignContractAddress, foreignScope) {
237
+ // eslint-disable-next-line camelcase
238
+ async aztec_txe_getPrivateEvents(foreignSelector, foreignContractAddress, foreignScope) {
176
239
  const selector = EventSelector.fromField(fromSingle(foreignSelector));
177
240
  const contractAddress = addressFromSingle(foreignContractAddress);
178
241
  const scope = addressFromSingle(foreignScope);
179
- const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope);
242
+ // TODO(F-335): Avoid doing the following 2 calls here.
243
+ {
244
+ await this.handlerAsTxe().syncContractNonOracleMethod(contractAddress, scope, this.stateHandler.getCurrentJob());
245
+ // We cycle job to commit the stores after the contract sync.
246
+ await this.stateHandler.cycleJob();
247
+ }
248
+ const events = await this.handlerAsTxe().getPrivateEvents(selector, contractAddress, scope);
180
249
  if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
181
250
  throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
182
251
  }
@@ -194,50 +263,53 @@ export class RPCTranslator {
194
263
  toSingle(queryLength)
195
264
  ]);
196
265
  }
197
- privateStoreInExecutionCache(foreignValues, foreignHash) {
266
+ // eslint-disable-next-line camelcase
267
+ aztec_prv_setHashPreimage(foreignValues, foreignHash) {
198
268
  const values = fromArray(foreignValues);
199
269
  const hash = fromSingle(foreignHash);
200
- this.handlerAsPrivate().privateStoreInExecutionCache(values, hash);
270
+ this.handlerAsPrivate().setHashPreimage(values, hash);
201
271
  return toForeignCallResult([]);
202
272
  }
203
- async privateLoadFromExecutionCache(foreignHash) {
273
+ // eslint-disable-next-line camelcase
274
+ async aztec_prv_getHashPreimage(foreignHash) {
204
275
  const hash = fromSingle(foreignHash);
205
- const returns = await this.handlerAsPrivate().privateLoadFromExecutionCache(hash);
276
+ const returns = await this.handlerAsPrivate().getHashPreimage(hash);
206
277
  return toForeignCallResult([
207
278
  toArray(returns)
208
279
  ]);
209
280
  }
210
281
  // When the argument is a slice, noir automatically adds a length field to oracle call.
211
282
  // When the argument is an array, we add the field length manually to the signature.
212
- async utilityLog(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
283
+ // eslint-disable-next-line camelcase
284
+ async aztec_utl_log(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
213
285
  const level = fromSingle(foreignLevel).toNumber();
214
286
  const message = fromArray(foreignMessage).map((field)=>String.fromCharCode(field.toNumber())).join('');
215
287
  const fields = fromArray(foreignFields);
216
- await this.handlerAsMisc().utilityLog(level, message, fields);
288
+ await this.handlerAsMisc().log(level, message, fields);
217
289
  return toForeignCallResult([]);
218
290
  }
219
- async utilityStorageRead(foreignBlockHash, foreignContractAddress, foreignStartStorageSlot, foreignNumberOfElements) {
220
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
291
+ // eslint-disable-next-line camelcase
292
+ async aztec_utl_getFromPublicStorage(foreignBlockHash, foreignContractAddress, foreignStartStorageSlot, foreignNumberOfElements) {
293
+ const blockHash = blockHashFromSingle(foreignBlockHash);
221
294
  const contractAddress = addressFromSingle(foreignContractAddress);
222
295
  const startStorageSlot = fromSingle(foreignStartStorageSlot);
223
296
  const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
224
- const values = await this.handlerAsUtility().utilityStorageRead(blockHash, contractAddress, startStorageSlot, numberOfElements);
297
+ const values = await this.handlerAsUtility().getFromPublicStorage(blockHash, contractAddress, startStorageSlot, numberOfElements);
225
298
  return toForeignCallResult([
226
299
  toArray(values)
227
300
  ]);
228
301
  }
229
- async utilityGetPublicDataWitness(foreignBlockHash, foreignLeafSlot) {
230
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
302
+ // eslint-disable-next-line camelcase
303
+ async aztec_utl_getPublicDataWitness(foreignBlockHash, foreignLeafSlot) {
304
+ const blockHash = blockHashFromSingle(foreignBlockHash);
231
305
  const leafSlot = fromSingle(foreignLeafSlot);
232
- const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockHash, leafSlot);
233
- if (!witness) {
234
- throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockHash.toString()}.`);
235
- }
306
+ const witness = await this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot);
236
307
  return toForeignCallResult(witness.toNoirRepresentation());
237
308
  }
238
- async utilityGetNotes(foreignOwnerIsSome, foreignOwnerValue, foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedHintedNoteLength) {
309
+ // eslint-disable-next-line camelcase
310
+ async aztec_utl_getNotes(foreignOwnerIsSome, foreignOwnerValue, foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedHintedNoteLength) {
239
311
  // Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
240
- const owner = fromSingle(foreignOwnerIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignOwnerValue)) : undefined;
312
+ const owner = fromSingle(foreignOwnerIsSome).toBool() ? Option.some(AztecAddress.fromField(fromSingle(foreignOwnerValue))) : Option.none(AztecAddress.ZERO);
241
313
  const storageSlot = fromSingle(foreignStorageSlot);
242
314
  const numSelects = fromSingle(foreignNumSelects).toNumber();
243
315
  const selectByIndexes = fromArray(foreignSelectByIndexes).map((fr)=>fr.toNumber());
@@ -254,8 +326,8 @@ export class RPCTranslator {
254
326
  const status = fromSingle(foreignStatus).toNumber();
255
327
  const maxNotes = fromSingle(foreignMaxNotes).toNumber();
256
328
  const packedHintedNoteLength = fromSingle(foreignPackedHintedNoteLength).toNumber();
257
- const noteDatas = await this.handlerAsUtility().utilityGetNotes(owner, storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status);
258
- const returnDataAsArrayOfArrays = noteDatas.map((noteData)=>packAsHintedNote({
329
+ const noteVec = await this.handlerAsUtility().getNotes(owner, storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status, maxNotes, packedHintedNoteLength);
330
+ const returnDataAsArrayOfArrays = Array.from(noteVec.data).map((noteData)=>packAsHintedNote({
259
331
  contractAddress: noteData.contractAddress,
260
332
  owner: noteData.owner,
261
333
  randomness: noteData.randomness,
@@ -264,12 +336,11 @@ export class RPCTranslator {
264
336
  isPending: noteData.isPending,
265
337
  note: noteData.note
266
338
  }));
267
- // Now we convert each sub-array to an array of ForeignCallSingles
268
339
  const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map((subArray)=>subArray.map(toSingle));
269
- // At last we convert the array of arrays to a bounded vec of arrays
270
340
  return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength));
271
341
  }
272
- privateNotifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
342
+ // eslint-disable-next-line camelcase
343
+ aztec_prv_notifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
273
344
  const owner = addressFromSingle(foreignOwner);
274
345
  const storageSlot = fromSingle(foreignStorageSlot);
275
346
  const randomness = fromSingle(foreignRandomness);
@@ -277,415 +348,680 @@ export class RPCTranslator {
277
348
  const note = fromArray(foreignNote);
278
349
  const noteHash = fromSingle(foreignNoteHash);
279
350
  const counter = fromSingle(foreignCounter).toNumber();
280
- this.handlerAsPrivate().privateNotifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
351
+ this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
281
352
  return toForeignCallResult([]);
282
353
  }
283
- async privateNotifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
354
+ // eslint-disable-next-line camelcase
355
+ async aztec_prv_notifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
284
356
  const innerNullifier = fromSingle(foreignInnerNullifier);
285
357
  const noteHash = fromSingle(foreignNoteHash);
286
358
  const counter = fromSingle(foreignCounter).toNumber();
287
- await this.handlerAsPrivate().privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
359
+ await this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter);
288
360
  return toForeignCallResult([]);
289
361
  }
290
- async privateNotifyCreatedNullifier(foreignInnerNullifier) {
362
+ // eslint-disable-next-line camelcase
363
+ async aztec_prv_notifyCreatedNullifier(foreignInnerNullifier) {
291
364
  const innerNullifier = fromSingle(foreignInnerNullifier);
292
- await this.handlerAsPrivate().privateNotifyCreatedNullifier(innerNullifier);
365
+ await this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier);
293
366
  return toForeignCallResult([]);
294
367
  }
295
- async privateIsNullifierPending(foreignInnerNullifier, foreignContractAddress) {
368
+ // eslint-disable-next-line camelcase
369
+ async aztec_prv_isNullifierPending(foreignInnerNullifier, foreignContractAddress) {
296
370
  const innerNullifier = fromSingle(foreignInnerNullifier);
297
371
  const contractAddress = addressFromSingle(foreignContractAddress);
298
- const isPending = await this.handlerAsPrivate().privateIsNullifierPending(innerNullifier, contractAddress);
372
+ const isPending = await this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress);
299
373
  return toForeignCallResult([
300
374
  toSingle(new Fr(isPending))
301
375
  ]);
302
376
  }
303
- async utilityCheckNullifierExists(foreignInnerNullifier) {
377
+ // eslint-disable-next-line camelcase
378
+ async aztec_utl_doesNullifierExist(foreignInnerNullifier) {
304
379
  const innerNullifier = fromSingle(foreignInnerNullifier);
305
- const exists = await this.handlerAsUtility().utilityCheckNullifierExists(innerNullifier);
380
+ const exists = await this.handlerAsUtility().doesNullifierExist(innerNullifier);
306
381
  return toForeignCallResult([
307
382
  toSingle(new Fr(exists))
308
383
  ]);
309
384
  }
310
- async utilityGetContractInstance(foreignAddress) {
385
+ // eslint-disable-next-line camelcase
386
+ async aztec_utl_getContractInstance(foreignAddress) {
311
387
  const address = addressFromSingle(foreignAddress);
312
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
388
+ const instance = await this.handlerAsUtility().getContractInstance(address);
313
389
  return toForeignCallResult([
314
390
  instance.salt,
315
391
  instance.deployer.toField(),
316
392
  instance.currentContractClassId,
317
393
  instance.initializationHash,
394
+ instance.immutablesHash,
318
395
  ...instance.publicKeys.toFields()
319
396
  ].map(toSingle));
320
397
  }
321
- async utilityTryGetPublicKeysAndPartialAddress(foreignAddress) {
398
+ // eslint-disable-next-line camelcase
399
+ async aztec_utl_getPublicKeysAndPartialAddress(foreignAddress) {
322
400
  const address = addressFromSingle(foreignAddress);
323
- const result = await this.handlerAsUtility().utilityTryGetPublicKeysAndPartialAddress(address);
401
+ const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(address);
324
402
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
325
403
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
326
- if (result === undefined) {
404
+ if (!result.isSome()) {
327
405
  // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
406
+ // Wire shape: [npk_m_hash, ivpk_m.x, ivpk_m.y, ovpk_m_hash, tpk_m_hash, mspk_m_hash, fbpk_m_hash, partial_address] = 8 fields.
328
407
  return toForeignCallResult([
329
408
  toSingle(new Fr(0)),
330
- toArray(Array(13).fill(new Fr(0)))
409
+ toArray(Array(8).fill(new Fr(0)))
331
410
  ]);
332
411
  } else {
333
- // Data was found so we set `some` to 1 and return it along with `value`.
412
+ // The Noir side hand-decodes a `[Field; 8]` here (see aztec-nr/aztec/src/oracle/keys.nr), so we
413
+ // emit the 7-field PublicKeys shape + partial_address explicitly
414
+ // rather than going through `publicKeys.toFields()` (which is the struct-flattened 8-field
415
+ // wire for oracle returns that decode via struct shape).
416
+ const { publicKeys, partialAddress } = result.value;
334
417
  return toForeignCallResult([
335
418
  toSingle(new Fr(1)),
336
419
  toArray([
337
- ...result.publicKeys.toFields(),
338
- result.partialAddress
420
+ publicKeys.npkMHash,
421
+ publicKeys.ivpkM.x,
422
+ publicKeys.ivpkM.y,
423
+ publicKeys.ovpkMHash,
424
+ publicKeys.tpkMHash,
425
+ publicKeys.mspkMHash,
426
+ publicKeys.fbpkMHash,
427
+ partialAddress
339
428
  ])
340
429
  ]);
341
430
  }
342
431
  }
343
- async utilityGetKeyValidationRequest(foreignPkMHash) {
432
+ // eslint-disable-next-line camelcase
433
+ async aztec_utl_getKeyValidationRequest(foreignPkMHash) {
344
434
  const pkMHash = fromSingle(foreignPkMHash);
345
- const keyValidationRequest = await this.handlerAsUtility().utilityGetKeyValidationRequest(pkMHash);
435
+ const keyValidationRequest = await this.handlerAsUtility().getKeyValidationRequest(pkMHash);
346
436
  return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
347
437
  }
348
- privateCallPrivateFunction(_foreignTargetContractAddress, _foreignFunctionSelector, _foreignArgsHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
349
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::private_context`, use `private_call` instead');
438
+ // eslint-disable-next-line camelcase
439
+ async aztec_prv_callPrivateFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgsHash, foreignSideEffectCounter, foreignIsStaticCall) {
440
+ const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
441
+ const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
442
+ const argsHash = fromSingle(foreignArgsHash);
443
+ const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
444
+ const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
445
+ const { endSideEffectCounter, returnsHash } = await this.handlerAsPrivate().callPrivateFunction(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall);
446
+ return toForeignCallResult([
447
+ [
448
+ endSideEffectCounter,
449
+ returnsHash
450
+ ].map(toSingle)
451
+ ]);
350
452
  }
351
- async utilityGetNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
352
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
453
+ // eslint-disable-next-line camelcase
454
+ async aztec_utl_getNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
455
+ const blockHash = blockHashFromSingle(foreignBlockHash);
353
456
  const nullifier = fromSingle(foreignNullifier);
354
- const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockHash, nullifier);
355
- if (!witness) {
356
- throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
357
- }
457
+ const witness = await this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier);
358
458
  return toForeignCallResult(witness.toNoirRepresentation());
359
459
  }
360
- async utilityGetAuthWitness(foreignMessageHash) {
460
+ // eslint-disable-next-line camelcase
461
+ async aztec_utl_getAuthWitness(foreignMessageHash) {
361
462
  const messageHash = fromSingle(foreignMessageHash);
362
- const authWitness = await this.handlerAsUtility().utilityGetAuthWitness(messageHash);
363
- if (!authWitness) {
364
- throw new Error(`Auth witness not found for message hash ${messageHash}.`);
365
- }
463
+ const authWitness = await this.handlerAsUtility().getAuthWitness(messageHash);
366
464
  return toForeignCallResult([
367
465
  toArray(authWitness)
368
466
  ]);
369
467
  }
370
- privateNotifyEnqueuedPublicFunctionCall(_foreignTargetContractAddress, _foreignCalldataHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
371
- throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
372
- }
373
- privateNotifySetPublicTeardownFunctionCall(_foreignTargetContractAddress, _foreignCalldataHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
374
- throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
468
+ // eslint-disable-next-line camelcase
469
+ async aztec_prv_assertValidPublicCalldata(foreignCalldataHash) {
470
+ const calldataHash = fromSingle(foreignCalldataHash);
471
+ await this.handlerAsPrivate().assertValidPublicCalldata(calldataHash);
472
+ return toForeignCallResult([]);
375
473
  }
376
- privateNotifySetMinRevertibleSideEffectCounter(_foreignMinRevertibleSideEffectCounter) {
377
- throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
474
+ // eslint-disable-next-line camelcase
475
+ async aztec_prv_notifyRevertiblePhaseStart(foreignMinRevertibleSideEffectCounter) {
476
+ const minRevertibleSideEffectCounter = fromSingle(foreignMinRevertibleSideEffectCounter).toNumber();
477
+ await this.handlerAsPrivate().notifyRevertiblePhaseStart(minRevertibleSideEffectCounter);
478
+ return toForeignCallResult([]);
378
479
  }
379
- async privateIsSideEffectCounterRevertible(foreignSideEffectCounter) {
480
+ // eslint-disable-next-line camelcase
481
+ async aztec_prv_isExecutionInRevertiblePhase(foreignSideEffectCounter) {
380
482
  const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
381
- const isRevertible = await this.handlerAsPrivate().privateIsSideEffectCounterRevertible(sideEffectCounter);
483
+ const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter);
382
484
  return toForeignCallResult([
383
485
  toSingle(new Fr(isRevertible))
384
486
  ]);
385
487
  }
386
- utilityGetUtilityContext() {
387
- const context = this.handlerAsUtility().utilityGetUtilityContext();
488
+ // eslint-disable-next-line camelcase
489
+ aztec_utl_getUtilityContext() {
490
+ const context = this.handlerAsUtility().getUtilityContext();
388
491
  return toForeignCallResult(context.toNoirRepresentation());
389
492
  }
390
- async utilityGetBlockHeader(foreignBlockNumber) {
493
+ // eslint-disable-next-line camelcase
494
+ async aztec_utl_getBlockHeader(foreignBlockNumber) {
391
495
  const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
392
- const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
393
- if (!header) {
394
- throw new Error(`Block header not found for block ${blockNumber}.`);
395
- }
496
+ const header = await this.handlerAsUtility().getBlockHeader(blockNumber);
396
497
  return toForeignCallResult(header.toFields().map(toSingle));
397
498
  }
398
- async utilityGetNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
399
- const blockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
499
+ // eslint-disable-next-line camelcase
500
+ async aztec_utl_getNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
501
+ const blockHash = blockHashFromSingle(foreignAnchorBlockHash);
400
502
  const noteHash = fromSingle(foreignNoteHash);
401
- const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(blockHash, noteHash);
402
- if (!witness) {
403
- throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
404
- }
503
+ const witness = await this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash);
405
504
  return toForeignCallResult(witness.toNoirRepresentation());
406
505
  }
407
- async utilityGetBlockHashMembershipWitness(foreignAnchorBlockHash, foreignBlockHash) {
408
- const anchorBlockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
409
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
410
- const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(anchorBlockHash, blockHash);
411
- if (!witness) {
412
- throw new Error(`Block hash ${blockHash.toString()} not found in the archive tree at anchor block ${anchorBlockHash.toString()}.`);
413
- }
414
- return toForeignCallResult(witness.toNoirRepresentation());
506
+ // eslint-disable-next-line camelcase
507
+ async aztec_utl_getBlockHashMembershipWitness(foreignAnchorBlockHash, foreignBlockHash) {
508
+ const anchorBlockHash = blockHashFromSingle(foreignAnchorBlockHash);
509
+ const blockHash = blockHashFromSingle(foreignBlockHash);
510
+ const witnessOpt = await this.handlerAsUtility().getBlockHashMembershipWitness(anchorBlockHash, blockHash);
511
+ const effective = witnessOpt.value ?? MembershipWitness.empty(ARCHIVE_HEIGHT);
512
+ return toForeignCallResult([
513
+ toSingle(new Fr(witnessOpt.isSome() ? 1 : 0)),
514
+ ...effective.toNoirRepresentation()
515
+ ]);
415
516
  }
416
- async utilityGetLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
417
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
517
+ // eslint-disable-next-line camelcase
518
+ async aztec_utl_getLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
519
+ const blockHash = blockHashFromSingle(foreignBlockHash);
418
520
  const nullifier = fromSingle(foreignNullifier);
419
- const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockHash, nullifier);
420
- if (!witness) {
421
- throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockHash}.`);
422
- }
521
+ const witness = await this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier);
423
522
  return toForeignCallResult(witness.toNoirRepresentation());
424
523
  }
425
- async utilityFetchTaggedLogs(foreignPendingTaggedLogArrayBaseSlot) {
426
- const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
427
- await this.handlerAsUtility().utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
428
- return toForeignCallResult([]);
524
+ // eslint-disable-next-line camelcase
525
+ async aztec_utl_getPendingTaggedLogs(foreignScope) {
526
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
527
+ const slot = await this.handlerAsUtility().getPendingTaggedLogs(scope);
528
+ return toForeignCallResult([
529
+ toSingle(slot)
530
+ ]);
429
531
  }
430
- async utilityValidateAndStoreEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot) {
431
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
532
+ // eslint-disable-next-line camelcase
533
+ async aztec_utl_validateAndStoreEnqueuedNotesAndEvents(foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignScope) {
432
534
  const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
433
535
  const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
434
- await this.handlerAsUtility().utilityValidateAndStoreEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot);
536
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
537
+ await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, scope);
435
538
  return toForeignCallResult([]);
436
539
  }
437
- async utilityBulkRetrieveLogs(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot) {
438
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
439
- const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
440
- const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
441
- await this.handlerAsUtility().utilityBulkRetrieveLogs(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot);
442
- return toForeignCallResult([]);
540
+ // eslint-disable-next-line camelcase
541
+ async aztec_utl_getLogsByTag(foreignRequestArrayBaseSlot) {
542
+ const requestArrayBaseSlot = fromSingle(foreignRequestArrayBaseSlot);
543
+ const responseSlot = await this.handlerAsUtility().getLogsByTag(requestArrayBaseSlot);
544
+ return toForeignCallResult([
545
+ toSingle(responseSlot)
546
+ ]);
443
547
  }
444
- async utilityStoreCapsule(foreignContractAddress, foreignSlot, foreignCapsule) {
548
+ // eslint-disable-next-line camelcase
549
+ async aztec_utl_getMessageContextsByTxHash(foreignRequestArrayBaseSlot) {
550
+ const requestArrayBaseSlot = fromSingle(foreignRequestArrayBaseSlot);
551
+ const responseSlot = await this.handlerAsUtility().getMessageContextsByTxHash(requestArrayBaseSlot);
552
+ return toForeignCallResult([
553
+ toSingle(responseSlot)
554
+ ]);
555
+ }
556
+ // eslint-disable-next-line camelcase
557
+ aztec_utl_setCapsule(foreignContractAddress, foreignSlot, foreignCapsule, foreignScope) {
445
558
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
446
559
  const slot = fromSingle(foreignSlot);
447
560
  const capsule = fromArray(foreignCapsule);
448
- await this.handlerAsUtility().utilityStoreCapsule(contractAddress, slot, capsule);
561
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
562
+ this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope);
449
563
  return toForeignCallResult([]);
450
564
  }
451
- async utilityLoadCapsule(foreignContractAddress, foreignSlot, foreignTSize) {
565
+ // eslint-disable-next-line camelcase
566
+ async aztec_utl_getCapsule(foreignContractAddress, foreignSlot, foreignTSize, foreignScope) {
452
567
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
453
568
  const slot = fromSingle(foreignSlot);
454
569
  const tSize = fromSingle(foreignTSize).toNumber();
455
- const values = await this.handlerAsUtility().utilityLoadCapsule(contractAddress, slot);
570
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
571
+ const opt = await this.handlerAsUtility().getCapsule(contractAddress, slot, tSize, scope);
456
572
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
457
573
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
458
- if (values === null) {
459
- // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
574
+ if (opt.isSome()) {
575
+ // Data was found so we set `some` to 1 and return it along with `value`.
460
576
  return toForeignCallResult([
461
- toSingle(new Fr(0)),
462
- toArray(Array(tSize).fill(new Fr(0)))
577
+ toSingle(new Fr(1)),
578
+ toArray(Array.from(opt.value))
463
579
  ]);
464
580
  } else {
465
- // Data was found so we set `some` to 1 and return it along with `value`.
581
+ // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
466
582
  return toForeignCallResult([
467
- toSingle(new Fr(1)),
468
- toArray(values)
583
+ toSingle(new Fr(0)),
584
+ toArray(Array(tSize).fill(new Fr(0)))
469
585
  ]);
470
586
  }
471
587
  }
472
- async utilityDeleteCapsule(foreignContractAddress, foreignSlot) {
588
+ // eslint-disable-next-line camelcase
589
+ aztec_utl_deleteCapsule(foreignContractAddress, foreignSlot, foreignScope) {
473
590
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
474
591
  const slot = fromSingle(foreignSlot);
475
- await this.handlerAsUtility().utilityDeleteCapsule(contractAddress, slot);
592
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
593
+ this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope);
476
594
  return toForeignCallResult([]);
477
595
  }
478
- async utilityCopyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries) {
596
+ // eslint-disable-next-line camelcase
597
+ async aztec_utl_copyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries, foreignScope) {
479
598
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
480
599
  const srcSlot = fromSingle(foreignSrcSlot);
481
600
  const dstSlot = fromSingle(foreignDstSlot);
482
601
  const numEntries = fromSingle(foreignNumEntries).toNumber();
483
- await this.handlerAsUtility().utilityCopyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
602
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
603
+ await this.handlerAsUtility().copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, scope);
604
+ return toForeignCallResult([]);
605
+ }
606
+ // eslint-disable-next-line camelcase
607
+ aztec_utl_pushEphemeral(foreignSlot, foreignElements) {
608
+ const slot = fromSingle(foreignSlot);
609
+ const elements = fromArray(foreignElements);
610
+ const newLen = this.handlerAsUtility().pushEphemeral(slot, elements);
611
+ return toForeignCallResult([
612
+ toSingle(new Fr(newLen))
613
+ ]);
614
+ }
615
+ // eslint-disable-next-line camelcase
616
+ aztec_utl_popEphemeral(foreignSlot) {
617
+ const slot = fromSingle(foreignSlot);
618
+ const element = this.handlerAsUtility().popEphemeral(slot);
619
+ return toForeignCallResult([
620
+ toArray(element)
621
+ ]);
622
+ }
623
+ // eslint-disable-next-line camelcase
624
+ aztec_utl_getEphemeral(foreignSlot, foreignIndex) {
625
+ const slot = fromSingle(foreignSlot);
626
+ const index = fromSingle(foreignIndex).toNumber();
627
+ const element = this.handlerAsUtility().getEphemeral(slot, index);
628
+ return toForeignCallResult([
629
+ toArray(element)
630
+ ]);
631
+ }
632
+ // eslint-disable-next-line camelcase
633
+ aztec_utl_setEphemeral(foreignSlot, foreignIndex, foreignElements) {
634
+ const slot = fromSingle(foreignSlot);
635
+ const index = fromSingle(foreignIndex).toNumber();
636
+ const elements = fromArray(foreignElements);
637
+ this.handlerAsUtility().setEphemeral(slot, index, elements);
638
+ return toForeignCallResult([]);
639
+ }
640
+ // eslint-disable-next-line camelcase
641
+ aztec_utl_getEphemeralLen(foreignSlot) {
642
+ const slot = fromSingle(foreignSlot);
643
+ const len = this.handlerAsUtility().getEphemeralLen(slot);
644
+ return toForeignCallResult([
645
+ toSingle(new Fr(len))
646
+ ]);
647
+ }
648
+ // eslint-disable-next-line camelcase
649
+ aztec_utl_removeEphemeral(foreignSlot, foreignIndex) {
650
+ const slot = fromSingle(foreignSlot);
651
+ const index = fromSingle(foreignIndex).toNumber();
652
+ this.handlerAsUtility().removeEphemeral(slot, index);
653
+ return toForeignCallResult([]);
654
+ }
655
+ // eslint-disable-next-line camelcase
656
+ aztec_utl_clearEphemeral(foreignSlot) {
657
+ const slot = fromSingle(foreignSlot);
658
+ this.handlerAsUtility().clearEphemeral(slot);
484
659
  return toForeignCallResult([]);
485
660
  }
486
661
  // TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
487
662
  // The compiler didn't throw an error, so it took me a while to learn of the existence of this file, and that I need
488
663
  // to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
489
664
  // existence of a txe_oracle method?
490
- async utilityAes128Decrypt(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
491
- const ciphertext = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
665
+ // eslint-disable-next-line camelcase
666
+ async aztec_utl_decryptAes128(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
667
+ const capacity = foreignCiphertextBVecStorage.length;
668
+ const ciphertextBuf = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
669
+ const ciphertext = BoundedVec.from({
670
+ data: [
671
+ ...ciphertextBuf
672
+ ],
673
+ maxLength: capacity
674
+ });
492
675
  const iv = fromUintArray(foreignIv, 8);
493
676
  const symKey = fromUintArray(foreignSymKey, 8);
494
- const plaintextBuffer = await this.handlerAsUtility().utilityAes128Decrypt(ciphertext, iv, symKey);
495
- return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length));
677
+ // Noir Option<BoundedVec> is encoded as [is_some: Field, storage: Field[], length: Field].
678
+ const plaintextOpt = await this.handlerAsUtility().decryptAes128(ciphertext, iv, symKey);
679
+ if (plaintextOpt.isSome()) {
680
+ const [storage, length] = arrayToBoundedVec(bufferToU8Array(Buffer.from(plaintextOpt.value.data)), capacity);
681
+ return toForeignCallResult([
682
+ toSingle(new Fr(1)),
683
+ storage,
684
+ length
685
+ ]);
686
+ } else {
687
+ const zeroStorage = toArray(Array(capacity).fill(new Fr(0)));
688
+ return toForeignCallResult([
689
+ toSingle(new Fr(0)),
690
+ zeroStorage,
691
+ toSingle(new Fr(0))
692
+ ]);
693
+ }
496
694
  }
497
- async utilityGetSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2) {
695
+ // eslint-disable-next-line camelcase
696
+ async aztec_utl_getSharedSecrets(foreignAddress, foreignEphPksSlot, foreignContractAddress) {
498
697
  const address = AztecAddress.fromField(fromSingle(foreignAddress));
499
- const ephPK = Point.fromFields([
500
- fromSingle(foreignEphPKField0),
501
- fromSingle(foreignEphPKField1),
502
- fromSingle(foreignEphPKField2)
698
+ const ephPksSlot = fromSingle(foreignEphPksSlot);
699
+ const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
700
+ const responseSlot = await this.handlerAsUtility().getSharedSecrets(address, ephPksSlot, contractAddress);
701
+ return toForeignCallResult([
702
+ toSingle(responseSlot)
503
703
  ]);
504
- const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
505
- return toForeignCallResult(secret.toFields().map(toSingle));
506
704
  }
507
- emitOffchainEffect(_foreignData) {
508
- throw new Error('Offchain effects are not yet supported in the TestEnvironment');
705
+ // eslint-disable-next-line camelcase
706
+ aztec_utl_setContractSyncCacheInvalid(foreignContractAddress, foreignScopes, foreignScopeCount) {
707
+ const contractAddress = addressFromSingle(foreignContractAddress);
708
+ const allFields = fromArray(foreignScopes);
709
+ const count = fromSingle(foreignScopeCount).toNumber();
710
+ const scopes = BoundedVec.from({
711
+ data: allFields.slice(0, count).map((f)=>new AztecAddress(f)),
712
+ maxLength: allFields.length
713
+ });
714
+ this.handlerAsUtility().setContractSyncCacheInvalid(contractAddress, scopes);
715
+ return Promise.resolve(toForeignCallResult([]));
716
+ }
717
+ // eslint-disable-next-line camelcase
718
+ aztec_utl_emitOffchainEffect(foreignData) {
719
+ // Record the raw payload against the currently-executing top-level call. The Noir side
720
+ // (via `env.offchain_messages()`) is responsible for decoding the protocol-reserved prefix
721
+ // (`OFFCHAIN_MESSAGE_IDENTIFIER`, recipient) and turning each payload into an `OffchainMessage` struct suitable
722
+ // for `offchain_receive`.
723
+ this.stateHandler.recordOffchainEffect(fromArray(foreignData));
724
+ return Promise.resolve(toForeignCallResult([]));
509
725
  }
510
726
  // AVM opcodes
511
- avmOpcodeEmitPublicLog(_foreignMessage) {
727
+ // eslint-disable-next-line camelcase
728
+ aztec_avm_emitPublicLog(_foreignMessage) {
512
729
  // TODO(#8811): Implement
513
730
  return toForeignCallResult([]);
514
731
  }
515
- async avmOpcodeStorageRead(foreignSlot, foreignContractAddress) {
732
+ // eslint-disable-next-line camelcase
733
+ async aztec_avm_storageRead(foreignSlot, foreignContractAddress) {
516
734
  const slot = fromSingle(foreignSlot);
517
735
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
518
- const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot, contractAddress)).value;
736
+ const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
519
737
  return toForeignCallResult([
520
738
  toSingle(new Fr(value))
521
739
  ]);
522
740
  }
523
- async avmOpcodeStorageWrite(foreignSlot, foreignValue) {
741
+ // eslint-disable-next-line camelcase
742
+ async aztec_avm_storageWrite(foreignSlot, foreignValue) {
524
743
  const slot = fromSingle(foreignSlot);
525
744
  const value = fromSingle(foreignValue);
526
- await this.handlerAsAvm().avmOpcodeStorageWrite(slot, value);
745
+ await this.handlerAsAvm().storageWrite(slot, value);
527
746
  return toForeignCallResult([]);
528
747
  }
529
- async avmOpcodeGetContractInstanceDeployer(foreignAddress) {
748
+ // eslint-disable-next-line camelcase
749
+ async aztec_avm_getContractInstanceDeployer(foreignAddress) {
530
750
  const address = addressFromSingle(foreignAddress);
531
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
751
+ const instance = await this.handlerAsUtility().getContractInstance(address);
532
752
  return toForeignCallResult([
533
753
  toSingle(instance.deployer),
534
754
  // AVM requires an extra boolean indicating the instance was found
535
755
  toSingle(new Fr(1))
536
756
  ]);
537
757
  }
538
- async avmOpcodeGetContractInstanceClassId(foreignAddress) {
758
+ // eslint-disable-next-line camelcase
759
+ async aztec_avm_getContractInstanceClassId(foreignAddress) {
539
760
  const address = addressFromSingle(foreignAddress);
540
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
761
+ const instance = await this.handlerAsUtility().getContractInstance(address);
541
762
  return toForeignCallResult([
542
763
  toSingle(instance.currentContractClassId),
543
764
  // AVM requires an extra boolean indicating the instance was found
544
765
  toSingle(new Fr(1))
545
766
  ]);
546
767
  }
547
- async avmOpcodeGetContractInstanceInitializationHash(foreignAddress) {
768
+ // eslint-disable-next-line camelcase
769
+ async aztec_avm_getContractInstanceInitializationHash(foreignAddress) {
548
770
  const address = addressFromSingle(foreignAddress);
549
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
771
+ const instance = await this.handlerAsUtility().getContractInstance(address);
550
772
  return toForeignCallResult([
551
773
  toSingle(instance.initializationHash),
552
774
  // AVM requires an extra boolean indicating the instance was found
553
775
  toSingle(new Fr(1))
554
776
  ]);
555
777
  }
556
- async avmOpcodeSender() {
557
- const sender = await this.handlerAsAvm().avmOpcodeSender();
778
+ // eslint-disable-next-line camelcase
779
+ async aztec_avm_getContractInstanceImmutablesHash(foreignAddress) {
780
+ const address = addressFromSingle(foreignAddress);
781
+ const instance = await this.handlerAsUtility().getContractInstance(address);
782
+ return toForeignCallResult([
783
+ toSingle(instance.immutablesHash),
784
+ // AVM requires an extra boolean indicating the instance was found
785
+ toSingle(new Fr(1))
786
+ ]);
787
+ }
788
+ // eslint-disable-next-line camelcase
789
+ async aztec_avm_sender() {
790
+ const sender = await this.handlerAsAvm().sender();
558
791
  return toForeignCallResult([
559
792
  toSingle(sender)
560
793
  ]);
561
794
  }
562
- async avmOpcodeEmitNullifier(foreignNullifier) {
795
+ // eslint-disable-next-line camelcase
796
+ async aztec_avm_emitNullifier(foreignNullifier) {
563
797
  const nullifier = fromSingle(foreignNullifier);
564
- await this.handlerAsAvm().avmOpcodeEmitNullifier(nullifier);
798
+ await this.handlerAsAvm().emitNullifier(nullifier);
565
799
  return toForeignCallResult([]);
566
800
  }
567
- async avmOpcodeEmitNoteHash(foreignNoteHash) {
801
+ // eslint-disable-next-line camelcase
802
+ async aztec_avm_emitNoteHash(foreignNoteHash) {
568
803
  const noteHash = fromSingle(foreignNoteHash);
569
- await this.handlerAsAvm().avmOpcodeEmitNoteHash(noteHash);
804
+ await this.handlerAsAvm().emitNoteHash(noteHash);
570
805
  return toForeignCallResult([]);
571
806
  }
572
- async avmOpcodeNullifierExists(foreignSiloedNullifier) {
807
+ // eslint-disable-next-line camelcase
808
+ async aztec_avm_nullifierExists(foreignSiloedNullifier) {
573
809
  const siloedNullifier = fromSingle(foreignSiloedNullifier);
574
- const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(siloedNullifier);
810
+ const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
575
811
  return toForeignCallResult([
576
812
  toSingle(new Fr(exists))
577
813
  ]);
578
814
  }
579
- async avmOpcodeAddress() {
580
- const contractAddress = await this.handlerAsAvm().avmOpcodeAddress();
815
+ // eslint-disable-next-line camelcase
816
+ async aztec_avm_address() {
817
+ const contractAddress = await this.handlerAsAvm().address();
581
818
  return toForeignCallResult([
582
819
  toSingle(contractAddress.toField())
583
820
  ]);
584
821
  }
585
- async avmOpcodeBlockNumber() {
586
- const blockNumber = await this.handlerAsAvm().avmOpcodeBlockNumber();
822
+ // eslint-disable-next-line camelcase
823
+ async aztec_avm_blockNumber() {
824
+ const blockNumber = await this.handlerAsAvm().blockNumber();
587
825
  return toForeignCallResult([
588
826
  toSingle(new Fr(blockNumber))
589
827
  ]);
590
828
  }
591
- async avmOpcodeTimestamp() {
592
- const timestamp = await this.handlerAsAvm().avmOpcodeTimestamp();
829
+ // eslint-disable-next-line camelcase
830
+ async aztec_avm_timestamp() {
831
+ const timestamp = await this.handlerAsAvm().timestamp();
593
832
  return toForeignCallResult([
594
833
  toSingle(new Fr(timestamp))
595
834
  ]);
596
835
  }
597
- async avmOpcodeIsStaticCall() {
598
- const isStaticCall = await this.handlerAsAvm().avmOpcodeIsStaticCall();
836
+ // eslint-disable-next-line camelcase
837
+ async aztec_avm_isStaticCall() {
838
+ const isStaticCall = await this.handlerAsAvm().isStaticCall();
599
839
  return toForeignCallResult([
600
840
  toSingle(new Fr(isStaticCall ? 1 : 0))
601
841
  ]);
602
842
  }
603
- async avmOpcodeChainId() {
604
- const chainId = await this.handlerAsAvm().avmOpcodeChainId();
843
+ // eslint-disable-next-line camelcase
844
+ async aztec_avm_chainId() {
845
+ const chainId = await this.handlerAsAvm().chainId();
605
846
  return toForeignCallResult([
606
847
  toSingle(chainId)
607
848
  ]);
608
849
  }
609
- async avmOpcodeVersion() {
610
- const version = await this.handlerAsAvm().avmOpcodeVersion();
850
+ // eslint-disable-next-line camelcase
851
+ async aztec_avm_version() {
852
+ const version = await this.handlerAsAvm().version();
611
853
  return toForeignCallResult([
612
854
  toSingle(version)
613
855
  ]);
614
856
  }
615
- avmOpcodeReturndataSize() {
616
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
857
+ // eslint-disable-next-line camelcase
858
+ async aztec_avm_returndataSize() {
859
+ const result = await this.handlerAsAvm().returndataSize();
860
+ return toForeignCallResult([
861
+ toSingle(result)
862
+ ]);
617
863
  }
618
- avmOpcodeReturndataCopy(_foreignRdOffset, _foreignCopySize) {
619
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
864
+ // eslint-disable-next-line camelcase
865
+ async aztec_avm_returndataCopy(foreignRdOffset, foreignCopySize) {
866
+ const rdOffset = fromSingle(foreignRdOffset).toNumber();
867
+ const copySize = fromSingle(foreignCopySize).toNumber();
868
+ const result = await this.handlerAsAvm().returndataCopy(rdOffset, copySize);
869
+ return toForeignCallResult([
870
+ toArray(result)
871
+ ]);
620
872
  }
621
- avmOpcodeCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
622
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
873
+ // eslint-disable-next-line camelcase
874
+ async aztec_avm_call(foreignL2Gas, foreignDaGas, foreignAddress, foreignLength, foreignArgs) {
875
+ const l2Gas = fromSingle(foreignL2Gas).toNumber();
876
+ const daGas = fromSingle(foreignDaGas).toNumber();
877
+ const address = addressFromSingle(foreignAddress);
878
+ const argsLength = fromSingle(foreignLength).toNumber();
879
+ const args = fromArray(foreignArgs);
880
+ const result = await this.handlerAsAvm().call(l2Gas, daGas, address, argsLength, args);
881
+ return toForeignCallResult([
882
+ toArray(result)
883
+ ]);
623
884
  }
624
- avmOpcodeStaticCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
625
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
885
+ // eslint-disable-next-line camelcase
886
+ async aztec_avm_staticCall(foreignL2Gas, foreignDaGas, foreignAddress, foreignLength, foreignArgs) {
887
+ const l2Gas = fromSingle(foreignL2Gas).toNumber();
888
+ const daGas = fromSingle(foreignDaGas).toNumber();
889
+ const address = addressFromSingle(foreignAddress);
890
+ const argsLength = fromSingle(foreignLength).toNumber();
891
+ const args = fromArray(foreignArgs);
892
+ const result = await this.handlerAsAvm().staticCall(l2Gas, daGas, address, argsLength, args);
893
+ return toForeignCallResult([
894
+ toArray(result)
895
+ ]);
626
896
  }
627
- avmOpcodeSuccessCopy() {
628
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
897
+ // eslint-disable-next-line camelcase
898
+ async aztec_avm_successCopy() {
899
+ const result = await this.handlerAsAvm().successCopy();
900
+ return toForeignCallResult([
901
+ toSingle(result)
902
+ ]);
629
903
  }
630
- async txePrivateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
631
- const from = addressFromSingle(foreignFrom);
904
+ // TODO(F-674): Move orchestration logic into the handler so the transport layer is pure serialize→delegate→deserialize.
905
+ // eslint-disable-next-line camelcase
906
+ async aztec_txe_privateCallNewFlow(foreignFromIsSome, foreignFromValue, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall, foreignAdditionalScopes, foreignAuthorizedUtilityCallTargets, foreignGasSettings) {
907
+ const from = fromSingle(foreignFromIsSome).toBool() ? addressFromSingle(foreignFromValue) : undefined;
632
908
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
633
909
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
634
910
  const args = fromArray(foreignArgs);
635
911
  const argsHash = fromSingle(foreignArgsHash);
636
912
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
637
- const returnValues = await this.handlerAsTxe().txePrivateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall);
913
+ const additionalScopes = fromArray(foreignAdditionalScopes).map((field)=>AztecAddress.fromField(field));
914
+ const authorizedUtilityCallTargets = fromArray(foreignAuthorizedUtilityCallTargets).map((field)=>AztecAddress.fromField(field));
915
+ const gasSettings = GasSettings.fromFields(fromArray(foreignGasSettings));
916
+ const returnValues = await this.stateHandler.withTopLevelCallTracking(async ()=>{
917
+ const { returnValues, offchainEffects } = await this.handlerAsTxe().privateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall, additionalScopes, this.stateHandler.getCurrentJob(), authorizedUtilityCallTargets, gasSettings);
918
+ // Private execution collects offchain effects inside PXE's PrivateExecutionOracle rather than
919
+ // round-tripping them through `aztec_utl_emitOffchainEffect`, so the session buffer is empty
920
+ // at this point. Drain the effects from the execution tree into the session buffer so the
921
+ // next `env.offchain_messages()` call in the test sees them.
922
+ for (const data of offchainEffects){
923
+ this.stateHandler.recordOffchainEffect(data);
924
+ }
925
+ // TODO(F-335): Avoid doing the following call here.
926
+ await this.stateHandler.cycleJob();
927
+ if (isStaticCall) {
928
+ // Static calls revert their checkpoint and mine no block, so there is no tx hash to tag
929
+ // offchain effects with. Querying `getLastTxEffects()` here would return an unrelated
930
+ // predecessor tx.
931
+ return {
932
+ result: returnValues
933
+ };
934
+ }
935
+ const { txHash } = await this.handlerAsTxe().getLastTxEffects();
936
+ return {
937
+ result: returnValues,
938
+ txHash: txHash.hash
939
+ };
940
+ });
638
941
  return toForeignCallResult([
639
942
  toArray(returnValues)
640
943
  ]);
641
944
  }
642
- async txeExecuteUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs) {
945
+ // TODO(F-674): Move orchestration logic into the handler so the transport layer is pure serialize→delegate→deserialize.
946
+ // eslint-disable-next-line camelcase
947
+ async aztec_txe_executeUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignAuthorizedUtilityCallTargets) {
643
948
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
644
949
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
645
950
  const args = fromArray(foreignArgs);
646
- const returnValues = await this.handlerAsTxe().txeExecuteUtilityFunction(targetContractAddress, functionSelector, args);
951
+ const authorizedUtilityCallTargets = fromArray(foreignAuthorizedUtilityCallTargets).map((field)=>AztecAddress.fromField(field));
952
+ const returnValues = await this.stateHandler.withTopLevelCallTracking(async ()=>{
953
+ const returnValues = await this.handlerAsTxe().executeUtilityFunction(targetContractAddress, functionSelector, args, this.stateHandler.getCurrentJob(), authorizedUtilityCallTargets);
954
+ // TODO(F-335): Avoid doing the following call here.
955
+ await this.stateHandler.cycleJob();
956
+ return {
957
+ result: returnValues
958
+ };
959
+ });
647
960
  return toForeignCallResult([
648
961
  toArray(returnValues)
649
962
  ]);
650
963
  }
651
- async txePublicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
652
- const from = addressFromSingle(foreignFrom);
964
+ // TODO(F-674): Move orchestration logic into the handler so the transport layer is pure serialize→delegate→deserialize.
965
+ // eslint-disable-next-line camelcase
966
+ async aztec_txe_publicCallNewFlow(foreignFromIsSome, foreignFromValue, foreignAddress, foreignCalldata, foreignIsStaticCall, foreignGasSettings) {
967
+ const from = fromSingle(foreignFromIsSome).toBool() ? addressFromSingle(foreignFromValue) : undefined;
653
968
  const address = addressFromSingle(foreignAddress);
654
969
  const calldata = fromArray(foreignCalldata);
655
970
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
656
- const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
971
+ const gasSettings = GasSettings.fromFields(fromArray(foreignGasSettings));
972
+ const returnValues = await this.stateHandler.withTopLevelCallTracking(async ()=>{
973
+ const returnValues = await this.handlerAsTxe().publicCallNewFlow(from, address, calldata, isStaticCall, gasSettings);
974
+ // TODO(F-335): Avoid doing the following call here.
975
+ await this.stateHandler.cycleJob();
976
+ if (isStaticCall) {
977
+ // See equivalent branch in `aztec_txe_privateCallNewFlow`.
978
+ return {
979
+ result: returnValues
980
+ };
981
+ }
982
+ const { txHash } = await this.handlerAsTxe().getLastTxEffects();
983
+ return {
984
+ result: returnValues,
985
+ txHash: txHash.hash
986
+ };
987
+ });
657
988
  return toForeignCallResult([
658
989
  toArray(returnValues)
659
990
  ]);
660
991
  }
661
- async privateGetSenderForTags() {
662
- const sender = await this.handlerAsPrivate().privateGetSenderForTags();
992
+ // eslint-disable-next-line camelcase
993
+ async aztec_prv_getSenderForTags() {
994
+ const senderOpt = await this.handlerAsPrivate().getSenderForTags();
663
995
  // Return a Noir Option struct with `some` and `value` fields
664
- if (sender === undefined) {
665
- // No sender found, return Option with some=0 and value=0
996
+ if (senderOpt.isSome()) {
997
+ // Sender found, return Option with some=1 and value=sender address
666
998
  return toForeignCallResult([
667
- toSingle(0),
668
- toSingle(0)
999
+ toSingle(1),
1000
+ toSingle(senderOpt.value)
669
1001
  ]);
670
1002
  } else {
671
- // Sender found, return Option with some=1 and value=sender address
1003
+ // No sender found, return Option with some=0 and value=0
672
1004
  return toForeignCallResult([
673
- toSingle(1),
674
- toSingle(sender)
1005
+ toSingle(0),
1006
+ toSingle(0)
675
1007
  ]);
676
1008
  }
677
1009
  }
678
- async privateSetSenderForTags(foreignSenderForTags) {
679
- const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
680
- await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
681
- return toForeignCallResult([]);
682
- }
683
- async privateGetNextAppTagAsSender(foreignSender, foreignRecipient) {
1010
+ // eslint-disable-next-line camelcase
1011
+ async aztec_prv_getNextAppTagAsSender(foreignSender, foreignRecipient) {
684
1012
  const sender = AztecAddress.fromField(fromSingle(foreignSender));
685
1013
  const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
686
- const nextAppTag = await this.handlerAsPrivate().privateGetNextAppTagAsSender(sender, recipient);
1014
+ const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
687
1015
  return toForeignCallResult([
688
1016
  toSingle(nextAppTag.value)
689
1017
  ]);
690
1018
  }
1019
+ // eslint-disable-next-line camelcase
1020
+ async aztec_prv_getNextConstrainedTaggingIndex(foreignAppSiloedSecret) {
1021
+ const appSiloedSecret = fromSingle(foreignAppSiloedSecret);
1022
+ const index = await this.handlerAsPrivate().getNextConstrainedTaggingIndex(appSiloedSecret);
1023
+ return toForeignCallResult([
1024
+ toSingle(new Fr(index))
1025
+ ]);
1026
+ }
691
1027
  }