@aztec/txe 0.0.1-commit.1142ef1 → 0.0.1-commit.11bf3dd6e
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 +1 -2
- package/dest/constants.d.ts.map +1 -1
- package/dest/constants.js +0 -1
- 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 +29 -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 +16 -16
- package/dest/oracle/txe_oracle_top_level_context.d.ts +28 -22
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +165 -71
- package/dest/rpc_translator.d.ts +125 -81
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +426 -179
- package/dest/state_machine/archiver.d.ts +20 -69
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +36 -179
- 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 +40 -13
- 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 -6
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +3 -3
- package/dest/txe_session.d.ts +12 -6
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +115 -28
- package/dest/util/encoding.d.ts +88 -18
- 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 +4 -4
- package/dest/utils/block_creation.d.ts.map +1 -1
- package/dest/utils/block_creation.js +18 -4
- package/dest/utils/tx_effect_creation.d.ts +2 -3
- package/dest/utils/tx_effect_creation.d.ts.map +1 -1
- package/dest/utils/tx_effect_creation.js +3 -6
- package/package.json +16 -16
- package/src/constants.ts +0 -1
- package/src/index.ts +89 -52
- package/src/oracle/interfaces.ts +32 -31
- package/src/oracle/txe_oracle_public_context.ts +16 -18
- package/src/oracle/txe_oracle_top_level_context.ts +208 -123
- package/src/rpc_translator.ts +493 -204
- package/src/state_machine/archiver.ts +38 -234
- 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 +56 -12
- package/src/state_machine/mock_epoch_cache.ts +57 -14
- package/src/state_machine/synchronizer.ts +5 -5
- package/src/txe_session.ts +132 -88
- package/src/util/encoding.ts +5 -0
- package/src/util/txe_public_contract_data_source.ts +10 -38
- package/src/utils/block_creation.ts +19 -16
- package/src/utils/tx_effect_creation.ts +3 -11
- 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
2
|
import { MAX_NOTE_HASHES_PER_TX, MAX_NULLIFIERS_PER_TX } from '@aztec/constants';
|
|
3
3
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
4
|
-
import {
|
|
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,74 @@ 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
|
+
async aztec_txe_getPrivateEvents(foreignSelector, foreignContractAddress, foreignScope) {
|
|
176
194
|
const selector = EventSelector.fromField(fromSingle(foreignSelector));
|
|
177
195
|
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
178
196
|
const scope = addressFromSingle(foreignScope);
|
|
179
|
-
|
|
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);
|
|
180
204
|
if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
|
|
181
205
|
throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
|
|
182
206
|
}
|
|
@@ -194,48 +218,54 @@ export class RPCTranslator {
|
|
|
194
218
|
toSingle(queryLength)
|
|
195
219
|
]);
|
|
196
220
|
}
|
|
197
|
-
|
|
221
|
+
// eslint-disable-next-line camelcase
|
|
222
|
+
aztec_prv_setHashPreimage(foreignValues, foreignHash) {
|
|
198
223
|
const values = fromArray(foreignValues);
|
|
199
224
|
const hash = fromSingle(foreignHash);
|
|
200
|
-
this.handlerAsPrivate().
|
|
225
|
+
this.handlerAsPrivate().setHashPreimage(values, hash);
|
|
201
226
|
return toForeignCallResult([]);
|
|
202
227
|
}
|
|
203
|
-
|
|
228
|
+
// eslint-disable-next-line camelcase
|
|
229
|
+
async aztec_prv_getHashPreimage(foreignHash) {
|
|
204
230
|
const hash = fromSingle(foreignHash);
|
|
205
|
-
const returns = await this.handlerAsPrivate().
|
|
231
|
+
const returns = await this.handlerAsPrivate().getHashPreimage(hash);
|
|
206
232
|
return toForeignCallResult([
|
|
207
233
|
toArray(returns)
|
|
208
234
|
]);
|
|
209
235
|
}
|
|
210
236
|
// When the argument is a slice, noir automatically adds a length field to oracle call.
|
|
211
237
|
// When the argument is an array, we add the field length manually to the signature.
|
|
212
|
-
|
|
238
|
+
// eslint-disable-next-line camelcase
|
|
239
|
+
async aztec_utl_log(foreignLevel, foreignMessage, _foreignLength, foreignFields) {
|
|
213
240
|
const level = fromSingle(foreignLevel).toNumber();
|
|
214
241
|
const message = fromArray(foreignMessage).map((field)=>String.fromCharCode(field.toNumber())).join('');
|
|
215
242
|
const fields = fromArray(foreignFields);
|
|
216
|
-
this.handlerAsMisc().
|
|
243
|
+
await this.handlerAsMisc().log(level, message, fields);
|
|
217
244
|
return toForeignCallResult([]);
|
|
218
245
|
}
|
|
219
|
-
|
|
246
|
+
// eslint-disable-next-line camelcase
|
|
247
|
+
async aztec_utl_getFromPublicStorage(foreignBlockHash, foreignContractAddress, foreignStartStorageSlot, foreignNumberOfElements) {
|
|
248
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
220
249
|
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
221
250
|
const startStorageSlot = fromSingle(foreignStartStorageSlot);
|
|
222
|
-
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
223
251
|
const numberOfElements = fromSingle(foreignNumberOfElements).toNumber();
|
|
224
|
-
const values = await this.handlerAsUtility().
|
|
252
|
+
const values = await this.handlerAsUtility().getFromPublicStorage(blockHash, contractAddress, startStorageSlot, numberOfElements);
|
|
225
253
|
return toForeignCallResult([
|
|
226
254
|
toArray(values)
|
|
227
255
|
]);
|
|
228
256
|
}
|
|
229
|
-
|
|
230
|
-
|
|
257
|
+
// eslint-disable-next-line camelcase
|
|
258
|
+
async aztec_utl_getPublicDataWitness(foreignBlockHash, foreignLeafSlot) {
|
|
259
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
231
260
|
const leafSlot = fromSingle(foreignLeafSlot);
|
|
232
|
-
const witness = await this.handlerAsUtility().
|
|
261
|
+
const witness = await this.handlerAsUtility().getPublicDataWitness(blockHash, leafSlot);
|
|
233
262
|
if (!witness) {
|
|
234
|
-
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()}.`);
|
|
235
264
|
}
|
|
236
265
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
237
266
|
}
|
|
238
|
-
|
|
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) {
|
|
239
269
|
// Parse Option<AztecAddress>: ownerIsSome is 0 for None, 1 for Some
|
|
240
270
|
const owner = fromSingle(foreignOwnerIsSome).toBool() ? AztecAddress.fromField(fromSingle(foreignOwnerValue)) : undefined;
|
|
241
271
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
@@ -253,23 +283,24 @@ export class RPCTranslator {
|
|
|
253
283
|
const offset = fromSingle(foreignOffset).toNumber();
|
|
254
284
|
const status = fromSingle(foreignStatus).toNumber();
|
|
255
285
|
const maxNotes = fromSingle(foreignMaxNotes).toNumber();
|
|
256
|
-
const
|
|
257
|
-
const noteDatas = await this.handlerAsUtility().
|
|
258
|
-
const returnDataAsArrayOfArrays = noteDatas.map((noteData)=>
|
|
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({
|
|
259
289
|
contractAddress: noteData.contractAddress,
|
|
260
290
|
owner: noteData.owner,
|
|
261
291
|
randomness: noteData.randomness,
|
|
262
292
|
storageSlot: noteData.storageSlot,
|
|
263
293
|
noteNonce: noteData.noteNonce,
|
|
264
|
-
|
|
294
|
+
isPending: noteData.isPending,
|
|
265
295
|
note: noteData.note
|
|
266
296
|
}));
|
|
267
297
|
// Now we convert each sub-array to an array of ForeignCallSingles
|
|
268
298
|
const returnDataAsArrayOfForeignCallSingleArrays = returnDataAsArrayOfArrays.map((subArray)=>subArray.map(toSingle));
|
|
269
299
|
// At last we convert the array of arrays to a bounded vec of arrays
|
|
270
|
-
return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes,
|
|
300
|
+
return toForeignCallResult(arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfForeignCallSingleArrays, maxNotes, packedHintedNoteLength));
|
|
271
301
|
}
|
|
272
|
-
|
|
302
|
+
// eslint-disable-next-line camelcase
|
|
303
|
+
aztec_prv_notifyCreatedNote(foreignOwner, foreignStorageSlot, foreignRandomness, foreignNoteTypeId, foreignNote, foreignNoteHash, foreignCounter) {
|
|
273
304
|
const owner = addressFromSingle(foreignOwner);
|
|
274
305
|
const storageSlot = fromSingle(foreignStorageSlot);
|
|
275
306
|
const randomness = fromSingle(foreignRandomness);
|
|
@@ -277,31 +308,44 @@ export class RPCTranslator {
|
|
|
277
308
|
const note = fromArray(foreignNote);
|
|
278
309
|
const noteHash = fromSingle(foreignNoteHash);
|
|
279
310
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
280
|
-
this.handlerAsPrivate().
|
|
311
|
+
this.handlerAsPrivate().notifyCreatedNote(owner, storageSlot, randomness, noteTypeId, note, noteHash, counter);
|
|
281
312
|
return toForeignCallResult([]);
|
|
282
313
|
}
|
|
283
|
-
|
|
314
|
+
// eslint-disable-next-line camelcase
|
|
315
|
+
async aztec_prv_notifyNullifiedNote(foreignInnerNullifier, foreignNoteHash, foreignCounter) {
|
|
284
316
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
285
317
|
const noteHash = fromSingle(foreignNoteHash);
|
|
286
318
|
const counter = fromSingle(foreignCounter).toNumber();
|
|
287
|
-
await this.handlerAsPrivate().
|
|
319
|
+
await this.handlerAsPrivate().notifyNullifiedNote(innerNullifier, noteHash, counter);
|
|
288
320
|
return toForeignCallResult([]);
|
|
289
321
|
}
|
|
290
|
-
|
|
322
|
+
// eslint-disable-next-line camelcase
|
|
323
|
+
async aztec_prv_notifyCreatedNullifier(foreignInnerNullifier) {
|
|
291
324
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
292
|
-
await this.handlerAsPrivate().
|
|
325
|
+
await this.handlerAsPrivate().notifyCreatedNullifier(innerNullifier);
|
|
293
326
|
return toForeignCallResult([]);
|
|
294
327
|
}
|
|
295
|
-
|
|
328
|
+
// eslint-disable-next-line camelcase
|
|
329
|
+
async aztec_prv_isNullifierPending(foreignInnerNullifier, foreignContractAddress) {
|
|
330
|
+
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
331
|
+
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
332
|
+
const isPending = await this.handlerAsPrivate().isNullifierPending(innerNullifier, contractAddress);
|
|
333
|
+
return toForeignCallResult([
|
|
334
|
+
toSingle(new Fr(isPending))
|
|
335
|
+
]);
|
|
336
|
+
}
|
|
337
|
+
// eslint-disable-next-line camelcase
|
|
338
|
+
async aztec_utl_doesNullifierExist(foreignInnerNullifier) {
|
|
296
339
|
const innerNullifier = fromSingle(foreignInnerNullifier);
|
|
297
|
-
const exists = await this.handlerAsUtility().
|
|
340
|
+
const exists = await this.handlerAsUtility().doesNullifierExist(innerNullifier);
|
|
298
341
|
return toForeignCallResult([
|
|
299
342
|
toSingle(new Fr(exists))
|
|
300
343
|
]);
|
|
301
344
|
}
|
|
302
|
-
|
|
345
|
+
// eslint-disable-next-line camelcase
|
|
346
|
+
async aztec_utl_getContractInstance(foreignAddress) {
|
|
303
347
|
const address = addressFromSingle(foreignAddress);
|
|
304
|
-
const instance = await this.handlerAsUtility().
|
|
348
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
305
349
|
return toForeignCallResult([
|
|
306
350
|
instance.salt,
|
|
307
351
|
instance.deployer.toField(),
|
|
@@ -310,36 +354,53 @@ export class RPCTranslator {
|
|
|
310
354
|
...instance.publicKeys.toFields()
|
|
311
355
|
].map(toSingle));
|
|
312
356
|
}
|
|
313
|
-
|
|
357
|
+
// eslint-disable-next-line camelcase
|
|
358
|
+
async aztec_utl_getPublicKeysAndPartialAddress(foreignAddress) {
|
|
314
359
|
const address = addressFromSingle(foreignAddress);
|
|
315
|
-
const
|
|
316
|
-
return
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
360
|
+
const result = await this.handlerAsUtility().getPublicKeysAndPartialAddress(address);
|
|
361
|
+
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
362
|
+
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
363
|
+
if (result === undefined) {
|
|
364
|
+
// No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
|
|
365
|
+
return toForeignCallResult([
|
|
366
|
+
toSingle(new Fr(0)),
|
|
367
|
+
toArray(Array(13).fill(new Fr(0)))
|
|
368
|
+
]);
|
|
369
|
+
} else {
|
|
370
|
+
// Data was found so we set `some` to 1 and return it along with `value`.
|
|
371
|
+
return toForeignCallResult([
|
|
372
|
+
toSingle(new Fr(1)),
|
|
373
|
+
toArray([
|
|
374
|
+
...result.publicKeys.toFields(),
|
|
375
|
+
result.partialAddress
|
|
376
|
+
])
|
|
377
|
+
]);
|
|
378
|
+
}
|
|
322
379
|
}
|
|
323
|
-
|
|
380
|
+
// eslint-disable-next-line camelcase
|
|
381
|
+
async aztec_utl_getKeyValidationRequest(foreignPkMHash) {
|
|
324
382
|
const pkMHash = fromSingle(foreignPkMHash);
|
|
325
|
-
const keyValidationRequest = await this.handlerAsUtility().
|
|
383
|
+
const keyValidationRequest = await this.handlerAsUtility().getKeyValidationRequest(pkMHash);
|
|
326
384
|
return toForeignCallResult(keyValidationRequest.toFields().map(toSingle));
|
|
327
385
|
}
|
|
328
|
-
|
|
386
|
+
// eslint-disable-next-line camelcase
|
|
387
|
+
aztec_prv_callPrivateFunction(_foreignTargetContractAddress, _foreignFunctionSelector, _foreignArgsHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
|
|
329
388
|
throw new Error('Contract calls are forbidden inside a `TestEnvironment::private_context`, use `private_call` instead');
|
|
330
389
|
}
|
|
331
|
-
|
|
332
|
-
|
|
390
|
+
// eslint-disable-next-line camelcase
|
|
391
|
+
async aztec_utl_getNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
|
|
392
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
333
393
|
const nullifier = fromSingle(foreignNullifier);
|
|
334
|
-
const witness = await this.handlerAsUtility().
|
|
394
|
+
const witness = await this.handlerAsUtility().getNullifierMembershipWitness(blockHash, nullifier);
|
|
335
395
|
if (!witness) {
|
|
336
|
-
throw new Error(`Nullifier membership witness not found at block ${
|
|
396
|
+
throw new Error(`Nullifier membership witness not found at block ${blockHash}.`);
|
|
337
397
|
}
|
|
338
398
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
339
399
|
}
|
|
340
|
-
|
|
400
|
+
// eslint-disable-next-line camelcase
|
|
401
|
+
async aztec_utl_getAuthWitness(foreignMessageHash) {
|
|
341
402
|
const messageHash = fromSingle(foreignMessageHash);
|
|
342
|
-
const authWitness = await this.handlerAsUtility().
|
|
403
|
+
const authWitness = await this.handlerAsUtility().getAuthWitness(messageHash);
|
|
343
404
|
if (!authWitness) {
|
|
344
405
|
throw new Error(`Auth witness not found for message hash ${messageHash}.`);
|
|
345
406
|
}
|
|
@@ -347,87 +408,152 @@ export class RPCTranslator {
|
|
|
347
408
|
toArray(authWitness)
|
|
348
409
|
]);
|
|
349
410
|
}
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
}
|
|
353
|
-
privateNotifySetPublicTeardownFunctionCall(_foreignTargetContractAddress, _foreignCalldataHash, _foreignSideEffectCounter, _foreignIsStaticCall) {
|
|
411
|
+
// eslint-disable-next-line camelcase
|
|
412
|
+
aztec_prv_assertValidPublicCalldata(_foreignCalldataHash) {
|
|
354
413
|
throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
|
|
355
414
|
}
|
|
356
|
-
|
|
415
|
+
// eslint-disable-next-line camelcase
|
|
416
|
+
aztec_prv_notifyRevertiblePhaseStart(_foreignMinRevertibleSideEffectCounter) {
|
|
357
417
|
throw new Error('Enqueueing public calls is not supported in TestEnvironment::private_context');
|
|
358
418
|
}
|
|
359
|
-
|
|
419
|
+
// eslint-disable-next-line camelcase
|
|
420
|
+
async aztec_prv_isExecutionInRevertiblePhase(foreignSideEffectCounter) {
|
|
360
421
|
const sideEffectCounter = fromSingle(foreignSideEffectCounter).toNumber();
|
|
361
|
-
const isRevertible = await this.handlerAsPrivate().
|
|
422
|
+
const isRevertible = await this.handlerAsPrivate().isExecutionInRevertiblePhase(sideEffectCounter);
|
|
362
423
|
return toForeignCallResult([
|
|
363
424
|
toSingle(new Fr(isRevertible))
|
|
364
425
|
]);
|
|
365
426
|
}
|
|
366
|
-
|
|
367
|
-
|
|
427
|
+
// eslint-disable-next-line camelcase
|
|
428
|
+
aztec_utl_getUtilityContext() {
|
|
429
|
+
const context = this.handlerAsUtility().getUtilityContext();
|
|
368
430
|
return toForeignCallResult(context.toNoirRepresentation());
|
|
369
431
|
}
|
|
370
|
-
|
|
432
|
+
// eslint-disable-next-line camelcase
|
|
433
|
+
async aztec_utl_getBlockHeader(foreignBlockNumber) {
|
|
371
434
|
const blockNumber = BlockNumber(fromSingle(foreignBlockNumber).toNumber());
|
|
372
|
-
const header = await this.handlerAsUtility().
|
|
435
|
+
const header = await this.handlerAsUtility().getBlockHeader(blockNumber);
|
|
373
436
|
if (!header) {
|
|
374
437
|
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
375
438
|
}
|
|
376
439
|
return toForeignCallResult(header.toFields().map(toSingle));
|
|
377
440
|
}
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
const
|
|
381
|
-
const
|
|
382
|
-
const witness = await this.handlerAsUtility().
|
|
441
|
+
// eslint-disable-next-line camelcase
|
|
442
|
+
async aztec_utl_getNoteHashMembershipWitness(foreignAnchorBlockHash, foreignNoteHash) {
|
|
443
|
+
const blockHash = blockHashFromSingle(foreignAnchorBlockHash);
|
|
444
|
+
const noteHash = fromSingle(foreignNoteHash);
|
|
445
|
+
const witness = await this.handlerAsUtility().getNoteHashMembershipWitness(blockHash, noteHash);
|
|
383
446
|
if (!witness) {
|
|
384
|
-
throw new Error(`
|
|
447
|
+
throw new Error(`Note hash ${noteHash} not found in the note hash tree at block ${blockHash.toString()}.`);
|
|
385
448
|
}
|
|
386
|
-
return toForeignCallResult(
|
|
387
|
-
toSingle(witness[0]),
|
|
388
|
-
toArray(witness.slice(1))
|
|
389
|
-
]);
|
|
449
|
+
return toForeignCallResult(witness.toNoirRepresentation());
|
|
390
450
|
}
|
|
391
|
-
|
|
392
|
-
|
|
451
|
+
// eslint-disable-next-line camelcase
|
|
452
|
+
async aztec_utl_getBlockHashMembershipWitness(foreignAnchorBlockHash, foreignBlockHash) {
|
|
453
|
+
const anchorBlockHash = blockHashFromSingle(foreignAnchorBlockHash);
|
|
454
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
455
|
+
const witness = await this.handlerAsUtility().getBlockHashMembershipWitness(anchorBlockHash, blockHash);
|
|
456
|
+
if (!witness) {
|
|
457
|
+
throw new Error(`Block hash ${blockHash.toString()} not found in the archive tree at anchor block ${anchorBlockHash.toString()}.`);
|
|
458
|
+
}
|
|
459
|
+
return toForeignCallResult(witness.toNoirRepresentation());
|
|
460
|
+
}
|
|
461
|
+
// eslint-disable-next-line camelcase
|
|
462
|
+
async aztec_utl_getLowNullifierMembershipWitness(foreignBlockHash, foreignNullifier) {
|
|
463
|
+
const blockHash = blockHashFromSingle(foreignBlockHash);
|
|
393
464
|
const nullifier = fromSingle(foreignNullifier);
|
|
394
|
-
const witness = await this.handlerAsUtility().
|
|
465
|
+
const witness = await this.handlerAsUtility().getLowNullifierMembershipWitness(blockHash, nullifier);
|
|
395
466
|
if (!witness) {
|
|
396
|
-
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}.`);
|
|
397
468
|
}
|
|
398
469
|
return toForeignCallResult(witness.toNoirRepresentation());
|
|
399
470
|
}
|
|
400
|
-
|
|
471
|
+
// eslint-disable-next-line camelcase
|
|
472
|
+
async aztec_utl_getPendingTaggedLogs(foreignPendingTaggedLogArrayBaseSlot, foreignScope) {
|
|
401
473
|
const pendingTaggedLogArrayBaseSlot = fromSingle(foreignPendingTaggedLogArrayBaseSlot);
|
|
402
|
-
|
|
474
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
475
|
+
await this.handlerAsUtility().getPendingTaggedLogs(pendingTaggedLogArrayBaseSlot, scope);
|
|
403
476
|
return toForeignCallResult([]);
|
|
404
477
|
}
|
|
405
|
-
|
|
478
|
+
// eslint-disable-next-line camelcase
|
|
479
|
+
async aztec_utl_getPendingTaggedLogs_v2(foreignScope) {
|
|
480
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
481
|
+
const slot = await this.handlerAsUtility().getPendingTaggedLogsV2(scope);
|
|
482
|
+
return toForeignCallResult([
|
|
483
|
+
toSingle(slot)
|
|
484
|
+
]);
|
|
485
|
+
}
|
|
486
|
+
// eslint-disable-next-line camelcase
|
|
487
|
+
async aztec_utl_validateAndStoreEnqueuedNotesAndEvents(foreignContractAddress, foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignMaxNotePackedLen, foreignMaxEventSerializedLen, foreignScope) {
|
|
406
488
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
407
489
|
const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
|
|
408
490
|
const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
|
|
409
|
-
|
|
491
|
+
const maxNotePackedLen = fromSingle(foreignMaxNotePackedLen).toNumber();
|
|
492
|
+
const maxEventSerializedLen = fromSingle(foreignMaxEventSerializedLen).toNumber();
|
|
493
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
494
|
+
await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEvents(contractAddress, noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, maxNotePackedLen, maxEventSerializedLen, scope);
|
|
410
495
|
return toForeignCallResult([]);
|
|
411
496
|
}
|
|
412
|
-
|
|
497
|
+
// eslint-disable-next-line camelcase
|
|
498
|
+
async aztec_utl_validateAndStoreEnqueuedNotesAndEvents_v2(foreignNoteValidationRequestsArrayBaseSlot, foreignEventValidationRequestsArrayBaseSlot, foreignMaxNotePackedLen, foreignMaxEventSerializedLen, foreignScope) {
|
|
499
|
+
const noteValidationRequestsArrayBaseSlot = fromSingle(foreignNoteValidationRequestsArrayBaseSlot);
|
|
500
|
+
const eventValidationRequestsArrayBaseSlot = fromSingle(foreignEventValidationRequestsArrayBaseSlot);
|
|
501
|
+
const maxNotePackedLen = fromSingle(foreignMaxNotePackedLen).toNumber();
|
|
502
|
+
const maxEventSerializedLen = fromSingle(foreignMaxEventSerializedLen).toNumber();
|
|
503
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
504
|
+
await this.handlerAsUtility().validateAndStoreEnqueuedNotesAndEventsV2(noteValidationRequestsArrayBaseSlot, eventValidationRequestsArrayBaseSlot, maxNotePackedLen, maxEventSerializedLen, scope);
|
|
505
|
+
return toForeignCallResult([]);
|
|
506
|
+
}
|
|
507
|
+
// eslint-disable-next-line camelcase
|
|
508
|
+
async aztec_utl_getLogsByTag(foreignContractAddress, foreignLogRetrievalRequestsArrayBaseSlot, foreignLogRetrievalResponsesArrayBaseSlot, foreignScope) {
|
|
413
509
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
414
510
|
const logRetrievalRequestsArrayBaseSlot = fromSingle(foreignLogRetrievalRequestsArrayBaseSlot);
|
|
415
511
|
const logRetrievalResponsesArrayBaseSlot = fromSingle(foreignLogRetrievalResponsesArrayBaseSlot);
|
|
416
|
-
|
|
512
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
513
|
+
await this.handlerAsUtility().getLogsByTag(contractAddress, logRetrievalRequestsArrayBaseSlot, logRetrievalResponsesArrayBaseSlot, scope);
|
|
514
|
+
return toForeignCallResult([]);
|
|
515
|
+
}
|
|
516
|
+
// eslint-disable-next-line camelcase
|
|
517
|
+
async aztec_utl_getMessageContextsByTxHash(foreignContractAddress, foreignMessageContextRequestsArrayBaseSlot, foreignMessageContextResponsesArrayBaseSlot, foreignScope) {
|
|
518
|
+
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
519
|
+
const messageContextRequestsArrayBaseSlot = fromSingle(foreignMessageContextRequestsArrayBaseSlot);
|
|
520
|
+
const messageContextResponsesArrayBaseSlot = fromSingle(foreignMessageContextResponsesArrayBaseSlot);
|
|
521
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
522
|
+
await this.handlerAsUtility().getMessageContextsByTxHash(contractAddress, messageContextRequestsArrayBaseSlot, messageContextResponsesArrayBaseSlot, scope);
|
|
417
523
|
return toForeignCallResult([]);
|
|
418
524
|
}
|
|
419
|
-
|
|
525
|
+
// eslint-disable-next-line camelcase
|
|
526
|
+
async aztec_utl_getLogsByTag_v2(foreignRequestArrayBaseSlot) {
|
|
527
|
+
const requestArrayBaseSlot = fromSingle(foreignRequestArrayBaseSlot);
|
|
528
|
+
const responseSlot = await this.handlerAsUtility().getLogsByTagV2(requestArrayBaseSlot);
|
|
529
|
+
return toForeignCallResult([
|
|
530
|
+
toSingle(responseSlot)
|
|
531
|
+
]);
|
|
532
|
+
}
|
|
533
|
+
// eslint-disable-next-line camelcase
|
|
534
|
+
async aztec_utl_getMessageContextsByTxHash_v2(foreignRequestArrayBaseSlot) {
|
|
535
|
+
const requestArrayBaseSlot = fromSingle(foreignRequestArrayBaseSlot);
|
|
536
|
+
const responseSlot = await this.handlerAsUtility().getMessageContextsByTxHashV2(requestArrayBaseSlot);
|
|
537
|
+
return toForeignCallResult([
|
|
538
|
+
toSingle(responseSlot)
|
|
539
|
+
]);
|
|
540
|
+
}
|
|
541
|
+
// eslint-disable-next-line camelcase
|
|
542
|
+
aztec_utl_setCapsule(foreignContractAddress, foreignSlot, foreignCapsule, foreignScope) {
|
|
420
543
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
421
544
|
const slot = fromSingle(foreignSlot);
|
|
422
545
|
const capsule = fromArray(foreignCapsule);
|
|
423
|
-
|
|
546
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
547
|
+
this.handlerAsUtility().setCapsule(contractAddress, slot, capsule, scope);
|
|
424
548
|
return toForeignCallResult([]);
|
|
425
549
|
}
|
|
426
|
-
|
|
550
|
+
// eslint-disable-next-line camelcase
|
|
551
|
+
async aztec_utl_getCapsule(foreignContractAddress, foreignSlot, foreignTSize, foreignScope) {
|
|
427
552
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
428
553
|
const slot = fromSingle(foreignSlot);
|
|
429
554
|
const tSize = fromSingle(foreignTSize).toNumber();
|
|
430
|
-
const
|
|
555
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
556
|
+
const values = await this.handlerAsUtility().getCapsule(contractAddress, slot, scope);
|
|
431
557
|
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
432
558
|
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
433
559
|
if (values === null) {
|
|
@@ -444,197 +570,316 @@ export class RPCTranslator {
|
|
|
444
570
|
]);
|
|
445
571
|
}
|
|
446
572
|
}
|
|
447
|
-
|
|
573
|
+
// eslint-disable-next-line camelcase
|
|
574
|
+
aztec_utl_deleteCapsule(foreignContractAddress, foreignSlot, foreignScope) {
|
|
448
575
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
449
576
|
const slot = fromSingle(foreignSlot);
|
|
450
|
-
|
|
577
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
578
|
+
this.handlerAsUtility().deleteCapsule(contractAddress, slot, scope);
|
|
451
579
|
return toForeignCallResult([]);
|
|
452
580
|
}
|
|
453
|
-
|
|
581
|
+
// eslint-disable-next-line camelcase
|
|
582
|
+
async aztec_utl_copyCapsule(foreignContractAddress, foreignSrcSlot, foreignDstSlot, foreignNumEntries, foreignScope) {
|
|
454
583
|
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
455
584
|
const srcSlot = fromSingle(foreignSrcSlot);
|
|
456
585
|
const dstSlot = fromSingle(foreignDstSlot);
|
|
457
586
|
const numEntries = fromSingle(foreignNumEntries).toNumber();
|
|
458
|
-
|
|
587
|
+
const scope = AztecAddress.fromField(fromSingle(foreignScope));
|
|
588
|
+
await this.handlerAsUtility().copyCapsule(contractAddress, srcSlot, dstSlot, numEntries, scope);
|
|
589
|
+
return toForeignCallResult([]);
|
|
590
|
+
}
|
|
591
|
+
// eslint-disable-next-line camelcase
|
|
592
|
+
aztec_utl_pushEphemeral(foreignSlot, foreignElements) {
|
|
593
|
+
const slot = fromSingle(foreignSlot);
|
|
594
|
+
const elements = fromArray(foreignElements);
|
|
595
|
+
const newLen = this.handlerAsUtility().pushEphemeral(slot, elements);
|
|
596
|
+
return toForeignCallResult([
|
|
597
|
+
toSingle(new Fr(newLen))
|
|
598
|
+
]);
|
|
599
|
+
}
|
|
600
|
+
// eslint-disable-next-line camelcase
|
|
601
|
+
aztec_utl_popEphemeral(foreignSlot) {
|
|
602
|
+
const slot = fromSingle(foreignSlot);
|
|
603
|
+
const element = this.handlerAsUtility().popEphemeral(slot);
|
|
604
|
+
return toForeignCallResult([
|
|
605
|
+
toArray(element)
|
|
606
|
+
]);
|
|
607
|
+
}
|
|
608
|
+
// eslint-disable-next-line camelcase
|
|
609
|
+
aztec_utl_getEphemeral(foreignSlot, foreignIndex) {
|
|
610
|
+
const slot = fromSingle(foreignSlot);
|
|
611
|
+
const index = fromSingle(foreignIndex).toNumber();
|
|
612
|
+
const element = this.handlerAsUtility().getEphemeral(slot, index);
|
|
613
|
+
return toForeignCallResult([
|
|
614
|
+
toArray(element)
|
|
615
|
+
]);
|
|
616
|
+
}
|
|
617
|
+
// eslint-disable-next-line camelcase
|
|
618
|
+
aztec_utl_setEphemeral(foreignSlot, foreignIndex, foreignElements) {
|
|
619
|
+
const slot = fromSingle(foreignSlot);
|
|
620
|
+
const index = fromSingle(foreignIndex).toNumber();
|
|
621
|
+
const elements = fromArray(foreignElements);
|
|
622
|
+
this.handlerAsUtility().setEphemeral(slot, index, elements);
|
|
623
|
+
return toForeignCallResult([]);
|
|
624
|
+
}
|
|
625
|
+
// eslint-disable-next-line camelcase
|
|
626
|
+
aztec_utl_getEphemeralLen(foreignSlot) {
|
|
627
|
+
const slot = fromSingle(foreignSlot);
|
|
628
|
+
const len = this.handlerAsUtility().getEphemeralLen(slot);
|
|
629
|
+
return toForeignCallResult([
|
|
630
|
+
toSingle(new Fr(len))
|
|
631
|
+
]);
|
|
632
|
+
}
|
|
633
|
+
// eslint-disable-next-line camelcase
|
|
634
|
+
aztec_utl_removeEphemeral(foreignSlot, foreignIndex) {
|
|
635
|
+
const slot = fromSingle(foreignSlot);
|
|
636
|
+
const index = fromSingle(foreignIndex).toNumber();
|
|
637
|
+
this.handlerAsUtility().removeEphemeral(slot, index);
|
|
638
|
+
return toForeignCallResult([]);
|
|
639
|
+
}
|
|
640
|
+
// eslint-disable-next-line camelcase
|
|
641
|
+
aztec_utl_clearEphemeral(foreignSlot) {
|
|
642
|
+
const slot = fromSingle(foreignSlot);
|
|
643
|
+
this.handlerAsUtility().clearEphemeral(slot);
|
|
459
644
|
return toForeignCallResult([]);
|
|
460
645
|
}
|
|
461
646
|
// TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts.
|
|
462
647
|
// The compiler didn't throw an error, so it took me a while to learn of the existence of this file, and that I need
|
|
463
648
|
// to implement this function here. Isn't there a way to programmatically identify that this is missing, given the
|
|
464
649
|
// existence of a txe_oracle method?
|
|
465
|
-
|
|
650
|
+
// eslint-disable-next-line camelcase
|
|
651
|
+
async aztec_utl_decryptAes128(foreignCiphertextBVecStorage, foreignCiphertextLength, foreignIv, foreignSymKey) {
|
|
466
652
|
const ciphertext = fromUintBoundedVec(foreignCiphertextBVecStorage, foreignCiphertextLength, 8);
|
|
467
653
|
const iv = fromUintArray(foreignIv, 8);
|
|
468
654
|
const symKey = fromUintArray(foreignSymKey, 8);
|
|
469
|
-
|
|
470
|
-
|
|
655
|
+
// Noir Option<BoundedVec> is encoded as [is_some: Field, storage: Field[], length: Field].
|
|
656
|
+
try {
|
|
657
|
+
const plaintextBuffer = await this.handlerAsUtility().decryptAes128(ciphertext, iv, symKey);
|
|
658
|
+
const [storage, length] = arrayToBoundedVec(bufferToU8Array(plaintextBuffer), foreignCiphertextBVecStorage.length);
|
|
659
|
+
return toForeignCallResult([
|
|
660
|
+
toSingle(new Fr(1)),
|
|
661
|
+
storage,
|
|
662
|
+
length
|
|
663
|
+
]);
|
|
664
|
+
} catch {
|
|
665
|
+
const zeroStorage = toArray(Array(foreignCiphertextBVecStorage.length).fill(new Fr(0)));
|
|
666
|
+
return toForeignCallResult([
|
|
667
|
+
toSingle(new Fr(0)),
|
|
668
|
+
zeroStorage,
|
|
669
|
+
toSingle(new Fr(0))
|
|
670
|
+
]);
|
|
671
|
+
}
|
|
471
672
|
}
|
|
472
|
-
|
|
673
|
+
// eslint-disable-next-line camelcase
|
|
674
|
+
async aztec_utl_getSharedSecret(foreignAddress, foreignEphPKField0, foreignEphPKField1, foreignEphPKField2, foreignContractAddress) {
|
|
473
675
|
const address = AztecAddress.fromField(fromSingle(foreignAddress));
|
|
474
676
|
const ephPK = Point.fromFields([
|
|
475
677
|
fromSingle(foreignEphPKField0),
|
|
476
678
|
fromSingle(foreignEphPKField1),
|
|
477
679
|
fromSingle(foreignEphPKField2)
|
|
478
680
|
]);
|
|
479
|
-
const
|
|
480
|
-
|
|
681
|
+
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
682
|
+
const secret = await this.handlerAsUtility().getSharedSecret(address, ephPK, contractAddress);
|
|
683
|
+
return toForeignCallResult([
|
|
684
|
+
toSingle(secret)
|
|
685
|
+
]);
|
|
686
|
+
}
|
|
687
|
+
// eslint-disable-next-line camelcase
|
|
688
|
+
aztec_utl_setContractSyncCacheInvalid(foreignContractAddress, foreignScopes, foreignScopeCount) {
|
|
689
|
+
const contractAddress = addressFromSingle(foreignContractAddress);
|
|
690
|
+
const count = fromSingle(foreignScopeCount).toNumber();
|
|
691
|
+
const scopes = fromArray(foreignScopes).slice(0, count).map((f)=>new AztecAddress(f));
|
|
692
|
+
this.handlerAsUtility().setContractSyncCacheInvalid(contractAddress, scopes);
|
|
693
|
+
return Promise.resolve(toForeignCallResult([]));
|
|
481
694
|
}
|
|
482
|
-
|
|
695
|
+
// eslint-disable-next-line camelcase
|
|
696
|
+
aztec_utl_emitOffchainEffect(_foreignData) {
|
|
483
697
|
throw new Error('Offchain effects are not yet supported in the TestEnvironment');
|
|
484
698
|
}
|
|
485
699
|
// AVM opcodes
|
|
486
|
-
|
|
700
|
+
// eslint-disable-next-line camelcase
|
|
701
|
+
aztec_avm_emitPublicLog(_foreignMessage) {
|
|
487
702
|
// TODO(#8811): Implement
|
|
488
703
|
return toForeignCallResult([]);
|
|
489
704
|
}
|
|
490
|
-
|
|
705
|
+
// eslint-disable-next-line camelcase
|
|
706
|
+
async aztec_avm_storageRead(foreignSlot, foreignContractAddress) {
|
|
491
707
|
const slot = fromSingle(foreignSlot);
|
|
492
|
-
const
|
|
708
|
+
const contractAddress = AztecAddress.fromField(fromSingle(foreignContractAddress));
|
|
709
|
+
const value = (await this.handlerAsAvm().storageRead(slot, contractAddress)).value;
|
|
493
710
|
return toForeignCallResult([
|
|
494
711
|
toSingle(new Fr(value))
|
|
495
712
|
]);
|
|
496
713
|
}
|
|
497
|
-
|
|
714
|
+
// eslint-disable-next-line camelcase
|
|
715
|
+
async aztec_avm_storageWrite(foreignSlot, foreignValue) {
|
|
498
716
|
const slot = fromSingle(foreignSlot);
|
|
499
717
|
const value = fromSingle(foreignValue);
|
|
500
|
-
await this.handlerAsAvm().
|
|
718
|
+
await this.handlerAsAvm().storageWrite(slot, value);
|
|
501
719
|
return toForeignCallResult([]);
|
|
502
720
|
}
|
|
503
|
-
|
|
721
|
+
// eslint-disable-next-line camelcase
|
|
722
|
+
async aztec_avm_getContractInstanceDeployer(foreignAddress) {
|
|
504
723
|
const address = addressFromSingle(foreignAddress);
|
|
505
|
-
const instance = await this.handlerAsUtility().
|
|
724
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
506
725
|
return toForeignCallResult([
|
|
507
726
|
toSingle(instance.deployer),
|
|
508
727
|
// AVM requires an extra boolean indicating the instance was found
|
|
509
728
|
toSingle(new Fr(1))
|
|
510
729
|
]);
|
|
511
730
|
}
|
|
512
|
-
|
|
731
|
+
// eslint-disable-next-line camelcase
|
|
732
|
+
async aztec_avm_getContractInstanceClassId(foreignAddress) {
|
|
513
733
|
const address = addressFromSingle(foreignAddress);
|
|
514
|
-
const instance = await this.handlerAsUtility().
|
|
734
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
515
735
|
return toForeignCallResult([
|
|
516
736
|
toSingle(instance.currentContractClassId),
|
|
517
737
|
// AVM requires an extra boolean indicating the instance was found
|
|
518
738
|
toSingle(new Fr(1))
|
|
519
739
|
]);
|
|
520
740
|
}
|
|
521
|
-
|
|
741
|
+
// eslint-disable-next-line camelcase
|
|
742
|
+
async aztec_avm_getContractInstanceInitializationHash(foreignAddress) {
|
|
522
743
|
const address = addressFromSingle(foreignAddress);
|
|
523
|
-
const instance = await this.handlerAsUtility().
|
|
744
|
+
const instance = await this.handlerAsUtility().getContractInstance(address);
|
|
524
745
|
return toForeignCallResult([
|
|
525
746
|
toSingle(instance.initializationHash),
|
|
526
747
|
// AVM requires an extra boolean indicating the instance was found
|
|
527
748
|
toSingle(new Fr(1))
|
|
528
749
|
]);
|
|
529
750
|
}
|
|
530
|
-
|
|
531
|
-
|
|
751
|
+
// eslint-disable-next-line camelcase
|
|
752
|
+
async aztec_avm_sender() {
|
|
753
|
+
const sender = await this.handlerAsAvm().sender();
|
|
532
754
|
return toForeignCallResult([
|
|
533
755
|
toSingle(sender)
|
|
534
756
|
]);
|
|
535
757
|
}
|
|
536
|
-
|
|
758
|
+
// eslint-disable-next-line camelcase
|
|
759
|
+
async aztec_avm_emitNullifier(foreignNullifier) {
|
|
537
760
|
const nullifier = fromSingle(foreignNullifier);
|
|
538
|
-
await this.handlerAsAvm().
|
|
761
|
+
await this.handlerAsAvm().emitNullifier(nullifier);
|
|
539
762
|
return toForeignCallResult([]);
|
|
540
763
|
}
|
|
541
|
-
|
|
764
|
+
// eslint-disable-next-line camelcase
|
|
765
|
+
async aztec_avm_emitNoteHash(foreignNoteHash) {
|
|
542
766
|
const noteHash = fromSingle(foreignNoteHash);
|
|
543
|
-
await this.handlerAsAvm().
|
|
767
|
+
await this.handlerAsAvm().emitNoteHash(noteHash);
|
|
544
768
|
return toForeignCallResult([]);
|
|
545
769
|
}
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
const
|
|
549
|
-
const exists = await this.handlerAsAvm().
|
|
770
|
+
// eslint-disable-next-line camelcase
|
|
771
|
+
async aztec_avm_nullifierExists(foreignSiloedNullifier) {
|
|
772
|
+
const siloedNullifier = fromSingle(foreignSiloedNullifier);
|
|
773
|
+
const exists = await this.handlerAsAvm().nullifierExists(siloedNullifier);
|
|
550
774
|
return toForeignCallResult([
|
|
551
775
|
toSingle(new Fr(exists))
|
|
552
776
|
]);
|
|
553
777
|
}
|
|
554
|
-
|
|
555
|
-
|
|
778
|
+
// eslint-disable-next-line camelcase
|
|
779
|
+
async aztec_avm_address() {
|
|
780
|
+
const contractAddress = await this.handlerAsAvm().address();
|
|
556
781
|
return toForeignCallResult([
|
|
557
782
|
toSingle(contractAddress.toField())
|
|
558
783
|
]);
|
|
559
784
|
}
|
|
560
|
-
|
|
561
|
-
|
|
785
|
+
// eslint-disable-next-line camelcase
|
|
786
|
+
async aztec_avm_blockNumber() {
|
|
787
|
+
const blockNumber = await this.handlerAsAvm().blockNumber();
|
|
562
788
|
return toForeignCallResult([
|
|
563
789
|
toSingle(new Fr(blockNumber))
|
|
564
790
|
]);
|
|
565
791
|
}
|
|
566
|
-
|
|
567
|
-
|
|
792
|
+
// eslint-disable-next-line camelcase
|
|
793
|
+
async aztec_avm_timestamp() {
|
|
794
|
+
const timestamp = await this.handlerAsAvm().timestamp();
|
|
568
795
|
return toForeignCallResult([
|
|
569
796
|
toSingle(new Fr(timestamp))
|
|
570
797
|
]);
|
|
571
798
|
}
|
|
572
|
-
|
|
573
|
-
|
|
799
|
+
// eslint-disable-next-line camelcase
|
|
800
|
+
async aztec_avm_isStaticCall() {
|
|
801
|
+
const isStaticCall = await this.handlerAsAvm().isStaticCall();
|
|
574
802
|
return toForeignCallResult([
|
|
575
803
|
toSingle(new Fr(isStaticCall ? 1 : 0))
|
|
576
804
|
]);
|
|
577
805
|
}
|
|
578
|
-
|
|
579
|
-
|
|
806
|
+
// eslint-disable-next-line camelcase
|
|
807
|
+
async aztec_avm_chainId() {
|
|
808
|
+
const chainId = await this.handlerAsAvm().chainId();
|
|
580
809
|
return toForeignCallResult([
|
|
581
810
|
toSingle(chainId)
|
|
582
811
|
]);
|
|
583
812
|
}
|
|
584
|
-
|
|
585
|
-
|
|
813
|
+
// eslint-disable-next-line camelcase
|
|
814
|
+
async aztec_avm_version() {
|
|
815
|
+
const version = await this.handlerAsAvm().version();
|
|
586
816
|
return toForeignCallResult([
|
|
587
817
|
toSingle(version)
|
|
588
818
|
]);
|
|
589
819
|
}
|
|
590
|
-
|
|
820
|
+
// eslint-disable-next-line camelcase
|
|
821
|
+
aztec_avm_returndataSize() {
|
|
591
822
|
throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
|
|
592
823
|
}
|
|
593
|
-
|
|
824
|
+
// eslint-disable-next-line camelcase
|
|
825
|
+
aztec_avm_returndataCopy(_foreignRdOffset, _foreignCopySize) {
|
|
594
826
|
throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
|
|
595
827
|
}
|
|
596
|
-
|
|
828
|
+
// eslint-disable-next-line camelcase
|
|
829
|
+
aztec_avm_call(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
|
|
597
830
|
throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
|
|
598
831
|
}
|
|
599
|
-
|
|
832
|
+
// eslint-disable-next-line camelcase
|
|
833
|
+
aztec_avm_staticCall(_foreignL2Gas, _foreignDaGas, _foreignAddress, _foreignLength, _foreignArgs) {
|
|
600
834
|
throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
|
|
601
835
|
}
|
|
602
|
-
|
|
836
|
+
// eslint-disable-next-line camelcase
|
|
837
|
+
aztec_avm_successCopy() {
|
|
603
838
|
throw new Error('Contract calls are forbidden inside a `TestEnvironment::public_context`, use `public_call` instead');
|
|
604
839
|
}
|
|
605
|
-
|
|
840
|
+
// eslint-disable-next-line camelcase
|
|
841
|
+
async aztec_txe_privateCallNewFlow(foreignFrom, foreignTargetContractAddress, foreignFunctionSelector, foreignArgs, foreignArgsHash, foreignIsStaticCall) {
|
|
606
842
|
const from = addressFromSingle(foreignFrom);
|
|
607
843
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
608
844
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
609
845
|
const args = fromArray(foreignArgs);
|
|
610
846
|
const argsHash = fromSingle(foreignArgsHash);
|
|
611
847
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
612
|
-
const returnValues = await this.handlerAsTxe().
|
|
848
|
+
const returnValues = await this.handlerAsTxe().privateCallNewFlow(from, targetContractAddress, functionSelector, args, argsHash, isStaticCall, this.stateHandler.getCurrentJob());
|
|
849
|
+
// TODO(F-335): Avoid doing the following call here.
|
|
850
|
+
await this.stateHandler.cycleJob();
|
|
613
851
|
return toForeignCallResult([
|
|
614
852
|
toArray(returnValues)
|
|
615
853
|
]);
|
|
616
854
|
}
|
|
617
|
-
|
|
855
|
+
// eslint-disable-next-line camelcase
|
|
856
|
+
async aztec_txe_executeUtilityFunction(foreignTargetContractAddress, foreignFunctionSelector, foreignArgs) {
|
|
618
857
|
const targetContractAddress = addressFromSingle(foreignTargetContractAddress);
|
|
619
858
|
const functionSelector = FunctionSelector.fromField(fromSingle(foreignFunctionSelector));
|
|
620
859
|
const args = fromArray(foreignArgs);
|
|
621
|
-
const returnValues = await this.handlerAsTxe().
|
|
860
|
+
const returnValues = await this.handlerAsTxe().executeUtilityFunction(targetContractAddress, functionSelector, args, this.stateHandler.getCurrentJob());
|
|
861
|
+
// TODO(F-335): Avoid doing the following call here.
|
|
862
|
+
await this.stateHandler.cycleJob();
|
|
622
863
|
return toForeignCallResult([
|
|
623
864
|
toArray(returnValues)
|
|
624
865
|
]);
|
|
625
866
|
}
|
|
626
|
-
|
|
867
|
+
// eslint-disable-next-line camelcase
|
|
868
|
+
async aztec_txe_publicCallNewFlow(foreignFrom, foreignAddress, foreignCalldata, foreignIsStaticCall) {
|
|
627
869
|
const from = addressFromSingle(foreignFrom);
|
|
628
870
|
const address = addressFromSingle(foreignAddress);
|
|
629
871
|
const calldata = fromArray(foreignCalldata);
|
|
630
872
|
const isStaticCall = fromSingle(foreignIsStaticCall).toBool();
|
|
631
|
-
const returnValues = await this.handlerAsTxe().
|
|
873
|
+
const returnValues = await this.handlerAsTxe().publicCallNewFlow(from, address, calldata, isStaticCall);
|
|
874
|
+
// TODO(F-335): Avoid doing the following call here.
|
|
875
|
+
await this.stateHandler.cycleJob();
|
|
632
876
|
return toForeignCallResult([
|
|
633
877
|
toArray(returnValues)
|
|
634
878
|
]);
|
|
635
879
|
}
|
|
636
|
-
|
|
637
|
-
|
|
880
|
+
// eslint-disable-next-line camelcase
|
|
881
|
+
async aztec_prv_getSenderForTags() {
|
|
882
|
+
const sender = await this.handlerAsPrivate().getSenderForTags();
|
|
638
883
|
// Return a Noir Option struct with `some` and `value` fields
|
|
639
884
|
if (sender === undefined) {
|
|
640
885
|
// No sender found, return Option with some=0 and value=0
|
|
@@ -650,15 +895,17 @@ export class RPCTranslator {
|
|
|
650
895
|
]);
|
|
651
896
|
}
|
|
652
897
|
}
|
|
653
|
-
|
|
898
|
+
// eslint-disable-next-line camelcase
|
|
899
|
+
async aztec_prv_setSenderForTags(foreignSenderForTags) {
|
|
654
900
|
const senderForTags = AztecAddress.fromField(fromSingle(foreignSenderForTags));
|
|
655
|
-
await this.handlerAsPrivate().
|
|
901
|
+
await this.handlerAsPrivate().setSenderForTags(senderForTags);
|
|
656
902
|
return toForeignCallResult([]);
|
|
657
903
|
}
|
|
658
|
-
|
|
904
|
+
// eslint-disable-next-line camelcase
|
|
905
|
+
async aztec_prv_getNextAppTagAsSender(foreignSender, foreignRecipient) {
|
|
659
906
|
const sender = AztecAddress.fromField(fromSingle(foreignSender));
|
|
660
907
|
const recipient = AztecAddress.fromField(fromSingle(foreignRecipient));
|
|
661
|
-
const nextAppTag = await this.handlerAsPrivate().
|
|
908
|
+
const nextAppTag = await this.handlerAsPrivate().getNextAppTagAsSender(sender, recipient);
|
|
662
909
|
return toForeignCallResult([
|
|
663
910
|
toSingle(nextAppTag.value)
|
|
664
911
|
]);
|