Skip to content

Fulu ProcessPendingDeposits retains Electra eth1-bridge gate, causing EL deposit requests to stall #17315

Description

@1033309821

Describe the bug

According to the Fulu specification, the eth1-bridge gate should be removed for processing pending deposits. However, Prysm's current implementation for Fulu reuses Electra's processing logic where the gate is still actively enforced.

Currently, fulu.ProcessEpoch calls electra.ProcessEpoch, which in turn calls electra.ProcessPendingDeposits. Inside electra.ProcessPendingDeposits, the following Electra-specific gate exists without a Fulu version check:

if pendingDeposit.Slot > params.BeaconConfig().GenesisSlot &&
    st.Eth1DepositIndex() < startIndex {
    break
}

The Impact:
During the Fulu fork, if a node experiences eth1 lag (i.e., eth1_deposit_index < deposit_requests_start_index), or if the start index is unset (2^64-1), execution layer (EL) deposit requests (EIP-6110) will stall indefinitely. The pending deposits will not be processed, leading to a state divergence from the Fulu specification (where these deposits should apply regardless of the eth1 index).

Has this worked before in a previous version?

N/A. This is a Fulu-specific implementation bug (transitioning from Electra to Fulu). The gate is correct for the Electra fork, but invalid for Fulu.

🔬 Minimal Reproduction

I have created a comprehensive reproducible package including a Kurtosis dual-client setup (Lighthouse + Prysm) and a dedicated STF Go test to prove the divergence.

Full reproduction package: Gist Link: Prysm Fulu eth1 gate — Kurtosis + STF PoC

Core STF Reproduction Steps (from the Gist's fulu_eth1_gate_test.go):

Generate a deterministic Fulu BeaconState.

Set eth1_deposit_index to 10 and deposit_requests_start_index to 100 (creating an eth1 lag scenario).

Inject a valid PendingDeposit into state.pending_deposits.

Call electra.ProcessPendingDeposits(context.Background(), state, activeBal).

Expected (Fulu Spec): The deposit is processed, balance increases, and pending deposits array is cleared.

Actual (Prysm): The loop breaks early due to the Electra gate. The deposit remains in the pending queue (len(pending) == 1) and the balance is unchanged.

Error

There are no explicit application crashes or logs. This is a silent state-transition bug that will cause consensus failures/chain splits on Fulu networks when EL deposits are injected alongside an lagging eth1_deposit_index.

Platform(s)

No response

What version of Prysm are you running? (Which release)

No response

Anything else relevant (validator index / public key)?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions