@aztec/pxe 0.8.6
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/README.md +13 -0
- package/dest/bin/index.d.ts +3 -0
- package/dest/bin/index.d.ts.map +1 -0
- package/dest/bin/index.js +31 -0
- package/dest/config/index.d.ts +21 -0
- package/dest/config/index.d.ts.map +1 -0
- package/dest/config/index.js +21 -0
- package/dest/contract_data_oracle/index.d.ts +99 -0
- package/dest/contract_data_oracle/index.d.ts.map +1 -0
- package/dest/contract_data_oracle/index.js +137 -0
- package/dest/contract_database/index.d.ts +2 -0
- package/dest/contract_database/index.d.ts.map +1 -0
- package/dest/contract_database/index.js +2 -0
- package/dest/contract_database/memory_contract_database.d.ts +43 -0
- package/dest/contract_database/memory_contract_database.d.ts.map +1 -0
- package/dest/contract_database/memory_contract_database.js +51 -0
- package/dest/contract_tree/index.d.ts +107 -0
- package/dest/contract_tree/index.d.ts.map +1 -0
- package/dest/contract_tree/index.js +181 -0
- package/dest/database/database.d.ts +118 -0
- package/dest/database/database.d.ts.map +1 -0
- package/dest/database/database.js +2 -0
- package/dest/database/index.d.ts +4 -0
- package/dest/database/index.d.ts.map +1 -0
- package/dest/database/index.js +4 -0
- package/dest/database/memory_db.d.ts +45 -0
- package/dest/database/memory_db.d.ts.map +1 -0
- package/dest/database/memory_db.js +111 -0
- package/dest/database/note_spending_info_dao.d.ts +44 -0
- package/dest/database/note_spending_info_dao.d.ts.map +1 -0
- package/dest/database/note_spending_info_dao.js +14 -0
- package/dest/index.d.ts +10 -0
- package/dest/index.d.ts.map +1 -0
- package/dest/index.js +10 -0
- package/dest/kernel_oracle/index.d.ts +18 -0
- package/dest/kernel_oracle/index.d.ts.map +1 -0
- package/dest/kernel_oracle/index.js +29 -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 +3 -0
- package/dest/kernel_prover/kernel_prover.d.ts +89 -0
- package/dest/kernel_prover/kernel_prover.d.ts.map +1 -0
- package/dest/kernel_prover/kernel_prover.js +175 -0
- package/dest/kernel_prover/proof_creator.d.ts +84 -0
- package/dest/kernel_prover/proof_creator.d.ts.map +1 -0
- package/dest/kernel_prover/proof_creator.js +83 -0
- package/dest/kernel_prover/proving_data_oracle.d.ts +53 -0
- package/dest/kernel_prover/proving_data_oracle.d.ts.map +1 -0
- package/dest/kernel_prover/proving_data_oracle.js +2 -0
- package/dest/note_processor/index.d.ts +2 -0
- package/dest/note_processor/index.d.ts.map +1 -0
- package/dest/note_processor/index.js +2 -0
- package/dest/note_processor/note_processor.d.ts +78 -0
- package/dest/note_processor/note_processor.d.ts.map +1 -0
- package/dest/note_processor/note_processor.js +206 -0
- 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 +2 -0
- package/dest/pxe_http/pxe_http_server.d.ts +40 -0
- package/dest/pxe_http/pxe_http_server.d.ts.map +1 -0
- package/dest/pxe_http/pxe_http_server.js +44 -0
- package/dest/pxe_service/create_pxe_service.d.ts +30 -0
- package/dest/pxe_service/create_pxe_service.d.ts.map +1 -0
- package/dest/pxe_service/create_pxe_service.js +27 -0
- 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 +4 -0
- package/dest/pxe_service/pxe_service.d.ts +70 -0
- package/dest/pxe_service/pxe_service.d.ts.map +1 -0
- package/dest/pxe_service/pxe_service.js +470 -0
- 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 +100 -0
- package/dest/simulator/index.d.ts +9 -0
- package/dest/simulator/index.d.ts.map +1 -0
- package/dest/simulator/index.js +11 -0
- package/dest/simulator_oracle/index.d.ts +53 -0
- package/dest/simulator_oracle/index.d.ts.map +1 -0
- package/dest/simulator_oracle/index.js +91 -0
- package/dest/synchronizer/index.d.ts +2 -0
- package/dest/synchronizer/index.d.ts.map +1 -0
- package/dest/synchronizer/index.js +2 -0
- package/dest/synchronizer/synchronizer.d.ts +82 -0
- package/dest/synchronizer/synchronizer.d.ts.map +1 -0
- package/dest/synchronizer/synchronizer.js +241 -0
- package/package.json +74 -0
- package/src/bin/index.ts +39 -0
- package/src/config/index.ts +34 -0
- package/src/contract_data_oracle/index.ts +151 -0
- package/src/contract_database/index.ts +1 -0
- package/src/contract_database/memory_contract_database.ts +58 -0
- package/src/contract_tree/index.ts +245 -0
- package/src/database/database.ts +131 -0
- package/src/database/index.ts +3 -0
- package/src/database/memory_db.ts +147 -0
- package/src/database/note_spending_info_dao.ts +64 -0
- package/src/index.ts +11 -0
- package/src/kernel_oracle/index.ts +39 -0
- package/src/kernel_prover/index.ts +2 -0
- package/src/kernel_prover/kernel_prover.ts +317 -0
- package/src/kernel_prover/proof_creator.ts +176 -0
- package/src/kernel_prover/proving_data_oracle.ts +69 -0
- package/src/note_processor/index.ts +1 -0
- package/src/note_processor/note_processor.ts +267 -0
- package/src/pxe_http/index.ts +1 -0
- package/src/pxe_http/pxe_http_server.ts +70 -0
- package/src/pxe_service/create_pxe_service.ts +52 -0
- package/src/pxe_service/index.ts +3 -0
- package/src/pxe_service/pxe_service.ts +650 -0
- package/src/pxe_service/test/pxe_test_suite.ts +138 -0
- package/src/simulator/index.ts +24 -0
- package/src/simulator_oracle/index.ts +121 -0
- package/src/synchronizer/index.ts +1 -0
- package/src/synchronizer/synchronizer.ts +285 -0
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { AcirSimulator } from '@aztec/acir-simulator';
|
|
2
|
+
import { KeyStore, StateInfoProvider } from '@aztec/types';
|
|
3
|
+
import { ContractDataOracle } from '../contract_data_oracle/index.js';
|
|
4
|
+
import { Database } from '../database/database.js';
|
|
5
|
+
/**
|
|
6
|
+
* Helper method to create an instance of the acir simulator.
|
|
7
|
+
*/
|
|
8
|
+
export declare function getAcirSimulator(db: Database, stateInfoProvider: StateInfoProvider, keyStore: KeyStore, contractDataOracle?: ContractDataOracle): AcirSimulator;
|
|
9
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/simulator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAE3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AAGnD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,iBAAiB,EAAE,iBAAiB,EACpC,QAAQ,EAAE,QAAQ,EAClB,kBAAkB,CAAC,EAAE,kBAAkB,iBASxC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { AcirSimulator } from '@aztec/acir-simulator';
|
|
2
|
+
import { ContractDataOracle } from '../contract_data_oracle/index.js';
|
|
3
|
+
import { SimulatorOracle } from '../simulator_oracle/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* Helper method to create an instance of the acir simulator.
|
|
6
|
+
*/
|
|
7
|
+
export function getAcirSimulator(db, stateInfoProvider, keyStore, contractDataOracle) {
|
|
8
|
+
const simulatorOracle = new SimulatorOracle(contractDataOracle ?? new ContractDataOracle(db, stateInfoProvider), db, keyStore, stateInfoProvider);
|
|
9
|
+
return new AcirSimulator(simulatorOracle);
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUd0RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUV0RSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFFL0Q7O0dBRUc7QUFDSCxNQUFNLFVBQVUsZ0JBQWdCLENBQzlCLEVBQVksRUFDWixpQkFBb0MsRUFDcEMsUUFBa0IsRUFDbEIsa0JBQXVDO0lBRXZDLE1BQU0sZUFBZSxHQUFHLElBQUksZUFBZSxDQUN6QyxrQkFBa0IsSUFBSSxJQUFJLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxpQkFBaUIsQ0FBQyxFQUNuRSxFQUFFLEVBQ0YsUUFBUSxFQUNSLGlCQUFpQixDQUNsQixDQUFDO0lBQ0YsT0FBTyxJQUFJLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FBQztBQUM1QyxDQUFDIn0=
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { DBOracle, FunctionAbiWithDebugMetadata, MessageLoadOracleInputs } from '@aztec/acir-simulator';
|
|
2
|
+
import { AztecAddress, CompleteAddress, EthAddress, Fr, FunctionSelector, GrumpkinPrivateKey, HistoricBlockData, PublicKey } from '@aztec/circuits.js';
|
|
3
|
+
import { KeyStore, StateInfoProvider } from '@aztec/types';
|
|
4
|
+
import { ContractDataOracle } from '../contract_data_oracle/index.js';
|
|
5
|
+
import { Database } from '../database/index.js';
|
|
6
|
+
/**
|
|
7
|
+
* A data oracle that provides information needed for simulating a transaction.
|
|
8
|
+
*/
|
|
9
|
+
export declare class SimulatorOracle implements DBOracle {
|
|
10
|
+
private contractDataOracle;
|
|
11
|
+
private db;
|
|
12
|
+
private keyStore;
|
|
13
|
+
private stateInfoProvider;
|
|
14
|
+
constructor(contractDataOracle: ContractDataOracle, db: Database, keyStore: KeyStore, stateInfoProvider: StateInfoProvider);
|
|
15
|
+
getSecretKey(_contractAddress: AztecAddress, pubKey: PublicKey): Promise<GrumpkinPrivateKey>;
|
|
16
|
+
getCompleteAddress(address: AztecAddress): Promise<CompleteAddress>;
|
|
17
|
+
getAuthWitness(messageHash: Fr): Promise<Fr[]>;
|
|
18
|
+
getNotes(contractAddress: AztecAddress, storageSlot: Fr): Promise<{
|
|
19
|
+
contractAddress: AztecAddress;
|
|
20
|
+
storageSlot: Fr;
|
|
21
|
+
nonce: Fr;
|
|
22
|
+
preimage: Fr[];
|
|
23
|
+
innerNoteHash: Fr;
|
|
24
|
+
siloedNullifier: Fr;
|
|
25
|
+
index: bigint;
|
|
26
|
+
}[]>;
|
|
27
|
+
getFunctionABI(contractAddress: AztecAddress, selector: FunctionSelector): Promise<FunctionAbiWithDebugMetadata>;
|
|
28
|
+
getPortalContractAddress(contractAddress: AztecAddress): Promise<EthAddress>;
|
|
29
|
+
/**
|
|
30
|
+
* Retrieves the L1ToL2Message associated with a specific message key
|
|
31
|
+
* Throws an error if the message key is not found
|
|
32
|
+
*
|
|
33
|
+
* @param msgKey - The key of the message to be retrieved
|
|
34
|
+
* @returns A promise that resolves to the message data, a sibling path and the
|
|
35
|
+
* index of the message in the l1ToL2MessagesTree
|
|
36
|
+
*/
|
|
37
|
+
getL1ToL2Message(msgKey: Fr): Promise<MessageLoadOracleInputs>;
|
|
38
|
+
/**
|
|
39
|
+
* Gets the index of a commitment in the private data tree.
|
|
40
|
+
* @param commitment - The commitment.
|
|
41
|
+
* @returns - The index of the commitment. Undefined if it does not exist in the tree.
|
|
42
|
+
*/
|
|
43
|
+
getCommitmentIndex(commitment: Fr): Promise<bigint | undefined>;
|
|
44
|
+
getNullifierIndex(nullifier: Fr): Promise<bigint | undefined>;
|
|
45
|
+
/**
|
|
46
|
+
* Retrieve the databases view of the Historic Block Data object.
|
|
47
|
+
* This structure is fed into the circuits simulator and is used to prove against certain historic roots.
|
|
48
|
+
*
|
|
49
|
+
* @returns A Promise that resolves to a HistoricBlockData object.
|
|
50
|
+
*/
|
|
51
|
+
getHistoricBlockData(): Promise<HistoricBlockData>;
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/simulator_oracle/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,4BAA4B,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AACxG,OAAO,EACL,YAAY,EACZ,eAAe,EACf,UAAU,EACV,EAAE,EACF,gBAAgB,EAChB,kBAAkB,EAClB,iBAAiB,EACjB,SAAS,EACV,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,QAAQ,EAAgB,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEzE,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD;;GAEG;AACH,qBAAa,eAAgB,YAAW,QAAQ;IAE5C,OAAO,CAAC,kBAAkB;IAC1B,OAAO,CAAC,EAAE;IACV,OAAO,CAAC,QAAQ;IAChB,OAAO,CAAC,iBAAiB;gBAHjB,kBAAkB,EAAE,kBAAkB,EACtC,EAAE,EAAE,QAAQ,EACZ,QAAQ,EAAE,QAAQ,EAClB,iBAAiB,EAAE,iBAAiB;IAG9C,YAAY,CAAC,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,SAAS,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAItF,kBAAkB,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IASnE,cAAc,CAAC,WAAW,EAAE,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC;IAM9C,QAAQ,CAAC,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE;;;;;;;;;IAgBvD,cAAc,CAClB,eAAe,EAAE,YAAY,EAC7B,QAAQ,EAAE,gBAAgB,GACzB,OAAO,CAAC,4BAA4B,CAAC;IASlC,wBAAwB,CAAC,eAAe,EAAE,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC;IAIlF;;;;;;;OAOG;IACG,gBAAgB,CAAC,MAAM,EAAE,EAAE,GAAG,OAAO,CAAC,uBAAuB,CAAC;IAYpE;;;;OAIG;IACG,kBAAkB,CAAC,UAAU,EAAE,EAAE;IAIjC,iBAAiB,CAAC,SAAS,EAAE,EAAE;IAIrC;;;;;OAKG;IACH,oBAAoB,IAAI,OAAO,CAAC,iBAAiB,CAAC;CAGnD"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { MerkleTreeId } from '@aztec/types';
|
|
2
|
+
/**
|
|
3
|
+
* A data oracle that provides information needed for simulating a transaction.
|
|
4
|
+
*/
|
|
5
|
+
export class SimulatorOracle {
|
|
6
|
+
constructor(contractDataOracle, db, keyStore, stateInfoProvider) {
|
|
7
|
+
this.contractDataOracle = contractDataOracle;
|
|
8
|
+
this.db = db;
|
|
9
|
+
this.keyStore = keyStore;
|
|
10
|
+
this.stateInfoProvider = stateInfoProvider;
|
|
11
|
+
}
|
|
12
|
+
getSecretKey(_contractAddress, pubKey) {
|
|
13
|
+
return this.keyStore.getAccountPrivateKey(pubKey);
|
|
14
|
+
}
|
|
15
|
+
async getCompleteAddress(address) {
|
|
16
|
+
const completeAddress = await this.db.getCompleteAddress(address);
|
|
17
|
+
if (!completeAddress)
|
|
18
|
+
throw new Error(`Unknown complete address for address ${address.toString()}. Add the information to PXE Service by calling server.registerRecipient(...) or server.registerAccount(...)`);
|
|
19
|
+
return completeAddress;
|
|
20
|
+
}
|
|
21
|
+
async getAuthWitness(messageHash) {
|
|
22
|
+
const witness = await this.db.getAuthWitness(messageHash);
|
|
23
|
+
if (!witness)
|
|
24
|
+
throw new Error(`Unknown auth witness for message hash ${messageHash.toString(true)}`);
|
|
25
|
+
return witness;
|
|
26
|
+
}
|
|
27
|
+
async getNotes(contractAddress, storageSlot) {
|
|
28
|
+
const noteDaos = await this.db.getNoteSpendingInfo(contractAddress, storageSlot);
|
|
29
|
+
return noteDaos.map(({ contractAddress, storageSlot, nonce, notePreimage, innerNoteHash, siloedNullifier, index }) => ({
|
|
30
|
+
contractAddress,
|
|
31
|
+
storageSlot,
|
|
32
|
+
nonce,
|
|
33
|
+
preimage: notePreimage.items,
|
|
34
|
+
innerNoteHash,
|
|
35
|
+
siloedNullifier,
|
|
36
|
+
// PXE can use this index to get full MembershipWitness
|
|
37
|
+
index,
|
|
38
|
+
}));
|
|
39
|
+
}
|
|
40
|
+
async getFunctionABI(contractAddress, selector) {
|
|
41
|
+
const abi = await this.contractDataOracle.getFunctionAbi(contractAddress, selector);
|
|
42
|
+
const debug = await this.contractDataOracle.getFunctionDebugMetadata(contractAddress, selector);
|
|
43
|
+
return {
|
|
44
|
+
...abi,
|
|
45
|
+
debug,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
async getPortalContractAddress(contractAddress) {
|
|
49
|
+
return await this.contractDataOracle.getPortalContractAddress(contractAddress);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Retrieves the L1ToL2Message associated with a specific message key
|
|
53
|
+
* Throws an error if the message key is not found
|
|
54
|
+
*
|
|
55
|
+
* @param msgKey - The key of the message to be retrieved
|
|
56
|
+
* @returns A promise that resolves to the message data, a sibling path and the
|
|
57
|
+
* index of the message in the l1ToL2MessagesTree
|
|
58
|
+
*/
|
|
59
|
+
async getL1ToL2Message(msgKey) {
|
|
60
|
+
const messageAndIndex = await this.stateInfoProvider.getL1ToL2MessageAndIndex(msgKey);
|
|
61
|
+
const message = messageAndIndex.message.toFieldArray();
|
|
62
|
+
const index = messageAndIndex.index;
|
|
63
|
+
const siblingPath = await this.stateInfoProvider.getL1ToL2MessagesTreePath(index);
|
|
64
|
+
return {
|
|
65
|
+
message,
|
|
66
|
+
siblingPath: siblingPath.toFieldArray(),
|
|
67
|
+
index,
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Gets the index of a commitment in the private data tree.
|
|
72
|
+
* @param commitment - The commitment.
|
|
73
|
+
* @returns - The index of the commitment. Undefined if it does not exist in the tree.
|
|
74
|
+
*/
|
|
75
|
+
async getCommitmentIndex(commitment) {
|
|
76
|
+
return await this.stateInfoProvider.findLeafIndex(MerkleTreeId.PRIVATE_DATA_TREE, commitment.toBuffer());
|
|
77
|
+
}
|
|
78
|
+
async getNullifierIndex(nullifier) {
|
|
79
|
+
return await this.stateInfoProvider.findLeafIndex(MerkleTreeId.NULLIFIER_TREE, nullifier.toBuffer());
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Retrieve the databases view of the Historic Block Data object.
|
|
83
|
+
* This structure is fed into the circuits simulator and is used to prove against certain historic roots.
|
|
84
|
+
*
|
|
85
|
+
* @returns A Promise that resolves to a HistoricBlockData object.
|
|
86
|
+
*/
|
|
87
|
+
getHistoricBlockData() {
|
|
88
|
+
return Promise.resolve(this.db.getHistoricBlockData());
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc2ltdWxhdG9yX29yYWNsZS9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFXQSxPQUFPLEVBQVksWUFBWSxFQUFxQixNQUFNLGNBQWMsQ0FBQztBQUt6RTs7R0FFRztBQUNILE1BQU0sT0FBTyxlQUFlO0lBQzFCLFlBQ1Usa0JBQXNDLEVBQ3RDLEVBQVksRUFDWixRQUFrQixFQUNsQixpQkFBb0M7UUFIcEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUFvQjtRQUN0QyxPQUFFLEdBQUYsRUFBRSxDQUFVO1FBQ1osYUFBUSxHQUFSLFFBQVEsQ0FBVTtRQUNsQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQW1CO0lBQzNDLENBQUM7SUFFSixZQUFZLENBQUMsZ0JBQThCLEVBQUUsTUFBaUI7UUFDNUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLG9CQUFvQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLLENBQUMsa0JBQWtCLENBQUMsT0FBcUI7UUFDNUMsTUFBTSxlQUFlLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxDQUFDLGtCQUFrQixDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2xFLElBQUksQ0FBQyxlQUFlO1lBQ2xCLE1BQU0sSUFBSSxLQUFLLENBQ2Isd0NBQXdDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsOEdBQThHLENBQ3pLLENBQUM7UUFDSixPQUFPLGVBQWUsQ0FBQztJQUN6QixDQUFDO0lBRUQsS0FBSyxDQUFDLGNBQWMsQ0FBQyxXQUFlO1FBQ2xDLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLEVBQUUsQ0FBQyxjQUFjLENBQUMsV0FBVyxDQUFDLENBQUM7UUFDMUQsSUFBSSxDQUFDLE9BQU87WUFBRSxNQUFNLElBQUksS0FBSyxDQUFDLHlDQUF5QyxXQUFXLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FB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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/synchronizer/index.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { AztecAddress, PublicKey } from '@aztec/circuits.js';
|
|
2
|
+
import { AztecNode, KeyStore } from '@aztec/types';
|
|
3
|
+
import { Database } from '../database/index.js';
|
|
4
|
+
/**
|
|
5
|
+
* The Synchronizer class manages the synchronization of note processors and interacts with the Aztec node
|
|
6
|
+
* to obtain encrypted logs, blocks, and other necessary information for the accounts.
|
|
7
|
+
* It provides methods to start or stop the synchronization process, add new accounts, retrieve account
|
|
8
|
+
* details, and fetch transactions by hash. The Synchronizer ensures that it maintains the note processors
|
|
9
|
+
* in sync with the blockchain while handling retries and errors gracefully.
|
|
10
|
+
*/
|
|
11
|
+
export declare class Synchronizer {
|
|
12
|
+
private node;
|
|
13
|
+
private db;
|
|
14
|
+
private runningPromise?;
|
|
15
|
+
private noteProcessors;
|
|
16
|
+
private interruptableSleep;
|
|
17
|
+
private running;
|
|
18
|
+
private initialSyncBlockNumber;
|
|
19
|
+
private synchedToBlock;
|
|
20
|
+
private log;
|
|
21
|
+
private noteProcessorsToCatchUp;
|
|
22
|
+
constructor(node: AztecNode, db: Database, logSuffix?: string);
|
|
23
|
+
/**
|
|
24
|
+
* Starts the synchronisation process by fetching encrypted logs and blocks from a specified position.
|
|
25
|
+
* Continuously processes the fetched data for all note processors until stopped. If there is no data
|
|
26
|
+
* available, it retries after a specified interval.
|
|
27
|
+
*
|
|
28
|
+
* @param from - The starting position for fetching encrypted logs and blocks.
|
|
29
|
+
* @param limit - The maximum number of encrypted, unencrypted logs and blocks to fetch in each iteration.
|
|
30
|
+
* @param retryInterval - The time interval (in ms) to wait before retrying if no data is available.
|
|
31
|
+
*/
|
|
32
|
+
start(from?: number, limit?: number, retryInterval?: number): Promise<void>;
|
|
33
|
+
protected initialSync(): Promise<void>;
|
|
34
|
+
protected work(limit?: number, retryInterval?: number): Promise<void>;
|
|
35
|
+
protected workNoteProcessorCatchUp(limit?: number, retryInterval?: number): Promise<void>;
|
|
36
|
+
private setBlockDataFromBlock;
|
|
37
|
+
/**
|
|
38
|
+
* Stops the synchronizer gracefully, interrupting any ongoing sleep and waiting for the current
|
|
39
|
+
* iteration to complete before setting the running state to false. Once stopped, the synchronizer
|
|
40
|
+
* will no longer process blocks or encrypted logs and must be restarted using the start method.
|
|
41
|
+
*
|
|
42
|
+
* @returns A promise that resolves when the synchronizer has successfully stopped.
|
|
43
|
+
*/
|
|
44
|
+
stop(): Promise<void>;
|
|
45
|
+
/**
|
|
46
|
+
* Add a new account to the Synchronizer with the specified private key.
|
|
47
|
+
* Creates a NoteProcessor instance for the account and pushes it into the noteProcessors array.
|
|
48
|
+
* The method resolves immediately after pushing the new note processor.
|
|
49
|
+
*
|
|
50
|
+
* @param publicKey - The public key for the account.
|
|
51
|
+
* @param keyStore - The key store.
|
|
52
|
+
* @returns A promise that resolves once the account is added to the Synchronizer.
|
|
53
|
+
*/
|
|
54
|
+
addAccount(publicKey: PublicKey, keyStore: KeyStore): void;
|
|
55
|
+
/**
|
|
56
|
+
* Checks if the specified account is synchronized.
|
|
57
|
+
* @param account - The aztec address for which to query the sync status.
|
|
58
|
+
* @returns True if the account is fully synched, false otherwise.
|
|
59
|
+
* @remarks Checks whether all the notes from all the blocks have been processed. If it is not the case, the
|
|
60
|
+
* retrieved information from contracts might be old/stale (e.g. old token balance).
|
|
61
|
+
* @throws If checking a sync status of account which is not registered.
|
|
62
|
+
*/
|
|
63
|
+
isAccountStateSynchronized(account: AztecAddress): Promise<boolean>;
|
|
64
|
+
/**
|
|
65
|
+
* Checks whether all the blocks were processed (tree roots updated, txs updated with block info, etc.).
|
|
66
|
+
* @returns True if there are no outstanding blocks to be synched.
|
|
67
|
+
* @remarks This indicates that blocks and transactions are synched even if notes are not.
|
|
68
|
+
* @remarks Compares local block number with the block number from aztec node.
|
|
69
|
+
*/
|
|
70
|
+
isGlobalStateSynchronized(): Promise<boolean>;
|
|
71
|
+
/**
|
|
72
|
+
* Returns the latest block that has been synchronized by the synchronizer and each account.
|
|
73
|
+
* @returns The latest block synchronized for blocks, and the latest block synched for notes for each public key being tracked.
|
|
74
|
+
*/
|
|
75
|
+
getSyncStatus(): {
|
|
76
|
+
blocks: number;
|
|
77
|
+
notes: {
|
|
78
|
+
[k: string]: number;
|
|
79
|
+
};
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=synchronizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"synchronizer.d.ts","sourceRoot":"","sources":["../../src/synchronizer/synchronizer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAuC,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAIlG,OAAO,EAAE,SAAS,EAAwB,QAAQ,EAA2B,MAAM,cAAc,CAAC;AAElG,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAGhD;;;;;;GAMG;AACH,qBAAa,YAAY;IAUX,OAAO,CAAC,IAAI;IAAa,OAAO,CAAC,EAAE;IAT/C,OAAO,CAAC,cAAc,CAAC,CAAgB;IACvC,OAAO,CAAC,cAAc,CAAuB;IAC7C,OAAO,CAAC,kBAAkB,CAA4B;IACtD,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,GAAG,CAAc;IACzB,OAAO,CAAC,uBAAuB,CAAuB;gBAElC,IAAI,EAAE,SAAS,EAAU,EAAE,EAAE,QAAQ,EAAE,SAAS,SAAK;IAIzE;;;;;;;;OAQG;IACU,KAAK,CAAC,IAAI,SAAuB,EAAE,KAAK,SAAI,EAAE,aAAa,SAAO;cA2B/D,WAAW;cAUX,IAAI,CAAC,KAAK,SAAI,EAAE,aAAa,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;cA2DpD,wBAAwB,CAAC,KAAK,SAAI,EAAE,aAAa,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC;YAsD1E,qBAAqB;IAoBnC;;;;;;OAMG;IACU,IAAI;IAOjB;;;;;;;;OAQG;IACI,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ;IAS1D;;;;;;;OAOG;IACU,0BAA0B,CAAC,OAAO,EAAE,YAAY;IAc7D;;;;;OAKG;IACU,yBAAyB;IAKtC;;;OAGG;IACI,aAAa;;;;;;CAMrB"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
import { CircuitsWasm, Fr, HistoricBlockData } from '@aztec/circuits.js';
|
|
2
|
+
import { computeGlobalsHash } from '@aztec/circuits.js/abis';
|
|
3
|
+
import { createDebugLogger } from '@aztec/foundation/log';
|
|
4
|
+
import { InterruptableSleep } from '@aztec/foundation/sleep';
|
|
5
|
+
import { INITIAL_L2_BLOCK_NUM, L2BlockContext, LogType } from '@aztec/types';
|
|
6
|
+
import { NoteProcessor } from '../note_processor/index.js';
|
|
7
|
+
/**
|
|
8
|
+
* The Synchronizer class manages the synchronization of note processors and interacts with the Aztec node
|
|
9
|
+
* to obtain encrypted logs, blocks, and other necessary information for the accounts.
|
|
10
|
+
* It provides methods to start or stop the synchronization process, add new accounts, retrieve account
|
|
11
|
+
* details, and fetch transactions by hash. The Synchronizer ensures that it maintains the note processors
|
|
12
|
+
* in sync with the blockchain while handling retries and errors gracefully.
|
|
13
|
+
*/
|
|
14
|
+
export class Synchronizer {
|
|
15
|
+
constructor(node, db, logSuffix = '') {
|
|
16
|
+
this.node = node;
|
|
17
|
+
this.db = db;
|
|
18
|
+
this.noteProcessors = [];
|
|
19
|
+
this.interruptableSleep = new InterruptableSleep();
|
|
20
|
+
this.running = false;
|
|
21
|
+
this.initialSyncBlockNumber = 0;
|
|
22
|
+
this.synchedToBlock = 0;
|
|
23
|
+
this.noteProcessorsToCatchUp = [];
|
|
24
|
+
this.log = createDebugLogger(logSuffix ? `aztec:pxe_synchronizer_${logSuffix}` : 'aztec:pxe_synchronizer');
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Starts the synchronisation process by fetching encrypted logs and blocks from a specified position.
|
|
28
|
+
* Continuously processes the fetched data for all note processors until stopped. If there is no data
|
|
29
|
+
* available, it retries after a specified interval.
|
|
30
|
+
*
|
|
31
|
+
* @param from - The starting position for fetching encrypted logs and blocks.
|
|
32
|
+
* @param limit - The maximum number of encrypted, unencrypted logs and blocks to fetch in each iteration.
|
|
33
|
+
* @param retryInterval - The time interval (in ms) to wait before retrying if no data is available.
|
|
34
|
+
*/
|
|
35
|
+
async start(from = INITIAL_L2_BLOCK_NUM, limit = 1, retryInterval = 1000) {
|
|
36
|
+
if (this.running)
|
|
37
|
+
return;
|
|
38
|
+
this.running = true;
|
|
39
|
+
if (from < this.synchedToBlock + 1) {
|
|
40
|
+
throw new Error(`From block ${from} is smaller than the currently synched block ${this.synchedToBlock}`);
|
|
41
|
+
}
|
|
42
|
+
this.synchedToBlock = from - 1;
|
|
43
|
+
await this.initialSync();
|
|
44
|
+
const run = async () => {
|
|
45
|
+
while (this.running) {
|
|
46
|
+
if (this.noteProcessorsToCatchUp.length > 0) {
|
|
47
|
+
// There is a note processor that needs to catch up. We hijack the main loop to catch up the note processor.
|
|
48
|
+
await this.workNoteProcessorCatchUp(limit, retryInterval);
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
// No note processor needs to catch up. We continue with the normal flow.
|
|
52
|
+
await this.work(limit, retryInterval);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
this.runningPromise = run();
|
|
57
|
+
this.log('Started');
|
|
58
|
+
}
|
|
59
|
+
async initialSync() {
|
|
60
|
+
const [blockNumber, historicBlockData] = await Promise.all([
|
|
61
|
+
this.node.getBlockNumber(),
|
|
62
|
+
this.node.getHistoricBlockData(),
|
|
63
|
+
]);
|
|
64
|
+
this.initialSyncBlockNumber = blockNumber;
|
|
65
|
+
this.synchedToBlock = this.initialSyncBlockNumber;
|
|
66
|
+
await this.db.setHistoricBlockData(historicBlockData);
|
|
67
|
+
}
|
|
68
|
+
async work(limit = 1, retryInterval = 1000) {
|
|
69
|
+
const from = this.synchedToBlock + 1;
|
|
70
|
+
try {
|
|
71
|
+
let encryptedLogs = await this.node.getLogs(from, limit, LogType.ENCRYPTED);
|
|
72
|
+
if (!encryptedLogs.length) {
|
|
73
|
+
await this.interruptableSleep.sleep(retryInterval);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
let unencryptedLogs = await this.node.getLogs(from, limit, LogType.UNENCRYPTED);
|
|
77
|
+
if (!unencryptedLogs.length) {
|
|
78
|
+
await this.interruptableSleep.sleep(retryInterval);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// Note: If less than `limit` encrypted logs is returned, then we fetch only that number of blocks.
|
|
82
|
+
const blocks = await this.node.getBlocks(from, encryptedLogs.length);
|
|
83
|
+
if (!blocks.length) {
|
|
84
|
+
await this.interruptableSleep.sleep(retryInterval);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
if (blocks.length !== encryptedLogs.length) {
|
|
88
|
+
// "Trim" the encrypted logs to match the number of blocks.
|
|
89
|
+
encryptedLogs = encryptedLogs.slice(0, blocks.length);
|
|
90
|
+
}
|
|
91
|
+
if (blocks.length !== unencryptedLogs.length) {
|
|
92
|
+
// "Trim" the unencrypted logs to match the number of blocks.
|
|
93
|
+
unencryptedLogs = unencryptedLogs.slice(0, blocks.length);
|
|
94
|
+
}
|
|
95
|
+
// attach logs to blocks
|
|
96
|
+
blocks.forEach((block, i) => {
|
|
97
|
+
block.attachLogs(encryptedLogs[i], LogType.ENCRYPTED);
|
|
98
|
+
block.attachLogs(unencryptedLogs[i], LogType.UNENCRYPTED);
|
|
99
|
+
});
|
|
100
|
+
// Wrap blocks in block contexts.
|
|
101
|
+
const blockContexts = blocks.map(block => new L2BlockContext(block));
|
|
102
|
+
// Update latest tree roots from the most recent block
|
|
103
|
+
const latestBlock = blockContexts[blockContexts.length - 1];
|
|
104
|
+
await this.setBlockDataFromBlock(latestBlock);
|
|
105
|
+
this.log(`Forwarding ${encryptedLogs.length} encrypted logs and blocks to ${this.noteProcessors.length} note processors`);
|
|
106
|
+
for (const noteProcessor of this.noteProcessors) {
|
|
107
|
+
await noteProcessor.process(blockContexts, encryptedLogs);
|
|
108
|
+
}
|
|
109
|
+
this.synchedToBlock = latestBlock.block.number;
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
this.log.error(`Error in synchronizer work`, err);
|
|
113
|
+
await this.interruptableSleep.sleep(retryInterval);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
async workNoteProcessorCatchUp(limit = 1, retryInterval = 1000) {
|
|
117
|
+
const noteProcessor = this.noteProcessorsToCatchUp[0];
|
|
118
|
+
if (noteProcessor.status.syncedToBlock === this.synchedToBlock) {
|
|
119
|
+
// Note processor already synched, nothing to do
|
|
120
|
+
this.noteProcessorsToCatchUp.shift();
|
|
121
|
+
this.noteProcessors.push(noteProcessor);
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
const from = noteProcessor.status.syncedToBlock + 1;
|
|
125
|
+
// Ensuring that the note processor does not sync further than the main sync.
|
|
126
|
+
limit = Math.min(limit, this.synchedToBlock - from + 1);
|
|
127
|
+
if (limit < 1) {
|
|
128
|
+
throw new Error(`Unexpected limit ${limit} for note processor catch up`);
|
|
129
|
+
}
|
|
130
|
+
try {
|
|
131
|
+
let encryptedLogs = await this.node.getLogs(from, limit, LogType.ENCRYPTED);
|
|
132
|
+
if (!encryptedLogs.length) {
|
|
133
|
+
// This should never happen because this function should only be called when the note processor is lagging
|
|
134
|
+
// behind main sync.
|
|
135
|
+
throw new Error('No encrypted logs in processor catch up mode');
|
|
136
|
+
}
|
|
137
|
+
// Note: If less than `limit` encrypted logs is returned, then we fetch only that number of blocks.
|
|
138
|
+
const blocks = await this.node.getBlocks(from, encryptedLogs.length);
|
|
139
|
+
if (!blocks.length) {
|
|
140
|
+
// This should never happen because this function should only be called when the note processor is lagging
|
|
141
|
+
// behind main sync.
|
|
142
|
+
throw new Error('No blocks in processor catch up mode');
|
|
143
|
+
}
|
|
144
|
+
if (blocks.length !== encryptedLogs.length) {
|
|
145
|
+
// "Trim" the encrypted logs to match the number of blocks.
|
|
146
|
+
encryptedLogs = encryptedLogs.slice(0, blocks.length);
|
|
147
|
+
}
|
|
148
|
+
const blockContexts = blocks.map(block => new L2BlockContext(block));
|
|
149
|
+
this.log(`Forwarding ${encryptedLogs.length} encrypted logs and blocks to note processor in catch up mode`);
|
|
150
|
+
await noteProcessor.process(blockContexts, encryptedLogs);
|
|
151
|
+
if (noteProcessor.status.syncedToBlock === this.synchedToBlock) {
|
|
152
|
+
// Note processor caught up, move it to `noteProcessors` from `noteProcessorsToCatchUp`.
|
|
153
|
+
this.noteProcessorsToCatchUp.shift();
|
|
154
|
+
this.noteProcessors.push(noteProcessor);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch (err) {
|
|
158
|
+
this.log.error(`Error in synchronizer workNoteProcessorCatchUp`, err);
|
|
159
|
+
await this.interruptableSleep.sleep(retryInterval);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
async setBlockDataFromBlock(latestBlock) {
|
|
163
|
+
const { block } = latestBlock;
|
|
164
|
+
if (block.number < this.initialSyncBlockNumber)
|
|
165
|
+
return;
|
|
166
|
+
const wasm = await CircuitsWasm.get();
|
|
167
|
+
const globalsHash = computeGlobalsHash(wasm, latestBlock.block.globalVariables);
|
|
168
|
+
const blockData = new HistoricBlockData(block.endPrivateDataTreeSnapshot.root, block.endNullifierTreeSnapshot.root, block.endContractTreeSnapshot.root, block.endL1ToL2MessagesTreeSnapshot.root, block.endHistoricBlocksTreeSnapshot.root, Fr.ZERO, // todo: private kernel vk tree root
|
|
169
|
+
block.endPublicDataTreeRoot, globalsHash);
|
|
170
|
+
await this.db.setHistoricBlockData(blockData);
|
|
171
|
+
}
|
|
172
|
+
/**
|
|
173
|
+
* Stops the synchronizer gracefully, interrupting any ongoing sleep and waiting for the current
|
|
174
|
+
* iteration to complete before setting the running state to false. Once stopped, the synchronizer
|
|
175
|
+
* will no longer process blocks or encrypted logs and must be restarted using the start method.
|
|
176
|
+
*
|
|
177
|
+
* @returns A promise that resolves when the synchronizer has successfully stopped.
|
|
178
|
+
*/
|
|
179
|
+
async stop() {
|
|
180
|
+
this.running = false;
|
|
181
|
+
this.interruptableSleep.interrupt();
|
|
182
|
+
await this.runningPromise;
|
|
183
|
+
this.log('Stopped');
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Add a new account to the Synchronizer with the specified private key.
|
|
187
|
+
* Creates a NoteProcessor instance for the account and pushes it into the noteProcessors array.
|
|
188
|
+
* The method resolves immediately after pushing the new note processor.
|
|
189
|
+
*
|
|
190
|
+
* @param publicKey - The public key for the account.
|
|
191
|
+
* @param keyStore - The key store.
|
|
192
|
+
* @returns A promise that resolves once the account is added to the Synchronizer.
|
|
193
|
+
*/
|
|
194
|
+
addAccount(publicKey, keyStore) {
|
|
195
|
+
const processor = this.noteProcessors.find(x => x.publicKey.equals(publicKey));
|
|
196
|
+
if (processor) {
|
|
197
|
+
return;
|
|
198
|
+
}
|
|
199
|
+
this.noteProcessorsToCatchUp.push(new NoteProcessor(publicKey, keyStore, this.db, this.node));
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Checks if the specified account is synchronized.
|
|
203
|
+
* @param account - The aztec address for which to query the sync status.
|
|
204
|
+
* @returns True if the account is fully synched, false otherwise.
|
|
205
|
+
* @remarks Checks whether all the notes from all the blocks have been processed. If it is not the case, the
|
|
206
|
+
* retrieved information from contracts might be old/stale (e.g. old token balance).
|
|
207
|
+
* @throws If checking a sync status of account which is not registered.
|
|
208
|
+
*/
|
|
209
|
+
async isAccountStateSynchronized(account) {
|
|
210
|
+
const completeAddress = await this.db.getCompleteAddress(account);
|
|
211
|
+
if (!completeAddress) {
|
|
212
|
+
throw new Error(`Checking if account is synched is not possible for ${account} because it is not registered.`);
|
|
213
|
+
}
|
|
214
|
+
const processor = this.noteProcessors.find(x => x.publicKey.equals(completeAddress.publicKey));
|
|
215
|
+
if (!processor) {
|
|
216
|
+
throw new Error(`Checking if account is synched is not possible for ${account} because it is only registered as a recipient.`);
|
|
217
|
+
}
|
|
218
|
+
return await processor.isSynchronized();
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Checks whether all the blocks were processed (tree roots updated, txs updated with block info, etc.).
|
|
222
|
+
* @returns True if there are no outstanding blocks to be synched.
|
|
223
|
+
* @remarks This indicates that blocks and transactions are synched even if notes are not.
|
|
224
|
+
* @remarks Compares local block number with the block number from aztec node.
|
|
225
|
+
*/
|
|
226
|
+
async isGlobalStateSynchronized() {
|
|
227
|
+
const latest = await this.node.getBlockNumber();
|
|
228
|
+
return latest <= this.synchedToBlock;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Returns the latest block that has been synchronized by the synchronizer and each account.
|
|
232
|
+
* @returns The latest block synchronized for blocks, and the latest block synched for notes for each public key being tracked.
|
|
233
|
+
*/
|
|
234
|
+
getSyncStatus() {
|
|
235
|
+
return {
|
|
236
|
+
blocks: this.synchedToBlock,
|
|
237
|
+
notes: Object.fromEntries(this.noteProcessors.map(n => [n.publicKey.toString(), n.status.syncedToBlock])),
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3luY2hyb25pemVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N5bmNocm9uaXplci9zeW5jaHJvbml6ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFnQixZQUFZLEVBQUUsRUFBRSxFQUFFLGlCQUFpQixFQUFhLE1BQU0sb0JBQW9CLENBQUM7QUFDbEcsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFlLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGtCQUFrQixFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDN0QsT0FBTyxFQUFhLG9CQUFvQixFQUFZLGNBQWMsRUFBRSxPQUFPLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHbEcsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBRTNEOzs7Ozs7R0FNRztBQUNILE1BQU0sT0FBTyxZQUFZO0lBVXZCLFlBQW9CLElBQWUsRUFBVSxFQUFZLEVBQUUsU0FBUyxHQUFHLEVBQUU7UUFBckQsU0FBSSxHQUFKLElBQUksQ0FBVztRQUFVLE9BQUUsR0FBRixFQUFFLENBQVU7UUFSakQsbUJBQWMsR0FBb0IsRUFBRSxDQUFDO1FBQ3JDLHVCQUFrQixHQUFHLElBQUksa0JBQWtCLEVBQUUsQ0FBQztRQUM5QyxZQUFPLEdBQUcsS0FBSyxDQUFDO1FBQ2hCLDJCQUFzQixHQUFHLENBQUMsQ0FBQztRQUMzQixtQkFBYyxHQUFHLENBQUMsQ0FBQztRQUVuQiw0QkFBdUIsR0FBb0IsRUFBRSxDQUFDO1FBR3BELElBQUksQ0FBQyxHQUFHLEdBQUcsaUJBQWlCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQywwQkFBMEIsU0FBUyxFQUFFLENBQUMsQ0FBQyxDQUFDLHdCQUF3QixDQUFDLENBQUM7SUFDN0csQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksS0FBSyxDQUFDLEtB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
|
package/package.json
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@aztec/pxe",
|
|
3
|
+
"version": "0.8.6",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": "./dest/index.js",
|
|
6
|
+
"bin": "./dest/bin/index.js",
|
|
7
|
+
"typedocOptions": {
|
|
8
|
+
"entryPoints": [
|
|
9
|
+
"./src/index.ts"
|
|
10
|
+
],
|
|
11
|
+
"name": "Wallet",
|
|
12
|
+
"tsconfig": "./tsconfig.json"
|
|
13
|
+
},
|
|
14
|
+
"scripts": {
|
|
15
|
+
"build": "yarn clean && tsc -b",
|
|
16
|
+
"build:dev": "tsc -b --watch",
|
|
17
|
+
"clean": "rm -rf ./dest .tsbuildinfo",
|
|
18
|
+
"formatting": "run -T prettier --check ./src && run -T eslint ./src",
|
|
19
|
+
"formatting:fix": "run -T prettier -w ./src",
|
|
20
|
+
"test": "NODE_NO_WARNINGS=1 node --experimental-vm-modules $(yarn bin jest) --passWithNoTests",
|
|
21
|
+
"start": "DEBUG='aztec:*' && node ./dest/bin/index.js"
|
|
22
|
+
},
|
|
23
|
+
"inherits": [
|
|
24
|
+
"../package.common.json"
|
|
25
|
+
],
|
|
26
|
+
"jest": {
|
|
27
|
+
"preset": "ts-jest/presets/default-esm",
|
|
28
|
+
"moduleNameMapper": {
|
|
29
|
+
"^(\\.{1,2}/.*)\\.m?js$": "$1"
|
|
30
|
+
},
|
|
31
|
+
"testRegex": "./src/.*\\.test\\.(js|mjs|ts)$",
|
|
32
|
+
"rootDir": "./src"
|
|
33
|
+
},
|
|
34
|
+
"dependencies": {
|
|
35
|
+
"@aztec/acir-simulator": "0.8.6",
|
|
36
|
+
"@aztec/circuits.js": "0.8.6",
|
|
37
|
+
"@aztec/ethereum": "0.8.6",
|
|
38
|
+
"@aztec/foundation": "0.8.6",
|
|
39
|
+
"@aztec/key-store": "0.8.6",
|
|
40
|
+
"@aztec/noir-compiler": "0.8.6",
|
|
41
|
+
"@aztec/types": "0.8.6",
|
|
42
|
+
"koa": "^2.14.2",
|
|
43
|
+
"koa-router": "^12.0.0",
|
|
44
|
+
"lodash.omit": "^4.5.0",
|
|
45
|
+
"lodash.partition": "^4.6.0",
|
|
46
|
+
"lodash.times": "^4.3.2",
|
|
47
|
+
"sha3": "^2.1.4",
|
|
48
|
+
"tslib": "^2.4.0",
|
|
49
|
+
"viem": "^1.2.5"
|
|
50
|
+
},
|
|
51
|
+
"devDependencies": {
|
|
52
|
+
"@jest/globals": "^29.5.0",
|
|
53
|
+
"@rushstack/eslint-patch": "^1.1.4",
|
|
54
|
+
"@types/jest": "^29.5.0",
|
|
55
|
+
"@types/lodash.omit": "^4.5.7",
|
|
56
|
+
"@types/lodash.partition": "^4.6.0",
|
|
57
|
+
"@types/lodash.times": "^4.3.7",
|
|
58
|
+
"@types/node": "^18.7.23",
|
|
59
|
+
"jest": "^29.5.0",
|
|
60
|
+
"jest-mock-extended": "^3.0.3",
|
|
61
|
+
"ts-jest": "^29.1.0",
|
|
62
|
+
"ts-node": "^10.9.1",
|
|
63
|
+
"typescript": "^5.0.4"
|
|
64
|
+
},
|
|
65
|
+
"files": [
|
|
66
|
+
"dest",
|
|
67
|
+
"src",
|
|
68
|
+
"!*.test.*"
|
|
69
|
+
],
|
|
70
|
+
"types": "./dest/index.d.ts",
|
|
71
|
+
"engines": {
|
|
72
|
+
"node": ">=18"
|
|
73
|
+
}
|
|
74
|
+
}
|