@aztec/txe 0.0.1-commit.6a729f7 → 0.0.1-commit.6b113946b
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/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +88 -54
- package/dest/oracle/interfaces.d.ts +29 -28
- package/dest/oracle/interfaces.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.d.ts +13 -13
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +12 -12
- package/dest/oracle/txe_oracle_top_level_context.d.ts +23 -23
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +124 -50
- package/dest/rpc_translator.d.ts +88 -83
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +291 -157
- package/dest/state_machine/archiver.d.ts +3 -3
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +7 -7
- package/dest/state_machine/dummy_p2p_client.d.ts +16 -12
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +28 -16
- package/dest/state_machine/index.d.ts +7 -5
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +19 -10
- package/dest/state_machine/mock_epoch_cache.d.ts +19 -3
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +36 -2
- package/dest/state_machine/synchronizer.d.ts +5 -5
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +3 -3
- package/dest/txe_session.d.ts +10 -6
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +93 -25
- package/dest/util/txe_public_contract_data_source.d.ts +2 -3
- package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
- package/dest/util/txe_public_contract_data_source.js +5 -22
- package/dest/utils/block_creation.d.ts +1 -1
- package/dest/utils/block_creation.d.ts.map +1 -1
- package/dest/utils/block_creation.js +3 -1
- package/package.json +15 -15
- package/src/index.ts +89 -52
- package/src/oracle/interfaces.ts +32 -31
- package/src/oracle/txe_oracle_public_context.ts +12 -12
- package/src/oracle/txe_oracle_top_level_context.ts +137 -96
- package/src/rpc_translator.ts +317 -174
- package/src/state_machine/archiver.ts +7 -5
- package/src/state_machine/dummy_p2p_client.ts +40 -22
- package/src/state_machine/index.ts +29 -9
- package/src/state_machine/mock_epoch_cache.ts +47 -3
- package/src/state_machine/synchronizer.ts +4 -4
- package/src/txe_session.ts +99 -72
- package/src/util/txe_public_contract_data_source.ts +10 -36
- package/src/utils/block_creation.ts +3 -1
- package/dest/util/txe_contract_store.d.ts +0 -12
- package/dest/util/txe_contract_store.d.ts.map +0 -1
- package/dest/util/txe_contract_store.js +0 -22
- package/src/util/txe_contract_store.ts +0 -36
|
@@ -12,9 +12,12 @@ import { Fr } from '@aztec/foundation/curves/bn254';
|
|
|
12
12
|
import { LogLevels, type Logger, applyStringFormatting, createLogger } from '@aztec/foundation/log';
|
|
13
13
|
import { TestDateProvider } from '@aztec/foundation/timer';
|
|
14
14
|
import type { KeyStore } from '@aztec/key-store';
|
|
15
|
+
import type { AccessScopes } from '@aztec/pxe/client/lazy';
|
|
15
16
|
import {
|
|
16
17
|
AddressStore,
|
|
17
18
|
CapsuleStore,
|
|
19
|
+
type ContractStore,
|
|
20
|
+
type ContractSyncService,
|
|
18
21
|
NoteStore,
|
|
19
22
|
ORACLE_VERSION,
|
|
20
23
|
PrivateEventStore,
|
|
@@ -22,7 +25,6 @@ import {
|
|
|
22
25
|
SenderAddressBookStore,
|
|
23
26
|
SenderTaggingStore,
|
|
24
27
|
enrichPublicSimulationError,
|
|
25
|
-
syncState,
|
|
26
28
|
} from '@aztec/pxe/server';
|
|
27
29
|
import {
|
|
28
30
|
ExecutionNoteCache,
|
|
@@ -84,7 +86,6 @@ import { ForkCheckpoint } from '@aztec/world-state';
|
|
|
84
86
|
import { DEFAULT_ADDRESS } from '../constants.js';
|
|
85
87
|
import type { TXEStateMachine } from '../state_machine/index.js';
|
|
86
88
|
import type { TXEAccountStore } from '../util/txe_account_store.js';
|
|
87
|
-
import type { TXEContractStore } from '../util/txe_contract_store.js';
|
|
88
89
|
import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
|
|
89
90
|
import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js';
|
|
90
91
|
import type { ITxeExecutionOracle } from './interfaces.js';
|
|
@@ -97,7 +98,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
97
98
|
|
|
98
99
|
constructor(
|
|
99
100
|
private stateMachine: TXEStateMachine,
|
|
100
|
-
private contractStore:
|
|
101
|
+
private contractStore: ContractStore,
|
|
101
102
|
private noteStore: NoteStore,
|
|
102
103
|
private keyStore: KeyStore,
|
|
103
104
|
private addressStore: AddressStore,
|
|
@@ -107,17 +108,17 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
107
108
|
private senderAddressBookStore: SenderAddressBookStore,
|
|
108
109
|
private capsuleStore: CapsuleStore,
|
|
109
110
|
private privateEventStore: PrivateEventStore,
|
|
110
|
-
private jobId: string,
|
|
111
111
|
private nextBlockTimestamp: bigint,
|
|
112
112
|
private version: Fr,
|
|
113
113
|
private chainId: Fr,
|
|
114
114
|
private authwits: Map<string, AuthWitness>,
|
|
115
|
+
private readonly contractSyncService: ContractSyncService,
|
|
115
116
|
) {
|
|
116
117
|
this.logger = createLogger('txe:top_level_context');
|
|
117
118
|
this.logger.debug('Entering Top Level Context');
|
|
118
119
|
}
|
|
119
120
|
|
|
120
|
-
|
|
121
|
+
assertCompatibleOracleVersion(version: number): void {
|
|
121
122
|
if (version !== ORACLE_VERSION) {
|
|
122
123
|
throw new Error(
|
|
123
124
|
`Incompatible oracle version. TXE is using version '${ORACLE_VERSION}', but got a request for '${version}'.`,
|
|
@@ -127,37 +128,38 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
127
128
|
|
|
128
129
|
// This is typically only invoked in private contexts, but it is convenient to also have it in top-level for testing
|
|
129
130
|
// setup.
|
|
130
|
-
|
|
131
|
+
getRandomField(): Fr {
|
|
131
132
|
return Fr.random();
|
|
132
133
|
}
|
|
133
134
|
|
|
134
135
|
// We instruct users to debug contracts via this oracle, so it makes sense that they'd expect it to also work in tests
|
|
135
|
-
|
|
136
|
+
log(level: number, message: string, fields: Fr[]): Promise<void> {
|
|
136
137
|
if (!LogLevels[level]) {
|
|
137
|
-
throw new Error(`Invalid
|
|
138
|
+
throw new Error(`Invalid log level: ${level}`);
|
|
138
139
|
}
|
|
139
140
|
const levelName = LogLevels[level];
|
|
140
141
|
|
|
141
142
|
this.logger[levelName](`${applyStringFormatting(message, fields)}`, { module: `${this.logger.module}:debug_log` });
|
|
143
|
+
return Promise.resolve();
|
|
142
144
|
}
|
|
143
145
|
|
|
144
|
-
|
|
146
|
+
getDefaultAddress(): AztecAddress {
|
|
145
147
|
return DEFAULT_ADDRESS;
|
|
146
148
|
}
|
|
147
149
|
|
|
148
|
-
async
|
|
150
|
+
async getNextBlockNumber(): Promise<BlockNumber> {
|
|
149
151
|
return BlockNumber((await this.getLastBlockNumber()) + 1);
|
|
150
152
|
}
|
|
151
153
|
|
|
152
|
-
|
|
154
|
+
getNextBlockTimestamp(): Promise<bigint> {
|
|
153
155
|
return Promise.resolve(this.nextBlockTimestamp);
|
|
154
156
|
}
|
|
155
157
|
|
|
156
|
-
async
|
|
158
|
+
async getLastBlockTimestamp() {
|
|
157
159
|
return (await this.stateMachine.node.getBlockHeader('latest'))!.globalVariables.timestamp;
|
|
158
160
|
}
|
|
159
161
|
|
|
160
|
-
async
|
|
162
|
+
async getLastTxEffects() {
|
|
161
163
|
const latestBlockNumber = await this.stateMachine.archiver.getBlockNumber();
|
|
162
164
|
const block = await this.stateMachine.archiver.getBlock(latestBlockNumber);
|
|
163
165
|
|
|
@@ -171,7 +173,26 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
171
173
|
return { txHash: txEffects.txHash, noteHashes: txEffects.noteHashes, nullifiers: txEffects.nullifiers };
|
|
172
174
|
}
|
|
173
175
|
|
|
174
|
-
async
|
|
176
|
+
async syncContractNonOracleMethod(contractAddress: AztecAddress, scope: AztecAddress, jobId: string) {
|
|
177
|
+
if (contractAddress.equals(DEFAULT_ADDRESS)) {
|
|
178
|
+
this.logger.debug(`Skipping sync in getPrivateEvents because the events correspond to the default address.`);
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
183
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(
|
|
184
|
+
contractAddress,
|
|
185
|
+
null,
|
|
186
|
+
async (call, execScopes) => {
|
|
187
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
188
|
+
},
|
|
189
|
+
blockHeader,
|
|
190
|
+
jobId,
|
|
191
|
+
[scope],
|
|
192
|
+
);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
async getPrivateEvents(selector: EventSelector, contractAddress: AztecAddress, scope: AztecAddress) {
|
|
175
196
|
return (
|
|
176
197
|
await this.privateEventStore.getPrivateEvents(selector, {
|
|
177
198
|
contractAddress,
|
|
@@ -182,7 +203,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
182
203
|
).map(e => e.packedEvent);
|
|
183
204
|
}
|
|
184
205
|
|
|
185
|
-
async
|
|
206
|
+
async advanceBlocksBy(blocks: number) {
|
|
186
207
|
this.logger.debug(`time traveling ${blocks} blocks`);
|
|
187
208
|
|
|
188
209
|
for (let i = 0; i < blocks; i++) {
|
|
@@ -190,12 +211,12 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
190
211
|
}
|
|
191
212
|
}
|
|
192
213
|
|
|
193
|
-
|
|
214
|
+
advanceTimestampBy(duration: UInt64) {
|
|
194
215
|
this.logger.debug(`time traveling ${duration} seconds`);
|
|
195
216
|
this.nextBlockTimestamp += duration;
|
|
196
217
|
}
|
|
197
218
|
|
|
198
|
-
async
|
|
219
|
+
async deploy(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr) {
|
|
199
220
|
// Emit deployment nullifier
|
|
200
221
|
await this.mineBlock({
|
|
201
222
|
nullifiers: [
|
|
@@ -207,20 +228,20 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
207
228
|
});
|
|
208
229
|
|
|
209
230
|
if (!secret.equals(Fr.ZERO)) {
|
|
210
|
-
await this.
|
|
231
|
+
await this.addAccount(artifact, instance, secret);
|
|
211
232
|
} else {
|
|
212
233
|
await this.contractStore.addContractInstance(instance);
|
|
213
|
-
await this.contractStore.addContractArtifact(
|
|
234
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
214
235
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
215
236
|
}
|
|
216
237
|
}
|
|
217
238
|
|
|
218
|
-
async
|
|
239
|
+
async addAccount(artifact: ContractArtifact, instance: ContractInstanceWithAddress, secret: Fr) {
|
|
219
240
|
const partialAddress = await computePartialAddress(instance);
|
|
220
241
|
|
|
221
242
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
222
243
|
await this.contractStore.addContractInstance(instance);
|
|
223
|
-
await this.contractStore.addContractArtifact(
|
|
244
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
224
245
|
|
|
225
246
|
const completeAddress = await this.keyStore.addAccount(secret, partialAddress);
|
|
226
247
|
await this.accountStore.setAccount(completeAddress.address, completeAddress);
|
|
@@ -230,7 +251,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
230
251
|
return completeAddress;
|
|
231
252
|
}
|
|
232
253
|
|
|
233
|
-
async
|
|
254
|
+
async createAccount(secret: Fr) {
|
|
234
255
|
// This is a foot gun !
|
|
235
256
|
const completeAddress = await this.keyStore.addAccount(secret, secret);
|
|
236
257
|
await this.accountStore.setAccount(completeAddress.address, completeAddress);
|
|
@@ -240,7 +261,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
240
261
|
return completeAddress;
|
|
241
262
|
}
|
|
242
263
|
|
|
243
|
-
async
|
|
264
|
+
async addAuthWitness(address: AztecAddress, messageHash: Fr) {
|
|
244
265
|
const account = await this.accountStore.getAccount(address);
|
|
245
266
|
const privateKey = await this.keyStore.getMasterSecretKey(account.publicKeys.masterIncomingViewingPublicKey);
|
|
246
267
|
|
|
@@ -253,7 +274,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
253
274
|
}
|
|
254
275
|
|
|
255
276
|
async mineBlock(options: { nullifiers?: Fr[] } = {}) {
|
|
256
|
-
const blockNumber = await this.
|
|
277
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
257
278
|
|
|
258
279
|
const txEffect = TxEffect.empty();
|
|
259
280
|
txEffect.nullifiers = [getSingleTxBlockRequestHash(blockNumber), ...(options.nullifiers ?? [])];
|
|
@@ -277,13 +298,14 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
277
298
|
await this.stateMachine.handleL2Block(block);
|
|
278
299
|
}
|
|
279
300
|
|
|
280
|
-
async
|
|
301
|
+
async privateCallNewFlow(
|
|
281
302
|
from: AztecAddress,
|
|
282
303
|
targetContractAddress: AztecAddress = AztecAddress.zero(),
|
|
283
304
|
functionSelector: FunctionSelector = FunctionSelector.empty(),
|
|
284
305
|
args: Fr[],
|
|
285
306
|
argsHash: Fr = Fr.zero(),
|
|
286
307
|
isStaticCall: boolean = false,
|
|
308
|
+
jobId: string,
|
|
287
309
|
) {
|
|
288
310
|
this.logger.verbose(
|
|
289
311
|
`Executing external function ${await this.contractStore.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`,
|
|
@@ -297,14 +319,26 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
297
319
|
throw new Error(message);
|
|
298
320
|
}
|
|
299
321
|
|
|
322
|
+
// When `from` is the zero address (e.g. when deploying a new account contract), we return an
|
|
323
|
+
// empty scope list which acts as deny-all: no notes are visible and no keys are accessible.
|
|
324
|
+
const effectiveScopes = from.isZero() ? [] : [from];
|
|
325
|
+
|
|
300
326
|
// Sync notes before executing private function to discover notes from previous transactions
|
|
301
|
-
const utilityExecutor = async (call: FunctionCall) => {
|
|
302
|
-
await this.executeUtilityCall(call);
|
|
327
|
+
const utilityExecutor = async (call: FunctionCall, execScopes: AccessScopes) => {
|
|
328
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
303
329
|
};
|
|
304
330
|
|
|
305
|
-
await
|
|
331
|
+
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
332
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(
|
|
333
|
+
targetContractAddress,
|
|
334
|
+
functionSelector,
|
|
335
|
+
utilityExecutor,
|
|
336
|
+
blockHeader,
|
|
337
|
+
jobId,
|
|
338
|
+
effectiveScopes,
|
|
339
|
+
);
|
|
306
340
|
|
|
307
|
-
const blockNumber = await this.
|
|
341
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
308
342
|
|
|
309
343
|
const callContext = new CallContext(from, targetContractAddress, functionSelector, isStaticCall);
|
|
310
344
|
|
|
@@ -314,8 +348,6 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
314
348
|
|
|
315
349
|
const txContext = new TxContext(this.chainId, this.version, gasSettings);
|
|
316
350
|
|
|
317
|
-
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
318
|
-
|
|
319
351
|
const protocolNullifier = await computeProtocolNullifier(getSingleTxBlockRequestHash(blockNumber));
|
|
320
352
|
const noteCache = new ExecutionNoteCache(protocolNullifier);
|
|
321
353
|
// In production, the account contract sets the min revertible counter before calling the app function.
|
|
@@ -327,42 +359,38 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
327
359
|
|
|
328
360
|
const simulator = new WASMSimulator();
|
|
329
361
|
|
|
330
|
-
const privateExecutionOracle = new PrivateExecutionOracle(
|
|
362
|
+
const privateExecutionOracle = new PrivateExecutionOracle({
|
|
331
363
|
argsHash,
|
|
332
364
|
txContext,
|
|
333
365
|
callContext,
|
|
334
|
-
|
|
335
|
-
blockHeader,
|
|
366
|
+
anchorBlockHeader: blockHeader,
|
|
336
367
|
utilityExecutor,
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
[],
|
|
341
|
-
HashedValuesCache.create([new HashedValues(args, argsHash)]),
|
|
368
|
+
authWitnesses: Array.from(this.authwits.values()),
|
|
369
|
+
capsules: [],
|
|
370
|
+
executionCache: HashedValuesCache.create([new HashedValues(args, argsHash)]),
|
|
342
371
|
noteCache,
|
|
343
372
|
taggingIndexCache,
|
|
344
|
-
this.contractStore,
|
|
345
|
-
this.noteStore,
|
|
346
|
-
this.keyStore,
|
|
347
|
-
this.addressStore,
|
|
348
|
-
this.stateMachine.node,
|
|
349
|
-
this.senderTaggingStore,
|
|
350
|
-
this.recipientTaggingStore,
|
|
351
|
-
this.senderAddressBookStore,
|
|
352
|
-
this.capsuleStore,
|
|
353
|
-
this.privateEventStore,
|
|
354
|
-
this.
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
*/
|
|
363
|
-
from,
|
|
373
|
+
contractStore: this.contractStore,
|
|
374
|
+
noteStore: this.noteStore,
|
|
375
|
+
keyStore: this.keyStore,
|
|
376
|
+
addressStore: this.addressStore,
|
|
377
|
+
aztecNode: this.stateMachine.node,
|
|
378
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
379
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
380
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
381
|
+
capsuleStore: this.capsuleStore,
|
|
382
|
+
privateEventStore: this.privateEventStore,
|
|
383
|
+
contractSyncService: this.stateMachine.contractSyncService,
|
|
384
|
+
jobId,
|
|
385
|
+
totalPublicCalldataCount: 0,
|
|
386
|
+
sideEffectCounter: minRevertibleSideEffectCounter,
|
|
387
|
+
scopes: effectiveScopes,
|
|
388
|
+
// In TXE, the typical transaction entrypoint is skipped, so we need to simulate the actions that such a
|
|
389
|
+
// contract would perform, including setting senderForTags.
|
|
390
|
+
senderForTags: from,
|
|
364
391
|
simulator,
|
|
365
|
-
|
|
392
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
393
|
+
});
|
|
366
394
|
|
|
367
395
|
// Note: This is a slight modification of simulator.run without any of the checks. Maybe we should modify simulator.run with a boolean value to skip checks.
|
|
368
396
|
let result: PrivateExecutionResult;
|
|
@@ -384,7 +412,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
384
412
|
);
|
|
385
413
|
const publicFunctionsCalldata = await Promise.all(
|
|
386
414
|
publicCallRequests.map(async r => {
|
|
387
|
-
const calldata = await privateExecutionOracle.
|
|
415
|
+
const calldata = await privateExecutionOracle.loadFromExecutionCache(r.calldataHash);
|
|
388
416
|
return new HashedValues(calldata, r.calldataHash);
|
|
389
417
|
}),
|
|
390
418
|
);
|
|
@@ -401,7 +429,8 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
401
429
|
// We pass the non-zero minRevertibleSideEffectCounter to make sure the side effects are split correctly.
|
|
402
430
|
const { publicInputs } = await generateSimulatedProvingResult(
|
|
403
431
|
result,
|
|
404
|
-
this.contractStore,
|
|
432
|
+
(addr, sel) => this.contractStore.getDebugFunctionName(addr, sel),
|
|
433
|
+
this.stateMachine.node,
|
|
405
434
|
minRevertibleSideEffectCounter,
|
|
406
435
|
);
|
|
407
436
|
|
|
@@ -497,7 +526,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
497
526
|
return executionResult.returnValues ?? [];
|
|
498
527
|
}
|
|
499
528
|
|
|
500
|
-
async
|
|
529
|
+
async publicCallNewFlow(
|
|
501
530
|
from: AztecAddress,
|
|
502
531
|
targetContractAddress: AztecAddress,
|
|
503
532
|
calldata: Fr[],
|
|
@@ -507,7 +536,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
507
536
|
`Executing public function ${await this.contractStore.getDebugFunctionName(targetContractAddress, FunctionSelector.fromField(calldata[0]))}@${targetContractAddress} isStaticCall=${isStaticCall}`,
|
|
508
537
|
);
|
|
509
538
|
|
|
510
|
-
const blockNumber = await this.
|
|
539
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
511
540
|
|
|
512
541
|
const gasLimits = new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
|
|
513
542
|
|
|
@@ -584,7 +613,7 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
584
613
|
constantData,
|
|
585
614
|
/*gasUsed=*/ new Gas(0, 0),
|
|
586
615
|
/*feePayer=*/ AztecAddress.zero(),
|
|
587
|
-
/*
|
|
616
|
+
/*expirationTimestamp=*/ 0n,
|
|
588
617
|
inputsForPublic,
|
|
589
618
|
undefined,
|
|
590
619
|
);
|
|
@@ -652,10 +681,11 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
652
681
|
return returnValues ?? [];
|
|
653
682
|
}
|
|
654
683
|
|
|
655
|
-
async
|
|
684
|
+
async executeUtilityFunction(
|
|
656
685
|
targetContractAddress: AztecAddress,
|
|
657
686
|
functionSelector: FunctionSelector,
|
|
658
687
|
args: Fr[],
|
|
688
|
+
jobId: string,
|
|
659
689
|
) {
|
|
660
690
|
const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
661
691
|
if (!artifact) {
|
|
@@ -663,25 +693,33 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
663
693
|
}
|
|
664
694
|
|
|
665
695
|
// Sync notes before executing utility function to discover notes from previous transactions
|
|
666
|
-
await
|
|
667
|
-
|
|
668
|
-
});
|
|
669
|
-
|
|
670
|
-
const call = new FunctionCall(
|
|
671
|
-
artifact.name,
|
|
696
|
+
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
697
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(
|
|
672
698
|
targetContractAddress,
|
|
673
699
|
functionSelector,
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
700
|
+
async (call, execScopes) => {
|
|
701
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
702
|
+
},
|
|
703
|
+
blockHeader,
|
|
704
|
+
jobId,
|
|
705
|
+
'ALL_SCOPES',
|
|
679
706
|
);
|
|
680
707
|
|
|
681
|
-
|
|
708
|
+
const call = FunctionCall.from({
|
|
709
|
+
name: artifact.name,
|
|
710
|
+
to: targetContractAddress,
|
|
711
|
+
selector: functionSelector,
|
|
712
|
+
type: FunctionType.UTILITY,
|
|
713
|
+
hideMsgSender: false,
|
|
714
|
+
isStatic: false,
|
|
715
|
+
args,
|
|
716
|
+
returnTypes: [],
|
|
717
|
+
});
|
|
718
|
+
|
|
719
|
+
return this.executeUtilityCall(call, 'ALL_SCOPES', jobId);
|
|
682
720
|
}
|
|
683
721
|
|
|
684
|
-
private async executeUtilityCall(call: FunctionCall): Promise<Fr[]> {
|
|
722
|
+
private async executeUtilityCall(call: FunctionCall, scopes: AccessScopes, jobId: string): Promise<Fr[]> {
|
|
685
723
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
686
724
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
687
725
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
|
|
@@ -694,22 +732,25 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
694
732
|
|
|
695
733
|
try {
|
|
696
734
|
const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
697
|
-
const oracle = new UtilityExecutionOracle(
|
|
698
|
-
call.to,
|
|
699
|
-
[],
|
|
700
|
-
[],
|
|
735
|
+
const oracle = new UtilityExecutionOracle({
|
|
736
|
+
contractAddress: call.to,
|
|
737
|
+
authWitnesses: [],
|
|
738
|
+
capsules: [],
|
|
701
739
|
anchorBlockHeader,
|
|
702
|
-
this.contractStore,
|
|
703
|
-
this.noteStore,
|
|
704
|
-
this.keyStore,
|
|
705
|
-
this.addressStore,
|
|
706
|
-
this.stateMachine.node,
|
|
707
|
-
this.recipientTaggingStore,
|
|
708
|
-
this.senderAddressBookStore,
|
|
709
|
-
this.capsuleStore,
|
|
710
|
-
this.privateEventStore,
|
|
711
|
-
this.
|
|
712
|
-
|
|
740
|
+
contractStore: this.contractStore,
|
|
741
|
+
noteStore: this.noteStore,
|
|
742
|
+
keyStore: this.keyStore,
|
|
743
|
+
addressStore: this.addressStore,
|
|
744
|
+
aztecNode: this.stateMachine.node,
|
|
745
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
746
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
747
|
+
capsuleStore: this.capsuleStore,
|
|
748
|
+
privateEventStore: this.privateEventStore,
|
|
749
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
750
|
+
contractSyncService: this.contractSyncService,
|
|
751
|
+
jobId,
|
|
752
|
+
scopes,
|
|
753
|
+
});
|
|
713
754
|
const acirExecutionResult = await new WASMSimulator()
|
|
714
755
|
.executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback())
|
|
715
756
|
.catch((err: Error) => {
|
|
@@ -725,10 +766,10 @@ export class TXEOracleTopLevelContext implements IMiscOracle, ITxeExecutionOracl
|
|
|
725
766
|
);
|
|
726
767
|
});
|
|
727
768
|
|
|
728
|
-
this.logger.verbose(`Utility
|
|
769
|
+
this.logger.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
|
|
729
770
|
return witnessMapToFields(acirExecutionResult.returnWitness);
|
|
730
771
|
} catch (err) {
|
|
731
|
-
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility
|
|
772
|
+
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility execution'));
|
|
732
773
|
}
|
|
733
774
|
}
|
|
734
775
|
|