@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.
Files changed (60) hide show
  1. package/lib/beaconConfig.d.ts.map +1 -0
  2. package/lib/chainConfig/configs/mainnet.d.ts.map +1 -0
  3. package/lib/chainConfig/configs/mainnet.js +14 -1
  4. package/lib/chainConfig/configs/mainnet.js.map +1 -1
  5. package/lib/chainConfig/configs/minimal.d.ts.map +1 -0
  6. package/lib/chainConfig/configs/minimal.js +14 -1
  7. package/lib/chainConfig/configs/minimal.js.map +1 -1
  8. package/lib/chainConfig/default.d.ts.map +1 -0
  9. package/lib/chainConfig/index.d.ts.map +1 -0
  10. package/lib/chainConfig/index.js +5 -0
  11. package/lib/chainConfig/index.js.map +1 -1
  12. package/lib/chainConfig/json.d.ts.map +1 -0
  13. package/lib/chainConfig/networks/chiado.d.ts.map +1 -0
  14. package/lib/chainConfig/networks/ephemery.d.ts.map +1 -0
  15. package/lib/chainConfig/networks/gnosis.d.ts.map +1 -0
  16. package/lib/chainConfig/networks/holesky.d.ts.map +1 -0
  17. package/lib/chainConfig/networks/hoodi.d.ts.map +1 -0
  18. package/lib/chainConfig/networks/mainnet.d.ts.map +1 -0
  19. package/lib/chainConfig/networks/sepolia.d.ts.map +1 -0
  20. package/lib/chainConfig/types.d.ts +7 -0
  21. package/lib/chainConfig/types.d.ts.map +1 -0
  22. package/lib/chainConfig/types.js +7 -0
  23. package/lib/chainConfig/types.js.map +1 -1
  24. package/lib/configs.d.ts.map +1 -0
  25. package/lib/default.d.ts +1 -1
  26. package/lib/default.d.ts.map +1 -0
  27. package/lib/forkConfig/index.d.ts.map +1 -0
  28. package/lib/forkConfig/index.js +19 -1
  29. package/lib/forkConfig/index.js.map +1 -1
  30. package/lib/forkConfig/types.d.ts +7 -0
  31. package/lib/forkConfig/types.d.ts.map +1 -0
  32. package/lib/genesisConfig/index.d.ts.map +1 -0
  33. package/lib/genesisConfig/types.d.ts.map +1 -0
  34. package/lib/index.d.ts.map +1 -0
  35. package/lib/networks.d.ts.map +1 -0
  36. package/lib/utils/validateBlobSchedule.d.ts.map +1 -0
  37. package/package.json +8 -10
  38. package/src/beaconConfig.ts +31 -0
  39. package/src/chainConfig/configs/mainnet.ts +172 -0
  40. package/src/chainConfig/configs/minimal.ts +167 -0
  41. package/src/chainConfig/default.ts +19 -0
  42. package/src/chainConfig/index.ts +33 -0
  43. package/src/chainConfig/json.ts +175 -0
  44. package/src/chainConfig/networks/chiado.ts +49 -0
  45. package/src/chainConfig/networks/ephemery.ts +71 -0
  46. package/src/chainConfig/networks/gnosis.ts +74 -0
  47. package/src/chainConfig/networks/holesky.ts +64 -0
  48. package/src/chainConfig/networks/hoodi.ts +64 -0
  49. package/src/chainConfig/networks/mainnet.ts +19 -0
  50. package/src/chainConfig/networks/sepolia.ts +61 -0
  51. package/src/chainConfig/types.ts +267 -0
  52. package/src/configs.ts +4 -0
  53. package/src/default.ts +6 -0
  54. package/src/forkConfig/index.ts +223 -0
  55. package/src/forkConfig/types.ts +68 -0
  56. package/src/genesisConfig/index.ts +180 -0
  57. package/src/genesisConfig/types.ts +29 -0
  58. package/src/index.ts +4 -0
  59. package/src/networks.ts +65 -0
  60. 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
@@ -0,0 +1,4 @@
1
+ import {chainConfig as mainnetChainConfig} from "./chainConfig/configs/mainnet.js";
2
+ import {chainConfig as minimalChainConfig} from "./chainConfig/configs/minimal.js";
3
+
4
+ export {mainnetChainConfig, minimalChainConfig};
package/src/default.ts ADDED
@@ -0,0 +1,6 @@
1
+ import {createChainForkConfig} from "./beaconConfig.js";
2
+ import {defaultChainConfig} from "./chainConfig/index.js";
3
+
4
+ export const chainConfig = defaultChainConfig;
5
+ // for testing purpose only
6
+ export const config = createChainForkConfig(defaultChainConfig);
@@ -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
+ }