@aztec/txe 0.0.1-commit.85d7d01 → 0.0.1-commit.8655d4a

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 +39 -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 +36 -20
  41. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  42. package/dest/oracle/txe_oracle_top_level_context.js +125 -66
  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 +567 -243
  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 +13 -7
  58. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  59. package/dest/state_machine/dummy_p2p_client.js +16 -4
  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 +64 -6
  76. package/dest/txe_session.d.ts.map +1 -1
  77. package/dest/txe_session.js +159 -31
  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 +43 -34
  101. package/src/oracle/txe_oracle_public_context.ts +42 -12
  102. package/src/oracle/txe_oracle_top_level_context.ts +146 -77
  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 +646 -326
  106. package/src/state_machine/archiver.ts +33 -18
  107. package/src/state_machine/dummy_p2p_client.ts +31 -11
  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 +253 -33
  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,11 +1,13 @@
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';
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';
9
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 {
@@ -60,119 +62,180 @@ 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);
@@ -182,7 +245,7 @@ export class RPCTranslator {
182
245
  // We cycle job to commit the stores after the contract sync.
183
246
  await this.stateHandler.cycleJob();
184
247
  }
185
- const events = await this.handlerAsTxe().txeGetPrivateEvents(selector, contractAddress, scope);
248
+ const events = await this.handlerAsTxe().getPrivateEvents(selector, contractAddress, scope);
186
249
  if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
187
250
  throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
188
251
  }
@@ -200,50 +263,53 @@ export class RPCTranslator {
200
263
  toSingle(queryLength)
201
264
  ]);
202
265
  }
203
- privateStoreInExecutionCache(foreignValues, foreignHash) {
266
+ // eslint-disable-next-line camelcase
267
+ aztec_prv_setHashPreimage(foreignValues, foreignHash) {
204
268
  const values = fromArray(foreignValues);
205
269
  const hash = fromSingle(foreignHash);
206
- this.handlerAsPrivate().privateStoreInExecutionCache(values, hash);
270
+ this.handlerAsPrivate().setHashPreimage(values, hash);
207
271
  return toForeignCallResult([]);
208
272
  }
209
- async privateLoadFromExecutionCache(foreignHash) {
273
+ // eslint-disable-next-line camelcase
274
+ async aztec_prv_getHashPreimage(foreignHash) {
210
275
  const hash = fromSingle(foreignHash);
211
- const returns = await this.handlerAsPrivate().privateLoadFromExecutionCache(hash);
276
+ const returns = await this.handlerAsPrivate().getHashPreimage(hash);
212
277
  return toForeignCallResult([
213
278
  toArray(returns)
214
279
  ]);
215
280
  }
216
281
  // When the argument is a slice, noir automatically adds a length field to oracle call.
217
282
  // When the argument is an array, we add the field length manually to the signature.
218
- async utilityLog(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
283
+ // eslint-disable-next-line camelcase
284
+ async aztec_utl_log(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
219
285
  const level = fromSingle(foreignLevel).toNumber();
220
286
  const message = fromArray(foreignMessage).map((field)=>String.fromCharCode(field.toNumber())).join('');
221
287
  const fields = fromArray(foreignFields);
222
- await this.handlerAsMisc().utilityLog(level, message, fields);
288
+ await this.handlerAsMisc().log(level, message, fields);
223
289
  return toForeignCallResult([]);
224
290
  }
225
- async utilityStorageRead(foreignBlockHash, foreignContractAddress, foreignStartStorageSlot, foreignNumberOfElements) {
226
- 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);
227
294
  const contractAddress = addressFromSingle(foreignContractAddress);
228
295
  const startStorageSlot = fromSingle(foreignStartStorageSlot);
229
296
  const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
230
- const values = await this.handlerAsUtility().utilityStorageRead(blockHash, contractAddress, startStorageSlot, numberOfElements);
297
+ const values = await this.handlerAsUtility().getFromPublicStorage(blockHash, contractAddress, startStorageSlot, numberOfElements);
231
298
  return toForeignCallResult([
232
299
  toArray(values)
233
300
  ]);
234
301
  }
235
- async utilityGetPublicDataWitness(foreignBlockHash, foreignLeafSlot) {
236
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
302
+ // eslint-disable-next-line camelcase
303
+ async aztec_utl_getPublicDataWitness(foreignBlockHash, foreignLeafSlot) {
304
+ const blockHash = blockHashFromSingle(foreignBlockHash);
237
305
  const leafSlot = fromSingle(foreignLeafSlot);
238
- const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(blockHash, leafSlot);
239
- if (!witness) {
240
- throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockHash.toString()}.`);
241
- }
306
+ const witness = await this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot);
242
307
  return toForeignCallResult(witness.toNoirRepresentation());
243
308
  }
244
- 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) {
245
311
  // Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
246
- 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);
247
313
  const storageSlot = fromSingle(foreignStorageSlot);
248
314
  const numSelects = fromSingle(foreignNumSelects).toNumber();
249
315
  const selectByIndexes = fromArray(foreignSelectByIndexes).map((fr)=>fr.toNumber());
@@ -260,8 +326,8 @@ export class RPCTranslator {
260
326
  const status = fromSingle(foreignStatus).toNumber();
261
327
  const maxNotes = fromSingle(foreignMaxNotes).toNumber();
262
328
  const packedHintedNoteLength = fromSingle(foreignPackedHintedNoteLength).toNumber();
263
- const noteDatas = await this.handlerAsUtility().utilityGetNotes(owner, storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status);
264
- 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({
265
331
  contractAddress: noteData.contractAddress,
266
332
  owner: noteData.owner,
267
333
  randomness: noteData.randomness,
@@ -270,12 +336,11 @@ export class RPCTranslator {
270
336
  isPending: noteData.isPending,
271
337
  note: noteData.note
272
338
  }));
273
- // Now we convert each sub-array to an array of ForeignCallSingles
274
339
  const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map((subArray)=>subArray.map(toSingle));
275
- // At last we convert the array of arrays to a bounded vec of arrays
276
340
  return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength));
277
341
  }
278
- 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) {
279
344
  const owner = addressFromSingle(foreignOwner);
280
345
  const storageSlot = fromSingle(foreignStorageSlot);
281
346
  const randomness = fromSingle(foreignRandomness);
@@ -283,421 +348,680 @@ export class RPCTranslator {
283
348
  const note = fromArray(foreignNote);
284
349
  const noteHash = fromSingle(foreignNoteHash);
285
350
  const counter = fromSingle(foreignCounter).toNumber();
286
- this.handlerAsPrivate().privateNotifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
351
+ this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
287
352
  return toForeignCallResult([]);
288
353
  }
289
- async privateNotifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
354
+ // eslint-disable-next-line camelcase
355
+ async aztec_prv_notifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
290
356
  const innerNullifier = fromSingle(foreignInnerNullifier);
291
357
  const noteHash = fromSingle(foreignNoteHash);
292
358
  const counter = fromSingle(foreignCounter).toNumber();
293
- await this.handlerAsPrivate().privateNotifyNullifiedNote(innerNullifier, noteHash, counter);
359
+ await this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter);
294
360
  return toForeignCallResult([]);
295
361
  }
296
- async privateNotifyCreatedNullifier(foreignInnerNullifier) {
362
+ // eslint-disable-next-line camelcase
363
+ async aztec_prv_notifyCreatedNullifier(foreignInnerNullifier) {
297
364
  const innerNullifier = fromSingle(foreignInnerNullifier);
298
- await this.handlerAsPrivate().privateNotifyCreatedNullifier(innerNullifier);
365
+ await this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier);
299
366
  return toForeignCallResult([]);
300
367
  }
301
- async privateIsNullifierPending(foreignInnerNullifier, foreignContractAddress) {
368
+ // eslint-disable-next-line camelcase
369
+ async aztec_prv_isNullifierPending(foreignInnerNullifier, foreignContractAddress) {
302
370
  const innerNullifier = fromSingle(foreignInnerNullifier);
303
371
  const contractAddress = addressFromSingle(foreignContractAddress);
304
- const isPending = await this.handlerAsPrivate().privateIsNullifierPending(innerNullifier, contractAddress);
372
+ const isPending = await this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress);
305
373
  return toForeignCallResult([
306
374
  toSingle(new Fr(isPending))
307
375
  ]);
308
376
  }
309
- async utilityCheckNullifierExists(foreignInnerNullifier) {
377
+ // eslint-disable-next-line camelcase
378
+ async aztec_utl_doesNullifierExist(foreignInnerNullifier) {
310
379
  const innerNullifier = fromSingle(foreignInnerNullifier);
311
- const exists = await this.handlerAsUtility().utilityCheckNullifierExists(innerNullifier);
380
+ const exists = await this.handlerAsUtility().doesNullifierExist(innerNullifier);
312
381
  return toForeignCallResult([
313
382
  toSingle(new Fr(exists))
314
383
  ]);
315
384
  }
316
- async utilityGetContractInstance(foreignAddress) {
385
+ // eslint-disable-next-line camelcase
386
+ async aztec_utl_getContractInstance(foreignAddress) {
317
387
  const address = addressFromSingle(foreignAddress);
318
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
388
+ const instance = await this.handlerAsUtility().getContractInstance(address);
319
389
  return toForeignCallResult([
320
390
  instance.salt,
321
391
  instance.deployer.toField(),
322
392
  instance.currentContractClassId,
323
393
  instance.initializationHash,
394
+ instance.immutablesHash,
324
395
  ...instance.publicKeys.toFields()
325
396
  ].map(toSingle));
326
397
  }
327
- async utilityTryGetPublicKeysAndPartialAddress(foreignAddress) {
398
+ // eslint-disable-next-line camelcase
399
+ async aztec_utl_getPublicKeysAndPartialAddress(foreignAddress) {
328
400
  const address = addressFromSingle(foreignAddress);
329
- const result = await this.handlerAsUtility().utilityTryGetPublicKeysAndPartialAddress(address);
401
+ const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(address);
330
402
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
331
403
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
332
- if (result === undefined) {
404
+ if (!result.isSome()) {
333
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.
334
407
  return toForeignCallResult([
335
408
  toSingle(new Fr(0)),
336
- toArray(Array(13).fill(new Fr(0)))
409
+ toArray(Array(8).fill(new Fr(0)))
337
410
  ]);
338
411
  } else {
339
- // 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;
340
417
  return toForeignCallResult([
341
418
  toSingle(new Fr(1)),
342
419
  toArray([
343
- ...result.publicKeys.toFields(),
344
- 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
345
428
  ])
346
429
  ]);
347
430
  }
348
431
  }
349
- async utilityGetKeyValidationRequest(foreignPkMHash) {
432
+ // eslint-disable-next-line camelcase
433
+ async aztec_utl_getKeyValidationRequest(foreignPkMHash) {
350
434
  const pkMHash = fromSingle(foreignPkMHash);
351
- const keyValidationRequest = await this.handlerAsUtility().utilityGetKeyValidationRequest(pkMHash);
435
+ const keyValidationRequest = await this.handlerAsUtility().getKeyValidationRequest(pkMHash);
352
436
  return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
353
437
  }
354
- privateCallPrivateFunction(_foreignTargetContractAddress, _foreignFunctionSelector, _foreignArgsHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
355
- 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
+ ]);
356
452
  }
357
- async utilityGetNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
358
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
453
+ // eslint-disable-next-line camelcase
454
+ async aztec_utl_getNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
455
+ const blockHash = blockHashFromSingle(foreignBlockHash);
359
456
  const nullifier = fromSingle(foreignNullifier);
360
- const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(blockHash, nullifier);
361
- if (!witness) {
362
- throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
363
- }
457
+ const witness = await this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier);
364
458
  return toForeignCallResult(witness.toNoirRepresentation());
365
459
  }
366
- async utilityGetAuthWitness(foreignMessageHash) {
460
+ // eslint-disable-next-line camelcase
461
+ async aztec_utl_getAuthWitness(foreignMessageHash) {
367
462
  const messageHash = fromSingle(foreignMessageHash);
368
- const authWitness = await this.handlerAsUtility().utilityGetAuthWitness(messageHash);
369
- if (!authWitness) {
370
- throw new Error(`Auth witness not found for message hash ${messageHash}.`);
371
- }
463
+ const authWitness = await this.handlerAsUtility().getAuthWitness(messageHash);
372
464
  return toForeignCallResult([
373
465
  toArray(authWitness)
374
466
  ]);
375
467
  }
376
- privateNotifyEnqueuedPublicFunctionCall(_foreignTargetContractAddress, _foreignCalldataHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
377
- throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
378
- }
379
- privateNotifySetPublicTeardownFunctionCall(_foreignTargetContractAddress, _foreignCalldataHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
380
- 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([]);
381
473
  }
382
- privateNotifySetMinRevertibleSideEffectCounter(_foreignMinRevertibleSideEffectCounter) {
383
- 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([]);
384
479
  }
385
- async privateIsSideEffectCounterRevertible(foreignSideEffectCounter) {
480
+ // eslint-disable-next-line camelcase
481
+ async aztec_prv_isExecutionInRevertiblePhase(foreignSideEffectCounter) {
386
482
  const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
387
- const isRevertible = await this.handlerAsPrivate().privateIsSideEffectCounterRevertible(sideEffectCounter);
483
+ const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter);
388
484
  return toForeignCallResult([
389
485
  toSingle(new Fr(isRevertible))
390
486
  ]);
391
487
  }
392
- utilityGetUtilityContext() {
393
- const context = this.handlerAsUtility().utilityGetUtilityContext();
488
+ // eslint-disable-next-line camelcase
489
+ aztec_utl_getUtilityContext() {
490
+ const context = this.handlerAsUtility().getUtilityContext();
394
491
  return toForeignCallResult(context.toNoirRepresentation());
395
492
  }
396
- async utilityGetBlockHeader(foreignBlockNumber) {
493
+ // eslint-disable-next-line camelcase
494
+ async aztec_utl_getBlockHeader(foreignBlockNumber) {
397
495
  const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
398
- const header = await this.handlerAsUtility().utilityGetBlockHeader(blockNumber);
399
- if (!header) {
400
- throw new Error(`Block header not found for block ${blockNumber}.`);
401
- }
496
+ const header = await this.handlerAsUtility().getBlockHeader(blockNumber);
402
497
  return toForeignCallResult(header.toFields().map(toSingle));
403
498
  }
404
- async utilityGetNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
405
- const blockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
499
+ // eslint-disable-next-line camelcase
500
+ async aztec_utl_getNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
501
+ const blockHash = blockHashFromSingle(foreignAnchorBlockHash);
406
502
  const noteHash = fromSingle(foreignNoteHash);
407
- const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(blockHash, noteHash);
408
- if (!witness) {
409
- throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
410
- }
503
+ const witness = await this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash);
411
504
  return toForeignCallResult(witness.toNoirRepresentation());
412
505
  }
413
- async utilityGetBlockHashMembershipWitness(foreignAnchorBlockHash, foreignBlockHash) {
414
- const anchorBlockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
415
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
416
- const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(anchorBlockHash, blockHash);
417
- if (!witness) {
418
- throw new Error(`Block hash ${blockHash.toString()} not found in the archive tree at anchor block ${anchorBlockHash.toString()}.`);
419
- }
420
- 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
+ ]);
421
516
  }
422
- async utilityGetLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
423
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
517
+ // eslint-disable-next-line camelcase
518
+ async aztec_utl_getLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
519
+ const blockHash = blockHashFromSingle(foreignBlockHash);
424
520
  const nullifier = fromSingle(foreignNullifier);
425
- const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(blockHash, nullifier);
426
- if (!witness) {
427
- throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockHash}.`);
428
- }
521
+ const witness = await this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier);
429
522
  return toForeignCallResult(witness.toNoirRepresentation());
430
523
  }
431
- async utilityFetchTaggedLogs(foreignPendingTaggedLogArrayBaseSlot) {
432
- const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
433
- await this.handlerAsUtility().utilityFetchTaggedLogs(pendingTaggedLogArrayBaseSlot);
434
- 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
+ ]);
435
531
  }
436
- async utilityValidateAndStoreEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot) {
437
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
532
+ // eslint-disable-next-line camelcase
533
+ async aztec_utl_validateAndStoreEnqueuedNotesAndEvents(foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignScope) {
438
534
  const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
439
535
  const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
440
- await this.handlerAsUtility().utilityValidateAndStoreEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot);
536
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
537
+ await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, scope);
441
538
  return toForeignCallResult([]);
442
539
  }
443
- async utilityBulkRetrieveLogs(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot) {
444
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
445
- const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
446
- const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
447
- await this.handlerAsUtility().utilityBulkRetrieveLogs(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot);
448
- 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
+ ]);
547
+ }
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
+ ]);
449
555
  }
450
- async utilityStoreCapsule(foreignContractAddress, foreignSlot, foreignCapsule) {
556
+ // eslint-disable-next-line camelcase
557
+ aztec_utl_setCapsule(foreignContractAddress, foreignSlot, foreignCapsule, foreignScope) {
451
558
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
452
559
  const slot = fromSingle(foreignSlot);
453
560
  const capsule = fromArray(foreignCapsule);
454
- await this.handlerAsUtility().utilityStoreCapsule(contractAddress, slot, capsule);
561
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
562
+ this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope);
455
563
  return toForeignCallResult([]);
456
564
  }
457
- async utilityLoadCapsule(foreignContractAddress, foreignSlot, foreignTSize) {
565
+ // eslint-disable-next-line camelcase
566
+ async aztec_utl_getCapsule(foreignContractAddress, foreignSlot, foreignTSize, foreignScope) {
458
567
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
459
568
  const slot = fromSingle(foreignSlot);
460
569
  const tSize = fromSingle(foreignTSize).toNumber();
461
- 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);
462
572
  // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
463
573
  // with two fields: `some` (a boolean) and `value` (a field array in this case).
464
- if (values === null) {
465
- // 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`.
466
576
  return toForeignCallResult([
467
- toSingle(new Fr(0)),
468
- toArray(Array(tSize).fill(new Fr(0)))
577
+ toSingle(new Fr(1)),
578
+ toArray(Array.from(opt.value))
469
579
  ]);
470
580
  } else {
471
- // 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.
472
582
  return toForeignCallResult([
473
- toSingle(new Fr(1)),
474
- toArray(values)
583
+ toSingle(new Fr(0)),
584
+ toArray(Array(tSize).fill(new Fr(0)))
475
585
  ]);
476
586
  }
477
587
  }
478
- async utilityDeleteCapsule(foreignContractAddress, foreignSlot) {
588
+ // eslint-disable-next-line camelcase
589
+ aztec_utl_deleteCapsule(foreignContractAddress, foreignSlot, foreignScope) {
479
590
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
480
591
  const slot = fromSingle(foreignSlot);
481
- await this.handlerAsUtility().utilityDeleteCapsule(contractAddress, slot);
592
+ const scope = AztecAddress.fromField(fromSingle(foreignScope));
593
+ this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope);
482
594
  return toForeignCallResult([]);
483
595
  }
484
- async utilityCopyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries) {
596
+ // eslint-disable-next-line camelcase
597
+ async aztec_utl_copyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries, foreignScope) {
485
598
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
486
599
  const srcSlot = fromSingle(foreignSrcSlot);
487
600
  const dstSlot = fromSingle(foreignDstSlot);
488
601
  const numEntries = fromSingle(foreignNumEntries).toNumber();
489
- 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);
490
659
  return toForeignCallResult([]);
491
660
  }
492
661
  // TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
493
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
494
663
  // to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
495
664
  // existence of a txe_oracle method?
496
- async utilityAes128Decrypt(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
497
- 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
+ });
498
675
  const iv = fromUintArray(foreignIv, 8);
499
676
  const symKey = fromUintArray(foreignSymKey, 8);
500
- const plaintextBuffer = await this.handlerAsUtility().utilityAes128Decrypt(ciphertext, iv, symKey);
501
- 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
+ }
502
694
  }
503
- async utilityGetSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2) {
695
+ // eslint-disable-next-line camelcase
696
+ async aztec_utl_getSharedSecrets(foreignAddress, foreignEphPksSlot, foreignContractAddress) {
504
697
  const address = AztecAddress.fromField(fromSingle(foreignAddress));
505
- const ephPK = Point.fromFields([
506
- fromSingle(foreignEphPKField0),
507
- fromSingle(foreignEphPKField1),
508
- 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)
509
703
  ]);
510
- const secret = await this.handlerAsUtility().utilityGetSharedSecret(address, ephPK);
511
- return toForeignCallResult(secret.toFields().map(toSingle));
512
704
  }
513
- emitOffchainEffect(_foreignData) {
514
- 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([]));
515
725
  }
516
726
  // AVM opcodes
517
- avmOpcodeEmitPublicLog(_foreignMessage) {
727
+ // eslint-disable-next-line camelcase
728
+ aztec_avm_emitPublicLog(_foreignMessage) {
518
729
  // TODO(#8811): Implement
519
730
  return toForeignCallResult([]);
520
731
  }
521
- async avmOpcodeStorageRead(foreignSlot, foreignContractAddress) {
732
+ // eslint-disable-next-line camelcase
733
+ async aztec_avm_storageRead(foreignSlot, foreignContractAddress) {
522
734
  const slot = fromSingle(foreignSlot);
523
735
  const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
524
- const value = (await this.handlerAsAvm().avmOpcodeStorageRead(slot, contractAddress)).value;
736
+ const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
525
737
  return toForeignCallResult([
526
738
  toSingle(new Fr(value))
527
739
  ]);
528
740
  }
529
- async avmOpcodeStorageWrite(foreignSlot, foreignValue) {
741
+ // eslint-disable-next-line camelcase
742
+ async aztec_avm_storageWrite(foreignSlot, foreignValue) {
530
743
  const slot = fromSingle(foreignSlot);
531
744
  const value = fromSingle(foreignValue);
532
- await this.handlerAsAvm().avmOpcodeStorageWrite(slot, value);
745
+ await this.handlerAsAvm().storageWrite(slot, value);
533
746
  return toForeignCallResult([]);
534
747
  }
535
- async avmOpcodeGetContractInstanceDeployer(foreignAddress) {
748
+ // eslint-disable-next-line camelcase
749
+ async aztec_avm_getContractInstanceDeployer(foreignAddress) {
536
750
  const address = addressFromSingle(foreignAddress);
537
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
751
+ const instance = await this.handlerAsUtility().getContractInstance(address);
538
752
  return toForeignCallResult([
539
753
  toSingle(instance.deployer),
540
754
  // AVM requires an extra boolean indicating the instance was found
541
755
  toSingle(new Fr(1))
542
756
  ]);
543
757
  }
544
- async avmOpcodeGetContractInstanceClassId(foreignAddress) {
758
+ // eslint-disable-next-line camelcase
759
+ async aztec_avm_getContractInstanceClassId(foreignAddress) {
545
760
  const address = addressFromSingle(foreignAddress);
546
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
761
+ const instance = await this.handlerAsUtility().getContractInstance(address);
547
762
  return toForeignCallResult([
548
763
  toSingle(instance.currentContractClassId),
549
764
  // AVM requires an extra boolean indicating the instance was found
550
765
  toSingle(new Fr(1))
551
766
  ]);
552
767
  }
553
- async avmOpcodeGetContractInstanceInitializationHash(foreignAddress) {
768
+ // eslint-disable-next-line camelcase
769
+ async aztec_avm_getContractInstanceInitializationHash(foreignAddress) {
554
770
  const address = addressFromSingle(foreignAddress);
555
- const instance = await this.handlerAsUtility().utilityGetContractInstance(address);
771
+ const instance = await this.handlerAsUtility().getContractInstance(address);
556
772
  return toForeignCallResult([
557
773
  toSingle(instance.initializationHash),
558
774
  // AVM requires an extra boolean indicating the instance was found
559
775
  toSingle(new Fr(1))
560
776
  ]);
561
777
  }
562
- async avmOpcodeSender() {
563
- 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();
564
791
  return toForeignCallResult([
565
792
  toSingle(sender)
566
793
  ]);
567
794
  }
568
- async avmOpcodeEmitNullifier(foreignNullifier) {
795
+ // eslint-disable-next-line camelcase
796
+ async aztec_avm_emitNullifier(foreignNullifier) {
569
797
  const nullifier = fromSingle(foreignNullifier);
570
- await this.handlerAsAvm().avmOpcodeEmitNullifier(nullifier);
798
+ await this.handlerAsAvm().emitNullifier(nullifier);
571
799
  return toForeignCallResult([]);
572
800
  }
573
- async avmOpcodeEmitNoteHash(foreignNoteHash) {
801
+ // eslint-disable-next-line camelcase
802
+ async aztec_avm_emitNoteHash(foreignNoteHash) {
574
803
  const noteHash = fromSingle(foreignNoteHash);
575
- await this.handlerAsAvm().avmOpcodeEmitNoteHash(noteHash);
804
+ await this.handlerAsAvm().emitNoteHash(noteHash);
576
805
  return toForeignCallResult([]);
577
806
  }
578
- async avmOpcodeNullifierExists(foreignSiloedNullifier) {
807
+ // eslint-disable-next-line camelcase
808
+ async aztec_avm_nullifierExists(foreignSiloedNullifier) {
579
809
  const siloedNullifier = fromSingle(foreignSiloedNullifier);
580
- const exists = await this.handlerAsAvm().avmOpcodeNullifierExists(siloedNullifier);
810
+ const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
581
811
  return toForeignCallResult([
582
812
  toSingle(new Fr(exists))
583
813
  ]);
584
814
  }
585
- async avmOpcodeAddress() {
586
- const contractAddress = await this.handlerAsAvm().avmOpcodeAddress();
815
+ // eslint-disable-next-line camelcase
816
+ async aztec_avm_address() {
817
+ const contractAddress = await this.handlerAsAvm().address();
587
818
  return toForeignCallResult([
588
819
  toSingle(contractAddress.toField())
589
820
  ]);
590
821
  }
591
- async avmOpcodeBlockNumber() {
592
- const blockNumber = await this.handlerAsAvm().avmOpcodeBlockNumber();
822
+ // eslint-disable-next-line camelcase
823
+ async aztec_avm_blockNumber() {
824
+ const blockNumber = await this.handlerAsAvm().blockNumber();
593
825
  return toForeignCallResult([
594
826
  toSingle(new Fr(blockNumber))
595
827
  ]);
596
828
  }
597
- async avmOpcodeTimestamp() {
598
- const timestamp = await this.handlerAsAvm().avmOpcodeTimestamp();
829
+ // eslint-disable-next-line camelcase
830
+ async aztec_avm_timestamp() {
831
+ const timestamp = await this.handlerAsAvm().timestamp();
599
832
  return toForeignCallResult([
600
833
  toSingle(new Fr(timestamp))
601
834
  ]);
602
835
  }
603
- async avmOpcodeIsStaticCall() {
604
- const isStaticCall = await this.handlerAsAvm().avmOpcodeIsStaticCall();
836
+ // eslint-disable-next-line camelcase
837
+ async aztec_avm_isStaticCall() {
838
+ const isStaticCall = await this.handlerAsAvm().isStaticCall();
605
839
  return toForeignCallResult([
606
840
  toSingle(new Fr(isStaticCall ? 1 : 0))
607
841
  ]);
608
842
  }
609
- async avmOpcodeChainId() {
610
- const chainId = await this.handlerAsAvm().avmOpcodeChainId();
843
+ // eslint-disable-next-line camelcase
844
+ async aztec_avm_chainId() {
845
+ const chainId = await this.handlerAsAvm().chainId();
611
846
  return toForeignCallResult([
612
847
  toSingle(chainId)
613
848
  ]);
614
849
  }
615
- async avmOpcodeVersion() {
616
- const version = await this.handlerAsAvm().avmOpcodeVersion();
850
+ // eslint-disable-next-line camelcase
851
+ async aztec_avm_version() {
852
+ const version = await this.handlerAsAvm().version();
617
853
  return toForeignCallResult([
618
854
  toSingle(version)
619
855
  ]);
620
856
  }
621
- avmOpcodeReturndataSize() {
622
- 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
+ ]);
623
863
  }
624
- avmOpcodeReturndataCopy(_foreignRdOffset, _foreignCopySize) {
625
- 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
+ ]);
626
872
  }
627
- avmOpcodeCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
628
- 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
+ ]);
629
884
  }
630
- avmOpcodeStaticCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
631
- 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
+ ]);
632
896
  }
633
- avmOpcodeSuccessCopy() {
634
- 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
+ ]);
635
903
  }
636
- async txePrivateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
637
- 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;
638
908
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
639
909
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
640
910
  const args = fromArray(foreignArgs);
641
911
  const argsHash = fromSingle(foreignArgsHash);
642
912
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
643
- const returnValues = await this.handlerAsTxe().txePrivateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall, this.stateHandler.getCurrentJob());
644
- // TODO(F-335): Avoid doing the following call here.
645
- await this.stateHandler.cycleJob();
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
+ });
646
941
  return toForeignCallResult([
647
942
  toArray(returnValues)
648
943
  ]);
649
944
  }
650
- 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) {
651
948
  const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
652
949
  const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
653
950
  const args = fromArray(foreignArgs);
654
- const returnValues = await this.handlerAsTxe().txeExecuteUtilityFunction(targetContractAddress, functionSelector, args, this.stateHandler.getCurrentJob());
655
- // TODO(F-335): Avoid doing the following call here.
656
- await this.stateHandler.cycleJob();
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
+ });
657
960
  return toForeignCallResult([
658
961
  toArray(returnValues)
659
962
  ]);
660
963
  }
661
- async txePublicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
662
- 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;
663
968
  const address = addressFromSingle(foreignAddress);
664
969
  const calldata = fromArray(foreignCalldata);
665
970
  const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
666
- const returnValues = await this.handlerAsTxe().txePublicCallNewFlow(from, address, calldata, isStaticCall);
667
- // TODO(F-335): Avoid doing the following call here.
668
- await this.stateHandler.cycleJob();
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
+ });
669
988
  return toForeignCallResult([
670
989
  toArray(returnValues)
671
990
  ]);
672
991
  }
673
- async privateGetSenderForTags() {
674
- const sender = await this.handlerAsPrivate().privateGetSenderForTags();
992
+ // eslint-disable-next-line camelcase
993
+ async aztec_prv_getSenderForTags() {
994
+ const senderOpt = await this.handlerAsPrivate().getSenderForTags();
675
995
  // Return a Noir Option struct with `some` and `value` fields
676
- if (sender === undefined) {
677
- // 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
678
998
  return toForeignCallResult([
679
- toSingle(0),
680
- toSingle(0)
999
+ toSingle(1),
1000
+ toSingle(senderOpt.value)
681
1001
  ]);
682
1002
  } else {
683
- // Sender found, return Option with some=1 and value=sender address
1003
+ // No sender found, return Option with some=0 and value=0
684
1004
  return toForeignCallResult([
685
- toSingle(1),
686
- toSingle(sender)
1005
+ toSingle(0),
1006
+ toSingle(0)
687
1007
  ]);
688
1008
  }
689
1009
  }
690
- async privateSetSenderForTags(foreignSenderForTags) {
691
- const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
692
- await this.handlerAsPrivate().privateSetSenderForTags(senderForTags);
693
- return toForeignCallResult([]);
694
- }
695
- async privateGetNextAppTagAsSender(foreignSender, foreignRecipient) {
1010
+ // eslint-disable-next-line camelcase
1011
+ async aztec_prv_getNextAppTagAsSender(foreignSender, foreignRecipient) {
696
1012
  const sender = AztecAddress.fromField(fromSingle(foreignSender));
697
1013
  const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
698
- const nextAppTag = await this.handlerAsPrivate().privateGetNextAppTagAsSender(sender, recipient);
1014
+ const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
699
1015
  return toForeignCallResult([
700
1016
  toSingle(nextAppTag.value)
701
1017
  ]);
702
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
+ }
703
1027
  }