@aztec/txe 0.0.1-commit.179ed20 → 0.0.1-commit.189eedb3
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/ContractClassRegistry-PII7Q556.js +3 -0
- package/dest/ContractClassRegistry-PII7Q556.js.map +7 -0
- package/dest/ContractInstanceRegistry-3MHLGFNZ.js +3 -0
- package/dest/ContractInstanceRegistry-3MHLGFNZ.js.map +7 -0
- package/dest/FeeJuice-TQV5AQK7.js +3 -0
- package/dest/FeeJuice-TQV5AQK7.js.map +7 -0
- package/dest/MultiCallEntrypoint-SBJUIJY7.js +3 -0
- package/dest/MultiCallEntrypoint-SBJUIJY7.js.map +7 -0
- package/dest/SchnorrAccount-MQXPIZ44.js +3 -0
- package/dest/SchnorrAccount-MQXPIZ44.js.map +7 -0
- package/dest/bin/check_txe_oracle_version.d.ts +2 -0
- package/dest/bin/check_txe_oracle_version.d.ts.map +1 -0
- package/dest/bin/check_txe_oracle_version.js +61 -0
- package/dest/bin/index.js +3 -30
- package/dest/bin/index.js.map +7 -0
- package/dest/bin/oracle_test_server.d.ts +3 -0
- package/dest/bin/oracle_test_server.d.ts.map +1 -0
- package/dest/bin/oracle_test_server.js +41 -0
- package/dest/chunk-6DNQGQKE.js +265 -0
- package/dest/chunk-6DNQGQKE.js.map +7 -0
- package/dest/chunk-BJVAAXNA.js +3 -0
- package/dest/chunk-BJVAAXNA.js.map +7 -0
- package/dest/chunk-IGFYWSUP.js +304 -0
- package/dest/chunk-IGFYWSUP.js.map +7 -0
- package/dest/constants.d.ts +5 -1
- package/dest/constants.d.ts.map +1 -1
- package/dest/constants.js +8 -0
- package/dest/dispatcher_pool.d.ts +67 -0
- package/dest/dispatcher_pool.d.ts.map +1 -0
- package/dest/dispatcher_pool.js +284 -0
- package/dest/index.d.ts +185 -7
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +71 -157
- package/dest/metafile.json +38642 -0
- package/dest/msgpackr_fr_extension.d.ts +2 -0
- package/dest/msgpackr_fr_extension.d.ts.map +1 -0
- package/dest/msgpackr_fr_extension.js +21 -0
- package/dest/oracle/interfaces.d.ts +56 -30
- package/dest/oracle/interfaces.d.ts.map +1 -1
- package/dest/oracle/test-resolver/fixtures.d.ts +43 -0
- package/dest/oracle/test-resolver/fixtures.d.ts.map +1 -0
- package/dest/oracle/test-resolver/fixtures.js +39 -0
- package/dest/oracle/test-resolver/index.d.ts +9 -0
- package/dest/oracle/test-resolver/index.d.ts.map +1 -0
- package/dest/oracle/test-resolver/index.js +33 -0
- package/dest/oracle/test-resolver/resolver.d.ts +34 -0
- package/dest/oracle/test-resolver/resolver.d.ts.map +1 -0
- package/dest/oracle/test-resolver/resolver.js +114 -0
- package/dest/oracle/txe_oracle_public_context.d.ts +38 -14
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +55 -13
- package/dest/oracle/txe_oracle_registry.d.ts +147 -0
- package/dest/oracle/txe_oracle_registry.d.ts.map +1 -0
- package/dest/oracle/txe_oracle_registry.js +562 -0
- package/dest/oracle/txe_oracle_top_level_context.d.ts +45 -26
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +243 -80
- package/dest/oracle/txe_oracle_version.d.ts +17 -0
- package/dest/oracle/txe_oracle_version.d.ts.map +1 -0
- package/dest/oracle/txe_oracle_version.js +14 -0
- package/dest/oracle/txe_private_execution_oracle.d.ts +17 -0
- package/dest/oracle/txe_private_execution_oracle.d.ts.map +1 -0
- package/dest/oracle/txe_private_execution_oracle.js +15 -0
- package/dest/rpc_server.d.ts +14 -0
- package/dest/rpc_server.d.ts.map +1 -0
- package/dest/rpc_server.js +78 -0
- package/dest/rpc_translator.d.ts +96 -228
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +815 -612
- package/dest/server.bundle.js +3 -0
- package/dest/server.bundle.js.map +7 -0
- package/dest/state_machine/archiver.d.ts +6 -5
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +32 -21
- package/dest/state_machine/dummy_p2p_client.d.ts +26 -16
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +44 -20
- package/dest/state_machine/global_variable_builder.d.ts +9 -4
- package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
- package/dest/state_machine/global_variable_builder.js +9 -3
- package/dest/state_machine/index.d.ts +10 -6
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +35 -12
- package/dest/state_machine/mock_epoch_cache.d.ts +18 -3
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +33 -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 +4 -4
- package/dest/txe_session.d.ts +80 -15
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +240 -43
- 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/dest/utils/encoding.d.ts +191 -0
- package/dest/utils/encoding.d.ts.map +1 -0
- package/dest/{util → utils}/encoding.js +7 -2
- package/dest/{util → utils}/expected_failure_error.d.ts +1 -1
- package/dest/utils/expected_failure_error.d.ts.map +1 -0
- package/dest/{util → utils}/txe_account_store.d.ts +1 -1
- package/dest/utils/txe_account_store.d.ts.map +1 -0
- package/dest/utils/txe_artifact_resolver.d.ts +37 -0
- package/dest/utils/txe_artifact_resolver.d.ts.map +1 -0
- package/dest/utils/txe_artifact_resolver.js +161 -0
- package/dest/utils/txe_public_contract_data_source.d.ts +20 -0
- package/dest/utils/txe_public_contract_data_source.d.ts.map +1 -0
- package/dest/{util → utils}/txe_public_contract_data_source.js +6 -25
- package/dest/worker.bundle.js +3 -0
- package/dest/worker.bundle.js.map +7 -0
- package/dest/worker.d.ts +2 -0
- package/dest/worker.d.ts.map +1 -0
- package/dest/worker.js +92 -0
- package/package.json +38 -21
- package/src/bin/check_txe_oracle_version.ts +70 -0
- package/src/bin/index.ts +11 -2
- package/src/bin/oracle_test_server.ts +51 -0
- package/src/constants.ts +10 -0
- package/src/dispatcher_pool.ts +316 -0
- package/src/index.ts +97 -190
- package/src/msgpackr_fr_extension.ts +23 -0
- package/src/oracle/interfaces.ts +58 -35
- package/src/oracle/test-resolver/fixtures.ts +84 -0
- package/src/oracle/test-resolver/index.ts +45 -0
- package/src/oracle/test-resolver/resolver.ts +165 -0
- package/src/oracle/txe_oracle_public_context.ts +72 -12
- package/src/oracle/txe_oracle_registry.ts +401 -0
- package/src/oracle/txe_oracle_top_level_context.ts +293 -139
- package/src/oracle/txe_oracle_version.ts +17 -0
- package/src/oracle/txe_private_execution_oracle.ts +30 -0
- package/src/rpc_server.ts +87 -0
- package/src/rpc_translator.ts +1000 -995
- package/src/state_machine/archiver.ts +44 -20
- package/src/state_machine/dummy_p2p_client.ts +70 -32
- package/src/state_machine/global_variable_builder.ts +18 -3
- package/src/state_machine/index.ts +48 -13
- package/src/state_machine/mock_epoch_cache.ts +43 -3
- package/src/state_machine/synchronizer.ts +5 -5
- package/src/txe_session.ts +356 -96
- package/src/utils/block_creation.ts +3 -1
- package/src/{util → utils}/encoding.ts +8 -2
- package/src/utils/txe_artifact_resolver.ts +217 -0
- package/src/{util → utils}/txe_public_contract_data_source.ts +10 -38
- package/src/worker.ts +98 -0
- package/dest/util/encoding.d.ts +0 -720
- package/dest/util/encoding.d.ts.map +0 -1
- package/dest/util/expected_failure_error.d.ts.map +0 -1
- package/dest/util/txe_account_store.d.ts.map +0 -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/dest/util/txe_public_contract_data_source.d.ts +0 -21
- package/dest/util/txe_public_contract_data_source.d.ts.map +0 -1
- package/src/util/txe_contract_store.ts +0 -36
- /package/dest/{util → utils}/expected_failure_error.js +0 -0
- /package/dest/{util → utils}/txe_account_store.js +0 -0
- /package/src/{util → utils}/expected_failure_error.ts +0 -0
- /package/src/{util → utils}/txe_account_store.ts +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"txe_oracle_top_level_context.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_oracle_top_level_context.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"txe_oracle_top_level_context.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_oracle_top_level_context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS,
|
|
1
|
+
import { CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS, MAX_PRIVATE_LOGS_PER_TX, NUMBER_OF_L1_L2_MESSAGES_PER_ROLLUP } from '@aztec/constants';
|
|
2
2
|
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Schnorr } from '@aztec/foundation/crypto/schnorr';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
5
|
import { LogLevels, applyStringFormatting, createLogger } from '@aztec/foundation/log';
|
|
6
6
|
import { TestDateProvider } from '@aztec/foundation/timer';
|
|
7
|
-
import {
|
|
7
|
+
import { CapsuleService, ORACLE_VERSION_MAJOR, composeHooks, enrichPublicSimulationError } from '@aztec/pxe/server';
|
|
8
8
|
import { ExecutionNoteCache, ExecutionTaggingIndexCache, HashedValuesCache, Oracle, PrivateExecutionOracle, UtilityExecutionOracle, executePrivateFunction, generateSimulatedProvingResult } from '@aztec/pxe/simulator';
|
|
9
9
|
import { ExecutionError, WASMSimulator, createSimulationError, extractCallStack, resolveAssertionMessageFromError, toACVMWitness, witnessMapToFields } from '@aztec/simulator/client';
|
|
10
10
|
import { CppPublicTxSimulator, GuardedMerkleTreeOperations, PublicContractsDB, PublicProcessor } from '@aztec/simulator/server';
|
|
@@ -13,17 +13,18 @@ import { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
|
13
13
|
import { PublicSimulatorConfig } from '@aztec/stdlib/avm';
|
|
14
14
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
15
15
|
import { computePartialAddress } from '@aztec/stdlib/contract';
|
|
16
|
-
import { Gas, GasFees
|
|
16
|
+
import { Gas, GasFees } from '@aztec/stdlib/gas';
|
|
17
17
|
import { computeCalldataHash, computeProtocolNullifier, siloNullifier } from '@aztec/stdlib/hash';
|
|
18
18
|
import { PartialPrivateTailPublicInputsForPublic, PrivateKernelTailCircuitPublicInputs, PrivateToPublicAccumulatedData, PublicCallRequest } from '@aztec/stdlib/kernel';
|
|
19
|
+
import { hashPublicKey } from '@aztec/stdlib/keys';
|
|
19
20
|
import { ChonkProof } from '@aztec/stdlib/proofs';
|
|
20
21
|
import { makeGlobalVariables } from '@aztec/stdlib/testing';
|
|
21
22
|
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
22
23
|
import { CallContext, HashedValues, PrivateExecutionResult, Tx, TxConstantData, TxContext, TxEffect, TxHash, collectNested } from '@aztec/stdlib/tx';
|
|
23
|
-
import { ForkCheckpoint } from '@aztec/world-state';
|
|
24
|
-
import { DEFAULT_ADDRESS } from '../constants.js';
|
|
25
|
-
import { TXEPublicContractDataSource } from '../util/txe_public_contract_data_source.js';
|
|
24
|
+
import { ForkCheckpoint } from '@aztec/world-state/native';
|
|
25
|
+
import { DEFAULT_ADDRESS, MAX_PRIVATE_EVENTS_PER_TXE_QUERY, MAX_PRIVATE_EVENT_LEN } from '../constants.js';
|
|
26
26
|
import { getSingleTxBlockRequestHash, insertTxEffectIntoWorldTrees, makeTXEBlock } from '../utils/block_creation.js';
|
|
27
|
+
import { TXEPublicContractDataSource } from '../utils/txe_public_contract_data_source.js';
|
|
27
28
|
export class TXEOracleTopLevelContext {
|
|
28
29
|
stateMachine;
|
|
29
30
|
contractStore;
|
|
@@ -36,15 +37,17 @@ export class TXEOracleTopLevelContext {
|
|
|
36
37
|
senderAddressBookStore;
|
|
37
38
|
capsuleStore;
|
|
38
39
|
privateEventStore;
|
|
39
|
-
jobId;
|
|
40
40
|
nextBlockTimestamp;
|
|
41
41
|
version;
|
|
42
42
|
chainId;
|
|
43
43
|
authwits;
|
|
44
|
+
artifactResolver;
|
|
45
|
+
rootPath;
|
|
46
|
+
packageName;
|
|
44
47
|
isMisc;
|
|
45
48
|
isTxe;
|
|
46
49
|
logger;
|
|
47
|
-
constructor(stateMachine, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore,
|
|
50
|
+
constructor(stateMachine, contractStore, noteStore, keyStore, addressStore, accountStore, senderTaggingStore, recipientTaggingStore, senderAddressBookStore, capsuleStore, privateEventStore, nextBlockTimestamp, version, chainId, authwits, artifactResolver, rootPath, packageName){
|
|
48
51
|
this.stateMachine = stateMachine;
|
|
49
52
|
this.contractStore = contractStore;
|
|
50
53
|
this.noteStore = noteStore;
|
|
@@ -56,64 +59,96 @@ export class TXEOracleTopLevelContext {
|
|
|
56
59
|
this.senderAddressBookStore = senderAddressBookStore;
|
|
57
60
|
this.capsuleStore = capsuleStore;
|
|
58
61
|
this.privateEventStore = privateEventStore;
|
|
59
|
-
this.jobId = jobId;
|
|
60
62
|
this.nextBlockTimestamp = nextBlockTimestamp;
|
|
61
63
|
this.version = version;
|
|
62
64
|
this.chainId = chainId;
|
|
63
65
|
this.authwits = authwits;
|
|
66
|
+
this.artifactResolver = artifactResolver;
|
|
67
|
+
this.rootPath = rootPath;
|
|
68
|
+
this.packageName = packageName;
|
|
64
69
|
this.isMisc = true;
|
|
65
70
|
this.isTxe = true;
|
|
66
71
|
this.logger = createLogger('txe:top_level_context');
|
|
67
72
|
this.logger.debug('Entering Top Level Context');
|
|
68
73
|
}
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
74
|
+
contractOracleVersion;
|
|
75
|
+
assertCompatibleOracleVersion(major, minor) {
|
|
76
|
+
if (major !== ORACLE_VERSION_MAJOR) {
|
|
77
|
+
const hint = major > ORACLE_VERSION_MAJOR ? 'The contract was compiled with a newer version of Aztec.nr than this aztec cli version supports. Upgrade your aztec cli version to a compatible version.' : 'The contract was compiled with an older version of Aztec.nr than this aztec cli version supports. Recompile the contract with a compatible version of Aztec.nr.';
|
|
78
|
+
throw new Error(`Incompatible aztec cli version: ${hint} See https://docs.aztec.network/errors/8 (expected oracle major version ${ORACLE_VERSION_MAJOR}, got ${major})`);
|
|
72
79
|
}
|
|
80
|
+
this.contractOracleVersion = {
|
|
81
|
+
major,
|
|
82
|
+
minor
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
// Prefixed with "nonOracleFunction" as it is not used as an oracle handler.
|
|
86
|
+
nonOracleFunctionGetContractOracleVersion() {
|
|
87
|
+
return this.contractOracleVersion;
|
|
73
88
|
}
|
|
74
89
|
// This is typically only invoked in private contexts, but it is convenient to also have it in top-level for testing
|
|
75
90
|
// setup.
|
|
76
|
-
|
|
91
|
+
getRandomField() {
|
|
77
92
|
return Fr.random();
|
|
78
93
|
}
|
|
79
94
|
// We instruct users to debug contracts via this oracle, so it makes sense that they'd expect it to also work in tests
|
|
80
|
-
|
|
95
|
+
log(level, message, _fieldsSize, fields) {
|
|
81
96
|
if (!LogLevels[level]) {
|
|
82
|
-
throw new Error(`Invalid
|
|
97
|
+
throw new Error(`Invalid log level: ${level}`);
|
|
83
98
|
}
|
|
84
99
|
const levelName = LogLevels[level];
|
|
85
100
|
this.logger[levelName](`${applyStringFormatting(message, fields)}`, {
|
|
86
101
|
module: `${this.logger.module}:debug_log`
|
|
87
102
|
});
|
|
103
|
+
return Promise.resolve();
|
|
88
104
|
}
|
|
89
|
-
|
|
105
|
+
getDefaultAddress() {
|
|
90
106
|
return DEFAULT_ADDRESS;
|
|
91
107
|
}
|
|
92
|
-
async
|
|
108
|
+
async getNextBlockNumber() {
|
|
93
109
|
return BlockNumber(await this.getLastBlockNumber() + 1);
|
|
94
110
|
}
|
|
95
|
-
|
|
111
|
+
getNextBlockTimestamp() {
|
|
96
112
|
return Promise.resolve(this.nextBlockTimestamp);
|
|
97
113
|
}
|
|
98
|
-
async
|
|
99
|
-
return (await this.stateMachine.node.
|
|
114
|
+
async getLastBlockTimestamp() {
|
|
115
|
+
return (await this.stateMachine.node.getBlockData('latest')).header.globalVariables.timestamp;
|
|
100
116
|
}
|
|
101
|
-
async
|
|
117
|
+
async getLastTxEffects() {
|
|
102
118
|
const latestBlockNumber = await this.stateMachine.archiver.getBlockNumber();
|
|
103
|
-
const block = await this.stateMachine.archiver.getBlock(
|
|
119
|
+
const block = await this.stateMachine.archiver.getBlock({
|
|
120
|
+
number: latestBlockNumber
|
|
121
|
+
});
|
|
104
122
|
if (block.body.txEffects.length != 1) {
|
|
105
123
|
// Note that calls like env.mine() will result in blocks with no transactions, hitting this
|
|
106
124
|
throw new Error(`Expected a single transaction in the last block, found ${block.body.txEffects.length}`);
|
|
107
125
|
}
|
|
108
126
|
const txEffects = block.body.txEffects[0];
|
|
127
|
+
const privateLogs = txEffects.privateLogs;
|
|
128
|
+
if (privateLogs.length > MAX_PRIVATE_LOGS_PER_TX) {
|
|
129
|
+
throw new Error(`${privateLogs.length} private logs exceed max ${MAX_PRIVATE_LOGS_PER_TX}`);
|
|
130
|
+
}
|
|
109
131
|
return {
|
|
110
132
|
txHash: txEffects.txHash,
|
|
111
133
|
noteHashes: txEffects.noteHashes,
|
|
112
|
-
nullifiers: txEffects.nullifiers
|
|
134
|
+
nullifiers: txEffects.nullifiers,
|
|
135
|
+
privateLogs
|
|
113
136
|
};
|
|
114
137
|
}
|
|
115
|
-
async
|
|
116
|
-
|
|
138
|
+
async syncContractNonOracleMethod(contractAddress, scope, jobId) {
|
|
139
|
+
if (contractAddress.equals(DEFAULT_ADDRESS)) {
|
|
140
|
+
this.logger.debug(`Skipping sync in getPrivateEvents because the events correspond to the default address.`);
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
144
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(contractAddress, null, async (call, execScopes)=>{
|
|
145
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
146
|
+
}, blockHeader, jobId, [
|
|
147
|
+
scope
|
|
148
|
+
]);
|
|
149
|
+
}
|
|
150
|
+
async getPrivateEvents(selector, contractAddress, scope) {
|
|
151
|
+
const events = (await this.privateEventStore.getPrivateEvents(selector, {
|
|
117
152
|
contractAddress,
|
|
118
153
|
scopes: [
|
|
119
154
|
scope
|
|
@@ -121,44 +156,83 @@ export class TXEOracleTopLevelContext {
|
|
|
121
156
|
fromBlock: 0,
|
|
122
157
|
toBlock: await this.getLastBlockNumber() + 1
|
|
123
158
|
})).map((e)=>e.packedEvent);
|
|
159
|
+
if (events.length > MAX_PRIVATE_EVENTS_PER_TXE_QUERY) {
|
|
160
|
+
throw new Error(`Array of length ${events.length} larger than maxLen ${MAX_PRIVATE_EVENTS_PER_TXE_QUERY}`);
|
|
161
|
+
}
|
|
162
|
+
if (events.some((e)=>e.length > MAX_PRIVATE_EVENT_LEN)) {
|
|
163
|
+
throw new Error(`Some private event has length larger than maxLen ${MAX_PRIVATE_EVENT_LEN}`);
|
|
164
|
+
}
|
|
165
|
+
return events;
|
|
124
166
|
}
|
|
125
|
-
async
|
|
167
|
+
async advanceBlocksBy(blocks) {
|
|
126
168
|
this.logger.debug(`time traveling ${blocks} blocks`);
|
|
127
169
|
for(let i = 0; i < blocks; i++){
|
|
128
170
|
await this.mineBlock();
|
|
129
171
|
}
|
|
130
172
|
}
|
|
131
|
-
|
|
173
|
+
advanceTimestampBy(duration) {
|
|
132
174
|
this.logger.debug(`time traveling ${duration} seconds`);
|
|
133
175
|
this.nextBlockTimestamp += duration;
|
|
134
176
|
}
|
|
135
|
-
|
|
177
|
+
deploymentNullifier(address) {
|
|
178
|
+
return siloNullifier(AztecAddress.fromNumber(CONTRACT_INSTANCE_REGISTRY_CONTRACT_ADDRESS), address.toField());
|
|
179
|
+
}
|
|
180
|
+
async deploy(contractPath, initializer, args, secret, salt, deployer) {
|
|
181
|
+
const { artifact, instance } = await this.artifactResolver.resolveDeployArtifact({
|
|
182
|
+
rootPath: this.rootPath,
|
|
183
|
+
packageName: this.packageName,
|
|
184
|
+
contractPath,
|
|
185
|
+
initializer,
|
|
186
|
+
args,
|
|
187
|
+
secret,
|
|
188
|
+
salt,
|
|
189
|
+
deployer
|
|
190
|
+
});
|
|
136
191
|
// Emit deployment nullifier
|
|
137
192
|
await this.mineBlock({
|
|
138
193
|
nullifiers: [
|
|
139
|
-
await
|
|
194
|
+
await this.deploymentNullifier(instance.address)
|
|
140
195
|
]
|
|
141
196
|
});
|
|
142
197
|
if (!secret.equals(Fr.ZERO)) {
|
|
143
|
-
await this.
|
|
198
|
+
await this.registerContractAndAddAccount(artifact, instance, secret);
|
|
144
199
|
} else {
|
|
145
200
|
await this.contractStore.addContractInstance(instance);
|
|
146
|
-
await this.contractStore.addContractArtifact(
|
|
201
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
147
202
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
148
203
|
}
|
|
204
|
+
return [
|
|
205
|
+
instance.salt,
|
|
206
|
+
instance.deployer.toField(),
|
|
207
|
+
instance.currentContractClassId,
|
|
208
|
+
instance.initializationHash,
|
|
209
|
+
instance.immutablesHash,
|
|
210
|
+
...instance.publicKeys.toFields()
|
|
211
|
+
];
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Mines a single block containing only the deployment nullifiers for the contracts at the given addresses.
|
|
215
|
+
*/ async mineDeploymentNullifiers(addresses) {
|
|
216
|
+
await this.mineBlock({
|
|
217
|
+
nullifiers: await Promise.all(addresses.map((address)=>this.deploymentNullifier(address)))
|
|
218
|
+
});
|
|
149
219
|
}
|
|
150
|
-
async
|
|
220
|
+
async addAccount(secret) {
|
|
221
|
+
const { artifact, instance } = await this.artifactResolver.resolveAccountArtifact(secret);
|
|
222
|
+
return this.registerContractAndAddAccount(artifact, instance, secret);
|
|
223
|
+
}
|
|
224
|
+
async registerContractAndAddAccount(artifact, instance, secret) {
|
|
151
225
|
const partialAddress = await computePartialAddress(instance);
|
|
152
226
|
this.logger.debug(`Deployed ${artifact.name} at ${instance.address}`);
|
|
153
227
|
await this.contractStore.addContractInstance(instance);
|
|
154
|
-
await this.contractStore.addContractArtifact(
|
|
228
|
+
await this.contractStore.addContractArtifact(artifact);
|
|
155
229
|
const completeAddress = await this.keyStore.addAccount(secret, partialAddress);
|
|
156
230
|
await this.accountStore.setAccount(completeAddress.address, completeAddress);
|
|
157
231
|
await this.addressStore.addCompleteAddress(completeAddress);
|
|
158
232
|
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
159
233
|
return completeAddress;
|
|
160
234
|
}
|
|
161
|
-
async
|
|
235
|
+
async createAccount(secret) {
|
|
162
236
|
// This is a foot gun !
|
|
163
237
|
const completeAddress = await this.keyStore.addAccount(secret, secret);
|
|
164
238
|
await this.accountStore.setAccount(completeAddress.address, completeAddress);
|
|
@@ -166,18 +240,17 @@ export class TXEOracleTopLevelContext {
|
|
|
166
240
|
this.logger.debug(`Created account ${completeAddress.address}`);
|
|
167
241
|
return completeAddress;
|
|
168
242
|
}
|
|
169
|
-
async
|
|
243
|
+
async addAuthWitness(address, messageHash) {
|
|
170
244
|
const account = await this.accountStore.getAccount(address);
|
|
171
|
-
const
|
|
245
|
+
const ivpkMHash = await hashPublicKey(account.publicKeys.ivpkM);
|
|
246
|
+
const privateKey = await this.keyStore.getMasterSecretKey(ivpkMHash);
|
|
172
247
|
const schnorr = new Schnorr();
|
|
173
|
-
const signature = await schnorr.constructSignature(messageHash
|
|
174
|
-
const authWitness = new AuthWitness(messageHash,
|
|
175
|
-
...signature.toBuffer()
|
|
176
|
-
]);
|
|
248
|
+
const signature = await schnorr.constructSignature(messageHash, privateKey);
|
|
249
|
+
const authWitness = new AuthWitness(messageHash, signature.toLimbFields());
|
|
177
250
|
this.authwits.set(authWitness.requestHash.toString(), authWitness);
|
|
178
251
|
}
|
|
179
252
|
async mineBlock(options = {}) {
|
|
180
|
-
const blockNumber = await this.
|
|
253
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
181
254
|
const txEffect = TxEffect.empty();
|
|
182
255
|
txEffect.nullifiers = [
|
|
183
256
|
getSingleTxBlockRequestHash(blockNumber),
|
|
@@ -199,25 +272,27 @@ export class TXEOracleTopLevelContext {
|
|
|
199
272
|
this.logger.info(`Created block ${blockNumber} with timestamp ${block.header.globalVariables.timestamp}`);
|
|
200
273
|
await this.stateMachine.handleL2Block(block);
|
|
201
274
|
}
|
|
202
|
-
async
|
|
275
|
+
async privateCallNewFlow(from, targetContractAddress = AztecAddress.zero(), functionSelector = FunctionSelector.empty(), args, argsHash = Fr.zero(), isStaticCall = false, additionalScopes = [], jobId, authorizedUtilityCallTargets, gasSettings) {
|
|
203
276
|
this.logger.verbose(`Executing external function ${await this.contractStore.getDebugFunctionName(targetContractAddress, functionSelector)}@${targetContractAddress} isStaticCall=${isStaticCall}`);
|
|
204
277
|
const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
205
278
|
if (!artifact) {
|
|
206
279
|
const message = functionSelector.equals(await FunctionSelector.fromSignature('verify_private_authwit(Field)')) ? 'Found no account contract artifact for a private authwit check - use `create_contract_account` instead of `create_light_account` for authwit support.' : 'Function Artifact does not exist';
|
|
207
280
|
throw new Error(message);
|
|
208
281
|
}
|
|
282
|
+
const scopes = from === undefined ? additionalScopes : [
|
|
283
|
+
from,
|
|
284
|
+
...additionalScopes
|
|
285
|
+
];
|
|
209
286
|
// Sync notes before executing private function to discover notes from previous transactions
|
|
210
|
-
const utilityExecutor = async (call)=>{
|
|
211
|
-
await this.executeUtilityCall(call);
|
|
287
|
+
const utilityExecutor = async (call, execScopes)=>{
|
|
288
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
212
289
|
};
|
|
213
|
-
await syncState(targetContractAddress, this.contractStore, functionSelector, utilityExecutor);
|
|
214
|
-
const blockNumber = await this.txeGetNextBlockNumber();
|
|
215
|
-
const callContext = new CallContext(from, targetContractAddress, functionSelector, isStaticCall);
|
|
216
|
-
const gasLimits = new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
|
|
217
|
-
const teardownGasLimits = new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT);
|
|
218
|
-
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
|
|
219
|
-
const txContext = new TxContext(this.chainId, this.version, gasSettings);
|
|
220
290
|
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
291
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(targetContractAddress, functionSelector, utilityExecutor, blockHeader, jobId, scopes);
|
|
292
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
293
|
+
const msgSender = from ?? AztecAddress.NULL_MSG_SENDER;
|
|
294
|
+
const callContext = new CallContext(msgSender, targetContractAddress, functionSelector, isStaticCall);
|
|
295
|
+
const txContext = new TxContext(this.chainId, this.version, gasSettings);
|
|
221
296
|
const protocolNullifier = await computeProtocolNullifier(getSingleTxBlockRequestHash(blockNumber));
|
|
222
297
|
const noteCache = new ExecutionNoteCache(protocolNullifier);
|
|
223
298
|
// In production, the account contract sets the min revertible counter before calling the app function.
|
|
@@ -227,12 +302,44 @@ export class TXEOracleTopLevelContext {
|
|
|
227
302
|
await noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter);
|
|
228
303
|
const taggingIndexCache = new ExecutionTaggingIndexCache();
|
|
229
304
|
const simulator = new WASMSimulator();
|
|
230
|
-
const privateExecutionOracle = new PrivateExecutionOracle(
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
305
|
+
const privateExecutionOracle = new PrivateExecutionOracle({
|
|
306
|
+
argsHash,
|
|
307
|
+
txContext,
|
|
308
|
+
callContext,
|
|
309
|
+
anchorBlockHeader: blockHeader,
|
|
310
|
+
utilityExecutor,
|
|
311
|
+
authWitnesses: Array.from(this.authwits.values()),
|
|
312
|
+
capsules: [],
|
|
313
|
+
executionCache: HashedValuesCache.create([
|
|
314
|
+
new HashedValues(args, argsHash)
|
|
315
|
+
]),
|
|
316
|
+
noteCache,
|
|
317
|
+
taggingIndexCache,
|
|
318
|
+
contractStore: this.contractStore,
|
|
319
|
+
noteStore: this.noteStore,
|
|
320
|
+
keyStore: this.keyStore,
|
|
321
|
+
addressStore: this.addressStore,
|
|
322
|
+
aztecNode: this.stateMachine.node,
|
|
323
|
+
senderTaggingStore: this.senderTaggingStore,
|
|
324
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
325
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
326
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
327
|
+
privateEventStore: this.privateEventStore,
|
|
328
|
+
contractSyncService: this.stateMachine.contractSyncService,
|
|
329
|
+
jobId,
|
|
330
|
+
totalPublicCalldataCount: 0,
|
|
331
|
+
sideEffectCounter: minRevertibleSideEffectCounter,
|
|
332
|
+
scopes,
|
|
333
|
+
// In TXE, the typical transaction entrypoint is skipped, so we need to simulate the actions that such a
|
|
334
|
+
// contract would perform, including setting senderForTags.
|
|
335
|
+
senderForTags: from,
|
|
336
|
+
simulator,
|
|
337
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
338
|
+
l2TipsStore: this.stateMachine.l2TipsProvider,
|
|
339
|
+
hooks: composeHooks({
|
|
340
|
+
authorizeUtilityCall: this.buildAuthorizeUtilityCallHook(isStaticCall ? 'private view' : 'private', authorizedUtilityCallTargets)
|
|
341
|
+
})
|
|
342
|
+
});
|
|
236
343
|
// 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.
|
|
237
344
|
let result;
|
|
238
345
|
let executionResult;
|
|
@@ -244,7 +351,7 @@ export class TXEOracleTopLevelContext {
|
|
|
244
351
|
r.publicInputs.publicTeardownCallRequest
|
|
245
352
|
]));
|
|
246
353
|
const publicFunctionsCalldata = await Promise.all(publicCallRequests.map(async (r)=>{
|
|
247
|
-
const calldata = await privateExecutionOracle.
|
|
354
|
+
const calldata = await privateExecutionOracle.getHashPreimage(r.calldataHash);
|
|
248
355
|
return new HashedValues(calldata, r.calldataHash);
|
|
249
356
|
}));
|
|
250
357
|
noteCache.finish();
|
|
@@ -256,7 +363,7 @@ export class TXEOracleTopLevelContext {
|
|
|
256
363
|
// According to the protocol rules, there must be at least one nullifier in the tx. The first nullifier is used as
|
|
257
364
|
// the nonce generator for the note hashes.
|
|
258
365
|
// We pass the non-zero minRevertibleSideEffectCounter to make sure the side effects are split correctly.
|
|
259
|
-
const { publicInputs } = await generateSimulatedProvingResult(result, this.contractStore, minRevertibleSideEffectCounter);
|
|
366
|
+
const { publicInputs } = await generateSimulatedProvingResult(result, (addr, sel)=>this.contractStore.getDebugFunctionName(addr, sel), this.stateMachine.node, minRevertibleSideEffectCounter);
|
|
260
367
|
const globals = makeGlobalVariables();
|
|
261
368
|
globals.blockNumber = blockNumber;
|
|
262
369
|
globals.timestamp = this.nextBlockTimestamp;
|
|
@@ -303,10 +410,20 @@ export class TXEOracleTopLevelContext {
|
|
|
303
410
|
throw new Error('Contract execution has reverted');
|
|
304
411
|
}
|
|
305
412
|
}
|
|
413
|
+
// Walk the nested private-call tree and collect every offchain effect the transaction emitted.
|
|
414
|
+
// PXE stores these on each `PrivateCallExecutionResult` and they never reach TXE via the
|
|
415
|
+
// `aztec_utl_emitOffchainEffect` foreign-call path (that path only fires at the top-level), so
|
|
416
|
+
// we pull them out here and the RPC wrapper will hand them to `TXESession` for buffering.
|
|
417
|
+
const offchainEffects = collectNested([
|
|
418
|
+
executionResult
|
|
419
|
+
], (r)=>r.offchainEffects.map((e)=>e.data));
|
|
306
420
|
if (isStaticCall) {
|
|
307
421
|
await checkpoint.revert();
|
|
308
422
|
await forkedWorldTrees.close();
|
|
309
|
-
return
|
|
423
|
+
return {
|
|
424
|
+
returnValues: executionResult.returnValues ?? [],
|
|
425
|
+
offchainEffects
|
|
426
|
+
};
|
|
310
427
|
}
|
|
311
428
|
const txEffect = TxEffect.empty();
|
|
312
429
|
txEffect.noteHashes = processedTx.txEffect.noteHashes;
|
|
@@ -322,14 +439,14 @@ export class TXEOracleTopLevelContext {
|
|
|
322
439
|
]);
|
|
323
440
|
await this.stateMachine.handleL2Block(l2Block);
|
|
324
441
|
await forkedWorldTrees.close();
|
|
325
|
-
return
|
|
442
|
+
return {
|
|
443
|
+
returnValues: executionResult.returnValues ?? [],
|
|
444
|
+
offchainEffects
|
|
445
|
+
};
|
|
326
446
|
}
|
|
327
|
-
async
|
|
447
|
+
async publicCallNewFlow(from, targetContractAddress, calldata, isStaticCall, gasSettings) {
|
|
328
448
|
this.logger.verbose(`Executing public function ${await this.contractStore.getDebugFunctionName(targetContractAddress, FunctionSelector.fromField(calldata[0]))}@${targetContractAddress} isStaticCall=${isStaticCall}`);
|
|
329
|
-
const blockNumber = await this.
|
|
330
|
-
const gasLimits = new Gas(DEFAULT_DA_GAS_LIMIT, DEFAULT_L2_GAS_LIMIT);
|
|
331
|
-
const teardownGasLimits = new Gas(DEFAULT_TEARDOWN_DA_GAS_LIMIT, DEFAULT_TEARDOWN_L2_GAS_LIMIT);
|
|
332
|
-
const gasSettings = new GasSettings(gasLimits, teardownGasLimits, GasFees.empty(), GasFees.empty());
|
|
449
|
+
const blockNumber = await this.getNextBlockNumber();
|
|
333
450
|
const txContext = new TxContext(this.chainId, this.version, gasSettings);
|
|
334
451
|
const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
335
452
|
const calldataHash = await computeCalldataHash(calldata);
|
|
@@ -362,10 +479,10 @@ export class TXEOracleTopLevelContext {
|
|
|
362
479
|
// The enqueued public call itself we make be revertible so that the public execution is itself revertible, as tests
|
|
363
480
|
// may require producing reverts.
|
|
364
481
|
const revertibleAccumulatedData = PrivateToPublicAccumulatedData.empty();
|
|
365
|
-
revertibleAccumulatedData.publicCallRequests[0] = new PublicCallRequest(from, targetContractAddress, isStaticCall, calldataHash);
|
|
482
|
+
revertibleAccumulatedData.publicCallRequests[0] = new PublicCallRequest(from ?? AztecAddress.NULL_MSG_SENDER, targetContractAddress, isStaticCall, calldataHash);
|
|
366
483
|
const inputsForPublic = new PartialPrivateTailPublicInputsForPublic(nonRevertibleAccumulatedData, revertibleAccumulatedData, PublicCallRequest.empty());
|
|
367
484
|
const constantData = new TxConstantData(anchorBlockHeader, txContext, Fr.zero(), Fr.zero());
|
|
368
|
-
const txData = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ new Gas(0, 0), /*feePayer=*/ AztecAddress.zero(), /*
|
|
485
|
+
const txData = new PrivateKernelTailCircuitPublicInputs(constantData, /*gasUsed=*/ new Gas(0, 0), /*feePayer=*/ AztecAddress.zero(), /*expirationTimestamp=*/ 0n, inputsForPublic, undefined);
|
|
369
486
|
const tx = await Tx.create({
|
|
370
487
|
data: txData,
|
|
371
488
|
chonkProof: ChonkProof.empty(),
|
|
@@ -418,19 +535,29 @@ export class TXEOracleTopLevelContext {
|
|
|
418
535
|
await forkedWorldTrees.close();
|
|
419
536
|
return returnValues ?? [];
|
|
420
537
|
}
|
|
421
|
-
async
|
|
538
|
+
async executeUtilityFunction(targetContractAddress, functionSelector, args, jobId, authorizedUtilityCallTargets) {
|
|
422
539
|
const artifact = await this.contractStore.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
423
540
|
if (!artifact) {
|
|
424
541
|
throw new Error(`Cannot call ${functionSelector} as there is no artifact found at ${targetContractAddress}.`);
|
|
425
542
|
}
|
|
426
543
|
// Sync notes before executing utility function to discover notes from previous transactions
|
|
427
|
-
await
|
|
428
|
-
|
|
544
|
+
const blockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
545
|
+
await this.stateMachine.contractSyncService.ensureContractSynced(targetContractAddress, functionSelector, async (call, execScopes)=>{
|
|
546
|
+
await this.executeUtilityCall(call, execScopes, jobId);
|
|
547
|
+
}, blockHeader, jobId, await this.keyStore.getAccounts());
|
|
548
|
+
const call = FunctionCall.from({
|
|
549
|
+
name: artifact.name,
|
|
550
|
+
to: targetContractAddress,
|
|
551
|
+
selector: functionSelector,
|
|
552
|
+
type: FunctionType.UTILITY,
|
|
553
|
+
hideMsgSender: false,
|
|
554
|
+
isStatic: false,
|
|
555
|
+
args,
|
|
556
|
+
returnTypes: []
|
|
429
557
|
});
|
|
430
|
-
|
|
431
|
-
return this.executeUtilityCall(call);
|
|
558
|
+
return this.executeUtilityCall(call, await this.keyStore.getAccounts(), jobId, authorizedUtilityCallTargets);
|
|
432
559
|
}
|
|
433
|
-
async executeUtilityCall(call) {
|
|
560
|
+
async executeUtilityCall(call, scopes, jobId, authorizedUtilityCallTargets = []) {
|
|
434
561
|
const entryPointArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(call.to, call.selector);
|
|
435
562
|
if (entryPointArtifact.functionType !== FunctionType.UTILITY) {
|
|
436
563
|
throw new Error(`Cannot run ${entryPointArtifact.functionType} function as utility`);
|
|
@@ -441,8 +568,36 @@ export class TXEOracleTopLevelContext {
|
|
|
441
568
|
});
|
|
442
569
|
try {
|
|
443
570
|
const anchorBlockHeader = await this.stateMachine.anchorBlockStore.getBlockHeader();
|
|
444
|
-
const
|
|
445
|
-
const
|
|
571
|
+
const simulator = new WASMSimulator();
|
|
572
|
+
const utilityExecutor = async (syncCall, execScopes)=>{
|
|
573
|
+
await this.executeUtilityCall(syncCall, execScopes, jobId);
|
|
574
|
+
};
|
|
575
|
+
const oracle = new UtilityExecutionOracle({
|
|
576
|
+
contractAddress: call.to,
|
|
577
|
+
authWitnesses: [],
|
|
578
|
+
capsules: [],
|
|
579
|
+
anchorBlockHeader,
|
|
580
|
+
contractStore: this.contractStore,
|
|
581
|
+
noteStore: this.noteStore,
|
|
582
|
+
keyStore: this.keyStore,
|
|
583
|
+
addressStore: this.addressStore,
|
|
584
|
+
aztecNode: this.stateMachine.node,
|
|
585
|
+
recipientTaggingStore: this.recipientTaggingStore,
|
|
586
|
+
senderAddressBookStore: this.senderAddressBookStore,
|
|
587
|
+
capsuleService: new CapsuleService(this.capsuleStore, scopes),
|
|
588
|
+
privateEventStore: this.privateEventStore,
|
|
589
|
+
messageContextService: this.stateMachine.messageContextService,
|
|
590
|
+
contractSyncService: this.stateMachine.contractSyncService,
|
|
591
|
+
l2TipsStore: this.stateMachine.l2TipsProvider,
|
|
592
|
+
jobId,
|
|
593
|
+
scopes,
|
|
594
|
+
simulator,
|
|
595
|
+
hooks: composeHooks({
|
|
596
|
+
authorizeUtilityCall: this.buildAuthorizeUtilityCallHook('utility', authorizedUtilityCallTargets)
|
|
597
|
+
}),
|
|
598
|
+
utilityExecutor
|
|
599
|
+
});
|
|
600
|
+
const acirExecutionResult = await simulator.executeUserCircuit(toACVMWitness(0, call.args), entryPointArtifact, new Oracle(oracle).toACIRCallback()).catch((err)=>{
|
|
446
601
|
err.message = resolveAssertionMessageFromError(err, entryPointArtifact);
|
|
447
602
|
throw new ExecutionError(err.message, {
|
|
448
603
|
contractAddress: call.to,
|
|
@@ -451,10 +606,10 @@ export class TXEOracleTopLevelContext {
|
|
|
451
606
|
cause: err
|
|
452
607
|
});
|
|
453
608
|
});
|
|
454
|
-
this.logger.verbose(`Utility
|
|
609
|
+
this.logger.verbose(`Utility execution for ${call.to}.${call.selector} completed`);
|
|
455
610
|
return witnessMapToFields(acirExecutionResult.returnWitness);
|
|
456
611
|
} catch (err) {
|
|
457
|
-
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility
|
|
612
|
+
throw createSimulationError(err instanceof Error ? err : new Error('Unknown error during utility execution'));
|
|
458
613
|
}
|
|
459
614
|
}
|
|
460
615
|
close() {
|
|
@@ -465,7 +620,15 @@ export class TXEOracleTopLevelContext {
|
|
|
465
620
|
];
|
|
466
621
|
}
|
|
467
622
|
async getLastBlockNumber() {
|
|
468
|
-
const
|
|
469
|
-
return
|
|
623
|
+
const block = await this.stateMachine.node.getBlock('latest');
|
|
624
|
+
return block ? block.header.globalVariables.blockNumber : BlockNumber.ZERO;
|
|
625
|
+
}
|
|
626
|
+
buildAuthorizeUtilityCallHook(callerContext, authorizedTargets) {
|
|
627
|
+
if (authorizedTargets.length === 0) {
|
|
628
|
+
return undefined;
|
|
629
|
+
}
|
|
630
|
+
return (req)=>Promise.resolve({
|
|
631
|
+
authorized: req.callerContext === callerContext && authorizedTargets.some((t)=>t.equals(req.target))
|
|
632
|
+
});
|
|
470
633
|
}
|
|
471
634
|
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The TXE oracle version constants are used to check that the oracle interface used for tests is in sync between
|
|
3
|
+
* TXE and Aztec.nr. This is separate from the contract oracle version in `pxe/src/oracle_version.ts`, which covers
|
|
4
|
+
* oracles used during contract execution by PXE.
|
|
5
|
+
*
|
|
6
|
+
* The Noir counterparts are in `noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr`.
|
|
7
|
+
*/
|
|
8
|
+
export declare const TXE_ORACLE_VERSION_MAJOR = 1;
|
|
9
|
+
export declare const TXE_ORACLE_VERSION_MINOR = 2;
|
|
10
|
+
/**
|
|
11
|
+
* This hash is computed from the TXE oracle interfaces (IAvmExecutionOracle and ITxeExecutionOracle) and is used to
|
|
12
|
+
* detect when those interfaces change. When it does, bump:
|
|
13
|
+
* - TXE_ORACLE_VERSION_MAJOR (and reset MINOR to 0) for breaking changes, or
|
|
14
|
+
* - TXE_ORACLE_VERSION_MINOR for additive changes (new oracle method added).
|
|
15
|
+
*/
|
|
16
|
+
export declare const TXE_ORACLE_INTERFACE_HASH = "9e5f6ad5fd170d1de5ddd417f19cce47b17382567e08360dc6a783154828e218";
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX29yYWNsZV92ZXJzaW9uLmQudHMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3JhY2xlL3R4ZV9vcmFjbGVfdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFDSCxlQUFPLE1BQU0sd0JBQXdCLElBQUksQ0FBQztBQUMxQyxlQUFPLE1BQU0sd0JBQXdCLElBQUksQ0FBQztBQUUxQzs7Ozs7R0FLRztBQUNILGVBQU8sTUFBTSx5QkFBeUIscUVBQXFFLENBQUMifQ==
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"txe_oracle_version.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_oracle_version.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAC1C,eAAO,MAAM,wBAAwB,IAAI,CAAC;AAE1C;;;;;GAKG;AACH,eAAO,MAAM,yBAAyB,qEAAqE,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The TXE oracle version constants are used to check that the oracle interface used for tests is in sync between
|
|
3
|
+
* TXE and Aztec.nr. This is separate from the contract oracle version in `pxe/src/oracle_version.ts`, which covers
|
|
4
|
+
* oracles used during contract execution by PXE.
|
|
5
|
+
*
|
|
6
|
+
* The Noir counterparts are in `noir-projects/aztec-nr/aztec/src/test/helpers/txe_oracles.nr`.
|
|
7
|
+
*/ export const TXE_ORACLE_VERSION_MAJOR = 1;
|
|
8
|
+
export const TXE_ORACLE_VERSION_MINOR = 2;
|
|
9
|
+
/**
|
|
10
|
+
* This hash is computed from the TXE oracle interfaces (IAvmExecutionOracle and ITxeExecutionOracle) and is used to
|
|
11
|
+
* detect when those interfaces change. When it does, bump:
|
|
12
|
+
* - TXE_ORACLE_VERSION_MAJOR (and reset MINOR to 0) for breaking changes, or
|
|
13
|
+
* - TXE_ORACLE_VERSION_MINOR for additive changes (new oracle method added).
|
|
14
|
+
*/ export const TXE_ORACLE_INTERFACE_HASH = '9e5f6ad5fd170d1de5ddd417f19cce47b17382567e08360dc6a783154828e218';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Fr } from '@aztec/foundation/curves/bn254';
|
|
2
|
+
import { PrivateExecutionOracle } from '@aztec/pxe/simulator';
|
|
3
|
+
import type { FunctionSelector } from '@aztec/stdlib/abi';
|
|
4
|
+
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
5
|
+
/**
|
|
6
|
+
* TXE-specific subclass of PrivateExecutionOracle that forbids operations not supported in
|
|
7
|
+
* TestEnvironment::private_context. TXE uses dedicated oracle flows (e.g. private_call) instead.
|
|
8
|
+
*/
|
|
9
|
+
export declare class TXEPrivateExecutionOracle extends PrivateExecutionOracle {
|
|
10
|
+
callPrivateFunction(_targetContractAddress: AztecAddress, _functionSelector: FunctionSelector, _argsHash: Fr, _sideEffectCounter: number, _isStaticCall: boolean): Promise<{
|
|
11
|
+
endSideEffectCounter: Fr;
|
|
12
|
+
returnsHash: Fr;
|
|
13
|
+
}>;
|
|
14
|
+
assertValidPublicCalldata(_calldataHash: Fr): Promise<void>;
|
|
15
|
+
notifyRevertiblePhaseStart(_minRevertibleSideEffectCounter: number): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHhlX3ByaXZhdGVfZXhlY3V0aW9uX29yYWNsZS5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL29yYWNsZS90eGVfcHJpdmF0ZV9leGVjdXRpb25fb3JhY2xlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3pELE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sS0FBSyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDMUQsT0FBTyxLQUFLLEVBQUUsWUFBWSxFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFFaEU7OztHQUdHO0FBQ0gscUJBQWEseUJBQTBCLFNBQVEsc0JBQXNCO0lBQzFELG1CQUFtQixDQUMxQixzQkFBc0IsRUFBRSxZQUFZLEVBQ3BDLGlCQUFpQixFQUFFLGdCQUFnQixFQUNuQyxTQUFTLEVBQUUsRUFBRSxFQUNiLGtCQUFrQixFQUFFLE1BQU0sRUFDMUIsYUFBYSxFQUFFLE9BQU8sR0FDckIsT0FBTyxDQUFDO1FBQUUsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1FBQUMsV0FBVyxFQUFFLEVBQUUsQ0FBQTtLQUFFLENBQUMsQ0FJeEQ7SUFFUSx5QkFBeUIsQ0FBQyxhQUFhLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFbkU7SUFFUSwwQkFBMEIsQ0FBQywrQkFBK0IsRUFBRSxNQUFNLEdBQUcsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUUxRjtDQUNGIn0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"txe_private_execution_oracle.d.ts","sourceRoot":"","sources":["../../src/oracle/txe_private_execution_oracle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACzD,OAAO,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AAC9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAC1D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAEhE;;;GAGG;AACH,qBAAa,yBAA0B,SAAQ,sBAAsB;IAC1D,mBAAmB,CAC1B,sBAAsB,EAAE,YAAY,EACpC,iBAAiB,EAAE,gBAAgB,EACnC,SAAS,EAAE,EAAE,EACb,kBAAkB,EAAE,MAAM,EAC1B,aAAa,EAAE,OAAO,GACrB,OAAO,CAAC;QAAE,oBAAoB,EAAE,EAAE,CAAC;QAAC,WAAW,EAAE,EAAE,CAAA;KAAE,CAAC,CAIxD;IAEQ,yBAAyB,CAAC,aAAa,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;IAEQ,0BAA0B,CAAC,+BAA+B,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAE1F;CACF"}
|