@lodestar/params
Version:
Chain parameters required for lodestar
323 lines (276 loc) • 10.8 kB
text/typescript
import {PresetName} from "./presetName.js";
import {presetStatus} from "./presetStatus.js";
import {gnosisPreset} from "./presets/gnosis.js";
import {mainnetPreset} from "./presets/mainnet.js";
import {minimalPreset} from "./presets/minimal.js";
import {userOverrides, userSelectedPreset} from "./setPreset.js";
export * from "./forkName.js";
export {presetToJson} from "./json.js";
export type {BeaconPreset} from "./types.js";
export {PresetName};
const presets = {
[PresetName.mainnet]: mainnetPreset,
[PresetName.minimal]: minimalPreset,
[PresetName.gnosis]: gnosisPreset,
};
// Once this file is imported, freeze the preset so calling setActivePreset() will throw an error
presetStatus.frozen = true;
/**
* The preset name currently exported by this library
*
* The `LODESTAR_PRESET` environment variable is used to select the active preset
* If `LODESTAR_PRESET` is not set, the default is `mainnet`.
*
* The active preset can be manually overridden with `setActivePreset`
*/
export const ACTIVE_PRESET =
userSelectedPreset ??
(typeof process !== "undefined" ? PresetName[process?.env?.LODESTAR_PRESET as PresetName] : undefined) ??
PresetName.mainnet;
export const activePreset = {...presets[ACTIVE_PRESET], ...userOverrides};
// These variables must be exported individually and explicitly
// in order to be accessible as top-level exports
export const {
MAX_COMMITTEES_PER_SLOT,
TARGET_COMMITTEE_SIZE,
MAX_VALIDATORS_PER_COMMITTEE,
SHUFFLE_ROUND_COUNT,
HYSTERESIS_QUOTIENT,
HYSTERESIS_DOWNWARD_MULTIPLIER,
HYSTERESIS_UPWARD_MULTIPLIER,
MIN_DEPOSIT_AMOUNT,
MAX_EFFECTIVE_BALANCE,
EFFECTIVE_BALANCE_INCREMENT,
MIN_ATTESTATION_INCLUSION_DELAY,
SLOTS_PER_EPOCH,
MIN_SEED_LOOKAHEAD,
MAX_SEED_LOOKAHEAD,
EPOCHS_PER_ETH1_VOTING_PERIOD,
SLOTS_PER_HISTORICAL_ROOT,
MIN_EPOCHS_TO_INACTIVITY_PENALTY,
EPOCHS_PER_HISTORICAL_VECTOR,
EPOCHS_PER_SLASHINGS_VECTOR,
HISTORICAL_ROOTS_LIMIT,
VALIDATOR_REGISTRY_LIMIT,
BASE_REWARD_FACTOR,
WHISTLEBLOWER_REWARD_QUOTIENT,
PROPOSER_REWARD_QUOTIENT,
INACTIVITY_PENALTY_QUOTIENT,
MIN_SLASHING_PENALTY_QUOTIENT,
PROPORTIONAL_SLASHING_MULTIPLIER,
MAX_PROPOSER_SLASHINGS,
MAX_ATTESTER_SLASHINGS,
MAX_ATTESTATIONS,
MAX_DEPOSITS,
MAX_VOLUNTARY_EXITS,
SYNC_COMMITTEE_SIZE,
EPOCHS_PER_SYNC_COMMITTEE_PERIOD,
INACTIVITY_PENALTY_QUOTIENT_ALTAIR,
MIN_SLASHING_PENALTY_QUOTIENT_ALTAIR,
PROPORTIONAL_SLASHING_MULTIPLIER_ALTAIR,
MIN_SYNC_COMMITTEE_PARTICIPANTS,
UPDATE_TIMEOUT,
INACTIVITY_PENALTY_QUOTIENT_BELLATRIX,
MIN_SLASHING_PENALTY_QUOTIENT_BELLATRIX,
PROPORTIONAL_SLASHING_MULTIPLIER_BELLATRIX,
MAX_BYTES_PER_TRANSACTION,
MAX_TRANSACTIONS_PER_PAYLOAD,
BYTES_PER_LOGS_BLOOM,
MAX_EXTRA_DATA_BYTES,
MAX_BLS_TO_EXECUTION_CHANGES,
MAX_WITHDRAWALS_PER_PAYLOAD,
MAX_VALIDATORS_PER_WITHDRAWALS_SWEEP,
FIELD_ELEMENTS_PER_BLOB,
MAX_BLOB_COMMITMENTS_PER_BLOCK,
KZG_COMMITMENT_INCLUSION_PROOF_DEPTH,
MAX_EFFECTIVE_BALANCE_ELECTRA,
MIN_ACTIVATION_BALANCE,
PENDING_DEPOSITS_LIMIT,
PENDING_PARTIAL_WITHDRAWALS_LIMIT,
PENDING_CONSOLIDATIONS_LIMIT,
MIN_SLASHING_PENALTY_QUOTIENT_ELECTRA,
MAX_CONSOLIDATION_REQUESTS_PER_PAYLOAD,
MAX_DEPOSIT_REQUESTS_PER_PAYLOAD,
MAX_WITHDRAWAL_REQUESTS_PER_PAYLOAD,
MAX_ATTESTER_SLASHINGS_ELECTRA,
MAX_ATTESTATIONS_ELECTRA,
MAX_PENDING_PARTIALS_PER_WITHDRAWALS_SWEEP,
MAX_PENDING_DEPOSITS_PER_EPOCH,
WHISTLEBLOWER_REWARD_QUOTIENT_ELECTRA,
NUMBER_OF_COLUMNS,
CELLS_PER_EXT_BLOB,
FIELD_ELEMENTS_PER_CELL,
FIELD_ELEMENTS_PER_EXT_BLOB,
KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH,
PTC_SIZE,
MAX_PAYLOAD_ATTESTATIONS,
BUILDER_REGISTRY_LIMIT,
BUILDER_PENDING_WITHDRAWALS_LIMIT,
MAX_BUILDERS_PER_WITHDRAWALS_SWEEP,
} = activePreset;
////////////
// Constants
////////////
// Exported directly on the index for faster accessing without commonjs compiled star import shenanigans
// Misc
export const GENESIS_SLOT = 0;
export const GENESIS_EPOCH = 0;
export const FAR_FUTURE_EPOCH = Infinity;
export const BASE_REWARDS_PER_EPOCH = 4;
export const DEPOSIT_CONTRACT_TREE_DEPTH = 2 ** 5; // 32
export const JUSTIFICATION_BITS_LENGTH = 4;
export const ZERO_HASH = Buffer.alloc(32, 0);
export const ZERO_HASH_HEX = "0x" + "00".repeat(32);
// Withdrawal prefixes
// Since the prefixes are just 1 byte, we define and use them as number
export const BLS_WITHDRAWAL_PREFIX = 0x00;
export const ETH1_ADDRESS_WITHDRAWAL_PREFIX = 0x01;
export const COMPOUNDING_WITHDRAWAL_PREFIX = 0x02;
export const BUILDER_WITHDRAWAL_PREFIX = 0x03;
// Domain types
export const DOMAIN_BEACON_PROPOSER = Uint8Array.from([0, 0, 0, 0]);
export const DOMAIN_BEACON_ATTESTER = Uint8Array.from([1, 0, 0, 0]);
export const DOMAIN_RANDAO = Uint8Array.from([2, 0, 0, 0]);
export const DOMAIN_DEPOSIT = Uint8Array.from([3, 0, 0, 0]);
export const DOMAIN_VOLUNTARY_EXIT = Uint8Array.from([4, 0, 0, 0]);
export const DOMAIN_SELECTION_PROOF = Uint8Array.from([5, 0, 0, 0]);
export const DOMAIN_AGGREGATE_AND_PROOF = Uint8Array.from([6, 0, 0, 0]);
export const DOMAIN_SYNC_COMMITTEE = Uint8Array.from([7, 0, 0, 0]);
export const DOMAIN_SYNC_COMMITTEE_SELECTION_PROOF = Uint8Array.from([8, 0, 0, 0]);
export const DOMAIN_CONTRIBUTION_AND_PROOF = Uint8Array.from([9, 0, 0, 0]);
export const DOMAIN_BLS_TO_EXECUTION_CHANGE = Uint8Array.from([10, 0, 0, 0]);
export const DOMAIN_BEACON_BUILDER = Uint8Array.from([11, 0, 0, 0]);
export const DOMAIN_PTC_ATTESTER = Uint8Array.from([12, 0, 0, 0]);
export const DOMAIN_PROPOSER_PREFERENCES = Uint8Array.from([13, 0, 0, 0]);
// Application specific domains
/**
* `DOMAIN_APPLICATION_MASK` reserves the rest of the bitspace in `DomainType` for application
* usage. This means for some `DomainType` `DOMAIN_SOME_APPLICATION`, `DOMAIN_SOME_APPLICATION
* & DOMAIN_APPLICATION_MASK` **MUST** be non-zero. This expression for any other `DomainType`
* in the consensus specs **MUST** be zero.
*/
export const DOMAIN_APPLICATION_MASK = Uint8Array.from([0, 0, 0, 1]);
export const DOMAIN_APPLICATION_BUILDER = Uint8Array.from([0, 0, 0, 1]);
// Participation flag indices
export const TIMELY_SOURCE_FLAG_INDEX = 0;
export const TIMELY_TARGET_FLAG_INDEX = 1;
export const TIMELY_HEAD_FLAG_INDEX = 2;
// Incentivization weights
export const TIMELY_SOURCE_WEIGHT = 14;
export const TIMELY_TARGET_WEIGHT = 26;
export const TIMELY_HEAD_WEIGHT = 14;
export const SYNC_REWARD_WEIGHT = 2;
export const PROPOSER_WEIGHT = 8;
export const WEIGHT_DENOMINATOR = 64;
// altair misc
export const PARTICIPATION_FLAG_WEIGHTS = [TIMELY_SOURCE_WEIGHT, TIMELY_TARGET_WEIGHT, TIMELY_HEAD_WEIGHT];
// phase0 validator
export const TARGET_AGGREGATORS_PER_COMMITTEE = 16;
// phase0 networking
export const NODE_ID_BITS = 256;
export const MAX_CONCURRENT_REQUESTS = 2;
/** Rationale: https://github.com/ethereum/consensus-specs/blob/v1.1.10/specs/phase0/p2p-interface.md#why-are-there-attestation_subnet_count-attestation-subnets */
export const ATTESTATION_SUBNET_COUNT = 64;
export const ATTESTATION_SUBNET_EXTRA_BITS = 0;
export const ATTESTATION_SUBNET_PREFIX_BITS =
Math.ceil(Math.log2(ATTESTATION_SUBNET_COUNT)) + ATTESTATION_SUBNET_EXTRA_BITS;
// altair validator
export const TARGET_AGGREGATORS_PER_SYNC_SUBCOMMITTEE = 16;
export const SYNC_COMMITTEE_SUBNET_COUNT = 4;
export const SYNC_COMMITTEE_SUBNET_SIZE = Math.floor(SYNC_COMMITTEE_SIZE / SYNC_COMMITTEE_SUBNET_COUNT);
// Lightclient pre-computed
/**
* ```ts
* config.types.altair.BeaconState.getPathGindex(["finalizedCheckpoint", "root"])
* ```
*/
export const FINALIZED_ROOT_GINDEX = 105;
/**
* ```ts
* Math.floor(Math.log2(FINALIZED_ROOT_GINDEX))
* ```
*/
export const FINALIZED_ROOT_DEPTH = 6;
export const FINALIZED_ROOT_INDEX = 41;
/**
* ```ts
* types.ssz.capella.BeaconBlockBody.getPathInfo(['executionPayload']).gindex
* ```
*/
export const BLOCK_BODY_EXECUTION_PAYLOAD_GINDEX = 25;
/**
* ```ts
* Math.floor(Math.log2(EXECUTION_PAYLOAD_GINDEX))
* ```
*/
export const BLOCK_BODY_EXECUTION_PAYLOAD_DEPTH = 4;
export const BLOCK_BODY_EXECUTION_PAYLOAD_INDEX = 9;
/**
* ```ts
* config.types.altair.BeaconState.getPathGindex(["currentSyncCommittee"])
* ```
*/
export const CURRENT_SYNC_COMMITTEE_GINDEX = 54;
/**
* ```ts
* Math.floor(Math.log2(CURRENT_SYNC_COMMITTEE_GINDEX))
* ```
*/
export const CURRENT_SYNC_COMMITTEE_DEPTH = 5;
export const CURRENT_SYNC_COMMITTEE_INDEX = 22;
/**
* ```ts
* config.types.altair.BeaconState.getPathGindex(["nextSyncCommittee"])
* ```
*/
export const NEXT_SYNC_COMMITTEE_GINDEX = 55;
/**
* ```ts
* Math.floor(Math.log2(NEXT_SYNC_COMMITTEE_GINDEX))
* ```
*/
export const NEXT_SYNC_COMMITTEE_DEPTH = 5;
export const NEXT_SYNC_COMMITTEE_INDEX = 23;
export const MAX_REQUEST_LIGHT_CLIENT_UPDATES = 128;
export const MAX_REQUEST_LIGHT_CLIENT_COMMITTEE_HASHES = 128;
/**
* Optimistic sync
* @deprecated All networks have completed the merge transition, blocks are always safe to import optimistically.
*/
export const SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY = 128;
/** @deprecated */
export const INTERVALS_PER_SLOT = 3;
export const BASIS_POINTS = 10000;
// EIP-4844: Crypto const
export const BYTES_PER_FIELD_ELEMENT = 32;
export const BLOB_TX_TYPE = 0x03;
export const VERSIONED_HASH_VERSION_KZG = 0x01;
// ssz.deneb.BeaconBlockBody.getPathInfo(['blobKzgCommitments',0]).gindex
export const KZG_COMMITMENT_GINDEX0 = 221184;
export const KZG_COMMITMENT_SUBTREE_INDEX0 = KZG_COMMITMENT_GINDEX0 - 2 ** KZG_COMMITMENT_INCLUSION_PROOF_DEPTH;
// ssz.deneb.BlobSidecars.elementType.fixedSize
export const BLOB_SIDECAR_FIXED_SIZE = 131928;
// Electra Misc
export const UNSET_DEPOSIT_REQUESTS_START_INDEX = 2n ** 64n - 1n;
export const FULL_EXIT_REQUEST_AMOUNT = 0;
export const FINALIZED_ROOT_GINDEX_ELECTRA = 169;
export const FINALIZED_ROOT_DEPTH_ELECTRA = 7;
export const FINALIZED_ROOT_INDEX_ELECTRA = 41;
export const CURRENT_SYNC_COMMITTEE_GINDEX_ELECTRA = 86;
export const CURRENT_SYNC_COMMITTEE_DEPTH_ELECTRA = 6;
export const CURRENT_SYNC_COMMITTEE_INDEX_ELECTRA = 22;
export const NEXT_SYNC_COMMITTEE_GINDEX_ELECTRA = 87;
export const NEXT_SYNC_COMMITTEE_DEPTH_ELECTRA = 6;
export const NEXT_SYNC_COMMITTEE_INDEX_ELECTRA = 23;
export const DEPOSIT_REQUEST_TYPE = 0x00;
export const WITHDRAWAL_REQUEST_TYPE = 0x01;
export const CONSOLIDATION_REQUEST_TYPE = 0x02;
export const BYTES_PER_CELL = FIELD_ELEMENTS_PER_CELL * BYTES_PER_FIELD_ELEMENT;
// ssz.fulu.BeaconBlockBody.getPathInfo(['blobKzgCommitments']).gindex
export const KZG_COMMITMENTS_GINDEX = 27;
export const KZG_COMMITMENTS_SUBTREE_INDEX = KZG_COMMITMENTS_GINDEX - 2 ** KZG_COMMITMENTS_INCLUSION_PROOF_DEPTH;
// Gloas Misc
export const BUILDER_INDEX_FLAG = 2 ** 40;
export const BUILDER_INDEX_SELF_BUILD = Infinity;
export const BUILDER_PAYMENT_THRESHOLD_NUMERATOR = 6;
export const BUILDER_PAYMENT_THRESHOLD_DENOMINATOR = 10;