@aztec/simulator 0.47.0 → 0.48.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.d.ts +1 -1
- package/dest/acvm/acvm.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.d.ts +5 -5
- package/dest/acvm/oracle/oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/oracle.js +13 -16
- package/dest/acvm/oracle/typed_oracle.d.ts +12 -9
- package/dest/acvm/oracle/typed_oracle.d.ts.map +1 -1
- package/dest/acvm/oracle/typed_oracle.js +6 -6
- package/dest/acvm/serialize.d.ts +0 -11
- package/dest/acvm/serialize.d.ts.map +1 -1
- package/dest/acvm/serialize.js +1 -26
- package/dest/avm/avm_gas.d.ts.map +1 -1
- package/dest/avm/avm_gas.js +2 -1
- package/dest/avm/fixtures/index.d.ts.map +1 -1
- package/dest/avm/fixtures/index.js +2 -2
- package/dest/avm/opcodes/commitment.d.ts +16 -0
- package/dest/avm/opcodes/commitment.d.ts.map +1 -0
- package/dest/avm/opcodes/commitment.js +50 -0
- package/dest/avm/serialization/bytecode_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/bytecode_serialization.js +3 -1
- package/dest/avm/serialization/instruction_serialization.d.ts +4 -3
- package/dest/avm/serialization/instruction_serialization.d.ts.map +1 -1
- package/dest/avm/serialization/instruction_serialization.js +6 -5
- package/dest/client/client_execution_context.d.ts +20 -17
- package/dest/client/client_execution_context.d.ts.map +1 -1
- package/dest/client/client_execution_context.js +42 -45
- package/dest/client/db_oracle.d.ts +4 -3
- package/dest/client/db_oracle.d.ts.map +1 -1
- package/dest/client/execution_note_cache.d.ts +17 -13
- package/dest/client/execution_note_cache.d.ts.map +1 -1
- package/dest/client/execution_note_cache.js +65 -26
- package/dest/client/execution_result.d.ts +15 -8
- package/dest/client/execution_result.d.ts.map +1 -1
- package/dest/client/execution_result.js +40 -16
- package/dest/client/private_execution.js +3 -3
- package/dest/client/simulator.d.ts +7 -6
- package/dest/client/simulator.d.ts.map +1 -1
- package/dest/client/simulator.js +14 -12
- package/dest/client/test_utils.d.ts +9 -0
- package/dest/client/test_utils.d.ts.map +1 -0
- package/dest/client/test_utils.js +21 -0
- package/dest/client/view_data_oracle.d.ts +2 -1
- package/dest/client/view_data_oracle.d.ts.map +1 -1
- package/dest/client/view_data_oracle.js +4 -3
- package/dest/index.d.ts +0 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +1 -2
- package/dest/mocks/fixtures.d.ts +5 -5
- package/dest/mocks/fixtures.d.ts.map +1 -1
- package/dest/mocks/fixtures.js +6 -9
- package/dest/public/abstract_phase_manager.d.ts +4 -5
- package/dest/public/abstract_phase_manager.d.ts.map +1 -1
- package/dest/public/abstract_phase_manager.js +17 -84
- package/dest/public/execution.d.ts +8 -10
- package/dest/public/execution.d.ts.map +1 -1
- package/dest/public/execution.js +10 -1
- package/dest/public/executor.d.ts +6 -2
- package/dest/public/executor.d.ts.map +1 -1
- package/dest/public/executor.js +12 -4
- package/dest/public/executor_metrics.d.ts +10 -0
- package/dest/public/executor_metrics.d.ts.map +1 -0
- package/dest/public/executor_metrics.js +32 -0
- package/dest/public/fee_payment.d.ts +2 -2
- package/dest/public/fee_payment.d.ts.map +1 -1
- package/dest/public/fee_payment.js +9 -10
- package/dest/public/hints_builder.d.ts.map +1 -1
- package/dest/public/hints_builder.js +1 -1
- package/dest/public/index.d.ts +1 -1
- package/dest/public/index.d.ts.map +1 -1
- package/dest/public/index.js +1 -1
- package/dest/public/public_processor.d.ts +3 -3
- package/dest/public/public_processor.d.ts.map +1 -1
- package/dest/public/public_processor.js +33 -14
- package/dest/public/public_processor_metrics.d.ts +19 -0
- package/dest/public/public_processor_metrics.d.ts.map +1 -0
- package/dest/public/public_processor_metrics.js +57 -0
- package/dest/public/side_effect_trace.d.ts +1 -0
- package/dest/public/side_effect_trace.d.ts.map +1 -1
- package/dest/public/side_effect_trace.js +9 -9
- package/package.json +9 -9
- package/src/acvm/acvm.ts +1 -1
- package/src/acvm/oracle/oracle.ts +13 -30
- package/src/acvm/oracle/typed_oracle.ts +12 -31
- package/src/acvm/serialize.ts +0 -29
- package/src/avm/avm_gas.ts +1 -0
- package/src/avm/fixtures/index.ts +1 -0
- package/src/avm/opcodes/commitment.ts +66 -0
- package/src/avm/serialization/bytecode_serialization.ts +2 -0
- package/src/avm/serialization/instruction_serialization.ts +2 -1
- package/src/client/client_execution_context.ts +51 -49
- package/src/client/db_oracle.ts +9 -3
- package/src/client/execution_note_cache.ts +76 -25
- package/src/client/execution_result.ts +54 -19
- package/src/client/private_execution.ts +2 -2
- package/src/client/simulator.ts +18 -14
- package/src/client/test_utils.ts +30 -0
- package/src/client/view_data_oracle.ts +2 -1
- package/src/index.ts +0 -1
- package/src/mocks/fixtures.ts +13 -11
- package/src/public/abstract_phase_manager.ts +23 -104
- package/src/public/execution.ts +30 -14
- package/src/public/executor.ts +18 -4
- package/src/public/executor_metrics.ts +48 -0
- package/src/public/fee_payment.ts +8 -10
- package/src/public/hints_builder.ts +2 -2
- package/src/public/index.ts +1 -1
- package/src/public/public_processor.ts +46 -15
- package/src/public/public_processor_metrics.ts +90 -0
- package/src/public/side_effect_trace.ts +13 -7
- package/dest/utils.d.ts +0 -12
- package/dest/utils.d.ts.map +0 -1
- package/dest/utils.js +0 -11
- package/src/utils.ts +0 -18
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
var _ClientExecutionContext_instances, _ClientExecutionContext_checkValidStaticCall;
|
|
2
2
|
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
-
import { EncryptedL2Log, EncryptedL2NoteLog, Event, L1EventPayload, L1NotePayload, Note, TaggedLog, } from '@aztec/circuit-types';
|
|
4
|
-
import { CallContext, FunctionSelector, PrivateContextInputs,
|
|
3
|
+
import { EncryptedL2Log, EncryptedL2NoteLog, Event, L1EventPayload, L1NotePayload, Note, PublicExecutionRequest, TaggedLog, } from '@aztec/circuit-types';
|
|
4
|
+
import { CallContext, FunctionSelector, PrivateContextInputs, } from '@aztec/circuits.js';
|
|
5
5
|
import { Aes128 } from '@aztec/circuits.js/barretenberg';
|
|
6
6
|
import { computeUniqueNoteHash, siloNoteHash } from '@aztec/circuits.js/hash';
|
|
7
7
|
import { EventSelector, countArgumentsSize, } from '@aztec/foundation/abi';
|
|
8
|
-
import {
|
|
8
|
+
import { poseidon2HashWithSeparator } from '@aztec/foundation/crypto';
|
|
9
9
|
import { Fr, GrumpkinScalar } from '@aztec/foundation/fields';
|
|
10
10
|
import { applyStringFormatting, createDebugLogger } from '@aztec/foundation/log';
|
|
11
11
|
import { toACVMWitness } from '../acvm/index.js';
|
|
12
|
-
import { CountedLog, CountedNoteLog } from './execution_result.js';
|
|
12
|
+
import { CountedLog, CountedNoteLog, CountedPublicExecutionRequest, } from './execution_result.js';
|
|
13
13
|
import { pickNotes } from './pick_notes.js';
|
|
14
14
|
import { executePrivateFunction } from './private_execution.js';
|
|
15
15
|
import { ViewDataOracle } from './view_data_oracle.js';
|
|
@@ -21,8 +21,8 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
21
21
|
/** Header of a block whose state is used during private execution (not the block the transaction is included in). */
|
|
22
22
|
historicalHeader,
|
|
23
23
|
/** List of transient auth witnesses to be used during this simulation */
|
|
24
|
-
authWitnesses, packedValuesCache, noteCache, db, node, sideEffectCounter = 0, log = createDebugLogger('aztec:simulator:client_execution_context')) {
|
|
25
|
-
super(contractAddress, authWitnesses, db, node, log);
|
|
24
|
+
authWitnesses, packedValuesCache, noteCache, db, node, sideEffectCounter = 0, log = createDebugLogger('aztec:simulator:client_execution_context'), scopes) {
|
|
25
|
+
super(contractAddress, authWitnesses, db, node, log, scopes);
|
|
26
26
|
_ClientExecutionContext_instances.add(this);
|
|
27
27
|
this.argsHash = argsHash;
|
|
28
28
|
this.txContext = txContext;
|
|
@@ -50,13 +50,13 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
50
50
|
* They should act as references for the read requests output by an app circuit via public inputs.
|
|
51
51
|
*/
|
|
52
52
|
this.noteHashLeafIndexMap = new Map();
|
|
53
|
-
this.
|
|
53
|
+
this.noteHashNullifierCounterMap = new Map();
|
|
54
54
|
this.noteEncryptedLogs = [];
|
|
55
55
|
this.encryptedLogs = [];
|
|
56
56
|
this.unencryptedLogs = [];
|
|
57
57
|
this.nestedExecutions = [];
|
|
58
58
|
this.enqueuedPublicFunctionCalls = [];
|
|
59
|
-
this.publicTeardownFunctionCall =
|
|
59
|
+
this.publicTeardownFunctionCall = PublicExecutionRequest.empty();
|
|
60
60
|
}
|
|
61
61
|
// We still need this function until we can get user-defined ordering of structs for fn arguments
|
|
62
62
|
// TODO When that is sorted out on noir side, we can use instead the utilities in serialize.ts
|
|
@@ -84,13 +84,12 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
86
|
* Get the data for the newly created notes.
|
|
87
|
-
* @param innerNoteHashes - Inner note hashes for the notes.
|
|
88
87
|
*/
|
|
89
88
|
getNewNotes() {
|
|
90
89
|
return this.newNotes;
|
|
91
90
|
}
|
|
92
|
-
|
|
93
|
-
return this.
|
|
91
|
+
getNoteHashNullifierCounterMap() {
|
|
92
|
+
return this.noteHashNullifierCounterMap;
|
|
94
93
|
}
|
|
95
94
|
/**
|
|
96
95
|
* Return the note encrypted logs emitted during this execution.
|
|
@@ -173,7 +172,7 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
173
172
|
// Nullified pending notes are already removed from the list.
|
|
174
173
|
const pendingNotes = this.noteCache.getNotes(this.callContext.storageContractAddress, storageSlot);
|
|
175
174
|
const pendingNullifiers = this.noteCache.getNullifiers(this.callContext.storageContractAddress);
|
|
176
|
-
const dbNotes = await this.db.getNotes(this.callContext.storageContractAddress, storageSlot, status);
|
|
175
|
+
const dbNotes = await this.db.getNotes(this.callContext.storageContractAddress, storageSlot, status, this.scopes);
|
|
177
176
|
const dbNotesFiltered = dbNotes.filter(n => !pendingNullifiers.has(n.siloedNullifier.value));
|
|
178
177
|
const notes = pickNotes([...dbNotesFiltered, ...pendingNotes], {
|
|
179
178
|
selects: selectByIndexes.slice(0, numSelects).map((index, i) => ({
|
|
@@ -193,12 +192,9 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
193
192
|
.join(', ')}`);
|
|
194
193
|
notes.forEach(n => {
|
|
195
194
|
if (n.index !== undefined) {
|
|
196
|
-
|
|
197
|
-
// Should always call computeUniqueNoteHash when publicly created notes include nonces.
|
|
198
|
-
const uniqueNoteHash = n.nonce.isZero() ? n.innerNoteHash : computeUniqueNoteHash(n.nonce, n.innerNoteHash);
|
|
195
|
+
const uniqueNoteHash = computeUniqueNoteHash(n.nonce, n.noteHash);
|
|
199
196
|
const siloedNoteHash = siloNoteHash(n.contractAddress, uniqueNoteHash);
|
|
200
|
-
|
|
201
|
-
this.noteHashLeafIndexMap.set(noteHashForReadRequest.toBigInt(), n.index);
|
|
197
|
+
this.noteHashLeafIndexMap.set(siloedNoteHash.toBigInt(), n.index);
|
|
202
198
|
}
|
|
203
199
|
});
|
|
204
200
|
return notes;
|
|
@@ -210,10 +206,10 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
210
206
|
* @param storageSlot - The storage slot.
|
|
211
207
|
* @param noteTypeId - The type ID of the note.
|
|
212
208
|
* @param noteItems - The items to be included in a Note.
|
|
213
|
-
* @param
|
|
209
|
+
* @param noteHash - A hash of the new note.
|
|
214
210
|
* @returns
|
|
215
211
|
*/
|
|
216
|
-
notifyCreatedNote(storageSlot, noteTypeId, noteItems,
|
|
212
|
+
notifyCreatedNote(storageSlot, noteTypeId, noteItems, noteHash, counter) {
|
|
217
213
|
const note = new Note(noteItems);
|
|
218
214
|
this.noteCache.addNewNote({
|
|
219
215
|
contractAddress: this.callContext.storageContractAddress,
|
|
@@ -221,7 +217,7 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
221
217
|
nonce: Fr.ZERO, // Nonce cannot be known during private execution.
|
|
222
218
|
note,
|
|
223
219
|
siloedNullifier: undefined, // Siloed nullifier cannot be known for newly created note.
|
|
224
|
-
|
|
220
|
+
noteHash,
|
|
225
221
|
}, counter);
|
|
226
222
|
this.newNotes.push({
|
|
227
223
|
storageSlot,
|
|
@@ -233,12 +229,12 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
233
229
|
* Adding a siloed nullifier into the current set of all pending nullifiers created
|
|
234
230
|
* within the current transaction/execution.
|
|
235
231
|
* @param innerNullifier - The pending nullifier to add in the list (not yet siloed by contract address).
|
|
236
|
-
* @param
|
|
232
|
+
* @param noteHash - A hash of the new note.
|
|
237
233
|
*/
|
|
238
|
-
notifyNullifiedNote(innerNullifier,
|
|
239
|
-
const nullifiedNoteHashCounter = this.noteCache.nullifyNote(this.callContext.storageContractAddress, innerNullifier,
|
|
234
|
+
notifyNullifiedNote(innerNullifier, noteHash, counter) {
|
|
235
|
+
const nullifiedNoteHashCounter = this.noteCache.nullifyNote(this.callContext.storageContractAddress, innerNullifier, noteHash);
|
|
240
236
|
if (nullifiedNoteHashCounter !== undefined) {
|
|
241
|
-
this.
|
|
237
|
+
this.noteHashNullifierCounterMap.set(nullifiedNoteHashCounter, counter);
|
|
242
238
|
}
|
|
243
239
|
return Promise.resolve();
|
|
244
240
|
}
|
|
@@ -255,7 +251,7 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
255
251
|
// An app providing randomness = 0 signals to not mask the address.
|
|
256
252
|
const maskedContractAddress = randomness.isZero()
|
|
257
253
|
? contractAddress.toField()
|
|
258
|
-
:
|
|
254
|
+
: poseidon2HashWithSeparator([contractAddress, randomness], 0);
|
|
259
255
|
const encryptedLog = new CountedLog(new EncryptedL2Log(encryptedEvent, maskedContractAddress), counter);
|
|
260
256
|
this.encryptedLogs.push(encryptedLog);
|
|
261
257
|
}
|
|
@@ -341,13 +337,17 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
341
337
|
const targetArtifact = await this.db.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
342
338
|
const derivedTxContext = this.txContext.clone();
|
|
343
339
|
const derivedCallContext = this.deriveCallContext(targetContractAddress, targetArtifact, isDelegateCall, isStaticCall);
|
|
344
|
-
const context = new ClientExecutionContext(targetContractAddress, argsHash, derivedTxContext, derivedCallContext, this.historicalHeader, this.authWitnesses, this.packedValuesCache, this.noteCache, this.db, this.node, sideEffectCounter);
|
|
340
|
+
const context = new ClientExecutionContext(targetContractAddress, argsHash, derivedTxContext, derivedCallContext, this.historicalHeader, this.authWitnesses, this.packedValuesCache, this.noteCache, this.db, this.node, sideEffectCounter, this.log, this.scopes);
|
|
345
341
|
const childExecutionResult = await executePrivateFunction(context, targetArtifact, targetContractAddress, functionSelector);
|
|
346
342
|
if (isStaticCall) {
|
|
347
343
|
__classPrivateFieldGet(this, _ClientExecutionContext_instances, "m", _ClientExecutionContext_checkValidStaticCall).call(this, childExecutionResult);
|
|
348
344
|
}
|
|
349
345
|
this.nestedExecutions.push(childExecutionResult);
|
|
350
|
-
|
|
346
|
+
const publicInputs = childExecutionResult.callStackItem.publicInputs;
|
|
347
|
+
return {
|
|
348
|
+
endSideEffectCounter: publicInputs.endSideEffectCounter,
|
|
349
|
+
returnsHash: publicInputs.returnsHash,
|
|
350
|
+
};
|
|
351
351
|
}
|
|
352
352
|
/**
|
|
353
353
|
* Creates a PublicCallStackItem object representing the request to call a public function.
|
|
@@ -358,24 +358,22 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
358
358
|
* @param isStaticCall - Whether the call is a static call.
|
|
359
359
|
* @returns The public call stack item with the request information.
|
|
360
360
|
*/
|
|
361
|
-
async
|
|
362
|
-
isStaticCall = isStaticCall || this.callContext.isStaticCall;
|
|
361
|
+
async createPublicExecutionRequest(callType, targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall, isDelegateCall) {
|
|
363
362
|
const targetArtifact = await this.db.getFunctionArtifact(targetContractAddress, functionSelector);
|
|
364
363
|
const derivedCallContext = this.deriveCallContext(targetContractAddress, targetArtifact, isDelegateCall, isStaticCall);
|
|
365
364
|
const args = this.packedValuesCache.unpack(argsHash);
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
// side-effects occurred in the TX. Ultimately the private kernel should
|
|
369
|
-
// just output everything in the proper order without any counters.
|
|
370
|
-
this.log.verbose(`Created PublicCallRequest of type [${callType}], side-effect counter [${sideEffectCounter}] to ${targetContractAddress}:${functionSelector}(${targetArtifact.name})`);
|
|
371
|
-
return PublicCallRequest.from({
|
|
365
|
+
this.log.verbose(`Created PublicExecutionRequest of type [${callType}], side-effect counter [${sideEffectCounter}] to ${targetContractAddress}:${functionSelector}(${targetArtifact.name})`);
|
|
366
|
+
const request = PublicExecutionRequest.from({
|
|
372
367
|
args,
|
|
373
368
|
callContext: derivedCallContext,
|
|
374
|
-
parentCallContext: this.callContext,
|
|
375
|
-
functionSelector,
|
|
376
369
|
contractAddress: targetContractAddress,
|
|
377
|
-
sideEffectCounter,
|
|
378
370
|
});
|
|
371
|
+
if (callType === 'enqueued') {
|
|
372
|
+
this.enqueuedPublicFunctionCalls.push(new CountedPublicExecutionRequest(request, sideEffectCounter));
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
this.publicTeardownFunctionCall = request;
|
|
376
|
+
}
|
|
379
377
|
}
|
|
380
378
|
/**
|
|
381
379
|
* Creates and enqueues a PublicCallStackItem object representing the request to call a public function. No function
|
|
@@ -389,9 +387,7 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
389
387
|
* @returns The public call stack item with the request information.
|
|
390
388
|
*/
|
|
391
389
|
async enqueuePublicFunctionCall(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall, isDelegateCall) {
|
|
392
|
-
|
|
393
|
-
this.enqueuedPublicFunctionCalls.push(enqueuedRequest);
|
|
394
|
-
return enqueuedRequest;
|
|
390
|
+
await this.createPublicExecutionRequest('enqueued', targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall, isDelegateCall);
|
|
395
391
|
}
|
|
396
392
|
/**
|
|
397
393
|
* Creates a PublicCallStackItem and sets it as the public teardown function. No function
|
|
@@ -405,9 +401,10 @@ export class ClientExecutionContext extends ViewDataOracle {
|
|
|
405
401
|
* @returns The public call stack item with the request information.
|
|
406
402
|
*/
|
|
407
403
|
async setPublicTeardownFunctionCall(targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall, isDelegateCall) {
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
404
|
+
await this.createPublicExecutionRequest('teardown', targetContractAddress, functionSelector, argsHash, sideEffectCounter, isStaticCall, isDelegateCall);
|
|
405
|
+
}
|
|
406
|
+
notifySetMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter) {
|
|
407
|
+
this.noteCache.setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter);
|
|
411
408
|
}
|
|
412
409
|
/**
|
|
413
410
|
* Derives the call context for a nested execution.
|
|
@@ -457,4 +454,4 @@ _ClientExecutionContext_instances = new WeakSet(), _ClientExecutionContext_check
|
|
|
457
454
|
throw new Error(`Static call cannot update the state, emit L2->L1 messages or generate logs`);
|
|
458
455
|
}
|
|
459
456
|
};
|
|
460
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50X2V4ZWN1dGlvbl9jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9jbGllbnRfZXhlY3V0aW9uX2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBR0wsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixLQUFLLEVBQ0wsY0FBYyxFQUNkLGFBQWEsRUFDYixJQUFJLEVBRUosU0FBUyxHQUVWLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUNMLFdBQVcsRUFDWCxnQkFBZ0IsRUFHaEIsb0JBQW9CLEVBQ3BCLGlCQUFpQixHQUVsQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUUsT0FBTyxFQUNMLGFBQWEsRUFJYixrQkFBa0IsR0FDbkIsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDeEQsT0FBTyxFQUFFLEVBQUUsRUFBRSxjQUFjLEVBQWMsTUFBTSwwQkFBMEIsQ0FBQztBQUMxRSxPQUFPLEVBQUUscUJBQXFCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUVqRixPQUFPLEVBQWlCLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBSWhFLE9BQU8sRUFBRSxVQUFVLEVBQUUsY0FBYyxFQUEwQyxNQUFNLHVCQUF1QixDQUFDO0FBQzNHLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUM1QyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNoRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFFdkQ7O0dBRUc7QUFDSCxNQUFNLE9BQU8s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
|
|
457
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50X2V4ZWN1dGlvbl9jb250ZXh0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NsaWVudC9jbGllbnRfZXhlY3V0aW9uX2NvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxPQUFPLEVBR0wsY0FBYyxFQUNkLGtCQUFrQixFQUNsQixLQUFLLEVBQ0wsY0FBYyxFQUNkLGFBQWEsRUFDYixJQUFJLEVBRUosc0JBQXNCLEVBQ3RCLFNBQVMsR0FFVixNQUFNLHNCQUFzQixDQUFDO0FBQzlCLE9BQU8sRUFDTCxXQUFXLEVBQ1gsZ0JBQWdCLEVBR2hCLG9CQUFvQixHQUVyQixNQUFNLG9CQUFvQixDQUFDO0FBQzVCLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUN6RCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDOUUsT0FBTyxFQUNMLGFBQWEsRUFJYixrQkFBa0IsR0FDbkIsTUFBTSx1QkFBdUIsQ0FBQztBQUUvQixPQUFPLEVBQUUsMEJBQTBCLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRWpGLE9BQU8sRUFBaUIsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFJaEUsT0FBTyxFQUNMLFVBQVUsRUFDVixjQUFjLEVBQ2QsNkJBQTZCLEdBRzlCLE1BQU0sdUJBQXVCLENBQUM7QUFDL0IsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzVDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ2hFLE9BQU8sRUFBRSxjQUFjLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUV2RDs7R0FFRztB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
|
|
@@ -59,12 +59,13 @@ export interface DBOracle extends CommitmentsDB {
|
|
|
59
59
|
* The query result is paginated using 'limit' and 'offset' values.
|
|
60
60
|
* Returns an object containing an array of note data.
|
|
61
61
|
*
|
|
62
|
-
* @param contractAddress - The
|
|
63
|
-
* @param storageSlot - The
|
|
62
|
+
* @param contractAddress - The contract address of the notes.
|
|
63
|
+
* @param storageSlot - The storage slot of the notes.
|
|
64
64
|
* @param status - The status of notes to fetch.
|
|
65
|
+
* @param scopes - The accounts whose notes we can access in this call. Currently optional and will default to all.
|
|
65
66
|
* @returns A Promise that resolves to an array of note data.
|
|
66
67
|
*/
|
|
67
|
-
getNotes(contractAddress: AztecAddress, storageSlot: Fr, status: NoteStatus): Promise<NoteData[]>;
|
|
68
|
+
getNotes(contractAddress: AztecAddress, storageSlot: Fr, status: NoteStatus, scopes?: AztecAddress[]): Promise<NoteData[]>;
|
|
68
69
|
/**
|
|
69
70
|
* Retrieve the artifact information of a specific function within a contract.
|
|
70
71
|
* The function is identified by its selector, which is a unique identifier generated from the function signature.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"db_oracle.d.ts","sourceRoot":"","sources":["../../src/client/db_oracle.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,YAAY,EACjB,KAAK,UAAU,EACf,KAAK,0BAA0B,EAC/B,KAAK,iBAAiB,EACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAClG,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AACrF,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;AACnD,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE/D,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,4BAA4B,CAAC;AAEhE;;GAEG;AACH,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,eAAe,EAAE,MAAM;CAGpC;AAED;;GAEG;AACH,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,eAAe,EAAE,MAAM;CAGpC;AAED;;GAEG;AACH,MAAM,WAAW,QAAS,SAAQ,aAAa;IAC7C;;;;OAIG;IACH,mBAAmB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEtE;;;;;OAKG;IACH,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC;IAEpE;;;;OAIG;IACH,cAAc,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAE/C;;;;OAIG;IACH,UAAU,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;IAE5B;;;;;OAKG;IACH,uBAAuB,CAAC,OAAO,EAAE,EAAE,EAAE,eAAe,EAAE,YAAY,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAEnG
|
|
1
|
+
{"version":3,"file":"db_oracle.d.ts","sourceRoot":"","sources":["../../src/client/db_oracle.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,26 +1,31 @@
|
|
|
1
1
|
import { type AztecAddress } from '@aztec/foundation/aztec-address';
|
|
2
|
-
import { Fr } from '@aztec/foundation/fields';
|
|
2
|
+
import { type Fr } from '@aztec/foundation/fields';
|
|
3
3
|
import { type NoteData } from '../acvm/index.js';
|
|
4
|
-
export interface PendingNote {
|
|
5
|
-
note: NoteData;
|
|
6
|
-
counter: number;
|
|
7
|
-
}
|
|
8
4
|
/**
|
|
9
5
|
* Data that's accessible by all the function calls in an execution.
|
|
10
6
|
*/
|
|
11
7
|
export declare class ExecutionNoteCache {
|
|
8
|
+
#private;
|
|
9
|
+
private readonly txHash;
|
|
12
10
|
/**
|
|
13
11
|
* New notes created in this transaction.
|
|
12
|
+
* They are pushed to this array in the same order as they are emitted.
|
|
13
|
+
*/
|
|
14
|
+
private notes;
|
|
15
|
+
/**
|
|
14
16
|
* This mapping maps from a contract address to the notes in the contract.
|
|
15
17
|
*/
|
|
16
|
-
private
|
|
18
|
+
private noteMap;
|
|
17
19
|
/**
|
|
18
20
|
* The list of nullifiers created in this transaction.
|
|
19
21
|
* This mapping maps from a contract address to the nullifiers emitted from the contract.
|
|
20
22
|
* The note which is nullified might be new or not (i.e., was generated in a previous transaction).
|
|
21
23
|
* Note that their value (bigint representation) is used because Frs cannot be looked up in Sets.
|
|
22
24
|
*/
|
|
23
|
-
private
|
|
25
|
+
private nullifierMap;
|
|
26
|
+
private minRevertibleSideEffectCounter;
|
|
27
|
+
constructor(txHash: Fr);
|
|
28
|
+
setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter: number): void;
|
|
24
29
|
/**
|
|
25
30
|
* Add a new note to cache.
|
|
26
31
|
* @param note - New note created during execution.
|
|
@@ -29,12 +34,11 @@ export declare class ExecutionNoteCache {
|
|
|
29
34
|
/**
|
|
30
35
|
* Add a nullifier to cache. It could be for a db note or a new note created during execution.
|
|
31
36
|
* @param contractAddress - Contract address of the note.
|
|
32
|
-
* @param storageSlot - Storage slot of the note.
|
|
33
37
|
* @param innerNullifier - Inner nullifier of the note.
|
|
34
|
-
* @param
|
|
35
|
-
*
|
|
38
|
+
* @param noteHash - A hash of the note. If this value equals 0, it means the note being nullified is from a previous
|
|
39
|
+
* transaction (and thus not a new note).
|
|
36
40
|
*/
|
|
37
|
-
nullifyNote(contractAddress: AztecAddress, innerNullifier: Fr,
|
|
41
|
+
nullifyNote(contractAddress: AztecAddress, innerNullifier: Fr, noteHash: Fr): number | undefined;
|
|
38
42
|
/**
|
|
39
43
|
* Return notes created up to current point in execution.
|
|
40
44
|
* If a nullifier for a note in this list is emitted, the note will be deleted.
|
|
@@ -46,9 +50,9 @@ export declare class ExecutionNoteCache {
|
|
|
46
50
|
* Check if a note exists in the newNotes array.
|
|
47
51
|
* @param contractAddress - Contract address of the note.
|
|
48
52
|
* @param storageSlot - Storage slot of the note.
|
|
49
|
-
* @param
|
|
53
|
+
* @param noteHash - A hash of the note.
|
|
50
54
|
**/
|
|
51
|
-
checkNoteExists(contractAddress: AztecAddress,
|
|
55
|
+
checkNoteExists(contractAddress: AztecAddress, noteHash: Fr): boolean;
|
|
52
56
|
/**
|
|
53
57
|
* Return all nullifiers emitted from a contract.
|
|
54
58
|
* @param contractAddress - Address of the contract.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"execution_note_cache.d.ts","sourceRoot":"","sources":["../../src/client/execution_note_cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,EAAE,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"execution_note_cache.d.ts","sourceRoot":"","sources":["../../src/client/execution_note_cache.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,KAAK,EAAE,EAAE,MAAM,0BAA0B,CAAC;AAEnD,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAQjD;;GAEG;AACH,qBAAa,kBAAkB;;IAqBjB,OAAO,CAAC,QAAQ,CAAC,MAAM;IApBnC;;;OAGG;IACH,OAAO,CAAC,KAAK,CAAqB;IAClC;;OAEG;IACH,OAAO,CAAC,OAAO,CAAyC;IAExD;;;;;OAKG;IACH,OAAO,CAAC,YAAY,CAAuC;IAE3D,OAAO,CAAC,8BAA8B,CAAK;gBAEd,MAAM,EAAE,EAAE;IAEhC,iCAAiC,CAAC,8BAA8B,EAAE,MAAM;IA4B/E;;;OAGG;IACI,UAAU,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM;IAWjD;;;;;;OAMG;IACI,WAAW,CAAC,eAAe,EAAE,YAAY,EAAE,cAAc,EAAE,EAAE,EAAE,QAAQ,EAAE,EAAE;IAuBlF;;;;;QAKI;IACG,QAAQ,CAAC,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE;IAK9D;;;;;QAKI;IACG,eAAe,CAAC,eAAe,EAAE,YAAY,EAAE,QAAQ,EAAE,EAAE;IAKlE;;;OAGG;IACI,aAAa,CAAC,eAAe,EAAE,YAAY,GAAG,GAAG,CAAC,MAAM,CAAC;CAWjE"}
|
|
@@ -1,56 +1,89 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
1
|
+
var _ExecutionNoteCache_instances, _ExecutionNoteCache_addNote;
|
|
2
|
+
import { __classPrivateFieldGet } from "tslib";
|
|
3
|
+
import { computeNoteHashNonce, computeUniqueNoteHash, siloNoteHash, siloNullifier } from '@aztec/circuits.js/hash';
|
|
3
4
|
/**
|
|
4
5
|
* Data that's accessible by all the function calls in an execution.
|
|
5
6
|
*/
|
|
6
7
|
export class ExecutionNoteCache {
|
|
7
|
-
constructor() {
|
|
8
|
+
constructor(txHash) {
|
|
9
|
+
_ExecutionNoteCache_instances.add(this);
|
|
10
|
+
this.txHash = txHash;
|
|
8
11
|
/**
|
|
9
12
|
* New notes created in this transaction.
|
|
13
|
+
* They are pushed to this array in the same order as they are emitted.
|
|
14
|
+
*/
|
|
15
|
+
this.notes = [];
|
|
16
|
+
/**
|
|
10
17
|
* This mapping maps from a contract address to the notes in the contract.
|
|
11
18
|
*/
|
|
12
|
-
this.
|
|
19
|
+
this.noteMap = new Map();
|
|
13
20
|
/**
|
|
14
21
|
* The list of nullifiers created in this transaction.
|
|
15
22
|
* This mapping maps from a contract address to the nullifiers emitted from the contract.
|
|
16
23
|
* The note which is nullified might be new or not (i.e., was generated in a previous transaction).
|
|
17
24
|
* Note that their value (bigint representation) is used because Frs cannot be looked up in Sets.
|
|
18
25
|
*/
|
|
19
|
-
this.
|
|
26
|
+
this.nullifierMap = new Map();
|
|
27
|
+
this.minRevertibleSideEffectCounter = 0;
|
|
28
|
+
}
|
|
29
|
+
setMinRevertibleSideEffectCounter(minRevertibleSideEffectCounter) {
|
|
30
|
+
if (this.minRevertibleSideEffectCounter && this.minRevertibleSideEffectCounter !== minRevertibleSideEffectCounter) {
|
|
31
|
+
throw new Error(`Cannot override minRevertibleSideEffectCounter. Current value: ${minRevertibleSideEffectCounter}. Previous value: ${this.minRevertibleSideEffectCounter}`);
|
|
32
|
+
}
|
|
33
|
+
this.minRevertibleSideEffectCounter = minRevertibleSideEffectCounter;
|
|
34
|
+
// The existing pending notes are all non-revertible.
|
|
35
|
+
// They cannot be squashed by nullifiers emitted after minRevertibleSideEffectCounter is set.
|
|
36
|
+
// Their indexes in the tx are known at this point and won't change. So we can assign a nonce to each one of them.
|
|
37
|
+
// The nonces will be used to create the "complete" nullifier.
|
|
38
|
+
const updatedNotes = this.notes.map(({ note, counter }, i) => {
|
|
39
|
+
const nonce = computeNoteHashNonce(this.txHash, i);
|
|
40
|
+
const uniqueNoteHash = computeUniqueNoteHash(nonce, note.noteHash);
|
|
41
|
+
return {
|
|
42
|
+
counter,
|
|
43
|
+
note: { ...note, nonce },
|
|
44
|
+
noteHashForConsumption: siloNoteHash(note.contractAddress, uniqueNoteHash),
|
|
45
|
+
};
|
|
46
|
+
});
|
|
47
|
+
// Rebuild the data.
|
|
48
|
+
this.notes = [];
|
|
49
|
+
this.noteMap = new Map();
|
|
50
|
+
updatedNotes.forEach(n => __classPrivateFieldGet(this, _ExecutionNoteCache_instances, "m", _ExecutionNoteCache_addNote).call(this, n));
|
|
20
51
|
}
|
|
21
52
|
/**
|
|
22
53
|
* Add a new note to cache.
|
|
23
54
|
* @param note - New note created during execution.
|
|
24
55
|
*/
|
|
25
56
|
addNewNote(note, counter) {
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
57
|
+
const previousNote = this.notes[this.notes.length - 1];
|
|
58
|
+
if (previousNote && previousNote.counter >= counter) {
|
|
59
|
+
throw new Error(`Note hash counters must be strictly increasing. Current counter: ${counter}. Previous counter: ${previousNote.counter}.`);
|
|
60
|
+
}
|
|
61
|
+
__classPrivateFieldGet(this, _ExecutionNoteCache_instances, "m", _ExecutionNoteCache_addNote).call(this, { note, counter, noteHashForConsumption: note.noteHash });
|
|
29
62
|
}
|
|
30
63
|
/**
|
|
31
64
|
* Add a nullifier to cache. It could be for a db note or a new note created during execution.
|
|
32
65
|
* @param contractAddress - Contract address of the note.
|
|
33
|
-
* @param storageSlot - Storage slot of the note.
|
|
34
66
|
* @param innerNullifier - Inner nullifier of the note.
|
|
35
|
-
* @param
|
|
36
|
-
*
|
|
67
|
+
* @param noteHash - A hash of the note. If this value equals 0, it means the note being nullified is from a previous
|
|
68
|
+
* transaction (and thus not a new note).
|
|
37
69
|
*/
|
|
38
|
-
nullifyNote(contractAddress, innerNullifier,
|
|
70
|
+
nullifyNote(contractAddress, innerNullifier, noteHash) {
|
|
39
71
|
const siloedNullifier = siloNullifier(contractAddress, innerNullifier);
|
|
40
72
|
const nullifiers = this.getNullifiers(contractAddress);
|
|
41
73
|
nullifiers.add(siloedNullifier.value);
|
|
42
|
-
this.
|
|
74
|
+
this.nullifierMap.set(contractAddress.toBigInt(), nullifiers);
|
|
43
75
|
let nullifiedNoteHashCounter = undefined;
|
|
44
|
-
// Find and remove the matching new note and log(s) if the emitted
|
|
45
|
-
if (!
|
|
46
|
-
const
|
|
47
|
-
const noteIndexToRemove =
|
|
76
|
+
// Find and remove the matching new note and log(s) if the emitted noteHash is not empty.
|
|
77
|
+
if (!noteHash.isEmpty()) {
|
|
78
|
+
const notesInContract = this.noteMap.get(contractAddress.toBigInt()) ?? [];
|
|
79
|
+
const noteIndexToRemove = notesInContract.findIndex(n => n.noteHashForConsumption.equals(noteHash));
|
|
48
80
|
if (noteIndexToRemove === -1) {
|
|
49
81
|
throw new Error('Attempt to remove a pending note that does not exist.');
|
|
50
82
|
}
|
|
51
|
-
const note =
|
|
83
|
+
const note = notesInContract.splice(noteIndexToRemove, 1)[0];
|
|
52
84
|
nullifiedNoteHashCounter = note.counter;
|
|
53
|
-
this.
|
|
85
|
+
this.noteMap.set(contractAddress.toBigInt(), notesInContract);
|
|
86
|
+
this.notes = this.notes.filter(n => n.counter !== note.counter);
|
|
54
87
|
}
|
|
55
88
|
return nullifiedNoteHashCounter;
|
|
56
89
|
}
|
|
@@ -61,25 +94,31 @@ export class ExecutionNoteCache {
|
|
|
61
94
|
* @param storageSlot - Storage slot of the notes.
|
|
62
95
|
**/
|
|
63
96
|
getNotes(contractAddress, storageSlot) {
|
|
64
|
-
const notes = this.
|
|
97
|
+
const notes = this.noteMap.get(contractAddress.toBigInt()) ?? [];
|
|
65
98
|
return notes.filter(n => n.note.storageSlot.equals(storageSlot)).map(n => n.note);
|
|
66
99
|
}
|
|
67
100
|
/**
|
|
68
101
|
* Check if a note exists in the newNotes array.
|
|
69
102
|
* @param contractAddress - Contract address of the note.
|
|
70
103
|
* @param storageSlot - Storage slot of the note.
|
|
71
|
-
* @param
|
|
104
|
+
* @param noteHash - A hash of the note.
|
|
72
105
|
**/
|
|
73
|
-
checkNoteExists(contractAddress,
|
|
74
|
-
const notes = this.
|
|
75
|
-
return notes.some(n => n.note.
|
|
106
|
+
checkNoteExists(contractAddress, noteHash) {
|
|
107
|
+
const notes = this.noteMap.get(contractAddress.toBigInt()) ?? [];
|
|
108
|
+
return notes.some(n => n.note.noteHash.equals(noteHash));
|
|
76
109
|
}
|
|
77
110
|
/**
|
|
78
111
|
* Return all nullifiers emitted from a contract.
|
|
79
112
|
* @param contractAddress - Address of the contract.
|
|
80
113
|
*/
|
|
81
114
|
getNullifiers(contractAddress) {
|
|
82
|
-
return this.
|
|
115
|
+
return this.nullifierMap.get(contractAddress.toBigInt()) ?? new Set();
|
|
83
116
|
}
|
|
84
117
|
}
|
|
85
|
-
|
|
118
|
+
_ExecutionNoteCache_instances = new WeakSet(), _ExecutionNoteCache_addNote = function _ExecutionNoteCache_addNote(note) {
|
|
119
|
+
this.notes.push(note);
|
|
120
|
+
const notes = this.noteMap.get(note.note.contractAddress.toBigInt()) ?? [];
|
|
121
|
+
notes.push(note);
|
|
122
|
+
this.noteMap.set(note.note.contractAddress.toBigInt(), notes);
|
|
123
|
+
};
|
|
124
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXhlY3V0aW9uX25vdGVfY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvY2xpZW50L2V4ZWN1dGlvbl9ub3RlX2NhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsT0FBTyxFQUFFLG9CQUFvQixFQUFFLHFCQUFxQixFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQVluSDs7R0FFRztBQUNILE1BQU0sT0FBTyxrQkFBa0I7SUFxQjdCLFlBQTZCLE1BQVU7O1FBQVYsV0FBTSxHQUFOLE1BQU0sQ0FBSTtRQXBCdkM7OztXQUdHO1FBQ0ssVUFBSyxHQUFrQixFQUFFLENBQUM7UUFDbEM7O1dBRUc7UUFDSyxZQUFPLEdBQStCLElBQUksR0FBRyxFQUFFLENBQUM7UUFFeEQ7Ozs7O1dBS0c7UUFDSyxpQkFBWSxHQUE2QixJQUFJLEdBQUcsRUFBRSxDQUFDO1FBRW5ELG1DQUE4QixHQUFHLENBQUMsQ0FBQztJQUVELENBQUM7SUFFcEMsaUNBQWlDLENBQUMsOEJBQXNDO1FBQzdFLElBQUksSUFBSSxDQUFDLDhCQUE4QixJQUFJLElBQUksQ0FBQyw4QkFBOEIsS0FBSyw4QkFBOEIsRUFBRSxDQUFDO1lBQ2xILE1BQU0sSUFBSSxLQUFLLENBQ2Isa0VBQWtFLDhCQUE4QixxQkFBcUIsSUFBSSxDQUFDLDhCQUE4QixFQUFFLENBQzNKLENBQUM7UUFDSixDQUFDO1FBRUQsSUFBSSxDQUFDLDhCQUE4QixHQUFHLDhCQUE4QixDQUFDO1FBRXJFLHFEQUFxRDtRQUNyRCw2RkFBNkY7UUFDN0Ysa0hBQWtIO1FBQ2xILDhEQUE4RDtRQUM5RCxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFO1lBQzNELE1BQU0sS0FBSyxHQUFHLG9CQUFvQixDQUFDLElBQUksQ0FBQyxNQUFN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
|