@aztec/pxe 0.0.1-commit.6230efd → 0.0.1-commit.6a729f7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dest/bin/check_oracle_version.js +1 -1
- package/dest/block_synchronizer/block_synchronizer.d.ts +11 -5
- package/dest/block_synchronizer/block_synchronizer.d.ts.map +1 -1
- package/dest/block_synchronizer/block_synchronizer.js +68 -20
- package/dest/config/index.d.ts +3 -1
- package/dest/config/index.d.ts.map +1 -1
- package/dest/config/index.js +17 -0
- package/dest/config/package_info.js +1 -1
- package/dest/contract_function_simulator/benchmarked_node.d.ts +9 -0
- package/dest/contract_function_simulator/benchmarked_node.d.ts.map +1 -0
- package/dest/contract_function_simulator/benchmarked_node.js +77 -0
- package/dest/contract_function_simulator/contract_function_simulator.d.ts +9 -12
- package/dest/contract_function_simulator/contract_function_simulator.d.ts.map +1 -1
- package/dest/contract_function_simulator/contract_function_simulator.js +37 -28
- package/dest/contract_function_simulator/execution_note_cache.d.ts +18 -9
- package/dest/contract_function_simulator/execution_note_cache.d.ts.map +1 -1
- package/dest/contract_function_simulator/execution_note_cache.js +45 -28
- package/dest/contract_function_simulator/index.d.ts +2 -2
- package/dest/contract_function_simulator/index.d.ts.map +1 -1
- package/dest/contract_function_simulator/index.js +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts +4 -3
- package/dest/contract_function_simulator/noir-structs/event_validation_request.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/event_validation_request.js +6 -3
- package/dest/contract_function_simulator/noir-structs/note_validation_request.d.ts +1 -1
- package/dest/contract_function_simulator/noir-structs/note_validation_request.js +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts +4 -10
- package/dest/contract_function_simulator/noir-structs/utility_context.d.ts.map +1 -1
- package/dest/contract_function_simulator/noir-structs/utility_context.js +7 -18
- package/dest/contract_function_simulator/oracle/interfaces.d.ts +15 -11
- package/dest/contract_function_simulator/oracle/interfaces.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts +3 -1
- package/dest/contract_function_simulator/oracle/message_load_oracle_inputs.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts +6 -6
- package/dest/contract_function_simulator/oracle/note_packing_utils.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/note_packing_utils.js +8 -8
- package/dest/contract_function_simulator/oracle/oracle.d.ts +10 -8
- package/dest/contract_function_simulator/oracle/oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/oracle.js +44 -33
- package/dest/contract_function_simulator/oracle/private_execution.d.ts +2 -26
- package/dest/contract_function_simulator/oracle/private_execution.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution.js +1 -37
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts +11 -18
- package/dest/contract_function_simulator/oracle/private_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/private_execution_oracle.js +23 -39
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts +34 -20
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.d.ts.map +1 -1
- package/dest/contract_function_simulator/oracle/utility_execution_oracle.js +80 -76
- package/dest/contract_sync/index.d.ts +23 -0
- package/dest/contract_sync/index.d.ts.map +1 -0
- package/dest/contract_sync/index.js +54 -0
- package/dest/debug/pxe_debug_utils.d.ts +16 -6
- package/dest/debug/pxe_debug_utils.d.ts.map +1 -1
- package/dest/debug/pxe_debug_utils.js +20 -10
- package/dest/entrypoints/client/bundle/utils.d.ts +1 -1
- package/dest/entrypoints/client/bundle/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/bundle/utils.js +22 -7
- package/dest/entrypoints/client/lazy/utils.d.ts +2 -2
- package/dest/entrypoints/client/lazy/utils.d.ts.map +1 -1
- package/dest/entrypoints/client/lazy/utils.js +23 -8
- package/dest/entrypoints/pxe_creation_options.d.ts +5 -3
- package/dest/entrypoints/pxe_creation_options.d.ts.map +1 -1
- package/dest/entrypoints/server/index.d.ts +3 -1
- package/dest/entrypoints/server/index.d.ts.map +1 -1
- package/dest/entrypoints/server/index.js +2 -0
- package/dest/entrypoints/server/utils.d.ts +1 -1
- package/dest/entrypoints/server/utils.d.ts.map +1 -1
- package/dest/entrypoints/server/utils.js +30 -15
- package/dest/events/event_service.d.ts +6 -6
- package/dest/events/event_service.d.ts.map +1 -1
- package/dest/events/event_service.js +19 -22
- package/dest/events/private_event_filter_validator.d.ts +5 -5
- package/dest/events/private_event_filter_validator.d.ts.map +1 -1
- package/dest/events/private_event_filter_validator.js +5 -6
- package/dest/job_coordinator/job_coordinator.d.ts +75 -0
- package/dest/job_coordinator/job_coordinator.d.ts.map +1 -0
- package/dest/job_coordinator/job_coordinator.js +94 -0
- package/dest/logs/log_service.d.ts +6 -4
- package/dest/logs/log_service.d.ts.map +1 -1
- package/dest/logs/log_service.js +21 -16
- package/dest/notes/note_service.d.ts +7 -7
- package/dest/notes/note_service.d.ts.map +1 -1
- package/dest/notes/note_service.js +31 -36
- package/dest/oracle_version.d.ts +3 -3
- package/dest/oracle_version.d.ts.map +1 -1
- package/dest/oracle_version.js +4 -3
- package/dest/private_kernel/hints/index.d.ts +2 -2
- package/dest/private_kernel/hints/index.d.ts.map +1 -1
- package/dest/private_kernel/hints/index.js +1 -1
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts +28 -0
- package/dest/private_kernel/hints/private_kernel_reset_private_inputs_builder.d.ts.map +1 -0
- package/dest/private_kernel/hints/{build_private_kernel_reset_private_inputs.js → private_kernel_reset_private_inputs_builder.js} +13 -7
- package/dest/private_kernel/private_kernel_execution_prover.d.ts +3 -2
- package/dest/private_kernel/private_kernel_execution_prover.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_execution_prover.js +6 -7
- package/dest/private_kernel/private_kernel_oracle.d.ts +24 -28
- package/dest/private_kernel/private_kernel_oracle.d.ts.map +1 -1
- package/dest/private_kernel/private_kernel_oracle.js +90 -2
- package/dest/pxe.d.ts +8 -36
- package/dest/pxe.d.ts.map +1 -1
- package/dest/pxe.js +75 -96
- package/dest/storage/address_store/address_store.d.ts +1 -1
- package/dest/storage/address_store/address_store.d.ts.map +1 -1
- package/dest/storage/address_store/address_store.js +12 -11
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts +9 -1
- package/dest/storage/anchor_block_store/anchor_block_store.d.ts.map +1 -1
- package/dest/storage/anchor_block_store/anchor_block_store.js +8 -1
- package/dest/storage/capsule_store/capsule_store.d.ts +24 -9
- package/dest/storage/capsule_store/capsule_store.d.ts.map +1 -1
- package/dest/storage/capsule_store/capsule_store.js +130 -23
- package/dest/storage/contract_store/contract_store.d.ts +1 -2
- package/dest/storage/contract_store/contract_store.d.ts.map +1 -1
- package/dest/storage/contract_store/contract_store.js +22 -25
- package/dest/storage/metadata.d.ts +1 -1
- package/dest/storage/metadata.js +1 -1
- package/dest/storage/note_store/note_store.d.ts +51 -52
- package/dest/storage/note_store/note_store.d.ts.map +1 -1
- package/dest/storage/note_store/note_store.js +282 -263
- package/dest/storage/note_store/stored_note.d.ts +16 -0
- package/dest/storage/note_store/stored_note.d.ts.map +1 -0
- package/dest/storage/note_store/stored_note.js +43 -0
- package/dest/storage/private_event_store/private_event_store.d.ts +47 -7
- package/dest/storage/private_event_store/private_event_store.d.ts.map +1 -1
- package/dest/storage/private_event_store/private_event_store.js +231 -73
- package/dest/storage/private_event_store/stored_private_event.d.ts +23 -0
- package/dest/storage/private_event_store/stored_private_event.d.ts.map +1 -0
- package/dest/storage/private_event_store/stored_private_event.js +56 -0
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts +15 -8
- package/dest/storage/tagging_store/recipient_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/recipient_tagging_store.js +88 -19
- package/dest/storage/tagging_store/sender_address_book_store.d.ts +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_address_book_store.js +20 -14
- package/dest/storage/tagging_store/sender_tagging_store.d.ts +19 -9
- package/dest/storage/tagging_store/sender_tagging_store.d.ts.map +1 -1
- package/dest/storage/tagging_store/sender_tagging_store.js +253 -101
- package/dest/tagging/constants.d.ts +2 -0
- package/dest/tagging/constants.d.ts.map +1 -0
- package/dest/tagging/constants.js +10 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts +24 -0
- package/dest/tagging/get_all_logs_by_tags.d.ts.map +1 -0
- package/dest/tagging/get_all_logs_by_tags.js +46 -0
- package/dest/tagging/index.d.ts +3 -2
- package/dest/tagging/index.d.ts.map +1 -1
- package/dest/tagging/index.js +2 -10
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts +3 -2
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.js +8 -8
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts +3 -2
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.d.ts.map +1 -1
- package/dest/tagging/recipient_sync/utils/load_logs_for_range.js +5 -2
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts +3 -2
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/sync_sender_tagging_indexes.js +8 -8
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/get_status_change_of_pending.js +5 -8
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts +5 -2
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.d.ts.map +1 -1
- package/dest/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.js +10 -5
- package/package.json +18 -18
- package/src/bin/check_oracle_version.ts +1 -0
- package/src/block_synchronizer/block_synchronizer.ts +87 -32
- package/src/config/index.ts +14 -0
- package/src/config/package_info.ts +1 -1
- package/src/contract_function_simulator/benchmarked_node.ts +103 -0
- package/src/contract_function_simulator/contract_function_simulator.ts +43 -32
- package/src/contract_function_simulator/execution_note_cache.ts +44 -25
- package/src/contract_function_simulator/index.ts +1 -1
- package/src/contract_function_simulator/noir-structs/event_validation_request.ts +5 -1
- package/src/contract_function_simulator/noir-structs/note_validation_request.ts +1 -1
- package/src/contract_function_simulator/noir-structs/utility_context.ts +6 -25
- package/src/contract_function_simulator/oracle/interfaces.ts +20 -10
- package/src/contract_function_simulator/oracle/note_packing_utils.ts +10 -10
- package/src/contract_function_simulator/oracle/oracle.ts +65 -40
- package/src/contract_function_simulator/oracle/private_execution.ts +1 -69
- package/src/contract_function_simulator/oracle/private_execution_oracle.ts +39 -48
- package/src/contract_function_simulator/oracle/utility_execution_oracle.ts +102 -82
- package/src/contract_sync/index.ts +98 -0
- package/src/debug/pxe_debug_utils.ts +26 -11
- package/src/entrypoints/client/bundle/utils.ts +15 -16
- package/src/entrypoints/client/lazy/utils.ts +16 -17
- package/src/entrypoints/pxe_creation_options.ts +4 -2
- package/src/entrypoints/server/index.ts +2 -0
- package/src/entrypoints/server/utils.ts +26 -34
- package/src/events/event_service.ts +19 -25
- package/src/events/private_event_filter_validator.ts +3 -5
- package/src/job_coordinator/job_coordinator.ts +150 -0
- package/src/logs/log_service.ts +32 -14
- package/src/notes/note_service.ts +38 -43
- package/src/oracle_version.ts +4 -3
- package/src/private_kernel/hints/index.ts +1 -1
- package/src/private_kernel/hints/{build_private_kernel_reset_private_inputs.ts → private_kernel_reset_private_inputs_builder.ts} +33 -22
- package/src/private_kernel/private_kernel_execution_prover.ts +9 -8
- package/src/private_kernel/private_kernel_oracle.ts +116 -36
- package/src/pxe.ts +135 -131
- package/src/storage/address_store/address_store.ts +15 -15
- package/src/storage/anchor_block_store/anchor_block_store.ts +8 -0
- package/src/storage/capsule_store/capsule_store.ts +159 -23
- package/src/storage/contract_store/contract_store.ts +22 -31
- package/src/storage/metadata.ts +1 -1
- package/src/storage/note_store/note_store.ts +317 -318
- package/src/storage/note_store/stored_note.ts +48 -0
- package/src/storage/private_event_store/private_event_store.ts +301 -79
- package/src/storage/private_event_store/stored_private_event.ts +73 -0
- package/src/storage/tagging_store/recipient_tagging_store.ts +106 -20
- package/src/storage/tagging_store/sender_address_book_store.ts +20 -14
- package/src/storage/tagging_store/sender_tagging_store.ts +294 -109
- package/src/tagging/constants.ts +10 -0
- package/src/tagging/get_all_logs_by_tags.ts +68 -0
- package/src/tagging/index.ts +2 -11
- package/src/tagging/recipient_sync/load_private_logs_for_sender_recipient_pair.ts +21 -7
- package/src/tagging/recipient_sync/utils/load_logs_for_range.ts +7 -1
- package/src/tagging/sender_sync/sync_sender_tagging_indexes.ts +10 -7
- package/src/tagging/sender_sync/utils/get_status_change_of_pending.ts +5 -13
- package/src/tagging/sender_sync/utils/load_and_store_new_tagging_indexes.ts +16 -4
- package/dest/contract_function_simulator/proxied_node.d.ts +0 -9
- package/dest/contract_function_simulator/proxied_node.d.ts.map +0 -1
- package/dest/contract_function_simulator/proxied_node.js +0 -27
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts +0 -28
- package/dest/private_kernel/hints/build_private_kernel_reset_private_inputs.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts +0 -46
- package/dest/private_kernel/private_kernel_oracle_impl.d.ts.map +0 -1
- package/dest/private_kernel/private_kernel_oracle_impl.js +0 -86
- package/dest/public_storage/public_storage_service.d.ts +0 -24
- package/dest/public_storage/public_storage_service.d.ts.map +0 -1
- package/dest/public_storage/public_storage_service.js +0 -26
- package/dest/tree_membership/tree_membership_service.d.ts +0 -52
- package/dest/tree_membership/tree_membership_service.d.ts.map +0 -1
- package/dest/tree_membership/tree_membership_service.js +0 -84
- package/src/contract_function_simulator/proxied_node.ts +0 -33
- package/src/private_kernel/private_kernel_oracle_impl.ts +0 -133
- package/src/public_storage/public_storage_service.ts +0 -33
- package/src/tree_membership/tree_membership_service.ts +0 -112
|
@@ -18,27 +18,27 @@ function fromRawData(nonzeroNoteHashCounter: boolean, maybeNoteNonce: Fr): { sta
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
/**
|
|
21
|
-
* Packs a note in a format that is compatible with the default Packable implementation of the
|
|
21
|
+
* Packs a note in a format that is compatible with the default Packable implementation of the hinted note.
|
|
22
22
|
*
|
|
23
23
|
* @dev Unlike the default Packable implementation, this function first constructs the note metadata from the inputs
|
|
24
|
-
* and only after that it packs the
|
|
24
|
+
* and only after that it packs the hinted note. Hence it doesn't map one to one with `HintedNote::pack()`.
|
|
25
25
|
*
|
|
26
26
|
* @param contractAddress - The address of the contract that owns the note
|
|
27
27
|
* @param owner - The owner of the note
|
|
28
28
|
* @param randomness - The randomness injected into the note to get the hiding property of commitments
|
|
29
29
|
* @param storageSlot - The storage slot of the note
|
|
30
30
|
* @param noteNonce - The nonce injected into the note hash preimage by kernels.
|
|
31
|
-
* @param
|
|
31
|
+
* @param isPending - True if the note is pending, false if settled
|
|
32
32
|
* @param note - The note content containing the actual note data
|
|
33
33
|
* @returns The packed note as an array of field elements
|
|
34
34
|
*/
|
|
35
|
-
export function
|
|
35
|
+
export function packAsHintedNote({
|
|
36
36
|
contractAddress,
|
|
37
37
|
owner,
|
|
38
38
|
randomness,
|
|
39
39
|
storageSlot,
|
|
40
40
|
noteNonce,
|
|
41
|
-
|
|
41
|
+
isPending,
|
|
42
42
|
note,
|
|
43
43
|
}: {
|
|
44
44
|
contractAddress: AztecAddress;
|
|
@@ -46,14 +46,14 @@ export function packAsRetrievedNote({
|
|
|
46
46
|
randomness: Fr;
|
|
47
47
|
storageSlot: Fr;
|
|
48
48
|
noteNonce: Fr;
|
|
49
|
-
|
|
49
|
+
isPending: boolean;
|
|
50
50
|
note: Note;
|
|
51
51
|
}) {
|
|
52
|
-
// If
|
|
53
|
-
const
|
|
52
|
+
// If the note is pending it means it has a non-zero note hash counter associated with it.
|
|
53
|
+
const nonZeroNoteHashCounter = isPending;
|
|
54
54
|
|
|
55
|
-
// To pack the note as
|
|
56
|
-
const noteMetadata = fromRawData(
|
|
55
|
+
// To pack the note as hinted note we first need to reconstruct the note metadata.
|
|
56
|
+
const noteMetadata = fromRawData(nonZeroNoteHashCounter, noteNonce);
|
|
57
57
|
|
|
58
58
|
// Pack in order: note, contract_address, owner, randomness, storage_slot, metadata (stage, maybe_note_nonce)
|
|
59
59
|
return [
|
|
@@ -12,11 +12,11 @@ import {
|
|
|
12
12
|
} from '@aztec/simulator/client';
|
|
13
13
|
import { FunctionSelector, NoteSelector } from '@aztec/stdlib/abi';
|
|
14
14
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
15
|
+
import { BlockHash } from '@aztec/stdlib/block';
|
|
15
16
|
import { ContractClassLog, ContractClassLogFields } from '@aztec/stdlib/logs';
|
|
16
|
-
import { MerkleTreeId } from '@aztec/stdlib/trees';
|
|
17
17
|
|
|
18
18
|
import type { IMiscOracle, IPrivateExecutionOracle, IUtilityExecutionOracle } from './interfaces.js';
|
|
19
|
-
import {
|
|
19
|
+
import { packAsHintedNote } from './note_packing_utils.js';
|
|
20
20
|
|
|
21
21
|
export class UnavailableOracleError extends Error {
|
|
22
22
|
constructor(oracleName: string) {
|
|
@@ -137,77 +137,94 @@ export class Oracle {
|
|
|
137
137
|
].map(toACVMField);
|
|
138
138
|
}
|
|
139
139
|
|
|
140
|
-
async
|
|
141
|
-
[
|
|
142
|
-
[
|
|
143
|
-
[leafValue]: ACVMField[],
|
|
140
|
+
async utilityGetNoteHashMembershipWitness(
|
|
141
|
+
[anchorBlockHash]: ACVMField[],
|
|
142
|
+
[noteHash]: ACVMField[],
|
|
144
143
|
): Promise<(ACVMField | ACVMField[])[]> {
|
|
145
|
-
const
|
|
146
|
-
const
|
|
147
|
-
const parsedLeafValue = Fr.fromString(leafValue);
|
|
144
|
+
const parsedAnchorBlockHash = BlockHash.fromString(anchorBlockHash);
|
|
145
|
+
const parsedNoteHash = Fr.fromString(noteHash);
|
|
148
146
|
|
|
149
|
-
const witness = await this.handlerAsUtility().
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
parsedLeafValue,
|
|
147
|
+
const witness = await this.handlerAsUtility().utilityGetNoteHashMembershipWitness(
|
|
148
|
+
parsedAnchorBlockHash,
|
|
149
|
+
parsedNoteHash,
|
|
153
150
|
);
|
|
154
151
|
if (!witness) {
|
|
155
152
|
throw new Error(
|
|
156
|
-
`
|
|
153
|
+
`Note hash ${noteHash} not found in the note hash tree at anchor block hash ${parsedAnchorBlockHash.toString()}.`,
|
|
157
154
|
);
|
|
158
155
|
}
|
|
159
|
-
return
|
|
156
|
+
return witness.toNoirRepresentation();
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
async utilityGetBlockHashMembershipWitness(
|
|
160
|
+
[anchorBlockHash]: ACVMField[],
|
|
161
|
+
[blockHash]: ACVMField[],
|
|
162
|
+
): Promise<(ACVMField | ACVMField[])[]> {
|
|
163
|
+
const parsedAnchorBlockHash = BlockHash.fromString(anchorBlockHash);
|
|
164
|
+
const parsedBlockHash = BlockHash.fromString(blockHash);
|
|
165
|
+
|
|
166
|
+
const witness = await this.handlerAsUtility().utilityGetBlockHashMembershipWitness(
|
|
167
|
+
parsedAnchorBlockHash,
|
|
168
|
+
parsedBlockHash,
|
|
169
|
+
);
|
|
170
|
+
if (!witness) {
|
|
171
|
+
throw new Error(
|
|
172
|
+
`Block hash ${parsedBlockHash.toString()} not found in the archive tree at anchor block ${parsedAnchorBlockHash.toString()}.`,
|
|
173
|
+
);
|
|
174
|
+
}
|
|
175
|
+
return witness.toNoirRepresentation();
|
|
160
176
|
}
|
|
161
177
|
|
|
162
178
|
async utilityGetNullifierMembershipWitness(
|
|
163
|
-
[
|
|
179
|
+
[blockHash]: ACVMField[],
|
|
164
180
|
[nullifier]: ACVMField[], // nullifier, we try to find the witness for (to prove inclusion)
|
|
165
181
|
): Promise<(ACVMField | ACVMField[])[]> {
|
|
166
|
-
const
|
|
182
|
+
const parsedBlockHash = BlockHash.fromString(blockHash);
|
|
167
183
|
const parsedNullifier = Fr.fromString(nullifier);
|
|
168
184
|
|
|
169
185
|
const witness = await this.handlerAsUtility().utilityGetNullifierMembershipWitness(
|
|
170
|
-
|
|
186
|
+
parsedBlockHash,
|
|
171
187
|
parsedNullifier,
|
|
172
188
|
);
|
|
173
189
|
if (!witness) {
|
|
174
|
-
throw new Error(
|
|
190
|
+
throw new Error(
|
|
191
|
+
`Nullifier witness not found for nullifier ${parsedNullifier} at block hash ${parsedBlockHash.toString()}.`,
|
|
192
|
+
);
|
|
175
193
|
}
|
|
176
194
|
return witness.toNoirRepresentation();
|
|
177
195
|
}
|
|
178
196
|
|
|
179
197
|
async utilityGetLowNullifierMembershipWitness(
|
|
180
|
-
[
|
|
198
|
+
[blockHash]: ACVMField[],
|
|
181
199
|
[nullifier]: ACVMField[], // nullifier, we try to find the low nullifier witness for (to prove non-inclusion)
|
|
182
200
|
): Promise<(ACVMField | ACVMField[])[]> {
|
|
183
|
-
const
|
|
201
|
+
const parsedBlockHash = BlockHash.fromString(blockHash);
|
|
184
202
|
const parsedNullifier = Fr.fromString(nullifier);
|
|
185
203
|
|
|
186
204
|
const witness = await this.handlerAsUtility().utilityGetLowNullifierMembershipWitness(
|
|
187
|
-
|
|
205
|
+
parsedBlockHash,
|
|
188
206
|
parsedNullifier,
|
|
189
207
|
);
|
|
190
208
|
if (!witness) {
|
|
191
209
|
throw new Error(
|
|
192
|
-
`Low nullifier witness not found for nullifier ${parsedNullifier} at block ${
|
|
210
|
+
`Low nullifier witness not found for nullifier ${parsedNullifier} at block hash ${parsedBlockHash.toString()}.`,
|
|
193
211
|
);
|
|
194
212
|
}
|
|
195
213
|
return witness.toNoirRepresentation();
|
|
196
214
|
}
|
|
197
215
|
|
|
198
216
|
async utilityGetPublicDataWitness(
|
|
199
|
-
[
|
|
217
|
+
[blockHash]: ACVMField[],
|
|
200
218
|
[leafSlot]: ACVMField[],
|
|
201
219
|
): Promise<(ACVMField | ACVMField[])[]> {
|
|
202
|
-
const
|
|
220
|
+
const parsedBlockHash = BlockHash.fromString(blockHash);
|
|
203
221
|
const parsedLeafSlot = Fr.fromString(leafSlot);
|
|
204
222
|
|
|
205
|
-
const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(
|
|
206
|
-
BlockNumber(parsedBlockNumber),
|
|
207
|
-
parsedLeafSlot,
|
|
208
|
-
);
|
|
223
|
+
const witness = await this.handlerAsUtility().utilityGetPublicDataWitness(parsedBlockHash, parsedLeafSlot);
|
|
209
224
|
if (!witness) {
|
|
210
|
-
throw new Error(
|
|
225
|
+
throw new Error(
|
|
226
|
+
`Public data witness not found for slot ${parsedLeafSlot} at block hash ${parsedBlockHash.toString()}.`,
|
|
227
|
+
);
|
|
211
228
|
}
|
|
212
229
|
return witness.toNoirRepresentation();
|
|
213
230
|
}
|
|
@@ -257,7 +274,7 @@ export class Oracle {
|
|
|
257
274
|
[offset]: ACVMField[],
|
|
258
275
|
[status]: ACVMField[],
|
|
259
276
|
[maxNotes]: ACVMField[],
|
|
260
|
-
[
|
|
277
|
+
[packedHintedNoteLength]: ACVMField[],
|
|
261
278
|
): Promise<(ACVMField | ACVMField[])[]> {
|
|
262
279
|
// Parse Option<AztecAddress>: ownerSome is 0 for None, 1 for Some
|
|
263
280
|
const owner = Fr.fromString(ownerSome).toNumber() === 1 ? AztecAddress.fromString(ownerValue) : undefined;
|
|
@@ -279,25 +296,25 @@ export class Oracle {
|
|
|
279
296
|
+status,
|
|
280
297
|
);
|
|
281
298
|
|
|
282
|
-
const
|
|
283
|
-
|
|
299
|
+
const returnDataAsArrayOfPackedHintedNotes = noteDatas.map(noteData =>
|
|
300
|
+
packAsHintedNote({
|
|
284
301
|
contractAddress: noteData.contractAddress,
|
|
285
302
|
owner: noteData.owner,
|
|
286
303
|
randomness: noteData.randomness,
|
|
287
304
|
storageSlot: noteData.storageSlot,
|
|
288
305
|
noteNonce: noteData.noteNonce,
|
|
289
|
-
|
|
306
|
+
isPending: noteData.isPending,
|
|
290
307
|
note: noteData.note,
|
|
291
308
|
}),
|
|
292
309
|
);
|
|
293
310
|
|
|
294
311
|
// Now we convert each sub-array to an array of ACVMField
|
|
295
|
-
const returnDataAsArrayOfACVMFieldArrays =
|
|
312
|
+
const returnDataAsArrayOfACVMFieldArrays = returnDataAsArrayOfPackedHintedNotes.map(subArray =>
|
|
296
313
|
subArray.map(toACVMField),
|
|
297
314
|
);
|
|
298
315
|
|
|
299
316
|
// At last we convert the array of arrays to a bounded vec of arrays
|
|
300
|
-
return arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfACVMFieldArrays, +maxNotes, +
|
|
317
|
+
return arrayOfArraysToBoundedVecOfArrays(returnDataAsArrayOfACVMFieldArrays, +maxNotes, +packedHintedNoteLength);
|
|
301
318
|
}
|
|
302
319
|
|
|
303
320
|
privateNotifyCreatedNote(
|
|
@@ -339,6 +356,14 @@ export class Oracle {
|
|
|
339
356
|
return [];
|
|
340
357
|
}
|
|
341
358
|
|
|
359
|
+
async privateIsNullifierPending([innerNullifier]: ACVMField[], [contractAddress]: ACVMField[]): Promise<ACVMField[]> {
|
|
360
|
+
const isPending = await this.handlerAsPrivate().privateIsNullifierPending(
|
|
361
|
+
Fr.fromString(innerNullifier),
|
|
362
|
+
AztecAddress.fromString(contractAddress),
|
|
363
|
+
);
|
|
364
|
+
return [toACVMField(isPending)];
|
|
365
|
+
}
|
|
366
|
+
|
|
342
367
|
async utilityCheckNullifierExists([innerNullifier]: ACVMField[]): Promise<ACVMField[]> {
|
|
343
368
|
const exists = await this.handlerAsUtility().utilityCheckNullifierExists(Fr.fromString(innerNullifier));
|
|
344
369
|
return [toACVMField(exists)];
|
|
@@ -358,15 +383,15 @@ export class Oracle {
|
|
|
358
383
|
}
|
|
359
384
|
|
|
360
385
|
async utilityStorageRead(
|
|
386
|
+
[blockHash]: ACVMField[],
|
|
361
387
|
[contractAddress]: ACVMField[],
|
|
362
388
|
[startStorageSlot]: ACVMField[],
|
|
363
|
-
[blockNumber]: ACVMField[],
|
|
364
389
|
[numberOfElements]: ACVMField[],
|
|
365
390
|
): Promise<ACVMField[][]> {
|
|
366
391
|
const values = await this.handlerAsUtility().utilityStorageRead(
|
|
392
|
+
BlockHash.fromString(blockHash),
|
|
367
393
|
new AztecAddress(Fr.fromString(contractAddress)),
|
|
368
394
|
Fr.fromString(startStorageSlot),
|
|
369
|
-
BlockNumber(+blockNumber),
|
|
370
395
|
+numberOfElements,
|
|
371
396
|
);
|
|
372
397
|
return [values.map(toACVMField)];
|
|
@@ -476,12 +501,12 @@ export class Oracle {
|
|
|
476
501
|
return [];
|
|
477
502
|
}
|
|
478
503
|
|
|
479
|
-
async
|
|
504
|
+
async utilityValidateAndStoreEnqueuedNotesAndEvents(
|
|
480
505
|
[contractAddress]: ACVMField[],
|
|
481
506
|
[noteValidationRequestsArrayBaseSlot]: ACVMField[],
|
|
482
507
|
[eventValidationRequestsArrayBaseSlot]: ACVMField[],
|
|
483
508
|
): Promise<ACVMField[]> {
|
|
484
|
-
await this.handlerAsUtility().
|
|
509
|
+
await this.handlerAsUtility().utilityValidateAndStoreEnqueuedNotesAndEvents(
|
|
485
510
|
AztecAddress.fromString(contractAddress),
|
|
486
511
|
Fr.fromString(noteValidationRequestsArrayBaseSlot),
|
|
487
512
|
Fr.fromString(eventValidationRequestsArrayBaseSlot),
|
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
import { PRIVATE_CIRCUIT_PUBLIC_INPUTS_LENGTH, PRIVATE_CONTEXT_INPUTS_LENGTH } from '@aztec/constants';
|
|
2
|
-
import { BlockNumber } from '@aztec/foundation/branded-types';
|
|
3
2
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
3
|
import { createLogger } from '@aztec/foundation/log';
|
|
5
4
|
import { Timer } from '@aztec/foundation/timer';
|
|
6
|
-
import { ProtocolContractAddress } from '@aztec/protocol-contracts';
|
|
7
5
|
import {
|
|
8
6
|
type ACVMWitness,
|
|
9
7
|
type CircuitSimulator,
|
|
@@ -19,15 +17,10 @@ import {
|
|
|
19
17
|
countArgumentsSize,
|
|
20
18
|
} from '@aztec/stdlib/abi';
|
|
21
19
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
22
|
-
import type { ContractInstance } from '@aztec/stdlib/contract';
|
|
23
|
-
import { DelayedPublicMutableValues, DelayedPublicMutableValuesWithHash } from '@aztec/stdlib/delayed-public-mutable';
|
|
24
|
-
import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
25
20
|
import { PrivateCircuitPublicInputs } from '@aztec/stdlib/kernel';
|
|
26
21
|
import type { CircuitWitnessGenerationStats } from '@aztec/stdlib/stats';
|
|
27
|
-
import {
|
|
28
|
-
import type { UInt64 } from '@aztec/stdlib/types';
|
|
22
|
+
import { PrivateCallExecutionResult } from '@aztec/stdlib/tx';
|
|
29
23
|
|
|
30
|
-
import { ContractStore } from '../../storage/contract_store/index.js';
|
|
31
24
|
import { Oracle } from './oracle.js';
|
|
32
25
|
import type { PrivateExecutionOracle } from './private_execution_oracle.js';
|
|
33
26
|
|
|
@@ -85,7 +78,6 @@ export async function executePrivateFunction(
|
|
|
85
78
|
|
|
86
79
|
const rawReturnValues = await privateExecutionOracle.privateLoadFromExecutionCache(publicInputs.returnsHash);
|
|
87
80
|
|
|
88
|
-
const noteHashLeafIndexMap = privateExecutionOracle.getNoteHashLeafIndexMap();
|
|
89
81
|
const newNotes = privateExecutionOracle.getNewNotes();
|
|
90
82
|
const noteHashNullifierCounterMap = privateExecutionOracle.getNoteHashNullifierCounterMap();
|
|
91
83
|
const offchainEffects = privateExecutionOracle.getOffchainEffects();
|
|
@@ -108,7 +100,6 @@ export async function executePrivateFunction(
|
|
|
108
100
|
Buffer.from(artifact.verificationKey!, 'base64'),
|
|
109
101
|
partialWitness,
|
|
110
102
|
publicInputs,
|
|
111
|
-
noteHashLeafIndexMap,
|
|
112
103
|
newNotes,
|
|
113
104
|
noteHashNullifierCounterMap,
|
|
114
105
|
rawReturnValues,
|
|
@@ -148,62 +139,3 @@ export function extractPrivateCircuitPublicInputs(
|
|
|
148
139
|
}
|
|
149
140
|
return PrivateCircuitPublicInputs.fromFields(returnData);
|
|
150
141
|
}
|
|
151
|
-
|
|
152
|
-
/**
|
|
153
|
-
* Read the current class id of a contract from the execution data provider or AztecNode. If not found, class id
|
|
154
|
-
* from the instance is used.
|
|
155
|
-
* @param contractAddress - The address of the contract to read the class id for.
|
|
156
|
-
* @param instance - The instance of the contract.
|
|
157
|
-
* @param executionStore - The execution data provider.
|
|
158
|
-
* @param blockNumber - The block number at which to load the DelayedPublicMutable storing the class id.
|
|
159
|
-
* @param timestamp - The timestamp at which to obtain the class id from the DelayedPublicMutable.
|
|
160
|
-
* @returns The current class id.
|
|
161
|
-
*/
|
|
162
|
-
export async function readCurrentClassId(
|
|
163
|
-
contractAddress: AztecAddress,
|
|
164
|
-
instance: ContractInstance,
|
|
165
|
-
aztecNode: AztecNode,
|
|
166
|
-
blockNumber: BlockNumber,
|
|
167
|
-
timestamp: UInt64,
|
|
168
|
-
) {
|
|
169
|
-
const { delayedPublicMutableSlot } = await DelayedPublicMutableValuesWithHash.getContractUpdateSlots(contractAddress);
|
|
170
|
-
const delayedPublicMutableValues = await DelayedPublicMutableValues.readFromTree(delayedPublicMutableSlot, slot =>
|
|
171
|
-
aztecNode.getPublicStorageAt(blockNumber, ProtocolContractAddress.ContractInstanceRegistry, slot),
|
|
172
|
-
);
|
|
173
|
-
let currentClassId = delayedPublicMutableValues.svc.getCurrentAt(timestamp)[0];
|
|
174
|
-
if (currentClassId.isZero()) {
|
|
175
|
-
currentClassId = instance.originalContractClassId;
|
|
176
|
-
}
|
|
177
|
-
return currentClassId;
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* Verify that the current class id of a contract obtained from AztecNode is the same as the one in contract data
|
|
182
|
-
* provider (i.e. PXE's own storage).
|
|
183
|
-
* @param header - The header of the block at which to verify the current class id. If not provided, the anchor block
|
|
184
|
-
* header of the execution data provider is used.
|
|
185
|
-
*/
|
|
186
|
-
export async function verifyCurrentClassId(
|
|
187
|
-
contractAddress: AztecAddress,
|
|
188
|
-
aztecNode: AztecNode,
|
|
189
|
-
contractStore: ContractStore,
|
|
190
|
-
header: BlockHeader,
|
|
191
|
-
) {
|
|
192
|
-
const instance = await contractStore.getContractInstance(contractAddress);
|
|
193
|
-
if (!instance) {
|
|
194
|
-
throw new Error(`No contract instance found for address ${contractAddress.toString()}`);
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
const currentClassId = await readCurrentClassId(
|
|
198
|
-
contractAddress,
|
|
199
|
-
instance,
|
|
200
|
-
aztecNode,
|
|
201
|
-
header.globalVariables.blockNumber,
|
|
202
|
-
header.globalVariables.timestamp,
|
|
203
|
-
);
|
|
204
|
-
if (!instance.currentContractClassId.equals(currentClassId)) {
|
|
205
|
-
throw new Error(
|
|
206
|
-
`Contract ${contractAddress} is outdated, current class id is ${currentClassId}, local class id is ${instance.currentContractClassId}`,
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
|
-
}
|
|
@@ -14,7 +14,7 @@ import {
|
|
|
14
14
|
} from '@aztec/stdlib/abi';
|
|
15
15
|
import type { AuthWitness } from '@aztec/stdlib/auth-witness';
|
|
16
16
|
import { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
17
|
-
import {
|
|
17
|
+
import { siloNullifier } from '@aztec/stdlib/hash';
|
|
18
18
|
import type { AztecNode } from '@aztec/stdlib/interfaces/client';
|
|
19
19
|
import { PrivateContextInputs } from '@aztec/stdlib/kernel';
|
|
20
20
|
import { type ContractClassLog, DirectionalAppTaggingSecret, type PreTag } from '@aztec/stdlib/logs';
|
|
@@ -30,9 +30,9 @@ import {
|
|
|
30
30
|
type TxContext,
|
|
31
31
|
} from '@aztec/stdlib/tx';
|
|
32
32
|
|
|
33
|
+
import { ensureContractSynced } from '../../contract_sync/index.js';
|
|
33
34
|
import { NoteService } from '../../notes/note_service.js';
|
|
34
35
|
import type { AddressStore } from '../../storage/address_store/address_store.js';
|
|
35
|
-
import type { AnchorBlockStore } from '../../storage/anchor_block_store/anchor_block_store.js';
|
|
36
36
|
import type { CapsuleStore } from '../../storage/capsule_store/capsule_store.js';
|
|
37
37
|
import type { ContractStore } from '../../storage/contract_store/contract_store.js';
|
|
38
38
|
import type { NoteStore } from '../../storage/note_store/note_store.js';
|
|
@@ -46,7 +46,7 @@ import { ExecutionTaggingIndexCache } from '../execution_tagging_index_cache.js'
|
|
|
46
46
|
import type { HashedValuesCache } from '../hashed_values_cache.js';
|
|
47
47
|
import { pickNotes } from '../pick_notes.js';
|
|
48
48
|
import type { IPrivateExecutionOracle, NoteData } from './interfaces.js';
|
|
49
|
-
import { executePrivateFunction
|
|
49
|
+
import { executePrivateFunction } from './private_execution.js';
|
|
50
50
|
import { UtilityExecutionOracle } from './utility_execution_oracle.js';
|
|
51
51
|
|
|
52
52
|
/**
|
|
@@ -64,16 +64,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
64
64
|
* Users can also use this to get a clearer idea of what's happened during a simulation.
|
|
65
65
|
*/
|
|
66
66
|
private newNotes: NoteAndSlot[] = [];
|
|
67
|
-
/**
|
|
68
|
-
* Notes from previous transactions that are returned to the oracle call `getNotes` during this execution.
|
|
69
|
-
* The mapping maps from the unique siloed note hash to the index for notes created in private executions.
|
|
70
|
-
* It maps from siloed note hash to the index for notes created by public functions.
|
|
71
|
-
*
|
|
72
|
-
* They are not part of the ExecutionNoteCache and being forwarded to nested contexts via `extend()`
|
|
73
|
-
* because these notes are meant to be maintained on a per-call basis
|
|
74
|
-
* They should act as references for the read requests output by an app circuit via public inputs.
|
|
75
|
-
*/
|
|
76
|
-
private noteHashLeafIndexMap: Map<bigint, bigint> = new Map();
|
|
77
67
|
private noteHashNullifierCounterMap: Map<number, number> = new Map();
|
|
78
68
|
private contractClassLogs: CountedContractClassLog[] = [];
|
|
79
69
|
private offchainEffects: { data: Fr[] }[] = [];
|
|
@@ -98,12 +88,12 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
98
88
|
keyStore: KeyStore,
|
|
99
89
|
addressStore: AddressStore,
|
|
100
90
|
aztecNode: AztecNode,
|
|
101
|
-
anchorBlockStore: AnchorBlockStore,
|
|
102
91
|
private readonly senderTaggingStore: SenderTaggingStore,
|
|
103
92
|
recipientTaggingStore: RecipientTaggingStore,
|
|
104
93
|
senderAddressBookStore: SenderAddressBookStore,
|
|
105
94
|
capsuleStore: CapsuleStore,
|
|
106
95
|
privateEventStore: PrivateEventStore,
|
|
96
|
+
jobId: string,
|
|
107
97
|
private totalPublicCalldataCount: number = 0,
|
|
108
98
|
protected sideEffectCounter: number = 0,
|
|
109
99
|
log = createLogger('simulator:client_execution_context'),
|
|
@@ -121,11 +111,11 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
121
111
|
keyStore,
|
|
122
112
|
addressStore,
|
|
123
113
|
aztecNode,
|
|
124
|
-
anchorBlockStore,
|
|
125
114
|
recipientTaggingStore,
|
|
126
115
|
senderAddressBookStore,
|
|
127
116
|
capsuleStore,
|
|
128
117
|
privateEventStore,
|
|
118
|
+
jobId,
|
|
129
119
|
log,
|
|
130
120
|
scopes,
|
|
131
121
|
);
|
|
@@ -160,14 +150,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
160
150
|
return toACVMWitness(0, fields);
|
|
161
151
|
}
|
|
162
152
|
|
|
163
|
-
/**
|
|
164
|
-
* The KernelProver will use this to fully populate witnesses and provide hints to the kernel circuit
|
|
165
|
-
* regarding which note hash each settled read request corresponds to.
|
|
166
|
-
*/
|
|
167
|
-
public getNoteHashLeafIndexMap() {
|
|
168
|
-
return this.noteHashLeafIndexMap;
|
|
169
|
-
}
|
|
170
|
-
|
|
171
153
|
/**
|
|
172
154
|
* Get the data for the newly created notes.
|
|
173
155
|
*/
|
|
@@ -281,9 +263,16 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
281
263
|
// This is a tagging secret we've not yet used in this tx, so first sync our store to make sure its indices
|
|
282
264
|
// are up to date. We do this here because this store is not synced as part of the global sync because
|
|
283
265
|
// that'd be wasteful as most tagging secrets are not used in each tx.
|
|
284
|
-
await syncSenderTaggingIndexes(
|
|
285
|
-
|
|
286
|
-
|
|
266
|
+
await syncSenderTaggingIndexes(
|
|
267
|
+
secret,
|
|
268
|
+
this.contractAddress,
|
|
269
|
+
this.aztecNode,
|
|
270
|
+
this.senderTaggingStore,
|
|
271
|
+
await this.anchorBlockHeader.hash(),
|
|
272
|
+
this.jobId,
|
|
273
|
+
);
|
|
274
|
+
|
|
275
|
+
const lastUsedIndex = await this.senderTaggingStore.getLastUsedIndex(secret, this.jobId);
|
|
287
276
|
// If lastUsedIndex is undefined, we've never used this secret, so start from 0
|
|
288
277
|
// Otherwise, the next index to use is one past the last used index
|
|
289
278
|
return lastUsedIndex === undefined ? 0 : lastUsedIndex + 1;
|
|
@@ -372,7 +361,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
372
361
|
|
|
373
362
|
const pendingNullifiers = this.noteCache.getNullifiers(this.callContext.contractAddress);
|
|
374
363
|
|
|
375
|
-
const noteService = new NoteService(this.noteStore, this.aztecNode, this.
|
|
364
|
+
const noteService = new NoteService(this.noteStore, this.aztecNode, this.anchorBlockHeader, this.jobId);
|
|
376
365
|
const dbNotes = await noteService.getNotes(
|
|
377
366
|
this.callContext.contractAddress,
|
|
378
367
|
owner,
|
|
@@ -402,23 +391,6 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
402
391
|
.join(', ')}`,
|
|
403
392
|
);
|
|
404
393
|
|
|
405
|
-
const noteHashesAndIndexes = await Promise.all(
|
|
406
|
-
notes.map(async n => {
|
|
407
|
-
if (n.index !== undefined) {
|
|
408
|
-
const siloedNoteHash = await siloNoteHash(n.contractAddress, n.noteHash);
|
|
409
|
-
const uniqueNoteHash = await computeUniqueNoteHash(n.noteNonce, siloedNoteHash);
|
|
410
|
-
|
|
411
|
-
return { hash: uniqueNoteHash, index: n.index };
|
|
412
|
-
}
|
|
413
|
-
}),
|
|
414
|
-
);
|
|
415
|
-
|
|
416
|
-
noteHashesAndIndexes
|
|
417
|
-
.filter(n => n !== undefined)
|
|
418
|
-
.forEach(n => {
|
|
419
|
-
this.noteHashLeafIndexMap.set(n!.hash.toBigInt(), n!.index);
|
|
420
|
-
});
|
|
421
|
-
|
|
422
394
|
return notes;
|
|
423
395
|
}
|
|
424
396
|
|
|
@@ -461,6 +433,7 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
461
433
|
note,
|
|
462
434
|
siloedNullifier: undefined, // Siloed nullifier cannot be known for newly created note.
|
|
463
435
|
noteHash,
|
|
436
|
+
isPending: true, // This note has just been created and hence is not settled yet.
|
|
464
437
|
},
|
|
465
438
|
counter,
|
|
466
439
|
);
|
|
@@ -495,6 +468,19 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
495
468
|
return this.noteCache.nullifierCreated(this.callContext.contractAddress, innerNullifier);
|
|
496
469
|
}
|
|
497
470
|
|
|
471
|
+
/**
|
|
472
|
+
* Check if a nullifier has been emitted in the same transaction, i.e. if privateNotifyCreatedNullifier has been
|
|
473
|
+
* called for this inner nullifier from the contract with the specified address.
|
|
474
|
+
* @param innerNullifier - The inner nullifier to check.
|
|
475
|
+
* @param contractAddress - Address of the contract that emitted the nullifier.
|
|
476
|
+
* @returns A boolean indicating whether the nullifier is pending or not.
|
|
477
|
+
*/
|
|
478
|
+
public async privateIsNullifierPending(innerNullifier: Fr, contractAddress: AztecAddress): Promise<boolean> {
|
|
479
|
+
const siloedNullifier = await siloNullifier(contractAddress, innerNullifier);
|
|
480
|
+
const isNullifierPending = this.noteCache.getNullifiers(contractAddress).has(siloedNullifier.toBigInt());
|
|
481
|
+
return Promise.resolve(isNullifierPending);
|
|
482
|
+
}
|
|
483
|
+
|
|
498
484
|
/**
|
|
499
485
|
* Emit a contract class log.
|
|
500
486
|
* This fn exists because we only carry a poseidon hash through the kernels, and need to
|
|
@@ -551,9 +537,14 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
551
537
|
|
|
552
538
|
isStaticCall = isStaticCall || this.callContext.isStaticCall;
|
|
553
539
|
|
|
554
|
-
await
|
|
555
|
-
|
|
556
|
-
|
|
540
|
+
await ensureContractSynced(
|
|
541
|
+
targetContractAddress,
|
|
542
|
+
functionSelector,
|
|
543
|
+
this.utilityExecutor,
|
|
544
|
+
this.aztecNode,
|
|
545
|
+
this.contractStore,
|
|
546
|
+
this.anchorBlockHeader,
|
|
547
|
+
);
|
|
557
548
|
|
|
558
549
|
const targetArtifact = await this.contractStore.getFunctionArtifactWithDebugMetadata(
|
|
559
550
|
targetContractAddress,
|
|
@@ -580,12 +571,12 @@ export class PrivateExecutionOracle extends UtilityExecutionOracle implements IP
|
|
|
580
571
|
this.keyStore,
|
|
581
572
|
this.addressStore,
|
|
582
573
|
this.aztecNode,
|
|
583
|
-
this.anchorBlockStore,
|
|
584
574
|
this.senderTaggingStore,
|
|
585
575
|
this.recipientTaggingStore,
|
|
586
576
|
this.senderAddressBookStore,
|
|
587
577
|
this.capsuleStore,
|
|
588
578
|
this.privateEventStore,
|
|
579
|
+
this.jobId,
|
|
589
580
|
this.totalPublicCalldataCount,
|
|
590
581
|
sideEffectCounter,
|
|
591
582
|
this.log,
|