@aztec/txe 0.0.1-commit.42ee6df9b → 0.0.1-commit.431c48d

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 (170) hide show
  1. package/dest/AuthRegistry-56AMRLSQ.js +3 -0
  2. package/dest/AuthRegistry-56AMRLSQ.js.map +7 -0
  3. package/dest/ContractClassRegistry-CRN27URB.js +3 -0
  4. package/dest/ContractClassRegistry-CRN27URB.js.map +7 -0
  5. package/dest/ContractInstanceRegistry-GRGL26IC.js +3 -0
  6. package/dest/ContractInstanceRegistry-GRGL26IC.js.map +7 -0
  7. package/dest/FeeJuice-J23RVHLW.js +3 -0
  8. package/dest/FeeJuice-J23RVHLW.js.map +7 -0
  9. package/dest/HandshakeRegistry-5.0.1-PEFCLEGP.js +3 -0
  10. package/dest/HandshakeRegistry-5.0.1-PEFCLEGP.js.map +7 -0
  11. package/dest/HandshakeRegistry-GNFACTEE.js +3 -0
  12. package/dest/HandshakeRegistry-GNFACTEE.js.map +7 -0
  13. package/dest/MultiCallEntrypoint-MIDICLQB.js +3 -0
  14. package/dest/MultiCallEntrypoint-MIDICLQB.js.map +7 -0
  15. package/dest/SchnorrAccount-ZRENHSMV.js +3 -0
  16. package/dest/SchnorrAccount-ZRENHSMV.js.map +7 -0
  17. package/dest/SchnorrInitializerlessAccount-L56LOFSV.js +3 -0
  18. package/dest/SchnorrInitializerlessAccount-L56LOFSV.js.map +7 -0
  19. package/dest/bin/check_txe_oracle_version.d.ts +2 -0
  20. package/dest/bin/check_txe_oracle_version.d.ts.map +1 -0
  21. package/dest/bin/check_txe_oracle_version.js +53 -0
  22. package/dest/bin/index.js +3 -30
  23. package/dest/bin/index.js.map +7 -0
  24. package/dest/bin/oracle_test_server.d.ts +3 -0
  25. package/dest/bin/oracle_test_server.d.ts.map +1 -0
  26. package/dest/bin/oracle_test_server.js +41 -0
  27. package/dest/chunk-BJVAAXNA.js +3 -0
  28. package/dest/chunk-BJVAAXNA.js.map +7 -0
  29. package/dest/chunk-LVLJKGGH.js +266 -0
  30. package/dest/chunk-LVLJKGGH.js.map +7 -0
  31. package/dest/chunk-OVMCQ5A6.js +304 -0
  32. package/dest/chunk-OVMCQ5A6.js.map +7 -0
  33. package/dest/constants.d.ts +5 -1
  34. package/dest/constants.d.ts.map +1 -1
  35. package/dest/constants.js +9 -1
  36. package/dest/dispatcher_pool.d.ts +67 -0
  37. package/dest/dispatcher_pool.d.ts.map +1 -0
  38. package/dest/dispatcher_pool.js +286 -0
  39. package/dest/index.d.ts +51 -7
  40. package/dest/index.d.ts.map +1 -1
  41. package/dest/index.js +72 -190
  42. package/dest/metafile.json +40494 -0
  43. package/dest/msgpackr_fr_extension.d.ts +2 -0
  44. package/dest/msgpackr_fr_extension.d.ts.map +1 -0
  45. package/dest/msgpackr_fr_extension.js +21 -0
  46. package/dest/oracle/interfaces.d.ts +47 -9
  47. package/dest/oracle/interfaces.d.ts.map +1 -1
  48. package/dest/oracle/tagging_secret_strategy.d.ts +12 -0
  49. package/dest/oracle/tagging_secret_strategy.d.ts.map +1 -0
  50. package/dest/oracle/tagging_secret_strategy.js +12 -0
  51. package/dest/oracle/test-resolver/default_fixtures.d.ts +16 -0
  52. package/dest/oracle/test-resolver/default_fixtures.d.ts.map +1 -0
  53. package/dest/oracle/test-resolver/default_fixtures.js +200 -0
  54. package/dest/oracle/test-resolver/index.d.ts +9 -0
  55. package/dest/oracle/test-resolver/index.d.ts.map +1 -0
  56. package/dest/oracle/test-resolver/index.js +32 -0
  57. package/dest/oracle/test-resolver/resolver.d.ts +48 -0
  58. package/dest/oracle/test-resolver/resolver.d.ts.map +1 -0
  59. package/dest/oracle/test-resolver/resolver.js +181 -0
  60. package/dest/oracle/txe_oracle_public_context.d.ts +26 -2
  61. package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
  62. package/dest/oracle/txe_oracle_public_context.js +49 -1
  63. package/dest/oracle/txe_oracle_registry.d.ts +172 -0
  64. package/dest/oracle/txe_oracle_registry.d.ts.map +1 -0
  65. package/dest/oracle/txe_oracle_registry.js +767 -0
  66. package/dest/oracle/txe_oracle_top_level_context.d.ts +58 -18
  67. package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
  68. package/dest/oracle/txe_oracle_top_level_context.js +286 -97
  69. package/dest/oracle/txe_oracle_version.d.ts +17 -0
  70. package/dest/oracle/txe_oracle_version.d.ts.map +1 -0
  71. package/dest/oracle/txe_oracle_version.js +14 -0
  72. package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
  73. package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
  74. package/dest/oracle/txe_private_execution_oracle.js +15 -0
  75. package/dest/rpc_server.d.ts +14 -0
  76. package/dest/rpc_server.d.ts.map +1 -0
  77. package/dest/rpc_server.js +78 -0
  78. package/dest/rpc_translator.d.ts +115 -233
  79. package/dest/rpc_translator.d.ts.map +1 -1
  80. package/dest/rpc_translator.js +791 -647
  81. package/dest/server.bundle.js +3 -0
  82. package/dest/server.bundle.js.map +7 -0
  83. package/dest/state_machine/archiver.d.ts +4 -3
  84. package/dest/state_machine/archiver.d.ts.map +1 -1
  85. package/dest/state_machine/archiver.js +25 -16
  86. package/dest/state_machine/dummy_p2p_client.d.ts +16 -7
  87. package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
  88. package/dest/state_machine/dummy_p2p_client.js +26 -2
  89. package/dest/state_machine/global_variable_builder.d.ts +10 -6
  90. package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
  91. package/dest/state_machine/global_variable_builder.js +8 -5
  92. package/dest/state_machine/index.d.ts +11 -7
  93. package/dest/state_machine/index.d.ts.map +1 -1
  94. package/dest/state_machine/index.js +52 -14
  95. package/dest/state_machine/mock_epoch_cache.d.ts +1 -2
  96. package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
  97. package/dest/state_machine/mock_epoch_cache.js +0 -3
  98. package/dest/state_machine/synchronizer.d.ts +5 -2
  99. package/dest/state_machine/synchronizer.d.ts.map +1 -1
  100. package/dest/state_machine/synchronizer.js +7 -3
  101. package/dest/txe_session.d.ts +90 -20
  102. package/dest/txe_session.d.ts.map +1 -1
  103. package/dest/txe_session.js +313 -67
  104. package/dest/utils/block_creation.d.ts +2 -2
  105. package/dest/utils/block_creation.d.ts.map +1 -1
  106. package/dest/utils/block_creation.js +2 -2
  107. package/dest/utils/encoding.d.ts +192 -0
  108. package/dest/utils/encoding.d.ts.map +1 -0
  109. package/dest/{util → utils}/encoding.js +7 -2
  110. package/dest/{util → utils}/expected_failure_error.d.ts +1 -1
  111. package/dest/utils/expected_failure_error.d.ts.map +1 -0
  112. package/dest/utils/tx_effect_creation.d.ts +1 -1
  113. package/dest/utils/tx_effect_creation.d.ts.map +1 -1
  114. package/dest/utils/tx_effect_creation.js +0 -1
  115. package/dest/{util → utils}/txe_account_store.d.ts +1 -1
  116. package/dest/utils/txe_account_store.d.ts.map +1 -0
  117. package/dest/utils/txe_artifact_resolver.d.ts +37 -0
  118. package/dest/utils/txe_artifact_resolver.d.ts.map +1 -0
  119. package/dest/utils/txe_artifact_resolver.js +161 -0
  120. package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
  121. package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
  122. package/dest/{util → utils}/txe_public_contract_data_source.js +7 -4
  123. package/dest/worker.bundle.js +3 -0
  124. package/dest/worker.bundle.js.map +7 -0
  125. package/dest/worker.d.ts +2 -0
  126. package/dest/worker.d.ts.map +1 -0
  127. package/dest/worker.js +92 -0
  128. package/package.json +38 -21
  129. package/src/bin/check_txe_oracle_version.ts +67 -0
  130. package/src/bin/index.ts +11 -2
  131. package/src/bin/oracle_test_server.ts +51 -0
  132. package/src/constants.ts +11 -1
  133. package/src/dispatcher_pool.ts +317 -0
  134. package/src/index.ts +99 -227
  135. package/src/msgpackr_fr_extension.ts +23 -0
  136. package/src/oracle/interfaces.ts +47 -8
  137. package/src/oracle/tagging_secret_strategy.ts +25 -0
  138. package/src/oracle/test-resolver/default_fixtures.ts +271 -0
  139. package/src/oracle/test-resolver/index.ts +44 -0
  140. package/src/oracle/test-resolver/resolver.ts +245 -0
  141. package/src/oracle/txe_oracle_public_context.ts +62 -0
  142. package/src/oracle/txe_oracle_registry.ts +556 -0
  143. package/src/oracle/txe_oracle_top_level_context.ts +357 -118
  144. package/src/oracle/txe_oracle_version.ts +17 -0
  145. package/src/oracle/txe_private_execution_oracle.ts +30 -0
  146. package/src/rpc_server.ts +87 -0
  147. package/src/rpc_translator.ts +890 -938
  148. package/src/state_machine/archiver.ts +37 -17
  149. package/src/state_machine/dummy_p2p_client.ts +43 -10
  150. package/src/state_machine/global_variable_builder.ts +12 -17
  151. package/src/state_machine/index.ts +63 -32
  152. package/src/state_machine/mock_epoch_cache.ts +0 -4
  153. package/src/state_machine/synchronizer.ts +9 -3
  154. package/src/txe_session.ts +545 -80
  155. package/src/utils/block_creation.ts +2 -1
  156. package/src/{util → utils}/encoding.ts +8 -2
  157. package/src/utils/tx_effect_creation.ts +0 -2
  158. package/src/utils/txe_artifact_resolver.ts +217 -0
  159. package/src/{util → utils}/txe_public_contract_data_source.ts +6 -4
  160. package/src/worker.ts +98 -0
  161. package/dest/util/encoding.d.ts +0 -788
  162. package/dest/util/encoding.d.ts.map +0 -1
  163. package/dest/util/expected_failure_error.d.ts.map +0 -1
  164. package/dest/util/txe_account_store.d.ts.map +0 -1
  165. package/dest/util/txe_public_contract_data_source.d.ts +0 -20
  166. package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
  167. /package/dest/{util → utils}/expected_failure_error.js +0 -0
  168. /package/dest/{util → utils}/txe_account_store.js +0 -0
  169. /package/src/{util → utils}/expected_failure_error.ts +0 -0
  170. /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,765 +51,918 @@ 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
+ });
106
+ }
107
+ // eslint-disable-next-line camelcase
108
+ aztec_txe_getNextBlockNumber() {
109
+ return callTxeHandler({
110
+ oracle: 'aztec_txe_getNextBlockNumber',
111
+ inputs: [],
112
+ handler: ()=>this.handlerAsTxe().getNextBlockNumber()
113
+ });
96
114
  }
97
115
  // eslint-disable-next-line camelcase
98
- async aztec_txe_getNextBlockNumber() {
99
- const nextBlockNumber = await this.handlerAsTxe().getNextBlockNumber();
100
- return toForeignCallResult([
101
- toSingle(nextBlockNumber)
102
- ]);
116
+ aztec_txe_getNextBlockTimestamp() {
117
+ return callTxeHandler({
118
+ oracle: 'aztec_txe_getNextBlockTimestamp',
119
+ inputs: [],
120
+ handler: ()=>this.handlerAsTxe().getNextBlockTimestamp()
121
+ });
103
122
  }
104
123
  // eslint-disable-next-line camelcase
105
- async aztec_txe_getNextBlockTimestamp() {
106
- const nextBlockTimestamp = await this.handlerAsTxe().getNextBlockTimestamp();
107
- return toForeignCallResult([
108
- toSingle(nextBlockTimestamp)
109
- ]);
124
+ aztec_txe_advanceBlocksBy(...inputs) {
125
+ return callTxeHandler({
126
+ oracle: 'aztec_txe_advanceBlocksBy',
127
+ inputs,
128
+ handler: ([blocks])=>this.handlerAsTxe().advanceBlocksBy(blocks)
129
+ });
110
130
  }
111
131
  // 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([]);
132
+ aztec_txe_advanceTimestampBy(...inputs) {
133
+ return callTxeHandler({
134
+ oracle: 'aztec_txe_advanceTimestampBy',
135
+ inputs,
136
+ handler: ([duration])=>this.handlerAsTxe().advanceTimestampBy(duration)
137
+ });
116
138
  }
117
139
  // eslint-disable-next-line camelcase
118
- aztec_txe_advanceTimestampBy(foreignDuration) {
119
- const duration = fromSingle(foreignDuration).toBigInt();
120
- this.handlerAsTxe().advanceTimestampBy(duration);
121
- return toForeignCallResult([]);
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
+ });
122
146
  }
123
147
  // 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
- ]);
148
+ aztec_txe_createAccount(...inputs) {
149
+ return callTxeHandler({
150
+ oracle: 'aztec_txe_createAccount',
151
+ inputs,
152
+ handler: ([secret, partialAddress])=>this.handlerAsTxe().createAccount(secret, partialAddress)
153
+ });
136
154
  }
137
155
  // 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
- ]);
156
+ aztec_txe_addAccount(...inputs) {
157
+ return callTxeHandler({
158
+ oracle: 'aztec_txe_addAccount',
159
+ inputs,
160
+ handler: ([secret])=>this.handlerAsTxe().addAccount(secret)
161
+ });
145
162
  }
146
163
  // 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
- ]);
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
+ });
154
170
  }
155
171
  // 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([]);
172
+ aztec_txe_sendL1ToL2Message(...inputs) {
173
+ return callTxeHandler({
174
+ oracle: 'aztec_txe_sendL1ToL2Message',
175
+ inputs,
176
+ handler: ([content, secretHash, sender, recipient])=>this.handlerAsTxe().sendL1ToL2Message(content, secretHash, sender, recipient)
177
+ });
178
+ }
179
+ // eslint-disable-next-line camelcase
180
+ aztec_txe_setTaggingSecretStrategies(...inputs) {
181
+ return callTxeHandler({
182
+ oracle: 'aztec_txe_setTaggingSecretStrategies',
183
+ inputs,
184
+ handler: ([unconstrainedStrategy, constrainedStrategy])=>this.handlerAsTxe().setTaggingSecretStrategies(unconstrainedStrategy, constrainedStrategy)
185
+ });
186
+ }
187
+ // eslint-disable-next-line camelcase
188
+ aztec_txe_setAuthorizeAllUtilityCallTargets(...inputs) {
189
+ return callTxeHandler({
190
+ oracle: 'aztec_txe_setAuthorizeAllUtilityCallTargets',
191
+ inputs,
192
+ handler: ([authorizeAll])=>this.handlerAsTxe().setAuthorizeAllUtilityCallTargets(authorizeAll)
193
+ });
161
194
  }
162
195
  // PXE oracles
163
196
  // eslint-disable-next-line camelcase
164
- aztec_utl_assertCompatibleOracleVersion(foreignVersion) {
165
- const version = fromSingle(foreignVersion).toNumber();
166
- this.handlerAsMisc().assertCompatibleOracleVersion(version);
167
- return toForeignCallResult([]);
197
+ aztec_misc_assertCompatibleOracleVersion(...inputs) {
198
+ return callTxeHandler({
199
+ oracle: 'aztec_misc_assertCompatibleOracleVersion',
200
+ inputs,
201
+ handler: ([major, minor])=>this.handlerAsMisc().assertCompatibleOracleVersion(major, minor)
202
+ });
168
203
  }
169
204
  // eslint-disable-next-line camelcase
170
- aztec_utl_getRandomField() {
171
- const randomField = this.handlerAsMisc().getRandomField();
172
- return toForeignCallResult([
173
- toSingle(randomField)
174
- ]);
205
+ aztec_misc_getRandomField() {
206
+ return callTxeHandler({
207
+ oracle: 'aztec_misc_getRandomField',
208
+ inputs: [],
209
+ handler: ()=>this.handlerAsMisc().getRandomField()
210
+ });
175
211
  }
176
212
  // 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
- ]);
213
+ aztec_txe_getLastBlockTimestamp() {
214
+ return callTxeHandler({
215
+ oracle: 'aztec_txe_getLastBlockTimestamp',
216
+ inputs: [],
217
+ handler: ()=>this.handlerAsTxe().getLastBlockTimestamp()
218
+ });
182
219
  }
183
220
  // 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
- ]);
221
+ aztec_txe_getLastTxEffects() {
222
+ return callTxeHandler({
223
+ oracle: 'aztec_txe_getLastTxEffects',
224
+ inputs: [],
225
+ handler: ()=>this.handlerAsTxe().getLastTxEffects()
226
+ });
191
227
  }
192
228
  // 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 = new BlockHash(fromSingle(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 = new BlockHash(fromSingle(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
- }
229
+ aztec_txe_getLastCallOffchainEffects() {
230
+ return callTxeHandler({
231
+ oracle: 'aztec_txe_getLastCallOffchainEffects',
232
+ inputs: [],
233
+ handler: ()=>this.stateHandler.getLastCallOffchainEffects()
234
+ });
379
235
  }
380
236
  // 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));
237
+ aztec_txe_getLastCallContext() {
238
+ return callTxeHandler({
239
+ oracle: 'aztec_txe_getLastCallContext',
240
+ inputs: [],
241
+ handler: ()=>this.stateHandler.getLastCallContext()
242
+ });
385
243
  }
386
244
  // 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');
245
+ aztec_txe_getPrivateEvents(...inputs) {
246
+ return callTxeHandler({
247
+ oracle: 'aztec_txe_getPrivateEvents',
248
+ inputs,
249
+ handler: ([selector, contractAddress, scope])=>this.stateHandler.getPrivateEvents(selector, contractAddress, scope)
250
+ });
389
251
  }
390
252
  // eslint-disable-next-line camelcase
391
- async aztec_utl_getNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
392
- const blockHash = new BlockHash(fromSingle(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());
253
+ aztec_prv_setHashPreimage(...inputs) {
254
+ return callTxeHandler({
255
+ oracle: 'aztec_prv_setHashPreimage',
256
+ inputs,
257
+ handler: ([values, hash])=>this.handlerAsPrivate().setHashPreimage(values, hash)
258
+ });
399
259
  }
400
260
  // 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
- ]);
261
+ aztec_prv_getHashPreimage(...inputs) {
262
+ return callTxeHandler({
263
+ oracle: 'aztec_prv_getHashPreimage',
264
+ inputs,
265
+ handler: ([hash])=>this.handlerAsPrivate().getHashPreimage(hash)
266
+ });
267
+ }
268
+ // eslint-disable-next-line camelcase
269
+ aztec_misc_log(...inputs) {
270
+ return callTxeHandler({
271
+ oracle: 'aztec_misc_log',
272
+ inputs,
273
+ handler: ([level, message, fieldsSize, fields])=>this.handlerAsMisc().log(level, message, fieldsSize, fields)
274
+ });
275
+ }
276
+ // eslint-disable-next-line camelcase
277
+ aztec_utl_getFromPublicStorage(...inputs) {
278
+ return callTxeHandler({
279
+ oracle: 'aztec_utl_getFromPublicStorage',
280
+ inputs,
281
+ handler: ([blockHash, contractAddress, startStorageSlot, numberOfElements])=>this.handlerAsUtility().getFromPublicStorage(blockHash, contractAddress, startStorageSlot, numberOfElements)
282
+ });
283
+ }
284
+ // eslint-disable-next-line camelcase
285
+ aztec_utl_getPublicDataWitness(...inputs) {
286
+ return callTxeHandler({
287
+ oracle: 'aztec_utl_getPublicDataWitness',
288
+ inputs,
289
+ handler: ([blockHash, leafSlot])=>this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot)
290
+ });
291
+ }
292
+ // eslint-disable-next-line camelcase
293
+ aztec_utl_getNotes(...inputs) {
294
+ return callTxeHandler({
295
+ oracle: 'aztec_utl_getNotes',
296
+ inputs,
297
+ 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)
298
+ });
299
+ }
300
+ // eslint-disable-next-line camelcase
301
+ aztec_prv_notifyCreatedNote(...inputs) {
302
+ return callTxeHandler({
303
+ oracle: 'aztec_prv_notifyCreatedNote',
304
+ inputs,
305
+ handler: ([owner, storageSlot, randomness, noteTypeId, note, noteHash, counter])=>this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter)
306
+ });
307
+ }
308
+ // eslint-disable-next-line camelcase
309
+ aztec_prv_notifyNullifiedNote(...inputs) {
310
+ return callTxeHandler({
311
+ oracle: 'aztec_prv_notifyNullifiedNote',
312
+ inputs,
313
+ handler: ([innerNullifier, noteHash, counter])=>this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter)
314
+ });
315
+ }
316
+ // eslint-disable-next-line camelcase
317
+ aztec_prv_notifyCreatedNullifier(...inputs) {
318
+ return callTxeHandler({
319
+ oracle: 'aztec_prv_notifyCreatedNullifier',
320
+ inputs,
321
+ handler: ([innerNullifier])=>this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier)
322
+ });
323
+ }
324
+ // eslint-disable-next-line camelcase
325
+ aztec_prv_isNullifierPending(...inputs) {
326
+ return callTxeHandler({
327
+ oracle: 'aztec_prv_isNullifierPending',
328
+ inputs,
329
+ handler: ([innerNullifier, contractAddress])=>this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress)
330
+ });
331
+ }
332
+ // eslint-disable-next-line camelcase
333
+ aztec_utl_doesNullifierExist(...inputs) {
334
+ return callTxeHandler({
335
+ oracle: 'aztec_utl_doesNullifierExist',
336
+ inputs,
337
+ handler: ([innerNullifier])=>this.handlerAsUtility().doesNullifierExist(innerNullifier)
338
+ });
339
+ }
340
+ // eslint-disable-next-line camelcase
341
+ aztec_utl_getContractInstance(...inputs) {
342
+ return callTxeHandler({
343
+ oracle: 'aztec_utl_getContractInstance',
344
+ inputs,
345
+ handler: ([address])=>this.handlerAsUtility().getContractInstance(address)
346
+ });
347
+ }
348
+ // eslint-disable-next-line camelcase
349
+ aztec_utl_getPublicKeysAndPartialAddress(...inputs) {
350
+ return callTxeHandler({
351
+ oracle: 'aztec_utl_getPublicKeysAndPartialAddress',
352
+ inputs,
353
+ handler: ([address])=>this.handlerAsUtility().getPublicKeysAndPartialAddress(address)
354
+ });
355
+ }
356
+ // eslint-disable-next-line camelcase
357
+ aztec_utl_getKeyValidationRequest(...inputs) {
358
+ return callTxeHandler({
359
+ oracle: 'aztec_utl_getKeyValidationRequest',
360
+ inputs,
361
+ handler: ([pkMHash, keyIndex])=>this.handlerAsUtility().getKeyValidationRequest(pkMHash, keyIndex)
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_prv_callPrivateFunction(...inputs) {
366
+ return callTxeHandler({
367
+ oracle: 'aztec_prv_callPrivateFunction',
368
+ inputs,
369
+ handler: ([contractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall])=>this.handlerAsPrivate().callPrivateFunction(contractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall)
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_utl_getNullifierMembershipWitness(...inputs) {
374
+ return callTxeHandler({
375
+ oracle: 'aztec_utl_getNullifierMembershipWitness',
376
+ inputs,
377
+ handler: ([blockHash, nullifier])=>this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier)
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_utl_getL1ToL2MembershipWitnessV2(...inputs) {
382
+ return callTxeHandler({
383
+ oracle: 'aztec_utl_getL1ToL2MembershipWitnessV2',
384
+ inputs,
385
+ handler: ([messageHash, nullifier])=>this.handlerAsUtility().getL1ToL2MembershipWitnessV2(messageHash, nullifier)
386
+ });
387
+ }
388
+ // eslint-disable-next-line camelcase
389
+ aztec_utl_getAuthWitness(...inputs) {
390
+ return callTxeHandler({
391
+ oracle: 'aztec_utl_getAuthWitness',
392
+ inputs,
393
+ handler: ([messageHash])=>this.handlerAsUtility().getAuthWitness(messageHash)
394
+ });
395
+ }
396
+ // eslint-disable-next-line camelcase
397
+ aztec_prv_assertValidPublicCalldata(...inputs) {
398
+ return callTxeHandler({
399
+ oracle: 'aztec_prv_assertValidPublicCalldata',
400
+ inputs,
401
+ handler: ([calldataHash])=>this.handlerAsPrivate().assertValidPublicCalldata(calldataHash)
402
+ });
403
+ }
404
+ // eslint-disable-next-line camelcase
405
+ aztec_prv_notifyRevertiblePhaseStart(...inputs) {
406
+ return callTxeHandler({
407
+ oracle: 'aztec_prv_notifyRevertiblePhaseStart',
408
+ inputs,
409
+ handler: ([minRevertibleSideEffectCounter])=>this.handlerAsPrivate().notifyRevertiblePhaseStart(minRevertibleSideEffectCounter)
410
+ });
411
+ }
412
+ // eslint-disable-next-line camelcase
413
+ aztec_prv_isExecutionInRevertiblePhase(...inputs) {
414
+ return callTxeHandler({
415
+ oracle: 'aztec_prv_isExecutionInRevertiblePhase',
416
+ inputs,
417
+ handler: ([sideEffectCounter])=>this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter)
418
+ });
426
419
  }
427
420
  // eslint-disable-next-line camelcase
428
421
  aztec_utl_getUtilityContext() {
429
- const context = this.handlerAsUtility().getUtilityContext();
430
- return toForeignCallResult(context.toNoirRepresentation());
422
+ return callTxeHandler({
423
+ oracle: 'aztec_utl_getUtilityContext',
424
+ inputs: [],
425
+ handler: ()=>this.handlerAsUtility().getUtilityContext()
426
+ });
431
427
  }
432
428
  // 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));
429
+ aztec_utl_getBlockHeader(...inputs) {
430
+ return callTxeHandler({
431
+ oracle: 'aztec_utl_getBlockHeader',
432
+ inputs,
433
+ handler: ([blockNumber])=>this.handlerAsUtility().getBlockHeader(blockNumber)
434
+ });
440
435
  }
441
436
  // eslint-disable-next-line camelcase
442
- async aztec_utl_getNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
443
- const blockHash = new BlockHash(fromSingle(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());
437
+ aztec_utl_getNoteHashMembershipWitness(...inputs) {
438
+ return callTxeHandler({
439
+ oracle: 'aztec_utl_getNoteHashMembershipWitness',
440
+ inputs,
441
+ handler: ([blockHash, noteHash])=>this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash)
442
+ });
450
443
  }
451
444
  // eslint-disable-next-line camelcase
452
- async aztec_utl_getBlockHashMembershipWitness(foreignAnchorBlockHash, foreignBlockHash) {
453
- const anchorBlockHash = new BlockHash(fromSingle(foreignAnchorBlockHash));
454
- const blockHash = new BlockHash(fromSingle(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());
445
+ aztec_utl_getBlockHashMembershipWitness(...inputs) {
446
+ return callTxeHandler({
447
+ oracle: 'aztec_utl_getBlockHashMembershipWitness',
448
+ inputs,
449
+ handler: ([anchorBlockHash, blockHash])=>this.handlerAsUtility().getBlockHashMembershipWitness(anchorBlockHash, blockHash)
450
+ });
460
451
  }
461
452
  // eslint-disable-next-line camelcase
462
- async aztec_utl_getLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
463
- const blockHash = new BlockHash(fromSingle(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_validateAndStoreEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignMaxNotePackedLen, foreignMaxEventSerializedLen, foreignScope) {
480
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
481
- const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
482
- const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
483
- const maxNotePackedLen = fromSingle(foreignMaxNotePackedLen).toNumber();
484
- const maxEventSerializedLen = fromSingle(foreignMaxEventSerializedLen).toNumber();
485
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
486
- await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, maxNotePackedLen, maxEventSerializedLen, scope);
487
- return toForeignCallResult([]);
488
- }
489
- // eslint-disable-next-line camelcase
490
- async aztec_utl_getLogsByTag(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot, foreignScope) {
491
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
492
- const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
493
- const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
494
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
495
- await this.handlerAsUtility().getLogsByTag(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot, scope);
496
- return toForeignCallResult([]);
497
- }
498
- // eslint-disable-next-line camelcase
499
- async aztec_utl_getMessageContextsByTxHash(foreignContractAddress, foreignMessageContextRequestsArrayBaseSlot, foreignMessageContextResponsesArrayBaseSlot, foreignScope) {
500
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
501
- const messageContextRequestsArrayBaseSlot = fromSingle(foreignMessageContextRequestsArrayBaseSlot);
502
- const messageContextResponsesArrayBaseSlot = fromSingle(foreignMessageContextResponsesArrayBaseSlot);
503
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
504
- await this.handlerAsUtility().getMessageContextsByTxHash(contractAddress, messageContextRequestsArrayBaseSlot, messageContextResponsesArrayBaseSlot, scope);
505
- return toForeignCallResult([]);
506
- }
507
- // eslint-disable-next-line camelcase
508
- aztec_utl_setCapsule(foreignContractAddress, foreignSlot, foreignCapsule, foreignScope) {
509
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
510
- const slot = fromSingle(foreignSlot);
511
- const capsule = fromArray(foreignCapsule);
512
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
513
- this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope);
514
- return toForeignCallResult([]);
515
- }
516
- // eslint-disable-next-line camelcase
517
- async aztec_utl_getCapsule(foreignContractAddress, foreignSlot, foreignTSize, foreignScope) {
518
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
519
- const slot = fromSingle(foreignSlot);
520
- const tSize = fromSingle(foreignTSize).toNumber();
521
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
522
- const values = await this.handlerAsUtility().getCapsule(contractAddress, slot, scope);
523
- // We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
524
- // with two fields: `some` (a boolean) and `value` (a field array in this case).
525
- if (values === null) {
526
- // No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
527
- return toForeignCallResult([
528
- toSingle(new Fr(0)),
529
- toArray(Array(tSize).fill(new Fr(0)))
530
- ]);
531
- } else {
532
- // Data was found so we set `some` to 1 and return it along with `value`.
533
- return toForeignCallResult([
534
- toSingle(new Fr(1)),
535
- toArray(values)
536
- ]);
537
- }
453
+ aztec_utl_areBlockHashesInArchive(...inputs) {
454
+ return callTxeHandler({
455
+ oracle: 'aztec_utl_areBlockHashesInArchive',
456
+ inputs,
457
+ handler: ([anchorBlockHash, blockHashes])=>this.handlerAsUtility().areBlockHashesInArchive(anchorBlockHash, blockHashes)
458
+ });
538
459
  }
539
460
  // eslint-disable-next-line camelcase
540
- aztec_utl_deleteCapsule(foreignContractAddress, foreignSlot, foreignScope) {
541
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
542
- const slot = fromSingle(foreignSlot);
543
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
544
- this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope);
545
- return toForeignCallResult([]);
461
+ aztec_utl_getLowNullifierMembershipWitness(...inputs) {
462
+ return callTxeHandler({
463
+ oracle: 'aztec_utl_getLowNullifierMembershipWitness',
464
+ inputs,
465
+ handler: ([blockHash, nullifier])=>this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier)
466
+ });
546
467
  }
547
468
  // eslint-disable-next-line camelcase
548
- async aztec_utl_copyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries, foreignScope) {
549
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
550
- const srcSlot = fromSingle(foreignSrcSlot);
551
- const dstSlot = fromSingle(foreignDstSlot);
552
- const numEntries = fromSingle(foreignNumEntries).toNumber();
553
- const scope = AztecAddress.fromField(fromSingle(foreignScope));
554
- await this.handlerAsUtility().copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, scope);
555
- return toForeignCallResult([]);
469
+ aztec_utl_getPendingTaggedLogsV2(...inputs) {
470
+ return callTxeHandler({
471
+ oracle: 'aztec_utl_getPendingTaggedLogsV2',
472
+ inputs,
473
+ handler: ([scope, providedSecrets])=>this.handlerAsUtility().getPendingTaggedLogsV2(scope, providedSecrets)
474
+ });
556
475
  }
557
- // TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
558
- // 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
559
- // to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
560
- // existence of a txe_oracle method?
561
476
  // eslint-disable-next-line camelcase
562
- async aztec_utl_decryptAes128(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
563
- const ciphertext = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
564
- const iv = fromUintArray(foreignIv, 8);
565
- const symKey = fromUintArray(foreignSymKey, 8);
566
- // Noir Option<BoundedVec> is encoded as [is_some: Field, storage: Field[], length: Field].
567
- try {
568
- const plaintextBuffer = await this.handlerAsUtility().decryptAes128(ciphertext, iv, symKey);
569
- const [storage, length] = arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length);
570
- return toForeignCallResult([
571
- toSingle(new Fr(1)),
572
- storage,
573
- length
574
- ]);
575
- } catch {
576
- const zeroStorage = toArray(Array(foreignCiphertextBVecStorage.length).fill(new Fr(0)));
577
- return toForeignCallResult([
578
- toSingle(new Fr(0)),
579
- zeroStorage,
580
- toSingle(new Fr(0))
581
- ]);
582
- }
477
+ aztec_utl_validateAndStoreEnqueuedNotesAndEvents(...inputs) {
478
+ return callTxeHandler({
479
+ oracle: 'aztec_utl_validateAndStoreEnqueuedNotesAndEvents',
480
+ inputs,
481
+ handler: ([noteValidationRequests, eventValidationRequests, scope])=>this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(noteValidationRequests, eventValidationRequests, scope)
482
+ });
583
483
  }
584
484
  // eslint-disable-next-line camelcase
585
- async aztec_utl_getSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2, foreignContractAddress) {
586
- const address = AztecAddress.fromField(fromSingle(foreignAddress));
587
- const ephPK = Point.fromFields([
588
- fromSingle(foreignEphPKField0),
589
- fromSingle(foreignEphPKField1),
590
- fromSingle(foreignEphPKField2)
591
- ]);
592
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
593
- const secret = await this.handlerAsUtility().getSharedSecret(address, ephPK, contractAddress);
594
- return toForeignCallResult([
595
- toSingle(secret)
596
- ]);
485
+ aztec_utl_getLogsByTagV2(...inputs) {
486
+ return callTxeHandler({
487
+ oracle: 'aztec_utl_getLogsByTagV2',
488
+ inputs,
489
+ handler: ([requestArrayBaseSlot])=>this.handlerAsUtility().getLogsByTagV2(requestArrayBaseSlot)
490
+ });
597
491
  }
598
492
  // eslint-disable-next-line camelcase
599
- aztec_utl_setContractSyncCacheInvalid(foreignContractAddress, foreignScopes, foreignScopeCount) {
600
- const contractAddress = addressFromSingle(foreignContractAddress);
601
- const count = fromSingle(foreignScopeCount).toNumber();
602
- const scopes = fromArray(foreignScopes).slice(0, count).map((f)=>new AztecAddress(f));
603
- this.handlerAsUtility().setContractSyncCacheInvalid(contractAddress, scopes);
604
- return Promise.resolve(toForeignCallResult([]));
493
+ aztec_utl_getResolvedTxs(...inputs) {
494
+ return callTxeHandler({
495
+ oracle: 'aztec_utl_getResolvedTxs',
496
+ inputs,
497
+ handler: ([requestArrayBaseSlot])=>this.handlerAsUtility().getResolvedTxs(requestArrayBaseSlot)
498
+ });
605
499
  }
606
500
  // eslint-disable-next-line camelcase
607
- aztec_utl_emitOffchainEffect(_foreignData) {
608
- throw new Error('Offchain effects are not yet supported in the TestEnvironment');
501
+ aztec_utl_getTxEffects(...inputs) {
502
+ return callTxeHandler({
503
+ oracle: 'aztec_utl_getTxEffects',
504
+ inputs,
505
+ handler: ([txHashes])=>this.handlerAsUtility().getTxEffects(txHashes)
506
+ });
609
507
  }
610
- // AVM opcodes
611
508
  // eslint-disable-next-line camelcase
612
- aztec_avm_emitPublicLog(_foreignMessage) {
613
- // TODO(#8811): Implement
614
- return toForeignCallResult([]);
509
+ aztec_utl_setCapsule(...inputs) {
510
+ return callTxeHandler({
511
+ oracle: 'aztec_utl_setCapsule',
512
+ inputs,
513
+ handler: ([contractAddress, slot, capsule, scope])=>this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope)
514
+ });
615
515
  }
616
516
  // eslint-disable-next-line camelcase
617
- async aztec_avm_storageRead(foreignSlot, foreignContractAddress) {
618
- const slot = fromSingle(foreignSlot);
619
- const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
620
- const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
621
- return toForeignCallResult([
622
- toSingle(new Fr(value))
623
- ]);
517
+ aztec_utl_getCapsule(...inputs) {
518
+ return callTxeHandler({
519
+ oracle: 'aztec_utl_getCapsule',
520
+ inputs,
521
+ handler: ([contractAddress, slot, tSize, scope])=>this.handlerAsUtility().getCapsule(contractAddress, slot, tSize, scope)
522
+ });
624
523
  }
625
524
  // eslint-disable-next-line camelcase
626
- async aztec_avm_storageWrite(foreignSlot, foreignValue) {
627
- const slot = fromSingle(foreignSlot);
628
- const value = fromSingle(foreignValue);
629
- await this.handlerAsAvm().storageWrite(slot, value);
630
- return toForeignCallResult([]);
525
+ aztec_utl_deleteCapsule(...inputs) {
526
+ return callTxeHandler({
527
+ oracle: 'aztec_utl_deleteCapsule',
528
+ inputs,
529
+ handler: ([contractAddress, slot, scope])=>this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope)
530
+ });
631
531
  }
632
532
  // eslint-disable-next-line camelcase
633
- async aztec_avm_getContractInstanceDeployer(foreignAddress) {
634
- const address = addressFromSingle(foreignAddress);
635
- const instance = await this.handlerAsUtility().getContractInstance(address);
636
- return toForeignCallResult([
637
- toSingle(instance.deployer),
638
- // AVM requires an extra boolean indicating the instance was found
639
- toSingle(new Fr(1))
640
- ]);
533
+ aztec_utl_copyCapsule(...inputs) {
534
+ return callTxeHandler({
535
+ oracle: 'aztec_utl_copyCapsule',
536
+ inputs,
537
+ handler: ([contractAddress, srcSlot, dstSlot, numEntries, scope])=>this.handlerAsUtility().copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, scope)
538
+ });
641
539
  }
642
540
  // eslint-disable-next-line camelcase
643
- async aztec_avm_getContractInstanceClassId(foreignAddress) {
644
- const address = addressFromSingle(foreignAddress);
645
- const instance = await this.handlerAsUtility().getContractInstance(address);
646
- return toForeignCallResult([
647
- toSingle(instance.currentContractClassId),
648
- // AVM requires an extra boolean indicating the instance was found
649
- toSingle(new Fr(1))
650
- ]);
541
+ aztec_utl_pushEphemeral(...inputs) {
542
+ return callTxeHandler({
543
+ oracle: 'aztec_utl_pushEphemeral',
544
+ inputs,
545
+ handler: ([slot, elements])=>this.handlerAsUtility().pushEphemeral(slot, elements)
546
+ });
651
547
  }
652
548
  // eslint-disable-next-line camelcase
653
- async aztec_avm_getContractInstanceInitializationHash(foreignAddress) {
654
- const address = addressFromSingle(foreignAddress);
655
- const instance = await this.handlerAsUtility().getContractInstance(address);
656
- return toForeignCallResult([
657
- toSingle(instance.initializationHash),
658
- // AVM requires an extra boolean indicating the instance was found
659
- toSingle(new Fr(1))
660
- ]);
549
+ aztec_utl_popEphemeral(...inputs) {
550
+ return callTxeHandler({
551
+ oracle: 'aztec_utl_popEphemeral',
552
+ inputs,
553
+ handler: ([slot])=>this.handlerAsUtility().popEphemeral(slot)
554
+ });
661
555
  }
662
556
  // eslint-disable-next-line camelcase
663
- async aztec_avm_sender() {
664
- const sender = await this.handlerAsAvm().sender();
665
- return toForeignCallResult([
666
- toSingle(sender)
667
- ]);
557
+ aztec_utl_getEphemeral(...inputs) {
558
+ return callTxeHandler({
559
+ oracle: 'aztec_utl_getEphemeral',
560
+ inputs,
561
+ handler: ([slot, index])=>this.handlerAsUtility().getEphemeral(slot, index)
562
+ });
668
563
  }
669
564
  // eslint-disable-next-line camelcase
670
- async aztec_avm_emitNullifier(foreignNullifier) {
671
- const nullifier = fromSingle(foreignNullifier);
672
- await this.handlerAsAvm().emitNullifier(nullifier);
673
- return toForeignCallResult([]);
565
+ aztec_utl_setEphemeral(...inputs) {
566
+ return callTxeHandler({
567
+ oracle: 'aztec_utl_setEphemeral',
568
+ inputs,
569
+ handler: ([slot, index, elements])=>this.handlerAsUtility().setEphemeral(slot, index, elements)
570
+ });
674
571
  }
675
572
  // eslint-disable-next-line camelcase
676
- async aztec_avm_emitNoteHash(foreignNoteHash) {
677
- const noteHash = fromSingle(foreignNoteHash);
678
- await this.handlerAsAvm().emitNoteHash(noteHash);
679
- return toForeignCallResult([]);
573
+ aztec_utl_getEphemeralLen(...inputs) {
574
+ return callTxeHandler({
575
+ oracle: 'aztec_utl_getEphemeralLen',
576
+ inputs,
577
+ handler: ([slot])=>this.handlerAsUtility().getEphemeralLen(slot)
578
+ });
680
579
  }
681
580
  // eslint-disable-next-line camelcase
682
- async aztec_avm_nullifierExists(foreignSiloedNullifier) {
683
- const siloedNullifier = fromSingle(foreignSiloedNullifier);
684
- const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
685
- return toForeignCallResult([
686
- toSingle(new Fr(exists))
687
- ]);
581
+ aztec_utl_removeEphemeral(...inputs) {
582
+ return callTxeHandler({
583
+ oracle: 'aztec_utl_removeEphemeral',
584
+ inputs,
585
+ handler: ([slot, index])=>this.handlerAsUtility().removeEphemeral(slot, index)
586
+ });
688
587
  }
689
588
  // eslint-disable-next-line camelcase
690
- async aztec_avm_address() {
691
- const contractAddress = await this.handlerAsAvm().address();
692
- return toForeignCallResult([
693
- toSingle(contractAddress.toField())
694
- ]);
589
+ aztec_utl_clearEphemeral(...inputs) {
590
+ return callTxeHandler({
591
+ oracle: 'aztec_utl_clearEphemeral',
592
+ inputs,
593
+ handler: ([slot])=>this.handlerAsUtility().clearEphemeral(slot)
594
+ });
695
595
  }
696
596
  // eslint-disable-next-line camelcase
697
- async aztec_avm_blockNumber() {
698
- const blockNumber = await this.handlerAsAvm().blockNumber();
699
- return toForeignCallResult([
700
- toSingle(new Fr(blockNumber))
701
- ]);
597
+ aztec_utl_pushTransient(...inputs) {
598
+ return callTxeHandler({
599
+ oracle: 'aztec_utl_pushTransient',
600
+ inputs,
601
+ handler: ([slot, elements])=>this.handlerAsUtility().pushTransient(slot, elements)
602
+ });
702
603
  }
703
604
  // eslint-disable-next-line camelcase
704
- async aztec_avm_timestamp() {
705
- const timestamp = await this.handlerAsAvm().timestamp();
706
- return toForeignCallResult([
707
- toSingle(new Fr(timestamp))
708
- ]);
605
+ aztec_utl_popTransient(...inputs) {
606
+ return callTxeHandler({
607
+ oracle: 'aztec_utl_popTransient',
608
+ inputs,
609
+ handler: ([slot])=>this.handlerAsUtility().popTransient(slot)
610
+ });
709
611
  }
710
612
  // eslint-disable-next-line camelcase
711
- async aztec_avm_isStaticCall() {
712
- const isStaticCall = await this.handlerAsAvm().isStaticCall();
713
- return toForeignCallResult([
714
- toSingle(new Fr(isStaticCall ? 1 : 0))
715
- ]);
613
+ aztec_utl_getTransient(...inputs) {
614
+ return callTxeHandler({
615
+ oracle: 'aztec_utl_getTransient',
616
+ inputs,
617
+ handler: ([slot, index])=>this.handlerAsUtility().getTransient(slot, index)
618
+ });
716
619
  }
717
620
  // eslint-disable-next-line camelcase
718
- async aztec_avm_chainId() {
719
- const chainId = await this.handlerAsAvm().chainId();
720
- return toForeignCallResult([
721
- toSingle(chainId)
722
- ]);
621
+ aztec_utl_setTransient(...inputs) {
622
+ return callTxeHandler({
623
+ oracle: 'aztec_utl_setTransient',
624
+ inputs,
625
+ handler: ([slot, index, elements])=>this.handlerAsUtility().setTransient(slot, index, elements)
626
+ });
723
627
  }
724
628
  // eslint-disable-next-line camelcase
725
- async aztec_avm_version() {
726
- const version = await this.handlerAsAvm().version();
727
- return toForeignCallResult([
728
- toSingle(version)
729
- ]);
629
+ aztec_utl_getTransientLen(...inputs) {
630
+ return callTxeHandler({
631
+ oracle: 'aztec_utl_getTransientLen',
632
+ inputs,
633
+ handler: ([slot])=>this.handlerAsUtility().getTransientLen(slot)
634
+ });
730
635
  }
731
636
  // eslint-disable-next-line camelcase
732
- aztec_avm_returndataSize() {
733
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
637
+ aztec_utl_removeTransient(...inputs) {
638
+ return callTxeHandler({
639
+ oracle: 'aztec_utl_removeTransient',
640
+ inputs,
641
+ handler: ([slot, index])=>this.handlerAsUtility().removeTransient(slot, index)
642
+ });
734
643
  }
735
644
  // eslint-disable-next-line camelcase
736
- aztec_avm_returndataCopy(_foreignRdOffset, _foreignCopySize) {
737
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
645
+ aztec_utl_clearTransient(...inputs) {
646
+ return callTxeHandler({
647
+ oracle: 'aztec_utl_clearTransient',
648
+ inputs,
649
+ handler: ([slot])=>this.handlerAsUtility().clearTransient(slot)
650
+ });
738
651
  }
652
+ // TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
653
+ // 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
654
+ // to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
655
+ // existence of a txe_oracle method?
739
656
  // eslint-disable-next-line camelcase
740
- aztec_avm_call(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
741
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
657
+ aztec_utl_decryptAes128(...inputs) {
658
+ return callTxeHandler({
659
+ oracle: 'aztec_utl_decryptAes128',
660
+ inputs,
661
+ handler: ([ciphertext, iv, symKey])=>this.handlerAsUtility().decryptAes128(ciphertext, iv, symKey)
662
+ });
663
+ }
664
+ // eslint-disable-next-line camelcase
665
+ aztec_utl_getSharedSecrets(...inputs) {
666
+ return callTxeHandler({
667
+ oracle: 'aztec_utl_getSharedSecrets',
668
+ inputs,
669
+ handler: ([address, ephPksSlot, contractAddress])=>this.handlerAsUtility().getSharedSecrets(address, ephPksSlot, contractAddress)
670
+ });
671
+ }
672
+ // eslint-disable-next-line camelcase
673
+ aztec_utl_setContractSyncCacheInvalid(...inputs) {
674
+ return callTxeHandler({
675
+ oracle: 'aztec_utl_setContractSyncCacheInvalid',
676
+ inputs,
677
+ handler: ([contractAddress, scopes])=>this.handlerAsUtility().setContractSyncCacheInvalid(contractAddress, scopes)
678
+ });
679
+ }
680
+ // eslint-disable-next-line camelcase
681
+ aztec_utl_emitOffchainEffect(...inputs) {
682
+ return callTxeHandler({
683
+ oracle: 'aztec_utl_emitOffchainEffect',
684
+ inputs,
685
+ handler: ([data])=>{
686
+ // Record the raw payload against the currently-executing top-level call. The Noir side
687
+ // (via `env.offchain_messages()`) is responsible for decoding the protocol-reserved prefix
688
+ // (`OFFCHAIN_MESSAGE_IDENTIFIER`, recipient) and turning each payload into an `OffchainMessage` struct suitable
689
+ // for `offchain_receive`.
690
+ this.stateHandler.recordOffchainEffect(data);
691
+ }
692
+ });
693
+ }
694
+ // eslint-disable-next-line camelcase
695
+ aztec_utl_recordFact(...inputs) {
696
+ return callTxeHandler({
697
+ oracle: 'aztec_utl_recordFact',
698
+ inputs,
699
+ handler: ([contractAddress, scope, factCollectionTypeId, factCollectionId, factTypeId, payload, originBlock])=>this.handlerAsUtility().recordFact(contractAddress, scope, factCollectionTypeId, factCollectionId, factTypeId, payload, originBlock)
700
+ });
701
+ }
702
+ // eslint-disable-next-line camelcase
703
+ aztec_utl_deleteFactCollection(...inputs) {
704
+ return callTxeHandler({
705
+ oracle: 'aztec_utl_deleteFactCollection',
706
+ inputs,
707
+ handler: ([contractAddress, scope, factCollectionTypeId, factCollectionId])=>this.handlerAsUtility().deleteFactCollection(contractAddress, scope, factCollectionTypeId, factCollectionId)
708
+ });
709
+ }
710
+ // eslint-disable-next-line camelcase
711
+ aztec_utl_getFactCollection(...inputs) {
712
+ return callTxeHandler({
713
+ oracle: 'aztec_utl_getFactCollection',
714
+ inputs,
715
+ handler: ([contractAddress, scope, factCollectionTypeId, factCollectionId])=>this.handlerAsUtility().getFactCollection(contractAddress, scope, factCollectionTypeId, factCollectionId)
716
+ });
717
+ }
718
+ // eslint-disable-next-line camelcase
719
+ aztec_utl_getFactCollectionsByType(...inputs) {
720
+ return callTxeHandler({
721
+ oracle: 'aztec_utl_getFactCollectionsByType',
722
+ inputs,
723
+ handler: ([contractAddress, scope, factCollectionTypeId])=>this.handlerAsUtility().getFactCollectionsByType(contractAddress, scope, factCollectionTypeId)
724
+ });
742
725
  }
726
+ // AVM opcodes
743
727
  // eslint-disable-next-line camelcase
744
- aztec_avm_staticCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
745
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
728
+ aztec_avm_emitPublicLog() {
729
+ return callTxeHandler({
730
+ oracle: 'aztec_avm_emitPublicLog',
731
+ inputs: [],
732
+ // TODO(#8811): Implement
733
+ handler: ()=>{}
734
+ });
746
735
  }
747
736
  // eslint-disable-next-line camelcase
748
- aztec_avm_successCopy() {
749
- throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
750
- }
751
- // eslint-disable-next-line camelcase
752
- async aztec_txe_privateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
753
- const from = addressFromSingle(foreignFrom);
754
- const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
755
- const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
756
- const args = fromArray(foreignArgs);
757
- const argsHash = fromSingle(foreignArgsHash);
758
- const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
759
- const returnValues = await this.handlerAsTxe().privateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall, this.stateHandler.getCurrentJob());
760
- // TODO(F-335): Avoid doing the following call here.
761
- await this.stateHandler.cycleJob();
762
- return toForeignCallResult([
763
- toArray(returnValues)
764
- ]);
765
- }
766
- // eslint-disable-next-line camelcase
767
- async aztec_txe_executeUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs) {
768
- const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
769
- const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
770
- const args = fromArray(foreignArgs);
771
- const returnValues = await this.handlerAsTxe().executeUtilityFunction(targetContractAddress, functionSelector, args, this.stateHandler.getCurrentJob());
772
- // TODO(F-335): Avoid doing the following call here.
773
- await this.stateHandler.cycleJob();
774
- return toForeignCallResult([
775
- toArray(returnValues)
776
- ]);
777
- }
778
- // eslint-disable-next-line camelcase
779
- async aztec_txe_publicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
780
- const from = addressFromSingle(foreignFrom);
781
- const address = addressFromSingle(foreignAddress);
782
- const calldata = fromArray(foreignCalldata);
783
- const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
784
- const returnValues = await this.handlerAsTxe().publicCallNewFlow(from, address, calldata, isStaticCall);
785
- // TODO(F-335): Avoid doing the following call here.
786
- await this.stateHandler.cycleJob();
787
- return toForeignCallResult([
788
- toArray(returnValues)
789
- ]);
790
- }
791
- // eslint-disable-next-line camelcase
792
- async aztec_prv_getSenderForTags() {
793
- const sender = await this.handlerAsPrivate().getSenderForTags();
794
- // Return a Noir Option struct with `some` and `value` fields
795
- if (sender === undefined) {
796
- // No sender found, return Option with some=0 and value=0
797
- return toForeignCallResult([
798
- toSingle(0),
799
- toSingle(0)
800
- ]);
801
- } else {
802
- // Sender found, return Option with some=1 and value=sender address
803
- return toForeignCallResult([
804
- toSingle(1),
805
- toSingle(sender)
806
- ]);
807
- }
737
+ aztec_avm_storageRead(...inputs) {
738
+ return callTxeHandler({
739
+ oracle: 'aztec_avm_storageRead',
740
+ inputs,
741
+ handler: ([slot, contractAddress])=>this.handlerAsAvm().storageRead(slot, contractAddress)
742
+ });
743
+ }
744
+ // eslint-disable-next-line camelcase
745
+ aztec_avm_storageWrite(...inputs) {
746
+ return callTxeHandler({
747
+ oracle: 'aztec_avm_storageWrite',
748
+ inputs,
749
+ handler: ([slot, value])=>this.handlerAsAvm().storageWrite(slot, value)
750
+ });
751
+ }
752
+ // eslint-disable-next-line camelcase
753
+ aztec_avm_getContractInstanceDeployer(...inputs) {
754
+ return callTxeHandler({
755
+ oracle: 'aztec_avm_getContractInstanceDeployer',
756
+ inputs,
757
+ handler: ([address])=>this.handlerAsAvm().getContractInstanceDeployer(address)
758
+ });
759
+ }
760
+ // eslint-disable-next-line camelcase
761
+ aztec_avm_getContractInstanceClassId(...inputs) {
762
+ return callTxeHandler({
763
+ oracle: 'aztec_avm_getContractInstanceClassId',
764
+ inputs,
765
+ handler: ([address])=>this.handlerAsAvm().getContractInstanceClassId(address)
766
+ });
767
+ }
768
+ // eslint-disable-next-line camelcase
769
+ aztec_avm_getContractInstanceInitializationHash(...inputs) {
770
+ return callTxeHandler({
771
+ oracle: 'aztec_avm_getContractInstanceInitializationHash',
772
+ inputs,
773
+ handler: ([address])=>this.handlerAsAvm().getContractInstanceInitializationHash(address)
774
+ });
775
+ }
776
+ // eslint-disable-next-line camelcase
777
+ aztec_avm_getContractInstanceImmutablesHash(...inputs) {
778
+ return callTxeHandler({
779
+ oracle: 'aztec_avm_getContractInstanceImmutablesHash',
780
+ inputs,
781
+ handler: ([address])=>this.handlerAsAvm().getContractInstanceImmutablesHash(address)
782
+ });
783
+ }
784
+ // eslint-disable-next-line camelcase
785
+ aztec_avm_sender() {
786
+ return callTxeHandler({
787
+ oracle: 'aztec_avm_sender',
788
+ inputs: [],
789
+ handler: ()=>this.handlerAsAvm().sender()
790
+ });
808
791
  }
809
792
  // eslint-disable-next-line camelcase
810
- async aztec_prv_setSenderForTags(foreignSenderForTags) {
811
- const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
812
- await this.handlerAsPrivate().setSenderForTags(senderForTags);
813
- return toForeignCallResult([]);
793
+ aztec_avm_emitNullifier(...inputs) {
794
+ return callTxeHandler({
795
+ oracle: 'aztec_avm_emitNullifier',
796
+ inputs,
797
+ handler: ([nullifier])=>this.handlerAsAvm().emitNullifier(nullifier)
798
+ });
814
799
  }
815
800
  // eslint-disable-next-line camelcase
816
- async aztec_prv_getNextAppTagAsSender(foreignSender, foreignRecipient) {
817
- const sender = AztecAddress.fromField(fromSingle(foreignSender));
818
- const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
819
- const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
820
- return toForeignCallResult([
821
- toSingle(nextAppTag.value)
822
- ]);
801
+ aztec_avm_emitNoteHash(...inputs) {
802
+ return callTxeHandler({
803
+ oracle: 'aztec_avm_emitNoteHash',
804
+ inputs,
805
+ handler: ([noteHash])=>this.handlerAsAvm().emitNoteHash(noteHash)
806
+ });
807
+ }
808
+ // eslint-disable-next-line camelcase
809
+ aztec_avm_nullifierExists(...inputs) {
810
+ return callTxeHandler({
811
+ oracle: 'aztec_avm_nullifierExists',
812
+ inputs,
813
+ handler: ([siloedNullifier])=>this.handlerAsAvm().nullifierExists(siloedNullifier)
814
+ });
815
+ }
816
+ // eslint-disable-next-line camelcase
817
+ aztec_avm_address() {
818
+ return callTxeHandler({
819
+ oracle: 'aztec_avm_address',
820
+ inputs: [],
821
+ handler: ()=>this.handlerAsAvm().address()
822
+ });
823
+ }
824
+ // eslint-disable-next-line camelcase
825
+ aztec_avm_blockNumber() {
826
+ return callTxeHandler({
827
+ oracle: 'aztec_avm_blockNumber',
828
+ inputs: [],
829
+ handler: ()=>this.handlerAsAvm().blockNumber()
830
+ });
831
+ }
832
+ // eslint-disable-next-line camelcase
833
+ aztec_avm_timestamp() {
834
+ return callTxeHandler({
835
+ oracle: 'aztec_avm_timestamp',
836
+ inputs: [],
837
+ handler: ()=>this.handlerAsAvm().timestamp()
838
+ });
839
+ }
840
+ // eslint-disable-next-line camelcase
841
+ aztec_avm_isStaticCall() {
842
+ return callTxeHandler({
843
+ oracle: 'aztec_avm_isStaticCall',
844
+ inputs: [],
845
+ handler: ()=>this.handlerAsAvm().isStaticCall()
846
+ });
847
+ }
848
+ // eslint-disable-next-line camelcase
849
+ aztec_avm_chainId() {
850
+ return callTxeHandler({
851
+ oracle: 'aztec_avm_chainId',
852
+ inputs: [],
853
+ handler: ()=>this.handlerAsAvm().chainId()
854
+ });
855
+ }
856
+ // eslint-disable-next-line camelcase
857
+ aztec_avm_version() {
858
+ return callTxeHandler({
859
+ oracle: 'aztec_avm_version',
860
+ inputs: [],
861
+ handler: ()=>this.handlerAsAvm().version()
862
+ });
863
+ }
864
+ // eslint-disable-next-line camelcase
865
+ aztec_avm_returndataSize() {
866
+ return callTxeHandler({
867
+ oracle: 'aztec_avm_returndataSize',
868
+ inputs: [],
869
+ handler: ()=>this.handlerAsAvm().returndataSize()
870
+ });
871
+ }
872
+ // eslint-disable-next-line camelcase
873
+ aztec_avm_returndataCopy(...inputs) {
874
+ return callTxeHandler({
875
+ oracle: 'aztec_avm_returndataCopy',
876
+ inputs,
877
+ handler: ([rdOffset, copySize])=>this.handlerAsAvm().returndataCopy(rdOffset, copySize)
878
+ });
879
+ }
880
+ // eslint-disable-next-line camelcase
881
+ aztec_avm_call(...inputs) {
882
+ return callTxeHandler({
883
+ oracle: 'aztec_avm_call',
884
+ inputs,
885
+ handler: ([l2Gas, daGas, address, argsLength, args])=>this.handlerAsAvm().call(l2Gas, daGas, address, argsLength, args)
886
+ });
887
+ }
888
+ // eslint-disable-next-line camelcase
889
+ aztec_avm_staticCall(...inputs) {
890
+ return callTxeHandler({
891
+ oracle: 'aztec_avm_staticCall',
892
+ inputs,
893
+ handler: ([l2Gas, daGas, address, argsLength, args])=>this.handlerAsAvm().staticCall(l2Gas, daGas, address, argsLength, args)
894
+ });
895
+ }
896
+ // eslint-disable-next-line camelcase
897
+ aztec_avm_successCopy() {
898
+ return callTxeHandler({
899
+ oracle: 'aztec_avm_successCopy',
900
+ inputs: [],
901
+ handler: ()=>this.handlerAsAvm().successCopy()
902
+ });
903
+ }
904
+ // eslint-disable-next-line camelcase
905
+ aztec_txe_privateCallNewFlow(...inputs) {
906
+ return callTxeHandler({
907
+ oracle: 'aztec_txe_privateCallNewFlow',
908
+ inputs,
909
+ handler: ([from, targetContractAddress, functionSelector, args, argsHash, isStaticCall, additionalScopes, authorizedUtilityCallTargets, gasSettings])=>this.stateHandler.executePrivateCall(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall, additionalScopes, authorizedUtilityCallTargets, gasSettings)
910
+ });
911
+ }
912
+ // eslint-disable-next-line camelcase
913
+ aztec_txe_executeUtilityFunction(...inputs) {
914
+ return callTxeHandler({
915
+ oracle: 'aztec_txe_executeUtilityFunction',
916
+ inputs,
917
+ handler: ([from, targetContractAddress, functionSelector, args, authorizedUtilityCallTargets])=>this.stateHandler.executeUtilityFunction(from, targetContractAddress, functionSelector, args, authorizedUtilityCallTargets)
918
+ });
919
+ }
920
+ // eslint-disable-next-line camelcase
921
+ aztec_txe_publicCallNewFlow(...inputs) {
922
+ return callTxeHandler({
923
+ oracle: 'aztec_txe_publicCallNewFlow',
924
+ inputs,
925
+ handler: ([from, address, calldata, isStaticCall, gasSettings])=>this.stateHandler.executePublicCall(from, address, calldata, isStaticCall, gasSettings)
926
+ });
927
+ }
928
+ // eslint-disable-next-line camelcase
929
+ aztec_prv_getSenderForTags() {
930
+ return callTxeHandler({
931
+ oracle: 'aztec_prv_getSenderForTags',
932
+ inputs: [],
933
+ handler: ()=>this.handlerAsPrivate().getSenderForTags()
934
+ });
935
+ }
936
+ // eslint-disable-next-line camelcase
937
+ aztec_prv_resolveTaggingStrategy(...inputs) {
938
+ return callTxeHandler({
939
+ oracle: 'aztec_prv_resolveTaggingStrategy',
940
+ inputs,
941
+ handler: ([sender, recipient, deliveryMode])=>this.handlerAsPrivate().resolveTaggingStrategy(sender, recipient, deliveryMode)
942
+ });
943
+ }
944
+ // eslint-disable-next-line camelcase
945
+ aztec_prv_resolveCustomRequest(...inputs) {
946
+ return callTxeHandler({
947
+ oracle: 'aztec_prv_resolveCustomRequest',
948
+ inputs,
949
+ handler: ([kind, payload])=>this.handlerAsPrivate().resolveCustomRequest(kind, payload)
950
+ });
951
+ }
952
+ // eslint-disable-next-line camelcase
953
+ aztec_prv_getAppTaggingSecret(...inputs) {
954
+ return callTxeHandler({
955
+ oracle: 'aztec_prv_getAppTaggingSecret',
956
+ inputs,
957
+ handler: ([sender, recipient])=>this.handlerAsPrivate().getAppTaggingSecret(sender, recipient)
958
+ });
959
+ }
960
+ // eslint-disable-next-line camelcase
961
+ aztec_prv_getNextTaggingIndex(...inputs) {
962
+ return callTxeHandler({
963
+ oracle: 'aztec_prv_getNextTaggingIndex',
964
+ inputs,
965
+ handler: ([secret, deliveryMode])=>this.handlerAsPrivate().getNextTaggingIndex(secret, deliveryMode)
966
+ });
823
967
  }
824
968
  }