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