@aztec/txe 0.0.1-commit.9b94fc1 → 0.0.1-commit.9ee6fcc6

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 (78) hide show
  1. package/dest/constants.d.ts +3 -0
  2. package/dest/constants.d.ts.map +1 -0
  3. package/dest/constants.js +2 -0
  4. package/dest/index.d.ts +1 -1
  5. package/dest/index.d.ts.map +1 -1
  6. package/dest/index.js +91 -56
  7. package/dest/oracle/interfaces.d.ts +33 -29
  8. package/dest/oracle/interfaces.d.ts.map +1 -1
  9. package/dest/oracle/txe_oracle_public_context.d.ts +16 -16
  10. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  11. package/dest/oracle/txe_oracle_public_context.js +20 -22
  12. package/dest/oracle/txe_oracle_top_level_context.d.ts +37 -27
  13. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  14. package/dest/oracle/txe_oracle_top_level_context.js +211 -98
  15. package/dest/rpc_translator.d.ts +96 -79
  16. package/dest/rpc_translator.d.ts.map +1 -1
  17. package/dest/rpc_translator.js +362 -173
  18. package/dest/state_machine/archiver.d.ts +21 -52
  19. package/dest/state_machine/archiver.d.ts.map +1 -1
  20. package/dest/state_machine/archiver.js +66 -99
  21. package/dest/state_machine/dummy_p2p_client.d.ts +20 -15
  22. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  23. package/dest/state_machine/dummy_p2p_client.js +42 -25
  24. package/dest/state_machine/global_variable_builder.d.ts +6 -5
  25. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  26. package/dest/state_machine/global_variable_builder.js +13 -1
  27. package/dest/state_machine/index.d.ts +9 -7
  28. package/dest/state_machine/index.d.ts.map +1 -1
  29. package/dest/state_machine/index.js +44 -23
  30. package/dest/state_machine/mock_epoch_cache.d.ts +25 -8
  31. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  32. package/dest/state_machine/mock_epoch_cache.js +46 -9
  33. package/dest/state_machine/synchronizer.d.ts +6 -5
  34. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  35. package/dest/state_machine/synchronizer.js +8 -7
  36. package/dest/txe_session.d.ts +27 -15
  37. package/dest/txe_session.d.ts.map +1 -1
  38. package/dest/txe_session.js +170 -55
  39. package/dest/util/encoding.d.ts +686 -19
  40. package/dest/util/encoding.d.ts.map +1 -1
  41. package/dest/util/encoding.js +1 -1
  42. package/dest/util/txe_account_store.d.ts +10 -0
  43. package/dest/util/txe_account_store.d.ts.map +1 -0
  44. package/dest/util/{txe_account_data_provider.js → txe_account_store.js} +1 -1
  45. package/dest/util/txe_public_contract_data_source.d.ts +8 -8
  46. package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
  47. package/dest/util/txe_public_contract_data_source.js +13 -32
  48. package/dest/utils/block_creation.d.ts +21 -6
  49. package/dest/utils/block_creation.d.ts.map +1 -1
  50. package/dest/utils/block_creation.js +38 -4
  51. package/dest/utils/tx_effect_creation.d.ts +3 -3
  52. package/dest/utils/tx_effect_creation.d.ts.map +1 -1
  53. package/dest/utils/tx_effect_creation.js +4 -7
  54. package/package.json +18 -18
  55. package/src/constants.ts +3 -0
  56. package/src/index.ts +103 -63
  57. package/src/oracle/interfaces.ts +36 -32
  58. package/src/oracle/txe_oracle_public_context.ts +21 -28
  59. package/src/oracle/txe_oracle_top_level_context.ts +256 -138
  60. package/src/rpc_translator.ts +419 -191
  61. package/src/state_machine/archiver.ts +62 -117
  62. package/src/state_machine/dummy_p2p_client.ts +58 -33
  63. package/src/state_machine/global_variable_builder.ts +21 -4
  64. package/src/state_machine/index.ts +65 -21
  65. package/src/state_machine/mock_epoch_cache.ts +57 -14
  66. package/src/state_machine/synchronizer.ts +9 -8
  67. package/src/txe_session.ts +236 -104
  68. package/src/util/encoding.ts +1 -1
  69. package/src/util/{txe_account_data_provider.ts → txe_account_store.ts} +1 -1
  70. package/src/util/txe_public_contract_data_source.ts +20 -47
  71. package/src/utils/block_creation.ts +49 -15
  72. package/src/utils/tx_effect_creation.ts +5 -12
  73. package/dest/util/txe_account_data_provider.d.ts +0 -10
  74. package/dest/util/txe_account_data_provider.d.ts.map +0 -1
  75. package/dest/util/txe_contract_data_provider.d.ts +0 -12
  76. package/dest/util/txe_contract_data_provider.d.ts.map +0 -1
  77. package/dest/util/txe_contract_data_provider.js +0 -22
  78. package/src/util/txe_contract_data_provider.ts +0 -36
@@ -1,10 +1,13 @@
1
1
  import { Fr, Point } from '@aztec/aztec.js/fields';
2
2
  import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
3
- import { packAsRetrievedNote } from '@aztec/pxe/simulator';
4
- import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
3
+ import { BlockNumber } from '@aztec/foundation/branded-types';
4
+ import { packAsHintedNote } from '@aztec/pxe/simulator';
5
+ import { EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
5
6
  import { AztecAddress } from '@aztec/stdlib/aztec-address';
6
- import { MerkleTreeId } from '@aztec/stdlib/trees';
7
+ import { BlockHash } from '@aztec/stdlib/block';
7
8
  import { addressFromSingle, arrayOfArraysToBoundedVecOfArrays, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, fromUintBoundedVec, toArray, toForeignCallResult, toSingle } from './util/encoding.js';
9
+ const MAX_EVENT_LEN = 10; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_MSG_PLAINTEXT_RESERVED_FIELDS_LEN
10
+ const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
8
11
  export class UnavailableOracleError extends Error {
9
12
  constructor(oracleName){
10
13
  super(`${oracleName} oracles not available with the current handler`);
@@ -58,53 +61,69 @@ export class RPCTranslator {
58
61
  return this.oracleHandler;
59
62
  }
60
63
  // TXE session state transition functions - these get handled by the state handler
61
- async txeSetTopLevelTXEContext() {
64
+ // eslint-disable-next-line camelcase
65
+ async aztec_txe_setTopLevelTXEContext() {
62
66
  await this.stateHandler.enterTopLevelState();
63
67
  return toForeignCallResult([]);
64
68
  }
65
- async txeSetPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignAnchorBlockNumberIsSome, foreignAnchorBlockNumberValue) {
69
+ // eslint-disable-next-line camelcase
70
+ async aztec_txe_setPrivateTXEContext(foreignContractAddressIsSome, foreignContractAddressValue, foreignAnchorBlockNumberIsSome, foreignAnchorBlockNumberValue) {
66
71
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
67
- const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool() ? fromSingle(foreignAnchorBlockNumberValue).toNumber() : undefined;
72
+ const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool() ? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber()) : undefined;
68
73
  const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber);
69
74
  return toForeignCallResult(privateContextInputs.toFields().map(toSingle));
70
75
  }
71
- async txeSetPublicTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
76
+ // eslint-disable-next-line camelcase
77
+ async aztec_txe_setPublicTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
72
78
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
73
79
  await this.stateHandler.enterPublicState(contractAddress);
74
80
  return toForeignCallResult([]);
75
81
  }
76
- async txeSetUtilityTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
82
+ // eslint-disable-next-line camelcase
83
+ async aztec_txe_setUtilityTXEContext(foreignContractAddressIsSome, foreignContractAddressValue) {
77
84
  const contractAddress = fromSingle(foreignContractAddressIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignContractAddressValue)) : undefined;
78
85
  await this.stateHandler.enterUtilityState(contractAddress);
79
86
  return toForeignCallResult([]);
80
87
  }
81
88
  // Other oracles - these get handled by the oracle handler
82
89
  // TXE-specific oracles
83
- async txeGetNextBlockNumber() {
84
- const nextBlockNumber = await this.handlerAsTxe().txeGetNextBlockNumber();
90
+ // eslint-disable-next-line camelcase
91
+ aztec_txe_getDefaultAddress() {
92
+ const defaultAddress = this.handlerAsTxe().getDefaultAddress();
93
+ return toForeignCallResult([
94
+ toSingle(defaultAddress)
95
+ ]);
96
+ }
97
+ // eslint-disable-next-line camelcase
98
+ async aztec_txe_getNextBlockNumber() {
99
+ const nextBlockNumber = await this.handlerAsTxe().getNextBlockNumber();
85
100
  return toForeignCallResult([
86
101
  toSingle(nextBlockNumber)
87
102
  ]);
88
103
  }
89
- async txeGetNextBlockTimestamp() {
90
- const nextBlockTimestamp = await this.handlerAsTxe().txeGetNextBlockTimestamp();
104
+ // eslint-disable-next-line camelcase
105
+ async aztec_txe_getNextBlockTimestamp() {
106
+ const nextBlockTimestamp = await this.handlerAsTxe().getNextBlockTimestamp();
91
107
  return toForeignCallResult([
92
108
  toSingle(nextBlockTimestamp)
93
109
  ]);
94
110
  }
95
- async txeAdvanceBlocksBy(foreignBlocks) {
111
+ // eslint-disable-next-line camelcase
112
+ async aztec_txe_advanceBlocksBy(foreignBlocks) {
96
113
  const blocks = fromSingle(foreignBlocks).toNumber();
97
- await this.handlerAsTxe().txeAdvanceBlocksBy(blocks);
114
+ await this.handlerAsTxe().advanceBlocksBy(blocks);
98
115
  return toForeignCallResult([]);
99
116
  }
100
- txeAdvanceTimestampBy(foreignDuration) {
117
+ // eslint-disable-next-line camelcase
118
+ aztec_txe_advanceTimestampBy(foreignDuration) {
101
119
  const duration = fromSingle(foreignDuration).toBigInt();
102
- this.handlerAsTxe().txeAdvanceTimestampBy(duration);
120
+ this.handlerAsTxe().advanceTimestampBy(duration);
103
121
  return toForeignCallResult([]);
104
122
  }
105
- async txeDeploy(artifact, instance, foreignSecret) {
123
+ // eslint-disable-next-line camelcase
124
+ async aztec_txe_deploy(artifact, instance, foreignSecret) {
106
125
  const secret = fromSingle(foreignSecret);
107
- await this.handlerAsTxe().txeDeploy(artifact, instance, secret);
126
+ await this.handlerAsTxe().deploy(artifact, instance, secret);
108
127
  return toForeignCallResult([
109
128
  toArray([
110
129
  instance.salt,
@@ -115,96 +134,140 @@ export class RPCTranslator {
115
134
  ])
116
135
  ]);
117
136
  }
118
- async txeCreateAccount(foreignSecret) {
137
+ // eslint-disable-next-line camelcase
138
+ async aztec_txe_createAccount(foreignSecret) {
119
139
  const secret = fromSingle(foreignSecret);
120
- const completeAddress = await this.handlerAsTxe().txeCreateAccount(secret);
140
+ const completeAddress = await this.handlerAsTxe().createAccount(secret);
121
141
  return toForeignCallResult([
122
142
  toSingle(completeAddress.address),
123
143
  ...completeAddress.publicKeys.toFields().map(toSingle)
124
144
  ]);
125
145
  }
126
- async txeAddAccount(artifact, instance, foreignSecret) {
146
+ // eslint-disable-next-line camelcase
147
+ async aztec_txe_addAccount(artifact, instance, foreignSecret) {
127
148
  const secret = fromSingle(foreignSecret);
128
- const completeAddress = await this.handlerAsTxe().txeAddAccount(artifact, instance, secret);
149
+ const completeAddress = await this.handlerAsTxe().addAccount(artifact, instance, secret);
129
150
  return toForeignCallResult([
130
151
  toSingle(completeAddress.address),
131
152
  ...completeAddress.publicKeys.toFields().map(toSingle)
132
153
  ]);
133
154
  }
134
- async txeAddAuthWitness(foreignAddress, foreignMessageHash) {
155
+ // eslint-disable-next-line camelcase
156
+ async aztec_txe_addAuthWitness(foreignAddress, foreignMessageHash) {
135
157
  const address = addressFromSingle(foreignAddress);
136
158
  const messageHash = fromSingle(foreignMessageHash);
137
- await this.handlerAsTxe().txeAddAuthWitness(address, messageHash);
159
+ await this.handlerAsTxe().addAuthWitness(address, messageHash);
138
160
  return toForeignCallResult([]);
139
161
  }
140
162
  // PXE oracles
141
- utilityAssertCompatibleOracleVersion(foreignVersion) {
163
+ // eslint-disable-next-line camelcase
164
+ aztec_utl_assertCompatibleOracleVersion(foreignVersion) {
142
165
  const version = fromSingle(foreignVersion).toNumber();
143
- this.handlerAsMisc().utilityAssertCompatibleOracleVersion(version);
166
+ this.handlerAsMisc().assertCompatibleOracleVersion(version);
144
167
  return toForeignCallResult([]);
145
168
  }
146
- utilityGetRandomField() {
147
- const randomField = this.handlerAsMisc().utilityGetRandomField();
169
+ // eslint-disable-next-line camelcase
170
+ aztec_utl_getRandomField() {
171
+ const randomField = this.handlerAsMisc().getRandomField();
148
172
  return toForeignCallResult([
149
173
  toSingle(randomField)
150
174
  ]);
151
175
  }
152
- async txeGetLastBlockTimestamp() {
153
- const timestamp = await this.handlerAsTxe().txeGetLastBlockTimestamp();
176
+ // eslint-disable-next-line camelcase
177
+ async aztec_txe_getLastBlockTimestamp() {
178
+ const timestamp = await this.handlerAsTxe().getLastBlockTimestamp();
154
179
  return toForeignCallResult([
155
180
  toSingle(new Fr(timestamp))
156
181
  ]);
157
182
  }
158
- async txeGetLastTxEffects() {
159
- const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().txeGetLastTxEffects();
183
+ // eslint-disable-next-line camelcase
184
+ async aztec_txe_getLastTxEffects() {
185
+ const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().getLastTxEffects();
160
186
  return toForeignCallResult([
161
187
  toSingle(txHash.hash),
162
188
  ...arrayToBoundedVec(toArray(noteHashes), MAX_NOTE_HASHES_PER_TX),
163
189
  ...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX)
164
190
  ]);
165
191
  }
166
- privateStoreInExecutionCache(foreignValues, foreignHash) {
192
+ // eslint-disable-next-line camelcase
193
+ async aztec_txe_getPrivateEvents(foreignSelector, foreignContractAddress, foreignScope) {
194
+ const selector = EventSelector.fromField(fromSingle(foreignSelector));
195
+ const contractAddress = addressFromSingle(foreignContractAddress);
196
+ const scope = addressFromSingle(foreignScope);
197
+ // TODO(F-335): Avoid doing the following 2 calls here.
198
+ {
199
+ await this.handlerAsTxe().syncContractNonOracleMethod(contractAddress, scope, this.stateHandler.getCurrentJob());
200
+ // We cycle job to commit the stores after the contract sync.
201
+ await this.stateHandler.cycleJob();
202
+ }
203
+ const events = await this.handlerAsTxe().getPrivateEvents(selector, contractAddress, scope);
204
+ if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
205
+ throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
206
+ }
207
+ if (events.some((e)=>e.length > MAX_EVENT_LEN)) {
208
+ throw new Error(`Some private event has length larger than maxLen ${MAX_EVENT_LEN}`);
209
+ }
210
+ // This is a workaround as Noir does not currently let us return nested structs with arrays. We instead return a raw
211
+ // multidimensional array in get_private_events_oracle and create the BoundedVecs here.
212
+ const rawArrayStorage = events.map((e)=>e.concat(Array(MAX_EVENT_LEN - e.length).fill(new Fr(0)))).concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Array(MAX_EVENT_LEN).fill(new Fr(0)))).flat();
213
+ const eventLengths = events.map((e)=>new Fr(e.length)).concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(new Fr(0)));
214
+ const queryLength = new Fr(events.length);
215
+ return toForeignCallResult([
216
+ toArray(rawArrayStorage),
217
+ toArray(eventLengths),
218
+ toSingle(queryLength)
219
+ ]);
220
+ }
221
+ // eslint-disable-next-line camelcase
222
+ aztec_prv_storeInExecutionCache(foreignValues, foreignHash) {
167
223
  const values = fromArray(foreignValues);
168
224
  const hash = fromSingle(foreignHash);
169
- this.handlerAsPrivate().privateStoreInExecutionCache(values, hash);
225
+ this.handlerAsPrivate().storeInExecutionCache(values, hash);
170
226
  return toForeignCallResult([]);
171
227
  }
172
- async privateLoadFromExecutionCache(foreignHash) {
228
+ // eslint-disable-next-line camelcase
229
+ async aztec_prv_loadFromExecutionCache(foreignHash) {
173
230
  const hash = fromSingle(foreignHash);
174
- const returns = await this.handlerAsPrivate().privateLoadFromExecutionCache(hash);
231
+ const returns = await this.handlerAsPrivate().loadFromExecutionCache(hash);
175
232
  return toForeignCallResult([
176
233
  toArray(returns)
177
234
  ]);
178
235
  }
179
236
  // When the argument is a slice, noir automatically adds a length field to oracle call.
180
237
  // When the argument is an array, we add the field length manually to the signature.
181
- utilityDebugLog(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
238
+ // eslint-disable-next-line camelcase
239
+ async aztec_utl_log(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
182
240
  const level = fromSingle(foreignLevel).toNumber();
183
241
  const message = fromArray(foreignMessage).map((field)=>String.fromCharCode(field.toNumber())).join('');
184
242
  const fields = fromArray(foreignFields);
185
- this.handlerAsMisc().utilityDebugLog(level, message, fields);
243
+ await this.handlerAsMisc().log(level, message, fields);
186
244
  return toForeignCallResult([]);
187
245
  }
188
- async utilityStorageRead(foreignContractAddress, foreignStartStorageSlot, foreignBlockNumber, foreignNumberOfElements) {
246
+ // eslint-disable-next-line camelcase
247
+ async aztec_utl_storageRead(foreignBlockHash, foreignContractAddress, foreignStartStorageSlot, foreignNumberOfElements) {
248
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
189
249
  const contractAddress = addressFromSingle(foreignContractAddress);
190
250
  const startStorageSlot = fromSingle(foreignStartStorageSlot);
191
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
192
251
  const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
193
- const values = await this.handlerAsUtility().utilityStorageRead(contractAddress, startStorageSlot, blockNumber, numberOfElements);
252
+ const values = await this.handlerAsUtility().storageRead(blockHash, contractAddress, startStorageSlot, numberOfElements);
194
253
  return toForeignCallResult([
195
254
  toArray(values)
196
255
  ]);
197
256
  }
198
- async utilityGetPublicDataWitness(foreignBlockNumber, foreignLeafSlot) {
199
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
257
+ // eslint-disable-next-line camelcase
258
+ async aztec_utl_getPublicDataWitness(foreignBlockHash, foreignLeafSlot) {
259
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
200
260
  const leafSlot = fromSingle(foreignLeafSlot);
201
- const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockNumber, leafSlot);
261
+ const witness = await this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot);
202
262
  if (!witness) {
203
- throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockNumber}.`);
263
+ throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockHash.toString()}.`);
204
264
  }
205
265
  return toForeignCallResult(witness.toNoirRepresentation());
206
266
  }
207
- async utilityGetNotes(foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedRetrievedNoteLength) {
267
+ // eslint-disable-next-line camelcase
268
+ async aztec_utl_getNotes(foreignOwnerIsSome, foreignOwnerValue, foreignStorageSlot, foreignNumSelects, foreignSelectByIndexes, foreignSelectByOffsets, foreignSelectByLengths, foreignSelectValues, foreignSelectComparators, foreignSortByIndexes, foreignSortByOffsets, foreignSortByLengths, foreignSortOrder, foreignLimit, foreignOffset, foreignStatus, foreignMaxNotes, foreignPackedHintedNoteLength) {
269
+ // Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
270
+ const owner = fromSingle(foreignOwnerIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignOwnerValue)) : undefined;
208
271
  const storageSlot = fromSingle(foreignStorageSlot);
209
272
  const numSelects = fromSingle(foreignNumSelects).toNumber();
210
273
  const selectByIndexes = fromArray(foreignSelectByIndexes).map((fr)=>fr.toNumber());
@@ -220,46 +283,69 @@ export class RPCTranslator {
220
283
  const offset = fromSingle(foreignOffset).toNumber();
221
284
  const status = fromSingle(foreignStatus).toNumber();
222
285
  const maxNotes = fromSingle(foreignMaxNotes).toNumber();
223
- const packedRetrievedNoteLength = fromSingle(foreignPackedRetrievedNoteLength).toNumber();
224
- const noteDatas = await this.handlerAsUtility().utilityGetNotes(storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status);
225
- const returnDataAsArrayOfArrays = noteDatas.map(packAsRetrievedNote);
286
+ const packedHintedNoteLength = fromSingle(foreignPackedHintedNoteLength).toNumber();
287
+ const noteDatas = await this.handlerAsUtility().getNotes(owner, storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status);
288
+ const returnDataAsArrayOfArrays = noteDatas.map((noteData)=>packAsHintedNote({
289
+ contractAddress: noteData.contractAddress,
290
+ owner: noteData.owner,
291
+ randomness: noteData.randomness,
292
+ storageSlot: noteData.storageSlot,
293
+ noteNonce: noteData.noteNonce,
294
+ isPending: noteData.isPending,
295
+ note: noteData.note
296
+ }));
226
297
  // Now we convert each sub-array to an array of ForeignCallSingles
227
298
  const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map((subArray)=>subArray.map(toSingle));
228
299
  // At last we convert the array of arrays to a bounded vec of arrays
229
- return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedRetrievedNoteLength));
300
+ return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength));
230
301
  }
231
- privateNotifyCreatedNote(foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
302
+ // eslint-disable-next-line camelcase
303
+ aztec_prv_notifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
304
+ const owner = addressFromSingle(foreignOwner);
232
305
  const storageSlot = fromSingle(foreignStorageSlot);
233
306
  const randomness = fromSingle(foreignRandomness);
234
307
  const noteTypeId = NoteSelector.fromField(fromSingle(foreignNoteTypeId));
235
308
  const note = fromArray(foreignNote);
236
309
  const noteHash = fromSingle(foreignNoteHash);
237
310
  const counter = fromSingle(foreignCounter).toNumber();
238
- this.handlerAsPrivate().privateNotifyCreatedNote(storageSlot, randomness, noteTypeId, note, noteHash, counter);
311
+ this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
239
312
  return toForeignCallResult([]);
240
313
  }
241
- async privateNotifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
314
+ // eslint-disable-next-line camelcase
315
+ async aztec_prv_notifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
242
316
  const innerNullifier = fromSingle(foreignInnerNullifier);
243
317
  const noteHash = fromSingle(foreignNoteHash);
244
318
  const counter = fromSingle(foreignCounter).toNumber();
245
- await this.handlerAsPrivate().privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
319
+ await this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter);
246
320
  return toForeignCallResult([]);
247
321
  }
248
- async privateNotifyCreatedNullifier(foreignInnerNullifier) {
322
+ // eslint-disable-next-line camelcase
323
+ async aztec_prv_notifyCreatedNullifier(foreignInnerNullifier) {
249
324
  const innerNullifier = fromSingle(foreignInnerNullifier);
250
- await this.handlerAsPrivate().privateNotifyCreatedNullifier(innerNullifier);
325
+ await this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier);
251
326
  return toForeignCallResult([]);
252
327
  }
253
- async utilityCheckNullifierExists(foreignInnerNullifier) {
328
+ // eslint-disable-next-line camelcase
329
+ async aztec_prv_isNullifierPending(foreignInnerNullifier, foreignContractAddress) {
330
+ const innerNullifier = fromSingle(foreignInnerNullifier);
331
+ const contractAddress = addressFromSingle(foreignContractAddress);
332
+ const isPending = await this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress);
333
+ return toForeignCallResult([
334
+ toSingle(new Fr(isPending))
335
+ ]);
336
+ }
337
+ // eslint-disable-next-line camelcase
338
+ async aztec_utl_checkNullifierExists(foreignInnerNullifier) {
254
339
  const innerNullifier = fromSingle(foreignInnerNullifier);
255
- const exists = await this.handlerAsUtility().utilityCheckNullifierExists(innerNullifier);
340
+ const exists = await this.handlerAsUtility().checkNullifierExists(innerNullifier);
256
341
  return toForeignCallResult([
257
342
  toSingle(new Fr(exists))
258
343
  ]);
259
344
  }
260
- async utilityGetContractInstance(foreignAddress) {
345
+ // eslint-disable-next-line camelcase
346
+ async aztec_utl_getContractInstance(foreignAddress) {
261
347
  const address = addressFromSingle(foreignAddress);
262
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
348
+ const instance = await this.handlerAsUtility().getContractInstance(address);
263
349
  return toForeignCallResult([
264
350
  instance.salt,
265
351
  instance.deployer.toField(),
@@ -268,36 +354,53 @@ export class RPCTranslator {
268
354
  ...instance.publicKeys.toFields()
269
355
  ].map(toSingle));
270
356
  }
271
- async utilityGetPublicKeysAndPartialAddress(foreignAddress) {
357
+ // eslint-disable-next-line camelcase
358
+ async aztec_utl_tryGetPublicKeysAndPartialAddress(foreignAddress) {
272
359
  const address = addressFromSingle(foreignAddress);
273
- const { publicKeys, partialAddress } = await this.handlerAsUtility().utilityGetPublicKeysAndPartialAddress(address);
274
- return toForeignCallResult([
275
- toArray([
276
- ...publicKeys.toFields(),
277
- partialAddress
278
- ])
279
- ]);
360
+ const result = await this.handlerAsUtility().tryGetPublicKeysAndPartialAddress(address);
361
+ // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
362
+ // with two fields: `some` (a boolean) and `value` (a field array in this case).
363
+ if (result === undefined) {
364
+ // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
365
+ return toForeignCallResult([
366
+ toSingle(new Fr(0)),
367
+ toArray(Array(13).fill(new Fr(0)))
368
+ ]);
369
+ } else {
370
+ // Data was found so we set `some` to 1 and return it along with `value`.
371
+ return toForeignCallResult([
372
+ toSingle(new Fr(1)),
373
+ toArray([
374
+ ...result.publicKeys.toFields(),
375
+ result.partialAddress
376
+ ])
377
+ ]);
378
+ }
280
379
  }
281
- async utilityGetKeyValidationRequest(foreignPkMHash) {
380
+ // eslint-disable-next-line camelcase
381
+ async aztec_utl_getKeyValidationRequest(foreignPkMHash) {
282
382
  const pkMHash = fromSingle(foreignPkMHash);
283
- const keyValidationRequest = await this.handlerAsUtility().utilityGetKeyValidationRequest(pkMHash);
383
+ const keyValidationRequest = await this.handlerAsUtility().getKeyValidationRequest(pkMHash);
284
384
  return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
285
385
  }
286
- privateCallPrivateFunction(_foreignTargetContractAddress, _foreignFunctionSelector, _foreignArgsHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
386
+ // eslint-disable-next-line camelcase
387
+ aztec_prv_callPrivateFunction(_foreignTargetContractAddress, _foreignFunctionSelector, _foreignArgsHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
287
388
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::private_context`, use `private_call` instead');
288
389
  }
289
- async utilityGetNullifierMembershipWitness(foreignBlockNumber, foreignNullifier) {
290
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
390
+ // eslint-disable-next-line camelcase
391
+ async aztec_utl_getNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
392
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
291
393
  const nullifier = fromSingle(foreignNullifier);
292
- const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockNumber, nullifier);
394
+ const witness = await this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier);
293
395
  if (!witness) {
294
- throw new Error(`Nullifier membership witness not found at block ${blockNumber}.`);
396
+ throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
295
397
  }
296
398
  return toForeignCallResult(witness.toNoirRepresentation());
297
399
  }
298
- async utilityGetAuthWitness(foreignMessageHash) {
400
+ // eslint-disable-next-line camelcase
401
+ async aztec_utl_getAuthWitness(foreignMessageHash) {
299
402
  const messageHash = fromSingle(foreignMessageHash);
300
- const authWitness = await this.handlerAsUtility().utilityGetAuthWitness(messageHash);
403
+ const authWitness = await this.handlerAsUtility().getAuthWitness(messageHash);
301
404
  if (!authWitness) {
302
405
  throw new Error(`Auth witness not found for message hash ${messageHash}.`);
303
406
  }
@@ -305,87 +408,112 @@ export class RPCTranslator {
305
408
  toArray(authWitness)
306
409
  ]);
307
410
  }
308
- privateNotifyEnqueuedPublicFunctionCall(_foreignTargetContractAddress, _foreignCalldataHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
411
+ // eslint-disable-next-line camelcase
412
+ aztec_prv_validatePublicCalldata(_foreignCalldataHash) {
309
413
  throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
310
414
  }
311
- privateNotifySetPublicTeardownFunctionCall(_foreignTargetContractAddress, _foreignCalldataHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
415
+ // eslint-disable-next-line camelcase
416
+ aztec_prv_notifyRevertiblePhaseStart(_foreignMinRevertibleSideEffectCounter) {
312
417
  throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
313
418
  }
314
- privateNotifySetMinRevertibleSideEffectCounter(_foreignMinRevertibleSideEffectCounter) {
315
- throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
316
- }
317
- async privateIsSideEffectCounterRevertible(foreignSideEffectCounter) {
419
+ // eslint-disable-next-line camelcase
420
+ async aztec_prv_inRevertiblePhase(foreignSideEffectCounter) {
318
421
  const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
319
- const isRevertible = await this.handlerAsPrivate().privateIsSideEffectCounterRevertible(sideEffectCounter);
422
+ const isRevertible = await this.handlerAsPrivate().inRevertiblePhase(sideEffectCounter);
320
423
  return toForeignCallResult([
321
424
  toSingle(new Fr(isRevertible))
322
425
  ]);
323
426
  }
324
- async utilityGetUtilityContext() {
325
- const context = await this.handlerAsUtility().utilityGetUtilityContext();
427
+ // eslint-disable-next-line camelcase
428
+ aztec_utl_getUtilityContext() {
429
+ const context = this.handlerAsUtility().getUtilityContext();
326
430
  return toForeignCallResult(context.toNoirRepresentation());
327
431
  }
328
- async utilityGetBlockHeader(foreignBlockNumber) {
329
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
330
- const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
432
+ // eslint-disable-next-line camelcase
433
+ async aztec_utl_getBlockHeader(foreignBlockNumber) {
434
+ const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
435
+ const header = await this.handlerAsUtility().getBlockHeader(blockNumber);
331
436
  if (!header) {
332
437
  throw new Error(`Block header not found for block ${blockNumber}.`);
333
438
  }
334
439
  return toForeignCallResult(header.toFields().map(toSingle));
335
440
  }
336
- async utilityGetMembershipWitness(foreignBlockNumber, foreignTreeId, foreignLeafValue) {
337
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
338
- const treeId = fromSingle(foreignTreeId).toNumber();
339
- const leafValue = fromSingle(foreignLeafValue);
340
- const witness = await this.handlerAsUtility().utilityGetMembershipWitness(blockNumber, treeId, leafValue);
441
+ // eslint-disable-next-line camelcase
442
+ async aztec_utl_getNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
443
+ const blockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
444
+ const noteHash = fromSingle(foreignNoteHash);
445
+ const witness = await this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash);
341
446
  if (!witness) {
342
- throw new Error(`Membership witness in tree ${MerkleTreeId[treeId]} not found for value ${leafValue} at block ${blockNumber}.`);
447
+ throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
343
448
  }
344
- return toForeignCallResult([
345
- toSingle(witness[0]),
346
- toArray(witness.slice(1))
347
- ]);
449
+ return toForeignCallResult(witness.toNoirRepresentation());
348
450
  }
349
- async utilityGetLowNullifierMembershipWitness(foreignBlockNumber, foreignNullifier) {
350
- const blockNumber = fromSingle(foreignBlockNumber).toNumber();
451
+ // eslint-disable-next-line camelcase
452
+ async aztec_utl_getBlockHashMembershipWitness(foreignAnchorBlockHash, foreignBlockHash) {
453
+ const anchorBlockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
454
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
455
+ const witness = await this.handlerAsUtility().getBlockHashMembershipWitness(anchorBlockHash, blockHash);
456
+ if (!witness) {
457
+ throw new Error(`Block hash ${blockHash.toString()} not found in the archive tree at anchor block ${anchorBlockHash.toString()}.`);
458
+ }
459
+ return toForeignCallResult(witness.toNoirRepresentation());
460
+ }
461
+ // eslint-disable-next-line camelcase
462
+ async aztec_utl_getLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
463
+ const blockHash = new BlockHash(fromSingle(foreignBlockHash));
351
464
  const nullifier = fromSingle(foreignNullifier);
352
- const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockNumber, nullifier);
465
+ const witness = await this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier);
353
466
  if (!witness) {
354
- throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockNumber}.`);
467
+ throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockHash}.`);
355
468
  }
356
469
  return toForeignCallResult(witness.toNoirRepresentation());
357
470
  }
358
- async utilityFetchTaggedLogs(foreignPendingTaggedLogArrayBaseSlot) {
471
+ // eslint-disable-next-line camelcase
472
+ async aztec_utl_fetchTaggedLogs(foreignPendingTaggedLogArrayBaseSlot) {
359
473
  const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
360
- await this.handlerAsUtility().utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
474
+ await this.handlerAsUtility().fetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
361
475
  return toForeignCallResult([]);
362
476
  }
363
- async utilityValidateEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot) {
477
+ // eslint-disable-next-line camelcase
478
+ async aztec_utl_validateAndStoreEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignMaxNotePackedLen, foreignMaxEventSerializedLen) {
364
479
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
365
480
  const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
366
481
  const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
367
- await this.handlerAsUtility().utilityValidateEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot);
482
+ const maxNotePackedLen = fromSingle(foreignMaxNotePackedLen).toNumber();
483
+ const maxEventSerializedLen = fromSingle(foreignMaxEventSerializedLen).toNumber();
484
+ await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, maxNotePackedLen, maxEventSerializedLen);
368
485
  return toForeignCallResult([]);
369
486
  }
370
- async utilityBulkRetrieveLogs(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot) {
487
+ // eslint-disable-next-line camelcase
488
+ async aztec_utl_bulkRetrieveLogs(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot) {
371
489
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
372
490
  const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
373
491
  const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
374
- await this.handlerAsUtility().utilityBulkRetrieveLogs(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot);
492
+ await this.handlerAsUtility().bulkRetrieveLogs(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot);
375
493
  return toForeignCallResult([]);
376
494
  }
377
- async utilityStoreCapsule(foreignContractAddress, foreignSlot, foreignCapsule) {
495
+ // eslint-disable-next-line camelcase
496
+ async aztec_utl_utilityResolveMessageContexts(foreignContractAddress, foreignMessageContextRequestsArrayBaseSlot, foreignMessageContextResponsesArrayBaseSlot) {
497
+ const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
498
+ const messageContextRequestsArrayBaseSlot = fromSingle(foreignMessageContextRequestsArrayBaseSlot);
499
+ const messageContextResponsesArrayBaseSlot = fromSingle(foreignMessageContextResponsesArrayBaseSlot);
500
+ await this.handlerAsUtility().utilityResolveMessageContexts(contractAddress, messageContextRequestsArrayBaseSlot, messageContextResponsesArrayBaseSlot);
501
+ return toForeignCallResult([]);
502
+ }
503
+ // eslint-disable-next-line camelcase
504
+ async aztec_utl_storeCapsule(foreignContractAddress, foreignSlot, foreignCapsule) {
378
505
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
379
506
  const slot = fromSingle(foreignSlot);
380
507
  const capsule = fromArray(foreignCapsule);
381
- await this.handlerAsUtility().utilityStoreCapsule(contractAddress, slot, capsule);
508
+ await this.handlerAsUtility().storeCapsule(contractAddress, slot, capsule);
382
509
  return toForeignCallResult([]);
383
510
  }
384
- async utilityLoadCapsule(foreignContractAddress, foreignSlot, foreignTSize) {
511
+ // eslint-disable-next-line camelcase
512
+ async aztec_utl_loadCapsule(foreignContractAddress, foreignSlot, foreignTSize) {
385
513
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
386
514
  const slot = fromSingle(foreignSlot);
387
515
  const tSize = fromSingle(foreignTSize).toNumber();
388
- const values = await this.handlerAsUtility().utilityLoadCapsule(contractAddress, slot);
516
+ const values = await this.handlerAsUtility().loadCapsule(contractAddress, slot);
389
517
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
390
518
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
391
519
  if (values === null) {
@@ -402,197 +530,256 @@ export class RPCTranslator {
402
530
  ]);
403
531
  }
404
532
  }
405
- async utilityDeleteCapsule(foreignContractAddress, foreignSlot) {
533
+ // eslint-disable-next-line camelcase
534
+ async aztec_utl_deleteCapsule(foreignContractAddress, foreignSlot) {
406
535
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
407
536
  const slot = fromSingle(foreignSlot);
408
- await this.handlerAsUtility().utilityDeleteCapsule(contractAddress, slot);
537
+ await this.handlerAsUtility().deleteCapsule(contractAddress, slot);
409
538
  return toForeignCallResult([]);
410
539
  }
411
- async utilityCopyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries) {
540
+ // eslint-disable-next-line camelcase
541
+ async aztec_utl_copyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries) {
412
542
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
413
543
  const srcSlot = fromSingle(foreignSrcSlot);
414
544
  const dstSlot = fromSingle(foreignDstSlot);
415
545
  const numEntries = fromSingle(foreignNumEntries).toNumber();
416
- await this.handlerAsUtility().utilityCopyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
546
+ await this.handlerAsUtility().copyCapsule(contractAddress, srcSlot, dstSlot, numEntries);
417
547
  return toForeignCallResult([]);
418
548
  }
419
549
  // TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
420
550
  // 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
421
551
  // to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
422
552
  // existence of a txe_oracle method?
423
- async utilityAes128Decrypt(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
553
+ // eslint-disable-next-line camelcase
554
+ async aztec_utl_tryAes128Decrypt(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
424
555
  const ciphertext = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
425
556
  const iv = fromUintArray(foreignIv, 8);
426
557
  const symKey = fromUintArray(foreignSymKey, 8);
427
- const plaintextBuffer = await this.handlerAsUtility().utilityAes128Decrypt(ciphertext, iv, symKey);
428
- return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length));
558
+ // Noir Option<BoundedVec> is encoded as [is_some: Field, storage: Field[], length: Field].
559
+ try {
560
+ const plaintextBuffer = await this.handlerAsUtility().aes128Decrypt(ciphertext, iv, symKey);
561
+ const [storage, length] = arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length);
562
+ return toForeignCallResult([
563
+ toSingle(new Fr(1)),
564
+ storage,
565
+ length
566
+ ]);
567
+ } catch {
568
+ const zeroStorage = toArray(Array(foreignCiphertextBVecStorage.length).fill(new Fr(0)));
569
+ return toForeignCallResult([
570
+ toSingle(new Fr(0)),
571
+ zeroStorage,
572
+ toSingle(new Fr(0))
573
+ ]);
574
+ }
429
575
  }
430
- async utilityGetSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2) {
576
+ // eslint-disable-next-line camelcase
577
+ async aztec_utl_getSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2) {
431
578
  const address = AztecAddress.fromField(fromSingle(foreignAddress));
432
579
  const ephPK = Point.fromFields([
433
580
  fromSingle(foreignEphPKField0),
434
581
  fromSingle(foreignEphPKField1),
435
582
  fromSingle(foreignEphPKField2)
436
583
  ]);
437
- const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
584
+ const secret = await this.handlerAsUtility().getSharedSecret(address, ephPK);
438
585
  return toForeignCallResult(secret.toFields().map(toSingle));
439
586
  }
440
- emitOffchainEffect(_foreignData) {
587
+ // eslint-disable-next-line camelcase
588
+ aztec_utl_invalidateContractSyncCache(foreignContractAddress, foreignScopes, foreignScopeCount) {
589
+ const contractAddress = addressFromSingle(foreignContractAddress);
590
+ const count = fromSingle(foreignScopeCount).toNumber();
591
+ const scopes = fromArray(foreignScopes).slice(0, count).map((f)=>new AztecAddress(f));
592
+ this.handlerAsUtility().invalidateContractSyncCache(contractAddress, scopes);
593
+ return Promise.resolve(toForeignCallResult([]));
594
+ }
595
+ // eslint-disable-next-line camelcase
596
+ aztec_utl_emitOffchainEffect(_foreignData) {
441
597
  throw new Error('Offchain effects are not yet supported in the TestEnvironment');
442
598
  }
443
599
  // AVM opcodes
444
- avmOpcodeEmitUnencryptedLog(_foreignMessage) {
600
+ // eslint-disable-next-line camelcase
601
+ aztec_avm_emitPublicLog(_foreignMessage) {
445
602
  // TODO(#8811): Implement
446
603
  return toForeignCallResult([]);
447
604
  }
448
- async avmOpcodeStorageRead(foreignSlot) {
605
+ // eslint-disable-next-line camelcase
606
+ async aztec_avm_storageRead(foreignSlot, foreignContractAddress) {
449
607
  const slot = fromSingle(foreignSlot);
450
- const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot)).value;
608
+ const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
609
+ const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
451
610
  return toForeignCallResult([
452
611
  toSingle(new Fr(value))
453
612
  ]);
454
613
  }
455
- async avmOpcodeStorageWrite(foreignSlot, foreignValue) {
614
+ // eslint-disable-next-line camelcase
615
+ async aztec_avm_storageWrite(foreignSlot, foreignValue) {
456
616
  const slot = fromSingle(foreignSlot);
457
617
  const value = fromSingle(foreignValue);
458
- await this.handlerAsAvm().avmOpcodeStorageWrite(slot, value);
618
+ await this.handlerAsAvm().storageWrite(slot, value);
459
619
  return toForeignCallResult([]);
460
620
  }
461
- async avmOpcodeGetContractInstanceDeployer(foreignAddress) {
621
+ // eslint-disable-next-line camelcase
622
+ async aztec_avm_getContractInstanceDeployer(foreignAddress) {
462
623
  const address = addressFromSingle(foreignAddress);
463
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
624
+ const instance = await this.handlerAsUtility().getContractInstance(address);
464
625
  return toForeignCallResult([
465
626
  toSingle(instance.deployer),
466
627
  // AVM requires an extra boolean indicating the instance was found
467
628
  toSingle(new Fr(1))
468
629
  ]);
469
630
  }
470
- async avmOpcodeGetContractInstanceClassId(foreignAddress) {
631
+ // eslint-disable-next-line camelcase
632
+ async aztec_avm_getContractInstanceClassId(foreignAddress) {
471
633
  const address = addressFromSingle(foreignAddress);
472
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
634
+ const instance = await this.handlerAsUtility().getContractInstance(address);
473
635
  return toForeignCallResult([
474
636
  toSingle(instance.currentContractClassId),
475
637
  // AVM requires an extra boolean indicating the instance was found
476
638
  toSingle(new Fr(1))
477
639
  ]);
478
640
  }
479
- async avmOpcodeGetContractInstanceInitializationHash(foreignAddress) {
641
+ // eslint-disable-next-line camelcase
642
+ async aztec_avm_getContractInstanceInitializationHash(foreignAddress) {
480
643
  const address = addressFromSingle(foreignAddress);
481
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
644
+ const instance = await this.handlerAsUtility().getContractInstance(address);
482
645
  return toForeignCallResult([
483
646
  toSingle(instance.initializationHash),
484
647
  // AVM requires an extra boolean indicating the instance was found
485
648
  toSingle(new Fr(1))
486
649
  ]);
487
650
  }
488
- async avmOpcodeSender() {
489
- const sender = await this.handlerAsAvm().avmOpcodeSender();
651
+ // eslint-disable-next-line camelcase
652
+ async aztec_avm_sender() {
653
+ const sender = await this.handlerAsAvm().sender();
490
654
  return toForeignCallResult([
491
655
  toSingle(sender)
492
656
  ]);
493
657
  }
494
- async avmOpcodeEmitNullifier(foreignNullifier) {
658
+ // eslint-disable-next-line camelcase
659
+ async aztec_avm_emitNullifier(foreignNullifier) {
495
660
  const nullifier = fromSingle(foreignNullifier);
496
- await this.handlerAsAvm().avmOpcodeEmitNullifier(nullifier);
661
+ await this.handlerAsAvm().emitNullifier(nullifier);
497
662
  return toForeignCallResult([]);
498
663
  }
499
- async avmOpcodeEmitNoteHash(foreignNoteHash) {
664
+ // eslint-disable-next-line camelcase
665
+ async aztec_avm_emitNoteHash(foreignNoteHash) {
500
666
  const noteHash = fromSingle(foreignNoteHash);
501
- await this.handlerAsAvm().avmOpcodeEmitNoteHash(noteHash);
667
+ await this.handlerAsAvm().emitNoteHash(noteHash);
502
668
  return toForeignCallResult([]);
503
669
  }
504
- async avmOpcodeNullifierExists(foreignInnerNullifier, foreignTargetAddress) {
505
- const innerNullifier = fromSingle(foreignInnerNullifier);
506
- const targetAddress = AztecAddress.fromField(fromSingle(foreignTargetAddress));
507
- const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(innerNullifier, targetAddress);
670
+ // eslint-disable-next-line camelcase
671
+ async aztec_avm_nullifierExists(foreignSiloedNullifier) {
672
+ const siloedNullifier = fromSingle(foreignSiloedNullifier);
673
+ const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
508
674
  return toForeignCallResult([
509
675
  toSingle(new Fr(exists))
510
676
  ]);
511
677
  }
512
- async avmOpcodeAddress() {
513
- const contractAddress = await this.handlerAsAvm().avmOpcodeAddress();
678
+ // eslint-disable-next-line camelcase
679
+ async aztec_avm_address() {
680
+ const contractAddress = await this.handlerAsAvm().address();
514
681
  return toForeignCallResult([
515
682
  toSingle(contractAddress.toField())
516
683
  ]);
517
684
  }
518
- async avmOpcodeBlockNumber() {
519
- const blockNumber = await this.handlerAsAvm().avmOpcodeBlockNumber();
685
+ // eslint-disable-next-line camelcase
686
+ async aztec_avm_blockNumber() {
687
+ const blockNumber = await this.handlerAsAvm().blockNumber();
520
688
  return toForeignCallResult([
521
689
  toSingle(new Fr(blockNumber))
522
690
  ]);
523
691
  }
524
- async avmOpcodeTimestamp() {
525
- const timestamp = await this.handlerAsAvm().avmOpcodeTimestamp();
692
+ // eslint-disable-next-line camelcase
693
+ async aztec_avm_timestamp() {
694
+ const timestamp = await this.handlerAsAvm().timestamp();
526
695
  return toForeignCallResult([
527
696
  toSingle(new Fr(timestamp))
528
697
  ]);
529
698
  }
530
- async avmOpcodeIsStaticCall() {
531
- const isStaticCall = await this.handlerAsAvm().avmOpcodeIsStaticCall();
699
+ // eslint-disable-next-line camelcase
700
+ async aztec_avm_isStaticCall() {
701
+ const isStaticCall = await this.handlerAsAvm().isStaticCall();
532
702
  return toForeignCallResult([
533
703
  toSingle(new Fr(isStaticCall ? 1 : 0))
534
704
  ]);
535
705
  }
536
- async avmOpcodeChainId() {
537
- const chainId = await this.handlerAsAvm().avmOpcodeChainId();
706
+ // eslint-disable-next-line camelcase
707
+ async aztec_avm_chainId() {
708
+ const chainId = await this.handlerAsAvm().chainId();
538
709
  return toForeignCallResult([
539
710
  toSingle(chainId)
540
711
  ]);
541
712
  }
542
- async avmOpcodeVersion() {
543
- const version = await this.handlerAsAvm().avmOpcodeVersion();
713
+ // eslint-disable-next-line camelcase
714
+ async aztec_avm_version() {
715
+ const version = await this.handlerAsAvm().version();
544
716
  return toForeignCallResult([
545
717
  toSingle(version)
546
718
  ]);
547
719
  }
548
- avmOpcodeReturndataSize() {
720
+ // eslint-disable-next-line camelcase
721
+ aztec_avm_returndataSize() {
549
722
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
550
723
  }
551
- avmOpcodeReturndataCopy(_foreignRdOffset, _foreignCopySize) {
724
+ // eslint-disable-next-line camelcase
725
+ aztec_avm_returndataCopy(_foreignRdOffset, _foreignCopySize) {
552
726
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
553
727
  }
554
- avmOpcodeCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
728
+ // eslint-disable-next-line camelcase
729
+ aztec_avm_call(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
555
730
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
556
731
  }
557
- avmOpcodeStaticCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
732
+ // eslint-disable-next-line camelcase
733
+ aztec_avm_staticCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
558
734
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
559
735
  }
560
- avmOpcodeSuccessCopy() {
736
+ // eslint-disable-next-line camelcase
737
+ aztec_avm_successCopy() {
561
738
  throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
562
739
  }
563
- async txePrivateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
740
+ // eslint-disable-next-line camelcase
741
+ async aztec_txe_privateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
564
742
  const from = addressFromSingle(foreignFrom);
565
743
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
566
744
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
567
745
  const args = fromArray(foreignArgs);
568
746
  const argsHash = fromSingle(foreignArgsHash);
569
747
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
570
- const returnValues = await this.handlerAsTxe().txePrivateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall);
748
+ const returnValues = await this.handlerAsTxe().privateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall, this.stateHandler.getCurrentJob());
749
+ // TODO(F-335): Avoid doing the following call here.
750
+ await this.stateHandler.cycleJob();
571
751
  return toForeignCallResult([
572
752
  toArray(returnValues)
573
753
  ]);
574
754
  }
575
- async txeSimulateUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs) {
755
+ // eslint-disable-next-line camelcase
756
+ async aztec_txe_executeUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs) {
576
757
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
577
758
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
578
759
  const args = fromArray(foreignArgs);
579
- const returnValues = await this.handlerAsTxe().txeSimulateUtilityFunction(targetContractAddress, functionSelector, args);
760
+ const returnValues = await this.handlerAsTxe().executeUtilityFunction(targetContractAddress, functionSelector, args, this.stateHandler.getCurrentJob());
761
+ // TODO(F-335): Avoid doing the following call here.
762
+ await this.stateHandler.cycleJob();
580
763
  return toForeignCallResult([
581
764
  toArray(returnValues)
582
765
  ]);
583
766
  }
584
- async txePublicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
767
+ // eslint-disable-next-line camelcase
768
+ async aztec_txe_publicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
585
769
  const from = addressFromSingle(foreignFrom);
586
770
  const address = addressFromSingle(foreignAddress);
587
771
  const calldata = fromArray(foreignCalldata);
588
772
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
589
- const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
773
+ const returnValues = await this.handlerAsTxe().publicCallNewFlow(from, address, calldata, isStaticCall);
774
+ // TODO(F-335): Avoid doing the following call here.
775
+ await this.stateHandler.cycleJob();
590
776
  return toForeignCallResult([
591
777
  toArray(returnValues)
592
778
  ]);
593
779
  }
594
- async privateGetSenderForTags() {
595
- const sender = await this.handlerAsPrivate().privateGetSenderForTags();
780
+ // eslint-disable-next-line camelcase
781
+ async aztec_prv_getSenderForTags() {
782
+ const sender = await this.handlerAsPrivate().getSenderForTags();
596
783
  // Return a Noir Option struct with `some` and `value` fields
597
784
  if (sender === undefined) {
598
785
  // No sender found, return Option with some=0 and value=0
@@ -608,15 +795,17 @@ export class RPCTranslator {
608
795
  ]);
609
796
  }
610
797
  }
611
- async privateSetSenderForTags(foreignSenderForTags) {
798
+ // eslint-disable-next-line camelcase
799
+ async aztec_prv_setSenderForTags(foreignSenderForTags) {
612
800
  const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
613
- await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
801
+ await this.handlerAsPrivate().setSenderForTags(senderForTags);
614
802
  return toForeignCallResult([]);
615
803
  }
616
- async privateGetNextAppTagAsSender(foreignSender, foreignRecipient) {
804
+ // eslint-disable-next-line camelcase
805
+ async aztec_prv_getNextAppTagAsSender(foreignSender, foreignRecipient) {
617
806
  const sender = AztecAddress.fromField(fromSingle(foreignSender));
618
807
  const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
619
- const nextAppTag = await this.handlerAsPrivate().privateGetNextAppTagAsSender(sender, recipient);
808
+ const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
620
809
  return toForeignCallResult([
621
810
  toSingle(nextAppTag.value)
622
811
  ]);