import {SLOTS_PER_HISTORICAL_ROOT} from "@lodestar/params"; import {ssz} from "@lodestar/types"; import {getCachedBeaconState} from "../cache/stateCache.js"; import {CachedBeaconStateFulu, CachedBeaconStateGloas} from "../types.js"; /** * Upgrade a state from Fulu to Gloas. */ export function upgradeStateToGloas(stateFulu: CachedBeaconStateFulu): CachedBeaconStateGloas { const {config} = stateFulu; ssz.fulu.BeaconState.commitViewDU(stateFulu); const stateGloasCloned = stateFulu; const stateGloasView = ssz.gloas.BeaconState.defaultViewDU(); stateGloasView.genesisTime = stateGloasCloned.genesisTime; stateGloasView.genesisValidatorsRoot = stateGloasCloned.genesisValidatorsRoot; stateGloasView.slot = stateGloasCloned.slot; stateGloasView.fork = ssz.phase0.Fork.toViewDU({ previousVersion: stateFulu.fork.currentVersion, currentVersion: config.GLOAS_FORK_VERSION, epoch: stateFulu.epochCtx.epoch, }); stateGloasView.latestBlockHeader = stateGloasCloned.latestBlockHeader; stateGloasView.blockRoots = stateGloasCloned.blockRoots; stateGloasView.stateRoots = stateGloasCloned.stateRoots; stateGloasView.historicalRoots = stateGloasCloned.historicalRoots; stateGloasView.eth1Data = stateGloasCloned.eth1Data; stateGloasView.eth1DataVotes = stateGloasCloned.eth1DataVotes; stateGloasView.eth1DepositIndex = stateGloasCloned.eth1DepositIndex; stateGloasView.validators = stateGloasCloned.validators; stateGloasView.balances = stateGloasCloned.balances; stateGloasView.randaoMixes = stateGloasCloned.randaoMixes; stateGloasView.slashings = stateGloasCloned.slashings; stateGloasView.previousEpochParticipation = stateGloasCloned.previousEpochParticipation; stateGloasView.currentEpochParticipation = stateGloasCloned.currentEpochParticipation; stateGloasView.justificationBits = stateGloasCloned.justificationBits; stateGloasView.previousJustifiedCheckpoint = stateGloasCloned.previousJustifiedCheckpoint; stateGloasView.currentJustifiedCheckpoint = stateGloasCloned.currentJustifiedCheckpoint; stateGloasView.finalizedCheckpoint = stateGloasCloned.finalizedCheckpoint; stateGloasView.inactivityScores = stateGloasCloned.inactivityScores; stateGloasView.currentSyncCommittee = stateGloasCloned.currentSyncCommittee; stateGloasView.nextSyncCommittee = stateGloasCloned.nextSyncCommittee; stateGloasView.latestExecutionPayloadBid.blockHash = stateFulu.latestExecutionPayloadHeader.blockHash; stateGloasView.nextWithdrawalIndex = stateGloasCloned.nextWithdrawalIndex; stateGloasView.nextWithdrawalValidatorIndex = stateGloasCloned.nextWithdrawalValidatorIndex; stateGloasView.historicalSummaries = stateGloasCloned.historicalSummaries; stateGloasView.depositRequestsStartIndex = stateGloasCloned.depositRequestsStartIndex; stateGloasView.depositBalanceToConsume = stateGloasCloned.depositBalanceToConsume; stateGloasView.exitBalanceToConsume = stateGloasCloned.exitBalanceToConsume; stateGloasView.earliestExitEpoch = stateGloasCloned.earliestExitEpoch; stateGloasView.consolidationBalanceToConsume = stateGloasCloned.consolidationBalanceToConsume; stateGloasView.earliestConsolidationEpoch = stateGloasCloned.earliestConsolidationEpoch; stateGloasView.pendingDeposits = stateGloasCloned.pendingDeposits; stateGloasView.pendingPartialWithdrawals = stateGloasCloned.pendingPartialWithdrawals; stateGloasView.pendingConsolidations = stateGloasCloned.pendingConsolidations; stateGloasView.proposerLookahead = stateGloasCloned.proposerLookahead; for (let i = 0; i < SLOTS_PER_HISTORICAL_ROOT; i++) { stateGloasView.executionPayloadAvailability.set(i, true); } stateGloasView.latestBlockHash = stateFulu.latestExecutionPayloadHeader.blockHash; const stateGloas = getCachedBeaconState(stateGloasView, stateFulu); stateGloas.commit(); // Clear cache to ensure the cache of fulu fields is not used by new gloas fields // biome-ignore lint/complexity/useLiteralKeys: It is a protected attribute stateGloas["clearCache"](); return stateGloas; }