@lodestar/config 1.35.0-dev.47c570ab76 → 1.35.0-dev.549f58dd39
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/lib/beaconConfig.d.ts.map +1 -0
- package/lib/chainConfig/configs/mainnet.d.ts.map +1 -0
- package/lib/chainConfig/configs/mainnet.js +14 -1
- package/lib/chainConfig/configs/mainnet.js.map +1 -1
- package/lib/chainConfig/configs/minimal.d.ts.map +1 -0
- package/lib/chainConfig/configs/minimal.js +14 -1
- package/lib/chainConfig/configs/minimal.js.map +1 -1
- package/lib/chainConfig/default.d.ts.map +1 -0
- package/lib/chainConfig/index.d.ts.map +1 -0
- package/lib/chainConfig/index.js +5 -0
- package/lib/chainConfig/index.js.map +1 -1
- package/lib/chainConfig/json.d.ts.map +1 -0
- package/lib/chainConfig/networks/chiado.d.ts.map +1 -0
- package/lib/chainConfig/networks/ephemery.d.ts.map +1 -0
- package/lib/chainConfig/networks/gnosis.d.ts.map +1 -0
- package/lib/chainConfig/networks/holesky.d.ts.map +1 -0
- package/lib/chainConfig/networks/hoodi.d.ts.map +1 -0
- package/lib/chainConfig/networks/mainnet.d.ts.map +1 -0
- package/lib/chainConfig/networks/sepolia.d.ts.map +1 -0
- package/lib/chainConfig/types.d.ts +7 -0
- package/lib/chainConfig/types.d.ts.map +1 -0
- package/lib/chainConfig/types.js +7 -0
- package/lib/chainConfig/types.js.map +1 -1
- package/lib/configs.d.ts.map +1 -0
- package/lib/default.d.ts +1 -1
- package/lib/default.d.ts.map +1 -0
- package/lib/forkConfig/index.d.ts.map +1 -0
- package/lib/forkConfig/index.js +19 -1
- package/lib/forkConfig/index.js.map +1 -1
- package/lib/forkConfig/types.d.ts +7 -0
- package/lib/forkConfig/types.d.ts.map +1 -0
- package/lib/genesisConfig/index.d.ts.map +1 -0
- package/lib/genesisConfig/types.d.ts.map +1 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/networks.d.ts.map +1 -0
- package/lib/utils/validateBlobSchedule.d.ts.map +1 -0
- package/package.json +8 -10
- package/src/beaconConfig.ts +31 -0
- package/src/chainConfig/configs/mainnet.ts +172 -0
- package/src/chainConfig/configs/minimal.ts +167 -0
- package/src/chainConfig/default.ts +19 -0
- package/src/chainConfig/index.ts +33 -0
- package/src/chainConfig/json.ts +175 -0
- package/src/chainConfig/networks/chiado.ts +49 -0
- package/src/chainConfig/networks/ephemery.ts +71 -0
- package/src/chainConfig/networks/gnosis.ts +74 -0
- package/src/chainConfig/networks/holesky.ts +64 -0
- package/src/chainConfig/networks/hoodi.ts +64 -0
- package/src/chainConfig/networks/mainnet.ts +19 -0
- package/src/chainConfig/networks/sepolia.ts +61 -0
- package/src/chainConfig/types.ts +267 -0
- package/src/configs.ts +4 -0
- package/src/default.ts +6 -0
- package/src/forkConfig/index.ts +223 -0
- package/src/forkConfig/types.ts +68 -0
- package/src/genesisConfig/index.ts +180 -0
- package/src/genesisConfig/types.ts +29 -0
- package/src/index.ts +4 -0
- package/src/networks.ts +65 -0
- package/src/utils/validateBlobSchedule.ts +32 -0
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import {fromHex as b} from "@lodestar/utils";
|
|
2
|
+
import {chainConfig as mainnet} from "../configs/mainnet.js";
|
|
3
|
+
import {ChainConfig} from "../types.js";
|
|
4
|
+
|
|
5
|
+
// Hoodi beacon chain config:
|
|
6
|
+
// https://github.com/eth-clients/hoodi/blob/main/metadata/config.yaml
|
|
7
|
+
|
|
8
|
+
export const hoodiChainConfig: ChainConfig = {
|
|
9
|
+
...mainnet,
|
|
10
|
+
|
|
11
|
+
CONFIG_NAME: "hoodi",
|
|
12
|
+
|
|
13
|
+
// Genesis
|
|
14
|
+
// ---------------------------------------------------------------
|
|
15
|
+
// 2025-Mar-17 12:00:00 PM UTC
|
|
16
|
+
MIN_GENESIS_TIME: 1742212800,
|
|
17
|
+
GENESIS_DELAY: 600,
|
|
18
|
+
GENESIS_FORK_VERSION: b("0x10000910"),
|
|
19
|
+
|
|
20
|
+
// Forking
|
|
21
|
+
// ---------------------------------------------------------------
|
|
22
|
+
// # Altair
|
|
23
|
+
ALTAIR_FORK_VERSION: b("0x20000910"),
|
|
24
|
+
ALTAIR_FORK_EPOCH: 0,
|
|
25
|
+
// # Merge
|
|
26
|
+
BELLATRIX_FORK_VERSION: b("0x30000910"),
|
|
27
|
+
BELLATRIX_FORK_EPOCH: 0,
|
|
28
|
+
TERMINAL_TOTAL_DIFFICULTY: BigInt("0"),
|
|
29
|
+
// Capella
|
|
30
|
+
CAPELLA_FORK_VERSION: b("0x40000910"),
|
|
31
|
+
CAPELLA_FORK_EPOCH: 0,
|
|
32
|
+
// Deneb
|
|
33
|
+
DENEB_FORK_VERSION: b("0x50000910"),
|
|
34
|
+
DENEB_FORK_EPOCH: 0,
|
|
35
|
+
// Electra
|
|
36
|
+
ELECTRA_FORK_VERSION: b("0x60000910"),
|
|
37
|
+
ELECTRA_FORK_EPOCH: 2048,
|
|
38
|
+
// Fulu
|
|
39
|
+
FULU_FORK_VERSION: b("0x70000910"),
|
|
40
|
+
FULU_FORK_EPOCH: 50688,
|
|
41
|
+
|
|
42
|
+
// Time parameters
|
|
43
|
+
// ---------------------------------------------------------------
|
|
44
|
+
// 12 (update from older mainnet default of 14)
|
|
45
|
+
SECONDS_PER_ETH1_BLOCK: 12,
|
|
46
|
+
|
|
47
|
+
// Deposit contract
|
|
48
|
+
// ---------------------------------------------------------------
|
|
49
|
+
DEPOSIT_CHAIN_ID: 560048,
|
|
50
|
+
DEPOSIT_NETWORK_ID: 560048,
|
|
51
|
+
|
|
52
|
+
// Blob Scheduling
|
|
53
|
+
// ---------------------------------------------------------------
|
|
54
|
+
BLOB_SCHEDULE: [
|
|
55
|
+
{
|
|
56
|
+
EPOCH: 52480,
|
|
57
|
+
MAX_BLOBS_PER_BLOCK: 15,
|
|
58
|
+
},
|
|
59
|
+
{
|
|
60
|
+
EPOCH: 54016,
|
|
61
|
+
MAX_BLOBS_PER_BLOCK: 21,
|
|
62
|
+
},
|
|
63
|
+
],
|
|
64
|
+
};
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {fromHex as b} from "@lodestar/utils";
|
|
2
|
+
import {chainConfig as mainnet} from "../configs/mainnet.js";
|
|
3
|
+
import {ChainConfig} from "../types.js";
|
|
4
|
+
|
|
5
|
+
export const mainnetChainConfig: ChainConfig = {
|
|
6
|
+
...mainnet,
|
|
7
|
+
|
|
8
|
+
CONFIG_NAME: "mainnet",
|
|
9
|
+
|
|
10
|
+
DEPOSIT_CONTRACT_ADDRESS: b("0x00000000219ab540356cBB839Cbe05303d7705Fa"),
|
|
11
|
+
|
|
12
|
+
DEPOSIT_CHAIN_ID: 1,
|
|
13
|
+
DEPOSIT_NETWORK_ID: 1,
|
|
14
|
+
|
|
15
|
+
MIN_GENESIS_TIME: 1606824000, // Tuesday, December 1, 2020 12:00:00 PM UTC
|
|
16
|
+
GENESIS_DELAY: 604800,
|
|
17
|
+
// MUST NOT use `GENESIS_FORK_VERSION` here so for `minimal` networks the preset value of 0x00000001 take prevalence
|
|
18
|
+
// GENESIS_FORK_VERSION: "0x00000000",
|
|
19
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import {fromHex as b} from "@lodestar/utils";
|
|
2
|
+
import {chainConfig as mainnet} from "../configs/mainnet.js";
|
|
3
|
+
import {ChainConfig} from "../types.js";
|
|
4
|
+
|
|
5
|
+
// Sepolia beacon chain config:
|
|
6
|
+
// https://github.com/eth-clients/sepolia/blob/main/metadata/config.yaml
|
|
7
|
+
|
|
8
|
+
export const sepoliaChainConfig: ChainConfig = {
|
|
9
|
+
...mainnet,
|
|
10
|
+
|
|
11
|
+
CONFIG_NAME: "sepolia",
|
|
12
|
+
|
|
13
|
+
// Genesis
|
|
14
|
+
// ---------------------------------------------------------------
|
|
15
|
+
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: 1300,
|
|
16
|
+
// # Sunday, June 19, 2022 2:00:00 PM +UTC
|
|
17
|
+
MIN_GENESIS_TIME: 1655647200,
|
|
18
|
+
GENESIS_FORK_VERSION: b("0x90000069"),
|
|
19
|
+
GENESIS_DELAY: 86400,
|
|
20
|
+
|
|
21
|
+
// Forking
|
|
22
|
+
// ---------------------------------------------------------------
|
|
23
|
+
// # Altair
|
|
24
|
+
ALTAIR_FORK_VERSION: b("0x90000070"),
|
|
25
|
+
ALTAIR_FORK_EPOCH: 50,
|
|
26
|
+
// # Merge
|
|
27
|
+
BELLATRIX_FORK_VERSION: b("0x90000071"),
|
|
28
|
+
BELLATRIX_FORK_EPOCH: 100,
|
|
29
|
+
TERMINAL_TOTAL_DIFFICULTY: BigInt("17000000000000000"),
|
|
30
|
+
// Capella
|
|
31
|
+
CAPELLA_FORK_VERSION: b("0x90000072"),
|
|
32
|
+
CAPELLA_FORK_EPOCH: 56832,
|
|
33
|
+
// Deneb
|
|
34
|
+
DENEB_FORK_VERSION: b("0x90000073"),
|
|
35
|
+
DENEB_FORK_EPOCH: 132608,
|
|
36
|
+
// Electra
|
|
37
|
+
ELECTRA_FORK_VERSION: b("0x90000074"),
|
|
38
|
+
ELECTRA_FORK_EPOCH: 222464,
|
|
39
|
+
// Fulu
|
|
40
|
+
FULU_FORK_VERSION: b("0x90000075"),
|
|
41
|
+
FULU_FORK_EPOCH: 272640,
|
|
42
|
+
|
|
43
|
+
// Deposit contract
|
|
44
|
+
// ---------------------------------------------------------------
|
|
45
|
+
DEPOSIT_CHAIN_ID: 11155111,
|
|
46
|
+
DEPOSIT_NETWORK_ID: 11155111,
|
|
47
|
+
DEPOSIT_CONTRACT_ADDRESS: b("0x7f02C3E3c98b133055B8B348B2Ac625669Ed295D"),
|
|
48
|
+
|
|
49
|
+
// Blob Scheduling
|
|
50
|
+
// ---------------------------------------------------------------
|
|
51
|
+
BLOB_SCHEDULE: [
|
|
52
|
+
{
|
|
53
|
+
EPOCH: 274176,
|
|
54
|
+
MAX_BLOBS_PER_BLOCK: 15,
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
EPOCH: 275712,
|
|
58
|
+
MAX_BLOBS_PER_BLOCK: 21,
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
};
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
import {PresetName} from "@lodestar/params";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Run-time chain configuration
|
|
5
|
+
*/
|
|
6
|
+
export type ChainConfig = {
|
|
7
|
+
PRESET_BASE: PresetName;
|
|
8
|
+
/**
|
|
9
|
+
* Free-form short name of the network that this configuration applies to - known
|
|
10
|
+
* canonical network names include:
|
|
11
|
+
* * 'mainnet' - there can be only one
|
|
12
|
+
* * 'holesky' - testnet
|
|
13
|
+
* Must match the regex: [a-z0-9\-]
|
|
14
|
+
*/
|
|
15
|
+
CONFIG_NAME: string;
|
|
16
|
+
|
|
17
|
+
// Transition
|
|
18
|
+
TERMINAL_TOTAL_DIFFICULTY: bigint;
|
|
19
|
+
TERMINAL_BLOCK_HASH: Uint8Array;
|
|
20
|
+
TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: number;
|
|
21
|
+
|
|
22
|
+
// Genesis
|
|
23
|
+
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: number;
|
|
24
|
+
MIN_GENESIS_TIME: number;
|
|
25
|
+
GENESIS_FORK_VERSION: Uint8Array;
|
|
26
|
+
GENESIS_DELAY: number;
|
|
27
|
+
|
|
28
|
+
// Forking
|
|
29
|
+
// Altair
|
|
30
|
+
ALTAIR_FORK_VERSION: Uint8Array;
|
|
31
|
+
ALTAIR_FORK_EPOCH: number;
|
|
32
|
+
// Bellatrix
|
|
33
|
+
BELLATRIX_FORK_VERSION: Uint8Array;
|
|
34
|
+
BELLATRIX_FORK_EPOCH: number;
|
|
35
|
+
// Capella
|
|
36
|
+
CAPELLA_FORK_VERSION: Uint8Array;
|
|
37
|
+
CAPELLA_FORK_EPOCH: number;
|
|
38
|
+
// DENEB
|
|
39
|
+
DENEB_FORK_VERSION: Uint8Array;
|
|
40
|
+
DENEB_FORK_EPOCH: number;
|
|
41
|
+
// ELECTRA
|
|
42
|
+
ELECTRA_FORK_VERSION: Uint8Array;
|
|
43
|
+
ELECTRA_FORK_EPOCH: number;
|
|
44
|
+
// FULU
|
|
45
|
+
FULU_FORK_VERSION: Uint8Array;
|
|
46
|
+
FULU_FORK_EPOCH: number;
|
|
47
|
+
// GLOAS
|
|
48
|
+
GLOAS_FORK_VERSION: Uint8Array;
|
|
49
|
+
GLOAS_FORK_EPOCH: number;
|
|
50
|
+
|
|
51
|
+
// Time parameters
|
|
52
|
+
/** @deprecated */
|
|
53
|
+
SECONDS_PER_SLOT: number;
|
|
54
|
+
SLOT_DURATION_MS: number;
|
|
55
|
+
SECONDS_PER_ETH1_BLOCK: number;
|
|
56
|
+
MIN_VALIDATOR_WITHDRAWABILITY_DELAY: number;
|
|
57
|
+
SHARD_COMMITTEE_PERIOD: number;
|
|
58
|
+
ETH1_FOLLOW_DISTANCE: number;
|
|
59
|
+
PROPOSER_REORG_CUTOFF_BPS: number;
|
|
60
|
+
ATTESTATION_DUE_BPS: number;
|
|
61
|
+
AGGREGATE_DUE_BPS: number;
|
|
62
|
+
// Altair
|
|
63
|
+
SYNC_MESSAGE_DUE_BPS: number;
|
|
64
|
+
CONTRIBUTION_DUE_BPS: number;
|
|
65
|
+
|
|
66
|
+
ATTESTATION_DUE_BPS_GLOAS: number;
|
|
67
|
+
AGGREGATE_DUE_BPS_GLOAS: number;
|
|
68
|
+
SYNC_MESSAGE_DUE_BPS_GLOAS: number;
|
|
69
|
+
CONTRIBUTION_DUE_BPS_GLOAS: number;
|
|
70
|
+
PAYLOAD_ATTESTATION_DUE_BPS: number;
|
|
71
|
+
|
|
72
|
+
// Validator cycle
|
|
73
|
+
INACTIVITY_SCORE_BIAS: number;
|
|
74
|
+
INACTIVITY_SCORE_RECOVERY_RATE: number;
|
|
75
|
+
EJECTION_BALANCE: number;
|
|
76
|
+
MIN_PER_EPOCH_CHURN_LIMIT: number;
|
|
77
|
+
MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT: number;
|
|
78
|
+
CHURN_LIMIT_QUOTIENT: number;
|
|
79
|
+
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: number;
|
|
80
|
+
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: number;
|
|
81
|
+
|
|
82
|
+
// Fork choice
|
|
83
|
+
PROPOSER_SCORE_BOOST: number;
|
|
84
|
+
REORG_HEAD_WEIGHT_THRESHOLD: number;
|
|
85
|
+
REORG_PARENT_WEIGHT_THRESHOLD: number;
|
|
86
|
+
REORG_MAX_EPOCHS_SINCE_FINALIZATION: number;
|
|
87
|
+
|
|
88
|
+
// Deposit contract
|
|
89
|
+
DEPOSIT_CHAIN_ID: number;
|
|
90
|
+
DEPOSIT_NETWORK_ID: number;
|
|
91
|
+
DEPOSIT_CONTRACT_ADDRESS: Uint8Array;
|
|
92
|
+
|
|
93
|
+
// Networking
|
|
94
|
+
MAX_REQUEST_BLOCKS: number;
|
|
95
|
+
MAX_REQUEST_BLOCKS_DENEB: number;
|
|
96
|
+
MIN_EPOCHS_FOR_BLOCK_REQUESTS: number;
|
|
97
|
+
MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: number;
|
|
98
|
+
MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: number;
|
|
99
|
+
BLOB_SIDECAR_SUBNET_COUNT: number;
|
|
100
|
+
MAX_BLOBS_PER_BLOCK: number;
|
|
101
|
+
MAX_REQUEST_BLOB_SIDECARS: number;
|
|
102
|
+
BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: number;
|
|
103
|
+
DATA_COLUMN_SIDECAR_SUBNET_COUNT: number;
|
|
104
|
+
MAX_BLOBS_PER_BLOCK_ELECTRA: number;
|
|
105
|
+
MAX_REQUEST_BLOB_SIDECARS_ELECTRA: number;
|
|
106
|
+
MAX_REQUEST_DATA_COLUMN_SIDECARS: number;
|
|
107
|
+
|
|
108
|
+
// Fulu
|
|
109
|
+
NUMBER_OF_CUSTODY_GROUPS: number;
|
|
110
|
+
SAMPLES_PER_SLOT: number;
|
|
111
|
+
CUSTODY_REQUIREMENT: number;
|
|
112
|
+
VALIDATOR_CUSTODY_REQUIREMENT: number;
|
|
113
|
+
BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: number;
|
|
114
|
+
|
|
115
|
+
// Blob Scheduling
|
|
116
|
+
BLOB_SCHEDULE: BlobSchedule;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export const chainConfigTypes: SpecTypes<ChainConfig> = {
|
|
120
|
+
PRESET_BASE: "string",
|
|
121
|
+
CONFIG_NAME: "string",
|
|
122
|
+
|
|
123
|
+
// Transition
|
|
124
|
+
TERMINAL_TOTAL_DIFFICULTY: "bigint",
|
|
125
|
+
TERMINAL_BLOCK_HASH: "bytes",
|
|
126
|
+
TERMINAL_BLOCK_HASH_ACTIVATION_EPOCH: "number",
|
|
127
|
+
|
|
128
|
+
// Genesis
|
|
129
|
+
MIN_GENESIS_ACTIVE_VALIDATOR_COUNT: "number",
|
|
130
|
+
MIN_GENESIS_TIME: "number",
|
|
131
|
+
GENESIS_FORK_VERSION: "bytes",
|
|
132
|
+
GENESIS_DELAY: "number",
|
|
133
|
+
|
|
134
|
+
// Forking
|
|
135
|
+
// Altair
|
|
136
|
+
ALTAIR_FORK_VERSION: "bytes",
|
|
137
|
+
ALTAIR_FORK_EPOCH: "number",
|
|
138
|
+
// Bellatrix
|
|
139
|
+
BELLATRIX_FORK_VERSION: "bytes",
|
|
140
|
+
BELLATRIX_FORK_EPOCH: "number",
|
|
141
|
+
// Capella
|
|
142
|
+
CAPELLA_FORK_VERSION: "bytes",
|
|
143
|
+
CAPELLA_FORK_EPOCH: "number",
|
|
144
|
+
// DENEB
|
|
145
|
+
DENEB_FORK_VERSION: "bytes",
|
|
146
|
+
DENEB_FORK_EPOCH: "number",
|
|
147
|
+
// ELECTRA
|
|
148
|
+
ELECTRA_FORK_VERSION: "bytes",
|
|
149
|
+
ELECTRA_FORK_EPOCH: "number",
|
|
150
|
+
// FULU
|
|
151
|
+
FULU_FORK_VERSION: "bytes",
|
|
152
|
+
FULU_FORK_EPOCH: "number",
|
|
153
|
+
// GLOAS
|
|
154
|
+
GLOAS_FORK_VERSION: "bytes",
|
|
155
|
+
GLOAS_FORK_EPOCH: "number",
|
|
156
|
+
|
|
157
|
+
// Time parameters
|
|
158
|
+
SECONDS_PER_SLOT: "number",
|
|
159
|
+
SLOT_DURATION_MS: "number",
|
|
160
|
+
SECONDS_PER_ETH1_BLOCK: "number",
|
|
161
|
+
MIN_VALIDATOR_WITHDRAWABILITY_DELAY: "number",
|
|
162
|
+
SHARD_COMMITTEE_PERIOD: "number",
|
|
163
|
+
ETH1_FOLLOW_DISTANCE: "number",
|
|
164
|
+
PROPOSER_REORG_CUTOFF_BPS: "number",
|
|
165
|
+
ATTESTATION_DUE_BPS: "number",
|
|
166
|
+
AGGREGATE_DUE_BPS: "number",
|
|
167
|
+
// Altair
|
|
168
|
+
SYNC_MESSAGE_DUE_BPS: "number",
|
|
169
|
+
CONTRIBUTION_DUE_BPS: "number",
|
|
170
|
+
|
|
171
|
+
ATTESTATION_DUE_BPS_GLOAS: "number",
|
|
172
|
+
AGGREGATE_DUE_BPS_GLOAS: "number",
|
|
173
|
+
SYNC_MESSAGE_DUE_BPS_GLOAS: "number",
|
|
174
|
+
CONTRIBUTION_DUE_BPS_GLOAS: "number",
|
|
175
|
+
PAYLOAD_ATTESTATION_DUE_BPS: "number",
|
|
176
|
+
|
|
177
|
+
// Validator cycle
|
|
178
|
+
INACTIVITY_SCORE_BIAS: "number",
|
|
179
|
+
INACTIVITY_SCORE_RECOVERY_RATE: "number",
|
|
180
|
+
EJECTION_BALANCE: "number",
|
|
181
|
+
MIN_PER_EPOCH_CHURN_LIMIT: "number",
|
|
182
|
+
MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT: "number",
|
|
183
|
+
CHURN_LIMIT_QUOTIENT: "number",
|
|
184
|
+
MAX_PER_EPOCH_ACTIVATION_EXIT_CHURN_LIMIT: "number",
|
|
185
|
+
MIN_PER_EPOCH_CHURN_LIMIT_ELECTRA: "number",
|
|
186
|
+
|
|
187
|
+
// Fork choice
|
|
188
|
+
PROPOSER_SCORE_BOOST: "number",
|
|
189
|
+
REORG_HEAD_WEIGHT_THRESHOLD: "number",
|
|
190
|
+
REORG_PARENT_WEIGHT_THRESHOLD: "number",
|
|
191
|
+
REORG_MAX_EPOCHS_SINCE_FINALIZATION: "number",
|
|
192
|
+
|
|
193
|
+
// Deposit contract
|
|
194
|
+
DEPOSIT_CHAIN_ID: "number",
|
|
195
|
+
DEPOSIT_NETWORK_ID: "number",
|
|
196
|
+
DEPOSIT_CONTRACT_ADDRESS: "bytes",
|
|
197
|
+
|
|
198
|
+
// Networking
|
|
199
|
+
MAX_REQUEST_BLOCKS: "number",
|
|
200
|
+
MAX_REQUEST_BLOCKS_DENEB: "number",
|
|
201
|
+
MIN_EPOCHS_FOR_BLOCK_REQUESTS: "number",
|
|
202
|
+
MIN_EPOCHS_FOR_BLOB_SIDECARS_REQUESTS: "number",
|
|
203
|
+
MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS: "number",
|
|
204
|
+
BLOB_SIDECAR_SUBNET_COUNT: "number",
|
|
205
|
+
DATA_COLUMN_SIDECAR_SUBNET_COUNT: "number",
|
|
206
|
+
MAX_BLOBS_PER_BLOCK: "number",
|
|
207
|
+
MAX_REQUEST_BLOB_SIDECARS: "number",
|
|
208
|
+
BLOB_SIDECAR_SUBNET_COUNT_ELECTRA: "number",
|
|
209
|
+
MAX_BLOBS_PER_BLOCK_ELECTRA: "number",
|
|
210
|
+
MAX_REQUEST_BLOB_SIDECARS_ELECTRA: "number",
|
|
211
|
+
MAX_REQUEST_DATA_COLUMN_SIDECARS: "number",
|
|
212
|
+
|
|
213
|
+
// Fulu
|
|
214
|
+
NUMBER_OF_CUSTODY_GROUPS: "number",
|
|
215
|
+
SAMPLES_PER_SLOT: "number",
|
|
216
|
+
CUSTODY_REQUIREMENT: "number",
|
|
217
|
+
VALIDATOR_CUSTODY_REQUIREMENT: "number",
|
|
218
|
+
BALANCE_PER_ADDITIONAL_CUSTODY_GROUP: "number",
|
|
219
|
+
|
|
220
|
+
// Blob Scheduling
|
|
221
|
+
BLOB_SCHEDULE: "blob_schedule",
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
export type BlobScheduleEntry = {
|
|
225
|
+
EPOCH: number;
|
|
226
|
+
MAX_BLOBS_PER_BLOCK: number;
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
export type BlobSchedule = BlobScheduleEntry[];
|
|
230
|
+
|
|
231
|
+
export function isBlobSchedule(value: unknown): value is BlobSchedule {
|
|
232
|
+
return (
|
|
233
|
+
Array.isArray(value) &&
|
|
234
|
+
value.every(
|
|
235
|
+
(entry) =>
|
|
236
|
+
typeof entry === "object" &&
|
|
237
|
+
entry !== null &&
|
|
238
|
+
typeof entry.EPOCH === "number" &&
|
|
239
|
+
typeof entry.MAX_BLOBS_PER_BLOCK === "number"
|
|
240
|
+
)
|
|
241
|
+
);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/** Allows values in a Spec file */
|
|
245
|
+
export type SpecValue = number | bigint | Uint8Array | string | BlobSchedule;
|
|
246
|
+
|
|
247
|
+
/** Type value name of each spec field. Numbers are ignored since they are the most common */
|
|
248
|
+
export type SpecValueType<V extends SpecValue> = V extends number
|
|
249
|
+
? "number"
|
|
250
|
+
: V extends bigint
|
|
251
|
+
? "bigint"
|
|
252
|
+
: V extends Uint8Array
|
|
253
|
+
? "bytes"
|
|
254
|
+
: V extends string
|
|
255
|
+
? "string"
|
|
256
|
+
: V extends BlobSchedule
|
|
257
|
+
? "blob_schedule"
|
|
258
|
+
: never;
|
|
259
|
+
|
|
260
|
+
/** All possible type names for a SpecValue */
|
|
261
|
+
export type SpecValueTypeName = SpecValueType<SpecValue>;
|
|
262
|
+
|
|
263
|
+
export type SpecTypes<Spec extends Record<string, SpecValue>> = {
|
|
264
|
+
[K in keyof Spec]: SpecValueType<Spec[K]>;
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
export type SpecJson = Record<string, string | Record<string, string>[]>;
|
package/src/configs.ts
ADDED
package/src/default.ts
ADDED
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BASIS_POINTS,
|
|
3
|
+
ForkAll,
|
|
4
|
+
ForkName,
|
|
5
|
+
ForkPostAltair,
|
|
6
|
+
ForkPostBellatrix,
|
|
7
|
+
ForkPostDeneb,
|
|
8
|
+
ForkSeq,
|
|
9
|
+
GENESIS_EPOCH,
|
|
10
|
+
SLOTS_PER_EPOCH,
|
|
11
|
+
isForkPostAltair,
|
|
12
|
+
isForkPostBellatrix,
|
|
13
|
+
isForkPostDeneb,
|
|
14
|
+
} from "@lodestar/params";
|
|
15
|
+
import {Epoch, SSZTypesFor, Slot, Version, sszTypesFor} from "@lodestar/types";
|
|
16
|
+
import {ChainConfig} from "../chainConfig/index.js";
|
|
17
|
+
import {BlobParameters, ForkBoundary, ForkConfig, ForkInfo} from "./types.js";
|
|
18
|
+
|
|
19
|
+
export * from "./types.js";
|
|
20
|
+
|
|
21
|
+
export function createForkConfig(config: ChainConfig): ForkConfig {
|
|
22
|
+
const phase0: ForkInfo = {
|
|
23
|
+
name: ForkName.phase0,
|
|
24
|
+
seq: ForkSeq.phase0,
|
|
25
|
+
epoch: GENESIS_EPOCH,
|
|
26
|
+
version: config.GENESIS_FORK_VERSION,
|
|
27
|
+
// Will never be used
|
|
28
|
+
prevVersion: config.GENESIS_FORK_VERSION,
|
|
29
|
+
prevForkName: ForkName.phase0,
|
|
30
|
+
};
|
|
31
|
+
const altair: ForkInfo = {
|
|
32
|
+
name: ForkName.altair,
|
|
33
|
+
seq: ForkSeq.altair,
|
|
34
|
+
epoch: config.ALTAIR_FORK_EPOCH,
|
|
35
|
+
version: config.ALTAIR_FORK_VERSION,
|
|
36
|
+
prevVersion: config.GENESIS_FORK_VERSION,
|
|
37
|
+
prevForkName: ForkName.phase0,
|
|
38
|
+
};
|
|
39
|
+
const bellatrix: ForkInfo = {
|
|
40
|
+
name: ForkName.bellatrix,
|
|
41
|
+
seq: ForkSeq.bellatrix,
|
|
42
|
+
epoch: config.BELLATRIX_FORK_EPOCH,
|
|
43
|
+
version: config.BELLATRIX_FORK_VERSION,
|
|
44
|
+
prevVersion: config.ALTAIR_FORK_VERSION,
|
|
45
|
+
prevForkName: ForkName.altair,
|
|
46
|
+
};
|
|
47
|
+
const capella: ForkInfo = {
|
|
48
|
+
name: ForkName.capella,
|
|
49
|
+
seq: ForkSeq.capella,
|
|
50
|
+
epoch: config.CAPELLA_FORK_EPOCH,
|
|
51
|
+
version: config.CAPELLA_FORK_VERSION,
|
|
52
|
+
prevVersion: config.BELLATRIX_FORK_VERSION,
|
|
53
|
+
prevForkName: ForkName.bellatrix,
|
|
54
|
+
};
|
|
55
|
+
const deneb: ForkInfo = {
|
|
56
|
+
name: ForkName.deneb,
|
|
57
|
+
seq: ForkSeq.deneb,
|
|
58
|
+
epoch: config.DENEB_FORK_EPOCH,
|
|
59
|
+
version: config.DENEB_FORK_VERSION,
|
|
60
|
+
prevVersion: config.CAPELLA_FORK_VERSION,
|
|
61
|
+
prevForkName: ForkName.capella,
|
|
62
|
+
};
|
|
63
|
+
const electra: ForkInfo = {
|
|
64
|
+
name: ForkName.electra,
|
|
65
|
+
seq: ForkSeq.electra,
|
|
66
|
+
epoch: config.ELECTRA_FORK_EPOCH,
|
|
67
|
+
version: config.ELECTRA_FORK_VERSION,
|
|
68
|
+
prevVersion: config.DENEB_FORK_VERSION,
|
|
69
|
+
prevForkName: ForkName.deneb,
|
|
70
|
+
};
|
|
71
|
+
const fulu: ForkInfo = {
|
|
72
|
+
name: ForkName.fulu,
|
|
73
|
+
seq: ForkSeq.fulu,
|
|
74
|
+
epoch: config.FULU_FORK_EPOCH,
|
|
75
|
+
version: config.FULU_FORK_VERSION,
|
|
76
|
+
prevVersion: config.ELECTRA_FORK_VERSION,
|
|
77
|
+
prevForkName: ForkName.electra,
|
|
78
|
+
};
|
|
79
|
+
const gloas: ForkInfo = {
|
|
80
|
+
name: ForkName.gloas,
|
|
81
|
+
seq: ForkSeq.gloas,
|
|
82
|
+
epoch: config.GLOAS_FORK_EPOCH,
|
|
83
|
+
version: config.GLOAS_FORK_VERSION,
|
|
84
|
+
prevVersion: config.FULU_FORK_VERSION,
|
|
85
|
+
prevForkName: ForkName.fulu,
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
/** Forks in order order of occurence, `phase0` first */
|
|
89
|
+
// Note: Downstream code relies on proper ordering.
|
|
90
|
+
const forks = {phase0, altair, bellatrix, capella, deneb, electra, fulu, gloas};
|
|
91
|
+
|
|
92
|
+
// Prevents allocating an array on every getForkInfo() call
|
|
93
|
+
const forksAscendingEpochOrder = Object.values(forks);
|
|
94
|
+
const forksDescendingEpochOrder = Object.values(forks).reverse();
|
|
95
|
+
|
|
96
|
+
const blobScheduleDescendingEpochOrder = [...config.BLOB_SCHEDULE].sort((a, b) => b.EPOCH - a.EPOCH);
|
|
97
|
+
|
|
98
|
+
const forkBoundariesAscendingEpochOrder: ForkBoundary[] = [
|
|
99
|
+
// Normal hard-forks (phase0, altair, etc.)
|
|
100
|
+
...forksAscendingEpochOrder.map((fork) => ({
|
|
101
|
+
fork: fork.name,
|
|
102
|
+
epoch: fork.epoch,
|
|
103
|
+
})),
|
|
104
|
+
// Blob Parameter Only (BPO) forks
|
|
105
|
+
// Note: Must be appended after normal hard-forks to have precedence if scheduled at the same epoch
|
|
106
|
+
...config.BLOB_SCHEDULE.map((entry) => ({
|
|
107
|
+
fork: forksDescendingEpochOrder.find((f) => entry.EPOCH >= f.epoch)?.name ?? phase0.name,
|
|
108
|
+
epoch: entry.EPOCH,
|
|
109
|
+
})),
|
|
110
|
+
]
|
|
111
|
+
// Remove unscheduled fork boundaries
|
|
112
|
+
.filter(({epoch}) => epoch !== Infinity)
|
|
113
|
+
// Sort by epoch in ascending order
|
|
114
|
+
.sort((a, b) => a.epoch - b.epoch);
|
|
115
|
+
|
|
116
|
+
const forkBoundariesDescendingEpochOrder = [...forkBoundariesAscendingEpochOrder].reverse();
|
|
117
|
+
|
|
118
|
+
return {
|
|
119
|
+
forks,
|
|
120
|
+
forksAscendingEpochOrder,
|
|
121
|
+
forksDescendingEpochOrder,
|
|
122
|
+
forkBoundariesAscendingEpochOrder,
|
|
123
|
+
forkBoundariesDescendingEpochOrder,
|
|
124
|
+
|
|
125
|
+
// Fork convenience methods
|
|
126
|
+
getForkInfo(slot: Slot): ForkInfo {
|
|
127
|
+
const epoch = Math.floor(Math.max(slot, 0) / SLOTS_PER_EPOCH);
|
|
128
|
+
return this.getForkInfoAtEpoch(epoch);
|
|
129
|
+
},
|
|
130
|
+
getForkInfoAtEpoch(epoch: Epoch): ForkInfo {
|
|
131
|
+
return forks[this.getForkBoundaryAtEpoch(epoch).fork];
|
|
132
|
+
},
|
|
133
|
+
getForkBoundaryAtEpoch(epoch: Epoch): ForkBoundary {
|
|
134
|
+
if (epoch < 0) epoch = 0;
|
|
135
|
+
// NOTE: fork boundaries must be sorted by descending epoch, latest first
|
|
136
|
+
for (const boundary of forkBoundariesDescendingEpochOrder) {
|
|
137
|
+
if (epoch >= boundary.epoch) return boundary;
|
|
138
|
+
}
|
|
139
|
+
throw Error("Unreachable as phase0 is scheduled at epoch 0");
|
|
140
|
+
},
|
|
141
|
+
getForkName(slot: Slot): ForkName {
|
|
142
|
+
return this.getForkInfo(slot).name;
|
|
143
|
+
},
|
|
144
|
+
getForkSeq(slot: Slot): ForkSeq {
|
|
145
|
+
return this.getForkInfo(slot).seq;
|
|
146
|
+
},
|
|
147
|
+
getForkSeqAtEpoch(epoch: Epoch): ForkSeq {
|
|
148
|
+
return this.getForkInfoAtEpoch(epoch).seq;
|
|
149
|
+
},
|
|
150
|
+
getForkVersion(slot: Slot): Version {
|
|
151
|
+
return this.getForkInfo(slot).version;
|
|
152
|
+
},
|
|
153
|
+
getForkTypes<F extends ForkName = ForkAll>(slot: Slot): SSZTypesFor<F> {
|
|
154
|
+
return sszTypesFor(this.getForkName(slot)) as SSZTypesFor<F>;
|
|
155
|
+
},
|
|
156
|
+
getPostBellatrixForkTypes(slot: Slot): SSZTypesFor<ForkPostBellatrix> {
|
|
157
|
+
const forkName = this.getForkName(slot);
|
|
158
|
+
if (!isForkPostBellatrix(forkName)) {
|
|
159
|
+
throw Error(`Invalid slot=${slot} fork=${forkName} for post-bellatrix fork types`);
|
|
160
|
+
}
|
|
161
|
+
return sszTypesFor(forkName);
|
|
162
|
+
},
|
|
163
|
+
getPostAltairForkTypes(slot: Slot): SSZTypesFor<ForkPostAltair> {
|
|
164
|
+
const forkName = this.getForkName(slot);
|
|
165
|
+
if (!isForkPostAltair(forkName)) {
|
|
166
|
+
throw Error(`Invalid slot=${slot} fork=${forkName} for post-altair fork types`);
|
|
167
|
+
}
|
|
168
|
+
return sszTypesFor(forkName);
|
|
169
|
+
},
|
|
170
|
+
getPostDenebForkTypes(slot: Slot): SSZTypesFor<ForkPostDeneb> {
|
|
171
|
+
const forkName = this.getForkName(slot);
|
|
172
|
+
if (!isForkPostDeneb(forkName)) {
|
|
173
|
+
throw Error(`Invalid slot=${slot} fork=${forkName} for post-deneb fork types`);
|
|
174
|
+
}
|
|
175
|
+
return sszTypesFor(forkName);
|
|
176
|
+
},
|
|
177
|
+
getMaxBlobsPerBlock(epoch: Epoch): number {
|
|
178
|
+
const fork = this.getForkInfoAtEpoch(epoch).name;
|
|
179
|
+
|
|
180
|
+
switch (fork) {
|
|
181
|
+
case ForkName.electra:
|
|
182
|
+
return config.MAX_BLOBS_PER_BLOCK_ELECTRA;
|
|
183
|
+
case ForkName.deneb:
|
|
184
|
+
return config.MAX_BLOBS_PER_BLOCK;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
return this.getBlobParameters(epoch).maxBlobsPerBlock;
|
|
188
|
+
},
|
|
189
|
+
getBlobParameters(epoch: Epoch): BlobParameters {
|
|
190
|
+
if (epoch < config.FULU_FORK_EPOCH) {
|
|
191
|
+
throw Error(`getBlobParameters is not available pre-fulu epoch=${epoch}`);
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
// Find the latest applicable value from blob schedule
|
|
195
|
+
for (const entry of blobScheduleDescendingEpochOrder) {
|
|
196
|
+
if (epoch >= entry.EPOCH) {
|
|
197
|
+
return {epoch: entry.EPOCH, maxBlobsPerBlock: entry.MAX_BLOBS_PER_BLOCK};
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
return {epoch: config.ELECTRA_FORK_EPOCH, maxBlobsPerBlock: config.MAX_BLOBS_PER_BLOCK_ELECTRA};
|
|
202
|
+
},
|
|
203
|
+
getAttestationDueMs(_fork: ForkName): number {
|
|
204
|
+
return this.getSlotComponentDurationMs(config.ATTESTATION_DUE_BPS);
|
|
205
|
+
},
|
|
206
|
+
getAggregateDueMs(_fork: ForkName): number {
|
|
207
|
+
return this.getSlotComponentDurationMs(config.AGGREGATE_DUE_BPS);
|
|
208
|
+
},
|
|
209
|
+
getSyncMessageDueMs(_fork: ForkName): number {
|
|
210
|
+
return this.getSlotComponentDurationMs(config.SYNC_MESSAGE_DUE_BPS);
|
|
211
|
+
},
|
|
212
|
+
getSyncContributionDueMs(_fork: ForkName): number {
|
|
213
|
+
return this.getSlotComponentDurationMs(config.CONTRIBUTION_DUE_BPS);
|
|
214
|
+
},
|
|
215
|
+
getProposerReorgCutoffMs(_fork: ForkName): number {
|
|
216
|
+
return this.getSlotComponentDurationMs(config.PROPOSER_REORG_CUTOFF_BPS);
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
getSlotComponentDurationMs(basisPoints: number): number {
|
|
220
|
+
return Math.round((basisPoints * config.SLOT_DURATION_MS) / BASIS_POINTS);
|
|
221
|
+
},
|
|
222
|
+
};
|
|
223
|
+
}
|