@aztec/txe 0.0.1-commit.24de95ac → 0.0.1-commit.2606882

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