@aztec/txe 0.0.1-commit.9ef841308 → 0.0.1-commit.a4600f49

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 (164) hide show
  1. package/dest/AuthRegistry-HMC7WEOJ.js +3 -0
  2. package/dest/AuthRegistry-HMC7WEOJ.js.map +7 -0
  3. package/dest/ContractClassRegistry-TXCDCFNC.js +3 -0
  4. package/dest/ContractClassRegistry-TXCDCFNC.js.map +7 -0
  5. package/dest/ContractInstanceRegistry-2TZHWOTT.js +3 -0
  6. package/dest/ContractInstanceRegistry-2TZHWOTT.js.map +7 -0
  7. package/dest/FeeJuice-FDF3J2Q5.js +3 -0
  8. package/dest/FeeJuice-FDF3J2Q5.js.map +7 -0
  9. package/dest/HandshakeRegistry-C7JF4R54.js +3 -0
  10. package/dest/HandshakeRegistry-C7JF4R54.js.map +7 -0
  11. package/dest/MultiCallEntrypoint-IGLO227K.js +3 -0
  12. package/dest/MultiCallEntrypoint-IGLO227K.js.map +7 -0
  13. package/dest/SchnorrAccount-KCIHUCXS.js +3 -0
  14. package/dest/SchnorrAccount-KCIHUCXS.js.map +7 -0
  15. package/dest/SchnorrInitializerlessAccount-PVR6XUSN.js +3 -0
  16. package/dest/SchnorrInitializerlessAccount-PVR6XUSN.js.map +7 -0
  17. package/dest/bin/check_txe_oracle_version.d.ts +2 -0
  18. package/dest/bin/check_txe_oracle_version.d.ts.map +1 -0
  19. package/dest/bin/check_txe_oracle_version.js +61 -0
  20. package/dest/bin/index.js +3 -30
  21. package/dest/bin/index.js.map +7 -0
  22. package/dest/bin/oracle_test_server.d.ts +3 -0
  23. package/dest/bin/oracle_test_server.d.ts.map +1 -0
  24. package/dest/bin/oracle_test_server.js +41 -0
  25. package/dest/chunk-32UHX7YY.js +3 -0
  26. package/dest/chunk-32UHX7YY.js.map +7 -0
  27. package/dest/chunk-6AVNR3XX.js +304 -0
  28. package/dest/chunk-6AVNR3XX.js.map +7 -0
  29. package/dest/chunk-CJEH2W44.js +260 -0
  30. package/dest/chunk-CJEH2W44.js.map +7 -0
  31. package/dest/constants.d.ts +5 -1
  32. package/dest/constants.d.ts.map +1 -1
  33. package/dest/constants.js +9 -1
  34. package/dest/dispatcher_pool.d.ts +67 -0
  35. package/dest/dispatcher_pool.d.ts.map +1 -0
  36. package/dest/dispatcher_pool.js +286 -0
  37. package/dest/index.d.ts +51 -7
  38. package/dest/index.d.ts.map +1 -1
  39. package/dest/index.js +72 -190
  40. package/dest/metafile.json +38497 -0
  41. package/dest/msgpackr_fr_extension.d.ts +2 -0
  42. package/dest/msgpackr_fr_extension.d.ts.map +1 -0
  43. package/dest/msgpackr_fr_extension.js +21 -0
  44. package/dest/oracle/interfaces.d.ts +38 -8
  45. package/dest/oracle/interfaces.d.ts.map +1 -1
  46. package/dest/oracle/test-resolver/default_fixtures.d.ts +9 -0
  47. package/dest/oracle/test-resolver/default_fixtures.d.ts.map +1 -0
  48. package/dest/oracle/test-resolver/default_fixtures.js +207 -0
  49. package/dest/oracle/test-resolver/index.d.ts +9 -0
  50. package/dest/oracle/test-resolver/index.d.ts.map +1 -0
  51. package/dest/oracle/test-resolver/index.js +32 -0
  52. package/dest/oracle/test-resolver/resolver.d.ts +48 -0
  53. package/dest/oracle/test-resolver/resolver.d.ts.map +1 -0
  54. package/dest/oracle/test-resolver/resolver.js +181 -0
  55. package/dest/oracle/txe_oracle_public_context.d.ts +26 -2
  56. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  57. package/dest/oracle/txe_oracle_public_context.js +49 -1
  58. package/dest/oracle/txe_oracle_registry.d.ts +169 -0
  59. package/dest/oracle/txe_oracle_registry.d.ts.map +1 -0
  60. package/dest/oracle/txe_oracle_registry.js +745 -0
  61. package/dest/oracle/txe_oracle_top_level_context.d.ts +43 -17
  62. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  63. package/dest/oracle/txe_oracle_top_level_context.js +529 -297
  64. package/dest/oracle/txe_oracle_version.d.ts +17 -0
  65. package/dest/oracle/txe_oracle_version.d.ts.map +1 -0
  66. package/dest/oracle/txe_oracle_version.js +14 -0
  67. package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
  68. package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
  69. package/dest/oracle/txe_private_execution_oracle.js +15 -0
  70. package/dest/rpc_server.d.ts +14 -0
  71. package/dest/rpc_server.d.ts.map +1 -0
  72. package/dest/rpc_server.js +78 -0
  73. package/dest/rpc_translator.d.ts +112 -233
  74. package/dest/rpc_translator.d.ts.map +1 -1
  75. package/dest/rpc_translator.js +767 -647
  76. package/dest/server.bundle.js +3 -0
  77. package/dest/server.bundle.js.map +7 -0
  78. package/dest/state_machine/archiver.d.ts +4 -3
  79. package/dest/state_machine/archiver.d.ts.map +1 -1
  80. package/dest/state_machine/archiver.js +24 -14
  81. package/dest/state_machine/dummy_p2p_client.d.ts +16 -7
  82. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  83. package/dest/state_machine/dummy_p2p_client.js +25 -4
  84. package/dest/state_machine/global_variable_builder.d.ts +10 -6
  85. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  86. package/dest/state_machine/global_variable_builder.js +8 -5
  87. package/dest/state_machine/index.d.ts +12 -9
  88. package/dest/state_machine/index.d.ts.map +1 -1
  89. package/dest/state_machine/index.js +51 -15
  90. package/dest/state_machine/mock_epoch_cache.d.ts +1 -2
  91. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  92. package/dest/state_machine/mock_epoch_cache.js +0 -3
  93. package/dest/state_machine/synchronizer.d.ts +10 -2
  94. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  95. package/dest/state_machine/synchronizer.js +19 -6
  96. package/dest/txe_session.d.ts +89 -20
  97. package/dest/txe_session.d.ts.map +1 -1
  98. package/dest/txe_session.js +315 -68
  99. package/dest/utils/block_creation.d.ts +2 -2
  100. package/dest/utils/block_creation.d.ts.map +1 -1
  101. package/dest/utils/block_creation.js +2 -2
  102. package/dest/utils/encoding.d.ts +192 -0
  103. package/dest/utils/encoding.d.ts.map +1 -0
  104. package/dest/{util → utils}/encoding.js +7 -2
  105. package/dest/{util → utils}/expected_failure_error.d.ts +1 -1
  106. package/dest/utils/expected_failure_error.d.ts.map +1 -0
  107. package/dest/utils/tx_effect_creation.d.ts +1 -1
  108. package/dest/utils/tx_effect_creation.d.ts.map +1 -1
  109. package/dest/utils/tx_effect_creation.js +0 -1
  110. package/dest/{util → utils}/txe_account_store.d.ts +1 -1
  111. package/dest/utils/txe_account_store.d.ts.map +1 -0
  112. package/dest/utils/txe_artifact_resolver.d.ts +37 -0
  113. package/dest/utils/txe_artifact_resolver.d.ts.map +1 -0
  114. package/dest/utils/txe_artifact_resolver.js +161 -0
  115. package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
  116. package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
  117. package/dest/{util → utils}/txe_public_contract_data_source.js +7 -4
  118. package/dest/worker.bundle.js +3 -0
  119. package/dest/worker.bundle.js.map +7 -0
  120. package/dest/worker.d.ts +2 -0
  121. package/dest/worker.d.ts.map +1 -0
  122. package/dest/worker.js +92 -0
  123. package/package.json +38 -21
  124. package/src/bin/check_txe_oracle_version.ts +70 -0
  125. package/src/bin/index.ts +11 -2
  126. package/src/bin/oracle_test_server.ts +51 -0
  127. package/src/constants.ts +11 -1
  128. package/src/dispatcher_pool.ts +317 -0
  129. package/src/index.ts +99 -227
  130. package/src/msgpackr_fr_extension.ts +23 -0
  131. package/src/oracle/interfaces.ts +35 -7
  132. package/src/oracle/test-resolver/default_fixtures.ts +282 -0
  133. package/src/oracle/test-resolver/index.ts +44 -0
  134. package/src/oracle/test-resolver/resolver.ts +245 -0
  135. package/src/oracle/txe_oracle_public_context.ts +62 -0
  136. package/src/oracle/txe_oracle_registry.ts +536 -0
  137. package/src/oracle/txe_oracle_top_level_context.ts +321 -113
  138. package/src/oracle/txe_oracle_version.ts +17 -0
  139. package/src/oracle/txe_private_execution_oracle.ts +30 -0
  140. package/src/rpc_server.ts +87 -0
  141. package/src/rpc_translator.ts +864 -941
  142. package/src/state_machine/archiver.ts +37 -16
  143. package/src/state_machine/dummy_p2p_client.ts +44 -11
  144. package/src/state_machine/global_variable_builder.ts +12 -11
  145. package/src/state_machine/index.ts +62 -35
  146. package/src/state_machine/mock_epoch_cache.ts +0 -4
  147. package/src/state_machine/synchronizer.ts +27 -6
  148. package/src/txe_session.ts +543 -90
  149. package/src/utils/block_creation.ts +2 -1
  150. package/src/{util → utils}/encoding.ts +8 -2
  151. package/src/utils/tx_effect_creation.ts +0 -2
  152. package/src/utils/txe_artifact_resolver.ts +217 -0
  153. package/src/{util → utils}/txe_public_contract_data_source.ts +6 -4
  154. package/src/worker.ts +98 -0
  155. package/dest/util/encoding.d.ts +0 -788
  156. package/dest/util/encoding.d.ts.map +0 -1
  157. package/dest/util/expected_failure_error.d.ts.map +0 -1
  158. package/dest/util/txe_account_store.d.ts.map +0 -1
  159. package/dest/util/txe_public_contract_data_source.d.ts +0 -20
  160. package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
  161. /package/dest/{util → utils}/expected_failure_error.js +0 -0
  162. /package/dest/{util → utils}/txe_account_store.js +0 -0
  163. /package/src/{util → utils}/expected_failure_error.ts +0 -0
  164. /package/src/{util → utils}/txe_account_store.ts +0 -0
@@ -1,37 +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 { BlockNumber } from '@aztec/foundation/branded-types';
5
- import {
6
- type IMiscOracle,
7
- type IPrivateExecutionOracle,
8
- type IUtilityExecutionOracle,
9
- packAsHintedNote,
10
- } from '@aztec/pxe/simulator';
11
- import { type ContractArtifact, EventSelector, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
12
- import { AztecAddress } from '@aztec/stdlib/aztec-address';
13
- import { BlockHash } from '@aztec/stdlib/block';
1
+ import type { IMiscOracle, IPrivateExecutionOracle, IUtilityExecutionOracle } from '@aztec/pxe/simulator';
14
2
 
15
3
  import type { IAvmExecutionOracle, ITxeExecutionOracle } from './oracle/interfaces.js';
4
+ import { callTxeHandler } from './oracle/txe_oracle_registry.js';
16
5
  import type { TXESessionStateHandler } from './txe_session.js';
17
- import {
18
- type ForeignCallArray,
19
- type ForeignCallSingle,
20
- addressFromSingle,
21
- arrayOfArraysToBoundedVecOfArrays,
22
- arrayToBoundedVec,
23
- bufferToU8Array,
24
- fromArray,
25
- fromSingle,
26
- fromUintArray,
27
- fromUintBoundedVec,
28
- toArray,
29
- toForeignCallResult,
30
- toSingle,
31
- } from './util/encoding.js';
32
-
33
- const MAX_EVENT_LEN = 10; // This is MAX_MESSAGE_CONTENT_LEN - PRIVATE_EVENT_MSG_PLAINTEXT_RESERVED_FIELDS_LEN
34
- const MAX_PRIVATE_EVENTS_PER_TXE_QUERY = 5;
6
+ import type { ForeignCallArgs } from './utils/encoding.js';
35
7
 
36
8
  export class UnavailableOracleError extends Error {
37
9
  constructor(oracleName: string) {
@@ -102,61 +74,54 @@ export class RPCTranslator {
102
74
  return this.oracleHandler;
103
75
  }
104
76
 
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
+ });
86
+ }
87
+
105
88
  // TXE session state transition functions - these get handled by the state handler
106
89
 
107
90
  // eslint-disable-next-line camelcase
108
- async aztec_txe_setTopLevelTXEContext() {
109
- await this.stateHandler.enterTopLevelState();
110
-
111
- return toForeignCallResult([]);
91
+ aztec_txe_setTopLevelTXEContext() {
92
+ return callTxeHandler({
93
+ oracle: 'aztec_txe_setTopLevelTXEContext',
94
+ inputs: [],
95
+ handler: () => this.stateHandler.enterTopLevelState(),
96
+ });
112
97
  }
113
98
 
114
99
  // eslint-disable-next-line camelcase
115
- async aztec_txe_setPrivateTXEContext(
116
- foreignContractAddressIsSome: ForeignCallSingle,
117
- foreignContractAddressValue: ForeignCallSingle,
118
- foreignAnchorBlockNumberIsSome: ForeignCallSingle,
119
- foreignAnchorBlockNumberValue: ForeignCallSingle,
120
- ) {
121
- const contractAddress = fromSingle(foreignContractAddressIsSome).toBool()
122
- ? AztecAddress.fromField(fromSingle(foreignContractAddressValue))
123
- : undefined;
124
-
125
- const anchorBlockNumber = fromSingle(foreignAnchorBlockNumberIsSome).toBool()
126
- ? BlockNumber(fromSingle(foreignAnchorBlockNumberValue).toNumber())
127
- : undefined;
128
-
129
- const privateContextInputs = await this.stateHandler.enterPrivateState(contractAddress, anchorBlockNumber);
130
-
131
- return toForeignCallResult(privateContextInputs.toFields().map(toSingle));
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
+ });
132
107
  }
133
108
 
134
109
  // eslint-disable-next-line camelcase
135
- async aztec_txe_setPublicTXEContext(
136
- foreignContractAddressIsSome: ForeignCallSingle,
137
- foreignContractAddressValue: ForeignCallSingle,
138
- ) {
139
- const contractAddress = fromSingle(foreignContractAddressIsSome).toBool()
140
- ? AztecAddress.fromField(fromSingle(foreignContractAddressValue))
141
- : undefined;
142
-
143
- await this.stateHandler.enterPublicState(contractAddress);
144
-
145
- return toForeignCallResult([]);
110
+ aztec_txe_setPublicTXEContext(...inputs: ForeignCallArgs) {
111
+ return callTxeHandler({
112
+ oracle: 'aztec_txe_setPublicTXEContext',
113
+ inputs,
114
+ handler: ([contractAddress]) => this.stateHandler.enterPublicState(contractAddress),
115
+ });
146
116
  }
147
117
 
148
118
  // eslint-disable-next-line camelcase
149
- async aztec_txe_setUtilityTXEContext(
150
- foreignContractAddressIsSome: ForeignCallSingle,
151
- foreignContractAddressValue: ForeignCallSingle,
152
- ) {
153
- const contractAddress = fromSingle(foreignContractAddressIsSome).toBool()
154
- ? AztecAddress.fromField(fromSingle(foreignContractAddressValue))
155
- : undefined;
156
-
157
- await this.stateHandler.enterUtilityState(contractAddress);
158
-
159
- return toForeignCallResult([]);
119
+ aztec_txe_setUtilityTXEContext(...inputs: ForeignCallArgs) {
120
+ return callTxeHandler({
121
+ oracle: 'aztec_txe_setUtilityTXEContext',
122
+ inputs,
123
+ handler: ([contractAddress]) => this.stateHandler.enterUtilityState(contractAddress),
124
+ });
160
125
  }
161
126
 
162
127
  // Other oracles - these get handled by the oracle handler
@@ -165,737 +130,661 @@ export class RPCTranslator {
165
130
 
166
131
  // eslint-disable-next-line camelcase
167
132
  aztec_txe_getDefaultAddress() {
168
- const defaultAddress = this.handlerAsTxe().getDefaultAddress();
169
-
170
- return toForeignCallResult([toSingle(defaultAddress)]);
133
+ return callTxeHandler({
134
+ oracle: 'aztec_txe_getDefaultAddress',
135
+ inputs: [],
136
+ handler: () => this.handlerAsTxe().getDefaultAddress(),
137
+ });
171
138
  }
172
139
 
173
140
  // eslint-disable-next-line camelcase
174
- async aztec_txe_getNextBlockNumber() {
175
- const nextBlockNumber = await this.handlerAsTxe().getNextBlockNumber();
176
-
177
- return toForeignCallResult([toSingle(nextBlockNumber)]);
141
+ aztec_txe_getNextBlockNumber() {
142
+ return callTxeHandler({
143
+ oracle: 'aztec_txe_getNextBlockNumber',
144
+ inputs: [],
145
+ handler: () => this.handlerAsTxe().getNextBlockNumber(),
146
+ });
178
147
  }
179
148
 
180
149
  // eslint-disable-next-line camelcase
181
- async aztec_txe_getNextBlockTimestamp() {
182
- const nextBlockTimestamp = await this.handlerAsTxe().getNextBlockTimestamp();
183
-
184
- return toForeignCallResult([toSingle(nextBlockTimestamp)]);
150
+ aztec_txe_getNextBlockTimestamp() {
151
+ return callTxeHandler({
152
+ oracle: 'aztec_txe_getNextBlockTimestamp',
153
+ inputs: [],
154
+ handler: () => this.handlerAsTxe().getNextBlockTimestamp(),
155
+ });
185
156
  }
186
157
 
187
158
  // eslint-disable-next-line camelcase
188
- async aztec_txe_advanceBlocksBy(foreignBlocks: ForeignCallSingle) {
189
- const blocks = fromSingle(foreignBlocks).toNumber();
190
-
191
- await this.handlerAsTxe().advanceBlocksBy(blocks);
192
-
193
- return toForeignCallResult([]);
159
+ aztec_txe_advanceBlocksBy(...inputs: ForeignCallArgs) {
160
+ return callTxeHandler({
161
+ oracle: 'aztec_txe_advanceBlocksBy',
162
+ inputs,
163
+ handler: ([blocks]) => this.handlerAsTxe().advanceBlocksBy(blocks),
164
+ });
194
165
  }
195
166
 
196
167
  // eslint-disable-next-line camelcase
197
- aztec_txe_advanceTimestampBy(foreignDuration: ForeignCallSingle) {
198
- const duration = fromSingle(foreignDuration).toBigInt();
199
-
200
- this.handlerAsTxe().advanceTimestampBy(duration);
201
-
202
- return toForeignCallResult([]);
168
+ aztec_txe_advanceTimestampBy(...inputs: ForeignCallArgs) {
169
+ return callTxeHandler({
170
+ oracle: 'aztec_txe_advanceTimestampBy',
171
+ inputs,
172
+ handler: ([duration]) => this.handlerAsTxe().advanceTimestampBy(duration),
173
+ });
203
174
  }
204
175
 
205
176
  // eslint-disable-next-line camelcase
206
- async aztec_txe_deploy(
207
- artifact: ContractArtifact,
208
- instance: ContractInstanceWithAddress,
209
- foreignSecret: ForeignCallSingle,
210
- ) {
211
- const secret = fromSingle(foreignSecret);
212
-
213
- await this.handlerAsTxe().deploy(artifact, instance, secret);
214
-
215
- return toForeignCallResult([
216
- toArray([
217
- instance.salt,
218
- instance.deployer.toField(),
219
- instance.currentContractClassId,
220
- instance.initializationHash,
221
- ...instance.publicKeys.toFields(),
222
- ]),
223
- ]);
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
+ });
224
184
  }
225
185
 
226
186
  // eslint-disable-next-line camelcase
227
- async aztec_txe_createAccount(foreignSecret: ForeignCallSingle) {
228
- const secret = fromSingle(foreignSecret);
229
-
230
- const completeAddress = await this.handlerAsTxe().createAccount(secret);
231
-
232
- return toForeignCallResult([
233
- toSingle(completeAddress.address),
234
- ...completeAddress.publicKeys.toFields().map(toSingle),
235
- ]);
187
+ aztec_txe_createAccount(...inputs: ForeignCallArgs) {
188
+ return callTxeHandler({
189
+ oracle: 'aztec_txe_createAccount',
190
+ inputs,
191
+ handler: ([secret]) => this.handlerAsTxe().createAccount(secret),
192
+ });
236
193
  }
237
194
 
238
195
  // eslint-disable-next-line camelcase
239
- async aztec_txe_addAccount(
240
- artifact: ContractArtifact,
241
- instance: ContractInstanceWithAddress,
242
- foreignSecret: ForeignCallSingle,
243
- ) {
244
- const secret = fromSingle(foreignSecret);
245
-
246
- const completeAddress = await this.handlerAsTxe().addAccount(artifact, instance, secret);
247
-
248
- return toForeignCallResult([
249
- toSingle(completeAddress.address),
250
- ...completeAddress.publicKeys.toFields().map(toSingle),
251
- ]);
196
+ aztec_txe_addAccount(...inputs: ForeignCallArgs) {
197
+ return callTxeHandler({
198
+ oracle: 'aztec_txe_addAccount',
199
+ inputs,
200
+ handler: ([secret]) => this.handlerAsTxe().addAccount(secret),
201
+ });
252
202
  }
253
203
 
254
204
  // eslint-disable-next-line camelcase
255
- async aztec_txe_addAuthWitness(foreignAddress: ForeignCallSingle, foreignMessageHash: ForeignCallSingle) {
256
- const address = addressFromSingle(foreignAddress);
257
- const messageHash = fromSingle(foreignMessageHash);
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
+ });
211
+ }
258
212
 
259
- await this.handlerAsTxe().addAuthWitness(address, messageHash);
213
+ // eslint-disable-next-line camelcase
214
+ aztec_txe_sendL1ToL2Message(...inputs: ForeignCallArgs) {
215
+ return callTxeHandler({
216
+ oracle: 'aztec_txe_sendL1ToL2Message',
217
+ inputs,
218
+ handler: ([content, secretHash, sender, recipient]) =>
219
+ this.handlerAsTxe().sendL1ToL2Message(content, secretHash, sender, recipient),
220
+ });
221
+ }
260
222
 
261
- return toForeignCallResult([]);
223
+ // eslint-disable-next-line camelcase
224
+ aztec_txe_setTaggingSecretStrategy(...inputs: ForeignCallArgs) {
225
+ return callTxeHandler({
226
+ oracle: 'aztec_txe_setTaggingSecretStrategy',
227
+ inputs,
228
+ handler: ([strategy]) => this.handlerAsTxe().setTaggingSecretStrategy(strategy),
229
+ });
262
230
  }
263
231
 
264
232
  // PXE oracles
265
233
 
266
234
  // eslint-disable-next-line camelcase
267
- aztec_utl_assertCompatibleOracleVersion(foreignVersion: ForeignCallSingle) {
268
- const version = fromSingle(foreignVersion).toNumber();
269
-
270
- this.handlerAsMisc().assertCompatibleOracleVersion(version);
271
-
272
- return toForeignCallResult([]);
235
+ aztec_misc_assertCompatibleOracleVersion(...inputs: ForeignCallArgs) {
236
+ return callTxeHandler({
237
+ oracle: 'aztec_misc_assertCompatibleOracleVersion',
238
+ inputs,
239
+ handler: ([major, minor]) => this.handlerAsMisc().assertCompatibleOracleVersion(major, minor),
240
+ });
273
241
  }
274
242
 
275
243
  // eslint-disable-next-line camelcase
276
- aztec_utl_getRandomField() {
277
- const randomField = this.handlerAsMisc().getRandomField();
278
-
279
- return toForeignCallResult([toSingle(randomField)]);
244
+ aztec_misc_getRandomField() {
245
+ return callTxeHandler({
246
+ oracle: 'aztec_misc_getRandomField',
247
+ inputs: [],
248
+ handler: () => this.handlerAsMisc().getRandomField(),
249
+ });
280
250
  }
281
251
 
282
252
  // eslint-disable-next-line camelcase
283
- async aztec_txe_getLastBlockTimestamp() {
284
- const timestamp = await this.handlerAsTxe().getLastBlockTimestamp();
285
-
286
- return toForeignCallResult([toSingle(new Fr(timestamp))]);
253
+ aztec_txe_getLastBlockTimestamp() {
254
+ return callTxeHandler({
255
+ oracle: 'aztec_txe_getLastBlockTimestamp',
256
+ inputs: [],
257
+ handler: () => this.handlerAsTxe().getLastBlockTimestamp(),
258
+ });
287
259
  }
288
260
 
289
261
  // eslint-disable-next-line camelcase
290
- async aztec_txe_getLastTxEffects() {
291
- const { txHash, noteHashes, nullifiers } = await this.handlerAsTxe().getLastTxEffects();
292
-
293
- return toForeignCallResult([
294
- toSingle(txHash.hash),
295
- ...arrayToBoundedVec(toArray(noteHashes), MAX_NOTE_HASHES_PER_TX),
296
- ...arrayToBoundedVec(toArray(nullifiers), MAX_NULLIFIERS_PER_TX),
297
- ]);
262
+ aztec_txe_getLastTxEffects() {
263
+ return callTxeHandler({
264
+ oracle: 'aztec_txe_getLastTxEffects',
265
+ inputs: [],
266
+ handler: () => this.handlerAsTxe().getLastTxEffects(),
267
+ });
298
268
  }
299
269
 
300
270
  // eslint-disable-next-line camelcase
301
- async aztec_txe_getPrivateEvents(
302
- foreignSelector: ForeignCallSingle,
303
- foreignContractAddress: ForeignCallSingle,
304
- foreignScope: ForeignCallSingle,
305
- ) {
306
- const selector = EventSelector.fromField(fromSingle(foreignSelector));
307
- const contractAddress = addressFromSingle(foreignContractAddress);
308
- const scope = addressFromSingle(foreignScope);
309
-
310
- // TODO(F-335): Avoid doing the following 2 calls here.
311
- {
312
- await this.handlerAsTxe().syncContractNonOracleMethod(contractAddress, scope, this.stateHandler.getCurrentJob());
313
- // We cycle job to commit the stores after the contract sync.
314
- await this.stateHandler.cycleJob();
315
- }
316
-
317
- const events = await this.handlerAsTxe().getPrivateEvents(selector, contractAddress, scope);
318
-
319
- if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
320
- throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
321
- }
322
-
323
- if (events.some(e => e.length > MAX_EVENT_LEN)) {
324
- throw new Error(`Some private event has length larger than maxLen ${MAX_EVENT_LEN}`);
325
- }
326
-
327
- // This is a workaround as Noir does not currently let us return nested structs with arrays. We instead return a raw
328
- // multidimensional array in get_private_events_oracle and create the BoundedVecs here.
329
- const rawArrayStorage = events
330
- .map(e => e.concat(Array(MAX_EVENT_LEN - e.length).fill(new Fr(0))))
331
- .concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(Array(MAX_EVENT_LEN).fill(new Fr(0))))
332
- .flat();
333
- const eventLengths = events
334
- .map(e => new Fr(e.length))
335
- .concat(Array(MAX_PRIVATE_EVENTS_PER_TXE_QUERY - events.length).fill(new Fr(0)));
336
- const queryLength = new Fr(events.length);
337
-
338
- return toForeignCallResult([toArray(rawArrayStorage), toArray(eventLengths), toSingle(queryLength)]);
271
+ aztec_txe_getLastCallOffchainEffects() {
272
+ return callTxeHandler({
273
+ oracle: 'aztec_txe_getLastCallOffchainEffects',
274
+ inputs: [],
275
+ handler: () => this.stateHandler.getLastCallOffchainEffects(),
276
+ });
339
277
  }
340
278
 
341
279
  // eslint-disable-next-line camelcase
342
- aztec_prv_setHashPreimage(foreignValues: ForeignCallArray, foreignHash: ForeignCallSingle) {
343
- const values = fromArray(foreignValues);
344
- const hash = fromSingle(foreignHash);
345
-
346
- this.handlerAsPrivate().setHashPreimage(values, hash);
347
-
348
- return toForeignCallResult([]);
280
+ aztec_txe_getLastCallContext() {
281
+ return callTxeHandler({
282
+ oracle: 'aztec_txe_getLastCallContext',
283
+ inputs: [],
284
+ handler: () => this.stateHandler.getLastCallContext(),
285
+ });
349
286
  }
350
287
 
351
288
  // eslint-disable-next-line camelcase
352
- async aztec_prv_getHashPreimage(foreignHash: ForeignCallSingle) {
353
- const hash = fromSingle(foreignHash);
354
-
355
- const returns = await this.handlerAsPrivate().getHashPreimage(hash);
356
-
357
- return toForeignCallResult([toArray(returns)]);
289
+ aztec_txe_getPrivateEvents(...inputs: ForeignCallArgs) {
290
+ return callTxeHandler({
291
+ oracle: 'aztec_txe_getPrivateEvents',
292
+ inputs,
293
+ handler: ([selector, contractAddress, scope]) =>
294
+ this.stateHandler.getPrivateEvents(selector, contractAddress, scope),
295
+ });
358
296
  }
359
297
 
360
- // When the argument is a slice, noir automatically adds a length field to oracle call.
361
- // When the argument is an array, we add the field length manually to the signature.
362
298
  // eslint-disable-next-line camelcase
363
- async aztec_utl_log(
364
- foreignLevel: ForeignCallSingle,
365
- foreignMessage: ForeignCallArray,
366
- _foreignLength: ForeignCallSingle,
367
- foreignFields: ForeignCallArray,
368
- ) {
369
- const level = fromSingle(foreignLevel).toNumber();
370
- const message = fromArray(foreignMessage)
371
- .map(field => String.fromCharCode(field.toNumber()))
372
- .join('');
373
- const fields = fromArray(foreignFields);
374
-
375
- await this.handlerAsMisc().log(level, message, fields);
376
-
377
- return toForeignCallResult([]);
299
+ aztec_prv_setHashPreimage(...inputs: ForeignCallArgs) {
300
+ return callTxeHandler({
301
+ oracle: 'aztec_prv_setHashPreimage',
302
+ inputs,
303
+ handler: ([values, hash]) => this.handlerAsPrivate().setHashPreimage(values, hash),
304
+ });
378
305
  }
379
306
 
380
307
  // eslint-disable-next-line camelcase
381
- async aztec_utl_getFromPublicStorage(
382
- foreignBlockHash: ForeignCallSingle,
383
- foreignContractAddress: ForeignCallSingle,
384
- foreignStartStorageSlot: ForeignCallSingle,
385
- foreignNumberOfElements: ForeignCallSingle,
386
- ) {
387
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
388
- const contractAddress = addressFromSingle(foreignContractAddress);
389
- const startStorageSlot = fromSingle(foreignStartStorageSlot);
390
- const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
391
-
392
- const values = await this.handlerAsUtility().getFromPublicStorage(
393
- blockHash,
394
- contractAddress,
395
- startStorageSlot,
396
- numberOfElements,
397
- );
398
-
399
- return toForeignCallResult([toArray(values)]);
308
+ aztec_prv_getHashPreimage(...inputs: ForeignCallArgs) {
309
+ return callTxeHandler({
310
+ oracle: 'aztec_prv_getHashPreimage',
311
+ inputs,
312
+ handler: ([hash]) => this.handlerAsPrivate().getHashPreimage(hash),
313
+ });
400
314
  }
401
315
 
402
316
  // eslint-disable-next-line camelcase
403
- async aztec_utl_getPublicDataWitness(foreignBlockHash: ForeignCallSingle, foreignLeafSlot: ForeignCallSingle) {
404
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
405
- const leafSlot = fromSingle(foreignLeafSlot);
406
-
407
- const witness = await this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot);
408
-
409
- if (!witness) {
410
- throw new Error(`Public data witness not found for slot ${leafSlot} at block ${blockHash.toString()}.`);
411
- }
412
- return toForeignCallResult(witness.toNoirRepresentation());
413
- }
414
-
415
- // eslint-disable-next-line camelcase
416
- async aztec_utl_getNotes(
417
- foreignOwnerIsSome: ForeignCallSingle,
418
- foreignOwnerValue: ForeignCallSingle,
419
- foreignStorageSlot: ForeignCallSingle,
420
- foreignNumSelects: ForeignCallSingle,
421
- foreignSelectByIndexes: ForeignCallArray,
422
- foreignSelectByOffsets: ForeignCallArray,
423
- foreignSelectByLengths: ForeignCallArray,
424
- foreignSelectValues: ForeignCallArray,
425
- foreignSelectComparators: ForeignCallArray,
426
- foreignSortByIndexes: ForeignCallArray,
427
- foreignSortByOffsets: ForeignCallArray,
428
- foreignSortByLengths: ForeignCallArray,
429
- foreignSortOrder: ForeignCallArray,
430
- foreignLimit: ForeignCallSingle,
431
- foreignOffset: ForeignCallSingle,
432
- foreignStatus: ForeignCallSingle,
433
- foreignMaxNotes: ForeignCallSingle,
434
- foreignPackedHintedNoteLength: ForeignCallSingle,
435
- ) {
436
- // Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
437
- const owner = fromSingle(foreignOwnerIsSome).toBool()
438
- ? AztecAddress.fromField(fromSingle(foreignOwnerValue))
439
- : undefined;
440
- const storageSlot = fromSingle(foreignStorageSlot);
441
- const numSelects = fromSingle(foreignNumSelects).toNumber();
442
- const selectByIndexes = fromArray(foreignSelectByIndexes).map(fr => fr.toNumber());
443
- const selectByOffsets = fromArray(foreignSelectByOffsets).map(fr => fr.toNumber());
444
- const selectByLengths = fromArray(foreignSelectByLengths).map(fr => fr.toNumber());
445
- const selectValues = fromArray(foreignSelectValues);
446
- const selectComparators = fromArray(foreignSelectComparators).map(fr => fr.toNumber());
447
- const sortByIndexes = fromArray(foreignSortByIndexes).map(fr => fr.toNumber());
448
- const sortByOffsets = fromArray(foreignSortByOffsets).map(fr => fr.toNumber());
449
- const sortByLengths = fromArray(foreignSortByLengths).map(fr => fr.toNumber());
450
- const sortOrder = fromArray(foreignSortOrder).map(fr => fr.toNumber());
451
- const limit = fromSingle(foreignLimit).toNumber();
452
- const offset = fromSingle(foreignOffset).toNumber();
453
- const status = fromSingle(foreignStatus).toNumber();
454
- const maxNotes = fromSingle(foreignMaxNotes).toNumber();
455
- const packedHintedNoteLength = fromSingle(foreignPackedHintedNoteLength).toNumber();
456
-
457
- const noteDatas = await this.handlerAsUtility().getNotes(
458
- owner,
459
- storageSlot,
460
- numSelects,
461
- selectByIndexes,
462
- selectByOffsets,
463
- selectByLengths,
464
- selectValues,
465
- selectComparators,
466
- sortByIndexes,
467
- sortByOffsets,
468
- sortByLengths,
469
- sortOrder,
470
- limit,
471
- offset,
472
- status,
473
- );
474
-
475
- const returnDataAsArrayOfArrays = noteDatas.map(noteData =>
476
- packAsHintedNote({
477
- contractAddress: noteData.contractAddress,
478
- owner: noteData.owner,
479
- randomness: noteData.randomness,
480
- storageSlot: noteData.storageSlot,
481
- noteNonce: noteData.noteNonce,
482
- isPending: noteData.isPending,
483
- note: noteData.note,
484
- }),
485
- );
486
-
487
- // Now we convert each sub-array to an array of ForeignCallSingles
488
- const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map(subArray =>
489
- subArray.map(toSingle),
490
- );
491
-
492
- // At last we convert the array of arrays to a bounded vec of arrays
493
- return toForeignCallResult(
494
- arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength),
495
- );
496
- }
497
-
498
- // eslint-disable-next-line camelcase
499
- aztec_prv_notifyCreatedNote(
500
- foreignOwner: ForeignCallSingle,
501
- foreignStorageSlot: ForeignCallSingle,
502
- foreignRandomness: ForeignCallSingle,
503
- foreignNoteTypeId: ForeignCallSingle,
504
- foreignNote: ForeignCallArray,
505
- foreignNoteHash: ForeignCallSingle,
506
- foreignCounter: ForeignCallSingle,
507
- ) {
508
- const owner = addressFromSingle(foreignOwner);
509
- const storageSlot = fromSingle(foreignStorageSlot);
510
- const randomness = fromSingle(foreignRandomness);
511
- const noteTypeId = NoteSelector.fromField(fromSingle(foreignNoteTypeId));
512
- const note = fromArray(foreignNote);
513
- const noteHash = fromSingle(foreignNoteHash);
514
- const counter = fromSingle(foreignCounter).toNumber();
515
-
516
- this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
517
-
518
- return toForeignCallResult([]);
519
- }
520
-
521
- // eslint-disable-next-line camelcase
522
- async aztec_prv_notifyNullifiedNote(
523
- foreignInnerNullifier: ForeignCallSingle,
524
- foreignNoteHash: ForeignCallSingle,
525
- foreignCounter: ForeignCallSingle,
526
- ) {
527
- const innerNullifier = fromSingle(foreignInnerNullifier);
528
- const noteHash = fromSingle(foreignNoteHash);
529
- const counter = fromSingle(foreignCounter).toNumber();
530
-
531
- await this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter);
532
-
533
- return toForeignCallResult([]);
534
- }
535
-
536
- // eslint-disable-next-line camelcase
537
- async aztec_prv_notifyCreatedNullifier(foreignInnerNullifier: ForeignCallSingle) {
538
- const innerNullifier = fromSingle(foreignInnerNullifier);
539
-
540
- await this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier);
541
-
542
- return toForeignCallResult([]);
317
+ aztec_misc_log(...inputs: ForeignCallArgs) {
318
+ return callTxeHandler({
319
+ oracle: 'aztec_misc_log',
320
+ inputs,
321
+ handler: ([level, message, fieldsSize, fields]) => this.handlerAsMisc().log(level, message, fieldsSize, fields),
322
+ });
543
323
  }
544
324
 
545
325
  // eslint-disable-next-line camelcase
546
- async aztec_prv_isNullifierPending(
547
- foreignInnerNullifier: ForeignCallSingle,
548
- foreignContractAddress: ForeignCallSingle,
549
- ) {
550
- const innerNullifier = fromSingle(foreignInnerNullifier);
551
- const contractAddress = addressFromSingle(foreignContractAddress);
552
-
553
- const isPending = await this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress);
554
-
555
- return toForeignCallResult([toSingle(new Fr(isPending))]);
326
+ aztec_utl_getFromPublicStorage(...inputs: ForeignCallArgs) {
327
+ return callTxeHandler({
328
+ oracle: 'aztec_utl_getFromPublicStorage',
329
+ inputs,
330
+ handler: ([blockHash, contractAddress, startStorageSlot, numberOfElements]) =>
331
+ this.handlerAsUtility().getFromPublicStorage(blockHash, contractAddress, startStorageSlot, numberOfElements),
332
+ });
556
333
  }
557
334
 
558
335
  // eslint-disable-next-line camelcase
559
- async aztec_utl_doesNullifierExist(foreignInnerNullifier: ForeignCallSingle) {
560
- const innerNullifier = fromSingle(foreignInnerNullifier);
561
-
562
- const exists = await this.handlerAsUtility().doesNullifierExist(innerNullifier);
563
-
564
- return toForeignCallResult([toSingle(new Fr(exists))]);
336
+ aztec_utl_getPublicDataWitness(...inputs: ForeignCallArgs) {
337
+ return callTxeHandler({
338
+ oracle: 'aztec_utl_getPublicDataWitness',
339
+ inputs,
340
+ handler: ([blockHash, leafSlot]) => this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot),
341
+ });
565
342
  }
566
343
 
567
344
  // eslint-disable-next-line camelcase
568
- async aztec_utl_getContractInstance(foreignAddress: ForeignCallSingle) {
569
- const address = addressFromSingle(foreignAddress);
345
+ aztec_utl_getNotes(...inputs: ForeignCallArgs) {
346
+ return callTxeHandler({
347
+ oracle: 'aztec_utl_getNotes',
348
+ inputs,
349
+ handler: ([
350
+ owner,
351
+ storageSlot,
352
+ numSelects,
353
+ selectByIndexes,
354
+ selectByOffsets,
355
+ selectByLengths,
356
+ selectValues,
357
+ selectComparators,
358
+ sortByIndexes,
359
+ sortByOffsets,
360
+ sortByLengths,
361
+ sortOrder,
362
+ limit,
363
+ offset,
364
+ status,
365
+ maxNotes,
366
+ packedHintedNoteLength,
367
+ ]) =>
368
+ this.handlerAsUtility().getNotes(
369
+ owner,
370
+ storageSlot,
371
+ numSelects,
372
+ selectByIndexes,
373
+ selectByOffsets,
374
+ selectByLengths,
375
+ selectValues,
376
+ selectComparators,
377
+ sortByIndexes,
378
+ sortByOffsets,
379
+ sortByLengths,
380
+ sortOrder,
381
+ limit,
382
+ offset,
383
+ status,
384
+ maxNotes,
385
+ packedHintedNoteLength,
386
+ ),
387
+ });
388
+ }
570
389
 
571
- const instance = await this.handlerAsUtility().getContractInstance(address);
390
+ // eslint-disable-next-line camelcase
391
+ aztec_prv_notifyCreatedNote(...inputs: ForeignCallArgs) {
392
+ return callTxeHandler({
393
+ oracle: 'aztec_prv_notifyCreatedNote',
394
+ inputs,
395
+ handler: ([owner, storageSlot, randomness, noteTypeId, note, noteHash, counter]) =>
396
+ this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter),
397
+ });
398
+ }
572
399
 
573
- return toForeignCallResult(
574
- [
575
- instance.salt,
576
- instance.deployer.toField(),
577
- instance.currentContractClassId,
578
- instance.initializationHash,
579
- ...instance.publicKeys.toFields(),
580
- ].map(toSingle),
581
- );
400
+ // eslint-disable-next-line camelcase
401
+ aztec_prv_notifyNullifiedNote(...inputs: ForeignCallArgs) {
402
+ return callTxeHandler({
403
+ oracle: 'aztec_prv_notifyNullifiedNote',
404
+ inputs,
405
+ handler: ([innerNullifier, noteHash, counter]) =>
406
+ this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter),
407
+ });
582
408
  }
583
409
 
584
410
  // eslint-disable-next-line camelcase
585
- async aztec_utl_getPublicKeysAndPartialAddress(foreignAddress: ForeignCallSingle) {
586
- const address = addressFromSingle(foreignAddress);
411
+ aztec_prv_notifyCreatedNullifier(...inputs: ForeignCallArgs) {
412
+ return callTxeHandler({
413
+ oracle: 'aztec_prv_notifyCreatedNullifier',
414
+ inputs,
415
+ handler: ([innerNullifier]) => this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier),
416
+ });
417
+ }
587
418
 
588
- const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(address);
419
+ // eslint-disable-next-line camelcase
420
+ aztec_prv_isNullifierPending(...inputs: ForeignCallArgs) {
421
+ return callTxeHandler({
422
+ oracle: 'aztec_prv_isNullifierPending',
423
+ inputs,
424
+ handler: ([innerNullifier, contractAddress]) =>
425
+ this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress),
426
+ });
427
+ }
589
428
 
590
- // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
591
- // with two fields: `some` (a boolean) and `value` (a field array in this case).
592
- if (result === undefined) {
593
- // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
594
- return toForeignCallResult([toSingle(new Fr(0)), toArray(Array(13).fill(new Fr(0)))]);
595
- } else {
596
- // Data was found so we set `some` to 1 and return it along with `value`.
597
- return toForeignCallResult([
598
- toSingle(new Fr(1)),
599
- toArray([...result.publicKeys.toFields(), result.partialAddress]),
600
- ]);
601
- }
429
+ // eslint-disable-next-line camelcase
430
+ aztec_utl_doesNullifierExist(...inputs: ForeignCallArgs) {
431
+ return callTxeHandler({
432
+ oracle: 'aztec_utl_doesNullifierExist',
433
+ inputs,
434
+ handler: ([innerNullifier]) => this.handlerAsUtility().doesNullifierExist(innerNullifier),
435
+ });
602
436
  }
603
437
 
604
438
  // eslint-disable-next-line camelcase
605
- async aztec_utl_getKeyValidationRequest(foreignPkMHash: ForeignCallSingle) {
606
- const pkMHash = fromSingle(foreignPkMHash);
439
+ aztec_utl_getContractInstance(...inputs: ForeignCallArgs) {
440
+ return callTxeHandler({
441
+ oracle: 'aztec_utl_getContractInstance',
442
+ inputs,
443
+ handler: ([address]) => this.handlerAsUtility().getContractInstance(address),
444
+ });
445
+ }
607
446
 
608
- const keyValidationRequest = await this.handlerAsUtility().getKeyValidationRequest(pkMHash);
447
+ // eslint-disable-next-line camelcase
448
+ aztec_utl_getPublicKeysAndPartialAddress(...inputs: ForeignCallArgs) {
449
+ return callTxeHandler({
450
+ oracle: 'aztec_utl_getPublicKeysAndPartialAddress',
451
+ inputs,
452
+ handler: ([address]) => this.handlerAsUtility().getPublicKeysAndPartialAddress(address),
453
+ });
454
+ }
609
455
 
610
- return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
456
+ // eslint-disable-next-line camelcase
457
+ aztec_utl_getKeyValidationRequest(...inputs: ForeignCallArgs) {
458
+ return callTxeHandler({
459
+ oracle: 'aztec_utl_getKeyValidationRequest',
460
+ inputs,
461
+ handler: ([pkMHash, keyIndex]) => this.handlerAsUtility().getKeyValidationRequest(pkMHash, keyIndex),
462
+ });
611
463
  }
612
464
 
613
465
  // eslint-disable-next-line camelcase
614
- aztec_prv_callPrivateFunction(
615
- _foreignTargetContractAddress: ForeignCallSingle,
616
- _foreignFunctionSelector: ForeignCallSingle,
617
- _foreignArgsHash: ForeignCallSingle,
618
- _foreignSideEffectCounter: ForeignCallSingle,
619
- _foreignIsStaticCall: ForeignCallSingle,
620
- ) {
621
- throw new Error(
622
- 'Contract calls are forbidden inside a `TestEnvironment::private_context`, use `private_call` instead',
623
- );
466
+ aztec_prv_callPrivateFunction(...inputs: ForeignCallArgs) {
467
+ return callTxeHandler({
468
+ oracle: 'aztec_prv_callPrivateFunction',
469
+ inputs,
470
+ handler: ([contractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall]) =>
471
+ this.handlerAsPrivate().callPrivateFunction(
472
+ contractAddress,
473
+ functionSelector,
474
+ argsHash,
475
+ sideEffectCounter,
476
+ isStaticCall,
477
+ ),
478
+ });
624
479
  }
625
480
 
626
481
  // eslint-disable-next-line camelcase
627
- async aztec_utl_getNullifierMembershipWitness(
628
- foreignBlockHash: ForeignCallSingle,
629
- foreignNullifier: ForeignCallSingle,
630
- ) {
631
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
632
- const nullifier = fromSingle(foreignNullifier);
482
+ aztec_utl_getNullifierMembershipWitness(...inputs: ForeignCallArgs) {
483
+ return callTxeHandler({
484
+ oracle: 'aztec_utl_getNullifierMembershipWitness',
485
+ inputs,
486
+ handler: ([blockHash, nullifier]) => this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier),
487
+ });
488
+ }
633
489
 
634
- const witness = await this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier);
490
+ // eslint-disable-next-line camelcase
491
+ aztec_utl_getL1ToL2MembershipWitness(...inputs: ForeignCallArgs) {
492
+ return callTxeHandler({
493
+ oracle: 'aztec_utl_getL1ToL2MembershipWitness',
494
+ inputs,
495
+ handler: ([contractAddress, messageHash, secret]) =>
496
+ this.handlerAsUtility().getL1ToL2MembershipWitness(contractAddress, messageHash, secret),
497
+ });
498
+ }
635
499
 
636
- if (!witness) {
637
- throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
638
- }
639
- return toForeignCallResult(witness.toNoirRepresentation());
500
+ // eslint-disable-next-line camelcase
501
+ aztec_utl_getAuthWitness(...inputs: ForeignCallArgs) {
502
+ return callTxeHandler({
503
+ oracle: 'aztec_utl_getAuthWitness',
504
+ inputs,
505
+ handler: ([messageHash]) => this.handlerAsUtility().getAuthWitness(messageHash),
506
+ });
640
507
  }
641
508
 
642
509
  // eslint-disable-next-line camelcase
643
- async aztec_utl_getAuthWitness(foreignMessageHash: ForeignCallSingle) {
644
- const messageHash = fromSingle(foreignMessageHash);
510
+ aztec_prv_assertValidPublicCalldata(...inputs: ForeignCallArgs) {
511
+ return callTxeHandler({
512
+ oracle: 'aztec_prv_assertValidPublicCalldata',
513
+ inputs,
514
+ handler: ([calldataHash]) => this.handlerAsPrivate().assertValidPublicCalldata(calldataHash),
515
+ });
516
+ }
645
517
 
646
- const authWitness = await this.handlerAsUtility().getAuthWitness(messageHash);
518
+ // eslint-disable-next-line camelcase
519
+ aztec_prv_notifyRevertiblePhaseStart(...inputs: ForeignCallArgs) {
520
+ return callTxeHandler({
521
+ oracle: 'aztec_prv_notifyRevertiblePhaseStart',
522
+ inputs,
523
+ handler: ([minRevertibleSideEffectCounter]) =>
524
+ this.handlerAsPrivate().notifyRevertiblePhaseStart(minRevertibleSideEffectCounter),
525
+ });
526
+ }
647
527
 
648
- if (!authWitness) {
649
- throw new Error(`Auth witness not found for message hash ${messageHash}.`);
650
- }
651
- return toForeignCallResult([toArray(authWitness)]);
528
+ // eslint-disable-next-line camelcase
529
+ aztec_prv_isExecutionInRevertiblePhase(...inputs: ForeignCallArgs) {
530
+ return callTxeHandler({
531
+ oracle: 'aztec_prv_isExecutionInRevertiblePhase',
532
+ inputs,
533
+ handler: ([sideEffectCounter]) => this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter),
534
+ });
652
535
  }
653
536
 
654
537
  // eslint-disable-next-line camelcase
655
- public aztec_prv_assertValidPublicCalldata(_foreignCalldataHash: ForeignCallSingle) {
656
- throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
538
+ aztec_utl_getUtilityContext() {
539
+ return callTxeHandler({
540
+ oracle: 'aztec_utl_getUtilityContext',
541
+ inputs: [],
542
+ handler: () => this.handlerAsUtility().getUtilityContext(),
543
+ });
657
544
  }
658
545
 
659
546
  // eslint-disable-next-line camelcase
660
- public aztec_prv_notifyRevertiblePhaseStart(_foreignMinRevertibleSideEffectCounter: ForeignCallSingle) {
661
- throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
547
+ aztec_utl_getBlockHeader(...inputs: ForeignCallArgs) {
548
+ return callTxeHandler({
549
+ oracle: 'aztec_utl_getBlockHeader',
550
+ inputs,
551
+ handler: ([blockNumber]) => this.handlerAsUtility().getBlockHeader(blockNumber),
552
+ });
662
553
  }
663
554
 
664
555
  // eslint-disable-next-line camelcase
665
- public async aztec_prv_isExecutionInRevertiblePhase(foreignSideEffectCounter: ForeignCallSingle) {
666
- const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
667
- const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter);
668
- return toForeignCallResult([toSingle(new Fr(isRevertible))]);
556
+ aztec_utl_getNoteHashMembershipWitness(...inputs: ForeignCallArgs) {
557
+ return callTxeHandler({
558
+ oracle: 'aztec_utl_getNoteHashMembershipWitness',
559
+ inputs,
560
+ handler: ([blockHash, noteHash]) => this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash),
561
+ });
669
562
  }
670
563
 
671
564
  // eslint-disable-next-line camelcase
672
- aztec_utl_getUtilityContext() {
673
- const context = this.handlerAsUtility().getUtilityContext();
565
+ aztec_utl_getBlockHashMembershipWitness(...inputs: ForeignCallArgs) {
566
+ return callTxeHandler({
567
+ oracle: 'aztec_utl_getBlockHashMembershipWitness',
568
+ inputs,
569
+ handler: ([anchorBlockHash, blockHash]) =>
570
+ this.handlerAsUtility().getBlockHashMembershipWitness(anchorBlockHash, blockHash),
571
+ });
572
+ }
674
573
 
675
- return toForeignCallResult(context.toNoirRepresentation());
574
+ // eslint-disable-next-line camelcase
575
+ aztec_utl_getLowNullifierMembershipWitness(...inputs: ForeignCallArgs) {
576
+ return callTxeHandler({
577
+ oracle: 'aztec_utl_getLowNullifierMembershipWitness',
578
+ inputs,
579
+ handler: ([blockHash, nullifier]) =>
580
+ this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier),
581
+ });
676
582
  }
677
583
 
678
584
  // eslint-disable-next-line camelcase
679
- async aztec_utl_getBlockHeader(foreignBlockNumber: ForeignCallSingle) {
680
- const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
585
+ aztec_utl_getPendingTaggedLogsV2(...inputs: ForeignCallArgs) {
586
+ return callTxeHandler({
587
+ oracle: 'aztec_utl_getPendingTaggedLogsV2',
588
+ inputs,
589
+ handler: ([scope, providedSecrets]) => this.handlerAsUtility().getPendingTaggedLogsV2(scope, providedSecrets),
590
+ });
591
+ }
681
592
 
682
- const header = await this.handlerAsUtility().getBlockHeader(blockNumber);
593
+ // eslint-disable-next-line camelcase
594
+ aztec_utl_validateAndStoreEnqueuedNotesAndEvents(...inputs: ForeignCallArgs) {
595
+ return callTxeHandler({
596
+ oracle: 'aztec_utl_validateAndStoreEnqueuedNotesAndEvents',
597
+ inputs,
598
+ handler: ([noteValidationRequests, eventValidationRequests, scope]) =>
599
+ this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(
600
+ noteValidationRequests,
601
+ eventValidationRequests,
602
+ scope,
603
+ ),
604
+ });
605
+ }
683
606
 
684
- if (!header) {
685
- throw new Error(`Block header not found for block ${blockNumber}.`);
686
- }
687
- return toForeignCallResult(header.toFields().map(toSingle));
607
+ // eslint-disable-next-line camelcase
608
+ aztec_utl_getLogsByTagV2(...inputs: ForeignCallArgs) {
609
+ return callTxeHandler({
610
+ oracle: 'aztec_utl_getLogsByTagV2',
611
+ inputs,
612
+ handler: ([requestArrayBaseSlot]) => this.handlerAsUtility().getLogsByTagV2(requestArrayBaseSlot),
613
+ });
688
614
  }
689
615
 
690
616
  // eslint-disable-next-line camelcase
691
- async aztec_utl_getNoteHashMembershipWitness(
692
- foreignAnchorBlockHash: ForeignCallSingle,
693
- foreignNoteHash: ForeignCallSingle,
694
- ) {
695
- const blockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
696
- const noteHash = fromSingle(foreignNoteHash);
617
+ aztec_utl_getResolvedTxs(...inputs: ForeignCallArgs) {
618
+ return callTxeHandler({
619
+ oracle: 'aztec_utl_getResolvedTxs',
620
+ inputs,
621
+ handler: ([requestArrayBaseSlot]) => this.handlerAsUtility().getResolvedTxs(requestArrayBaseSlot),
622
+ });
623
+ }
697
624
 
698
- const witness = await this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash);
625
+ // eslint-disable-next-line camelcase
626
+ aztec_utl_setCapsule(...inputs: ForeignCallArgs) {
627
+ return callTxeHandler({
628
+ oracle: 'aztec_utl_setCapsule',
629
+ inputs,
630
+ handler: ([contractAddress, slot, capsule, scope]) =>
631
+ this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope),
632
+ });
633
+ }
699
634
 
700
- if (!witness) {
701
- throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
702
- }
703
- return toForeignCallResult(witness.toNoirRepresentation());
635
+ // eslint-disable-next-line camelcase
636
+ aztec_utl_getCapsule(...inputs: ForeignCallArgs) {
637
+ return callTxeHandler({
638
+ oracle: 'aztec_utl_getCapsule',
639
+ inputs,
640
+ handler: ([contractAddress, slot, tSize, scope]) =>
641
+ this.handlerAsUtility().getCapsule(contractAddress, slot, tSize, scope),
642
+ });
704
643
  }
705
644
 
706
645
  // eslint-disable-next-line camelcase
707
- async aztec_utl_getBlockHashMembershipWitness(
708
- foreignAnchorBlockHash: ForeignCallSingle,
709
- foreignBlockHash: ForeignCallSingle,
710
- ) {
711
- const anchorBlockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
712
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
646
+ aztec_utl_deleteCapsule(...inputs: ForeignCallArgs) {
647
+ return callTxeHandler({
648
+ oracle: 'aztec_utl_deleteCapsule',
649
+ inputs,
650
+ handler: ([contractAddress, slot, scope]) => this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope),
651
+ });
652
+ }
713
653
 
714
- const witness = await this.handlerAsUtility().getBlockHashMembershipWitness(anchorBlockHash, blockHash);
654
+ // eslint-disable-next-line camelcase
655
+ aztec_utl_copyCapsule(...inputs: ForeignCallArgs) {
656
+ return callTxeHandler({
657
+ oracle: 'aztec_utl_copyCapsule',
658
+ inputs,
659
+ handler: ([contractAddress, srcSlot, dstSlot, numEntries, scope]) =>
660
+ this.handlerAsUtility().copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, scope),
661
+ });
662
+ }
715
663
 
716
- if (!witness) {
717
- throw new Error(
718
- `Block hash ${blockHash.toString()} not found in the archive tree at anchor block ${anchorBlockHash.toString()}.`,
719
- );
720
- }
721
- return toForeignCallResult(witness.toNoirRepresentation());
664
+ // eslint-disable-next-line camelcase
665
+ aztec_utl_pushEphemeral(...inputs: ForeignCallArgs) {
666
+ return callTxeHandler({
667
+ oracle: 'aztec_utl_pushEphemeral',
668
+ inputs,
669
+ handler: ([slot, elements]) => this.handlerAsUtility().pushEphemeral(slot, elements),
670
+ });
722
671
  }
723
672
 
724
673
  // eslint-disable-next-line camelcase
725
- async aztec_utl_getLowNullifierMembershipWitness(
726
- foreignBlockHash: ForeignCallSingle,
727
- foreignNullifier: ForeignCallSingle,
728
- ) {
729
- const blockHash = new BlockHash(fromSingle(foreignBlockHash));
730
- const nullifier = fromSingle(foreignNullifier);
674
+ aztec_utl_popEphemeral(...inputs: ForeignCallArgs) {
675
+ return callTxeHandler({
676
+ oracle: 'aztec_utl_popEphemeral',
677
+ inputs,
678
+ handler: ([slot]) => this.handlerAsUtility().popEphemeral(slot),
679
+ });
680
+ }
731
681
 
732
- const witness = await this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier);
682
+ // eslint-disable-next-line camelcase
683
+ aztec_utl_getEphemeral(...inputs: ForeignCallArgs) {
684
+ return callTxeHandler({
685
+ oracle: 'aztec_utl_getEphemeral',
686
+ inputs,
687
+ handler: ([slot, index]) => this.handlerAsUtility().getEphemeral(slot, index),
688
+ });
689
+ }
733
690
 
734
- if (!witness) {
735
- throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${blockHash}.`);
736
- }
737
- return toForeignCallResult(witness.toNoirRepresentation());
691
+ // eslint-disable-next-line camelcase
692
+ aztec_utl_setEphemeral(...inputs: ForeignCallArgs) {
693
+ return callTxeHandler({
694
+ oracle: 'aztec_utl_setEphemeral',
695
+ inputs,
696
+ handler: ([slot, index, elements]) => this.handlerAsUtility().setEphemeral(slot, index, elements),
697
+ });
738
698
  }
739
699
 
740
700
  // eslint-disable-next-line camelcase
741
- async aztec_utl_getPendingTaggedLogs(
742
- foreignPendingTaggedLogArrayBaseSlot: ForeignCallSingle,
743
- foreignScope: ForeignCallSingle,
744
- ) {
745
- const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
746
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
701
+ aztec_utl_getEphemeralLen(...inputs: ForeignCallArgs) {
702
+ return callTxeHandler({
703
+ oracle: 'aztec_utl_getEphemeralLen',
704
+ inputs,
705
+ handler: ([slot]) => this.handlerAsUtility().getEphemeralLen(slot),
706
+ });
707
+ }
747
708
 
748
- await this.handlerAsUtility().getPendingTaggedLogs(pendingTaggedLogArrayBaseSlot, scope);
709
+ // eslint-disable-next-line camelcase
710
+ aztec_utl_removeEphemeral(...inputs: ForeignCallArgs) {
711
+ return callTxeHandler({
712
+ oracle: 'aztec_utl_removeEphemeral',
713
+ inputs,
714
+ handler: ([slot, index]) => this.handlerAsUtility().removeEphemeral(slot, index),
715
+ });
716
+ }
749
717
 
750
- return toForeignCallResult([]);
718
+ // eslint-disable-next-line camelcase
719
+ aztec_utl_clearEphemeral(...inputs: ForeignCallArgs) {
720
+ return callTxeHandler({
721
+ oracle: 'aztec_utl_clearEphemeral',
722
+ inputs,
723
+ handler: ([slot]) => this.handlerAsUtility().clearEphemeral(slot),
724
+ });
751
725
  }
752
-
726
+
753
727
  // eslint-disable-next-line camelcase
754
- public async aztec_utl_validateAndStoreEnqueuedNotesAndEvents(
755
- foreignContractAddress: ForeignCallSingle,
756
- foreignNoteValidationRequestsArrayBaseSlot: ForeignCallSingle,
757
- foreignEventValidationRequestsArrayBaseSlot: ForeignCallSingle,
758
- foreignMaxNotePackedLen: ForeignCallSingle,
759
- foreignMaxEventSerializedLen: ForeignCallSingle,
760
- foreignScope: ForeignCallSingle,
761
- ) {
762
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
763
- const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
764
- const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
765
- const maxNotePackedLen = fromSingle(foreignMaxNotePackedLen).toNumber();
766
- const maxEventSerializedLen = fromSingle(foreignMaxEventSerializedLen).toNumber();
767
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
768
-
769
- await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(
770
- contractAddress,
771
- noteValidationRequestsArrayBaseSlot,
772
- eventValidationRequestsArrayBaseSlot,
773
- maxNotePackedLen,
774
- maxEventSerializedLen,
775
- scope,
776
- );
777
-
778
- return toForeignCallResult([]);
779
- }
780
-
781
- // eslint-disable-next-line camelcase
782
- public async aztec_utl_getLogsByTag(
783
- foreignContractAddress: ForeignCallSingle,
784
- foreignLogRetrievalRequestsArrayBaseSlot: ForeignCallSingle,
785
- foreignLogRetrievalResponsesArrayBaseSlot: ForeignCallSingle,
786
- foreignScope: ForeignCallSingle,
787
- ) {
788
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
789
- const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
790
- const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
791
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
792
-
793
- await this.handlerAsUtility().getLogsByTag(
794
- contractAddress,
795
- logRetrievalRequestsArrayBaseSlot,
796
- logRetrievalResponsesArrayBaseSlot,
797
- scope,
798
- );
799
-
800
- return toForeignCallResult([]);
801
- }
802
-
803
- // eslint-disable-next-line camelcase
804
- public async aztec_utl_getMessageContextsByTxHash(
805
- foreignContractAddress: ForeignCallSingle,
806
- foreignMessageContextRequestsArrayBaseSlot: ForeignCallSingle,
807
- foreignMessageContextResponsesArrayBaseSlot: ForeignCallSingle,
808
- foreignScope: ForeignCallSingle,
809
- ) {
810
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
811
- const messageContextRequestsArrayBaseSlot = fromSingle(foreignMessageContextRequestsArrayBaseSlot);
812
- const messageContextResponsesArrayBaseSlot = fromSingle(foreignMessageContextResponsesArrayBaseSlot);
813
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
814
-
815
- await this.handlerAsUtility().getMessageContextsByTxHash(
816
- contractAddress,
817
- messageContextRequestsArrayBaseSlot,
818
- messageContextResponsesArrayBaseSlot,
819
- scope,
820
- );
821
-
822
- return toForeignCallResult([]);
823
- }
824
-
825
- // eslint-disable-next-line camelcase
826
- aztec_utl_setCapsule(
827
- foreignContractAddress: ForeignCallSingle,
828
- foreignSlot: ForeignCallSingle,
829
- foreignCapsule: ForeignCallArray,
830
- foreignScope: ForeignCallSingle,
831
- ) {
832
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
833
- const slot = fromSingle(foreignSlot);
834
- const capsule = fromArray(foreignCapsule);
835
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
836
-
837
- this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope);
838
-
839
- return toForeignCallResult([]);
840
- }
841
-
842
- // eslint-disable-next-line camelcase
843
- async aztec_utl_getCapsule(
844
- foreignContractAddress: ForeignCallSingle,
845
- foreignSlot: ForeignCallSingle,
846
- foreignTSize: ForeignCallSingle,
847
- foreignScope: ForeignCallSingle,
848
- ) {
849
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
850
- const slot = fromSingle(foreignSlot);
851
- const tSize = fromSingle(foreignTSize).toNumber();
852
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
853
-
854
- const values = await this.handlerAsUtility().getCapsule(contractAddress, slot, scope);
855
-
856
- // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
857
- // with two fields: `some` (a boolean) and `value` (a field array in this case).
858
- if (values === null) {
859
- // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
860
- return toForeignCallResult([toSingle(new Fr(0)), toArray(Array(tSize).fill(new Fr(0)))]);
861
- } else {
862
- // Data was found so we set `some` to 1 and return it along with `value`.
863
- return toForeignCallResult([toSingle(new Fr(1)), toArray(values)]);
864
- }
728
+ aztec_utl_pushTransient(...inputs: ForeignCallArgs) {
729
+ return callTxeHandler({
730
+ oracle: 'aztec_utl_pushTransient',
731
+ inputs,
732
+ handler: ([slot, elements]) => this.handlerAsUtility().pushTransient(slot, elements),
733
+ });
865
734
  }
866
735
 
867
736
  // eslint-disable-next-line camelcase
868
- aztec_utl_deleteCapsule(
869
- foreignContractAddress: ForeignCallSingle,
870
- foreignSlot: ForeignCallSingle,
871
- foreignScope: ForeignCallSingle,
872
- ) {
873
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
874
- const slot = fromSingle(foreignSlot);
875
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
737
+ aztec_utl_popTransient(...inputs: ForeignCallArgs) {
738
+ return callTxeHandler({
739
+ oracle: 'aztec_utl_popTransient',
740
+ inputs,
741
+ handler: ([slot]) => this.handlerAsUtility().popTransient(slot),
742
+ });
743
+ }
876
744
 
877
- this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope);
745
+ // eslint-disable-next-line camelcase
746
+ aztec_utl_getTransient(...inputs: ForeignCallArgs) {
747
+ return callTxeHandler({
748
+ oracle: 'aztec_utl_getTransient',
749
+ inputs,
750
+ handler: ([slot, index]) => this.handlerAsUtility().getTransient(slot, index),
751
+ });
752
+ }
878
753
 
879
- return toForeignCallResult([]);
754
+ // eslint-disable-next-line camelcase
755
+ aztec_utl_setTransient(...inputs: ForeignCallArgs) {
756
+ return callTxeHandler({
757
+ oracle: 'aztec_utl_setTransient',
758
+ inputs,
759
+ handler: ([slot, index, elements]) => this.handlerAsUtility().setTransient(slot, index, elements),
760
+ });
880
761
  }
881
762
 
882
763
  // eslint-disable-next-line camelcase
883
- async aztec_utl_copyCapsule(
884
- foreignContractAddress: ForeignCallSingle,
885
- foreignSrcSlot: ForeignCallSingle,
886
- foreignDstSlot: ForeignCallSingle,
887
- foreignNumEntries: ForeignCallSingle,
888
- foreignScope: ForeignCallSingle,
889
- ) {
890
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
891
- const srcSlot = fromSingle(foreignSrcSlot);
892
- const dstSlot = fromSingle(foreignDstSlot);
893
- const numEntries = fromSingle(foreignNumEntries).toNumber();
894
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
764
+ aztec_utl_getTransientLen(...inputs: ForeignCallArgs) {
765
+ return callTxeHandler({
766
+ oracle: 'aztec_utl_getTransientLen',
767
+ inputs,
768
+ handler: ([slot]) => this.handlerAsUtility().getTransientLen(slot),
769
+ });
770
+ }
895
771
 
896
- await this.handlerAsUtility().copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, scope);
772
+ // eslint-disable-next-line camelcase
773
+ aztec_utl_removeTransient(...inputs: ForeignCallArgs) {
774
+ return callTxeHandler({
775
+ oracle: 'aztec_utl_removeTransient',
776
+ inputs,
777
+ handler: ([slot, index]) => this.handlerAsUtility().removeTransient(slot, index),
778
+ });
779
+ }
897
780
 
898
- return toForeignCallResult([]);
781
+ // eslint-disable-next-line camelcase
782
+ aztec_utl_clearTransient(...inputs: ForeignCallArgs) {
783
+ return callTxeHandler({
784
+ oracle: 'aztec_utl_clearTransient',
785
+ inputs,
786
+ handler: ([slot]) => this.handlerAsUtility().clearTransient(slot),
787
+ });
899
788
  }
900
789
 
901
790
  // TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
@@ -903,365 +792,399 @@ export class RPCTranslator {
903
792
  // to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
904
793
  // existence of a txe_oracle method?
905
794
  // eslint-disable-next-line camelcase
906
- async aztec_utl_decryptAes128(
907
- foreignCiphertextBVecStorage: ForeignCallArray,
908
- foreignCiphertextLength: ForeignCallSingle,
909
- foreignIv: ForeignCallArray,
910
- foreignSymKey: ForeignCallArray,
911
- ) {
912
- const ciphertext = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
913
- const iv = fromUintArray(foreignIv, 8);
914
- const symKey = fromUintArray(foreignSymKey, 8);
915
-
916
- // Noir Option<BoundedVec> is encoded as [is_some: Field, storage: Field[], length: Field].
917
- try {
918
- const plaintextBuffer = await this.handlerAsUtility().decryptAes128(ciphertext, iv, symKey);
919
- const [storage, length] = arrayToBoundedVec(
920
- bufferToU8Array(plaintextBuffer),
921
- foreignCiphertextBVecStorage.length,
922
- );
923
- return toForeignCallResult([toSingle(new Fr(1)), storage, length]);
924
- } catch {
925
- const zeroStorage = toArray(Array(foreignCiphertextBVecStorage.length).fill(new Fr(0)));
926
- return toForeignCallResult([toSingle(new Fr(0)), zeroStorage, toSingle(new Fr(0))]);
927
- }
795
+ aztec_utl_decryptAes128(...inputs: ForeignCallArgs) {
796
+ return callTxeHandler({
797
+ oracle: 'aztec_utl_decryptAes128',
798
+ inputs,
799
+ handler: ([ciphertext, iv, symKey]) => this.handlerAsUtility().decryptAes128(ciphertext, iv, symKey),
800
+ });
928
801
  }
929
802
 
930
803
  // eslint-disable-next-line camelcase
931
- async aztec_utl_getSharedSecret(
932
- foreignAddress: ForeignCallSingle,
933
- foreignEphPKField0: ForeignCallSingle,
934
- foreignEphPKField1: ForeignCallSingle,
935
- foreignEphPKField2: ForeignCallSingle,
936
- foreignContractAddress: ForeignCallSingle,
937
- ) {
938
- const address = AztecAddress.fromField(fromSingle(foreignAddress));
939
- const ephPK = Point.fromFields([
940
- fromSingle(foreignEphPKField0),
941
- fromSingle(foreignEphPKField1),
942
- fromSingle(foreignEphPKField2),
943
- ]);
944
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
945
-
946
- const secret = await this.handlerAsUtility().getSharedSecret(address, ephPK, contractAddress);
947
-
948
- return toForeignCallResult([toSingle(secret)]);
804
+ aztec_utl_getSharedSecrets(...inputs: ForeignCallArgs) {
805
+ return callTxeHandler({
806
+ oracle: 'aztec_utl_getSharedSecrets',
807
+ inputs,
808
+ handler: ([address, ephPksSlot, contractAddress]) =>
809
+ this.handlerAsUtility().getSharedSecrets(address, ephPksSlot, contractAddress),
810
+ });
949
811
  }
950
812
 
951
813
  // eslint-disable-next-line camelcase
952
- aztec_utl_setContractSyncCacheInvalid(
953
- foreignContractAddress: ForeignCallSingle,
954
- foreignScopes: ForeignCallArray,
955
- foreignScopeCount: ForeignCallSingle,
956
- ) {
957
- const contractAddress = addressFromSingle(foreignContractAddress);
958
- const count = fromSingle(foreignScopeCount).toNumber();
959
- const scopes = fromArray(foreignScopes)
960
- .slice(0, count)
961
- .map(f => new AztecAddress(f));
962
-
963
- this.handlerAsUtility().setContractSyncCacheInvalid(contractAddress, scopes);
964
-
965
- return Promise.resolve(toForeignCallResult([]));
814
+ aztec_utl_setContractSyncCacheInvalid(...inputs: ForeignCallArgs) {
815
+ return callTxeHandler({
816
+ oracle: 'aztec_utl_setContractSyncCacheInvalid',
817
+ inputs,
818
+ handler: ([contractAddress, scopes]) =>
819
+ this.handlerAsUtility().setContractSyncCacheInvalid(contractAddress, scopes),
820
+ });
966
821
  }
967
822
 
968
823
  // eslint-disable-next-line camelcase
969
- aztec_utl_emitOffchainEffect(_foreignData: ForeignCallArray) {
970
- throw new Error('Offchain effects are not yet supported in the TestEnvironment');
824
+ aztec_utl_emitOffchainEffect(...inputs: ForeignCallArgs) {
825
+ return callTxeHandler({
826
+ oracle: 'aztec_utl_emitOffchainEffect',
827
+ inputs,
828
+ handler: ([data]) => {
829
+ // Record the raw payload against the currently-executing top-level call. The Noir side
830
+ // (via `env.offchain_messages()`) is responsible for decoding the protocol-reserved prefix
831
+ // (`OFFCHAIN_MESSAGE_IDENTIFIER`, recipient) and turning each payload into an `OffchainMessage` struct suitable
832
+ // for `offchain_receive`.
833
+ this.stateHandler.recordOffchainEffect(data);
834
+ },
835
+ });
971
836
  }
972
837
 
973
- // AVM opcodes
974
-
975
838
  // eslint-disable-next-line camelcase
976
- aztec_avm_emitPublicLog(_foreignMessage: ForeignCallArray) {
977
- // TODO(#8811): Implement
978
- return toForeignCallResult([]);
839
+ aztec_utl_recordFact(...inputs: ForeignCallArgs) {
840
+ return callTxeHandler({
841
+ oracle: 'aztec_utl_recordFact',
842
+ inputs,
843
+ handler: ([contractAddress, scope, factCollectionTypeId, factCollectionId, factTypeId, payload, originBlock]) =>
844
+ this.handlerAsUtility().recordFact(
845
+ contractAddress,
846
+ scope,
847
+ factCollectionTypeId,
848
+ factCollectionId,
849
+ factTypeId,
850
+ payload,
851
+ originBlock,
852
+ ),
853
+ });
979
854
  }
980
855
 
981
856
  // eslint-disable-next-line camelcase
982
- async aztec_avm_storageRead(foreignSlot: ForeignCallSingle, foreignContractAddress: ForeignCallSingle) {
983
- const slot = fromSingle(foreignSlot);
984
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
985
-
986
- const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
987
-
988
- return toForeignCallResult([toSingle(new Fr(value))]);
857
+ aztec_utl_deleteFactCollection(...inputs: ForeignCallArgs) {
858
+ return callTxeHandler({
859
+ oracle: 'aztec_utl_deleteFactCollection',
860
+ inputs,
861
+ handler: ([contractAddress, scope, factCollectionTypeId, factCollectionId]) =>
862
+ this.handlerAsUtility().deleteFactCollection(contractAddress, scope, factCollectionTypeId, factCollectionId),
863
+ });
989
864
  }
990
865
 
991
866
  // eslint-disable-next-line camelcase
992
- async aztec_avm_storageWrite(foreignSlot: ForeignCallSingle, foreignValue: ForeignCallSingle) {
993
- const slot = fromSingle(foreignSlot);
994
- const value = fromSingle(foreignValue);
995
-
996
- await this.handlerAsAvm().storageWrite(slot, value);
997
-
998
- return toForeignCallResult([]);
867
+ aztec_utl_getFactCollection(...inputs: ForeignCallArgs) {
868
+ return callTxeHandler({
869
+ oracle: 'aztec_utl_getFactCollection',
870
+ inputs,
871
+ handler: ([contractAddress, scope, factCollectionTypeId, factCollectionId]) =>
872
+ this.handlerAsUtility().getFactCollection(contractAddress, scope, factCollectionTypeId, factCollectionId),
873
+ });
999
874
  }
1000
875
 
1001
876
  // eslint-disable-next-line camelcase
1002
- async aztec_avm_getContractInstanceDeployer(foreignAddress: ForeignCallSingle) {
1003
- const address = addressFromSingle(foreignAddress);
877
+ aztec_utl_getFactCollectionsByType(...inputs: ForeignCallArgs) {
878
+ return callTxeHandler({
879
+ oracle: 'aztec_utl_getFactCollectionsByType',
880
+ inputs,
881
+ handler: ([contractAddress, scope, factCollectionTypeId]) =>
882
+ this.handlerAsUtility().getFactCollectionsByType(contractAddress, scope, factCollectionTypeId),
883
+ });
884
+ }
1004
885
 
1005
- const instance = await this.handlerAsUtility().getContractInstance(address);
886
+ // AVM opcodes
1006
887
 
1007
- return toForeignCallResult([
1008
- toSingle(instance.deployer),
1009
- // AVM requires an extra boolean indicating the instance was found
1010
- toSingle(new Fr(1)),
1011
- ]);
888
+ // eslint-disable-next-line camelcase
889
+ aztec_avm_emitPublicLog() {
890
+ return callTxeHandler({
891
+ oracle: 'aztec_avm_emitPublicLog',
892
+ inputs: [],
893
+ // TODO(#8811): Implement
894
+ handler: () => {},
895
+ });
1012
896
  }
1013
897
 
1014
898
  // eslint-disable-next-line camelcase
1015
- async aztec_avm_getContractInstanceClassId(foreignAddress: ForeignCallSingle) {
1016
- const address = addressFromSingle(foreignAddress);
1017
-
1018
- const instance = await this.handlerAsUtility().getContractInstance(address);
1019
-
1020
- return toForeignCallResult([
1021
- toSingle(instance.currentContractClassId),
1022
- // AVM requires an extra boolean indicating the instance was found
1023
- toSingle(new Fr(1)),
1024
- ]);
899
+ aztec_avm_storageRead(...inputs: ForeignCallArgs) {
900
+ return callTxeHandler({
901
+ oracle: 'aztec_avm_storageRead',
902
+ inputs,
903
+ handler: ([slot, contractAddress]) => this.handlerAsAvm().storageRead(slot, contractAddress),
904
+ });
1025
905
  }
1026
906
 
1027
907
  // eslint-disable-next-line camelcase
1028
- async aztec_avm_getContractInstanceInitializationHash(foreignAddress: ForeignCallSingle) {
1029
- const address = addressFromSingle(foreignAddress);
1030
-
1031
- const instance = await this.handlerAsUtility().getContractInstance(address);
1032
-
1033
- return toForeignCallResult([
1034
- toSingle(instance.initializationHash),
1035
- // AVM requires an extra boolean indicating the instance was found
1036
- toSingle(new Fr(1)),
1037
- ]);
908
+ aztec_avm_storageWrite(...inputs: ForeignCallArgs) {
909
+ return callTxeHandler({
910
+ oracle: 'aztec_avm_storageWrite',
911
+ inputs,
912
+ handler: ([slot, value]) => this.handlerAsAvm().storageWrite(slot, value),
913
+ });
1038
914
  }
1039
915
 
1040
916
  // eslint-disable-next-line camelcase
1041
- async aztec_avm_sender() {
1042
- const sender = await this.handlerAsAvm().sender();
1043
-
1044
- return toForeignCallResult([toSingle(sender)]);
917
+ aztec_avm_getContractInstanceDeployer(...inputs: ForeignCallArgs) {
918
+ return callTxeHandler({
919
+ oracle: 'aztec_avm_getContractInstanceDeployer',
920
+ inputs,
921
+ handler: ([address]) => this.handlerAsAvm().getContractInstanceDeployer(address),
922
+ });
1045
923
  }
1046
924
 
1047
925
  // eslint-disable-next-line camelcase
1048
- async aztec_avm_emitNullifier(foreignNullifier: ForeignCallSingle) {
1049
- const nullifier = fromSingle(foreignNullifier);
1050
-
1051
- await this.handlerAsAvm().emitNullifier(nullifier);
1052
-
1053
- return toForeignCallResult([]);
926
+ aztec_avm_getContractInstanceClassId(...inputs: ForeignCallArgs) {
927
+ return callTxeHandler({
928
+ oracle: 'aztec_avm_getContractInstanceClassId',
929
+ inputs,
930
+ handler: ([address]) => this.handlerAsAvm().getContractInstanceClassId(address),
931
+ });
1054
932
  }
1055
933
 
1056
934
  // eslint-disable-next-line camelcase
1057
- async aztec_avm_emitNoteHash(foreignNoteHash: ForeignCallSingle) {
1058
- const noteHash = fromSingle(foreignNoteHash);
1059
-
1060
- await this.handlerAsAvm().emitNoteHash(noteHash);
1061
-
1062
- return toForeignCallResult([]);
935
+ aztec_avm_getContractInstanceInitializationHash(...inputs: ForeignCallArgs) {
936
+ return callTxeHandler({
937
+ oracle: 'aztec_avm_getContractInstanceInitializationHash',
938
+ inputs,
939
+ handler: ([address]) => this.handlerAsAvm().getContractInstanceInitializationHash(address),
940
+ });
1063
941
  }
1064
942
 
1065
943
  // eslint-disable-next-line camelcase
1066
- async aztec_avm_nullifierExists(foreignSiloedNullifier: ForeignCallSingle) {
1067
- const siloedNullifier = fromSingle(foreignSiloedNullifier);
1068
-
1069
- const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
1070
-
1071
- return toForeignCallResult([toSingle(new Fr(exists))]);
944
+ aztec_avm_getContractInstanceImmutablesHash(...inputs: ForeignCallArgs) {
945
+ return callTxeHandler({
946
+ oracle: 'aztec_avm_getContractInstanceImmutablesHash',
947
+ inputs,
948
+ handler: ([address]) => this.handlerAsAvm().getContractInstanceImmutablesHash(address),
949
+ });
1072
950
  }
1073
951
 
1074
952
  // eslint-disable-next-line camelcase
1075
- async aztec_avm_address() {
1076
- const contractAddress = await this.handlerAsAvm().address();
1077
-
1078
- return toForeignCallResult([toSingle(contractAddress.toField())]);
953
+ aztec_avm_sender() {
954
+ return callTxeHandler({
955
+ oracle: 'aztec_avm_sender',
956
+ inputs: [],
957
+ handler: () => this.handlerAsAvm().sender(),
958
+ });
1079
959
  }
1080
960
 
1081
961
  // eslint-disable-next-line camelcase
1082
- async aztec_avm_blockNumber() {
1083
- const blockNumber = await this.handlerAsAvm().blockNumber();
1084
-
1085
- return toForeignCallResult([toSingle(new Fr(blockNumber))]);
962
+ aztec_avm_emitNullifier(...inputs: ForeignCallArgs) {
963
+ return callTxeHandler({
964
+ oracle: 'aztec_avm_emitNullifier',
965
+ inputs,
966
+ handler: ([nullifier]) => this.handlerAsAvm().emitNullifier(nullifier),
967
+ });
1086
968
  }
1087
969
 
1088
970
  // eslint-disable-next-line camelcase
1089
- async aztec_avm_timestamp() {
1090
- const timestamp = await this.handlerAsAvm().timestamp();
1091
-
1092
- return toForeignCallResult([toSingle(new Fr(timestamp))]);
971
+ aztec_avm_emitNoteHash(...inputs: ForeignCallArgs) {
972
+ return callTxeHandler({
973
+ oracle: 'aztec_avm_emitNoteHash',
974
+ inputs,
975
+ handler: ([noteHash]) => this.handlerAsAvm().emitNoteHash(noteHash),
976
+ });
1093
977
  }
1094
978
 
1095
979
  // eslint-disable-next-line camelcase
1096
- async aztec_avm_isStaticCall() {
1097
- const isStaticCall = await this.handlerAsAvm().isStaticCall();
1098
-
1099
- return toForeignCallResult([toSingle(new Fr(isStaticCall ? 1 : 0))]);
980
+ aztec_avm_nullifierExists(...inputs: ForeignCallArgs) {
981
+ return callTxeHandler({
982
+ oracle: 'aztec_avm_nullifierExists',
983
+ inputs,
984
+ handler: ([siloedNullifier]) => this.handlerAsAvm().nullifierExists(siloedNullifier),
985
+ });
1100
986
  }
1101
987
 
1102
988
  // eslint-disable-next-line camelcase
1103
- async aztec_avm_chainId() {
1104
- const chainId = await this.handlerAsAvm().chainId();
1105
-
1106
- return toForeignCallResult([toSingle(chainId)]);
989
+ aztec_avm_address() {
990
+ return callTxeHandler({
991
+ oracle: 'aztec_avm_address',
992
+ inputs: [],
993
+ handler: () => this.handlerAsAvm().address(),
994
+ });
1107
995
  }
1108
996
 
1109
997
  // eslint-disable-next-line camelcase
1110
- async aztec_avm_version() {
1111
- const version = await this.handlerAsAvm().version();
1112
-
1113
- return toForeignCallResult([toSingle(version)]);
998
+ aztec_avm_blockNumber() {
999
+ return callTxeHandler({
1000
+ oracle: 'aztec_avm_blockNumber',
1001
+ inputs: [],
1002
+ handler: () => this.handlerAsAvm().blockNumber(),
1003
+ });
1114
1004
  }
1115
1005
 
1116
1006
  // eslint-disable-next-line camelcase
1117
- aztec_avm_returndataSize() {
1118
- throw new Error(
1119
- 'Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead',
1120
- );
1007
+ aztec_avm_timestamp() {
1008
+ return callTxeHandler({
1009
+ oracle: 'aztec_avm_timestamp',
1010
+ inputs: [],
1011
+ handler: () => this.handlerAsAvm().timestamp(),
1012
+ });
1121
1013
  }
1122
1014
 
1123
1015
  // eslint-disable-next-line camelcase
1124
- aztec_avm_returndataCopy(_foreignRdOffset: ForeignCallSingle, _foreignCopySize: ForeignCallSingle) {
1125
- throw new Error(
1126
- 'Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead',
1127
- );
1016
+ aztec_avm_isStaticCall() {
1017
+ return callTxeHandler({
1018
+ oracle: 'aztec_avm_isStaticCall',
1019
+ inputs: [],
1020
+ handler: () => this.handlerAsAvm().isStaticCall(),
1021
+ });
1128
1022
  }
1129
1023
 
1130
1024
  // eslint-disable-next-line camelcase
1131
- aztec_avm_call(
1132
- _foreignL2Gas: ForeignCallSingle,
1133
- _foreignDaGas: ForeignCallSingle,
1134
- _foreignAddress: ForeignCallSingle,
1135
- _foreignLength: ForeignCallSingle,
1136
- _foreignArgs: ForeignCallArray,
1137
- ) {
1138
- throw new Error(
1139
- 'Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead',
1140
- );
1025
+ aztec_avm_chainId() {
1026
+ return callTxeHandler({
1027
+ oracle: 'aztec_avm_chainId',
1028
+ inputs: [],
1029
+ handler: () => this.handlerAsAvm().chainId(),
1030
+ });
1141
1031
  }
1142
1032
 
1143
1033
  // eslint-disable-next-line camelcase
1144
- aztec_avm_staticCall(
1145
- _foreignL2Gas: ForeignCallSingle,
1146
- _foreignDaGas: ForeignCallSingle,
1147
- _foreignAddress: ForeignCallSingle,
1148
- _foreignLength: ForeignCallSingle,
1149
- _foreignArgs: ForeignCallArray,
1150
- ) {
1151
- throw new Error(
1152
- 'Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead',
1153
- );
1034
+ aztec_avm_version() {
1035
+ return callTxeHandler({
1036
+ oracle: 'aztec_avm_version',
1037
+ inputs: [],
1038
+ handler: () => this.handlerAsAvm().version(),
1039
+ });
1154
1040
  }
1155
1041
 
1156
1042
  // eslint-disable-next-line camelcase
1157
- aztec_avm_successCopy() {
1158
- throw new Error(
1159
- 'Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead',
1160
- );
1161
- }
1162
-
1163
- // eslint-disable-next-line camelcase
1164
- async aztec_txe_privateCallNewFlow(
1165
- foreignFrom: ForeignCallSingle,
1166
- foreignTargetContractAddress: ForeignCallSingle,
1167
- foreignFunctionSelector: ForeignCallSingle,
1168
- foreignArgs: ForeignCallArray,
1169
- foreignArgsHash: ForeignCallSingle,
1170
- foreignIsStaticCall: ForeignCallSingle,
1171
- ) {
1172
- const from = addressFromSingle(foreignFrom);
1173
- const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
1174
- const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
1175
- const args = fromArray(foreignArgs);
1176
- const argsHash = fromSingle(foreignArgsHash);
1177
- const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
1178
-
1179
- const returnValues = await this.handlerAsTxe().privateCallNewFlow(
1180
- from,
1181
- targetContractAddress,
1182
- functionSelector,
1183
- args,
1184
- argsHash,
1185
- isStaticCall,
1186
- this.stateHandler.getCurrentJob(),
1187
- );
1188
-
1189
- // TODO(F-335): Avoid doing the following call here.
1190
- await this.stateHandler.cycleJob();
1191
- return toForeignCallResult([toArray(returnValues)]);
1192
- }
1193
-
1194
- // eslint-disable-next-line camelcase
1195
- async aztec_txe_executeUtilityFunction(
1196
- foreignTargetContractAddress: ForeignCallSingle,
1197
- foreignFunctionSelector: ForeignCallSingle,
1198
- foreignArgs: ForeignCallArray,
1199
- ) {
1200
- const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
1201
- const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
1202
- const args = fromArray(foreignArgs);
1203
-
1204
- const returnValues = await this.handlerAsTxe().executeUtilityFunction(
1205
- targetContractAddress,
1206
- functionSelector,
1207
- args,
1208
- this.stateHandler.getCurrentJob(),
1209
- );
1210
-
1211
- // TODO(F-335): Avoid doing the following call here.
1212
- await this.stateHandler.cycleJob();
1213
- return toForeignCallResult([toArray(returnValues)]);
1214
- }
1215
-
1216
- // eslint-disable-next-line camelcase
1217
- async aztec_txe_publicCallNewFlow(
1218
- foreignFrom: ForeignCallSingle,
1219
- foreignAddress: ForeignCallSingle,
1220
- foreignCalldata: ForeignCallArray,
1221
- foreignIsStaticCall: ForeignCallSingle,
1222
- ) {
1223
- const from = addressFromSingle(foreignFrom);
1224
- const address = addressFromSingle(foreignAddress);
1225
- const calldata = fromArray(foreignCalldata);
1226
- const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
1227
-
1228
- const returnValues = await this.handlerAsTxe().publicCallNewFlow(from, address, calldata, isStaticCall);
1229
-
1230
- // TODO(F-335): Avoid doing the following call here.
1231
- await this.stateHandler.cycleJob();
1232
- return toForeignCallResult([toArray(returnValues)]);
1233
- }
1234
-
1235
- // eslint-disable-next-line camelcase
1236
- async aztec_prv_getSenderForTags() {
1237
- const sender = await this.handlerAsPrivate().getSenderForTags();
1238
-
1239
- // Return a Noir Option struct with `some` and `value` fields
1240
- if (sender === undefined) {
1241
- // No sender found, return Option with some=0 and value=0
1242
- return toForeignCallResult([toSingle(0), toSingle(0)]);
1243
- } else {
1244
- // Sender found, return Option with some=1 and value=sender address
1245
- return toForeignCallResult([toSingle(1), toSingle(sender)]);
1246
- }
1043
+ aztec_avm_returndataSize() {
1044
+ return callTxeHandler({
1045
+ oracle: 'aztec_avm_returndataSize',
1046
+ inputs: [],
1047
+ handler: () => this.handlerAsAvm().returndataSize(),
1048
+ });
1247
1049
  }
1248
1050
 
1249
1051
  // eslint-disable-next-line camelcase
1250
- async aztec_prv_setSenderForTags(foreignSenderForTags: ForeignCallSingle) {
1251
- const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
1252
-
1253
- await this.handlerAsPrivate().setSenderForTags(senderForTags);
1254
-
1255
- return toForeignCallResult([]);
1052
+ aztec_avm_returndataCopy(...inputs: ForeignCallArgs) {
1053
+ return callTxeHandler({
1054
+ oracle: 'aztec_avm_returndataCopy',
1055
+ inputs,
1056
+ handler: ([rdOffset, copySize]) => this.handlerAsAvm().returndataCopy(rdOffset, copySize),
1057
+ });
1256
1058
  }
1257
1059
 
1258
1060
  // eslint-disable-next-line camelcase
1259
- async aztec_prv_getNextAppTagAsSender(foreignSender: ForeignCallSingle, foreignRecipient: ForeignCallSingle) {
1260
- const sender = AztecAddress.fromField(fromSingle(foreignSender));
1261
- const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
1061
+ aztec_avm_call(...inputs: ForeignCallArgs) {
1062
+ return callTxeHandler({
1063
+ oracle: 'aztec_avm_call',
1064
+ inputs,
1065
+ handler: ([l2Gas, daGas, address, argsLength, args]) =>
1066
+ this.handlerAsAvm().call(l2Gas, daGas, address, argsLength, args),
1067
+ });
1068
+ }
1262
1069
 
1263
- const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
1070
+ // eslint-disable-next-line camelcase
1071
+ aztec_avm_staticCall(...inputs: ForeignCallArgs) {
1072
+ return callTxeHandler({
1073
+ oracle: 'aztec_avm_staticCall',
1074
+ inputs,
1075
+ handler: ([l2Gas, daGas, address, argsLength, args]) =>
1076
+ this.handlerAsAvm().staticCall(l2Gas, daGas, address, argsLength, args),
1077
+ });
1078
+ }
1264
1079
 
1265
- return toForeignCallResult([toSingle(nextAppTag.value)]);
1080
+ // eslint-disable-next-line camelcase
1081
+ aztec_avm_successCopy() {
1082
+ return callTxeHandler({
1083
+ oracle: 'aztec_avm_successCopy',
1084
+ inputs: [],
1085
+ handler: () => this.handlerAsAvm().successCopy(),
1086
+ });
1087
+ }
1088
+
1089
+ // eslint-disable-next-line camelcase
1090
+ aztec_txe_privateCallNewFlow(...inputs: ForeignCallArgs) {
1091
+ return callTxeHandler({
1092
+ oracle: 'aztec_txe_privateCallNewFlow',
1093
+ inputs,
1094
+ handler: ([
1095
+ from,
1096
+ targetContractAddress,
1097
+ functionSelector,
1098
+ args,
1099
+ argsHash,
1100
+ isStaticCall,
1101
+ additionalScopes,
1102
+ authorizedUtilityCallTargets,
1103
+ gasSettings,
1104
+ ]) =>
1105
+ this.stateHandler.executePrivateCall(
1106
+ from,
1107
+ targetContractAddress,
1108
+ functionSelector,
1109
+ args,
1110
+ argsHash,
1111
+ isStaticCall,
1112
+ additionalScopes,
1113
+ authorizedUtilityCallTargets,
1114
+ gasSettings,
1115
+ ),
1116
+ });
1117
+ }
1118
+
1119
+ // eslint-disable-next-line camelcase
1120
+ aztec_txe_executeUtilityFunction(...inputs: ForeignCallArgs) {
1121
+ return callTxeHandler({
1122
+ oracle: 'aztec_txe_executeUtilityFunction',
1123
+ inputs,
1124
+ handler: ([from, targetContractAddress, functionSelector, args, authorizedUtilityCallTargets]) =>
1125
+ this.stateHandler.executeUtilityFunction(
1126
+ from,
1127
+ targetContractAddress,
1128
+ functionSelector,
1129
+ args,
1130
+ authorizedUtilityCallTargets,
1131
+ ),
1132
+ });
1133
+ }
1134
+
1135
+ // eslint-disable-next-line camelcase
1136
+ aztec_txe_publicCallNewFlow(...inputs: ForeignCallArgs) {
1137
+ return callTxeHandler({
1138
+ oracle: 'aztec_txe_publicCallNewFlow',
1139
+ inputs,
1140
+ handler: ([from, address, calldata, isStaticCall, gasSettings]) =>
1141
+ this.stateHandler.executePublicCall(from, address, calldata, isStaticCall, gasSettings),
1142
+ });
1143
+ }
1144
+
1145
+ // eslint-disable-next-line camelcase
1146
+ aztec_prv_getSenderForTags() {
1147
+ return callTxeHandler({
1148
+ oracle: 'aztec_prv_getSenderForTags',
1149
+ inputs: [],
1150
+ handler: () => this.handlerAsPrivate().getSenderForTags(),
1151
+ });
1152
+ }
1153
+
1154
+ // eslint-disable-next-line camelcase
1155
+ aztec_prv_resolveTaggingStrategy(...inputs: ForeignCallArgs) {
1156
+ return callTxeHandler({
1157
+ oracle: 'aztec_prv_resolveTaggingStrategy',
1158
+ inputs,
1159
+ handler: ([sender, recipient, deliveryMode]) =>
1160
+ this.handlerAsPrivate().resolveTaggingStrategy(sender, recipient, deliveryMode),
1161
+ });
1162
+ }
1163
+
1164
+ // eslint-disable-next-line camelcase
1165
+ aztec_prv_resolveCustomRequest(...inputs: ForeignCallArgs) {
1166
+ return callTxeHandler({
1167
+ oracle: 'aztec_prv_resolveCustomRequest',
1168
+ inputs,
1169
+ handler: ([kind, payload]) => this.handlerAsPrivate().resolveCustomRequest(kind, payload),
1170
+ });
1171
+ }
1172
+
1173
+ // eslint-disable-next-line camelcase
1174
+ aztec_prv_getAppTaggingSecret(...inputs: ForeignCallArgs) {
1175
+ return callTxeHandler({
1176
+ oracle: 'aztec_prv_getAppTaggingSecret',
1177
+ inputs,
1178
+ handler: ([sender, recipient]) => this.handlerAsPrivate().getAppTaggingSecret(sender, recipient),
1179
+ });
1180
+ }
1181
+
1182
+ // eslint-disable-next-line camelcase
1183
+ aztec_prv_getNextTaggingIndex(...inputs: ForeignCallArgs) {
1184
+ return callTxeHandler({
1185
+ oracle: 'aztec_prv_getNextTaggingIndex',
1186
+ inputs,
1187
+ handler: ([secret, deliveryMode]) => this.handlerAsPrivate().getNextTaggingIndex(secret, deliveryMode),
1188
+ });
1266
1189
  }
1267
1190
  }