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