@aztec/txe 0.0.1-commit.1142ef1 → 0.0.1-commit.11bf3dd6e
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/constants.d.ts +1 -2
- package/dest/constants.d.ts.map +1 -1
- package/dest/constants.js +0 -1
- package/dest/index.d.ts +1 -1
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +88 -54
- package/dest/oracle/interfaces.d.ts +29 -28
- package/dest/oracle/interfaces.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.d.ts +13 -13
- package/dest/oracle/txe_oracle_public_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_public_context.js +16 -16
- package/dest/oracle/txe_oracle_top_level_context.d.ts +28 -22
- package/dest/oracle/txe_oracle_top_level_context.d.ts.map +1 -1
- package/dest/oracle/txe_oracle_top_level_context.js +165 -71
- package/dest/rpc_translator.d.ts +125 -81
- package/dest/rpc_translator.d.ts.map +1 -1
- package/dest/rpc_translator.js +426 -179
- package/dest/state_machine/archiver.d.ts +20 -69
- package/dest/state_machine/archiver.d.ts.map +1 -1
- package/dest/state_machine/archiver.js +36 -179
- package/dest/state_machine/dummy_p2p_client.d.ts +18 -13
- package/dest/state_machine/dummy_p2p_client.d.ts.map +1 -1
- package/dest/state_machine/dummy_p2p_client.js +33 -18
- package/dest/state_machine/global_variable_builder.d.ts +9 -4
- package/dest/state_machine/global_variable_builder.d.ts.map +1 -1
- package/dest/state_machine/global_variable_builder.js +9 -3
- package/dest/state_machine/index.d.ts +7 -5
- package/dest/state_machine/index.d.ts.map +1 -1
- package/dest/state_machine/index.js +40 -13
- package/dest/state_machine/mock_epoch_cache.d.ts +25 -8
- package/dest/state_machine/mock_epoch_cache.d.ts.map +1 -1
- package/dest/state_machine/mock_epoch_cache.js +46 -9
- package/dest/state_machine/synchronizer.d.ts +6 -6
- package/dest/state_machine/synchronizer.d.ts.map +1 -1
- package/dest/state_machine/synchronizer.js +3 -3
- package/dest/txe_session.d.ts +12 -6
- package/dest/txe_session.d.ts.map +1 -1
- package/dest/txe_session.js +115 -28
- package/dest/util/encoding.d.ts +88 -18
- package/dest/util/encoding.d.ts.map +1 -1
- package/dest/util/encoding.js +4 -0
- package/dest/util/txe_public_contract_data_source.d.ts +2 -3
- package/dest/util/txe_public_contract_data_source.d.ts.map +1 -1
- package/dest/util/txe_public_contract_data_source.js +6 -25
- package/dest/utils/block_creation.d.ts +4 -4
- package/dest/utils/block_creation.d.ts.map +1 -1
- package/dest/utils/block_creation.js +18 -4
- package/dest/utils/tx_effect_creation.d.ts +2 -3
- package/dest/utils/tx_effect_creation.d.ts.map +1 -1
- package/dest/utils/tx_effect_creation.js +3 -6
- package/package.json +16 -16
- package/src/constants.ts +0 -1
- package/src/index.ts +89 -52
- package/src/oracle/interfaces.ts +32 -31
- package/src/oracle/txe_oracle_public_context.ts +16 -18
- package/src/oracle/txe_oracle_top_level_context.ts +208 -123
- package/src/rpc_translator.ts +493 -204
- package/src/state_machine/archiver.ts +38 -234
- package/src/state_machine/dummy_p2p_client.ts +46 -24
- package/src/state_machine/global_variable_builder.ts +18 -3
- package/src/state_machine/index.ts +56 -12
- package/src/state_machine/mock_epoch_cache.ts +57 -14
- package/src/state_machine/synchronizer.ts +5 -5
- package/src/txe_session.ts +132 -88
- package/src/util/encoding.ts +5 -0
- package/src/util/txe_public_contract_data_source.ts +10 -38
- package/src/utils/block_creation.ts +19 -16
- package/src/utils/tx_effect_creation.ts +3 -11
- package/dest/util/txe_contract_store.d.ts +0 -12
- package/dest/util/txe_contract_store.d.ts.map +0 -1
- package/dest/util/txe_contract_store.js +0 -22
- package/src/util/txe_contract_store.ts +0 -36
|
@@ -1,80 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { ArchiverDataSourceBase } from '@aztec/archiver';
|
|
2
|
+
import { type EpochNumber, type SlotNumber } from '@aztec/foundation/branded-types';
|
|
3
3
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
4
4
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
5
5
|
import type { AztecAsyncKVStore } from '@aztec/kv-store';
|
|
6
|
-
import type {
|
|
7
|
-
import
|
|
8
|
-
import { Checkpoint, PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
9
|
-
import type { ContractInstanceWithAddress } from '@aztec/stdlib/contract';
|
|
6
|
+
import type { L2Tips, ValidateCheckpointResult } from '@aztec/stdlib/block';
|
|
7
|
+
import type { PublishedCheckpoint } from '@aztec/stdlib/checkpoint';
|
|
10
8
|
import type { L1RollupConstants } from '@aztec/stdlib/epoch-helpers';
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
/**
|
|
10
|
+
* TXE Archiver implementation.
|
|
11
|
+
* Provides most of the endpoints needed by the node for reading from and writing to state,
|
|
12
|
+
* without needing any of the extra overhead that the Archiver itself requires (i.e. an L1 client).
|
|
13
|
+
*/
|
|
14
|
+
export declare class TXEArchiver extends ArchiverDataSourceBase {
|
|
15
|
+
private readonly updater;
|
|
14
16
|
constructor(db: AztecAsyncKVStore);
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* Gets the number of the latest L2 block processed by the block source implementation.
|
|
20
|
-
* @returns The number of the latest L2 block processed by the block source implementation.
|
|
21
|
-
*/
|
|
22
|
-
getBlockNumber(): Promise<BlockNumber>;
|
|
23
|
-
/**
|
|
24
|
-
* Gets the number of the latest L2 block proven seen by the block source implementation.
|
|
25
|
-
* @returns The number of the latest L2 block proven seen by the block source implementation.
|
|
26
|
-
*/
|
|
27
|
-
getProvenBlockNumber(): Promise<BlockNumber>;
|
|
28
|
-
/**
|
|
29
|
-
* Gets a published l2 block. If a negative number is passed, the block returned is the most recent.
|
|
30
|
-
* @param number - The block number to return (inclusive).
|
|
31
|
-
* @returns The requested L2 block.
|
|
32
|
-
*/
|
|
33
|
-
getPublishedBlock(number: number): Promise<PublishedL2Block | undefined>;
|
|
34
|
-
getPublishedBlocks(from: BlockNumber, limit: number, proven?: boolean): Promise<PublishedL2Block[]>;
|
|
35
|
-
getL2BlocksNew(from: BlockNumber, limit: number, proven?: boolean): Promise<L2BlockNew[]>;
|
|
36
|
-
private retrievePublishedBlocks;
|
|
37
|
-
/**
|
|
38
|
-
* Gets an l2 block. If a negative number is passed, the block returned is the most recent.
|
|
39
|
-
* @param number - The block number to return (inclusive).
|
|
40
|
-
* @returns The requested L2 block.
|
|
41
|
-
*/
|
|
42
|
-
getL2Block(number: BlockNumber | 'latest'): Promise<L2Block | undefined>;
|
|
43
|
-
/**
|
|
44
|
-
* Gets an L2 block (new format).
|
|
45
|
-
* @param number - The block number to return.
|
|
46
|
-
* @returns The requested L2 block.
|
|
47
|
-
*/
|
|
48
|
-
getL2BlockNew(number: BlockNumber): Promise<L2BlockNew | undefined>;
|
|
49
|
-
/**
|
|
50
|
-
* Gets an l2 block header.
|
|
51
|
-
* @param number - The block number to return or 'latest' for the most recent one.
|
|
52
|
-
* @returns The requested L2 block header.
|
|
53
|
-
*/
|
|
54
|
-
getBlockHeader(number: number | 'latest'): Promise<BlockHeader | undefined>;
|
|
55
|
-
getBlockRange(from: number, limit: number, _proven?: boolean): Promise<L2Block[]>;
|
|
56
|
-
getPublishedCheckpoints(_from: CheckpointNumber, _limit: number): Promise<PublishedCheckpoint[]>;
|
|
57
|
-
getCheckpointByArchive(_archive: Fr): Promise<Checkpoint | undefined>;
|
|
58
|
-
getL2SlotNumber(): Promise<SlotNumber | undefined>;
|
|
59
|
-
getL2EpochNumber(): Promise<EpochNumber>;
|
|
60
|
-
getCheckpointsForEpoch(_epochNumber: EpochNumber): Promise<Checkpoint[]>;
|
|
61
|
-
getBlocksForEpoch(_epochNumber: EpochNumber): Promise<L2Block[]>;
|
|
62
|
-
getBlockHeadersForEpoch(_epochNumber: EpochNumber): Promise<BlockHeader[]>;
|
|
63
|
-
isEpochComplete(_epochNumber: EpochNumber): Promise<boolean>;
|
|
64
|
-
getL2Tips(): Promise<L2Tips>;
|
|
17
|
+
addCheckpoints(checkpoints: PublishedCheckpoint[], result?: ValidateCheckpointResult): Promise<void>;
|
|
18
|
+
getRollupAddress(): Promise<EthAddress>;
|
|
19
|
+
getRegistryAddress(): Promise<EthAddress>;
|
|
65
20
|
getL1Constants(): Promise<L1RollupConstants>;
|
|
66
21
|
getGenesisValues(): Promise<{
|
|
67
22
|
genesisArchiveRoot: Fr;
|
|
68
23
|
}>;
|
|
24
|
+
getL1Timestamp(): Promise<bigint | undefined>;
|
|
25
|
+
getL2Tips(): Promise<L2Tips>;
|
|
26
|
+
getSyncedL2SlotNumber(): Promise<SlotNumber | undefined>;
|
|
27
|
+
getSyncedL2EpochNumber(): Promise<EpochNumber | undefined>;
|
|
28
|
+
isEpochComplete(_epochNumber: EpochNumber): Promise<boolean>;
|
|
69
29
|
syncImmediate(): Promise<void>;
|
|
70
|
-
getContract(_address: AztecAddress, _timestamp?: UInt64): Promise<ContractInstanceWithAddress | undefined>;
|
|
71
|
-
getRollupAddress(): Promise<EthAddress>;
|
|
72
|
-
getRegistryAddress(): Promise<EthAddress>;
|
|
73
|
-
getL1Timestamp(): Promise<bigint>;
|
|
74
|
-
isPendingChainInvalid(): Promise<boolean>;
|
|
75
|
-
getPendingChainValidationStatus(): Promise<ValidateCheckpointResult>;
|
|
76
|
-
getPublishedBlockByHash(_blockHash: Fr): Promise<PublishedL2Block | undefined>;
|
|
77
|
-
getPublishedBlockByArchive(_archive: Fr): Promise<PublishedL2Block | undefined>;
|
|
78
|
-
getCheckpointedBlocks(_from: BlockNumber, _limit: number, _proven?: boolean): Promise<never[]>;
|
|
79
30
|
}
|
|
80
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
31
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXJjaGl2ZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGF0ZV9tYWNoaW5lL2FyY2hpdmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxzQkFBc0IsRUFBaUQsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RyxPQUFPLEVBQW9CLEtBQUssV0FBVyxFQUFFLEtBQUssVUFBVSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDdEcsT0FBTyxFQUFFLEVBQUUsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQ3BELE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLGlCQUFpQixFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekQsT0FBTyxLQUFLLEVBQW9DLE1BQU0sRUFBRSx3QkFBd0IsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQzlHLE9BQU8sS0FBSyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDcEUsT0FBTyxLQUFLLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw2QkFBNkIsQ0FBQztBQUVyRTs7OztHQUlHO0FBQ0gscUJBQWEsV0FBWSxTQUFRLHNCQUFzQjtJQUNyRCxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBNEM7SUFFcEUsWUFBWSxFQUFFLEVBQUUsaUJBQWlCLEVBR2hDO0lBRVksY0FBYyxDQUFDLFdBQVcsRUFBRSxtQkFBbUIsRUFBRSxFQUFFLE1BQU0sQ0FBQyxFQUFFLHdCQUF3QixHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFaEg7SUFFTSxnQkFBZ0IsSUFBSSxPQUFPLENBQUMsVUFBVSxDQUFDLENBRTdDO0lBRU0sa0JBQWtCLElBQUksT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUUvQztJQUVNLGNBQWMsSUFBSSxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FFbEQ7SUFFTSxnQkFBZ0IsSUFBSSxPQUFPLENBQUM7UUFBRSxrQkFBa0IsRUFBRSxFQUFFLENBQUE7S0FBRSxDQUFDLENBRTdEO0lBRU0sY0FBYyxJQUFJLE9BQU8sQ0FBQyxNQUFNLEdBQUcsU0FBUyxDQUFDLENBRW5EO0lBRVksU0FBUyxJQUFJLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FpQ3hDO0lBRU0scUJBQXFCLElBQUksT0FBTyxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUMsQ0FFOUQ7SUFFTSxzQkFBc0IsSUFBSSxPQUFPLENBQUMsV0FBVyxHQUFHLFNBQVMsQ0FBQyxDQUVoRTtJQUVNLGVBQWUsQ0FBQyxZQUFZLEVBQUUsV0FBVyxHQUFHLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FFbEU7SUFFTSxhQUFhLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUVwQztDQUNGIn0=
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/state_machine/archiver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"archiver.d.ts","sourceRoot":"","sources":["../../src/state_machine/archiver.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAiD,MAAM,iBAAiB,CAAC;AAExG,OAAO,EAAoB,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,iCAAiC,CAAC;AACtG,OAAO,EAAE,EAAE,EAAE,MAAM,gCAAgC,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,KAAK,EAAoC,MAAM,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAC9G,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AACpE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE;;;;GAIG;AACH,qBAAa,WAAY,SAAQ,sBAAsB;IACrD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4C;IAEpE,YAAY,EAAE,EAAE,iBAAiB,EAGhC;IAEY,cAAc,CAAC,WAAW,EAAE,mBAAmB,EAAE,EAAE,MAAM,CAAC,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhH;IAEM,gBAAgB,IAAI,OAAO,CAAC,UAAU,CAAC,CAE7C;IAEM,kBAAkB,IAAI,OAAO,CAAC,UAAU,CAAC,CAE/C;IAEM,cAAc,IAAI,OAAO,CAAC,iBAAiB,CAAC,CAElD;IAEM,gBAAgB,IAAI,OAAO,CAAC;QAAE,kBAAkB,EAAE,EAAE,CAAA;KAAE,CAAC,CAE7D;IAEM,cAAc,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAEnD;IAEY,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAiCxC;IAEM,qBAAqB,IAAI,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAE9D;IAEM,sBAAsB,IAAI,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAEhE;IAEM,eAAe,CAAC,YAAY,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC,CAElE;IAEM,aAAa,IAAI,OAAO,CAAC,IAAI,CAAC,CAEpC;CACF"}
|
|
@@ -1,154 +1,36 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ArchiverDataSourceBase, ArchiverDataStoreUpdater, KVArchiverDataStore } from '@aztec/archiver';
|
|
2
2
|
import { GENESIS_ARCHIVE_ROOT } from '@aztec/constants';
|
|
3
|
-
import {
|
|
3
|
+
import { CheckpointNumber } from '@aztec/foundation/branded-types';
|
|
4
4
|
import { Fr } from '@aztec/foundation/curves/bn254';
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
export class TXEArchiver extends ArchiverStoreHelper {
|
|
5
|
+
/**
|
|
6
|
+
* TXE Archiver implementation.
|
|
7
|
+
* Provides most of the endpoints needed by the node for reading from and writing to state,
|
|
8
|
+
* without needing any of the extra overhead that the Archiver itself requires (i.e. an L1 client).
|
|
9
|
+
*/ export class TXEArchiver extends ArchiverDataSourceBase {
|
|
10
|
+
updater = new ArchiverDataStoreUpdater(this.store);
|
|
12
11
|
constructor(db){
|
|
13
|
-
|
|
12
|
+
const store = new KVArchiverDataStore(db, 9999);
|
|
13
|
+
super(store);
|
|
14
14
|
}
|
|
15
|
-
async
|
|
16
|
-
|
|
17
|
-
return undefined;
|
|
18
|
-
}
|
|
19
|
-
const publishedBlocks = await this.getPublishedBlocks(number, 1);
|
|
20
|
-
if (publishedBlocks.length === 0) {
|
|
21
|
-
return undefined;
|
|
22
|
-
}
|
|
23
|
-
return publishedBlocks[0].block;
|
|
24
|
-
}
|
|
25
|
-
async getBlocks(from, limit, proven) {
|
|
26
|
-
const publishedBlocks = await this.getPublishedBlocks(from, limit, proven);
|
|
27
|
-
return publishedBlocks.map((x)=>x.block);
|
|
28
|
-
}
|
|
29
|
-
async addCheckpoints(checkpoints, _result) {
|
|
30
|
-
const allBlocks = checkpoints.flatMap((ch)=>ch.checkpoint.blocks);
|
|
31
|
-
const opResults = await Promise.all([
|
|
32
|
-
this.store.addLogs(allBlocks),
|
|
33
|
-
this.store.addCheckpoints(checkpoints)
|
|
34
|
-
]);
|
|
35
|
-
return opResults.every(Boolean);
|
|
36
|
-
}
|
|
37
|
-
/**
|
|
38
|
-
* Gets the number of the latest L2 block processed by the block source implementation.
|
|
39
|
-
* @returns The number of the latest L2 block processed by the block source implementation.
|
|
40
|
-
*/ getBlockNumber() {
|
|
41
|
-
return this.store.getLatestBlockNumber();
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Gets the number of the latest L2 block proven seen by the block source implementation.
|
|
45
|
-
* @returns The number of the latest L2 block proven seen by the block source implementation.
|
|
46
|
-
*/ getProvenBlockNumber() {
|
|
47
|
-
return this.store.getProvenBlockNumber();
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Gets a published l2 block. If a negative number is passed, the block returned is the most recent.
|
|
51
|
-
* @param number - The block number to return (inclusive).
|
|
52
|
-
* @returns The requested L2 block.
|
|
53
|
-
*/ async getPublishedBlock(number) {
|
|
54
|
-
// If the number provided is -ve, then return the latest block.
|
|
55
|
-
if (number < 0) {
|
|
56
|
-
number = await this.store.getLatestBlockNumber();
|
|
57
|
-
}
|
|
58
|
-
if (number == 0) {
|
|
59
|
-
return undefined;
|
|
60
|
-
}
|
|
61
|
-
const publishedBlocks = await this.retrievePublishedBlocks(BlockNumber(number), 1);
|
|
62
|
-
return publishedBlocks.length === 0 ? undefined : publishedBlocks[0];
|
|
63
|
-
}
|
|
64
|
-
getPublishedBlocks(from, limit, proven) {
|
|
65
|
-
return this.retrievePublishedBlocks(from, limit, proven);
|
|
66
|
-
}
|
|
67
|
-
async getL2BlocksNew(from, limit, proven) {
|
|
68
|
-
const blocks = await this.store.getBlocks(from, limit);
|
|
69
|
-
if (proven === true) {
|
|
70
|
-
const provenBlockNumber = await this.store.getProvenBlockNumber();
|
|
71
|
-
return blocks.filter((b)=>b.number <= provenBlockNumber);
|
|
72
|
-
}
|
|
73
|
-
return blocks;
|
|
15
|
+
async addCheckpoints(checkpoints, result) {
|
|
16
|
+
await this.updater.addCheckpoints(checkpoints, result);
|
|
74
17
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
const provenCheckpointNumber = await this.store.getProvenCheckpointNumber();
|
|
78
|
-
const blocks = (await Promise.all(checkpoints.map((ch)=>this.store.getBlocksForCheckpoint(ch.checkpointNumber)))).filter(isDefined);
|
|
79
|
-
const olbBlocks = [];
|
|
80
|
-
for(let i = 0; i < checkpoints.length; i++){
|
|
81
|
-
const blockForCheckpoint = blocks[i][0];
|
|
82
|
-
const checkpoint = checkpoints[i];
|
|
83
|
-
if (proven === true && checkpoint.checkpointNumber > provenCheckpointNumber) {
|
|
84
|
-
continue;
|
|
85
|
-
}
|
|
86
|
-
const oldCheckpoint = new Checkpoint(blockForCheckpoint.archive, checkpoint.header, [
|
|
87
|
-
blockForCheckpoint
|
|
88
|
-
], checkpoint.checkpointNumber);
|
|
89
|
-
const oldBlock = L2Block.fromCheckpoint(oldCheckpoint);
|
|
90
|
-
const publishedBlock = new PublishedL2Block(oldBlock, checkpoint.l1, checkpoint.attestations.map((x)=>CommitteeAttestation.fromBuffer(x)));
|
|
91
|
-
olbBlocks.push(publishedBlock);
|
|
92
|
-
}
|
|
93
|
-
return olbBlocks;
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Gets an l2 block. If a negative number is passed, the block returned is the most recent.
|
|
97
|
-
* @param number - The block number to return (inclusive).
|
|
98
|
-
* @returns The requested L2 block.
|
|
99
|
-
*/ getL2Block(number) {
|
|
100
|
-
return this.getPublishedBlock(number != 'latest' ? number : -1).then((b)=>b?.block);
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Gets an L2 block (new format).
|
|
104
|
-
* @param number - The block number to return.
|
|
105
|
-
* @returns The requested L2 block.
|
|
106
|
-
*/ getL2BlockNew(number) {
|
|
107
|
-
if (number === 0) {
|
|
108
|
-
return Promise.resolve(undefined);
|
|
109
|
-
}
|
|
110
|
-
return this.store.getBlock(number);
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Gets an l2 block header.
|
|
114
|
-
* @param number - The block number to return or 'latest' for the most recent one.
|
|
115
|
-
* @returns The requested L2 block header.
|
|
116
|
-
*/ async getBlockHeader(number) {
|
|
117
|
-
if (number === 'latest') {
|
|
118
|
-
number = await this.store.getLatestBlockNumber();
|
|
119
|
-
}
|
|
120
|
-
if (number === 0) {
|
|
121
|
-
return undefined;
|
|
122
|
-
}
|
|
123
|
-
const headers = await this.store.getBlockHeaders(BlockNumber(number), 1);
|
|
124
|
-
return headers.length === 0 ? undefined : headers[0];
|
|
125
|
-
}
|
|
126
|
-
getBlockRange(from, limit, _proven) {
|
|
127
|
-
return this.getPublishedBlocks(BlockNumber(from), limit).then((blocks)=>blocks.map((b)=>b.block));
|
|
128
|
-
}
|
|
129
|
-
getPublishedCheckpoints(_from, _limit) {
|
|
130
|
-
throw new Error('TXE Archiver does not implement "getPublishedCheckpoints"');
|
|
131
|
-
}
|
|
132
|
-
getCheckpointByArchive(_archive) {
|
|
133
|
-
throw new Error('TXE Archiver does not implement "getCheckpointByArchive"');
|
|
134
|
-
}
|
|
135
|
-
getL2SlotNumber() {
|
|
136
|
-
throw new Error('TXE Archiver does not implement "getL2SlotNumber"');
|
|
137
|
-
}
|
|
138
|
-
getL2EpochNumber() {
|
|
139
|
-
throw new Error('TXE Archiver does not implement "getL2EpochNumber"');
|
|
18
|
+
getRollupAddress() {
|
|
19
|
+
throw new Error('TXE Archiver does not implement "getRollupAddress"');
|
|
140
20
|
}
|
|
141
|
-
|
|
142
|
-
throw new Error('TXE Archiver does not implement "
|
|
21
|
+
getRegistryAddress() {
|
|
22
|
+
throw new Error('TXE Archiver does not implement "getRegistryAddress"');
|
|
143
23
|
}
|
|
144
|
-
|
|
145
|
-
throw new Error('TXE Archiver does not implement "
|
|
24
|
+
getL1Constants() {
|
|
25
|
+
throw new Error('TXE Archiver does not implement "getL1Constants"');
|
|
146
26
|
}
|
|
147
|
-
|
|
148
|
-
|
|
27
|
+
getGenesisValues() {
|
|
28
|
+
return Promise.resolve({
|
|
29
|
+
genesisArchiveRoot: new Fr(GENESIS_ARCHIVE_ROOT)
|
|
30
|
+
});
|
|
149
31
|
}
|
|
150
|
-
|
|
151
|
-
throw new Error('TXE Archiver does not implement "
|
|
32
|
+
getL1Timestamp() {
|
|
33
|
+
throw new Error('TXE Archiver does not implement "getL1Timestamp"');
|
|
152
34
|
}
|
|
153
35
|
async getL2Tips() {
|
|
154
36
|
// In TXE there is no possibility of reorgs and no blocks are ever getting proven so we just set 'latest', 'proven'
|
|
@@ -163,7 +45,9 @@ export class TXEArchiver extends ArchiverStoreHelper {
|
|
|
163
45
|
if (!checkpointedBlock) {
|
|
164
46
|
throw new Error(`L2Tips requested from TXE Archiver but no checkpointed block found for block number ${number}`);
|
|
165
47
|
}
|
|
166
|
-
|
|
48
|
+
// TXE uses 1-block-per-checkpoint for testing simplicity, so we can use block number as checkpoint number.
|
|
49
|
+
// This uses the deprecated fromBlockNumber method intentionally for the TXE testing environment.
|
|
50
|
+
const checkpoint = await this.store.getRangeOfCheckpoints(CheckpointNumber.fromBlockNumber(number), 1);
|
|
167
51
|
if (checkpoint.length === 0) {
|
|
168
52
|
throw new Error(`L2Tips requested from TXE Archiver but no checkpoint found for block number ${number}`);
|
|
169
53
|
}
|
|
@@ -183,47 +67,20 @@ export class TXEArchiver extends ArchiverStoreHelper {
|
|
|
183
67
|
proposed: blockId,
|
|
184
68
|
proven: tipId,
|
|
185
69
|
finalized: tipId,
|
|
186
|
-
checkpointed: tipId
|
|
70
|
+
checkpointed: tipId,
|
|
71
|
+
proposedCheckpoint: tipId
|
|
187
72
|
};
|
|
188
73
|
}
|
|
189
|
-
|
|
190
|
-
throw new Error('TXE Archiver does not implement "
|
|
74
|
+
getSyncedL2SlotNumber() {
|
|
75
|
+
throw new Error('TXE Archiver does not implement "getSyncedL2SlotNumber"');
|
|
191
76
|
}
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
77
|
+
getSyncedL2EpochNumber() {
|
|
78
|
+
throw new Error('TXE Archiver does not implement "getSyncedL2EpochNumber"');
|
|
79
|
+
}
|
|
80
|
+
isEpochComplete(_epochNumber) {
|
|
81
|
+
throw new Error('TXE Archiver does not implement "isEpochComplete"');
|
|
196
82
|
}
|
|
197
83
|
syncImmediate() {
|
|
198
84
|
throw new Error('TXE Archiver does not implement "syncImmediate"');
|
|
199
85
|
}
|
|
200
|
-
getContract(_address, _timestamp) {
|
|
201
|
-
throw new Error('TXE Archiver does not implement "getContract"');
|
|
202
|
-
}
|
|
203
|
-
getRollupAddress() {
|
|
204
|
-
throw new Error('TXE Archiver does not implement "getRollupAddress"');
|
|
205
|
-
}
|
|
206
|
-
getRegistryAddress() {
|
|
207
|
-
throw new Error('TXE Archiver does not implement "getRegistryAddress"');
|
|
208
|
-
}
|
|
209
|
-
getL1Timestamp() {
|
|
210
|
-
throw new Error('TXE Archiver does not implement "getL1Timestamp"');
|
|
211
|
-
}
|
|
212
|
-
isPendingChainInvalid() {
|
|
213
|
-
return Promise.resolve(false);
|
|
214
|
-
}
|
|
215
|
-
getPendingChainValidationStatus() {
|
|
216
|
-
return Promise.resolve({
|
|
217
|
-
valid: true
|
|
218
|
-
});
|
|
219
|
-
}
|
|
220
|
-
getPublishedBlockByHash(_blockHash) {
|
|
221
|
-
throw new Error('Method not implemented.');
|
|
222
|
-
}
|
|
223
|
-
getPublishedBlockByArchive(_archive) {
|
|
224
|
-
throw new Error('Method not implemented.');
|
|
225
|
-
}
|
|
226
|
-
getCheckpointedBlocks(_from, _limit, _proven) {
|
|
227
|
-
throw new Error('TXE Archiver does not implement "getCheckpointedBlocks"');
|
|
228
|
-
}
|
|
229
86
|
}
|
|
@@ -1,29 +1,32 @@
|
|
|
1
1
|
import type { SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
|
-
import type { AuthRequest, ENR, P2P, P2PBlockReceivedCallback, P2PCheckpointReceivedCallback, P2PConfig, P2PSyncState, PeerId, ReqRespSubProtocol, ReqRespSubProtocolHandler, ReqRespSubProtocolValidators, StatusMessage } from '@aztec/p2p';
|
|
2
|
+
import type { AuthRequest, ENR, P2P, P2PBlockReceivedCallback, P2PCheckpointReceivedCallback, P2PConfig, P2PDuplicateAttestationCallback, P2PDuplicateProposalCallback, P2PSyncState, PeerId, ReqRespSubProtocol, ReqRespSubProtocolHandler, ReqRespSubProtocolValidators, StatusMessage } from '@aztec/p2p';
|
|
3
3
|
import type { EthAddress, L2BlockStreamEvent, L2Tips } from '@aztec/stdlib/block';
|
|
4
|
-
import type { PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
5
|
-
import type { BlockProposal, CheckpointAttestation, CheckpointProposal } from '@aztec/stdlib/p2p';
|
|
6
|
-
import type { Tx, TxHash } from '@aztec/stdlib/tx';
|
|
4
|
+
import type { ITxProvider, PeerInfo } from '@aztec/stdlib/interfaces/server';
|
|
5
|
+
import type { BlockProposal, CheckpointAttestation, CheckpointProposal, TopicType } from '@aztec/stdlib/p2p';
|
|
6
|
+
import type { BlockHeader, Tx, TxHash } from '@aztec/stdlib/tx';
|
|
7
7
|
export declare class DummyP2P implements P2P {
|
|
8
|
-
|
|
8
|
+
validateTxsReceivedInBlockProposal(_txs: Tx[]): Promise<void>;
|
|
9
9
|
clear(): Promise<void>;
|
|
10
10
|
getPendingTxs(): Promise<Tx[]>;
|
|
11
11
|
getEncodedEnr(): Promise<string | undefined>;
|
|
12
12
|
getPeers(_includePending?: boolean): Promise<PeerInfo[]>;
|
|
13
|
+
getGossipMeshPeerCount(_topicType: TopicType): Promise<number>;
|
|
13
14
|
broadcastProposal(_proposal: BlockProposal): Promise<void>;
|
|
14
15
|
broadcastCheckpointProposal(_proposal: CheckpointProposal): Promise<void>;
|
|
15
16
|
broadcastCheckpointAttestations(_attestations: CheckpointAttestation[]): Promise<void>;
|
|
16
17
|
registerBlockProposalHandler(_handler: P2PBlockReceivedCallback): void;
|
|
17
|
-
|
|
18
|
+
registerValidatorCheckpointProposalHandler(_handler: P2PCheckpointReceivedCallback): void;
|
|
19
|
+
registerAllNodesCheckpointProposalHandler(_handler: P2PCheckpointReceivedCallback): void;
|
|
18
20
|
requestTxs(_txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
19
21
|
requestTxByHash(_txHash: TxHash): Promise<Tx | undefined>;
|
|
20
22
|
sendTx(_tx: Tx): Promise<void>;
|
|
21
|
-
|
|
23
|
+
handleFailedExecution(_txHashes: TxHash[]): Promise<void>;
|
|
22
24
|
getTxByHashFromPool(_txHash: TxHash): Promise<Tx | undefined>;
|
|
23
25
|
getTxByHash(_txHash: TxHash): Promise<Tx | undefined>;
|
|
24
26
|
getArchivedTxByHash(_txHash: TxHash): Promise<Tx | undefined>;
|
|
25
27
|
getTxStatus(_txHash: TxHash): Promise<'pending' | 'mined' | undefined>;
|
|
26
28
|
iteratePendingTxs(): AsyncIterableIterator<Tx>;
|
|
29
|
+
iterateEligiblePendingTxs(): AsyncIterableIterator<Tx>;
|
|
27
30
|
getPendingTxCount(): Promise<number>;
|
|
28
31
|
start(): Promise<void>;
|
|
29
32
|
stop(): Promise<void>;
|
|
@@ -31,25 +34,27 @@ export declare class DummyP2P implements P2P {
|
|
|
31
34
|
getStatus(): Promise<P2PSyncState>;
|
|
32
35
|
getEnr(): ENR | undefined;
|
|
33
36
|
isP2PClient(): true;
|
|
37
|
+
getTxProvider(): ITxProvider;
|
|
34
38
|
getTxsByHash(_txHashes: TxHash[]): Promise<Tx[]>;
|
|
35
39
|
getCheckpointAttestationsForSlot(_slot: SlotNumber, _proposalId?: string): Promise<CheckpointAttestation[]>;
|
|
36
|
-
|
|
40
|
+
addOwnCheckpointAttestations(_attestations: CheckpointAttestation[]): Promise<void>;
|
|
37
41
|
getL2BlockHash(_number: number): Promise<string | undefined>;
|
|
38
42
|
updateP2PConfig(_config: Partial<P2PConfig>): Promise<void>;
|
|
39
43
|
getL2Tips(): Promise<L2Tips>;
|
|
40
44
|
handleBlockStreamEvent(_event: L2BlockStreamEvent): Promise<void>;
|
|
41
45
|
sync(): void;
|
|
42
|
-
requestTxsByHash(_txHashes: TxHash[]): Promise<Tx[]>;
|
|
43
|
-
getTxs(_filter: 'all' | 'pending' | 'mined'): Promise<Tx[]>;
|
|
44
46
|
getTxsByHashFromPool(_txHashes: TxHash[]): Promise<(Tx | undefined)[]>;
|
|
45
47
|
hasTxsInPool(_txHashes: TxHash[]): Promise<boolean[]>;
|
|
46
|
-
addTxsToPool(_txs: Tx[]): Promise<number>;
|
|
47
48
|
getSyncedLatestBlockNum(): Promise<number>;
|
|
48
49
|
getSyncedProvenBlockNum(): Promise<number>;
|
|
49
50
|
getSyncedLatestSlot(): Promise<bigint>;
|
|
50
|
-
|
|
51
|
+
protectTxs(_txHashes: TxHash[], _blockHeader: BlockHeader): Promise<TxHash[]>;
|
|
52
|
+
prepareForSlot(_slotNumber: SlotNumber): Promise<void>;
|
|
51
53
|
addReqRespSubProtocol(_subProtocol: ReqRespSubProtocol, _handler: ReqRespSubProtocolHandler, _validator?: ReqRespSubProtocolValidators[ReqRespSubProtocol]): Promise<void>;
|
|
52
54
|
handleAuthRequestFromPeer(_authRequest: AuthRequest, _peerId: PeerId): Promise<StatusMessage>;
|
|
53
55
|
registerThisValidatorAddresses(_address: EthAddress[]): void;
|
|
56
|
+
registerDuplicateProposalCallback(_callback: P2PDuplicateProposalCallback): void;
|
|
57
|
+
registerDuplicateAttestationCallback(_callback: P2PDuplicateAttestationCallback): void;
|
|
58
|
+
hasBlockProposalsForSlot(_slot: SlotNumber): Promise<boolean>;
|
|
54
59
|
}
|
|
55
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
60
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHVtbXlfcDJwX2NsaWVudC5kLnRzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0YXRlX21hY2hpbmUvZHVtbXlfcDJwX2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssRUFBRSxVQUFVLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNsRSxPQUFPLEtBQUssRUFDVixXQUFXLEVBQ1gsR0FBRyxFQUNILEdBQUcsRUFDSCx3QkFBd0IsRUFDeEIsNkJBQTZCLEVBQzdCLFNBQVMsRUFDVCwrQkFBK0IsRUFDL0IsNEJBQTRCLEVBQzVCLFlBQVksRUFDWixNQUFNLEVBQ04sa0JBQWtCLEVBQ2xCLHlCQUF5QixFQUN6Qiw0QkFBNEIsRUFDNUIsYUFBYSxFQUNkLE1BQU0sWUFBWSxDQUFDO0FBQ3BCLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxrQkFBa0IsRUFBRSxNQUFNLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNsRixPQUFPLEtBQUssRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLE1BQU0saUNBQWlDLENBQUM7QUFDN0UsT0FBTyxLQUFLLEVBQUUsYUFBYSxFQUFFLHFCQUFxQixFQUFFLGtCQUFrQixFQUFFLFNBQVMsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzdHLE9BQU8sS0FBSyxFQUFFLFdBQVcsRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFaEUscUJBQWEsUUFBUyxZQUFXLEdBQUc7SUFDM0Isa0NBQWtDLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FFbkU7SUFFTSxLQUFLLElBQUksT0FBTyxDQUFDLElBQUksQ0FBQyxDQUU1QjtJQUVNLGFBQWEsSUFBSSxPQUFPLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FFcEM7SUFFTSxhQUFhLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxTQUFTLENBQUMsQ0FFbEQ7SUFF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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dummy_p2p_client.d.ts","sourceRoot":"","sources":["../../src/state_machine/dummy_p2p_client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EACV,WAAW,EACX,GAAG,EACH,GAAG,EACH,wBAAwB,EACxB,6BAA6B,EAC7B,SAAS,EACT,YAAY,EACZ,MAAM,EACN,kBAAkB,EAClB,yBAAyB,EACzB,4BAA4B,EAC5B,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"dummy_p2p_client.d.ts","sourceRoot":"","sources":["../../src/state_machine/dummy_p2p_client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iCAAiC,CAAC;AAClE,OAAO,KAAK,EACV,WAAW,EACX,GAAG,EACH,GAAG,EACH,wBAAwB,EACxB,6BAA6B,EAC7B,SAAS,EACT,+BAA+B,EAC/B,4BAA4B,EAC5B,YAAY,EACZ,MAAM,EACN,kBAAkB,EAClB,yBAAyB,EACzB,4BAA4B,EAC5B,aAAa,EACd,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,UAAU,EAAE,kBAAkB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,KAAK,EAAE,aAAa,EAAE,qBAAqB,EAAE,kBAAkB,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAC7G,OAAO,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAEhE,qBAAa,QAAS,YAAW,GAAG;IAC3B,kCAAkC,CAAC,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEnE;IAEM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5B;IAEM,aAAa,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC,CAEpC;IAEM,aAAa,IAAI,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAElD;IAEM,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAE9D;IAEM,sBAAsB,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAEpE;IAEM,iBAAiB,CAAC,SAAS,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAEhE;IAEM,2BAA2B,CAAC,SAAS,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/E;IAEM,+BAA+B,CAAC,aAAa,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE5F;IAEM,4BAA4B,CAAC,QAAQ,EAAE,wBAAwB,GAAG,IAAI,CAE5E;IAEM,0CAA0C,CAAC,QAAQ,EAAE,6BAA6B,GAAG,IAAI,CAE/F;IAEM,yCAAyC,CAAC,QAAQ,EAAE,6BAA6B,GAAG,IAAI,CAE9F;IAEM,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAElE;IAEM,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAE/D;IAEM,MAAM,CAAC,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEpC;IAEM,qBAAqB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAE/D;IAEM,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAEnE;IAEM,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAE3D;IAEM,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,EAAE,GAAG,SAAS,CAAC,CAEnE;IAEM,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC,CAI5E;IAEM,iBAAiB,IAAI,qBAAqB,CAAC,EAAE,CAAC,CAEpD;IAEM,yBAAyB,IAAI,qBAAqB,CAAC,EAAE,CAAC,CAE5D;IAEM,iBAAiB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE1C;IAEM,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAE5B;IAEM,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAE3B;IAEM,OAAO,IAAI,OAAO,CAExB;IAEM,SAAS,IAAI,OAAO,CAAC,YAAY,CAAC,CAExC;IAEM,MAAM,IAAI,GAAG,GAAG,SAAS,CAE/B;IAEM,WAAW,IAAI,IAAI,CAEzB;IAEM,aAAa,IAAI,WAAW,CAElC;IAEM,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,EAAE,CAAC,CAEtD;IAEM,gCAAgC,CAAC,KAAK,EAAE,UAAU,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAEjH;IAEM,4BAA4B,CAAC,aAAa,EAAE,qBAAqB,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAEzF;IAEM,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAElE;IAEM,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAEjE;IAEM,SAAS,IAAI,OAAO,CAAC,MAAM,CAAC,CAElC;IAEM,sBAAsB,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CAEvE;IAEM,IAAI,SAEV;IAEM,oBAAoB,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,EAAE,CAAC,CAE5E;IAEM,YAAY,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAE3D;IAEM,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhD;IAEM,uBAAuB,IAAI,OAAO,CAAC,MAAM,CAAC,CAEhD;IAEM,mBAAmB,IAAI,OAAO,CAAC,MAAM,CAAC,CAE5C;IAED,UAAU,CAAC,SAAS,EAAE,MAAM,EAAE,EAAE,YAAY,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAE5E;IAED,cAAc,CAAC,WAAW,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAErD;IAED,qBAAqB,CACnB,YAAY,EAAE,kBAAkB,EAChC,QAAQ,EAAE,yBAAyB,EACnC,UAAU,CAAC,EAAE,4BAA4B,CAAC,kBAAkB,CAAC,GAC5D,OAAO,CAAC,IAAI,CAAC,CAEf;IACD,yBAAyB,CAAC,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAE5F;IAGM,8BAA8B,CAAC,QAAQ,EAAE,UAAU,EAAE,GAAG,IAAI,CAAG;IAE/D,iCAAiC,CAAC,SAAS,EAAE,4BAA4B,GAAG,IAAI,CAEtF;IAEM,oCAAoC,CAAC,SAAS,EAAE,+BAA+B,GAAG,IAAI,CAE5F;IAEM,wBAAwB,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAEnE;CACF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export class DummyP2P {
|
|
2
|
-
|
|
2
|
+
validateTxsReceivedInBlockProposal(_txs) {
|
|
3
3
|
return Promise.resolve();
|
|
4
4
|
}
|
|
5
5
|
clear() {
|
|
@@ -14,6 +14,9 @@ export class DummyP2P {
|
|
|
14
14
|
getPeers(_includePending) {
|
|
15
15
|
throw new Error('DummyP2P does not implement "getPeers"');
|
|
16
16
|
}
|
|
17
|
+
getGossipMeshPeerCount(_topicType) {
|
|
18
|
+
return Promise.resolve(0);
|
|
19
|
+
}
|
|
17
20
|
broadcastProposal(_proposal) {
|
|
18
21
|
throw new Error('DummyP2P does not implement "broadcastProposal"');
|
|
19
22
|
}
|
|
@@ -26,8 +29,11 @@ export class DummyP2P {
|
|
|
26
29
|
registerBlockProposalHandler(_handler) {
|
|
27
30
|
throw new Error('DummyP2P does not implement "registerBlockProposalHandler"');
|
|
28
31
|
}
|
|
29
|
-
|
|
30
|
-
throw new Error('DummyP2P does not implement "
|
|
32
|
+
registerValidatorCheckpointProposalHandler(_handler) {
|
|
33
|
+
throw new Error('DummyP2P does not implement "registerValidatorCheckpointProposalHandler"');
|
|
34
|
+
}
|
|
35
|
+
registerAllNodesCheckpointProposalHandler(_handler) {
|
|
36
|
+
throw new Error('DummyP2P does not implement "registerAllNodesCheckpointProposalHandler"');
|
|
31
37
|
}
|
|
32
38
|
requestTxs(_txHashes) {
|
|
33
39
|
throw new Error('DummyP2P does not implement "requestTxs"');
|
|
@@ -38,8 +44,8 @@ export class DummyP2P {
|
|
|
38
44
|
sendTx(_tx) {
|
|
39
45
|
throw new Error('DummyP2P does not implement "sendTx"');
|
|
40
46
|
}
|
|
41
|
-
|
|
42
|
-
throw new Error('DummyP2P does not implement "
|
|
47
|
+
handleFailedExecution(_txHashes) {
|
|
48
|
+
throw new Error('DummyP2P does not implement "handleFailedExecution"');
|
|
43
49
|
}
|
|
44
50
|
getTxByHashFromPool(_txHash) {
|
|
45
51
|
throw new Error('DummyP2P does not implement "getTxByHashFromPool"');
|
|
@@ -58,6 +64,9 @@ export class DummyP2P {
|
|
|
58
64
|
iteratePendingTxs() {
|
|
59
65
|
throw new Error('DummyP2P does not implement "iteratePendingTxs"');
|
|
60
66
|
}
|
|
67
|
+
iterateEligiblePendingTxs() {
|
|
68
|
+
throw new Error('DummyP2P does not implement "iterateEligiblePendingTxs"');
|
|
69
|
+
}
|
|
61
70
|
getPendingTxCount() {
|
|
62
71
|
throw new Error('DummyP2P does not implement "getPendingTxCount"');
|
|
63
72
|
}
|
|
@@ -79,14 +88,17 @@ export class DummyP2P {
|
|
|
79
88
|
isP2PClient() {
|
|
80
89
|
throw new Error('DummyP2P does not implement "isP2PClient"');
|
|
81
90
|
}
|
|
91
|
+
getTxProvider() {
|
|
92
|
+
throw new Error('DummyP2P does not implement "getTxProvider"');
|
|
93
|
+
}
|
|
82
94
|
getTxsByHash(_txHashes) {
|
|
83
95
|
throw new Error('DummyP2P does not implement "getTxsByHash"');
|
|
84
96
|
}
|
|
85
97
|
getCheckpointAttestationsForSlot(_slot, _proposalId) {
|
|
86
98
|
throw new Error('DummyP2P does not implement "getCheckpointAttestationsForSlot"');
|
|
87
99
|
}
|
|
88
|
-
|
|
89
|
-
throw new Error('DummyP2P does not implement "
|
|
100
|
+
addOwnCheckpointAttestations(_attestations) {
|
|
101
|
+
throw new Error('DummyP2P does not implement "addOwnCheckpointAttestations"');
|
|
90
102
|
}
|
|
91
103
|
getL2BlockHash(_number) {
|
|
92
104
|
throw new Error('DummyP2P does not implement "getL2BlockHash"');
|
|
@@ -103,21 +115,12 @@ export class DummyP2P {
|
|
|
103
115
|
sync() {
|
|
104
116
|
throw new Error('DummyP2P does not implement "sync"');
|
|
105
117
|
}
|
|
106
|
-
requestTxsByHash(_txHashes) {
|
|
107
|
-
throw new Error('DummyP2P does not implement "requestTxsByHash"');
|
|
108
|
-
}
|
|
109
|
-
getTxs(_filter) {
|
|
110
|
-
throw new Error('DummyP2P does not implement "getTxs"');
|
|
111
|
-
}
|
|
112
118
|
getTxsByHashFromPool(_txHashes) {
|
|
113
119
|
throw new Error('DummyP2P does not implement "getTxsByHashFromPool"');
|
|
114
120
|
}
|
|
115
121
|
hasTxsInPool(_txHashes) {
|
|
116
122
|
throw new Error('DummyP2P does not implement "hasTxsInPool"');
|
|
117
123
|
}
|
|
118
|
-
addTxsToPool(_txs) {
|
|
119
|
-
throw new Error('DummyP2P does not implement "addTxs"');
|
|
120
|
-
}
|
|
121
124
|
getSyncedLatestBlockNum() {
|
|
122
125
|
throw new Error('DummyP2P does not implement "getSyncedLatestBlockNum"');
|
|
123
126
|
}
|
|
@@ -127,8 +130,11 @@ export class DummyP2P {
|
|
|
127
130
|
getSyncedLatestSlot() {
|
|
128
131
|
throw new Error('DummyP2P does not implement "getSyncedLatestSlot"');
|
|
129
132
|
}
|
|
130
|
-
|
|
131
|
-
throw new Error('DummyP2P does not implement "
|
|
133
|
+
protectTxs(_txHashes, _blockHeader) {
|
|
134
|
+
throw new Error('DummyP2P does not implement "protectTxs".');
|
|
135
|
+
}
|
|
136
|
+
prepareForSlot(_slotNumber) {
|
|
137
|
+
return Promise.resolve();
|
|
132
138
|
}
|
|
133
139
|
addReqRespSubProtocol(_subProtocol, _handler, _validator) {
|
|
134
140
|
throw new Error('DummyP2P does not implement "addReqRespSubProtocol".');
|
|
@@ -138,4 +144,13 @@ export class DummyP2P {
|
|
|
138
144
|
}
|
|
139
145
|
//This is no-op
|
|
140
146
|
registerThisValidatorAddresses(_address) {}
|
|
147
|
+
registerDuplicateProposalCallback(_callback) {
|
|
148
|
+
throw new Error('DummyP2P does not implement "registerDuplicateProposalCallback"');
|
|
149
|
+
}
|
|
150
|
+
registerDuplicateAttestationCallback(_callback) {
|
|
151
|
+
throw new Error('DummyP2P does not implement "registerDuplicateAttestationCallback"');
|
|
152
|
+
}
|
|
153
|
+
hasBlockProposalsForSlot(_slot) {
|
|
154
|
+
throw new Error('DummyP2P does not implement "hasBlockProposalsForSlot"');
|
|
155
|
+
}
|
|
141
156
|
}
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
+
import type { SimulationOverridesPlan } from '@aztec/ethereum/contracts';
|
|
1
2
|
import { BlockNumber, type SlotNumber } from '@aztec/foundation/branded-types';
|
|
2
3
|
import type { EthAddress } from '@aztec/foundation/eth-address';
|
|
3
4
|
import type { AztecAddress } from '@aztec/stdlib/aztec-address';
|
|
4
5
|
import { GasFees } from '@aztec/stdlib/gas';
|
|
5
|
-
import { type CheckpointGlobalVariables, type GlobalVariableBuilder, GlobalVariables } from '@aztec/stdlib/tx';
|
|
6
|
-
|
|
6
|
+
import { type CheckpointGlobalVariables, type FeeProvider, type GlobalVariableBuilder, GlobalVariables } from '@aztec/stdlib/tx';
|
|
7
|
+
/** Simple FeeProvider for TXE that returns zero fees. */
|
|
8
|
+
export declare class TXEFeeProvider implements FeeProvider {
|
|
7
9
|
getCurrentMinFees(): Promise<GasFees>;
|
|
10
|
+
getPredictedMinFees(): Promise<GasFees[]>;
|
|
11
|
+
}
|
|
12
|
+
export declare class TXEGlobalVariablesBuilder implements GlobalVariableBuilder {
|
|
8
13
|
buildGlobalVariables(_blockNumber: BlockNumber, _coinbase: EthAddress, _feeRecipient: AztecAddress, _slotNumber?: SlotNumber): Promise<GlobalVariables>;
|
|
9
|
-
buildCheckpointGlobalVariables(_coinbase: EthAddress, _feeRecipient: AztecAddress, _slotNumber: SlotNumber): Promise<CheckpointGlobalVariables>;
|
|
14
|
+
buildCheckpointGlobalVariables(_coinbase: EthAddress, _feeRecipient: AztecAddress, _slotNumber: SlotNumber, _simulationOverridesPlan?: SimulationOverridesPlan): Promise<CheckpointGlobalVariables>;
|
|
10
15
|
}
|
|
11
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2xvYmFsX3ZhcmlhYmxlX2J1aWxkZXIuZC50cyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGF0ZV9tYWNoaW5lL2dsb2JhbF92YXJpYWJsZV9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sMkJBQTJCLENBQUM7QUFDekUsT0FBTyxFQUFFLFdBQVcsRUFBRSxLQUFLLFVBQVUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBRS9FLE9BQU8sS0FBSyxFQUFFLFVBQVUsRUFBRSxNQUFNLCtCQUErQixDQUFDO0FBQ2hFLE9BQU8sS0FBSyxFQUFFLFlBQVksRUFBRSxNQUFNLDZCQUE2QixDQUFDO0FBQ2hFLE9BQU8sRUFBa0IsT0FBTyxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFFNUQsT0FBTyxFQUNMLEtBQUsseUJBQXlCLEVBQzlCLEtBQUssV0FBVyxFQUNoQixLQUFLLHFCQUFxQixFQUMxQixlQUFlLEVBQ2hCLE1BQU0sa0JBQWtCLENBQUM7QUFFMUIseURBQXlEO0FBQ3pELHFCQUFhLGNBQWUsWUFBVyxXQUFXO0lBQ3pDLGlCQUFpQixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FFM0M7SUFFTSxtQkFBbUIsSUFBSSxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FFL0M7Q0FDRjtBQUVELHFCQUFhLHlCQUEwQixZQUFXLHFCQUFxQjtJQUM5RCxvQkFBb0IsQ0FDekIsWUFBWSxFQUFFLFdBQVcsRUFDekIsU0FBUyxFQUFFLFVBQVUsRUFDckIsYUFBYSxFQUFFLFlBQVksRUFDM0IsV0FBVyxDQUFDLEVBQUUsVUFBVSxHQUN2QixPQUFPLENBQUMsZUFBZSxDQUFDLENBRTFCO0lBRU0sOEJBQThCLENBQ25DLFNBQVMsRUFBRSxVQUFVLEVBQ3JCLGFBQWEsRUFBRSxZQUFZLEVBQzNCLFdBQVcsRUFBRSxVQUFVLEVBQ3ZCLHdCQUF3QixDQUFDLEVBQUUsdUJBQXVCLEdBQ2pELE9BQU8sQ0FBQyx5QkFBeUIsQ0FBQyxDQVdwQztDQUNGIn0=
|