@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,572 +0,0 @@
|
|
|
1
|
-
import { Fr } from '@aztec/aztec.js';
|
|
2
|
-
import { DEPLOYER_CONTRACT_ADDRESS } from '@aztec/constants';
|
|
3
|
-
import { openTmpStore } from '@aztec/kv-store/lmdb-v2';
|
|
4
|
-
import { enrichPublicSimulationError } from '@aztec/pxe/server';
|
|
5
|
-
import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
6
|
-
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
7
|
-
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
8
|
-
import { computePartialAddress } from '@aztec/stdlib/contract';
|
|
9
|
-
import { SimulationError } from '@aztec/stdlib/errors';
|
|
10
|
-
import { computePublicDataTreeLeafSlot, siloNullifier } from '@aztec/stdlib/hash';
|
|
11
|
-
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
12
|
-
import { TXE } from '../oracle/txe_oracle.js';
|
|
13
|
-
import { addressFromSingle, arrayToBoundedVec, bufferToU8Array, fromArray, fromSingle, fromUintArray, toArray, toForeignCallResult, toSingle } from '../util/encoding.js';
|
|
14
|
-
import { ExpectedFailureError } from '../util/expected_failure_error.js';
|
|
15
|
-
export class TXEService {
|
|
16
|
-
logger;
|
|
17
|
-
typedOracle;
|
|
18
|
-
constructor(logger, typedOracle){
|
|
19
|
-
this.logger = logger;
|
|
20
|
-
this.typedOracle = typedOracle;
|
|
21
|
-
}
|
|
22
|
-
static async init(logger, protocolContracts) {
|
|
23
|
-
logger.debug(`TXE service initialized`);
|
|
24
|
-
const store = await openTmpStore('test');
|
|
25
|
-
const txe = await TXE.create(logger, store, protocolContracts);
|
|
26
|
-
const service = new TXEService(logger, txe);
|
|
27
|
-
await service.advanceBlocksBy(toSingle(new Fr(1n)));
|
|
28
|
-
return service;
|
|
29
|
-
}
|
|
30
|
-
// Cheatcodes
|
|
31
|
-
async getPrivateContextInputs(blockNumber) {
|
|
32
|
-
const inputs = await this.typedOracle.getPrivateContextInputs(fromSingle(blockNumber).toNumber());
|
|
33
|
-
return toForeignCallResult(inputs.toFields().map(toSingle));
|
|
34
|
-
}
|
|
35
|
-
async advanceBlocksBy(blocks) {
|
|
36
|
-
const nBlocks = fromSingle(blocks).toNumber();
|
|
37
|
-
this.logger.debug(`time traveling ${nBlocks} blocks`);
|
|
38
|
-
for(let i = 0; i < nBlocks; i++){
|
|
39
|
-
const blockNumber = await this.typedOracle.getBlockNumber();
|
|
40
|
-
await this.typedOracle.commitState();
|
|
41
|
-
this.typedOracle.setBlockNumber(blockNumber + 1);
|
|
42
|
-
}
|
|
43
|
-
return toForeignCallResult([]);
|
|
44
|
-
}
|
|
45
|
-
setContractAddress(address) {
|
|
46
|
-
const typedAddress = addressFromSingle(address);
|
|
47
|
-
this.typedOracle.setContractAddress(typedAddress);
|
|
48
|
-
return toForeignCallResult([]);
|
|
49
|
-
}
|
|
50
|
-
async deriveKeys(secret) {
|
|
51
|
-
const keys = await this.typedOracle.deriveKeys(fromSingle(secret));
|
|
52
|
-
return toForeignCallResult(keys.publicKeys.toFields().map(toSingle));
|
|
53
|
-
}
|
|
54
|
-
async deploy(artifact, instance, secret) {
|
|
55
|
-
// Emit deployment nullifier
|
|
56
|
-
this.typedOracle.addSiloedNullifiersFromPublic([
|
|
57
|
-
await siloNullifier(AztecAddress.fromNumber(DEPLOYER_CONTRACT_ADDRESS), instance.address.toField())
|
|
58
|
-
]);
|
|
59
|
-
if (!fromSingle(secret).equals(Fr.ZERO)) {
|
|
60
|
-
await this.addAccount(artifact, instance, secret);
|
|
61
|
-
} else {
|
|
62
|
-
await this.typedOracle.addContractInstance(instance);
|
|
63
|
-
await this.typedOracle.addContractArtifact(instance.currentContractClassId, artifact);
|
|
64
|
-
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
65
|
-
}
|
|
66
|
-
return toForeignCallResult([
|
|
67
|
-
toArray([
|
|
68
|
-
instance.salt,
|
|
69
|
-
instance.deployer.toField(),
|
|
70
|
-
instance.currentContractClassId,
|
|
71
|
-
instance.initializationHash,
|
|
72
|
-
...instance.publicKeys.toFields()
|
|
73
|
-
])
|
|
74
|
-
]);
|
|
75
|
-
}
|
|
76
|
-
async directStorageWrite(contractAddress, startStorageSlot, values) {
|
|
77
|
-
const startStorageSlotFr = fromSingle(startStorageSlot);
|
|
78
|
-
const valuesFr = fromArray(values);
|
|
79
|
-
const contractAddressFr = addressFromSingle(contractAddress);
|
|
80
|
-
const publicDataWrites = await Promise.all(valuesFr.map(async (value, i)=>{
|
|
81
|
-
const storageSlot = startStorageSlotFr.add(new Fr(i));
|
|
82
|
-
this.logger.debug(`Oracle storage write: slot=${storageSlot.toString()} value=${value}`);
|
|
83
|
-
return new PublicDataWrite(await computePublicDataTreeLeafSlot(contractAddressFr, storageSlot), value);
|
|
84
|
-
}));
|
|
85
|
-
await this.typedOracle.addPublicDataWrites(publicDataWrites);
|
|
86
|
-
return toForeignCallResult([
|
|
87
|
-
toArray(publicDataWrites.map((write)=>write.value))
|
|
88
|
-
]);
|
|
89
|
-
}
|
|
90
|
-
async createAccount(secret) {
|
|
91
|
-
const keyStore = this.typedOracle.getKeyStore();
|
|
92
|
-
const secretFr = fromSingle(secret);
|
|
93
|
-
// This is a footgun !
|
|
94
|
-
const completeAddress = await keyStore.addAccount(secretFr, secretFr);
|
|
95
|
-
const accountDataProvider = this.typedOracle.getAccountDataProvider();
|
|
96
|
-
await accountDataProvider.setAccount(completeAddress.address, completeAddress);
|
|
97
|
-
const addressDataProvider = this.typedOracle.getAddressDataProvider();
|
|
98
|
-
await addressDataProvider.addCompleteAddress(completeAddress);
|
|
99
|
-
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
100
|
-
return toForeignCallResult([
|
|
101
|
-
toSingle(completeAddress.address),
|
|
102
|
-
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
103
|
-
]);
|
|
104
|
-
}
|
|
105
|
-
async addAccount(artifact, instance, secret) {
|
|
106
|
-
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
107
|
-
await this.typedOracle.addContractInstance(instance);
|
|
108
|
-
await this.typedOracle.addContractArtifact(instance.currentContractClassId, artifact);
|
|
109
|
-
const keyStore = this.typedOracle.getKeyStore();
|
|
110
|
-
const completeAddress = await keyStore.addAccount(fromSingle(secret), await computePartialAddress(instance));
|
|
111
|
-
const accountDataProvider = this.typedOracle.getAccountDataProvider();
|
|
112
|
-
await accountDataProvider.setAccount(completeAddress.address, completeAddress);
|
|
113
|
-
const addressDataProvider = this.typedOracle.getAddressDataProvider();
|
|
114
|
-
await addressDataProvider.addCompleteAddress(completeAddress);
|
|
115
|
-
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
116
|
-
return toForeignCallResult([
|
|
117
|
-
toSingle(completeAddress.address),
|
|
118
|
-
...completeAddress.publicKeys.toFields().map(toSingle)
|
|
119
|
-
]);
|
|
120
|
-
}
|
|
121
|
-
getSideEffectsCounter() {
|
|
122
|
-
const counter = this.typedOracle.getSideEffectsCounter();
|
|
123
|
-
return toForeignCallResult([
|
|
124
|
-
toSingle(new Fr(counter))
|
|
125
|
-
]);
|
|
126
|
-
}
|
|
127
|
-
async addAuthWitness(address, messageHash) {
|
|
128
|
-
await this.typedOracle.addAuthWitness(addressFromSingle(address), fromSingle(messageHash));
|
|
129
|
-
return toForeignCallResult([]);
|
|
130
|
-
}
|
|
131
|
-
async assertPublicCallFails(address, functionSelector, _length, args) {
|
|
132
|
-
const parsedAddress = addressFromSingle(address);
|
|
133
|
-
const parsedSelector = fromSingle(functionSelector);
|
|
134
|
-
const extendedArgs = [
|
|
135
|
-
parsedSelector,
|
|
136
|
-
...fromArray(args)
|
|
137
|
-
];
|
|
138
|
-
const result = await this.typedOracle.avmOpcodeCall(parsedAddress, extendedArgs, false);
|
|
139
|
-
if (result.revertCode.isOK()) {
|
|
140
|
-
throw new ExpectedFailureError('Public call did not revert');
|
|
141
|
-
}
|
|
142
|
-
return toForeignCallResult([]);
|
|
143
|
-
}
|
|
144
|
-
async assertPrivateCallFails(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
|
|
145
|
-
try {
|
|
146
|
-
await this.typedOracle.callPrivateFunction(addressFromSingle(targetContractAddress), FunctionSelector.fromField(fromSingle(functionSelector)), fromSingle(argsHash), fromSingle(sideEffectCounter).toNumber(), fromSingle(isStaticCall).toBool());
|
|
147
|
-
throw new ExpectedFailureError('Private call did not fail');
|
|
148
|
-
} catch (e) {
|
|
149
|
-
if (e instanceof ExpectedFailureError) {
|
|
150
|
-
throw e;
|
|
151
|
-
}
|
|
152
|
-
}
|
|
153
|
-
return toForeignCallResult([]);
|
|
154
|
-
}
|
|
155
|
-
// PXE oracles
|
|
156
|
-
getRandomField() {
|
|
157
|
-
return toForeignCallResult([
|
|
158
|
-
toSingle(this.typedOracle.getRandomField())
|
|
159
|
-
]);
|
|
160
|
-
}
|
|
161
|
-
async getContractAddress() {
|
|
162
|
-
const contractAddress = await this.typedOracle.getContractAddress();
|
|
163
|
-
return toForeignCallResult([
|
|
164
|
-
toSingle(contractAddress.toField())
|
|
165
|
-
]);
|
|
166
|
-
}
|
|
167
|
-
async getBlockNumber() {
|
|
168
|
-
const blockNumber = await this.typedOracle.getBlockNumber();
|
|
169
|
-
return toForeignCallResult([
|
|
170
|
-
toSingle(new Fr(blockNumber))
|
|
171
|
-
]);
|
|
172
|
-
}
|
|
173
|
-
// Since the argument is a slice, noir automatically adds a length field to oracle call.
|
|
174
|
-
async storeInExecutionCache(_length, values) {
|
|
175
|
-
const returnsHash = await this.typedOracle.storeInExecutionCache(fromArray(values));
|
|
176
|
-
return toForeignCallResult([
|
|
177
|
-
toSingle(returnsHash)
|
|
178
|
-
]);
|
|
179
|
-
}
|
|
180
|
-
async loadFromExecutionCache(hash) {
|
|
181
|
-
const returns = await this.typedOracle.loadFromExecutionCache(fromSingle(hash));
|
|
182
|
-
return toForeignCallResult([
|
|
183
|
-
toArray(returns)
|
|
184
|
-
]);
|
|
185
|
-
}
|
|
186
|
-
// Since the argument is a slice, noir automatically adds a length field to oracle call.
|
|
187
|
-
debugLog(message, _length, fields) {
|
|
188
|
-
const messageStr = fromArray(message).map((field)=>String.fromCharCode(field.toNumber())).join('');
|
|
189
|
-
const fieldsFr = fromArray(fields);
|
|
190
|
-
this.typedOracle.debugLog(messageStr, fieldsFr);
|
|
191
|
-
return toForeignCallResult([]);
|
|
192
|
-
}
|
|
193
|
-
async storageRead(contractAddress, startStorageSlot, blockNumber, numberOfElements) {
|
|
194
|
-
const values = await this.typedOracle.storageRead(addressFromSingle(contractAddress), fromSingle(startStorageSlot), fromSingle(blockNumber).toNumber(), fromSingle(numberOfElements).toNumber());
|
|
195
|
-
return toForeignCallResult([
|
|
196
|
-
toArray(values)
|
|
197
|
-
]);
|
|
198
|
-
}
|
|
199
|
-
async storageWrite(startStorageSlot, values) {
|
|
200
|
-
const newValues = await this.typedOracle.storageWrite(fromSingle(startStorageSlot), fromArray(values));
|
|
201
|
-
return toForeignCallResult([
|
|
202
|
-
toArray(newValues)
|
|
203
|
-
]);
|
|
204
|
-
}
|
|
205
|
-
async getPublicDataTreeWitness(blockNumber, leafSlot) {
|
|
206
|
-
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
207
|
-
const parsedLeafSlot = fromSingle(leafSlot);
|
|
208
|
-
const witness = await this.typedOracle.getPublicDataTreeWitness(parsedBlockNumber, parsedLeafSlot);
|
|
209
|
-
if (!witness) {
|
|
210
|
-
throw new Error(`Public data witness not found for slot ${parsedLeafSlot} at block ${parsedBlockNumber}.`);
|
|
211
|
-
}
|
|
212
|
-
return toForeignCallResult([
|
|
213
|
-
toArray(witness.toFields())
|
|
214
|
-
]);
|
|
215
|
-
}
|
|
216
|
-
async getNotes(storageSlot, numSelects, selectByIndexes, selectByOffsets, selectByLengths, selectValues, selectComparators, sortByIndexes, sortByOffsets, sortByLengths, sortOrder, limit, offset, status, returnSize) {
|
|
217
|
-
const noteDatas = await this.typedOracle.getNotes(fromSingle(storageSlot), fromSingle(numSelects).toNumber(), fromArray(selectByIndexes).map((fr)=>fr.toNumber()), fromArray(selectByOffsets).map((fr)=>fr.toNumber()), fromArray(selectByLengths).map((fr)=>fr.toNumber()), fromArray(selectValues), fromArray(selectComparators).map((fr)=>fr.toNumber()), fromArray(sortByIndexes).map((fr)=>fr.toNumber()), fromArray(sortByOffsets).map((fr)=>fr.toNumber()), fromArray(sortByLengths).map((fr)=>fr.toNumber()), fromArray(sortOrder).map((fr)=>fr.toNumber()), fromSingle(limit).toNumber(), fromSingle(offset).toNumber(), fromSingle(status).toNumber());
|
|
218
|
-
const noteLength = noteDatas?.[0]?.note.items.length ?? 0;
|
|
219
|
-
if (!noteDatas.every(({ note })=>noteLength === note.items.length)) {
|
|
220
|
-
throw new Error('Notes should all be the same length.');
|
|
221
|
-
}
|
|
222
|
-
const contractAddress = noteDatas[0]?.contractAddress ?? Fr.ZERO;
|
|
223
|
-
// Values indicates whether the note is settled or transient.
|
|
224
|
-
const noteTypes = {
|
|
225
|
-
isSettled: new Fr(0),
|
|
226
|
-
isTransient: new Fr(1)
|
|
227
|
-
};
|
|
228
|
-
const flattenData = noteDatas.flatMap(({ nonce, note, index })=>[
|
|
229
|
-
nonce,
|
|
230
|
-
index === undefined ? noteTypes.isTransient : noteTypes.isSettled,
|
|
231
|
-
...note.items
|
|
232
|
-
]);
|
|
233
|
-
const returnFieldSize = fromSingle(returnSize).toNumber();
|
|
234
|
-
const returnData = [
|
|
235
|
-
noteDatas.length,
|
|
236
|
-
contractAddress.toField(),
|
|
237
|
-
...flattenData
|
|
238
|
-
].map((v)=>new Fr(v));
|
|
239
|
-
if (returnData.length > returnFieldSize) {
|
|
240
|
-
throw new Error(`Return data size too big. Maximum ${returnFieldSize} fields. Got ${flattenData.length}.`);
|
|
241
|
-
}
|
|
242
|
-
const paddedZeros = Array(returnFieldSize - returnData.length).fill(new Fr(0));
|
|
243
|
-
return toForeignCallResult([
|
|
244
|
-
toArray([
|
|
245
|
-
...returnData,
|
|
246
|
-
...paddedZeros
|
|
247
|
-
])
|
|
248
|
-
]);
|
|
249
|
-
}
|
|
250
|
-
notifyCreatedNote(storageSlot, noteTypeId, note, noteHash, counter) {
|
|
251
|
-
this.typedOracle.notifyCreatedNote(fromSingle(storageSlot), NoteSelector.fromField(fromSingle(noteTypeId)), fromArray(note), fromSingle(noteHash), fromSingle(counter).toNumber());
|
|
252
|
-
return toForeignCallResult([
|
|
253
|
-
toSingle(new Fr(0))
|
|
254
|
-
]);
|
|
255
|
-
}
|
|
256
|
-
async notifyNullifiedNote(innerNullifier, noteHash, counter) {
|
|
257
|
-
await this.typedOracle.notifyNullifiedNote(fromSingle(innerNullifier), fromSingle(noteHash), fromSingle(counter).toNumber());
|
|
258
|
-
return toForeignCallResult([
|
|
259
|
-
toSingle(new Fr(0))
|
|
260
|
-
]);
|
|
261
|
-
}
|
|
262
|
-
async notifyCreatedNullifier(innerNullifier) {
|
|
263
|
-
await this.typedOracle.notifyCreatedNullifier(fromSingle(innerNullifier));
|
|
264
|
-
return toForeignCallResult([
|
|
265
|
-
toSingle(new Fr(0))
|
|
266
|
-
]);
|
|
267
|
-
}
|
|
268
|
-
async checkNullifierExists(innerNullifier) {
|
|
269
|
-
const exists = await this.typedOracle.checkNullifierExists(fromSingle(innerNullifier));
|
|
270
|
-
return toForeignCallResult([
|
|
271
|
-
toSingle(new Fr(exists))
|
|
272
|
-
]);
|
|
273
|
-
}
|
|
274
|
-
async getContractInstance(address) {
|
|
275
|
-
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
276
|
-
return toForeignCallResult([
|
|
277
|
-
toArray([
|
|
278
|
-
instance.salt,
|
|
279
|
-
instance.deployer.toField(),
|
|
280
|
-
instance.currentContractClassId,
|
|
281
|
-
instance.initializationHash,
|
|
282
|
-
...instance.publicKeys.toFields()
|
|
283
|
-
])
|
|
284
|
-
]);
|
|
285
|
-
}
|
|
286
|
-
async getPublicKeysAndPartialAddress(address) {
|
|
287
|
-
const parsedAddress = addressFromSingle(address);
|
|
288
|
-
const { publicKeys, partialAddress } = await this.typedOracle.getCompleteAddress(parsedAddress);
|
|
289
|
-
return toForeignCallResult([
|
|
290
|
-
toArray([
|
|
291
|
-
...publicKeys.toFields(),
|
|
292
|
-
partialAddress
|
|
293
|
-
])
|
|
294
|
-
]);
|
|
295
|
-
}
|
|
296
|
-
async getKeyValidationRequest(pkMHash) {
|
|
297
|
-
const keyValidationRequest = await this.typedOracle.getKeyValidationRequest(fromSingle(pkMHash));
|
|
298
|
-
return toForeignCallResult([
|
|
299
|
-
toArray(keyValidationRequest.toFields())
|
|
300
|
-
]);
|
|
301
|
-
}
|
|
302
|
-
async callPrivateFunction(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
|
|
303
|
-
const result = await this.typedOracle.callPrivateFunction(addressFromSingle(targetContractAddress), FunctionSelector.fromField(fromSingle(functionSelector)), fromSingle(argsHash), fromSingle(sideEffectCounter).toNumber(), fromSingle(isStaticCall).toBool());
|
|
304
|
-
return toForeignCallResult([
|
|
305
|
-
toArray([
|
|
306
|
-
result.endSideEffectCounter,
|
|
307
|
-
result.returnsHash
|
|
308
|
-
])
|
|
309
|
-
]);
|
|
310
|
-
}
|
|
311
|
-
async getNullifierMembershipWitness(blockNumber, nullifier) {
|
|
312
|
-
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
313
|
-
const witness = await this.typedOracle.getNullifierMembershipWitness(parsedBlockNumber, fromSingle(nullifier));
|
|
314
|
-
if (!witness) {
|
|
315
|
-
throw new Error(`Nullifier membership witness not found at block ${parsedBlockNumber}.`);
|
|
316
|
-
}
|
|
317
|
-
return toForeignCallResult([
|
|
318
|
-
toArray(witness.toFields())
|
|
319
|
-
]);
|
|
320
|
-
}
|
|
321
|
-
async getAuthWitness(messageHash) {
|
|
322
|
-
const parsedMessageHash = fromSingle(messageHash);
|
|
323
|
-
const authWitness = await this.typedOracle.getAuthWitness(parsedMessageHash);
|
|
324
|
-
if (!authWitness) {
|
|
325
|
-
throw new Error(`Auth witness not found for message hash ${parsedMessageHash}.`);
|
|
326
|
-
}
|
|
327
|
-
return toForeignCallResult([
|
|
328
|
-
toArray(authWitness)
|
|
329
|
-
]);
|
|
330
|
-
}
|
|
331
|
-
async enqueuePublicFunctionCall(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
|
|
332
|
-
const newArgsHash = await this.typedOracle.enqueuePublicFunctionCall(addressFromSingle(targetContractAddress), FunctionSelector.fromField(fromSingle(functionSelector)), fromSingle(argsHash), fromSingle(sideEffectCounter).toNumber(), fromSingle(isStaticCall).toBool());
|
|
333
|
-
return toForeignCallResult([
|
|
334
|
-
toSingle(newArgsHash)
|
|
335
|
-
]);
|
|
336
|
-
}
|
|
337
|
-
async setPublicTeardownFunctionCall(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall) {
|
|
338
|
-
const newArgsHash = await this.typedOracle.setPublicTeardownFunctionCall(addressFromSingle(targetContractAddress), FunctionSelector.fromField(fromSingle(functionSelector)), fromSingle(argsHash), fromSingle(sideEffectCounter).toNumber(), fromSingle(isStaticCall).toBool());
|
|
339
|
-
return toForeignCallResult([
|
|
340
|
-
toSingle(newArgsHash)
|
|
341
|
-
]);
|
|
342
|
-
}
|
|
343
|
-
notifySetMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter) {
|
|
344
|
-
this.typedOracle.notifySetMinRevertibleSideEffectCounter(fromSingle(minRevertibleSideEffectCounter).toNumber());
|
|
345
|
-
}
|
|
346
|
-
async getChainId() {
|
|
347
|
-
return toForeignCallResult([
|
|
348
|
-
toSingle(await this.typedOracle.getChainId())
|
|
349
|
-
]);
|
|
350
|
-
}
|
|
351
|
-
async getVersion() {
|
|
352
|
-
return toForeignCallResult([
|
|
353
|
-
toSingle(await this.typedOracle.getVersion())
|
|
354
|
-
]);
|
|
355
|
-
}
|
|
356
|
-
async getBlockHeader(blockNumber) {
|
|
357
|
-
const header = await this.typedOracle.getBlockHeader(fromSingle(blockNumber).toNumber());
|
|
358
|
-
if (!header) {
|
|
359
|
-
throw new Error(`Block header not found for block ${blockNumber}.`);
|
|
360
|
-
}
|
|
361
|
-
return toForeignCallResult([
|
|
362
|
-
toArray(header.toFields())
|
|
363
|
-
]);
|
|
364
|
-
}
|
|
365
|
-
async getMembershipWitness(blockNumber, treeId, leafValue) {
|
|
366
|
-
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
367
|
-
const parsedTreeId = fromSingle(treeId).toNumber();
|
|
368
|
-
const parsedLeafValue = fromSingle(leafValue);
|
|
369
|
-
const witness = await this.typedOracle.getMembershipWitness(parsedBlockNumber, parsedTreeId, parsedLeafValue);
|
|
370
|
-
if (!witness) {
|
|
371
|
-
throw new Error(`Membership witness in tree ${MerkleTreeId[parsedTreeId]} not found for value ${parsedLeafValue} at block ${parsedBlockNumber}.`);
|
|
372
|
-
}
|
|
373
|
-
return toForeignCallResult([
|
|
374
|
-
toArray(witness)
|
|
375
|
-
]);
|
|
376
|
-
}
|
|
377
|
-
async getLowNullifierMembershipWitness(blockNumber, nullifier) {
|
|
378
|
-
const parsedBlockNumber = fromSingle(blockNumber).toNumber();
|
|
379
|
-
const witness = await this.typedOracle.getLowNullifierMembershipWitness(parsedBlockNumber, fromSingle(nullifier));
|
|
380
|
-
if (!witness) {
|
|
381
|
-
throw new Error(`Low nullifier witness not found for nullifier ${nullifier} at block ${parsedBlockNumber}.`);
|
|
382
|
-
}
|
|
383
|
-
return toForeignCallResult([
|
|
384
|
-
toArray(witness.toFields())
|
|
385
|
-
]);
|
|
386
|
-
}
|
|
387
|
-
async getIndexedTaggingSecretAsSender(sender, recipient) {
|
|
388
|
-
const secret = await this.typedOracle.getIndexedTaggingSecretAsSender(AztecAddress.fromField(fromSingle(sender)), AztecAddress.fromField(fromSingle(recipient)));
|
|
389
|
-
return toForeignCallResult([
|
|
390
|
-
toArray(secret.toFields())
|
|
391
|
-
]);
|
|
392
|
-
}
|
|
393
|
-
async syncNotes() {
|
|
394
|
-
await this.typedOracle.syncNotes();
|
|
395
|
-
return toForeignCallResult([]);
|
|
396
|
-
}
|
|
397
|
-
async storeCapsule(contractAddress, slot, capsule) {
|
|
398
|
-
await this.typedOracle.storeCapsule(AztecAddress.fromField(fromSingle(contractAddress)), fromSingle(slot), fromArray(capsule));
|
|
399
|
-
return toForeignCallResult([]);
|
|
400
|
-
}
|
|
401
|
-
async loadCapsule(contractAddress, slot, tSize) {
|
|
402
|
-
const values = await this.typedOracle.loadCapsule(AztecAddress.fromField(fromSingle(contractAddress)), fromSingle(slot));
|
|
403
|
-
// We are going to return a Noir Option struct to represent the possibility of null values. Options are a struct
|
|
404
|
-
// with two fields: `some` (a boolean) and `value` (a field array in this case).
|
|
405
|
-
if (values === null) {
|
|
406
|
-
// No data was found so we set `some` to 0 and pad `value` with zeros get the correct return size.
|
|
407
|
-
return toForeignCallResult([
|
|
408
|
-
toSingle(new Fr(0)),
|
|
409
|
-
toArray(Array(fromSingle(tSize).toNumber()).fill(new Fr(0)))
|
|
410
|
-
]);
|
|
411
|
-
} else {
|
|
412
|
-
// Data was found so we set `some` to 1 and return it along with `value`.
|
|
413
|
-
return toForeignCallResult([
|
|
414
|
-
toSingle(new Fr(1)),
|
|
415
|
-
toArray(values)
|
|
416
|
-
]);
|
|
417
|
-
}
|
|
418
|
-
}
|
|
419
|
-
async deleteCapsule(contractAddress, slot) {
|
|
420
|
-
await this.typedOracle.deleteCapsule(AztecAddress.fromField(fromSingle(contractAddress)), fromSingle(slot));
|
|
421
|
-
return toForeignCallResult([]);
|
|
422
|
-
}
|
|
423
|
-
async copyCapsule(contractAddress, srcSlot, dstSlot, numEntries) {
|
|
424
|
-
await this.typedOracle.copyCapsule(AztecAddress.fromField(fromSingle(contractAddress)), fromSingle(srcSlot), fromSingle(dstSlot), fromSingle(numEntries).toNumber());
|
|
425
|
-
return toForeignCallResult([]);
|
|
426
|
-
}
|
|
427
|
-
// 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?
|
|
428
|
-
async aes128Decrypt(ciphertext, iv, symKey) {
|
|
429
|
-
const ciphertextBuffer = fromUintArray(ciphertext, 8);
|
|
430
|
-
const ivBuffer = fromUintArray(iv, 8);
|
|
431
|
-
const symKeyBuffer = fromUintArray(symKey, 8);
|
|
432
|
-
const plaintextBuffer = await this.typedOracle.aes128Decrypt(ciphertextBuffer, ivBuffer, symKeyBuffer);
|
|
433
|
-
return toForeignCallResult(arrayToBoundedVec(bufferToU8Array(plaintextBuffer), ciphertextBuffer.length));
|
|
434
|
-
}
|
|
435
|
-
// AVM opcodes
|
|
436
|
-
avmOpcodeEmitUnencryptedLog(_message) {
|
|
437
|
-
// TODO(#8811): Implement
|
|
438
|
-
return toForeignCallResult([]);
|
|
439
|
-
}
|
|
440
|
-
async avmOpcodeStorageRead(slot) {
|
|
441
|
-
const value = await this.typedOracle.avmOpcodeStorageRead(fromSingle(slot));
|
|
442
|
-
return toForeignCallResult([
|
|
443
|
-
toSingle(value)
|
|
444
|
-
]);
|
|
445
|
-
}
|
|
446
|
-
async avmOpcodeStorageWrite(slot, value) {
|
|
447
|
-
await this.typedOracle.storageWrite(fromSingle(slot), [
|
|
448
|
-
fromSingle(value)
|
|
449
|
-
]);
|
|
450
|
-
return toForeignCallResult([]);
|
|
451
|
-
}
|
|
452
|
-
async avmOpcodeGetContractInstanceDeployer(address) {
|
|
453
|
-
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
454
|
-
return toForeignCallResult([
|
|
455
|
-
toSingle(instance.deployer),
|
|
456
|
-
// AVM requires an extra boolean indicating the instance was found
|
|
457
|
-
toSingle(new Fr(1))
|
|
458
|
-
]);
|
|
459
|
-
}
|
|
460
|
-
async avmOpcodeGetContractInstanceClassId(address) {
|
|
461
|
-
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
462
|
-
return toForeignCallResult([
|
|
463
|
-
toSingle(instance.currentContractClassId),
|
|
464
|
-
// AVM requires an extra boolean indicating the instance was found
|
|
465
|
-
toSingle(new Fr(1))
|
|
466
|
-
]);
|
|
467
|
-
}
|
|
468
|
-
async avmOpcodeGetContractInstanceInitializationHash(address) {
|
|
469
|
-
const instance = await this.typedOracle.getContractInstance(addressFromSingle(address));
|
|
470
|
-
return toForeignCallResult([
|
|
471
|
-
toSingle(instance.initializationHash),
|
|
472
|
-
// AVM requires an extra boolean indicating the instance was found
|
|
473
|
-
toSingle(new Fr(1))
|
|
474
|
-
]);
|
|
475
|
-
}
|
|
476
|
-
avmOpcodeSender() {
|
|
477
|
-
const sender = this.typedOracle.getMsgSender();
|
|
478
|
-
return toForeignCallResult([
|
|
479
|
-
toSingle(sender)
|
|
480
|
-
]);
|
|
481
|
-
}
|
|
482
|
-
async avmOpcodeEmitNullifier(nullifier) {
|
|
483
|
-
await this.typedOracle.avmOpcodeEmitNullifier(fromSingle(nullifier));
|
|
484
|
-
return toForeignCallResult([]);
|
|
485
|
-
}
|
|
486
|
-
async avmOpcodeEmitNoteHash(noteHash) {
|
|
487
|
-
await this.typedOracle.avmOpcodeEmitNoteHash(fromSingle(noteHash));
|
|
488
|
-
return toForeignCallResult([]);
|
|
489
|
-
}
|
|
490
|
-
async avmOpcodeNullifierExists(innerNullifier, targetAddress) {
|
|
491
|
-
const exists = await this.typedOracle.avmOpcodeNullifierExists(fromSingle(innerNullifier), AztecAddress.fromField(fromSingle(targetAddress)));
|
|
492
|
-
return toForeignCallResult([
|
|
493
|
-
toSingle(new Fr(exists))
|
|
494
|
-
]);
|
|
495
|
-
}
|
|
496
|
-
async avmOpcodeAddress() {
|
|
497
|
-
const contractAddress = await this.typedOracle.getContractAddress();
|
|
498
|
-
return toForeignCallResult([
|
|
499
|
-
toSingle(contractAddress.toField())
|
|
500
|
-
]);
|
|
501
|
-
}
|
|
502
|
-
async avmOpcodeBlockNumber() {
|
|
503
|
-
const blockNumber = await this.typedOracle.getBlockNumber();
|
|
504
|
-
return toForeignCallResult([
|
|
505
|
-
toSingle(new Fr(blockNumber))
|
|
506
|
-
]);
|
|
507
|
-
}
|
|
508
|
-
avmOpcodeIsStaticCall() {
|
|
509
|
-
const isStaticCall = this.typedOracle.getIsStaticCall();
|
|
510
|
-
return toForeignCallResult([
|
|
511
|
-
toSingle(new Fr(isStaticCall ? 1 : 0))
|
|
512
|
-
]);
|
|
513
|
-
}
|
|
514
|
-
async avmOpcodeChainId() {
|
|
515
|
-
const chainId = await this.typedOracle.getChainId();
|
|
516
|
-
return toForeignCallResult([
|
|
517
|
-
toSingle(chainId)
|
|
518
|
-
]);
|
|
519
|
-
}
|
|
520
|
-
async avmOpcodeVersion() {
|
|
521
|
-
const version = await this.typedOracle.getVersion();
|
|
522
|
-
return toForeignCallResult([
|
|
523
|
-
toSingle(version)
|
|
524
|
-
]);
|
|
525
|
-
}
|
|
526
|
-
avmOpcodeReturndataSize() {
|
|
527
|
-
const size = this.typedOracle.avmOpcodeReturndataSize();
|
|
528
|
-
return toForeignCallResult([
|
|
529
|
-
toSingle(new Fr(size))
|
|
530
|
-
]);
|
|
531
|
-
}
|
|
532
|
-
avmOpcodeReturndataCopy(rdOffset, copySize) {
|
|
533
|
-
const returndata = this.typedOracle.avmOpcodeReturndataCopy(fromSingle(rdOffset).toNumber(), fromSingle(copySize).toNumber());
|
|
534
|
-
// This is a slice, so we need to return the length as well.
|
|
535
|
-
return toForeignCallResult([
|
|
536
|
-
toSingle(new Fr(returndata.length)),
|
|
537
|
-
toArray(returndata)
|
|
538
|
-
]);
|
|
539
|
-
}
|
|
540
|
-
async avmOpcodeCall(_gas, address, _length, args) {
|
|
541
|
-
const result = await this.typedOracle.avmOpcodeCall(addressFromSingle(address), fromArray(args), /* isStaticCall */ false);
|
|
542
|
-
// Poor man's revert handling
|
|
543
|
-
if (!result.revertCode.isOK()) {
|
|
544
|
-
if (result.revertReason && result.revertReason instanceof SimulationError) {
|
|
545
|
-
await enrichPublicSimulationError(result.revertReason, this.typedOracle.getContractDataProvider(), this.logger);
|
|
546
|
-
throw new Error(result.revertReason.message);
|
|
547
|
-
} else {
|
|
548
|
-
throw new Error(`Public function call reverted: ${result.revertReason}`);
|
|
549
|
-
}
|
|
550
|
-
}
|
|
551
|
-
return toForeignCallResult([]);
|
|
552
|
-
}
|
|
553
|
-
async avmOpcodeStaticCall(_gas, address, _length, args) {
|
|
554
|
-
const result = await this.typedOracle.avmOpcodeCall(addressFromSingle(address), fromArray(args), /* isStaticCall */ true);
|
|
555
|
-
// Poor man's revert handling
|
|
556
|
-
if (!result.revertCode.isOK()) {
|
|
557
|
-
if (result.revertReason && result.revertReason instanceof SimulationError) {
|
|
558
|
-
await enrichPublicSimulationError(result.revertReason, this.typedOracle.getContractDataProvider(), this.logger);
|
|
559
|
-
throw new Error(result.revertReason.message);
|
|
560
|
-
} else {
|
|
561
|
-
throw new Error(`Public function call reverted: ${result.revertReason}`);
|
|
562
|
-
}
|
|
563
|
-
}
|
|
564
|
-
return toForeignCallResult([]);
|
|
565
|
-
}
|
|
566
|
-
avmOpcodeSuccessCopy() {
|
|
567
|
-
const success = this.typedOracle.avmOpcodeSuccessCopy();
|
|
568
|
-
return toForeignCallResult([
|
|
569
|
-
toSingle(new Fr(success))
|
|
570
|
-
]);
|
|
571
|
-
}
|
|
572
|
-
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
-
import { WorldStateDB } from '@aztec/simulator/server';
|
|
3
|
-
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
|
-
import type { ContractDataSource } from '@aztec/stdlib/contract';
|
|
5
|
-
import type { MerkleTreeWriteOperations } from '@aztec/stdlib/interfaces/server';
|
|
6
|
-
import type { TXE } from '../oracle/txe_oracle.js';
|
|
7
|
-
export declare class TXEWorldStateDB extends WorldStateDB {
|
|
8
|
-
private merkleDb;
|
|
9
|
-
private txe;
|
|
10
|
-
constructor(merkleDb: MerkleTreeWriteOperations, dataSource: ContractDataSource, txe: TXE);
|
|
11
|
-
storageRead(contract: AztecAddress, slot: Fr): Promise<Fr>;
|
|
12
|
-
storageWrite(contract: AztecAddress, slot: Fr, newValue: Fr): Promise<void>;
|
|
13
|
-
}
|
|
14
|
-
//# sourceMappingURL=txe_world_state_db.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"txe_world_state_db.d.ts","sourceRoot":"","sources":["../../src/util/txe_world_state_db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAEjE,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,iCAAiC,CAAC;AAGjF,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,yBAAyB,CAAC;AAEnD,qBAAa,eAAgB,SAAQ,YAAY;IACnC,OAAO,CAAC,QAAQ;IAA6D,OAAO,CAAC,GAAG;gBAAhF,QAAQ,EAAE,yBAAyB,EAAE,UAAU,EAAE,kBAAkB,EAAU,GAAG,EAAE,GAAG;IAI1F,WAAW,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,CAAC;IAgB1D,YAAY,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAK3F"}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
-
import { WorldStateDB } from '@aztec/simulator/server';
|
|
3
|
-
import { PublicDataWrite } from '@aztec/stdlib/avm';
|
|
4
|
-
import { computePublicDataTreeLeafSlot } from '@aztec/stdlib/hash';
|
|
5
|
-
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
6
|
-
export class TXEWorldStateDB extends WorldStateDB {
|
|
7
|
-
merkleDb;
|
|
8
|
-
txe;
|
|
9
|
-
constructor(merkleDb, dataSource, txe){
|
|
10
|
-
super(merkleDb, dataSource), this.merkleDb = merkleDb, this.txe = txe;
|
|
11
|
-
}
|
|
12
|
-
async storageRead(contract, slot) {
|
|
13
|
-
const leafSlot = (await computePublicDataTreeLeafSlot(contract, slot)).toBigInt();
|
|
14
|
-
const lowLeafResult = await this.merkleDb.getPreviousValueIndex(MerkleTreeId.PUBLIC_DATA_TREE, leafSlot);
|
|
15
|
-
let value = Fr.ZERO;
|
|
16
|
-
if (lowLeafResult && lowLeafResult.alreadyPresent) {
|
|
17
|
-
const preimage = await this.merkleDb.getLeafPreimage(MerkleTreeId.PUBLIC_DATA_TREE, lowLeafResult.index);
|
|
18
|
-
value = preimage.value;
|
|
19
|
-
}
|
|
20
|
-
return value;
|
|
21
|
-
}
|
|
22
|
-
async storageWrite(contract, slot, newValue) {
|
|
23
|
-
await this.txe.addPublicDataWrites([
|
|
24
|
-
new PublicDataWrite(await computePublicDataTreeLeafSlot(contract, slot), newValue)
|
|
25
|
-
]);
|
|
26
|
-
}
|
|
27
|
-
}
|