@aztec/simulator 0.66.0 → 0.67.0
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/acvm/acvm.js +3 -3
- package/dest/acvm/oracle/oracle.d.ts +1 -1
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +3 -3
- package/dest/acvm/oracle/typed_oracle.d.ts +2 -2
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +3 -3
- package/dest/acvm/serialize.js +2 -2
- package/dest/avm/avm_context.d.ts +2 -2
- package/dest/avm/avm_context.d.ts.map +1 -1
- package/dest/avm/avm_context.js +3 -4
- package/dest/avm/avm_execution_environment.d.ts +4 -6
- package/dest/avm/avm_execution_environment.d.ts.map +1 -1
- package/dest/avm/avm_execution_environment.js +8 -13
- package/dest/avm/avm_memory_types.d.ts +2 -2
- package/dest/avm/avm_memory_types.d.ts.map +1 -1
- package/dest/avm/avm_memory_types.js +3 -3
- package/dest/avm/avm_simulator.d.ts +3 -3
- package/dest/avm/avm_simulator.d.ts.map +1 -1
- package/dest/avm/avm_simulator.js +22 -13
- package/dest/avm/errors.d.ts +3 -3
- package/dest/avm/errors.d.ts.map +1 -1
- package/dest/avm/errors.js +8 -15
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +4 -4
- package/dest/avm/journal/journal.d.ts +15 -4
- package/dest/avm/journal/journal.d.ts.map +1 -1
- package/dest/avm/journal/journal.js +108 -29
- package/dest/avm/opcodes/external_calls.d.ts.map +1 -1
- package/dest/avm/opcodes/external_calls.js +4 -11
- package/dest/avm/opcodes/misc.d.ts.map +1 -1
- package/dest/avm/opcodes/misc.js +3 -3
- package/dest/client/client_execution_context.d.ts +3 -3
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +14 -8
- package/dest/client/db_oracle.d.ts +2 -2
- package/dest/client/db_oracle.d.ts.map +1 -1
- package/dest/client/execution_note_cache.d.ts +9 -1
- package/dest/client/execution_note_cache.d.ts.map +1 -1
- package/dest/client/execution_note_cache.js +10 -3
- package/dest/client/private_execution.d.ts.map +1 -1
- package/dest/client/private_execution.js +4 -4
- package/dest/client/simulator.d.ts.map +1 -1
- package/dest/client/simulator.js +4 -4
- package/dest/client/unconstrained_execution.d.ts.map +1 -1
- package/dest/client/unconstrained_execution.js +3 -3
- package/dest/client/view_data_oracle.d.ts +2 -2
- package/dest/client/view_data_oracle.d.ts.map +1 -1
- package/dest/client/view_data_oracle.js +5 -6
- package/dest/common/debug_fn_name.d.ts +2 -2
- package/dest/common/debug_fn_name.d.ts.map +1 -1
- package/dest/common/debug_fn_name.js +8 -14
- package/dest/providers/acvm_native.js +4 -4
- package/dest/providers/factory.d.ts +2 -2
- package/dest/providers/factory.d.ts.map +1 -1
- package/dest/providers/factory.js +4 -4
- package/dest/public/enqueued_call_side_effect_trace.d.ts +11 -23
- package/dest/public/enqueued_call_side_effect_trace.d.ts.map +1 -1
- package/dest/public/enqueued_call_side_effect_trace.js +37 -58
- package/dest/public/executor_metrics.d.ts.map +1 -1
- package/dest/public/executor_metrics.js +2 -5
- package/dest/public/fixtures/index.d.ts +24 -1
- package/dest/public/fixtures/index.d.ts.map +1 -1
- package/dest/public/fixtures/index.js +15 -9
- package/dest/public/index.d.ts +0 -1
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +1 -2
- package/dest/public/public_db_sources.d.ts.map +1 -1
- package/dest/public/public_db_sources.js +4 -4
- package/dest/public/public_processor.d.ts +7 -8
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +30 -22
- package/dest/public/public_tx_context.d.ts +13 -10
- package/dest/public/public_tx_context.d.ts.map +1 -1
- package/dest/public/public_tx_context.js +46 -31
- package/dest/public/public_tx_simulator.d.ts +2 -2
- package/dest/public/public_tx_simulator.d.ts.map +1 -1
- package/dest/public/public_tx_simulator.js +43 -23
- package/dest/public/side_effect_trace_interface.d.ts +4 -17
- package/dest/public/side_effect_trace_interface.d.ts.map +1 -1
- package/dest/public/transitional_adapters.d.ts +2 -2
- package/dest/public/transitional_adapters.d.ts.map +1 -1
- package/dest/public/transitional_adapters.js +28 -24
- package/package.json +16 -9
- package/src/acvm/acvm.ts +2 -2
- package/src/acvm/oracle/oracle.ts +2 -2
- package/src/acvm/oracle/typed_oracle.ts +3 -3
- package/src/acvm/serialize.ts +1 -1
- package/src/avm/avm_context.ts +2 -3
- package/src/avm/avm_execution_environment.ts +6 -31
- package/src/avm/avm_memory_types.ts +2 -2
- package/src/avm/avm_simulator.ts +24 -20
- package/src/avm/errors.ts +12 -14
- package/src/avm/fixtures/index.ts +2 -3
- package/src/avm/journal/journal.ts +189 -63
- package/src/avm/opcodes/external_calls.ts +3 -19
- package/src/avm/opcodes/misc.ts +2 -2
- package/src/client/client_execution_context.ts +17 -9
- package/src/client/db_oracle.ts +2 -2
- package/src/client/execution_note_cache.ts +13 -3
- package/src/client/private_execution.ts +3 -3
- package/src/client/simulator.ts +4 -4
- package/src/client/unconstrained_execution.ts +2 -2
- package/src/client/view_data_oracle.ts +5 -6
- package/src/common/debug_fn_name.ts +7 -13
- package/src/providers/acvm_native.ts +3 -3
- package/src/providers/factory.ts +3 -3
- package/src/public/enqueued_call_side_effect_trace.ts +54 -74
- package/src/public/executor_metrics.ts +0 -4
- package/src/public/fixtures/index.ts +23 -10
- package/src/public/index.ts +0 -1
- package/src/public/public_db_sources.ts +3 -3
- package/src/public/public_processor.ts +46 -47
- package/src/public/public_tx_context.ts +52 -32
- package/src/public/public_tx_simulator.ts +58 -38
- package/src/public/side_effect_trace_interface.ts +8 -15
- package/src/public/transitional_adapters.ts +39 -24
- package/dest/public/dual_side_effect_trace.d.ts +0 -77
- package/dest/public/dual_side_effect_trace.d.ts.map +0 -1
- package/dest/public/dual_side_effect_trace.js +0 -119
- package/dest/public/side_effect_trace.d.ts +0 -96
- package/dest/public/side_effect_trace.d.ts.map +0 -1
- package/dest/public/side_effect_trace.js +0 -309
- package/src/public/dual_side_effect_trace.ts +0 -242
- package/src/public/side_effect_trace.ts +0 -536
|
@@ -1,309 +0,0 @@
|
|
|
1
|
-
import { PublicExecutionRequest, UnencryptedFunctionL2Logs, UnencryptedL2Log } from '@aztec/circuit-types';
|
|
2
|
-
import { AvmAppendTreeHint, AvmContractBytecodeHints, AvmContractInstanceHint, AvmExecutionHints, AvmExternalCallHint, AvmKeyValueHint, AvmNullifierReadTreeHint, AvmNullifierWriteTreeHint, AvmPublicDataReadTreeHint, AvmPublicDataWriteTreeHint, CallContext, ContractStorageRead, ContractStorageUpdateRequest, EthAddress, Gas, L1_TO_L2_MSG_TREE_HEIGHT, L2ToL1Message, LogHash, MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX, MAX_L2_TO_L1_MSGS_PER_TX, MAX_NOTE_HASHES_PER_TX, MAX_NOTE_HASH_READ_REQUESTS_PER_TX, MAX_NULLIFIERS_PER_TX, MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX, MAX_NULLIFIER_READ_REQUESTS_PER_TX, MAX_PUBLIC_DATA_READS_PER_TX, MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX, MAX_UNENCRYPTED_LOGS_PER_TX, NOTE_HASH_TREE_HEIGHT, NULLIFIER_TREE_HEIGHT, NoteHash, Nullifier, NullifierLeafPreimage, PUBLIC_DATA_TREE_HEIGHT, PublicDataTreeLeafPreimage, ReadRequest, SerializableContractInstance, TreeLeafReadRequest, } from '@aztec/circuits.js';
|
|
3
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
4
|
-
import { jsonStringify } from '@aztec/foundation/json-rpc';
|
|
5
|
-
import { createDebugLogger } from '@aztec/foundation/log';
|
|
6
|
-
import { assert } from 'console';
|
|
7
|
-
import { resultToPublicCallRequest, } from './execution.js';
|
|
8
|
-
import { SideEffectLimitReachedError } from './side_effect_errors.js';
|
|
9
|
-
const emptyPublicDataPath = () => new Array(PUBLIC_DATA_TREE_HEIGHT).fill(Fr.zero());
|
|
10
|
-
const emptyNoteHashPath = () => new Array(NOTE_HASH_TREE_HEIGHT).fill(Fr.zero());
|
|
11
|
-
const emptyNullifierPath = () => new Array(NULLIFIER_TREE_HEIGHT).fill(Fr.zero());
|
|
12
|
-
const emptyL1ToL2MessagePath = () => new Array(L1_TO_L2_MSG_TREE_HEIGHT).fill(Fr.zero());
|
|
13
|
-
export class PublicSideEffectTrace {
|
|
14
|
-
constructor(
|
|
15
|
-
/** The counter of this trace's first side effect. */
|
|
16
|
-
startSideEffectCounter = 0) {
|
|
17
|
-
this.startSideEffectCounter = startSideEffectCounter;
|
|
18
|
-
this.log = createDebugLogger('aztec:public_side_effect_trace');
|
|
19
|
-
this.contractStorageReads = [];
|
|
20
|
-
this.contractStorageUpdateRequests = [];
|
|
21
|
-
this.noteHashReadRequests = [];
|
|
22
|
-
this.noteHashes = [];
|
|
23
|
-
this.nullifierReadRequests = [];
|
|
24
|
-
this.nullifierNonExistentReadRequests = [];
|
|
25
|
-
this.nullifiers = [];
|
|
26
|
-
this.l1ToL2MsgReadRequests = [];
|
|
27
|
-
this.newL2ToL1Messages = [];
|
|
28
|
-
this.unencryptedLogs = [];
|
|
29
|
-
this.allUnencryptedLogs = [];
|
|
30
|
-
this.unencryptedLogsHashes = [];
|
|
31
|
-
this.publicCallRequests = [];
|
|
32
|
-
this.nestedExecutions = [];
|
|
33
|
-
this.sideEffectCounter = startSideEffectCounter;
|
|
34
|
-
this.avmCircuitHints = AvmExecutionHints.empty();
|
|
35
|
-
}
|
|
36
|
-
fork() {
|
|
37
|
-
return new PublicSideEffectTrace(this.sideEffectCounter);
|
|
38
|
-
}
|
|
39
|
-
getCounter() {
|
|
40
|
-
return this.sideEffectCounter;
|
|
41
|
-
}
|
|
42
|
-
incrementSideEffectCounter() {
|
|
43
|
-
this.sideEffectCounter++;
|
|
44
|
-
}
|
|
45
|
-
tracePublicStorageRead(contractAddress, slot, value, leafPreimage = PublicDataTreeLeafPreimage.empty(), leafIndex = Fr.zero(), path = emptyPublicDataPath()) {
|
|
46
|
-
if (!leafIndex.equals(Fr.zero())) {
|
|
47
|
-
// if we have real merkle hint content, make sure the value matches the the provided preimage
|
|
48
|
-
assert(leafPreimage.value.equals(value), 'Value mismatch when tracing in public data write');
|
|
49
|
-
}
|
|
50
|
-
if (this.contractStorageReads.length >= MAX_PUBLIC_DATA_READS_PER_TX) {
|
|
51
|
-
throw new SideEffectLimitReachedError('contract storage read', MAX_PUBLIC_DATA_READS_PER_TX);
|
|
52
|
-
}
|
|
53
|
-
this.contractStorageReads.push(new ContractStorageRead(slot, value, this.sideEffectCounter, contractAddress));
|
|
54
|
-
this.avmCircuitHints.storageValues.items.push(new AvmKeyValueHint(/*key=*/ new Fr(this.sideEffectCounter), /*value=*/ value));
|
|
55
|
-
// New hinting
|
|
56
|
-
this.avmCircuitHints.publicDataReads.items.push(new AvmPublicDataReadTreeHint(leafPreimage, leafIndex, path));
|
|
57
|
-
this.log.debug(`SLOAD cnt: ${this.sideEffectCounter} val: ${value} slot: ${slot}`);
|
|
58
|
-
this.incrementSideEffectCounter();
|
|
59
|
-
}
|
|
60
|
-
tracePublicStorageWrite(contractAddress, slot, value, lowLeafPreimage = PublicDataTreeLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyPublicDataPath(), newLeafPreimage = PublicDataTreeLeafPreimage.empty(), insertionPath = emptyPublicDataPath()) {
|
|
61
|
-
if (!lowLeafIndex.equals(Fr.zero())) {
|
|
62
|
-
// if we have real merkle hint content, make sure the value matches the the provided preimage
|
|
63
|
-
assert(newLeafPreimage.value.equals(value), 'Value mismatch when tracing in public data read');
|
|
64
|
-
}
|
|
65
|
-
if (this.contractStorageUpdateRequests.length >= MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX) {
|
|
66
|
-
throw new SideEffectLimitReachedError('contract storage write', MAX_PUBLIC_DATA_UPDATE_REQUESTS_PER_TX);
|
|
67
|
-
}
|
|
68
|
-
this.contractStorageUpdateRequests.push(new ContractStorageUpdateRequest(slot, value, this.sideEffectCounter, contractAddress));
|
|
69
|
-
// New hinting
|
|
70
|
-
const readHint = new AvmPublicDataReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
71
|
-
this.avmCircuitHints.publicDataWrites.items.push(new AvmPublicDataWriteTreeHint(readHint, newLeafPreimage, insertionPath));
|
|
72
|
-
this.log.debug(`SSTORE cnt: ${this.sideEffectCounter} val: ${value} slot: ${slot}`);
|
|
73
|
-
this.incrementSideEffectCounter();
|
|
74
|
-
}
|
|
75
|
-
// TODO(8287): _exists can be removed once we have the vm properly handling the equality check
|
|
76
|
-
traceNoteHashCheck(_contractAddress, noteHash, leafIndex, exists, path = emptyNoteHashPath()) {
|
|
77
|
-
// NOTE: contractAddress is unused but will be important when an AVM circuit processes an entire enqueued call
|
|
78
|
-
if (this.noteHashReadRequests.length >= MAX_NOTE_HASH_READ_REQUESTS_PER_TX) {
|
|
79
|
-
throw new SideEffectLimitReachedError('note hash read request', MAX_NOTE_HASH_READ_REQUESTS_PER_TX);
|
|
80
|
-
}
|
|
81
|
-
// Temp for backward compatibility
|
|
82
|
-
this.noteHashReadRequests.push(new TreeLeafReadRequest(noteHash, leafIndex));
|
|
83
|
-
this.avmCircuitHints.noteHashExists.items.push(new AvmKeyValueHint(/*key=*/ new Fr(leafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO));
|
|
84
|
-
// New Hinting
|
|
85
|
-
this.avmCircuitHints.noteHashReads.items.push(new AvmAppendTreeHint(leafIndex, noteHash, path));
|
|
86
|
-
// NOTE: counter does not increment for note hash checks (because it doesn't rely on pending note hashes)
|
|
87
|
-
}
|
|
88
|
-
traceNewNoteHash(_contractAddress, noteHash, leafIndex = Fr.zero(), path = emptyNoteHashPath()) {
|
|
89
|
-
if (this.noteHashes.length >= MAX_NOTE_HASHES_PER_TX) {
|
|
90
|
-
throw new SideEffectLimitReachedError('note hash', MAX_NOTE_HASHES_PER_TX);
|
|
91
|
-
}
|
|
92
|
-
this.noteHashes.push(new NoteHash(noteHash, this.sideEffectCounter));
|
|
93
|
-
this.log.debug(`NEW_NOTE_HASH cnt: ${this.sideEffectCounter}`);
|
|
94
|
-
// New Hinting
|
|
95
|
-
this.avmCircuitHints.noteHashWrites.items.push(new AvmAppendTreeHint(leafIndex, noteHash, path));
|
|
96
|
-
this.incrementSideEffectCounter();
|
|
97
|
-
}
|
|
98
|
-
traceNullifierCheck(siloedNullifier, exists, lowLeafPreimage = NullifierLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyNullifierPath()) {
|
|
99
|
-
// NOTE: contractAddress is unused but will be important when an AVM circuit processes an entire enqueued call
|
|
100
|
-
// NOTE: isPending and leafIndex are unused for now but may be used for optimizations or kernel hints later
|
|
101
|
-
this.enforceLimitOnNullifierChecks();
|
|
102
|
-
const readRequest = new ReadRequest(siloedNullifier, this.sideEffectCounter);
|
|
103
|
-
if (exists) {
|
|
104
|
-
this.nullifierReadRequests.push(readRequest);
|
|
105
|
-
}
|
|
106
|
-
else {
|
|
107
|
-
this.nullifierNonExistentReadRequests.push(readRequest);
|
|
108
|
-
}
|
|
109
|
-
this.avmCircuitHints.nullifierExists.items.push(new AvmKeyValueHint(/*key=*/ new Fr(this.sideEffectCounter), /*value=*/ new Fr(exists ? 1 : 0)));
|
|
110
|
-
// New Hints
|
|
111
|
-
this.avmCircuitHints.nullifierReads.items.push(new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath));
|
|
112
|
-
this.log.debug(`NULLIFIER_EXISTS cnt: ${this.sideEffectCounter}`);
|
|
113
|
-
this.incrementSideEffectCounter();
|
|
114
|
-
}
|
|
115
|
-
traceNewNullifier(siloedNullifier, lowLeafPreimage = NullifierLeafPreimage.empty(), lowLeafIndex = Fr.zero(), lowLeafPath = emptyNullifierPath(), insertionPath = emptyNullifierPath()) {
|
|
116
|
-
// NOTE: contractAddress is unused but will be important when an AVM circuit processes an entire enqueued call
|
|
117
|
-
if (this.nullifiers.length >= MAX_NULLIFIERS_PER_TX) {
|
|
118
|
-
throw new SideEffectLimitReachedError('nullifier', MAX_NULLIFIERS_PER_TX);
|
|
119
|
-
}
|
|
120
|
-
// this will be wrong for siloedNullifier
|
|
121
|
-
this.nullifiers.push(new Nullifier(siloedNullifier, this.sideEffectCounter, /*noteHash=*/ Fr.ZERO));
|
|
122
|
-
// New hinting
|
|
123
|
-
const lowLeafReadHint = new AvmNullifierReadTreeHint(lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
124
|
-
this.avmCircuitHints.nullifierWrites.items.push(new AvmNullifierWriteTreeHint(lowLeafReadHint, insertionPath));
|
|
125
|
-
this.log.debug(`NEW_NULLIFIER cnt: ${this.sideEffectCounter}`);
|
|
126
|
-
this.incrementSideEffectCounter();
|
|
127
|
-
}
|
|
128
|
-
// TODO(8287): _exists can be removed once we have the vm properly handling the equality check
|
|
129
|
-
traceL1ToL2MessageCheck(_contractAddress, msgHash, msgLeafIndex, exists, path = emptyL1ToL2MessagePath()) {
|
|
130
|
-
// NOTE: contractAddress is unused but will be important when an AVM circuit processes an entire enqueued call
|
|
131
|
-
if (this.l1ToL2MsgReadRequests.length >= MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX) {
|
|
132
|
-
throw new SideEffectLimitReachedError('l1 to l2 message read request', MAX_L1_TO_L2_MSG_READ_REQUESTS_PER_TX);
|
|
133
|
-
}
|
|
134
|
-
this.l1ToL2MsgReadRequests.push(new TreeLeafReadRequest(msgHash, msgLeafIndex));
|
|
135
|
-
this.avmCircuitHints.l1ToL2MessageExists.items.push(new AvmKeyValueHint(/*key=*/ new Fr(msgLeafIndex), /*value=*/ exists ? Fr.ONE : Fr.ZERO));
|
|
136
|
-
// New Hinting
|
|
137
|
-
this.avmCircuitHints.l1ToL2MessageReads.items.push(new AvmAppendTreeHint(msgLeafIndex, msgHash, path));
|
|
138
|
-
// NOTE: counter does not increment for l1tol2 message checks (because it doesn't rely on pending messages)
|
|
139
|
-
}
|
|
140
|
-
traceNewL2ToL1Message(_contractAddress, recipient, content) {
|
|
141
|
-
if (this.newL2ToL1Messages.length >= MAX_L2_TO_L1_MSGS_PER_TX) {
|
|
142
|
-
throw new SideEffectLimitReachedError('l2 to l1 message', MAX_L2_TO_L1_MSGS_PER_TX);
|
|
143
|
-
}
|
|
144
|
-
const recipientAddress = EthAddress.fromField(recipient);
|
|
145
|
-
this.newL2ToL1Messages.push(new L2ToL1Message(recipientAddress, content, this.sideEffectCounter));
|
|
146
|
-
this.log.debug(`NEW_L2_TO_L1_MSG cnt: ${this.sideEffectCounter}`);
|
|
147
|
-
this.incrementSideEffectCounter();
|
|
148
|
-
}
|
|
149
|
-
traceUnencryptedLog(contractAddress, log) {
|
|
150
|
-
if (this.unencryptedLogs.length >= MAX_UNENCRYPTED_LOGS_PER_TX) {
|
|
151
|
-
throw new SideEffectLimitReachedError('unencrypted log', MAX_UNENCRYPTED_LOGS_PER_TX);
|
|
152
|
-
}
|
|
153
|
-
const ulog = new UnencryptedL2Log(contractAddress, Buffer.concat(log.map(f => f.toBuffer())));
|
|
154
|
-
const basicLogHash = Fr.fromBuffer(ulog.hash());
|
|
155
|
-
this.unencryptedLogs.push(ulog);
|
|
156
|
-
this.allUnencryptedLogs.push(ulog);
|
|
157
|
-
// This length is for charging DA and is checked on-chain - has to be length of log preimage + 4 bytes.
|
|
158
|
-
// The .length call also has a +4 but that is unrelated
|
|
159
|
-
this.unencryptedLogsHashes.push(new LogHash(basicLogHash, this.sideEffectCounter, new Fr(ulog.length + 4)));
|
|
160
|
-
this.log.debug(`NEW_UNENCRYPTED_LOG cnt: ${this.sideEffectCounter}`);
|
|
161
|
-
this.incrementSideEffectCounter();
|
|
162
|
-
}
|
|
163
|
-
traceGetContractInstance(contractAddress, exists, instance = SerializableContractInstance.default()) {
|
|
164
|
-
this.enforceLimitOnNullifierChecks('(contract address nullifier from GETCONTRACTINSTANCE)');
|
|
165
|
-
this.avmCircuitHints.contractInstances.items.push(new AvmContractInstanceHint(contractAddress, exists, instance.salt, instance.deployer, instance.contractClassId, instance.initializationHash, instance.publicKeys));
|
|
166
|
-
this.log.debug(`CONTRACT_INSTANCE cnt: ${this.sideEffectCounter}`);
|
|
167
|
-
this.incrementSideEffectCounter();
|
|
168
|
-
}
|
|
169
|
-
// This tracing function gets called everytime we start simulation/execution.
|
|
170
|
-
// This happens both when starting a new top-level trace and the start of every nested trace
|
|
171
|
-
// We use this to collect the AvmContractBytecodeHints
|
|
172
|
-
// We need to trace teh merkle tree as well here
|
|
173
|
-
traceGetBytecode(contractAddress, exists, bytecode = Buffer.alloc(0), contractInstance = SerializableContractInstance.default(), contractClass = {
|
|
174
|
-
artifactHash: Fr.zero(),
|
|
175
|
-
privateFunctionsRoot: Fr.zero(),
|
|
176
|
-
publicBytecodeCommitment: Fr.zero(),
|
|
177
|
-
}) {
|
|
178
|
-
const instance = new AvmContractInstanceHint(contractAddress, exists, contractInstance.salt, contractInstance.deployer, contractInstance.contractClassId, contractInstance.initializationHash, contractInstance.publicKeys);
|
|
179
|
-
// We need to deduplicate the contract instances based on addresses
|
|
180
|
-
this.avmCircuitHints.contractBytecodeHints.items.push(new AvmContractBytecodeHints(bytecode, instance, contractClass));
|
|
181
|
-
this.log.debug(`Bytecode retrieval for contract execution traced: exists=${exists}, instance=${jsonStringify(contractInstance)}`);
|
|
182
|
-
}
|
|
183
|
-
/**
|
|
184
|
-
* Trace a nested call.
|
|
185
|
-
* Accept some results from a finished nested call's trace into this one.
|
|
186
|
-
*/
|
|
187
|
-
traceNestedCall(
|
|
188
|
-
/** The trace of the nested call. */
|
|
189
|
-
nestedCallTrace,
|
|
190
|
-
/** The execution environment of the nested call. */
|
|
191
|
-
nestedEnvironment,
|
|
192
|
-
/** How much gas was available for this public execution. */
|
|
193
|
-
startGasLeft,
|
|
194
|
-
/** Bytecode used for this execution. */
|
|
195
|
-
bytecode,
|
|
196
|
-
/** The call's results */
|
|
197
|
-
avmCallResults,
|
|
198
|
-
/** Function name for logging */
|
|
199
|
-
functionName = 'unknown') {
|
|
200
|
-
// TODO(4805): check if some threshold is reached for max nested calls (to unique contracts?)
|
|
201
|
-
// TODO(dbanks12): should emit a nullifier read request. There should be two thresholds.
|
|
202
|
-
// one for max unique contract calls, and another based on max nullifier reads.
|
|
203
|
-
// Since this trace function happens _after_ a nested call, such threshold limits must take
|
|
204
|
-
// place in another trace function that occurs _before_ a nested call.
|
|
205
|
-
const result = nestedCallTrace.toPublicFunctionCallResult(nestedEnvironment, startGasLeft, bytecode, avmCallResults.finalize(), functionName);
|
|
206
|
-
this.sideEffectCounter = result.endSideEffectCounter.toNumber();
|
|
207
|
-
// when a nested call returns, caller accepts its updated counter
|
|
208
|
-
this.allUnencryptedLogs.push(...result.allUnencryptedLogs.logs);
|
|
209
|
-
// NOTE: eventually if the AVM circuit processes an entire enqueued call,
|
|
210
|
-
// this function will accept all of the nested's side effects into this instance
|
|
211
|
-
this.nestedExecutions.push(result);
|
|
212
|
-
const gasUsed = new Gas(result.startGasLeft.daGas - avmCallResults.gasLeft.daGas, result.startGasLeft.l2Gas - avmCallResults.gasLeft.l2Gas);
|
|
213
|
-
this.publicCallRequests.push(resultToPublicCallRequest(result));
|
|
214
|
-
this.avmCircuitHints.externalCalls.items.push(new AvmExternalCallHint(
|
|
215
|
-
/*success=*/ new Fr(result.reverted ? 0 : 1), result.returnValues, gasUsed, result.endSideEffectCounter, nestedEnvironment.address));
|
|
216
|
-
}
|
|
217
|
-
traceEnqueuedCall(
|
|
218
|
-
/** The call request from private that enqueued this call. */
|
|
219
|
-
_publicCallRequest,
|
|
220
|
-
/** The call's calldata */
|
|
221
|
-
_calldata,
|
|
222
|
-
/** Did the call revert? */
|
|
223
|
-
_reverted) {
|
|
224
|
-
throw new Error('Not implemented');
|
|
225
|
-
}
|
|
226
|
-
merge(_nestedTrace, _reverted = false) {
|
|
227
|
-
throw new Error('Not implemented');
|
|
228
|
-
}
|
|
229
|
-
/**
|
|
230
|
-
* Convert this trace to a PublicExecutionResult for use externally to the simulator.
|
|
231
|
-
*/
|
|
232
|
-
toPublicFunctionCallResult(
|
|
233
|
-
/** The execution environment of the nested call. */
|
|
234
|
-
avmEnvironment,
|
|
235
|
-
/** How much gas was available for this public execution. */
|
|
236
|
-
startGasLeft,
|
|
237
|
-
/** Bytecode used for this execution. */
|
|
238
|
-
bytecode,
|
|
239
|
-
/** The call's results */
|
|
240
|
-
avmCallResults,
|
|
241
|
-
/** Function name for logging */
|
|
242
|
-
functionName = 'unknown') {
|
|
243
|
-
return {
|
|
244
|
-
executionRequest: createPublicExecutionRequest(avmEnvironment),
|
|
245
|
-
startSideEffectCounter: new Fr(this.startSideEffectCounter),
|
|
246
|
-
endSideEffectCounter: new Fr(this.sideEffectCounter),
|
|
247
|
-
startGasLeft,
|
|
248
|
-
endGasLeft: avmCallResults.gasLeft,
|
|
249
|
-
transactionFee: avmEnvironment.transactionFee,
|
|
250
|
-
bytecode,
|
|
251
|
-
calldata: avmEnvironment.calldata,
|
|
252
|
-
returnValues: avmCallResults.output,
|
|
253
|
-
reverted: avmCallResults.reverted,
|
|
254
|
-
revertReason: avmCallResults.revertReason,
|
|
255
|
-
contractStorageReads: this.contractStorageReads,
|
|
256
|
-
contractStorageUpdateRequests: this.contractStorageUpdateRequests,
|
|
257
|
-
noteHashReadRequests: this.noteHashReadRequests,
|
|
258
|
-
noteHashes: this.noteHashes,
|
|
259
|
-
nullifierReadRequests: this.nullifierReadRequests,
|
|
260
|
-
nullifierNonExistentReadRequests: this.nullifierNonExistentReadRequests,
|
|
261
|
-
nullifiers: this.nullifiers,
|
|
262
|
-
l1ToL2MsgReadRequests: this.l1ToL2MsgReadRequests,
|
|
263
|
-
l2ToL1Messages: this.newL2ToL1Messages,
|
|
264
|
-
// correct the type on these now that they are finalized (lists won't grow)
|
|
265
|
-
unencryptedLogs: new UnencryptedFunctionL2Logs(this.unencryptedLogs),
|
|
266
|
-
allUnencryptedLogs: new UnencryptedFunctionL2Logs(this.allUnencryptedLogs),
|
|
267
|
-
unencryptedLogsHashes: this.unencryptedLogsHashes,
|
|
268
|
-
publicCallRequests: this.publicCallRequests,
|
|
269
|
-
nestedExecutions: this.nestedExecutions,
|
|
270
|
-
avmCircuitHints: this.avmCircuitHints,
|
|
271
|
-
functionName,
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
toPublicEnqueuedCallExecutionResult(
|
|
275
|
-
/** The call's results */
|
|
276
|
-
_avmCallResults) {
|
|
277
|
-
throw new Error('Not implemented');
|
|
278
|
-
}
|
|
279
|
-
enforceLimitOnNullifierChecks(errorMsgOrigin = '') {
|
|
280
|
-
// NOTE: Why error if _either_ limit was reached? If user code emits either an existent or non-existent
|
|
281
|
-
// nullifier read request (NULLIFIEREXISTS, GETCONTRACTINSTANCE, *CALL), and one of the limits has been
|
|
282
|
-
// reached (MAX_NULLIFIER_NON_EXISTENT_RRS vs MAX_NULLIFIER_RRS), but not the other, we must prevent the
|
|
283
|
-
// sequencer from lying and saying "this nullifier exists, but MAX_NULLIFIER_RRS has been reached, so I'm
|
|
284
|
-
// going to skip the read request and just revert instead" when the nullifier actually doesn't exist
|
|
285
|
-
// (or vice versa). So, if either maximum has been reached, any nullifier-reading operation must error.
|
|
286
|
-
if (this.nullifierReadRequests.length >= MAX_NULLIFIER_READ_REQUESTS_PER_TX) {
|
|
287
|
-
throw new SideEffectLimitReachedError(`nullifier read request ${errorMsgOrigin}`, MAX_NULLIFIER_READ_REQUESTS_PER_TX);
|
|
288
|
-
}
|
|
289
|
-
if (this.nullifierNonExistentReadRequests.length >= MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX) {
|
|
290
|
-
throw new SideEffectLimitReachedError(`nullifier non-existent read request ${errorMsgOrigin}`, MAX_NULLIFIER_NON_EXISTENT_READ_REQUESTS_PER_TX);
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
getUnencryptedLogs() {
|
|
294
|
-
throw new Error('Not implemented');
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
/**
|
|
298
|
-
* Helper function to create a public execution request from an AVM execution environment
|
|
299
|
-
*/
|
|
300
|
-
function createPublicExecutionRequest(avmEnvironment) {
|
|
301
|
-
const callContext = CallContext.from({
|
|
302
|
-
msgSender: avmEnvironment.sender,
|
|
303
|
-
contractAddress: avmEnvironment.address,
|
|
304
|
-
functionSelector: avmEnvironment.functionSelector,
|
|
305
|
-
isStaticCall: avmEnvironment.isStaticCall,
|
|
306
|
-
});
|
|
307
|
-
return new PublicExecutionRequest(callContext, avmEnvironment.calldata);
|
|
308
|
-
}
|
|
309
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZV9lZmZlY3RfdHJhY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHVibGljL3NpZGVfZWZmZWN0X3RyYWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSx5QkFBeUIsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzNHLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsd0JBQXdCLEVBQ3hCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsbUJBQW1CLEVBQ25CLGVBQWUsRUFDZix3QkFBd0IsRUFDeEIseUJBQXlCLEVBQ3pCLHlCQUF5QixFQUN6QiwwQkFBMEIsRUFFMUIsV0FBVyxFQUdYLG1CQUFtQixFQUNuQiw0QkFBNEIsRUFDNUIsVUFBVSxFQUNWLEdBQUcsRUFDSCx3QkFBd0IsRUFDeEIsYUFBYSxFQUNiLE9BQU8sRUFDUCxxQ0FBcUMsRUFDckMsd0JBQXdCLEVBQ3hCLHNCQUFzQixFQUN0QixrQ0FBa0MsRUFDbEMscUJBQXFCLEVBQ3JCLCtDQUErQyxFQUMvQyxrQ0FBa0MsRUFDbEMsNEJBQTRCLEVBQzVCLHNDQUFzQyxFQUN0QywyQkFBMkIsRUFDM0IscUJBQXFCLEVBQ3JCLHFCQUFxQixFQUNyQixRQUFRLEVBQ1IsU0FBUyxFQUNULHFCQUFxQixFQUNyQix1QkFBdUIsRUFFdkIsMEJBQTBCLEVBRTFCLFdBQVcsRUFDWCw0QkFBNEIsRUFDNUIsbUJBQW1CLEdBQ3BCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUMzRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUUxRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBSWpDLE9BQU8sRUFHTCx5QkFBeUIsR0FD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
|
|
@@ -1,242 +0,0 @@
|
|
|
1
|
-
import { type UnencryptedL2Log } from '@aztec/circuit-types';
|
|
2
|
-
import {
|
|
3
|
-
type ContractClassIdPreimage,
|
|
4
|
-
type Gas,
|
|
5
|
-
type NullifierLeafPreimage,
|
|
6
|
-
type PublicCallRequest,
|
|
7
|
-
type PublicDataTreeLeafPreimage,
|
|
8
|
-
type SerializableContractInstance,
|
|
9
|
-
} from '@aztec/circuits.js';
|
|
10
|
-
import { type AztecAddress } from '@aztec/foundation/aztec-address';
|
|
11
|
-
import { type Fr } from '@aztec/foundation/fields';
|
|
12
|
-
|
|
13
|
-
import { assert } from 'console';
|
|
14
|
-
|
|
15
|
-
import { type AvmContractCallResult, type AvmFinalizedCallResult } from '../avm/avm_contract_call_result.js';
|
|
16
|
-
import { type AvmExecutionEnvironment } from '../avm/avm_execution_environment.js';
|
|
17
|
-
import { type PublicEnqueuedCallSideEffectTrace } from './enqueued_call_side_effect_trace.js';
|
|
18
|
-
import { type EnqueuedPublicCallExecutionResultWithSideEffects, type PublicFunctionCallResult } from './execution.js';
|
|
19
|
-
import { type PublicSideEffectTrace } from './side_effect_trace.js';
|
|
20
|
-
import { type PublicSideEffectTraceInterface } from './side_effect_trace_interface.js';
|
|
21
|
-
|
|
22
|
-
export class DualSideEffectTrace implements PublicSideEffectTraceInterface {
|
|
23
|
-
constructor(
|
|
24
|
-
public readonly innerCallTrace: PublicSideEffectTrace,
|
|
25
|
-
public readonly enqueuedCallTrace: PublicEnqueuedCallSideEffectTrace,
|
|
26
|
-
) {}
|
|
27
|
-
|
|
28
|
-
public fork() {
|
|
29
|
-
return new DualSideEffectTrace(this.innerCallTrace.fork(), this.enqueuedCallTrace.fork());
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
public merge(nestedTrace: this, reverted: boolean = false) {
|
|
33
|
-
this.enqueuedCallTrace.merge(nestedTrace.enqueuedCallTrace, reverted);
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
public getCounter() {
|
|
37
|
-
assert(this.innerCallTrace.getCounter() == this.enqueuedCallTrace.getCounter());
|
|
38
|
-
return this.innerCallTrace.getCounter();
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
public tracePublicStorageRead(
|
|
42
|
-
contractAddress: AztecAddress,
|
|
43
|
-
slot: Fr,
|
|
44
|
-
value: Fr,
|
|
45
|
-
leafPreimage: PublicDataTreeLeafPreimage,
|
|
46
|
-
leafIndex: Fr,
|
|
47
|
-
path: Fr[],
|
|
48
|
-
) {
|
|
49
|
-
this.innerCallTrace.tracePublicStorageRead(contractAddress, slot, value, leafPreimage, leafIndex, path);
|
|
50
|
-
this.enqueuedCallTrace.tracePublicStorageRead(contractAddress, slot, value, leafPreimage, leafIndex, path);
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
public tracePublicStorageWrite(
|
|
54
|
-
contractAddress: AztecAddress,
|
|
55
|
-
slot: Fr,
|
|
56
|
-
value: Fr,
|
|
57
|
-
lowLeafPreimage: PublicDataTreeLeafPreimage,
|
|
58
|
-
lowLeafIndex: Fr,
|
|
59
|
-
lowLeafPath: Fr[],
|
|
60
|
-
newLeafPreimage: PublicDataTreeLeafPreimage,
|
|
61
|
-
insertionPath: Fr[],
|
|
62
|
-
) {
|
|
63
|
-
this.innerCallTrace.tracePublicStorageWrite(
|
|
64
|
-
contractAddress,
|
|
65
|
-
slot,
|
|
66
|
-
value,
|
|
67
|
-
lowLeafPreimage,
|
|
68
|
-
lowLeafIndex,
|
|
69
|
-
lowLeafPath,
|
|
70
|
-
newLeafPreimage,
|
|
71
|
-
insertionPath,
|
|
72
|
-
);
|
|
73
|
-
this.enqueuedCallTrace.tracePublicStorageWrite(
|
|
74
|
-
contractAddress,
|
|
75
|
-
slot,
|
|
76
|
-
value,
|
|
77
|
-
lowLeafPreimage,
|
|
78
|
-
lowLeafIndex,
|
|
79
|
-
lowLeafPath,
|
|
80
|
-
newLeafPreimage,
|
|
81
|
-
insertionPath,
|
|
82
|
-
);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
// TODO(8287): _exists can be removed once we have the vm properly handling the equality check
|
|
86
|
-
public traceNoteHashCheck(contractAddress: AztecAddress, noteHash: Fr, leafIndex: Fr, exists: boolean, path: Fr[]) {
|
|
87
|
-
this.innerCallTrace.traceNoteHashCheck(contractAddress, noteHash, leafIndex, exists, path);
|
|
88
|
-
this.enqueuedCallTrace.traceNoteHashCheck(contractAddress, noteHash, leafIndex, exists, path);
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
public traceNewNoteHash(contractAddress: AztecAddress, noteHash: Fr, leafIndex: Fr, path: Fr[]) {
|
|
92
|
-
this.innerCallTrace.traceNewNoteHash(contractAddress, noteHash, leafIndex, path);
|
|
93
|
-
this.enqueuedCallTrace.traceNewNoteHash(contractAddress, noteHash, leafIndex, path);
|
|
94
|
-
}
|
|
95
|
-
|
|
96
|
-
public traceNullifierCheck(
|
|
97
|
-
siloedNullifier: Fr,
|
|
98
|
-
exists: boolean,
|
|
99
|
-
lowLeafPreimage: NullifierLeafPreimage,
|
|
100
|
-
lowLeafIndex: Fr,
|
|
101
|
-
lowLeafPath: Fr[],
|
|
102
|
-
) {
|
|
103
|
-
this.innerCallTrace.traceNullifierCheck(siloedNullifier, exists, lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
104
|
-
this.enqueuedCallTrace.traceNullifierCheck(siloedNullifier, exists, lowLeafPreimage, lowLeafIndex, lowLeafPath);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
public traceNewNullifier(
|
|
108
|
-
siloedNullifier: Fr,
|
|
109
|
-
lowLeafPreimage: NullifierLeafPreimage,
|
|
110
|
-
lowLeafIndex: Fr,
|
|
111
|
-
lowLeafPath: Fr[],
|
|
112
|
-
insertionPath: Fr[],
|
|
113
|
-
) {
|
|
114
|
-
this.innerCallTrace.traceNewNullifier(siloedNullifier, lowLeafPreimage, lowLeafIndex, lowLeafPath, insertionPath);
|
|
115
|
-
this.enqueuedCallTrace.traceNewNullifier(
|
|
116
|
-
siloedNullifier,
|
|
117
|
-
lowLeafPreimage,
|
|
118
|
-
lowLeafIndex,
|
|
119
|
-
lowLeafPath,
|
|
120
|
-
insertionPath,
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
traceL1ToL2MessageCheck(contractAddress: AztecAddress, msgHash: Fr, msgLeafIndex: Fr, exists: boolean, path: Fr[]) {
|
|
125
|
-
this.innerCallTrace.traceL1ToL2MessageCheck(contractAddress, msgHash, msgLeafIndex, exists, path);
|
|
126
|
-
this.enqueuedCallTrace.traceL1ToL2MessageCheck(contractAddress, msgHash, msgLeafIndex, exists, path);
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
public traceNewL2ToL1Message(contractAddress: AztecAddress, recipient: Fr, content: Fr) {
|
|
130
|
-
this.innerCallTrace.traceNewL2ToL1Message(contractAddress, recipient, content);
|
|
131
|
-
this.enqueuedCallTrace.traceNewL2ToL1Message(contractAddress, recipient, content);
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
public traceUnencryptedLog(contractAddress: AztecAddress, log: Fr[]) {
|
|
135
|
-
this.innerCallTrace.traceUnencryptedLog(contractAddress, log);
|
|
136
|
-
this.enqueuedCallTrace.traceUnencryptedLog(contractAddress, log);
|
|
137
|
-
}
|
|
138
|
-
|
|
139
|
-
public traceGetContractInstance(
|
|
140
|
-
contractAddress: AztecAddress,
|
|
141
|
-
exists: boolean,
|
|
142
|
-
instance: SerializableContractInstance | undefined,
|
|
143
|
-
) {
|
|
144
|
-
this.innerCallTrace.traceGetContractInstance(contractAddress, exists, instance);
|
|
145
|
-
this.enqueuedCallTrace.traceGetContractInstance(contractAddress, exists, instance);
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
public traceGetBytecode(
|
|
149
|
-
contractAddress: AztecAddress,
|
|
150
|
-
exists: boolean,
|
|
151
|
-
bytecode: Buffer,
|
|
152
|
-
contractInstance: SerializableContractInstance | undefined,
|
|
153
|
-
contractClass: ContractClassIdPreimage | undefined,
|
|
154
|
-
) {
|
|
155
|
-
this.innerCallTrace.traceGetBytecode(contractAddress, exists, bytecode, contractInstance, contractClass);
|
|
156
|
-
this.enqueuedCallTrace.traceGetBytecode(contractAddress, exists, bytecode, contractInstance, contractClass);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
/**
|
|
160
|
-
* Trace a nested call.
|
|
161
|
-
* Accept some results from a finished nested call's trace into this one.
|
|
162
|
-
*/
|
|
163
|
-
public traceNestedCall(
|
|
164
|
-
/** The trace of the nested call. */
|
|
165
|
-
nestedCallTrace: this,
|
|
166
|
-
/** The execution environment of the nested call. */
|
|
167
|
-
nestedEnvironment: AvmExecutionEnvironment,
|
|
168
|
-
/** How much gas was available for this public execution. */
|
|
169
|
-
startGasLeft: Gas,
|
|
170
|
-
/** Bytecode used for this execution. */
|
|
171
|
-
bytecode: Buffer,
|
|
172
|
-
/** The call's results */
|
|
173
|
-
avmCallResults: AvmContractCallResult,
|
|
174
|
-
/** Function name for logging */
|
|
175
|
-
functionName: string = 'unknown',
|
|
176
|
-
) {
|
|
177
|
-
this.innerCallTrace.traceNestedCall(
|
|
178
|
-
nestedCallTrace.innerCallTrace,
|
|
179
|
-
nestedEnvironment,
|
|
180
|
-
startGasLeft,
|
|
181
|
-
bytecode,
|
|
182
|
-
avmCallResults,
|
|
183
|
-
functionName,
|
|
184
|
-
);
|
|
185
|
-
this.enqueuedCallTrace.traceNestedCall(
|
|
186
|
-
nestedCallTrace.enqueuedCallTrace,
|
|
187
|
-
nestedEnvironment,
|
|
188
|
-
startGasLeft,
|
|
189
|
-
bytecode,
|
|
190
|
-
avmCallResults,
|
|
191
|
-
functionName,
|
|
192
|
-
);
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
public traceEnqueuedCall(
|
|
196
|
-
/** The call request from private that enqueued this call. */
|
|
197
|
-
publicCallRequest: PublicCallRequest,
|
|
198
|
-
/** The call's calldata */
|
|
199
|
-
calldata: Fr[],
|
|
200
|
-
/** Did the call revert? */
|
|
201
|
-
reverted: boolean,
|
|
202
|
-
) {
|
|
203
|
-
this.enqueuedCallTrace.traceEnqueuedCall(publicCallRequest, calldata, reverted);
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Convert this trace to a PublicExecutionResult for use externally to the simulator.
|
|
208
|
-
*/
|
|
209
|
-
public toPublicEnqueuedCallExecutionResult(
|
|
210
|
-
/** The call's results */
|
|
211
|
-
avmCallResults: AvmFinalizedCallResult,
|
|
212
|
-
): EnqueuedPublicCallExecutionResultWithSideEffects {
|
|
213
|
-
return this.enqueuedCallTrace.toPublicEnqueuedCallExecutionResult(avmCallResults);
|
|
214
|
-
}
|
|
215
|
-
/**
|
|
216
|
-
* Convert this trace to a PublicExecutionResult for use externally to the simulator.
|
|
217
|
-
*/
|
|
218
|
-
public toPublicFunctionCallResult(
|
|
219
|
-
/** The execution environment of the nested call. */
|
|
220
|
-
avmEnvironment: AvmExecutionEnvironment,
|
|
221
|
-
/** How much gas was available for this public execution. */
|
|
222
|
-
startGasLeft: Gas,
|
|
223
|
-
/** Bytecode used for this execution. */
|
|
224
|
-
bytecode: Buffer,
|
|
225
|
-
/** The call's results */
|
|
226
|
-
avmCallResults: AvmFinalizedCallResult,
|
|
227
|
-
/** Function name for logging */
|
|
228
|
-
functionName: string = 'unknown',
|
|
229
|
-
): PublicFunctionCallResult {
|
|
230
|
-
return this.innerCallTrace.toPublicFunctionCallResult(
|
|
231
|
-
avmEnvironment,
|
|
232
|
-
startGasLeft,
|
|
233
|
-
bytecode,
|
|
234
|
-
avmCallResults,
|
|
235
|
-
functionName,
|
|
236
|
-
);
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
public getUnencryptedLogs(): UnencryptedL2Log[] {
|
|
240
|
-
return this.enqueuedCallTrace.getUnencryptedLogs();
|
|
241
|
-
}
|
|
242
|
-
}
|