UNPKG

@lodestar/params

Version:

Chain parameters required for lodestar

168 lines • 9.15 kB
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 { 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] : 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, } = 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 = 0; export const ETH1_ADDRESS_WITHDRAWAL_PREFIX = 1; export const COMPOUNDING_WITHDRAWAL_PREFIX = 2; // 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]); // 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; export const RANDOM_SUBNETS_PER_VALIDATOR = 1; export const EPOCHS_PER_RANDOM_SUBNET_SUBSCRIPTION = 256; /** 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 SUBNETS_PER_NODE = 2; export const NODE_ID_BITS = 256; export const ATTESTATION_SUBNET_PREFIX_BITS = Math.log2(ATTESTATION_SUBNET_COUNT); export const EPOCHS_PER_SUBNET_SUBSCRIPTION = 256; // 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); export const MAX_REQUEST_BLOCKS = 2 ** 10; // 1024 export const MAX_REQUEST_BLOCKS_DENEB = 2 ** 7; // 128 // 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(["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 */ export const SAFE_SLOTS_TO_IMPORT_OPTIMISTICALLY = 128; export const INTERVALS_PER_SLOT = 3; // 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 = ACTIVE_PRESET === PresetName.minimal ? 1728 : 221184; export const KZG_COMMITMENT_SUBTREE_INDEX0 = KZG_COMMITMENT_GINDEX0 - 2 ** KZG_COMMITMENT_INCLUSION_PROOF_DEPTH; // ssz.deneb.BlobSidecars.elementType.fixedSize export const BLOBSIDECAR_FIXED_SIZE = ACTIVE_PRESET === PresetName.minimal ? 131704 : 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 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; //# sourceMappingURL=index.js.map