@aztec/txe 0.0.0-test.1 → 0.0.1-commit.b655e406
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/bin/index.js +3 -2
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +78 -49
- package/dest/oracle/interfaces.d.ts +54 -0
- package/dest/oracle/interfaces.d.ts.map +1 -0
- package/dest/oracle/interfaces.js +3 -0
- package/dest/oracle/txe_oracle_public_context.d.ts +34 -0
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -0
- package/dest/oracle/txe_oracle_public_context.js +124 -0
- package/dest/oracle/txe_oracle_top_level_context.d.ts +56 -0
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -0
- package/dest/oracle/txe_oracle_top_level_context.js +423 -0
- package/dest/rpc_translator.d.ts +237 -0
- package/dest/rpc_translator.d.ts.map +1 -0
- package/dest/rpc_translator.js +617 -0
- package/dest/state_machine/archiver.d.ts +61 -0
- package/dest/state_machine/archiver.d.ts.map +1 -0
- package/dest/state_machine/archiver.js +118 -0
- package/dest/state_machine/dummy_p2p_client.d.ts +52 -0
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -0
- package/dest/state_machine/dummy_p2p_client.js +133 -0
- package/dest/state_machine/global_variable_builder.d.ts +9 -0
- package/dest/state_machine/global_variable_builder.d.ts.map +1 -0
- package/dest/state_machine/global_variable_builder.js +10 -0
- package/dest/state_machine/index.d.ts +16 -0
- package/dest/state_machine/index.d.ts.map +1 -0
- package/dest/state_machine/index.js +51 -0
- package/dest/state_machine/mock_epoch_cache.d.ts +25 -0
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -0
- package/dest/state_machine/mock_epoch_cache.js +50 -0
- package/dest/state_machine/synchronizer.d.ts +32 -0
- package/dest/state_machine/synchronizer.d.ts.map +1 -0
- package/dest/state_machine/synchronizer.js +58 -0
- package/dest/txe_session.d.ts +67 -0
- package/dest/txe_session.d.ts.map +1 -0
- package/dest/txe_session.js +253 -0
- package/dest/util/encoding.d.ts +26 -8
- package/dest/util/encoding.d.ts.map +1 -1
- package/dest/util/encoding.js +65 -10
- package/dest/util/txe_contract_data_provider.d.ts +12 -0
- package/dest/util/txe_contract_data_provider.d.ts.map +1 -0
- package/dest/util/txe_contract_data_provider.js +22 -0
- 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 +36 -57
- package/dest/utils/block_creation.d.ts +13 -0
- package/dest/utils/block_creation.d.ts.map +1 -0
- package/dest/utils/block_creation.js +24 -0
- package/dest/utils/tx_effect_creation.d.ts +5 -0
- package/dest/utils/tx_effect_creation.d.ts.map +1 -0
- package/dest/utils/tx_effect_creation.js +16 -0
- package/package.json +27 -22
- package/src/bin/index.ts +3 -2
- package/src/index.ts +92 -64
- package/src/oracle/interfaces.ts +83 -0
- package/src/oracle/txe_oracle_public_context.ts +165 -0
- package/src/oracle/txe_oracle_top_level_context.ts +658 -0
- package/src/rpc_translator.ts +1013 -0
- package/src/state_machine/archiver.ts +151 -0
- package/src/state_machine/dummy_p2p_client.ts +197 -0
- package/src/state_machine/global_variable_builder.ts +20 -0
- package/src/state_machine/index.ts +77 -0
- package/src/state_machine/mock_epoch_cache.ts +67 -0
- package/src/state_machine/synchronizer.ts +87 -0
- package/src/txe_session.ts +432 -0
- package/src/util/encoding.ts +84 -10
- package/src/util/txe_contract_data_provider.ts +36 -0
- package/src/util/txe_public_contract_data_source.ts +40 -56
- package/src/utils/block_creation.ts +62 -0
- package/src/utils/tx_effect_creation.ts +37 -0
- package/dest/node/txe_node.d.ts +0 -358
- package/dest/node/txe_node.d.ts.map +0 -1
- package/dest/node/txe_node.js +0 -504
- package/dest/oracle/txe_oracle.d.ts +0 -152
- package/dest/oracle/txe_oracle.d.ts.map +0 -1
- package/dest/oracle/txe_oracle.js +0 -833
- package/dest/txe_service/txe_service.d.ts +0 -212
- package/dest/txe_service/txe_service.d.ts.map +0 -1
- package/dest/txe_service/txe_service.js +0 -572
- package/dest/util/txe_world_state_db.d.ts +0 -14
- package/dest/util/txe_world_state_db.d.ts.map +0 -1
- package/dest/util/txe_world_state_db.js +0 -27
- package/src/node/txe_node.ts +0 -725
- package/src/oracle/txe_oracle.ts +0 -1241
- package/src/txe_service/txe_service.ts +0 -749
- package/src/util/txe_world_state_db.ts +0 -38
|
@@ -1,749 +0,0 @@
|
|
|
1
|
-
import { type ContractInstanceWithAddress, Fr } from '@aztec/aztec.js';
|
|
2
|
-
import { DEPLOYER_CONTRACT_ADDRESS } from '@aztec/constants';
|
|
3
|
-
import type { Logger } from '@aztec/foundation/log';
|
|
4
|
-
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
5
|
-
import type { ProtocolContract } from '@aztec/protocol-contracts';
|
|
6
|
-
import { enrichPublicSimulationError } from '@aztec/pxe/server';
|
|
7
|
-
import type { TypedOracle } from '@aztec/simulator/client';
|
|
8
|
-
import { type ContractArtifact, FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
9
|
-
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
10
|
-
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
11
|
-
import { computePartialAddress } from '@aztec/stdlib/contract';
|
|
12
|
-
import { SimulationError } from '@aztec/stdlib/errors';
|
|
13
|
-
import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/stdlib/hash';
|
|
14
|
-
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
15
|
-
|
|
16
|
-
import { TXE } from '../oracle/txe_oracle.js';
|
|
17
|
-
import {
|
|
18
|
-
type ForeignCallArray,
|
|
19
|
-
type ForeignCallSingle,
|
|
20
|
-
addressFromSingle,
|
|
21
|
-
arrayToBoundedVec,
|
|
22
|
-
bufferToU8Array,
|
|
23
|
-
fromArray,
|
|
24
|
-
fromSingle,
|
|
25
|
-
fromUintArray,
|
|
26
|
-
toArray,
|
|
27
|
-
toForeignCallResult,
|
|
28
|
-
toSingle,
|
|
29
|
-
} from '../util/encoding.js';
|
|
30
|
-
import { ExpectedFailureError } from '../util/expected_failure_error.js';
|
|
31
|
-
|
|
32
|
-
export class TXEService {
|
|
33
|
-
constructor(private logger: Logger, private typedOracle: TypedOracle) {}
|
|
34
|
-
|
|
35
|
-
static async init(logger: Logger, protocolContracts: ProtocolContract[]) {
|
|
36
|
-
logger.debug(`TXE service initialized`);
|
|
37
|
-
const store = await openTmpStore('test');
|
|
38
|
-
const txe = await TXE.create(logger, store, protocolContracts);
|
|
39
|
-
const service = new TXEService(logger, txe);
|
|
40
|
-
await service.advanceBlocksBy(toSingle(new Fr(1n)));
|
|
41
|
-
return service;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
// Cheatcodes
|
|
45
|
-
|
|
46
|
-
async getPrivateContextInputs(blockNumber: ForeignCallSingle) {
|
|
47
|
-
const inputs = await (this.typedOracle as TXE).getPrivateContextInputs(fromSingle(blockNumber).toNumber());
|
|
48
|
-
return toForeignCallResult(inputs.toFields().map(toSingle));
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
async advanceBlocksBy(blocks: ForeignCallSingle) {
|
|
52
|
-
const nBlocks = fromSingle(blocks).toNumber();
|
|
53
|
-
this.logger.debug(`time traveling ${nBlocks} blocks`);
|
|
54
|
-
|
|
55
|
-
for (let i = 0; i < nBlocks; i++) {
|
|
56
|
-
const blockNumber = await this.typedOracle.getBlockNumber();
|
|
57
|
-
await (this.typedOracle as TXE).commitState();
|
|
58
|
-
(this.typedOracle as TXE).setBlockNumber(blockNumber + 1);
|
|
59
|
-
}
|
|
60
|
-
return toForeignCallResult([]);
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
setContractAddress(address: ForeignCallSingle) {
|
|
64
|
-
const typedAddress = addressFromSingle(address);
|
|
65
|
-
(this.typedOracle as TXE).setContractAddress(typedAddress);
|
|
66
|
-
return toForeignCallResult([]);
|
|
67
|
-
}
|
|
68
|
-
|
|
69
|
-
async deriveKeys(secret: ForeignCallSingle) {
|
|
70
|
-
const keys = await (this.typedOracle as TXE).deriveKeys(fromSingle(secret));
|
|
71
|
-
return toForeignCallResult(keys.publicKeys.toFields().map(toSingle));
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
async deploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: ForeignCallSingle) {
|
|
75
|
-
// Emit deployment nullifier
|
|
76
|
-
(this.typedOracle as TXE).addSiloedNullifiersFromPublic([
|
|
77
|
-
await siloNullifier(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), instance.address.toField()),
|
|
78
|
-
]);
|
|
79
|
-
|
|
80
|
-
if (!fromSingle(secret).equals(Fr.ZERO)) {
|
|
81
|
-
await this.addAccount(artifact, instance, secret);
|
|
82
|
-
} else {
|
|
83
|
-
await (this.typedOracle as TXE).addContractInstance(instance);
|
|
84
|
-
await (this.typedOracle as TXE).addContractArtifact(instance.currentContractClassId, artifact);
|
|
85
|
-
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
return toForeignCallResult([
|
|
89
|
-
toArray([
|
|
90
|
-
instance.salt,
|
|
91
|
-
instance.deployer.toField(),
|
|
92
|
-
instance.currentContractClassId,
|
|
93
|
-
instance.initializationHash,
|
|
94
|
-
...instance.publicKeys.toFields(),
|
|
95
|
-
]),
|
|
96
|
-
]);
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
async directStorageWrite(
|
|
100
|
-
contractAddress: ForeignCallSingle,
|
|
101
|
-
startStorageSlot: ForeignCallSingle,
|
|
102
|
-
values: ForeignCallArray,
|
|
103
|
-
) {
|
|
104
|
-
const startStorageSlotFr = fromSingle(startStorageSlot);
|
|
105
|
-
const valuesFr = fromArray(values);
|
|
106
|
-
const contractAddressFr = addressFromSingle(contractAddress);
|
|
107
|
-
|
|
108
|
-
const publicDataWrites = await Promise.all(
|
|
109
|
-
valuesFr.map(async (value, i) => {
|
|
110
|
-
const storageSlot = startStorageSlotFr.add(new Fr(i));
|
|
111
|
-
this.logger.debug(`Oracle storage write: slot=${storageSlot.toString()} value=${value}`);
|
|
112
|
-
return new PublicDataWrite(await computePublicDataTreeLeafSlot(contractAddressFr, storageSlot), value);
|
|
113
|
-
}),
|
|
114
|
-
);
|
|
115
|
-
|
|
116
|
-
await (this.typedOracle as TXE).addPublicDataWrites(publicDataWrites);
|
|
117
|
-
|
|
118
|
-
return toForeignCallResult([toArray(publicDataWrites.map(write => write.value))]);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
async createAccount(secret: ForeignCallSingle) {
|
|
122
|
-
const keyStore = (this.typedOracle as TXE).getKeyStore();
|
|
123
|
-
const secretFr = fromSingle(secret);
|
|
124
|
-
// This is a footgun !
|
|
125
|
-
const completeAddress = await keyStore.addAccount(secretFr, secretFr);
|
|
126
|
-
const accountDataProvider = (this.typedOracle as TXE).getAccountDataProvider();
|
|
127
|
-
await accountDataProvider.setAccount(completeAddress.address, completeAddress);
|
|
128
|
-
const addressDataProvider = (this.typedOracle as TXE).getAddressDataProvider();
|
|
129
|
-
await addressDataProvider.addCompleteAddress(completeAddress);
|
|
130
|
-
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
131
|
-
return toForeignCallResult([
|
|
132
|
-
toSingle(completeAddress.address),
|
|
133
|
-
...completeAddress.publicKeys.toFields().map(toSingle),
|
|
134
|
-
]);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
async addAccount(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: ForeignCallSingle) {
|
|
138
|
-
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
139
|
-
await (this.typedOracle as TXE).addContractInstance(instance);
|
|
140
|
-
await (this.typedOracle as TXE).addContractArtifact(instance.currentContractClassId, artifact);
|
|
141
|
-
|
|
142
|
-
const keyStore = (this.typedOracle as TXE).getKeyStore();
|
|
143
|
-
const completeAddress = await keyStore.addAccount(fromSingle(secret), await computePartialAddress(instance));
|
|
144
|
-
const accountDataProvider = (this.typedOracle as TXE).getAccountDataProvider();
|
|
145
|
-
await accountDataProvider.setAccount(completeAddress.address, completeAddress);
|
|
146
|
-
const addressDataProvider = (this.typedOracle as TXE).getAddressDataProvider();
|
|
147
|
-
await addressDataProvider.addCompleteAddress(completeAddress);
|
|
148
|
-
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
149
|
-
return toForeignCallResult([
|
|
150
|
-
toSingle(completeAddress.address),
|
|
151
|
-
...completeAddress.publicKeys.toFields().map(toSingle),
|
|
152
|
-
]);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
getSideEffectsCounter() {
|
|
156
|
-
const counter = (this.typedOracle as TXE).getSideEffectsCounter();
|
|
157
|
-
return toForeignCallResult([toSingle(new Fr(counter))]);
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
async addAuthWitness(address: ForeignCallSingle, messageHash: ForeignCallSingle) {
|
|
161
|
-
await (this.typedOracle as TXE).addAuthWitness(addressFromSingle(address), fromSingle(messageHash));
|
|
162
|
-
return toForeignCallResult([]);
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async assertPublicCallFails(
|
|
166
|
-
address: ForeignCallSingle,
|
|
167
|
-
functionSelector: ForeignCallSingle,
|
|
168
|
-
_length: ForeignCallSingle,
|
|
169
|
-
args: ForeignCallArray,
|
|
170
|
-
) {
|
|
171
|
-
const parsedAddress = addressFromSingle(address);
|
|
172
|
-
const parsedSelector = fromSingle(functionSelector);
|
|
173
|
-
const extendedArgs = [parsedSelector, ...fromArray(args)];
|
|
174
|
-
const result = await (this.typedOracle as TXE).avmOpcodeCall(parsedAddress, extendedArgs, false);
|
|
175
|
-
if (result.revertCode.isOK()) {
|
|
176
|
-
throw new ExpectedFailureError('Public call did not revert');
|
|
177
|
-
}
|
|
178
|
-
|
|
179
|
-
return toForeignCallResult([]);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
async assertPrivateCallFails(
|
|
183
|
-
targetContractAddress: ForeignCallSingle,
|
|
184
|
-
functionSelector: ForeignCallSingle,
|
|
185
|
-
argsHash: ForeignCallSingle,
|
|
186
|
-
sideEffectCounter: ForeignCallSingle,
|
|
187
|
-
isStaticCall: ForeignCallSingle,
|
|
188
|
-
) {
|
|
189
|
-
try {
|
|
190
|
-
await this.typedOracle.callPrivateFunction(
|
|
191
|
-
addressFromSingle(targetContractAddress),
|
|
192
|
-
FunctionSelector.fromField(fromSingle(functionSelector)),
|
|
193
|
-
fromSingle(argsHash),
|
|
194
|
-
fromSingle(sideEffectCounter).toNumber(),
|
|
195
|
-
fromSingle(isStaticCall).toBool(),
|
|
196
|
-
);
|
|
197
|
-
throw new ExpectedFailureError('Private call did not fail');
|
|
198
|
-
} catch (e) {
|
|
199
|
-
if (e instanceof ExpectedFailureError) {
|
|
200
|
-
throw e;
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
return toForeignCallResult([]);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
// PXE oracles
|
|
207
|
-
|
|
208
|
-
getRandomField() {
|
|
209
|
-
return toForeignCallResult([toSingle(this.typedOracle.getRandomField())]);
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
async getContractAddress() {
|
|
213
|
-
const contractAddress = await this.typedOracle.getContractAddress();
|
|
214
|
-
return toForeignCallResult([toSingle(contractAddress.toField())]);
|
|
215
|
-
}
|
|
216
|
-
|
|
217
|
-
async getBlockNumber() {
|
|
218
|
-
const blockNumber = await this.typedOracle.getBlockNumber();
|
|
219
|
-
return toForeignCallResult([toSingle(new Fr(blockNumber))]);
|
|
220
|
-
}
|
|
221
|
-
|
|
222
|
-
// Since the argument is a slice, noir automatically adds a length field to oracle call.
|
|
223
|
-
async storeInExecutionCache(_length: ForeignCallSingle, values: ForeignCallArray) {
|
|
224
|
-
const returnsHash = await this.typedOracle.storeInExecutionCache(fromArray(values));
|
|
225
|
-
return toForeignCallResult([toSingle(returnsHash)]);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
async loadFromExecutionCache(hash: ForeignCallSingle) {
|
|
229
|
-
const returns = await this.typedOracle.loadFromExecutionCache(fromSingle(hash));
|
|
230
|
-
return toForeignCallResult([toArray(returns)]);
|
|
231
|
-
}
|
|
232
|
-
|
|
233
|
-
// Since the argument is a slice, noir automatically adds a length field to oracle call.
|
|
234
|
-
debugLog(message: ForeignCallArray, _length: ForeignCallSingle, fields: ForeignCallArray) {
|
|
235
|
-
const messageStr = fromArray(message)
|
|
236
|
-
.map(field => String.fromCharCode(field.toNumber()))
|
|
237
|
-
.join('');
|
|
238
|
-
const fieldsFr = fromArray(fields);
|
|
239
|
-
this.typedOracle.debugLog(messageStr, fieldsFr);
|
|
240
|
-
return toForeignCallResult([]);
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
async storageRead(
|
|
244
|
-
contractAddress: ForeignCallSingle,
|
|
245
|
-
startStorageSlot: ForeignCallSingle,
|
|
246
|
-
blockNumber: ForeignCallSingle,
|
|
247
|
-
numberOfElements: ForeignCallSingle,
|
|
248
|
-
) {
|
|
249
|
-
const values = await this.typedOracle.storageRead(
|
|
250
|
-
addressFromSingle(contractAddress),
|
|
251
|
-
fromSingle(startStorageSlot),
|
|
252
|
-
fromSingle(blockNumber).toNumber(),
|
|
253
|
-
fromSingle(numberOfElements).toNumber(),
|
|
254
|
-
);
|
|
255
|
-
return toForeignCallResult([toArray(values)]);
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
async storageWrite(startStorageSlot: ForeignCallSingle, values: ForeignCallArray) {
|
|
259
|
-
const newValues = await this.typedOracle.storageWrite(fromSingle(startStorageSlot), fromArray(values));
|
|
260
|
-
return toForeignCallResult([toArray(newValues)]);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
async getPublicDataTreeWitness(blockNumber: ForeignCallSingle, leafSlot: ForeignCallSingle) {
|
|
264
|
-
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
265
|
-
const parsedLeafSlot = fromSingle(leafSlot);
|
|
266
|
-
|
|
267
|
-
const witness = await this.typedOracle.getPublicDataTreeWitness(parsedBlockNumber, parsedLeafSlot);
|
|
268
|
-
if (!witness) {
|
|
269
|
-
throw new Error(`Public data witness not found for slot ${parsedLeafSlot} at block ${parsedBlockNumber}.`);
|
|
270
|
-
}
|
|
271
|
-
return toForeignCallResult([toArray(witness.toFields())]);
|
|
272
|
-
}
|
|
273
|
-
|
|
274
|
-
async getNotes(
|
|
275
|
-
storageSlot: ForeignCallSingle,
|
|
276
|
-
numSelects: ForeignCallSingle,
|
|
277
|
-
selectByIndexes: ForeignCallArray,
|
|
278
|
-
selectByOffsets: ForeignCallArray,
|
|
279
|
-
selectByLengths: ForeignCallArray,
|
|
280
|
-
selectValues: ForeignCallArray,
|
|
281
|
-
selectComparators: ForeignCallArray,
|
|
282
|
-
sortByIndexes: ForeignCallArray,
|
|
283
|
-
sortByOffsets: ForeignCallArray,
|
|
284
|
-
sortByLengths: ForeignCallArray,
|
|
285
|
-
sortOrder: ForeignCallArray,
|
|
286
|
-
limit: ForeignCallSingle,
|
|
287
|
-
offset: ForeignCallSingle,
|
|
288
|
-
status: ForeignCallSingle,
|
|
289
|
-
returnSize: ForeignCallSingle,
|
|
290
|
-
) {
|
|
291
|
-
const noteDatas = await this.typedOracle.getNotes(
|
|
292
|
-
fromSingle(storageSlot),
|
|
293
|
-
fromSingle(numSelects).toNumber(),
|
|
294
|
-
fromArray(selectByIndexes).map(fr => fr.toNumber()),
|
|
295
|
-
fromArray(selectByOffsets).map(fr => fr.toNumber()),
|
|
296
|
-
fromArray(selectByLengths).map(fr => fr.toNumber()),
|
|
297
|
-
fromArray(selectValues),
|
|
298
|
-
fromArray(selectComparators).map(fr => fr.toNumber()),
|
|
299
|
-
fromArray(sortByIndexes).map(fr => fr.toNumber()),
|
|
300
|
-
fromArray(sortByOffsets).map(fr => fr.toNumber()),
|
|
301
|
-
fromArray(sortByLengths).map(fr => fr.toNumber()),
|
|
302
|
-
fromArray(sortOrder).map(fr => fr.toNumber()),
|
|
303
|
-
fromSingle(limit).toNumber(),
|
|
304
|
-
fromSingle(offset).toNumber(),
|
|
305
|
-
fromSingle(status).toNumber(),
|
|
306
|
-
);
|
|
307
|
-
const noteLength = noteDatas?.[0]?.note.items.length ?? 0;
|
|
308
|
-
if (!noteDatas.every(({ note }) => noteLength === note.items.length)) {
|
|
309
|
-
throw new Error('Notes should all be the same length.');
|
|
310
|
-
}
|
|
311
|
-
|
|
312
|
-
const contractAddress = noteDatas[0]?.contractAddress ?? Fr.ZERO;
|
|
313
|
-
|
|
314
|
-
// Values indicates whether the note is settled or transient.
|
|
315
|
-
const noteTypes = {
|
|
316
|
-
isSettled: new Fr(0),
|
|
317
|
-
isTransient: new Fr(1),
|
|
318
|
-
};
|
|
319
|
-
const flattenData = noteDatas.flatMap(({ nonce, note, index }) => [
|
|
320
|
-
nonce,
|
|
321
|
-
index === undefined ? noteTypes.isTransient : noteTypes.isSettled,
|
|
322
|
-
...note.items,
|
|
323
|
-
]);
|
|
324
|
-
|
|
325
|
-
const returnFieldSize = fromSingle(returnSize).toNumber();
|
|
326
|
-
const returnData = [noteDatas.length, contractAddress.toField(), ...flattenData].map(v => new Fr(v));
|
|
327
|
-
if (returnData.length > returnFieldSize) {
|
|
328
|
-
throw new Error(`Return data size too big. Maximum ${returnFieldSize} fields. Got ${flattenData.length}.`);
|
|
329
|
-
}
|
|
330
|
-
|
|
331
|
-
const paddedZeros = Array(returnFieldSize - returnData.length).fill(new Fr(0));
|
|
332
|
-
return toForeignCallResult([toArray([...returnData, ...paddedZeros])]);
|
|
333
|
-
}
|
|
334
|
-
|
|
335
|
-
notifyCreatedNote(
|
|
336
|
-
storageSlot: ForeignCallSingle,
|
|
337
|
-
noteTypeId: ForeignCallSingle,
|
|
338
|
-
note: ForeignCallArray,
|
|
339
|
-
noteHash: ForeignCallSingle,
|
|
340
|
-
counter: ForeignCallSingle,
|
|
341
|
-
) {
|
|
342
|
-
this.typedOracle.notifyCreatedNote(
|
|
343
|
-
fromSingle(storageSlot),
|
|
344
|
-
NoteSelector.fromField(fromSingle(noteTypeId)),
|
|
345
|
-
fromArray(note),
|
|
346
|
-
fromSingle(noteHash),
|
|
347
|
-
fromSingle(counter).toNumber(),
|
|
348
|
-
);
|
|
349
|
-
return toForeignCallResult([toSingle(new Fr(0))]);
|
|
350
|
-
}
|
|
351
|
-
|
|
352
|
-
async notifyNullifiedNote(
|
|
353
|
-
innerNullifier: ForeignCallSingle,
|
|
354
|
-
noteHash: ForeignCallSingle,
|
|
355
|
-
counter: ForeignCallSingle,
|
|
356
|
-
) {
|
|
357
|
-
await this.typedOracle.notifyNullifiedNote(
|
|
358
|
-
fromSingle(innerNullifier),
|
|
359
|
-
fromSingle(noteHash),
|
|
360
|
-
fromSingle(counter).toNumber(),
|
|
361
|
-
);
|
|
362
|
-
return toForeignCallResult([toSingle(new Fr(0))]);
|
|
363
|
-
}
|
|
364
|
-
|
|
365
|
-
async notifyCreatedNullifier(innerNullifier: ForeignCallSingle) {
|
|
366
|
-
await this.typedOracle.notifyCreatedNullifier(fromSingle(innerNullifier));
|
|
367
|
-
return toForeignCallResult([toSingle(new Fr(0))]);
|
|
368
|
-
}
|
|
369
|
-
|
|
370
|
-
async checkNullifierExists(innerNullifier: ForeignCallSingle) {
|
|
371
|
-
const exists = await this.typedOracle.checkNullifierExists(fromSingle(innerNullifier));
|
|
372
|
-
return toForeignCallResult([toSingle(new Fr(exists))]);
|
|
373
|
-
}
|
|
374
|
-
|
|
375
|
-
async getContractInstance(address: ForeignCallSingle) {
|
|
376
|
-
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
377
|
-
return toForeignCallResult([
|
|
378
|
-
toArray([
|
|
379
|
-
instance.salt,
|
|
380
|
-
instance.deployer.toField(),
|
|
381
|
-
instance.currentContractClassId,
|
|
382
|
-
instance.initializationHash,
|
|
383
|
-
...instance.publicKeys.toFields(),
|
|
384
|
-
]),
|
|
385
|
-
]);
|
|
386
|
-
}
|
|
387
|
-
|
|
388
|
-
async getPublicKeysAndPartialAddress(address: ForeignCallSingle) {
|
|
389
|
-
const parsedAddress = addressFromSingle(address);
|
|
390
|
-
const { publicKeys, partialAddress } = await this.typedOracle.getCompleteAddress(parsedAddress);
|
|
391
|
-
return toForeignCallResult([toArray([...publicKeys.toFields(), partialAddress])]);
|
|
392
|
-
}
|
|
393
|
-
|
|
394
|
-
async getKeyValidationRequest(pkMHash: ForeignCallSingle) {
|
|
395
|
-
const keyValidationRequest = await this.typedOracle.getKeyValidationRequest(fromSingle(pkMHash));
|
|
396
|
-
return toForeignCallResult([toArray(keyValidationRequest.toFields())]);
|
|
397
|
-
}
|
|
398
|
-
|
|
399
|
-
async callPrivateFunction(
|
|
400
|
-
targetContractAddress: ForeignCallSingle,
|
|
401
|
-
functionSelector: ForeignCallSingle,
|
|
402
|
-
argsHash: ForeignCallSingle,
|
|
403
|
-
sideEffectCounter: ForeignCallSingle,
|
|
404
|
-
isStaticCall: ForeignCallSingle,
|
|
405
|
-
) {
|
|
406
|
-
const result = await this.typedOracle.callPrivateFunction(
|
|
407
|
-
addressFromSingle(targetContractAddress),
|
|
408
|
-
FunctionSelector.fromField(fromSingle(functionSelector)),
|
|
409
|
-
fromSingle(argsHash),
|
|
410
|
-
fromSingle(sideEffectCounter).toNumber(),
|
|
411
|
-
fromSingle(isStaticCall).toBool(),
|
|
412
|
-
);
|
|
413
|
-
return toForeignCallResult([toArray([result.endSideEffectCounter, result.returnsHash])]);
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
async getNullifierMembershipWitness(blockNumber: ForeignCallSingle, nullifier: ForeignCallSingle) {
|
|
417
|
-
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
418
|
-
const witness = await this.typedOracle.getNullifierMembershipWitness(parsedBlockNumber, fromSingle(nullifier));
|
|
419
|
-
if (!witness) {
|
|
420
|
-
throw new Error(`Nullifier membership witness not found at block ${parsedBlockNumber}.`);
|
|
421
|
-
}
|
|
422
|
-
return toForeignCallResult([toArray(witness.toFields())]);
|
|
423
|
-
}
|
|
424
|
-
|
|
425
|
-
async getAuthWitness(messageHash: ForeignCallSingle) {
|
|
426
|
-
const parsedMessageHash = fromSingle(messageHash);
|
|
427
|
-
const authWitness = await this.typedOracle.getAuthWitness(parsedMessageHash);
|
|
428
|
-
if (!authWitness) {
|
|
429
|
-
throw new Error(`Auth witness not found for message hash ${parsedMessageHash}.`);
|
|
430
|
-
}
|
|
431
|
-
return toForeignCallResult([toArray(authWitness)]);
|
|
432
|
-
}
|
|
433
|
-
|
|
434
|
-
async enqueuePublicFunctionCall(
|
|
435
|
-
targetContractAddress: ForeignCallSingle,
|
|
436
|
-
functionSelector: ForeignCallSingle,
|
|
437
|
-
argsHash: ForeignCallSingle,
|
|
438
|
-
sideEffectCounter: ForeignCallSingle,
|
|
439
|
-
isStaticCall: ForeignCallSingle,
|
|
440
|
-
) {
|
|
441
|
-
const newArgsHash = await this.typedOracle.enqueuePublicFunctionCall(
|
|
442
|
-
addressFromSingle(targetContractAddress),
|
|
443
|
-
FunctionSelector.fromField(fromSingle(functionSelector)),
|
|
444
|
-
fromSingle(argsHash),
|
|
445
|
-
fromSingle(sideEffectCounter).toNumber(),
|
|
446
|
-
fromSingle(isStaticCall).toBool(),
|
|
447
|
-
);
|
|
448
|
-
return toForeignCallResult([toSingle(newArgsHash)]);
|
|
449
|
-
}
|
|
450
|
-
|
|
451
|
-
public async setPublicTeardownFunctionCall(
|
|
452
|
-
targetContractAddress: ForeignCallSingle,
|
|
453
|
-
functionSelector: ForeignCallSingle,
|
|
454
|
-
argsHash: ForeignCallSingle,
|
|
455
|
-
sideEffectCounter: ForeignCallSingle,
|
|
456
|
-
isStaticCall: ForeignCallSingle,
|
|
457
|
-
) {
|
|
458
|
-
const newArgsHash = await this.typedOracle.setPublicTeardownFunctionCall(
|
|
459
|
-
addressFromSingle(targetContractAddress),
|
|
460
|
-
FunctionSelector.fromField(fromSingle(functionSelector)),
|
|
461
|
-
fromSingle(argsHash),
|
|
462
|
-
fromSingle(sideEffectCounter).toNumber(),
|
|
463
|
-
fromSingle(isStaticCall).toBool(),
|
|
464
|
-
);
|
|
465
|
-
return toForeignCallResult([toSingle(newArgsHash)]);
|
|
466
|
-
}
|
|
467
|
-
|
|
468
|
-
public notifySetMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter: ForeignCallSingle) {
|
|
469
|
-
this.typedOracle.notifySetMinRevertibleSideEffectCounter(fromSingle(minRevertibleSideEffectCounter).toNumber());
|
|
470
|
-
}
|
|
471
|
-
|
|
472
|
-
async getChainId() {
|
|
473
|
-
return toForeignCallResult([toSingle(await this.typedOracle.getChainId())]);
|
|
474
|
-
}
|
|
475
|
-
|
|
476
|
-
async getVersion() {
|
|
477
|
-
return toForeignCallResult([toSingle(await this.typedOracle.getVersion())]);
|
|
478
|
-
}
|
|
479
|
-
|
|
480
|
-
async getBlockHeader(blockNumber: ForeignCallSingle) {
|
|
481
|
-
const header = await this.typedOracle.getBlockHeader(fromSingle(blockNumber).toNumber());
|
|
482
|
-
if (!header) {
|
|
483
|
-
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
484
|
-
}
|
|
485
|
-
return toForeignCallResult([toArray(header.toFields())]);
|
|
486
|
-
}
|
|
487
|
-
|
|
488
|
-
async getMembershipWitness(blockNumber: ForeignCallSingle, treeId: ForeignCallSingle, leafValue: ForeignCallSingle) {
|
|
489
|
-
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
490
|
-
const parsedTreeId = fromSingle(treeId).toNumber();
|
|
491
|
-
const parsedLeafValue = fromSingle(leafValue);
|
|
492
|
-
const witness = await this.typedOracle.getMembershipWitness(parsedBlockNumber, parsedTreeId, parsedLeafValue);
|
|
493
|
-
if (!witness) {
|
|
494
|
-
throw new Error(
|
|
495
|
-
`Membership witness in tree ${MerkleTreeId[parsedTreeId]} not found for value ${parsedLeafValue} at block ${parsedBlockNumber}.`,
|
|
496
|
-
);
|
|
497
|
-
}
|
|
498
|
-
return toForeignCallResult([toArray(witness)]);
|
|
499
|
-
}
|
|
500
|
-
|
|
501
|
-
async getLowNullifierMembershipWitness(blockNumber: ForeignCallSingle, nullifier: ForeignCallSingle) {
|
|
502
|
-
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
503
|
-
|
|
504
|
-
const witness = await this.typedOracle.getLowNullifierMembershipWitness(parsedBlockNumber, fromSingle(nullifier));
|
|
505
|
-
if (!witness) {
|
|
506
|
-
throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${parsedBlockNumber}.`);
|
|
507
|
-
}
|
|
508
|
-
return toForeignCallResult([toArray(witness.toFields())]);
|
|
509
|
-
}
|
|
510
|
-
|
|
511
|
-
async getIndexedTaggingSecretAsSender(sender: ForeignCallSingle, recipient: ForeignCallSingle) {
|
|
512
|
-
const secret = await this.typedOracle.getIndexedTaggingSecretAsSender(
|
|
513
|
-
AztecAddress.fromField(fromSingle(sender)),
|
|
514
|
-
AztecAddress.fromField(fromSingle(recipient)),
|
|
515
|
-
);
|
|
516
|
-
return toForeignCallResult([toArray(secret.toFields())]);
|
|
517
|
-
}
|
|
518
|
-
|
|
519
|
-
async syncNotes() {
|
|
520
|
-
await this.typedOracle.syncNotes();
|
|
521
|
-
return toForeignCallResult([]);
|
|
522
|
-
}
|
|
523
|
-
|
|
524
|
-
async storeCapsule(contractAddress: ForeignCallSingle, slot: ForeignCallSingle, capsule: ForeignCallArray) {
|
|
525
|
-
await this.typedOracle.storeCapsule(
|
|
526
|
-
AztecAddress.fromField(fromSingle(contractAddress)),
|
|
527
|
-
fromSingle(slot),
|
|
528
|
-
fromArray(capsule),
|
|
529
|
-
);
|
|
530
|
-
return toForeignCallResult([]);
|
|
531
|
-
}
|
|
532
|
-
|
|
533
|
-
async loadCapsule(contractAddress: ForeignCallSingle, slot: ForeignCallSingle, tSize: ForeignCallSingle) {
|
|
534
|
-
const values = await this.typedOracle.loadCapsule(
|
|
535
|
-
AztecAddress.fromField(fromSingle(contractAddress)),
|
|
536
|
-
fromSingle(slot),
|
|
537
|
-
);
|
|
538
|
-
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
539
|
-
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
540
|
-
if (values === null) {
|
|
541
|
-
// No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
|
|
542
|
-
return toForeignCallResult([toSingle(new Fr(0)), toArray(Array(fromSingle(tSize).toNumber()).fill(new Fr(0)))]);
|
|
543
|
-
} else {
|
|
544
|
-
// Data was found so we set `some` to 1 and return it along with `value`.
|
|
545
|
-
return toForeignCallResult([toSingle(new Fr(1)), toArray(values)]);
|
|
546
|
-
}
|
|
547
|
-
}
|
|
548
|
-
|
|
549
|
-
async deleteCapsule(contractAddress: ForeignCallSingle, slot: ForeignCallSingle) {
|
|
550
|
-
await this.typedOracle.deleteCapsule(AztecAddress.fromField(fromSingle(contractAddress)), fromSingle(slot));
|
|
551
|
-
return toForeignCallResult([]);
|
|
552
|
-
}
|
|
553
|
-
|
|
554
|
-
async copyCapsule(
|
|
555
|
-
contractAddress: ForeignCallSingle,
|
|
556
|
-
srcSlot: ForeignCallSingle,
|
|
557
|
-
dstSlot: ForeignCallSingle,
|
|
558
|
-
numEntries: ForeignCallSingle,
|
|
559
|
-
) {
|
|
560
|
-
await this.typedOracle.copyCapsule(
|
|
561
|
-
AztecAddress.fromField(fromSingle(contractAddress)),
|
|
562
|
-
fromSingle(srcSlot),
|
|
563
|
-
fromSingle(dstSlot),
|
|
564
|
-
fromSingle(numEntries).toNumber(),
|
|
565
|
-
);
|
|
566
|
-
|
|
567
|
-
return toForeignCallResult([]);
|
|
568
|
-
}
|
|
569
|
-
|
|
570
|
-
// TODO: I forgot to add a corresponding function here, when I introduced an oracle method to txe_oracle.ts. 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 to implement this function here. Isn't there a way to programmatically identify that this is missing, given the existence of a txe_oracle method?
|
|
571
|
-
async aes128Decrypt(ciphertext: ForeignCallArray, iv: ForeignCallArray, symKey: ForeignCallArray) {
|
|
572
|
-
const ciphertextBuffer = fromUintArray(ciphertext, 8);
|
|
573
|
-
const ivBuffer = fromUintArray(iv, 8);
|
|
574
|
-
const symKeyBuffer = fromUintArray(symKey, 8);
|
|
575
|
-
|
|
576
|
-
const plaintextBuffer = await this.typedOracle.aes128Decrypt(ciphertextBuffer, ivBuffer, symKeyBuffer);
|
|
577
|
-
|
|
578
|
-
return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer), ciphertextBuffer.length));
|
|
579
|
-
}
|
|
580
|
-
|
|
581
|
-
// AVM opcodes
|
|
582
|
-
|
|
583
|
-
avmOpcodeEmitUnencryptedLog(_message: ForeignCallArray) {
|
|
584
|
-
// TODO(#8811): Implement
|
|
585
|
-
return toForeignCallResult([]);
|
|
586
|
-
}
|
|
587
|
-
|
|
588
|
-
async avmOpcodeStorageRead(slot: ForeignCallSingle) {
|
|
589
|
-
const value = await (this.typedOracle as TXE).avmOpcodeStorageRead(fromSingle(slot));
|
|
590
|
-
return toForeignCallResult([toSingle(value)]);
|
|
591
|
-
}
|
|
592
|
-
|
|
593
|
-
async avmOpcodeStorageWrite(slot: ForeignCallSingle, value: ForeignCallSingle) {
|
|
594
|
-
await this.typedOracle.storageWrite(fromSingle(slot), [fromSingle(value)]);
|
|
595
|
-
return toForeignCallResult([]);
|
|
596
|
-
}
|
|
597
|
-
|
|
598
|
-
async avmOpcodeGetContractInstanceDeployer(address: ForeignCallSingle) {
|
|
599
|
-
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
600
|
-
return toForeignCallResult([
|
|
601
|
-
toSingle(instance.deployer),
|
|
602
|
-
// AVM requires an extra boolean indicating the instance was found
|
|
603
|
-
toSingle(new Fr(1)),
|
|
604
|
-
]);
|
|
605
|
-
}
|
|
606
|
-
|
|
607
|
-
async avmOpcodeGetContractInstanceClassId(address: ForeignCallSingle) {
|
|
608
|
-
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
609
|
-
return toForeignCallResult([
|
|
610
|
-
toSingle(instance.currentContractClassId),
|
|
611
|
-
// AVM requires an extra boolean indicating the instance was found
|
|
612
|
-
toSingle(new Fr(1)),
|
|
613
|
-
]);
|
|
614
|
-
}
|
|
615
|
-
|
|
616
|
-
async avmOpcodeGetContractInstanceInitializationHash(address: ForeignCallSingle) {
|
|
617
|
-
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
618
|
-
return toForeignCallResult([
|
|
619
|
-
toSingle(instance.initializationHash),
|
|
620
|
-
// AVM requires an extra boolean indicating the instance was found
|
|
621
|
-
toSingle(new Fr(1)),
|
|
622
|
-
]);
|
|
623
|
-
}
|
|
624
|
-
|
|
625
|
-
avmOpcodeSender() {
|
|
626
|
-
const sender = (this.typedOracle as TXE).getMsgSender();
|
|
627
|
-
return toForeignCallResult([toSingle(sender)]);
|
|
628
|
-
}
|
|
629
|
-
|
|
630
|
-
async avmOpcodeEmitNullifier(nullifier: ForeignCallSingle) {
|
|
631
|
-
await (this.typedOracle as TXE).avmOpcodeEmitNullifier(fromSingle(nullifier));
|
|
632
|
-
return toForeignCallResult([]);
|
|
633
|
-
}
|
|
634
|
-
|
|
635
|
-
async avmOpcodeEmitNoteHash(noteHash: ForeignCallSingle) {
|
|
636
|
-
await (this.typedOracle as TXE).avmOpcodeEmitNoteHash(fromSingle(noteHash));
|
|
637
|
-
return toForeignCallResult([]);
|
|
638
|
-
}
|
|
639
|
-
|
|
640
|
-
async avmOpcodeNullifierExists(innerNullifier: ForeignCallSingle, targetAddress: ForeignCallSingle) {
|
|
641
|
-
const exists = await (this.typedOracle as TXE).avmOpcodeNullifierExists(
|
|
642
|
-
fromSingle(innerNullifier),
|
|
643
|
-
AztecAddress.fromField(fromSingle(targetAddress)),
|
|
644
|
-
);
|
|
645
|
-
return toForeignCallResult([toSingle(new Fr(exists))]);
|
|
646
|
-
}
|
|
647
|
-
|
|
648
|
-
async avmOpcodeAddress() {
|
|
649
|
-
const contractAddress = await this.typedOracle.getContractAddress();
|
|
650
|
-
return toForeignCallResult([toSingle(contractAddress.toField())]);
|
|
651
|
-
}
|
|
652
|
-
|
|
653
|
-
async avmOpcodeBlockNumber() {
|
|
654
|
-
const blockNumber = await this.typedOracle.getBlockNumber();
|
|
655
|
-
return toForeignCallResult([toSingle(new Fr(blockNumber))]);
|
|
656
|
-
}
|
|
657
|
-
|
|
658
|
-
avmOpcodeIsStaticCall() {
|
|
659
|
-
const isStaticCall = (this.typedOracle as TXE).getIsStaticCall();
|
|
660
|
-
return toForeignCallResult([toSingle(new Fr(isStaticCall ? 1 : 0))]);
|
|
661
|
-
}
|
|
662
|
-
|
|
663
|
-
async avmOpcodeChainId() {
|
|
664
|
-
const chainId = await (this.typedOracle as TXE).getChainId();
|
|
665
|
-
return toForeignCallResult([toSingle(chainId)]);
|
|
666
|
-
}
|
|
667
|
-
|
|
668
|
-
async avmOpcodeVersion() {
|
|
669
|
-
const version = await (this.typedOracle as TXE).getVersion();
|
|
670
|
-
return toForeignCallResult([toSingle(version)]);
|
|
671
|
-
}
|
|
672
|
-
|
|
673
|
-
avmOpcodeReturndataSize() {
|
|
674
|
-
const size = (this.typedOracle as TXE).avmOpcodeReturndataSize();
|
|
675
|
-
return toForeignCallResult([toSingle(new Fr(size))]);
|
|
676
|
-
}
|
|
677
|
-
|
|
678
|
-
avmOpcodeReturndataCopy(rdOffset: ForeignCallSingle, copySize: ForeignCallSingle) {
|
|
679
|
-
const returndata = (this.typedOracle as TXE).avmOpcodeReturndataCopy(
|
|
680
|
-
fromSingle(rdOffset).toNumber(),
|
|
681
|
-
fromSingle(copySize).toNumber(),
|
|
682
|
-
);
|
|
683
|
-
// This is a slice, so we need to return the length as well.
|
|
684
|
-
return toForeignCallResult([toSingle(new Fr(returndata.length)), toArray(returndata)]);
|
|
685
|
-
}
|
|
686
|
-
|
|
687
|
-
async avmOpcodeCall(
|
|
688
|
-
_gas: ForeignCallArray,
|
|
689
|
-
address: ForeignCallSingle,
|
|
690
|
-
_length: ForeignCallSingle,
|
|
691
|
-
args: ForeignCallArray,
|
|
692
|
-
) {
|
|
693
|
-
const result = await (this.typedOracle as TXE).avmOpcodeCall(
|
|
694
|
-
addressFromSingle(address),
|
|
695
|
-
fromArray(args),
|
|
696
|
-
/* isStaticCall */ false,
|
|
697
|
-
);
|
|
698
|
-
|
|
699
|
-
// Poor man's revert handling
|
|
700
|
-
if (!result.revertCode.isOK()) {
|
|
701
|
-
if (result.revertReason && result.revertReason instanceof SimulationError) {
|
|
702
|
-
await enrichPublicSimulationError(
|
|
703
|
-
result.revertReason,
|
|
704
|
-
(this.typedOracle as TXE).getContractDataProvider(),
|
|
705
|
-
this.logger,
|
|
706
|
-
);
|
|
707
|
-
throw new Error(result.revertReason.message);
|
|
708
|
-
} else {
|
|
709
|
-
throw new Error(`Public function call reverted: ${result.revertReason}`);
|
|
710
|
-
}
|
|
711
|
-
}
|
|
712
|
-
|
|
713
|
-
return toForeignCallResult([]);
|
|
714
|
-
}
|
|
715
|
-
|
|
716
|
-
async avmOpcodeStaticCall(
|
|
717
|
-
_gas: ForeignCallArray,
|
|
718
|
-
address: ForeignCallSingle,
|
|
719
|
-
_length: ForeignCallSingle,
|
|
720
|
-
args: ForeignCallArray,
|
|
721
|
-
) {
|
|
722
|
-
const result = await (this.typedOracle as TXE).avmOpcodeCall(
|
|
723
|
-
addressFromSingle(address),
|
|
724
|
-
fromArray(args),
|
|
725
|
-
/* isStaticCall */ true,
|
|
726
|
-
);
|
|
727
|
-
|
|
728
|
-
// Poor man's revert handling
|
|
729
|
-
if (!result.revertCode.isOK()) {
|
|
730
|
-
if (result.revertReason && result.revertReason instanceof SimulationError) {
|
|
731
|
-
await enrichPublicSimulationError(
|
|
732
|
-
result.revertReason,
|
|
733
|
-
(this.typedOracle as TXE).getContractDataProvider(),
|
|
734
|
-
this.logger,
|
|
735
|
-
);
|
|
736
|
-
throw new Error(result.revertReason.message);
|
|
737
|
-
} else {
|
|
738
|
-
throw new Error(`Public function call reverted: ${result.revertReason}`);
|
|
739
|
-
}
|
|
740
|
-
}
|
|
741
|
-
|
|
742
|
-
return toForeignCallResult([]);
|
|
743
|
-
}
|
|
744
|
-
|
|
745
|
-
avmOpcodeSuccessCopy() {
|
|
746
|
-
const success = (this.typedOracle as TXE).avmOpcodeSuccessCopy();
|
|
747
|
-
return toForeignCallResult([toSingle(new Fr(success))]);
|
|
748
|
-
}
|
|
749
|
-
}
|