@aztec/pxe 0.75.0-commit.c03ba01a2a4122e43e90d5133ba017e54b90e9d2 → 0.75.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/bin/index.d.ts +3 -0
- package/dest/bin/index.d.ts.map +1 -0
- package/dest/bin/index.js +5 -3
- package/dest/config/index.d.ts +46 -0
- package/dest/config/index.d.ts.map +1 -0
- package/dest/config/index.js +21 -18
- package/dest/config/package_info.d.ts +5 -0
- package/dest/config/package_info.d.ts.map +1 -0
- package/dest/config/package_info.js +2 -4
- package/dest/contract_data_oracle/index.d.ts +104 -0
- package/dest/contract_data_oracle/index.d.ts.map +1 -0
- package/dest/contract_data_oracle/index.js +79 -69
- package/dest/contract_data_oracle/private_functions_tree.d.ts +65 -0
- package/dest/contract_data_oracle/private_functions_tree.d.ts.map +1 -0
- package/dest/contract_data_oracle/private_functions_tree.js +50 -44
- package/dest/database/contracts/contract_artifact_db.d.ts +20 -0
- package/dest/database/contracts/contract_artifact_db.d.ts.map +1 -0
- package/dest/database/contracts/contract_artifact_db.js +2 -3
- package/dest/database/contracts/contract_instance_db.d.ts +19 -0
- package/dest/database/contracts/contract_instance_db.d.ts.map +1 -0
- package/dest/database/contracts/contract_instance_db.js +2 -3
- package/dest/database/index.d.ts +3 -0
- package/dest/database/index.d.ts.map +1 -0
- package/dest/database/index.js +1 -0
- package/dest/database/kv_pxe_database.d.ts +55 -0
- package/dest/database/kv_pxe_database.d.ts.map +1 -0
- package/dest/database/kv_pxe_database.js +259 -243
- package/dest/database/note_dao.d.ts +103 -0
- package/dest/database/note_dao.d.ts.map +1 -0
- package/dest/database/note_dao.js +43 -28
- package/dest/database/outgoing_note_dao.d.ts +73 -0
- package/dest/database/outgoing_note_dao.d.ts.map +1 -0
- package/dest/database/outgoing_note_dao.js +34 -20
- package/dest/database/pxe_database.d.ts +216 -0
- package/dest/database/pxe_database.d.ts.map +1 -0
- package/dest/database/pxe_database.js +2 -4
- package/dest/database/pxe_database_test_suite.d.ts +7 -0
- package/dest/database/pxe_database_test_suite.d.ts.map +1 -0
- package/dest/database/pxe_database_test_suite.js +151 -296
- package/dest/index.d.ts +15 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +1 -0
- package/dest/kernel_oracle/index.d.ts +34 -0
- package/dest/kernel_oracle/index.d.ts.map +1 -0
- package/dest/kernel_oracle/index.js +6 -9
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts +28 -0
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.d.ts.map +1 -0
- package/dest/kernel_prover/hints/build_private_kernel_reset_private_inputs.js +66 -68
- package/dest/kernel_prover/hints/index.d.ts +2 -0
- package/dest/kernel_prover/hints/index.d.ts.map +1 -0
- package/dest/kernel_prover/hints/index.js +1 -0
- package/dest/kernel_prover/index.d.ts +3 -0
- package/dest/kernel_prover/index.d.ts.map +1 -0
- package/dest/kernel_prover/index.js +1 -0
- package/dest/kernel_prover/kernel_prover.d.ts +38 -0
- package/dest/kernel_prover/kernel_prover.d.ts.map +1 -0
- package/dest/kernel_prover/kernel_prover.js +65 -60
- package/dest/kernel_prover/proving_data_oracle.d.ts +65 -0
- package/dest/kernel_prover/proving_data_oracle.d.ts.map +1 -0
- package/dest/kernel_prover/proving_data_oracle.js +2 -4
- package/dest/note_decryption_utils/add_public_values_to_payload.d.ts +10 -0
- package/dest/note_decryption_utils/add_public_values_to_payload.d.ts.map +1 -0
- package/dest/note_decryption_utils/add_public_values_to_payload.js +9 -8
- package/dest/pxe_http/index.d.ts +2 -0
- package/dest/pxe_http/index.d.ts.map +1 -0
- package/dest/pxe_http/index.js +1 -0
- package/dest/pxe_http/pxe_http_server.d.ts +16 -0
- package/dest/pxe_http/pxe_http_server.d.ts.map +1 -0
- package/dest/pxe_http/pxe_http_server.js +6 -8
- package/dest/pxe_service/error_enriching.d.ts +11 -0
- package/dest/pxe_service/error_enriching.d.ts.map +1 -0
- package/dest/pxe_service/error_enriching.js +13 -10
- package/dest/pxe_service/index.d.ts +4 -0
- package/dest/pxe_service/index.d.ts.map +1 -0
- package/dest/pxe_service/index.js +1 -0
- package/dest/pxe_service/pxe_service.d.ts +98 -0
- package/dest/pxe_service/pxe_service.d.ts.map +1 -0
- package/dest/pxe_service/pxe_service.js +290 -282
- package/dest/pxe_service/test/pxe_test_suite.d.ts +3 -0
- package/dest/pxe_service/test/pxe_test_suite.d.ts.map +1 -0
- package/dest/pxe_service/test/pxe_test_suite.js +27 -40
- package/dest/simulator/index.d.ts +10 -0
- package/dest/simulator/index.d.ts.map +1 -0
- package/dest/simulator/index.js +3 -1
- package/dest/simulator_oracle/index.d.ts +129 -0
- package/dest/simulator_oracle/index.d.ts.map +1 -0
- package/dest/simulator_oracle/index.js +231 -266
- package/dest/simulator_oracle/tagging_utils.d.ts +16 -0
- package/dest/simulator_oracle/tagging_utils.d.ts.map +1 -0
- package/dest/simulator_oracle/tagging_utils.js +6 -4
- package/dest/synchronizer/index.d.ts +2 -0
- package/dest/synchronizer/index.d.ts.map +1 -0
- package/dest/synchronizer/index.js +1 -0
- package/dest/synchronizer/synchronizer.d.ts +30 -0
- package/dest/synchronizer/synchronizer.d.ts.map +1 -0
- package/dest/synchronizer/synchronizer.js +42 -42
- package/dest/utils/create_pxe_service.d.ts +16 -0
- package/dest/utils/create_pxe_service.d.ts.map +1 -0
- package/dest/utils/create_pxe_service.js +9 -9
- package/package.json +15 -15
- package/src/pxe_service/pxe_service.ts +10 -5
|
@@ -1,5 +1,7 @@
|
|
|
1
|
+
var _KVPxeDatabase_instances, _KVPxeDatabase_synchronizedBlock, _KVPxeDatabase_completeAddresses, _KVPxeDatabase_completeAddressIndex, _KVPxeDatabase_addressBook, _KVPxeDatabase_authWitnesses, _KVPxeDatabase_capsules, _KVPxeDatabase_notes, _KVPxeDatabase_nullifiedNotes, _KVPxeDatabase_nullifierToNoteId, _KVPxeDatabase_nullifiersByBlockNumber, _KVPxeDatabase_nullifiedNotesToScope, _KVPxeDatabase_nullifiedNotesByContract, _KVPxeDatabase_nullifiedNotesByStorageSlot, _KVPxeDatabase_nullifiedNotesByTxHash, _KVPxeDatabase_nullifiedNotesByAddressPoint, _KVPxeDatabase_nullifiedNotesByNullifier, _KVPxeDatabase_contractArtifacts, _KVPxeDatabase_contractInstances, _KVPxeDatabase_db, _KVPxeDatabase_scopes, _KVPxeDatabase_notesToScope, _KVPxeDatabase_notesByContractAndScope, _KVPxeDatabase_notesByStorageSlotAndScope, _KVPxeDatabase_notesByTxHashAndScope, _KVPxeDatabase_notesByAddressPointAndScope, _KVPxeDatabase_taggingSecretIndexesForSenders, _KVPxeDatabase_taggingSecretIndexesForRecipients, _KVPxeDatabase_contractStore, _KVPxeDatabase_addScope, _KVPxeDatabase_getCompleteAddress, _KVPxeDatabase_setTaggingSecretsIndexes, _KVPxeDatabase_getTaggingSecretsIndexes;
|
|
2
|
+
import { __classPrivateFieldGet, __classPrivateFieldSet } from "tslib";
|
|
1
3
|
import { MerkleTreeId, NoteStatus } from '@aztec/circuit-types';
|
|
2
|
-
import { AztecAddress, BlockHeader, CompleteAddress, SerializableContractInstance } from '@aztec/circuits.js';
|
|
4
|
+
import { AztecAddress, BlockHeader, CompleteAddress, SerializableContractInstance, } from '@aztec/circuits.js';
|
|
3
5
|
import { FunctionSelector, FunctionType } from '@aztec/foundation/abi';
|
|
4
6
|
import { toBufferBE } from '@aztec/foundation/bigint-buffer';
|
|
5
7
|
import { Fr } from '@aztec/foundation/fields';
|
|
@@ -9,174 +11,169 @@ import { contractArtifactFromBuffer, contractArtifactToBuffer } from '@aztec/typ
|
|
|
9
11
|
import { NoteDao } from './note_dao.js';
|
|
10
12
|
/**
|
|
11
13
|
* A PXE database backed by LMDB.
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
#completeAddressIndex;
|
|
17
|
-
#addressBook;
|
|
18
|
-
#authWitnesses;
|
|
19
|
-
#capsules;
|
|
20
|
-
#notes;
|
|
21
|
-
#nullifiedNotes;
|
|
22
|
-
#nullifierToNoteId;
|
|
23
|
-
#nullifiersByBlockNumber;
|
|
24
|
-
#nullifiedNotesToScope;
|
|
25
|
-
#nullifiedNotesByContract;
|
|
26
|
-
#nullifiedNotesByStorageSlot;
|
|
27
|
-
#nullifiedNotesByTxHash;
|
|
28
|
-
#nullifiedNotesByAddressPoint;
|
|
29
|
-
#nullifiedNotesByNullifier;
|
|
30
|
-
#contractArtifacts;
|
|
31
|
-
#contractInstances;
|
|
32
|
-
#db;
|
|
33
|
-
#scopes;
|
|
34
|
-
#notesToScope;
|
|
35
|
-
#notesByContractAndScope;
|
|
36
|
-
#notesByStorageSlotAndScope;
|
|
37
|
-
#notesByTxHashAndScope;
|
|
38
|
-
#notesByAddressPointAndScope;
|
|
39
|
-
// Stores the last index used for each tagging secret, taking direction into account
|
|
40
|
-
// This is necessary to avoid reusing the same index for the same secret, which happens if
|
|
41
|
-
// sender and recipient are the same
|
|
42
|
-
#taggingSecretIndexesForSenders;
|
|
43
|
-
#taggingSecretIndexesForRecipients;
|
|
44
|
-
// Arbitrary data stored by contracts. Key is computed as `${contractAddress}:${key}`
|
|
45
|
-
#contractStore;
|
|
46
|
-
debug;
|
|
47
|
-
constructor(db){
|
|
14
|
+
*/
|
|
15
|
+
export class KVPxeDatabase {
|
|
16
|
+
constructor(db) {
|
|
17
|
+
_KVPxeDatabase_instances.add(this);
|
|
48
18
|
this.db = db;
|
|
49
|
-
this
|
|
50
|
-
this
|
|
51
|
-
this
|
|
52
|
-
this
|
|
53
|
-
this
|
|
54
|
-
this
|
|
55
|
-
this
|
|
56
|
-
this
|
|
57
|
-
this
|
|
58
|
-
this
|
|
59
|
-
this
|
|
60
|
-
this
|
|
61
|
-
this
|
|
62
|
-
this
|
|
63
|
-
this
|
|
64
|
-
this
|
|
65
|
-
this
|
|
66
|
-
this
|
|
67
|
-
this
|
|
68
|
-
this
|
|
69
|
-
this
|
|
70
|
-
this
|
|
71
|
-
this
|
|
72
|
-
this
|
|
73
|
-
this
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
19
|
+
_KVPxeDatabase_synchronizedBlock.set(this, void 0);
|
|
20
|
+
_KVPxeDatabase_completeAddresses.set(this, void 0);
|
|
21
|
+
_KVPxeDatabase_completeAddressIndex.set(this, void 0);
|
|
22
|
+
_KVPxeDatabase_addressBook.set(this, void 0);
|
|
23
|
+
_KVPxeDatabase_authWitnesses.set(this, void 0);
|
|
24
|
+
_KVPxeDatabase_capsules.set(this, void 0);
|
|
25
|
+
_KVPxeDatabase_notes.set(this, void 0);
|
|
26
|
+
_KVPxeDatabase_nullifiedNotes.set(this, void 0);
|
|
27
|
+
_KVPxeDatabase_nullifierToNoteId.set(this, void 0);
|
|
28
|
+
_KVPxeDatabase_nullifiersByBlockNumber.set(this, void 0);
|
|
29
|
+
_KVPxeDatabase_nullifiedNotesToScope.set(this, void 0);
|
|
30
|
+
_KVPxeDatabase_nullifiedNotesByContract.set(this, void 0);
|
|
31
|
+
_KVPxeDatabase_nullifiedNotesByStorageSlot.set(this, void 0);
|
|
32
|
+
_KVPxeDatabase_nullifiedNotesByTxHash.set(this, void 0);
|
|
33
|
+
_KVPxeDatabase_nullifiedNotesByAddressPoint.set(this, void 0);
|
|
34
|
+
_KVPxeDatabase_nullifiedNotesByNullifier.set(this, void 0);
|
|
35
|
+
_KVPxeDatabase_contractArtifacts.set(this, void 0);
|
|
36
|
+
_KVPxeDatabase_contractInstances.set(this, void 0);
|
|
37
|
+
_KVPxeDatabase_db.set(this, void 0);
|
|
38
|
+
_KVPxeDatabase_scopes.set(this, void 0);
|
|
39
|
+
_KVPxeDatabase_notesToScope.set(this, void 0);
|
|
40
|
+
_KVPxeDatabase_notesByContractAndScope.set(this, void 0);
|
|
41
|
+
_KVPxeDatabase_notesByStorageSlotAndScope.set(this, void 0);
|
|
42
|
+
_KVPxeDatabase_notesByTxHashAndScope.set(this, void 0);
|
|
43
|
+
_KVPxeDatabase_notesByAddressPointAndScope.set(this, void 0);
|
|
44
|
+
// Stores the last index used for each tagging secret, taking direction into account
|
|
45
|
+
// This is necessary to avoid reusing the same index for the same secret, which happens if
|
|
46
|
+
// sender and recipient are the same
|
|
47
|
+
_KVPxeDatabase_taggingSecretIndexesForSenders.set(this, void 0);
|
|
48
|
+
_KVPxeDatabase_taggingSecretIndexesForRecipients.set(this, void 0);
|
|
49
|
+
// Arbitrary data stored by contracts. Key is computed as `${contractAddress}:${key}`
|
|
50
|
+
_KVPxeDatabase_contractStore.set(this, void 0);
|
|
51
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_db, db, "f");
|
|
52
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_completeAddresses, db.openArray('complete_addresses'), "f");
|
|
53
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_completeAddressIndex, db.openMap('complete_address_index'), "f");
|
|
54
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_addressBook, db.openSet('address_book'), "f");
|
|
55
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_authWitnesses, db.openMap('auth_witnesses'), "f");
|
|
56
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_capsules, db.openArray('capsules'), "f");
|
|
57
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_contractArtifacts, db.openMap('contract_artifacts'), "f");
|
|
58
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_contractInstances, db.openMap('contracts_instances'), "f");
|
|
59
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_synchronizedBlock, db.openSingleton('header'), "f");
|
|
60
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_notes, db.openMap('notes'), "f");
|
|
61
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_nullifiedNotes, db.openMap('nullified_notes'), "f");
|
|
62
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_nullifierToNoteId, db.openMap('nullifier_to_note'), "f");
|
|
63
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_nullifiersByBlockNumber, db.openMultiMap('nullifier_to_block_number'), "f");
|
|
64
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_nullifiedNotesToScope, db.openMultiMap('nullified_notes_to_scope'), "f");
|
|
65
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_nullifiedNotesByContract, db.openMultiMap('nullified_notes_by_contract'), "f");
|
|
66
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_nullifiedNotesByStorageSlot, db.openMultiMap('nullified_notes_by_storage_slot'), "f");
|
|
67
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_nullifiedNotesByTxHash, db.openMultiMap('nullified_notes_by_tx_hash'), "f");
|
|
68
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_nullifiedNotesByAddressPoint, db.openMultiMap('nullified_notes_by_address_point'), "f");
|
|
69
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_nullifiedNotesByNullifier, db.openMap('nullified_notes_by_nullifier'), "f");
|
|
70
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_scopes, db.openSet('scopes'), "f");
|
|
71
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_notesToScope, db.openMultiMap('notes_to_scope'), "f");
|
|
72
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_notesByContractAndScope, new Map(), "f");
|
|
73
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_notesByStorageSlotAndScope, new Map(), "f");
|
|
74
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_notesByTxHashAndScope, new Map(), "f");
|
|
75
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_notesByAddressPointAndScope, new Map(), "f");
|
|
76
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_taggingSecretIndexesForSenders, db.openMap('tagging_secret_indexes_for_senders'), "f");
|
|
77
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_taggingSecretIndexesForRecipients, db.openMap('tagging_secret_indexes_for_recipients'), "f");
|
|
78
|
+
__classPrivateFieldSet(this, _KVPxeDatabase_contractStore, db.openMap('contract_store'), "f");
|
|
77
79
|
this.debug = createDebugOnlyLogger('aztec:kv-pxe-database');
|
|
78
80
|
}
|
|
79
81
|
static async create(db) {
|
|
80
82
|
const pxeDB = new KVPxeDatabase(db);
|
|
81
|
-
for await (const scope of pxeDB
|
|
82
|
-
pxeDB
|
|
83
|
-
pxeDB
|
|
84
|
-
pxeDB
|
|
85
|
-
pxeDB
|
|
83
|
+
for await (const scope of __classPrivateFieldGet(pxeDB, _KVPxeDatabase_scopes, "f").entriesAsync()) {
|
|
84
|
+
__classPrivateFieldGet(pxeDB, _KVPxeDatabase_notesByContractAndScope, "f").set(scope, db.openMultiMap(`${scope}:notes_by_contract`));
|
|
85
|
+
__classPrivateFieldGet(pxeDB, _KVPxeDatabase_notesByStorageSlotAndScope, "f").set(scope, db.openMultiMap(`${scope}:notes_by_storage_slot`));
|
|
86
|
+
__classPrivateFieldGet(pxeDB, _KVPxeDatabase_notesByTxHashAndScope, "f").set(scope, db.openMultiMap(`${scope}:notes_by_tx_hash`));
|
|
87
|
+
__classPrivateFieldGet(pxeDB, _KVPxeDatabase_notesByAddressPointAndScope, "f").set(scope, db.openMultiMap(`${scope}:notes_by_address_point`));
|
|
86
88
|
}
|
|
87
89
|
return pxeDB;
|
|
88
90
|
}
|
|
89
91
|
async getContract(address) {
|
|
90
92
|
const instance = await this.getContractInstance(address);
|
|
91
|
-
const artifact = instance && await this.getContractArtifact(instance?.contractClassId);
|
|
93
|
+
const artifact = instance && (await this.getContractArtifact(instance?.contractClassId));
|
|
92
94
|
if (!instance || !artifact) {
|
|
93
95
|
return undefined;
|
|
94
96
|
}
|
|
95
|
-
return {
|
|
96
|
-
...instance,
|
|
97
|
-
...artifact
|
|
98
|
-
};
|
|
97
|
+
return { ...instance, ...artifact };
|
|
99
98
|
}
|
|
100
99
|
async addContractArtifact(id, contract) {
|
|
101
|
-
const privateFunctions = contract.functions.filter(
|
|
102
|
-
const privateSelectors = await Promise.all(privateFunctions.map(async (privateFunctionArtifact)=>(await FunctionSelector.fromNameAndParameters(privateFunctionArtifact.name, privateFunctionArtifact.parameters)).toString()));
|
|
100
|
+
const privateFunctions = contract.functions.filter(functionArtifact => functionArtifact.functionType === FunctionType.PRIVATE);
|
|
101
|
+
const privateSelectors = await Promise.all(privateFunctions.map(async (privateFunctionArtifact) => (await FunctionSelector.fromNameAndParameters(privateFunctionArtifact.name, privateFunctionArtifact.parameters)).toString()));
|
|
103
102
|
if (privateSelectors.length !== new Set(privateSelectors).size) {
|
|
104
103
|
throw new Error('Repeated function selectors of private functions');
|
|
105
104
|
}
|
|
106
|
-
await this
|
|
105
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_contractArtifacts, "f").set(id.toString(), contractArtifactToBuffer(contract));
|
|
107
106
|
}
|
|
108
107
|
async getContractArtifact(id) {
|
|
109
|
-
const contract = await this
|
|
108
|
+
const contract = await __classPrivateFieldGet(this, _KVPxeDatabase_contractArtifacts, "f").getAsync(id.toString());
|
|
110
109
|
// TODO(@spalladino): AztecAsyncMap lies and returns Uint8Arrays instead of Buffers, hence the extra Buffer.from.
|
|
111
110
|
return contract && contractArtifactFromBuffer(Buffer.from(contract));
|
|
112
111
|
}
|
|
113
112
|
async addContractInstance(contract) {
|
|
114
|
-
await this
|
|
113
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_contractInstances, "f").set(contract.address.toString(), new SerializableContractInstance(contract).toBuffer());
|
|
115
114
|
}
|
|
116
115
|
async getContractInstance(address) {
|
|
117
|
-
const contract = await this
|
|
116
|
+
const contract = await __classPrivateFieldGet(this, _KVPxeDatabase_contractInstances, "f").getAsync(address.toString());
|
|
118
117
|
return contract && SerializableContractInstance.fromBuffer(contract).withAddress(address);
|
|
119
118
|
}
|
|
120
119
|
async getContractsAddresses() {
|
|
121
|
-
const keys = await toArray(this
|
|
120
|
+
const keys = await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_contractInstances, "f").keysAsync());
|
|
122
121
|
return keys.map(AztecAddress.fromString);
|
|
123
122
|
}
|
|
124
123
|
async addAuthWitness(messageHash, witness) {
|
|
125
|
-
await this
|
|
124
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_authWitnesses, "f").set(messageHash.toString(), witness.map(w => w.toBuffer()));
|
|
126
125
|
}
|
|
127
126
|
async getAuthWitness(messageHash) {
|
|
128
|
-
const witness = await this
|
|
129
|
-
return Promise.resolve(witness?.map(
|
|
127
|
+
const witness = await __classPrivateFieldGet(this, _KVPxeDatabase_authWitnesses, "f").getAsync(messageHash.toString());
|
|
128
|
+
return Promise.resolve(witness?.map(w => Fr.fromBuffer(w)));
|
|
130
129
|
}
|
|
131
130
|
async addCapsule(capsule) {
|
|
132
|
-
await this
|
|
131
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_capsules, "f").push(capsule.map(c => c.toBuffer()));
|
|
133
132
|
}
|
|
134
133
|
async popCapsule() {
|
|
135
|
-
const val = await this
|
|
136
|
-
return val?.map(
|
|
134
|
+
const val = await __classPrivateFieldGet(this, _KVPxeDatabase_capsules, "f").pop();
|
|
135
|
+
return val?.map(b => Fr.fromBuffer(b));
|
|
137
136
|
}
|
|
138
137
|
async addNote(note, scope) {
|
|
139
|
-
await this.addNotes([
|
|
140
|
-
note
|
|
141
|
-
], scope);
|
|
138
|
+
await this.addNotes([note], scope);
|
|
142
139
|
}
|
|
143
140
|
async addNotes(notes, scope = AztecAddress.ZERO) {
|
|
144
|
-
if (!await this
|
|
145
|
-
await this
|
|
141
|
+
if (!(await __classPrivateFieldGet(this, _KVPxeDatabase_scopes, "f").hasAsync(scope.toString()))) {
|
|
142
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_instances, "m", _KVPxeDatabase_addScope).call(this, scope);
|
|
146
143
|
}
|
|
147
|
-
return this.db.transactionAsync(async ()=>{
|
|
148
|
-
for (const dao of notes){
|
|
144
|
+
return this.db.transactionAsync(async () => {
|
|
145
|
+
for (const dao of notes) {
|
|
149
146
|
// store notes by their index in the notes hash tree
|
|
150
147
|
// this provides the uniqueness we need to store individual notes
|
|
151
148
|
// and should also return notes in the order that they were created.
|
|
152
149
|
// Had we stored them by their nullifier, they would be returned in random order
|
|
153
150
|
const noteIndex = toBufferBE(dao.index, 32).toString('hex');
|
|
154
|
-
await this
|
|
155
|
-
await this
|
|
156
|
-
await this
|
|
157
|
-
await this
|
|
158
|
-
await this
|
|
159
|
-
await this
|
|
160
|
-
await this
|
|
151
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notes, "f").set(noteIndex, dao.toBuffer());
|
|
152
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesToScope, "f").set(noteIndex, scope.toString());
|
|
153
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifierToNoteId, "f").set(dao.siloedNullifier.toString(), noteIndex);
|
|
154
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByContractAndScope, "f").get(scope.toString()).set(dao.contractAddress.toString(), noteIndex);
|
|
155
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByStorageSlotAndScope, "f").get(scope.toString()).set(dao.storageSlot.toString(), noteIndex);
|
|
156
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByTxHashAndScope, "f").get(scope.toString()).set(dao.txHash.toString(), noteIndex);
|
|
157
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByAddressPointAndScope, "f").get(scope.toString()).set(dao.addressPoint.toString(), noteIndex);
|
|
161
158
|
}
|
|
162
159
|
});
|
|
163
160
|
}
|
|
164
161
|
removeNotesAfter(blockNumber) {
|
|
165
|
-
return this.db.transactionAsync(async ()=>{
|
|
166
|
-
const notes = await toArray(this
|
|
167
|
-
for (const note of notes){
|
|
162
|
+
return this.db.transactionAsync(async () => {
|
|
163
|
+
const notes = await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_notes, "f").valuesAsync());
|
|
164
|
+
for (const note of notes) {
|
|
168
165
|
const noteDao = NoteDao.fromBuffer(note);
|
|
169
166
|
if (noteDao.l2BlockNumber > blockNumber) {
|
|
170
167
|
const noteIndex = toBufferBE(noteDao.index, 32).toString('hex');
|
|
171
|
-
await this
|
|
172
|
-
await this
|
|
173
|
-
await this
|
|
174
|
-
const scopes = await toArray(this
|
|
175
|
-
for (const scope of scopes){
|
|
176
|
-
await this
|
|
177
|
-
await this
|
|
178
|
-
await this
|
|
179
|
-
await this
|
|
168
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notes, "f").delete(noteIndex);
|
|
169
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesToScope, "f").delete(noteIndex);
|
|
170
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifierToNoteId, "f").delete(noteDao.siloedNullifier.toString());
|
|
171
|
+
const scopes = await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_scopes, "f").entriesAsync());
|
|
172
|
+
for (const scope of scopes) {
|
|
173
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByAddressPointAndScope, "f").get(scope).deleteValue(noteDao.addressPoint.toString(), noteIndex);
|
|
174
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByTxHashAndScope, "f").get(scope).deleteValue(noteDao.txHash.toString(), noteIndex);
|
|
175
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByContractAndScope, "f").get(scope).deleteValue(noteDao.contractAddress.toString(), noteIndex);
|
|
176
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByStorageSlotAndScope, "f").get(scope).deleteValue(noteDao.storageSlot.toString(), noteIndex);
|
|
180
177
|
}
|
|
181
178
|
}
|
|
182
179
|
}
|
|
@@ -185,40 +182,40 @@ import { NoteDao } from './note_dao.js';
|
|
|
185
182
|
async unnullifyNotesAfter(blockNumber) {
|
|
186
183
|
const nullifiersToUndo = [];
|
|
187
184
|
const currentBlockNumber = blockNumber + 1;
|
|
188
|
-
const maxBlockNumber = await this.getBlockNumber() ?? currentBlockNumber;
|
|
189
|
-
for(let i = currentBlockNumber; i <= maxBlockNumber; i++){
|
|
190
|
-
nullifiersToUndo.push(...await toArray(this
|
|
185
|
+
const maxBlockNumber = (await this.getBlockNumber()) ?? currentBlockNumber;
|
|
186
|
+
for (let i = currentBlockNumber; i <= maxBlockNumber; i++) {
|
|
187
|
+
nullifiersToUndo.push(...(await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_nullifiersByBlockNumber, "f").getValuesAsync(i))));
|
|
191
188
|
}
|
|
192
|
-
const notesIndexesToReinsert = await Promise.all(nullifiersToUndo.map(
|
|
193
|
-
const notNullNoteIndexes = notesIndexesToReinsert.filter(
|
|
194
|
-
const nullifiedNoteBuffers = await Promise.all(notNullNoteIndexes.map(
|
|
195
|
-
const noteDaos = nullifiedNoteBuffers
|
|
196
|
-
|
|
197
|
-
|
|
189
|
+
const notesIndexesToReinsert = await Promise.all(nullifiersToUndo.map(nullifier => __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByNullifier, "f").getAsync(nullifier)));
|
|
190
|
+
const notNullNoteIndexes = notesIndexesToReinsert.filter(noteIndex => noteIndex != undefined);
|
|
191
|
+
const nullifiedNoteBuffers = await Promise.all(notNullNoteIndexes.map(noteIndex => __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotes, "f").getAsync(noteIndex)));
|
|
192
|
+
const noteDaos = nullifiedNoteBuffers
|
|
193
|
+
.filter(buffer => buffer != undefined)
|
|
194
|
+
.map(buffer => NoteDao.fromBuffer(buffer));
|
|
195
|
+
await this.db.transactionAsync(async () => {
|
|
196
|
+
for (const dao of noteDaos) {
|
|
198
197
|
const noteIndex = toBufferBE(dao.index, 32).toString('hex');
|
|
199
|
-
await this
|
|
200
|
-
await this
|
|
201
|
-
let scopes = await toArray(this
|
|
198
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notes, "f").set(noteIndex, dao.toBuffer());
|
|
199
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifierToNoteId, "f").set(dao.siloedNullifier.toString(), noteIndex);
|
|
200
|
+
let scopes = (await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesToScope, "f").getValuesAsync(noteIndex))) ?? [];
|
|
202
201
|
if (scopes.length === 0) {
|
|
203
|
-
scopes = [
|
|
204
|
-
new AztecAddress(dao.addressPoint.x).toString()
|
|
205
|
-
];
|
|
202
|
+
scopes = [new AztecAddress(dao.addressPoint.x).toString()];
|
|
206
203
|
}
|
|
207
|
-
for (const scope of scopes){
|
|
208
|
-
await this
|
|
209
|
-
await this
|
|
210
|
-
await this
|
|
211
|
-
await this
|
|
212
|
-
await this
|
|
204
|
+
for (const scope of scopes) {
|
|
205
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByContractAndScope, "f").get(scope.toString()).set(dao.contractAddress.toString(), noteIndex);
|
|
206
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByStorageSlotAndScope, "f").get(scope.toString()).set(dao.storageSlot.toString(), noteIndex);
|
|
207
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByTxHashAndScope, "f").get(scope.toString()).set(dao.txHash.toString(), noteIndex);
|
|
208
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByAddressPointAndScope, "f").get(scope.toString()).set(dao.addressPoint.toString(), noteIndex);
|
|
209
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesToScope, "f").set(noteIndex, scope);
|
|
213
210
|
}
|
|
214
|
-
await this
|
|
215
|
-
await this
|
|
216
|
-
await this
|
|
217
|
-
await this
|
|
218
|
-
await this
|
|
219
|
-
await this
|
|
220
|
-
await this
|
|
221
|
-
await this
|
|
211
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotes, "f").delete(noteIndex);
|
|
212
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesToScope, "f").delete(noteIndex);
|
|
213
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiersByBlockNumber, "f").deleteValue(dao.l2BlockNumber, dao.siloedNullifier.toString());
|
|
214
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByContract, "f").deleteValue(dao.contractAddress.toString(), noteIndex);
|
|
215
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByStorageSlot, "f").deleteValue(dao.storageSlot.toString(), noteIndex);
|
|
216
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByTxHash, "f").deleteValue(dao.txHash.toString(), noteIndex);
|
|
217
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByAddressPoint, "f").deleteValue(dao.addressPoint.toString(), noteIndex);
|
|
218
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByNullifier, "f").delete(dao.siloedNullifier.toString());
|
|
222
219
|
}
|
|
223
220
|
});
|
|
224
221
|
}
|
|
@@ -226,28 +223,46 @@ import { NoteDao } from './note_dao.js';
|
|
|
226
223
|
const publicKey = filter.owner ? await filter.owner.toAddressPoint() : undefined;
|
|
227
224
|
filter.status = filter.status ?? NoteStatus.ACTIVE;
|
|
228
225
|
const candidateNoteSources = [];
|
|
229
|
-
filter.scopes
|
|
226
|
+
filter.scopes ?? (filter.scopes = (await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_scopes, "f").entriesAsync())).map(addressString => AztecAddress.fromString(addressString)));
|
|
230
227
|
const activeNoteIdsPerScope = [];
|
|
231
|
-
for (const scope of new Set(filter.scopes)){
|
|
228
|
+
for (const scope of new Set(filter.scopes)) {
|
|
232
229
|
const formattedScopeString = scope.toString();
|
|
233
|
-
if (!await this
|
|
230
|
+
if (!(await __classPrivateFieldGet(this, _KVPxeDatabase_scopes, "f").hasAsync(formattedScopeString))) {
|
|
234
231
|
throw new Error('Trying to get incoming notes of an scope that is not in the PXE database');
|
|
235
232
|
}
|
|
236
|
-
activeNoteIdsPerScope.push(publicKey
|
|
233
|
+
activeNoteIdsPerScope.push(publicKey
|
|
234
|
+
? await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_notesByAddressPointAndScope, "f").get(formattedScopeString).getValuesAsync(publicKey.toString()))
|
|
235
|
+
: filter.txHash
|
|
236
|
+
? await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_notesByTxHashAndScope, "f").get(formattedScopeString).getValuesAsync(filter.txHash.toString()))
|
|
237
|
+
: filter.contractAddress
|
|
238
|
+
? await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_notesByContractAndScope, "f")
|
|
239
|
+
.get(formattedScopeString)
|
|
240
|
+
.getValuesAsync(filter.contractAddress.toString()))
|
|
241
|
+
: filter.storageSlot
|
|
242
|
+
? await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_notesByStorageSlotAndScope, "f").get(formattedScopeString).getValuesAsync(filter.storageSlot.toString()))
|
|
243
|
+
: await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_notesByAddressPointAndScope, "f").get(formattedScopeString).valuesAsync()));
|
|
237
244
|
}
|
|
238
245
|
candidateNoteSources.push({
|
|
239
246
|
ids: new Set(activeNoteIdsPerScope.flat()),
|
|
240
|
-
notes: this
|
|
247
|
+
notes: __classPrivateFieldGet(this, _KVPxeDatabase_notes, "f"),
|
|
241
248
|
});
|
|
242
249
|
if (filter.status == NoteStatus.ACTIVE_OR_NULLIFIED) {
|
|
243
250
|
candidateNoteSources.push({
|
|
244
|
-
ids: publicKey
|
|
245
|
-
|
|
251
|
+
ids: publicKey
|
|
252
|
+
? await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByAddressPoint, "f").getValuesAsync(publicKey.toString()))
|
|
253
|
+
: filter.txHash
|
|
254
|
+
? await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByTxHash, "f").getValuesAsync(filter.txHash.toString()))
|
|
255
|
+
: filter.contractAddress
|
|
256
|
+
? await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByContract, "f").getValuesAsync(filter.contractAddress.toString()))
|
|
257
|
+
: filter.storageSlot
|
|
258
|
+
? await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByStorageSlot, "f").getValuesAsync(filter.storageSlot.toString()))
|
|
259
|
+
: await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotes, "f").keysAsync()),
|
|
260
|
+
notes: __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotes, "f"),
|
|
246
261
|
});
|
|
247
262
|
}
|
|
248
263
|
const result = [];
|
|
249
|
-
for (const { ids, notes } of candidateNoteSources){
|
|
250
|
-
for (const id of ids){
|
|
264
|
+
for (const { ids, notes } of candidateNoteSources) {
|
|
265
|
+
for (const id of ids) {
|
|
251
266
|
const serializedNote = await notes.getAsync(id);
|
|
252
267
|
if (!serializedNote) {
|
|
253
268
|
continue;
|
|
@@ -277,100 +292,91 @@ import { NoteDao } from './note_dao.js';
|
|
|
277
292
|
if (nullifiers.length === 0) {
|
|
278
293
|
return Promise.resolve([]);
|
|
279
294
|
}
|
|
280
|
-
return this.db.transactionAsync(async ()=>{
|
|
295
|
+
return this.db.transactionAsync(async () => {
|
|
281
296
|
const nullifiedNotes = [];
|
|
282
|
-
for (const blockScopedNullifier of nullifiers){
|
|
297
|
+
for (const blockScopedNullifier of nullifiers) {
|
|
283
298
|
const { data: nullifier, l2BlockNumber: blockNumber } = blockScopedNullifier;
|
|
284
|
-
const noteIndex = await this
|
|
299
|
+
const noteIndex = await __classPrivateFieldGet(this, _KVPxeDatabase_nullifierToNoteId, "f").getAsync(nullifier.toString());
|
|
285
300
|
if (!noteIndex) {
|
|
286
301
|
continue;
|
|
287
302
|
}
|
|
288
|
-
const noteBuffer = noteIndex ? await this
|
|
303
|
+
const noteBuffer = noteIndex ? await __classPrivateFieldGet(this, _KVPxeDatabase_notes, "f").getAsync(noteIndex) : undefined;
|
|
289
304
|
if (!noteBuffer) {
|
|
305
|
+
// note doesn't exist. Maybe it got nullified already
|
|
290
306
|
continue;
|
|
291
307
|
}
|
|
292
|
-
const noteScopes = await toArray(this
|
|
308
|
+
const noteScopes = (await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_notesToScope, "f").getValuesAsync(noteIndex))) ?? [];
|
|
293
309
|
const note = NoteDao.fromBuffer(noteBuffer);
|
|
294
310
|
if (!note.addressPoint.equals(accountAddressPoint)) {
|
|
311
|
+
// tried to nullify someone else's note
|
|
295
312
|
continue;
|
|
296
313
|
}
|
|
297
314
|
nullifiedNotes.push(note);
|
|
298
|
-
await this
|
|
299
|
-
await this
|
|
300
|
-
const scopes = await toArray(this
|
|
301
|
-
for (const scope of scopes){
|
|
302
|
-
await this
|
|
303
|
-
await this
|
|
304
|
-
await this
|
|
305
|
-
await this
|
|
315
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notes, "f").delete(noteIndex);
|
|
316
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesToScope, "f").delete(noteIndex);
|
|
317
|
+
const scopes = await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_scopes, "f").entriesAsync());
|
|
318
|
+
for (const scope of scopes) {
|
|
319
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByAddressPointAndScope, "f").get(scope).deleteValue(accountAddressPoint.toString(), noteIndex);
|
|
320
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByTxHashAndScope, "f").get(scope).deleteValue(note.txHash.toString(), noteIndex);
|
|
321
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByContractAndScope, "f").get(scope).deleteValue(note.contractAddress.toString(), noteIndex);
|
|
322
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_notesByStorageSlotAndScope, "f").get(scope).deleteValue(note.storageSlot.toString(), noteIndex);
|
|
306
323
|
}
|
|
307
324
|
if (noteScopes !== undefined) {
|
|
308
|
-
for (const scope of noteScopes){
|
|
309
|
-
await this
|
|
325
|
+
for (const scope of noteScopes) {
|
|
326
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesToScope, "f").set(noteIndex, scope);
|
|
310
327
|
}
|
|
311
328
|
}
|
|
312
|
-
await this
|
|
313
|
-
await this
|
|
314
|
-
await this
|
|
315
|
-
await this
|
|
316
|
-
await this
|
|
317
|
-
await this
|
|
318
|
-
await this
|
|
319
|
-
await this
|
|
329
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotes, "f").set(noteIndex, note.toBuffer());
|
|
330
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiersByBlockNumber, "f").set(blockNumber, nullifier.toString());
|
|
331
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByContract, "f").set(note.contractAddress.toString(), noteIndex);
|
|
332
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByStorageSlot, "f").set(note.storageSlot.toString(), noteIndex);
|
|
333
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByTxHash, "f").set(note.txHash.toString(), noteIndex);
|
|
334
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByAddressPoint, "f").set(note.addressPoint.toString(), noteIndex);
|
|
335
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByNullifier, "f").set(nullifier.toString(), noteIndex);
|
|
336
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifierToNoteId, "f").delete(nullifier.toString());
|
|
320
337
|
}
|
|
321
338
|
return nullifiedNotes;
|
|
322
339
|
});
|
|
323
340
|
}
|
|
324
341
|
async addNullifiedNote(note) {
|
|
325
342
|
const noteIndex = toBufferBE(note.index, 32).toString('hex');
|
|
326
|
-
await this
|
|
327
|
-
await this
|
|
328
|
-
await this
|
|
329
|
-
await this
|
|
330
|
-
await this
|
|
343
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotes, "f").set(noteIndex, note.toBuffer());
|
|
344
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByContract, "f").set(note.contractAddress.toString(), noteIndex);
|
|
345
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByStorageSlot, "f").set(note.storageSlot.toString(), noteIndex);
|
|
346
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByTxHash, "f").set(note.txHash.toString(), noteIndex);
|
|
347
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_nullifiedNotesByAddressPoint, "f").set(note.addressPoint.toString(), noteIndex);
|
|
331
348
|
}
|
|
332
349
|
async setHeader(header) {
|
|
333
|
-
await this
|
|
350
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_synchronizedBlock, "f").set(header.toBuffer());
|
|
334
351
|
}
|
|
335
352
|
async getBlockNumber() {
|
|
336
|
-
const headerBuffer = await this
|
|
353
|
+
const headerBuffer = await __classPrivateFieldGet(this, _KVPxeDatabase_synchronizedBlock, "f").getAsync();
|
|
337
354
|
if (!headerBuffer) {
|
|
338
355
|
return undefined;
|
|
339
356
|
}
|
|
340
357
|
return Number(BlockHeader.fromBuffer(headerBuffer).globalVariables.blockNumber.toBigInt());
|
|
341
358
|
}
|
|
342
359
|
async getBlockHeader() {
|
|
343
|
-
const headerBuffer = await this
|
|
360
|
+
const headerBuffer = await __classPrivateFieldGet(this, _KVPxeDatabase_synchronizedBlock, "f").getAsync();
|
|
344
361
|
if (!headerBuffer) {
|
|
345
362
|
throw new Error(`Header not set`);
|
|
346
363
|
}
|
|
347
364
|
return BlockHeader.fromBuffer(headerBuffer);
|
|
348
365
|
}
|
|
349
|
-
async #addScope(scope) {
|
|
350
|
-
const scopeString = scope.toString();
|
|
351
|
-
if (await this.#scopes.hasAsync(scopeString)) {
|
|
352
|
-
return false;
|
|
353
|
-
}
|
|
354
|
-
await this.#scopes.add(scopeString);
|
|
355
|
-
this.#notesByContractAndScope.set(scopeString, this.#db.openMultiMap(`${scopeString}:notes_by_contract`));
|
|
356
|
-
this.#notesByStorageSlotAndScope.set(scopeString, this.#db.openMultiMap(`${scopeString}:notes_by_storage_slot`));
|
|
357
|
-
this.#notesByTxHashAndScope.set(scopeString, this.#db.openMultiMap(`${scopeString}:notes_by_tx_hash`));
|
|
358
|
-
this.#notesByAddressPointAndScope.set(scopeString, this.#db.openMultiMap(`${scopeString}:notes_by_address_point`));
|
|
359
|
-
return true;
|
|
360
|
-
}
|
|
361
366
|
addCompleteAddress(completeAddress) {
|
|
362
|
-
return this.db.transactionAsync(async ()=>{
|
|
363
|
-
await this
|
|
367
|
+
return this.db.transactionAsync(async () => {
|
|
368
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_instances, "m", _KVPxeDatabase_addScope).call(this, completeAddress.address);
|
|
364
369
|
const addressString = completeAddress.address.toString();
|
|
365
370
|
const buffer = completeAddress.toBuffer();
|
|
366
|
-
const existing = await this
|
|
371
|
+
const existing = await __classPrivateFieldGet(this, _KVPxeDatabase_completeAddressIndex, "f").getAsync(addressString);
|
|
367
372
|
if (existing === undefined) {
|
|
368
|
-
const index = await this
|
|
369
|
-
await this
|
|
370
|
-
await this
|
|
373
|
+
const index = await __classPrivateFieldGet(this, _KVPxeDatabase_completeAddresses, "f").lengthAsync();
|
|
374
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_completeAddresses, "f").push(buffer);
|
|
375
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_completeAddressIndex, "f").set(addressString, index);
|
|
371
376
|
return true;
|
|
372
|
-
}
|
|
373
|
-
|
|
377
|
+
}
|
|
378
|
+
else {
|
|
379
|
+
const existingBuffer = await __classPrivateFieldGet(this, _KVPxeDatabase_completeAddresses, "f").atAsync(existing);
|
|
374
380
|
if (existingBuffer && Buffer.from(existingBuffer).equals(buffer)) {
|
|
375
381
|
return false;
|
|
376
382
|
}
|
|
@@ -378,87 +384,73 @@ import { NoteDao } from './note_dao.js';
|
|
|
378
384
|
}
|
|
379
385
|
});
|
|
380
386
|
}
|
|
381
|
-
async #getCompleteAddress(address) {
|
|
382
|
-
const index = await this.#completeAddressIndex.getAsync(address.toString());
|
|
383
|
-
if (index === undefined) {
|
|
384
|
-
return undefined;
|
|
385
|
-
}
|
|
386
|
-
const value = await this.#completeAddresses.atAsync(index);
|
|
387
|
-
return value ? await CompleteAddress.fromBuffer(value) : undefined;
|
|
388
|
-
}
|
|
389
387
|
getCompleteAddress(account) {
|
|
390
|
-
return this
|
|
388
|
+
return __classPrivateFieldGet(this, _KVPxeDatabase_instances, "m", _KVPxeDatabase_getCompleteAddress).call(this, account);
|
|
391
389
|
}
|
|
392
390
|
async getCompleteAddresses() {
|
|
393
|
-
return await Promise.all((await toArray(this
|
|
391
|
+
return await Promise.all((await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_completeAddresses, "f").valuesAsync())).map(v => CompleteAddress.fromBuffer(v)));
|
|
394
392
|
}
|
|
395
393
|
async addSenderAddress(address) {
|
|
396
|
-
if (await this
|
|
394
|
+
if (await __classPrivateFieldGet(this, _KVPxeDatabase_addressBook, "f").hasAsync(address.toString())) {
|
|
397
395
|
return false;
|
|
398
396
|
}
|
|
399
|
-
await this
|
|
397
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_addressBook, "f").add(address.toString());
|
|
400
398
|
return true;
|
|
401
399
|
}
|
|
402
400
|
async getSenderAddresses() {
|
|
403
|
-
return (await toArray(this
|
|
401
|
+
return (await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_addressBook, "f").entriesAsync())).map(AztecAddress.fromString);
|
|
404
402
|
}
|
|
405
403
|
async removeSenderAddress(address) {
|
|
406
|
-
if (!await this
|
|
404
|
+
if (!(await __classPrivateFieldGet(this, _KVPxeDatabase_addressBook, "f").hasAsync(address.toString()))) {
|
|
407
405
|
return false;
|
|
408
406
|
}
|
|
409
|
-
await this
|
|
407
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_addressBook, "f").delete(address.toString());
|
|
410
408
|
return true;
|
|
411
409
|
}
|
|
412
410
|
async estimateSize() {
|
|
413
|
-
const noteSize = (await this.getNotes({})).reduce((sum, note)=>sum + note.getSize(), 0);
|
|
414
|
-
const authWitsSize = (await toArray(this
|
|
415
|
-
const addressesSize = await this
|
|
411
|
+
const noteSize = (await this.getNotes({})).reduce((sum, note) => sum + note.getSize(), 0);
|
|
412
|
+
const authWitsSize = (await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_authWitnesses, "f").valuesAsync())).reduce((sum, value) => sum + value.length * Fr.SIZE_IN_BYTES, 0);
|
|
413
|
+
const addressesSize = (await __classPrivateFieldGet(this, _KVPxeDatabase_completeAddresses, "f").lengthAsync()) * CompleteAddress.SIZE_IN_BYTES;
|
|
416
414
|
const treeRootsSize = Object.keys(MerkleTreeId).length * Fr.SIZE_IN_BYTES;
|
|
417
415
|
return noteSize + treeRootsSize + authWitsSize + addressesSize;
|
|
418
416
|
}
|
|
419
417
|
async setTaggingSecretsIndexesAsSender(indexedSecrets) {
|
|
420
|
-
await this
|
|
418
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_instances, "m", _KVPxeDatabase_setTaggingSecretsIndexes).call(this, indexedSecrets, __classPrivateFieldGet(this, _KVPxeDatabase_taggingSecretIndexesForSenders, "f"));
|
|
421
419
|
}
|
|
422
420
|
async setTaggingSecretsIndexesAsRecipient(indexedSecrets) {
|
|
423
|
-
await this
|
|
424
|
-
}
|
|
425
|
-
async #setTaggingSecretsIndexes(indexedSecrets, storageMap) {
|
|
426
|
-
await Promise.all(indexedSecrets.map((indexedSecret)=>storageMap.set(indexedSecret.appTaggingSecret.toString(), indexedSecret.index)));
|
|
421
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_instances, "m", _KVPxeDatabase_setTaggingSecretsIndexes).call(this, indexedSecrets, __classPrivateFieldGet(this, _KVPxeDatabase_taggingSecretIndexesForRecipients, "f"));
|
|
427
422
|
}
|
|
428
423
|
async getTaggingSecretsIndexesAsRecipient(appTaggingSecrets) {
|
|
429
|
-
return await this
|
|
424
|
+
return await __classPrivateFieldGet(this, _KVPxeDatabase_instances, "m", _KVPxeDatabase_getTaggingSecretsIndexes).call(this, appTaggingSecrets, __classPrivateFieldGet(this, _KVPxeDatabase_taggingSecretIndexesForRecipients, "f"));
|
|
430
425
|
}
|
|
431
426
|
async getTaggingSecretsIndexesAsSender(appTaggingSecrets) {
|
|
432
|
-
return await this
|
|
433
|
-
}
|
|
434
|
-
#getTaggingSecretsIndexes(appTaggingSecrets, storageMap) {
|
|
435
|
-
return Promise.all(appTaggingSecrets.map(async (secret)=>await storageMap.getAsync(`${secret.toString()}`) ?? 0));
|
|
427
|
+
return await __classPrivateFieldGet(this, _KVPxeDatabase_instances, "m", _KVPxeDatabase_getTaggingSecretsIndexes).call(this, appTaggingSecrets, __classPrivateFieldGet(this, _KVPxeDatabase_taggingSecretIndexesForSenders, "f"));
|
|
436
428
|
}
|
|
437
429
|
resetNoteSyncData() {
|
|
438
|
-
return this.db.transactionAsync(async ()=>{
|
|
439
|
-
const recipients = await toArray(this
|
|
440
|
-
await Promise.all(recipients.map(
|
|
441
|
-
const senders = await toArray(this
|
|
442
|
-
await Promise.all(senders.map(
|
|
430
|
+
return this.db.transactionAsync(async () => {
|
|
431
|
+
const recipients = await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_taggingSecretIndexesForRecipients, "f").keysAsync());
|
|
432
|
+
await Promise.all(recipients.map(recipient => __classPrivateFieldGet(this, _KVPxeDatabase_taggingSecretIndexesForRecipients, "f").delete(recipient)));
|
|
433
|
+
const senders = await toArray(__classPrivateFieldGet(this, _KVPxeDatabase_taggingSecretIndexesForSenders, "f").keysAsync());
|
|
434
|
+
await Promise.all(senders.map(sender => __classPrivateFieldGet(this, _KVPxeDatabase_taggingSecretIndexesForSenders, "f").delete(sender)));
|
|
443
435
|
});
|
|
444
436
|
}
|
|
445
437
|
async dbStore(contractAddress, slot, values) {
|
|
446
|
-
await this
|
|
438
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_contractStore, "f").set(dbSlotToKey(contractAddress, slot), Buffer.concat(values.map(value => value.toBuffer())));
|
|
447
439
|
}
|
|
448
440
|
async dbLoad(contractAddress, slot) {
|
|
449
|
-
const dataBuffer = await this
|
|
441
|
+
const dataBuffer = await __classPrivateFieldGet(this, _KVPxeDatabase_contractStore, "f").getAsync(dbSlotToKey(contractAddress, slot));
|
|
450
442
|
if (!dataBuffer) {
|
|
451
443
|
this.debug(`Data not found for contract ${contractAddress.toString()} and slot ${slot.toString()}`);
|
|
452
444
|
return null;
|
|
453
445
|
}
|
|
454
446
|
const values = [];
|
|
455
|
-
for(let i = 0; i < dataBuffer.length; i += Fr.SIZE_IN_BYTES){
|
|
447
|
+
for (let i = 0; i < dataBuffer.length; i += Fr.SIZE_IN_BYTES) {
|
|
456
448
|
values.push(Fr.fromBuffer(dataBuffer.subarray(i, i + Fr.SIZE_IN_BYTES)));
|
|
457
449
|
}
|
|
458
450
|
return values;
|
|
459
451
|
}
|
|
460
452
|
async dbDelete(contractAddress, slot) {
|
|
461
|
-
await this
|
|
453
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_contractStore, "f").delete(dbSlotToKey(contractAddress, slot));
|
|
462
454
|
}
|
|
463
455
|
async dbCopy(contractAddress, srcSlot, dstSlot, numEntries) {
|
|
464
456
|
// In order to support overlaping source and destination regions we need to check the relative positions of source
|
|
@@ -469,17 +461,41 @@ import { NoteDao } from './note_dao.js';
|
|
|
469
461
|
if (srcSlot.lt(dstSlot)) {
|
|
470
462
|
indexes.reverse();
|
|
471
463
|
}
|
|
472
|
-
for (const i of indexes){
|
|
464
|
+
for (const i of indexes) {
|
|
473
465
|
const currentSrcSlot = dbSlotToKey(contractAddress, srcSlot.add(new Fr(i)));
|
|
474
466
|
const currentDstSlot = dbSlotToKey(contractAddress, dstSlot.add(new Fr(i)));
|
|
475
|
-
const toCopy = await this
|
|
467
|
+
const toCopy = await __classPrivateFieldGet(this, _KVPxeDatabase_contractStore, "f").getAsync(currentSrcSlot);
|
|
476
468
|
if (!toCopy) {
|
|
477
469
|
throw new Error(`Attempted to copy empty slot ${currentSrcSlot} for contract ${contractAddress.toString()}`);
|
|
478
470
|
}
|
|
479
|
-
await this
|
|
471
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_contractStore, "f").set(currentDstSlot, toCopy);
|
|
480
472
|
}
|
|
481
473
|
}
|
|
482
474
|
}
|
|
475
|
+
_KVPxeDatabase_synchronizedBlock = new WeakMap(), _KVPxeDatabase_completeAddresses = new WeakMap(), _KVPxeDatabase_completeAddressIndex = new WeakMap(), _KVPxeDatabase_addressBook = new WeakMap(), _KVPxeDatabase_authWitnesses = new WeakMap(), _KVPxeDatabase_capsules = new WeakMap(), _KVPxeDatabase_notes = new WeakMap(), _KVPxeDatabase_nullifiedNotes = new WeakMap(), _KVPxeDatabase_nullifierToNoteId = new WeakMap(), _KVPxeDatabase_nullifiersByBlockNumber = new WeakMap(), _KVPxeDatabase_nullifiedNotesToScope = new WeakMap(), _KVPxeDatabase_nullifiedNotesByContract = new WeakMap(), _KVPxeDatabase_nullifiedNotesByStorageSlot = new WeakMap(), _KVPxeDatabase_nullifiedNotesByTxHash = new WeakMap(), _KVPxeDatabase_nullifiedNotesByAddressPoint = new WeakMap(), _KVPxeDatabase_nullifiedNotesByNullifier = new WeakMap(), _KVPxeDatabase_contractArtifacts = new WeakMap(), _KVPxeDatabase_contractInstances = new WeakMap(), _KVPxeDatabase_db = new WeakMap(), _KVPxeDatabase_scopes = new WeakMap(), _KVPxeDatabase_notesToScope = new WeakMap(), _KVPxeDatabase_notesByContractAndScope = new WeakMap(), _KVPxeDatabase_notesByStorageSlotAndScope = new WeakMap(), _KVPxeDatabase_notesByTxHashAndScope = new WeakMap(), _KVPxeDatabase_notesByAddressPointAndScope = new WeakMap(), _KVPxeDatabase_taggingSecretIndexesForSenders = new WeakMap(), _KVPxeDatabase_taggingSecretIndexesForRecipients = new WeakMap(), _KVPxeDatabase_contractStore = new WeakMap(), _KVPxeDatabase_instances = new WeakSet(), _KVPxeDatabase_addScope = async function _KVPxeDatabase_addScope(scope) {
|
|
476
|
+
const scopeString = scope.toString();
|
|
477
|
+
if (await __classPrivateFieldGet(this, _KVPxeDatabase_scopes, "f").hasAsync(scopeString)) {
|
|
478
|
+
return false;
|
|
479
|
+
}
|
|
480
|
+
await __classPrivateFieldGet(this, _KVPxeDatabase_scopes, "f").add(scopeString);
|
|
481
|
+
__classPrivateFieldGet(this, _KVPxeDatabase_notesByContractAndScope, "f").set(scopeString, __classPrivateFieldGet(this, _KVPxeDatabase_db, "f").openMultiMap(`${scopeString}:notes_by_contract`));
|
|
482
|
+
__classPrivateFieldGet(this, _KVPxeDatabase_notesByStorageSlotAndScope, "f").set(scopeString, __classPrivateFieldGet(this, _KVPxeDatabase_db, "f").openMultiMap(`${scopeString}:notes_by_storage_slot`));
|
|
483
|
+
__classPrivateFieldGet(this, _KVPxeDatabase_notesByTxHashAndScope, "f").set(scopeString, __classPrivateFieldGet(this, _KVPxeDatabase_db, "f").openMultiMap(`${scopeString}:notes_by_tx_hash`));
|
|
484
|
+
__classPrivateFieldGet(this, _KVPxeDatabase_notesByAddressPointAndScope, "f").set(scopeString, __classPrivateFieldGet(this, _KVPxeDatabase_db, "f").openMultiMap(`${scopeString}:notes_by_address_point`));
|
|
485
|
+
return true;
|
|
486
|
+
}, _KVPxeDatabase_getCompleteAddress = async function _KVPxeDatabase_getCompleteAddress(address) {
|
|
487
|
+
const index = await __classPrivateFieldGet(this, _KVPxeDatabase_completeAddressIndex, "f").getAsync(address.toString());
|
|
488
|
+
if (index === undefined) {
|
|
489
|
+
return undefined;
|
|
490
|
+
}
|
|
491
|
+
const value = await __classPrivateFieldGet(this, _KVPxeDatabase_completeAddresses, "f").atAsync(index);
|
|
492
|
+
return value ? await CompleteAddress.fromBuffer(value) : undefined;
|
|
493
|
+
}, _KVPxeDatabase_setTaggingSecretsIndexes = async function _KVPxeDatabase_setTaggingSecretsIndexes(indexedSecrets, storageMap) {
|
|
494
|
+
await Promise.all(indexedSecrets.map(indexedSecret => storageMap.set(indexedSecret.appTaggingSecret.toString(), indexedSecret.index)));
|
|
495
|
+
}, _KVPxeDatabase_getTaggingSecretsIndexes = function _KVPxeDatabase_getTaggingSecretsIndexes(appTaggingSecrets, storageMap) {
|
|
496
|
+
return Promise.all(appTaggingSecrets.map(async (secret) => (await storageMap.getAsync(`${secret.toString()}`)) ?? 0));
|
|
497
|
+
};
|
|
483
498
|
function dbSlotToKey(contractAddress, slot) {
|
|
484
499
|
return `${contractAddress.toString()}:${slot.toString()}`;
|
|
485
500
|
}
|
|
501
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoia3ZfcHhlX2RhdGFiYXNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2RhdGFiYXNlL2t2X3B4ZV9kYXRhYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQUFBLE9BQU8sRUFBZ0IsWUFBWSxFQUFFLFVBQVUsRUFBb0IsTUFBTSxzQkFBc0IsQ0FBQztBQUNoRyxPQUFPLEVBQ0wsWUFBWSxFQUNaLFdBQVcsRUFDWCxlQUFlLEVBSWYsNEJBQTRCLEdBQzdCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUF5QixnQkFBZ0IsRUFBRSxZQUFZLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUM5RixPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0QsT0FBTyxFQUFFLEVBQUUsRUFBYyxNQUFNLDBCQUEwQixDQUFDO0FBQzFELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQUNyRCxPQUFPLEVBQWMscUJBQXFCLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQVMxRSxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV4RixPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBR3hDOztHQUVHO0FBQ0gsTUFBTSxPQUFPLGFBQWE7SUF3Q3hCLFlBQThCLEVBQXFCOztRQUFyQixPQUFFLEdBQUYsRUFBRSxDQUFtQjtRQXZDbkQsbURBQWdEO1FBQ2hELG1EQUE0QztRQUM1QyxzREFBcUQ7UUFDckQsNkNBQW9DO1FBQ3BDLCtDQUFnRDtRQUNoRCwwQ0FBcUM7UUFDckMsdUNBQXNDO1FBQ3RDLGdEQUErQztRQUMvQyxtREFBa0Q7UUFDbEQseURBQTZEO1FBRTdELHVEQUEyRDtRQUMzRCwwREFBOEQ7UUFDOUQsNkRBQWlFO1FBQ2pFLHdEQUE0RDtRQUM1RCw4REFBa0U7UUFDbEUsMkRBQTBEO1FBQzFELG1EQUFrRDtRQUNsRCxt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
|