@aztec/txe 0.0.1-commit.b2a5d0dd1 → 0.0.1-commit.b3d3157a

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