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