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