@lodestar/params 1.35.0-dev.feed916580 → 1.35.0-rc.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/src/index.ts ADDED
@@ -0,0 +1,311 @@
1
+ import {PresetName} from "./presetName.js";
2
+ import {presetStatus} from "./presetStatus.js";
3
+ import {gnosisPreset} from "./presets/gnosis.js";
4
+ import {mainnetPreset} from "./presets/mainnet.js";
5
+ import {minimalPreset} from "./presets/minimal.js";
6
+ import {userOverrides, userSelectedPreset} from "./setPreset.js";
7
+
8
+ export * from "./forkName.js";
9
+ export {presetToJson} from "./json.js";
10
+ export type {BeaconPreset} from "./types.js";
11
+ export {PresetName};
12
+
13
+ const presets = {
14
+ [PresetName.mainnet]: mainnetPreset,
15
+ [PresetName.minimal]: minimalPreset,
16
+ [PresetName.gnosis]: gnosisPreset,
17
+ };
18
+
19
+ // Once this file is imported, freeze the preset so calling setActivePreset() will throw an error
20
+ presetStatus.frozen = true;
21
+
22
+ /**
23
+ * The preset name currently exported by this library
24
+ *
25
+ * The `LODESTAR_PRESET` environment variable is used to select the active preset
26
+ * If `LODESTAR_PRESET` is not set, the default is `mainnet`.
27
+ *
28
+ * The active preset can be manually overridden with `setActivePreset`
29
+ */
30
+ export const ACTIVE_PRESET =
31
+ userSelectedPreset ??
32
+ (typeof process !== "undefined" ? PresetName[process?.env?.LODESTAR_PRESET as PresetName] : undefined) ??
33
+ PresetName.mainnet;
34
+ export const activePreset = {...presets[ACTIVE_PRESET], ...userOverrides};
35
+
36
+ // These variables must be exported individually and explicitly
37
+ // in order to be accessible as top-level exports
38
+ export const {
39
+ MAX_COMMITTEES_PER_SLOT,
40
+ TARGET_COMMITTEE_SIZE,
41
+ MAX_VALIDATORS_PER_COMMITTEE,
42
+ SHUFFLE_ROUND_COUNT,
43
+ HYSTERESIS_QUOTIENT,
44
+ HYSTERESIS_DOWNWARD_MULTIPLIER,
45
+ HYSTERESIS_UPWARD_MULTIPLIER,
46
+ MIN_DEPOSIT_AMOUNT,
47
+ MAX_EFFECTIVE_BALANCE,
48
+ EFFECTIVE_BALANCE_INCREMENT,
49
+ MIN_ATTESTATION_INCLUSION_DELAY,
50
+ SLOTS_PER_EPOCH,
51
+ MIN_SEED_LOOKAHEAD,
52
+ MAX_SEED_LOOKAHEAD,
53
+ EPOCHS_PER_ETH1_VOTING_PERIOD,
54
+ SLOTS_PER_HISTORICAL_ROOT,
55
+ MIN_EPOCHS_TO_INACTIVITY_PENALTY,
56
+ EPOCHS_PER_HISTORICAL_VECTOR,
57
+ EPOCHS_PER_SLASHINGS_VECTOR,
58
+ HISTORICAL_ROOTS_LIMIT,
59
+ VALIDATOR_REGISTRY_LIMIT,
60
+ BASE_REWARD_FACTOR,
61
+ WHISTLEBLOWER_REWARD_QUOTIENT,
62
+ PROPOSER_REWARD_QUOTIENT,
63
+ INACTIVITY_PENALTY_QUOTIENT,
64
+ MIN_SLASHING_PENALTY_QUOTIENT,
65
+ PROPORTIONAL_SLASHING_MULTIPLIER,
66
+ MAX_PROPOSER_SLASHINGS,
67
+ MAX_ATTESTER_SLASHINGS,
68
+ MAX_ATTESTATIONS,
69
+ MAX_DEPOSITS,
70
+ MAX_VOLUNTARY_EXITS,
71
+
72
+ SYNC_COMMITTEE_SIZE,
73
+ EPOCHS_PER_SYNC_COMMITTEE_PERIOD,
74
+ INACTIVITY_PENALTY_QUOTIENT_ALTAIR,
75
+ MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR,
76
+ PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR,
77
+ MIN_SYNC_COMMITTEE_PARTICIPANTS,
78
+ UPDATE_TIMEOUT,
79
+
80
+ INACTIVITY_PENALTY_QUOTIENT_BELLATRIX,
81
+ MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX,
82
+ PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX,
83
+ MAX_BYTES_PER_TRANSACTION,
84
+ MAX_TRANSACTIONS_PER_PAYLOAD,
85
+ BYTES_PER_LOGS_BLOOM,
86
+ MAX_EXTRA_DATA_BYTES,
87
+
88
+ MAX_BLS_TO_EXECUTION_CHANGES,
89
+ MAX_WITHDRAWALS_PER_PAYLOAD,
90
+ MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP,
91
+
92
+ FIELD_ELEMENTS_PER_BLOB,
93
+ MAX_BLOB_COMMITMENTS_PER_BLOCK,
94
+ KZG_COMMITMENT_INCLUSION_PROOF_DEPTH,
95
+
96
+ MAX_EFFECTIVE_BALANCE_ELECTRA,
97
+ MIN_ACTIVATION_BALANCE,
98
+ PENDING_DEPOSITS_LIMIT,
99
+ PENDING_PARTIAL_WITHDRAWALS_LIMIT,
100
+ PENDING_CONSOLIDATIONS_LIMIT,
101
+ MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA,
102
+ MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD,
103
+
104
+ MAX_DEPOSIT_REQUESTS_PER_PAYLOAD,
105
+ MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD,
106
+ MAX_ATTESTER_SLASHINGS_ELECTRA,
107
+ MAX_ATTESTATIONS_ELECTRA,
108
+ MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP,
109
+ MAX_PENDING_DEPOSITS_PER_EPOCH,
110
+ WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA,
111
+
112
+ NUMBER_OF_COLUMNS,
113
+ CELLS_PER_EXT_BLOB,
114
+ FIELD_ELEMENTS_PER_CELL,
115
+ FIELD_ELEMENTS_PER_EXT_BLOB,
116
+ KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH,
117
+
118
+ PTC_SIZE,
119
+ MAX_PAYLOAD_ATTESTATIONS,
120
+ BUILDER_PENDING_WITHDRAWALS_LIMIT,
121
+ } = activePreset;
122
+
123
+ ////////////
124
+ // Constants
125
+ ////////////
126
+
127
+ // Exported directly on the index for faster accessing without commonjs compiled star import shenanigans
128
+
129
+ // Misc
130
+
131
+ export const GENESIS_SLOT = 0;
132
+ export const GENESIS_EPOCH = 0;
133
+ export const FAR_FUTURE_EPOCH = Infinity;
134
+ export const BASE_REWARDS_PER_EPOCH = 4;
135
+ export const DEPOSIT_CONTRACT_TREE_DEPTH = 2 ** 5; // 32
136
+ export const JUSTIFICATION_BITS_LENGTH = 4;
137
+ export const ZERO_HASH = Buffer.alloc(32, 0);
138
+ export const ZERO_HASH_HEX = "0x" + "00".repeat(32);
139
+
140
+ // Withdrawal prefixes
141
+ // Since the prefixes are just 1 byte, we define and use them as number
142
+ export const BLS_WITHDRAWAL_PREFIX = 0;
143
+ export const ETH1_ADDRESS_WITHDRAWAL_PREFIX = 1;
144
+ export const COMPOUNDING_WITHDRAWAL_PREFIX = 2;
145
+ export const BUILDER_WITHDRAWAL_PREFIX = 3;
146
+
147
+ // Domain types
148
+
149
+ export const DOMAIN_BEACON_PROPOSER = Uint8Array.from([0, 0, 0, 0]);
150
+ export const DOMAIN_BEACON_ATTESTER = Uint8Array.from([1, 0, 0, 0]);
151
+ export const DOMAIN_RANDAO = Uint8Array.from([2, 0, 0, 0]);
152
+ export const DOMAIN_DEPOSIT = Uint8Array.from([3, 0, 0, 0]);
153
+ export const DOMAIN_VOLUNTARY_EXIT = Uint8Array.from([4, 0, 0, 0]);
154
+ export const DOMAIN_SELECTION_PROOF = Uint8Array.from([5, 0, 0, 0]);
155
+ export const DOMAIN_AGGREGATE_AND_PROOF = Uint8Array.from([6, 0, 0, 0]);
156
+ export const DOMAIN_SYNC_COMMITTEE = Uint8Array.from([7, 0, 0, 0]);
157
+ export const DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF = Uint8Array.from([8, 0, 0, 0]);
158
+ export const DOMAIN_CONTRIBUTION_AND_PROOF = Uint8Array.from([9, 0, 0, 0]);
159
+ export const DOMAIN_BLS_TO_EXECUTION_CHANGE = Uint8Array.from([10, 0, 0, 0]);
160
+ export const DOMAIN_BEACON_BUILDER = Uint8Array.from([27, 0, 0, 0]);
161
+ export const DOMAIN_PTC_ATTESTER = Uint8Array.from([12, 0, 0, 0]);
162
+
163
+ // Application specific domains
164
+
165
+ /**
166
+ * `DOMAIN_APPLICATION_MASK` reserves the rest of the bitspace in `DomainType` for application
167
+ * usage. This means for some `DomainType` `DOMAIN_SOME_APPLICATION`, `DOMAIN_SOME_APPLICATION
168
+ * & DOMAIN_APPLICATION_MASK` **MUST** be non-zero. This expression for any other `DomainType`
169
+ * in the consensus specs **MUST** be zero.
170
+ */
171
+ export const DOMAIN_APPLICATION_MASK = Uint8Array.from([0, 0, 0, 1]);
172
+ export const DOMAIN_APPLICATION_BUILDER = Uint8Array.from([0, 0, 0, 1]);
173
+
174
+ // Participation flag indices
175
+
176
+ export const TIMELY_SOURCE_FLAG_INDEX = 0;
177
+ export const TIMELY_TARGET_FLAG_INDEX = 1;
178
+ export const TIMELY_HEAD_FLAG_INDEX = 2;
179
+
180
+ // Incentivization weights
181
+
182
+ export const TIMELY_SOURCE_WEIGHT = 14;
183
+ export const TIMELY_TARGET_WEIGHT = 26;
184
+ export const TIMELY_HEAD_WEIGHT = 14;
185
+ export const SYNC_REWARD_WEIGHT = 2;
186
+ export const PROPOSER_WEIGHT = 8;
187
+ export const WEIGHT_DENOMINATOR = 64;
188
+
189
+ // altair misc
190
+
191
+ export const PARTICIPATION_FLAG_WEIGHTS = [TIMELY_SOURCE_WEIGHT, TIMELY_TARGET_WEIGHT, TIMELY_HEAD_WEIGHT];
192
+
193
+ // phase0 validator
194
+
195
+ export const TARGET_AGGREGATORS_PER_COMMITTEE = 16;
196
+ export const RANDOM_SUBNETS_PER_VALIDATOR = 1;
197
+ export const EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION = 256;
198
+ /** Rationale: https://github.com/ethereum/consensus-specs/blob/v1.1.10/specs/phase0/p2p-interface.md#why-are-there-attestation_subnet_count-attestation-subnets */
199
+ export const ATTESTATION_SUBNET_COUNT = 64;
200
+ export const SUBNETS_PER_NODE = 2;
201
+ export const NODE_ID_BITS = 256;
202
+ export const ATTESTATION_SUBNET_PREFIX_BITS = Math.log2(ATTESTATION_SUBNET_COUNT);
203
+ export const EPOCHS_PER_SUBNET_SUBSCRIPTION = 256;
204
+
205
+ // altair validator
206
+
207
+ export const TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE = 16;
208
+ export const SYNC_COMMITTEE_SUBNET_COUNT = 4;
209
+ export const SYNC_COMMITTEE_SUBNET_SIZE = Math.floor(SYNC_COMMITTEE_SIZE / SYNC_COMMITTEE_SUBNET_COUNT);
210
+
211
+ // Lightclient pre-computed
212
+ /**
213
+ * ```ts
214
+ * config.types.altair.BeaconState.getPathGindex(["finalizedCheckpoint", "root"])
215
+ * ```
216
+ */
217
+ export const FINALIZED_ROOT_GINDEX = 105;
218
+ /**
219
+ * ```ts
220
+ * Math.floor(Math.log2(FINALIZED_ROOT_GINDEX))
221
+ * ```
222
+ */
223
+ export const FINALIZED_ROOT_DEPTH = 6;
224
+ export const FINALIZED_ROOT_INDEX = 41;
225
+
226
+ /**
227
+ * ```ts
228
+ * types.ssz.capella.BeaconBlockBody.getPathInfo(['executionPayload']).gindex
229
+ * ```
230
+ */
231
+ export const BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX = 25;
232
+ /**
233
+ * ```ts
234
+ * Math.floor(Math.log2(EXECUTION_PAYLOAD_GINDEX))
235
+ * ```
236
+ */
237
+ export const BLOCK_BODY_EXECUTION_PAYLOAD_DEPTH = 4;
238
+ export const BLOCK_BODY_EXECUTION_PAYLOAD_INDEX = 9;
239
+
240
+ /**
241
+ * ```ts
242
+ * config.types.altair.BeaconState.getPathGindex(["currentSyncCommittee"])
243
+ * ```
244
+ */
245
+ export const CURRENT_SYNC_COMMITTEE_GINDEX = 54;
246
+ /**
247
+ * ```ts
248
+ * Math.floor(Math.log2(CURRENT_SYNC_COMMITTEE_GINDEX))
249
+ * ```
250
+ */
251
+ export const CURRENT_SYNC_COMMITTEE_DEPTH = 5;
252
+ export const CURRENT_SYNC_COMMITTEE_INDEX = 22;
253
+ /**
254
+ * ```ts
255
+ * config.types.altair.BeaconState.getPathGindex(["nextSyncCommittee"])
256
+ * ```
257
+ */
258
+ export const NEXT_SYNC_COMMITTEE_GINDEX = 55;
259
+ /**
260
+ * ```ts
261
+ * Math.floor(Math.log2(NEXT_SYNC_COMMITTEE_GINDEX))
262
+ * ```
263
+ */
264
+ export const NEXT_SYNC_COMMITTEE_DEPTH = 5;
265
+ export const NEXT_SYNC_COMMITTEE_INDEX = 23;
266
+ export const MAX_REQUEST_LIGHT_CLIENT_UPDATES = 128;
267
+ export const MAX_REQUEST_LIGHT_CLIENT_COMMITTEE_HASHES = 128;
268
+
269
+ /**
270
+ * Optimistic sync
271
+ */
272
+ export const SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY = 128;
273
+ export const INTERVALS_PER_SLOT = 3;
274
+
275
+ // EIP-4844: Crypto const
276
+ export const BYTES_PER_FIELD_ELEMENT = 32;
277
+ export const BLOB_TX_TYPE = 0x03;
278
+ export const VERSIONED_HASH_VERSION_KZG = 0x01;
279
+
280
+ // ssz.deneb.BeaconBlockBody.getPathInfo(['blobKzgCommitments',0]).gindex
281
+ export const KZG_COMMITMENT_GINDEX0 = 221184;
282
+ export const KZG_COMMITMENT_SUBTREE_INDEX0 = KZG_COMMITMENT_GINDEX0 - 2 ** KZG_COMMITMENT_INCLUSION_PROOF_DEPTH;
283
+
284
+ // ssz.deneb.BlobSidecars.elementType.fixedSize
285
+ export const BLOBSIDECAR_FIXED_SIZE = 131928;
286
+
287
+ // Electra Misc
288
+ export const UNSET_DEPOSIT_REQUESTS_START_INDEX = 2n ** 64n - 1n;
289
+ export const FULL_EXIT_REQUEST_AMOUNT = 0;
290
+ export const FINALIZED_ROOT_GINDEX_ELECTRA = 169;
291
+ export const FINALIZED_ROOT_DEPTH_ELECTRA = 7;
292
+ export const FINALIZED_ROOT_INDEX_ELECTRA = 41;
293
+ export const CURRENT_SYNC_COMMITTEE_GINDEX_ELECTRA = 86;
294
+ export const CURRENT_SYNC_COMMITTEE_DEPTH_ELECTRA = 6;
295
+ export const CURRENT_SYNC_COMMITTEE_INDEX_ELECTRA = 22;
296
+ export const NEXT_SYNC_COMMITTEE_GINDEX_ELECTRA = 87;
297
+ export const NEXT_SYNC_COMMITTEE_DEPTH_ELECTRA = 6;
298
+ export const NEXT_SYNC_COMMITTEE_INDEX_ELECTRA = 23;
299
+ export const DEPOSIT_REQUEST_TYPE = 0x00;
300
+ export const WITHDRAWAL_REQUEST_TYPE = 0x01;
301
+ export const CONSOLIDATION_REQUEST_TYPE = 0x02;
302
+
303
+ export const BYTES_PER_CELL = FIELD_ELEMENTS_PER_CELL * BYTES_PER_FIELD_ELEMENT;
304
+
305
+ // ssz.fulu.BeaconBlockBody.getPathInfo(['blobKzgCommitments']).gindex
306
+ export const KZG_COMMITMENTS_GINDEX = 27;
307
+ export const KZG_COMMITMENTS_SUBTREE_INDEX = KZG_COMMITMENTS_GINDEX - 2 ** KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH;
308
+
309
+ // Gloas Misc
310
+ export const BUILDER_PAYMENT_THRESHOLD_NUMERATOR = 6;
311
+ export const BUILDER_PAYMENT_THRESHOLD_DENOMINATOR = 10;
package/src/json.ts ADDED
@@ -0,0 +1,58 @@
1
+ import {BeaconPreset, beaconPresetTypes} from "./types.js";
2
+
3
+ /**
4
+ * Render BeaconPreset to JSON strings
5
+ * - Numbers: Render as a quoted decimal string
6
+ */
7
+ export function presetToJson(preset: BeaconPreset): Record<string, string> {
8
+ const json: Record<string, string> = {};
9
+
10
+ for (const key of Object.keys(preset) as (keyof BeaconPreset)[]) {
11
+ json[key] = serializePresetValue(preset[key]);
12
+ }
13
+
14
+ return json;
15
+ }
16
+
17
+ /**
18
+ * Type Wrapper to ensure that all values of BeaconPreset are number.
19
+ * If there are more types, expand this function with a type switch
20
+ */
21
+ function serializePresetValue(value: number): string {
22
+ return value.toString(10);
23
+ }
24
+
25
+ /**
26
+ * Parse JSON strings of BeaconPreset
27
+ * - Numbers: Convert quoted decimal string to number
28
+ */
29
+ export function presetFromJson(json: Record<string, unknown>): Partial<BeaconPreset> {
30
+ const beaconPreset = {} as BeaconPreset;
31
+
32
+ for (const key of Object.keys(beaconPresetTypes) as (keyof BeaconPreset)[]) {
33
+ const value = json[key];
34
+ if (value !== undefined) {
35
+ beaconPreset[key] = deserializePresetValue(value, key);
36
+ }
37
+ }
38
+
39
+ return beaconPreset;
40
+ }
41
+
42
+ /**
43
+ * Ensure that all values of parsed BeaconPreset are numbers
44
+ * If there are more types, expand this function with a type switch
45
+ */
46
+ function deserializePresetValue(valueStr: unknown, keyName: string): number {
47
+ if (typeof valueStr !== "string") {
48
+ throw Error(`Invalid ${keyName} value ${valueStr as string} expected string`);
49
+ }
50
+
51
+ const value = parseInt(valueStr, 10);
52
+
53
+ if (Number.isNaN(value)) {
54
+ throw Error(`Invalid ${keyName} value ${valueStr} expected number`);
55
+ }
56
+
57
+ return value;
58
+ }
@@ -0,0 +1,5 @@
1
+ export enum PresetName {
2
+ mainnet = "mainnet",
3
+ minimal = "minimal",
4
+ gnosis = "gnosis",
5
+ }
@@ -0,0 +1,3 @@
1
+ export const presetStatus = {
2
+ frozen: false,
3
+ };
@@ -0,0 +1,22 @@
1
+ import {BeaconPreset} from "../types.js";
2
+ import {mainnetPreset} from "./mainnet.js";
3
+
4
+ // Gnosis preset
5
+ // https://github.com/gnosischain/specs/tree/master/consensus/preset/gnosis
6
+
7
+ export const gnosisPreset: BeaconPreset = {
8
+ ...mainnetPreset,
9
+
10
+ /// NOTE: Only add diff values
11
+
12
+ // phase0
13
+ BASE_REWARD_FACTOR: 25,
14
+ SLOTS_PER_EPOCH: 16,
15
+
16
+ // altair
17
+ EPOCHS_PER_SYNC_COMMITTEE_PERIOD: 512,
18
+
19
+ // capella
20
+ MAX_WITHDRAWALS_PER_PAYLOAD: 8,
21
+ MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP: 8192,
22
+ };
@@ -0,0 +1,149 @@
1
+ import {BeaconPreset} from "../types.js";
2
+
3
+ // Mainnet preset
4
+ // https://github.com/ethereum/consensus-specs/tree/dev/presets/mainnet
5
+
6
+ export const mainnetPreset: BeaconPreset = {
7
+ // Misc
8
+ // ---------------------------------------------------------------
9
+ // 2**6 (= 64)
10
+ MAX_COMMITTEES_PER_SLOT: 64,
11
+ // 2**7 (= 128)
12
+ TARGET_COMMITTEE_SIZE: 128,
13
+ // 2**11 (= 2,048)
14
+ MAX_VALIDATORS_PER_COMMITTEE: 2048,
15
+ // See issue 563
16
+ SHUFFLE_ROUND_COUNT: 90,
17
+ // 4
18
+ HYSTERESIS_QUOTIENT: 4,
19
+ // 1 (minus 0.25)
20
+ HYSTERESIS_DOWNWARD_MULTIPLIER: 1,
21
+ // 5 (plus 1.25)
22
+ HYSTERESIS_UPWARD_MULTIPLIER: 5,
23
+
24
+ // Gwei values
25
+ // ---------------------------------------------------------------
26
+ // 2**0 * 10**9 (= 1,000,000,000) Gwei
27
+ MIN_DEPOSIT_AMOUNT: 1000000000,
28
+ // 2**5 * 10**9 (= 32,000,000,000) Gwei
29
+ MAX_EFFECTIVE_BALANCE: 32000000000,
30
+ // 2**0 * 10**9 (= 1,000,000,000) Gwei
31
+ EFFECTIVE_BALANCE_INCREMENT: 1000000000,
32
+
33
+ // Time parameters
34
+ // ---------------------------------------------------------------
35
+ // 2**0 (= 1) slots 12 seconds
36
+ MIN_ATTESTATION_INCLUSION_DELAY: 1,
37
+ // 2**5 (= 32) slots 6.4 minutes
38
+ SLOTS_PER_EPOCH: 32,
39
+ // 2**0 (= 1) epochs 6.4 minutes
40
+ MIN_SEED_LOOKAHEAD: 1,
41
+ // 2**2 (= 4) epochs 25.6 minutes
42
+ MAX_SEED_LOOKAHEAD: 4,
43
+ // 2**6 (= 64) epochs ~6.8 hours
44
+ EPOCHS_PER_ETH1_VOTING_PERIOD: 64,
45
+ // 2**13 (= 8,192) slots ~13 hours
46
+ SLOTS_PER_HISTORICAL_ROOT: 8192,
47
+ // 2**2 (= 4) epochs 25.6 minutes
48
+ MIN_EPOCHS_TO_INACTIVITY_PENALTY: 4,
49
+
50
+ // State vector lengths
51
+ // ---------------------------------------------------------------
52
+ // 2**16 (= 65,536) epochs ~0.8 years
53
+ EPOCHS_PER_HISTORICAL_VECTOR: 65536,
54
+ // 2**13 (= 8,192) epochs ~36 days
55
+ EPOCHS_PER_SLASHINGS_VECTOR: 8192,
56
+ // 2**24 (= 16,777,216) historical roots, ~26,131 years
57
+ HISTORICAL_ROOTS_LIMIT: 16777216,
58
+ // 2**40 (= 1,099,511,627,776) validator spots
59
+ VALIDATOR_REGISTRY_LIMIT: 1099511627776,
60
+
61
+ // Reward and penalty quotients
62
+ // ---------------------------------------------------------------
63
+ // 2**6 (= 64)
64
+ BASE_REWARD_FACTOR: 64,
65
+ // 2**9 (= 512)
66
+ WHISTLEBLOWER_REWARD_QUOTIENT: 512,
67
+ // 2**3 (= 8)
68
+ PROPOSER_REWARD_QUOTIENT: 8,
69
+ // 2**26 (= 67,108,864)
70
+ INACTIVITY_PENALTY_QUOTIENT: 67108864,
71
+ // 2**7 (= 128) (lower safety margin at Phase 0 genesis)
72
+ MIN_SLASHING_PENALTY_QUOTIENT: 128,
73
+ PROPORTIONAL_SLASHING_MULTIPLIER: 1,
74
+
75
+ // Max operations per block
76
+ // ---------------------------------------------------------------
77
+ // 2**4 (= 16)
78
+ MAX_PROPOSER_SLASHINGS: 16,
79
+ // 2**1 (= 2)
80
+ MAX_ATTESTER_SLASHINGS: 2,
81
+ // 2**7 (= 128)
82
+ MAX_ATTESTATIONS: 128,
83
+ // 2**4 (= 16)
84
+ MAX_DEPOSITS: 16,
85
+ // 2**4 (= 16)
86
+ MAX_VOLUNTARY_EXITS: 16,
87
+
88
+ // ALTAIR
89
+ /////////
90
+ SYNC_COMMITTEE_SIZE: 512,
91
+ EPOCHS_PER_SYNC_COMMITTEE_PERIOD: 256,
92
+ INACTIVITY_PENALTY_QUOTIENT_ALTAIR: 50331648,
93
+ MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR: 64,
94
+ PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR: 2,
95
+ MIN_SYNC_COMMITTEE_PARTICIPANTS: 1,
96
+ UPDATE_TIMEOUT: 8192,
97
+
98
+ // BELLATRIX
99
+ ////////////
100
+ INACTIVITY_PENALTY_QUOTIENT_BELLATRIX: 16777216,
101
+ MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX: 32,
102
+ PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX: 3,
103
+ MAX_BYTES_PER_TRANSACTION: 1073741824,
104
+ MAX_TRANSACTIONS_PER_PAYLOAD: 1048576,
105
+ BYTES_PER_LOGS_BLOOM: 256,
106
+ MAX_EXTRA_DATA_BYTES: 32,
107
+
108
+ // CAPELLA
109
+ //////////
110
+ MAX_BLS_TO_EXECUTION_CHANGES: 16,
111
+ MAX_WITHDRAWALS_PER_PAYLOAD: 16,
112
+ MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP: 16384,
113
+
114
+ // DENEB
115
+ ///////////
116
+ FIELD_ELEMENTS_PER_BLOB: 4096,
117
+ MAX_BLOB_COMMITMENTS_PER_BLOCK: 4096,
118
+ KZG_COMMITMENT_INCLUSION_PROOF_DEPTH: 17,
119
+
120
+ // ELECTRA
121
+ MAX_DEPOSIT_REQUESTS_PER_PAYLOAD: 8192,
122
+ MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD: 16,
123
+ MAX_ATTESTER_SLASHINGS_ELECTRA: 1,
124
+ MAX_ATTESTATIONS_ELECTRA: 8,
125
+ MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP: 8,
126
+ MAX_PENDING_DEPOSITS_PER_EPOCH: 16,
127
+ // 2**11 * 10**9 (= 2,048,000,000,000) Gwei
128
+ MAX_EFFECTIVE_BALANCE_ELECTRA: 2048000000000,
129
+ MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA: 4096,
130
+ MIN_ACTIVATION_BALANCE: 32000000000,
131
+ PENDING_DEPOSITS_LIMIT: 134217728,
132
+ PENDING_PARTIAL_WITHDRAWALS_LIMIT: 134217728,
133
+ PENDING_CONSOLIDATIONS_LIMIT: 262144,
134
+ MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: 2,
135
+ WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA: 4096,
136
+
137
+ // FULU
138
+ ///////////
139
+ NUMBER_OF_COLUMNS: 128,
140
+ CELLS_PER_EXT_BLOB: 128,
141
+ FIELD_ELEMENTS_PER_CELL: 64,
142
+ FIELD_ELEMENTS_PER_EXT_BLOB: 8192,
143
+ KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: 4,
144
+
145
+ // GLOAS
146
+ PTC_SIZE: 512,
147
+ MAX_PAYLOAD_ATTESTATIONS: 4,
148
+ BUILDER_PENDING_WITHDRAWALS_LIMIT: 1048576, // 2**20
149
+ };
@@ -0,0 +1,150 @@
1
+ import {BeaconPreset} from "../types.js";
2
+
3
+ // Minimal preset
4
+ // https://github.com/ethereum/consensus-specs/tree/dev/presets/minimal
5
+
6
+ export const minimalPreset: BeaconPreset = {
7
+ // Misc
8
+ // ---------------------------------------------------------------
9
+ // [customized] Just 4 committees for slot for testing purposes
10
+ MAX_COMMITTEES_PER_SLOT: 4,
11
+ // [customized] unsecure, but fast
12
+ TARGET_COMMITTEE_SIZE: 4,
13
+ // 2**11 (= 2,048)
14
+ MAX_VALIDATORS_PER_COMMITTEE: 2048,
15
+ // [customized] Faster, but unsecure.
16
+ SHUFFLE_ROUND_COUNT: 10,
17
+ // 4
18
+ HYSTERESIS_QUOTIENT: 4,
19
+ // 1 (minus 0.25)
20
+ HYSTERESIS_DOWNWARD_MULTIPLIER: 1,
21
+ // 5 (plus 1.25)
22
+ HYSTERESIS_UPWARD_MULTIPLIER: 5,
23
+
24
+ // Gwei values
25
+ // ---------------------------------------------------------------
26
+ // 2**0 * 10**9 (= 1,000,000,000) Gwei
27
+ MIN_DEPOSIT_AMOUNT: 1000000000,
28
+ // 2**5 * 10**9 (= 32,000,000,000) Gwei
29
+ MAX_EFFECTIVE_BALANCE: 32000000000,
30
+ // 2**0 * 10**9 (= 1,000,000,000) Gwei
31
+ EFFECTIVE_BALANCE_INCREMENT: 1000000000,
32
+
33
+ // Time parameters
34
+ // ---------------------------------------------------------------
35
+ // 2**0 (= 1) slots 6 seconds
36
+ MIN_ATTESTATION_INCLUSION_DELAY: 1,
37
+ // [customized] fast epochs
38
+ SLOTS_PER_EPOCH: 8,
39
+ // 2**0 (= 1) epochs
40
+ MIN_SEED_LOOKAHEAD: 1,
41
+ // 2**2 (= 4) epochs
42
+ MAX_SEED_LOOKAHEAD: 4,
43
+ // [customized] higher frequency new deposits from eth1 for testing
44
+ EPOCHS_PER_ETH1_VOTING_PERIOD: 4,
45
+ // [customized] smaller state
46
+ SLOTS_PER_HISTORICAL_ROOT: 64,
47
+ // 2**2 (= 4) epochs
48
+ MIN_EPOCHS_TO_INACTIVITY_PENALTY: 4,
49
+
50
+ // State vector lengths
51
+ // ---------------------------------------------------------------
52
+ // [customized] smaller state
53
+ EPOCHS_PER_HISTORICAL_VECTOR: 64,
54
+ // [customized] smaller state
55
+ EPOCHS_PER_SLASHINGS_VECTOR: 64,
56
+ // 2**24 (= 16,777,216) historical roots
57
+ HISTORICAL_ROOTS_LIMIT: 16777216,
58
+ // 2**40 (= 1,099,511,627,776) validator spots
59
+ VALIDATOR_REGISTRY_LIMIT: 1099511627776,
60
+
61
+ // Reward and penalty quotients
62
+ // ---------------------------------------------------------------
63
+ // 2**6 (= 64)
64
+ BASE_REWARD_FACTOR: 64,
65
+ // 2**9 (= 512)
66
+ WHISTLEBLOWER_REWARD_QUOTIENT: 512,
67
+ // 2**3 (= 8)
68
+ PROPOSER_REWARD_QUOTIENT: 8,
69
+ // [customized] 2**25 (= 33,554,432)
70
+ INACTIVITY_PENALTY_QUOTIENT: 33554432,
71
+ // [customized] 2**6 (= 64)
72
+ MIN_SLASHING_PENALTY_QUOTIENT: 64,
73
+ // [customized] 2 (lower safety margin than Phase 0 genesis but different than mainnet config for testing)
74
+ PROPORTIONAL_SLASHING_MULTIPLIER: 2,
75
+
76
+ // Max operations per block
77
+ // ---------------------------------------------------------------
78
+ // 2**4 (= 16)
79
+ MAX_PROPOSER_SLASHINGS: 16,
80
+ // 2**1 (= 2)
81
+ MAX_ATTESTER_SLASHINGS: 2,
82
+ // 2**7 (= 128)
83
+ MAX_ATTESTATIONS: 128,
84
+ // 2**4 (= 16)
85
+ MAX_DEPOSITS: 16,
86
+ // 2**4 (= 16)
87
+ MAX_VOLUNTARY_EXITS: 16,
88
+
89
+ // ALTAIR
90
+ /////////
91
+ SYNC_COMMITTEE_SIZE: 32,
92
+ EPOCHS_PER_SYNC_COMMITTEE_PERIOD: 8,
93
+ INACTIVITY_PENALTY_QUOTIENT_ALTAIR: 50331648,
94
+ MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR: 64,
95
+ PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR: 2,
96
+ MIN_SYNC_COMMITTEE_PARTICIPANTS: 1,
97
+ UPDATE_TIMEOUT: 64,
98
+
99
+ // BELLATRIX
100
+ ////////////
101
+ INACTIVITY_PENALTY_QUOTIENT_BELLATRIX: 16777216,
102
+ MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX: 32,
103
+ PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX: 3,
104
+ MAX_BYTES_PER_TRANSACTION: 1073741824,
105
+ MAX_TRANSACTIONS_PER_PAYLOAD: 1048576,
106
+ BYTES_PER_LOGS_BLOOM: 256,
107
+ MAX_EXTRA_DATA_BYTES: 32,
108
+
109
+ // CAPELLA
110
+ //////////
111
+ MAX_BLS_TO_EXECUTION_CHANGES: 16,
112
+ MAX_WITHDRAWALS_PER_PAYLOAD: 4,
113
+ MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP: 16,
114
+
115
+ // DENEB
116
+ ///////////
117
+ FIELD_ELEMENTS_PER_BLOB: 4096,
118
+
119
+ // ELECTRA
120
+ MAX_DEPOSIT_REQUESTS_PER_PAYLOAD: 8192,
121
+ MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD: 16,
122
+ MAX_ATTESTER_SLASHINGS_ELECTRA: 1,
123
+ MAX_ATTESTATIONS_ELECTRA: 8,
124
+ MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP: 2,
125
+ MAX_PENDING_DEPOSITS_PER_EPOCH: 16,
126
+ // 2**11 * 10**9 (= 2,048,000,000,000) Gwei
127
+ MAX_EFFECTIVE_BALANCE_ELECTRA: 2048000000000,
128
+ MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA: 4096,
129
+ MIN_ACTIVATION_BALANCE: 32000000000,
130
+ PENDING_DEPOSITS_LIMIT: 134217728,
131
+ PENDING_PARTIAL_WITHDRAWALS_LIMIT: 64,
132
+ PENDING_CONSOLIDATIONS_LIMIT: 64,
133
+ MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD: 2,
134
+ WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA: 4096,
135
+ MAX_BLOB_COMMITMENTS_PER_BLOCK: 4096,
136
+ KZG_COMMITMENT_INCLUSION_PROOF_DEPTH: 17,
137
+
138
+ // FULU
139
+ ///////////
140
+ NUMBER_OF_COLUMNS: 128,
141
+ CELLS_PER_EXT_BLOB: 128,
142
+ FIELD_ELEMENTS_PER_CELL: 64,
143
+ FIELD_ELEMENTS_PER_EXT_BLOB: 8192,
144
+ KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH: 4,
145
+
146
+ // GLOAS
147
+ PTC_SIZE: 2,
148
+ MAX_PAYLOAD_ATTESTATIONS: 4,
149
+ BUILDER_PENDING_WITHDRAWALS_LIMIT: 1048576, // 2**20
150
+ };