Pre-auditThree days of senior audit time for $1,500, credited in full toward your Zealynx audit.3 audit days, credited toward your auditSee how →
I-04·

Consensus withdrawal event reports the requested amount as withdrawn

Fixedethereumstakingeth-bonds
TL;DR

ValidatorWithdrawFromConsensus documents its indexed amount as "the amount withdrawn in wei." validatorWithdrawFromConsensus instead emits the caller's requested amount before sending an EIP-7002 request.

Severity
INFO
Method
MManual review
CAT.
02Section · Description

Description

ValidatorWithdrawFromConsensus documents its indexed amount as "the amount withdrawn in wei." validatorWithdrawFromConsensus instead emits the caller's requested amount before sending an EIP-7002 request.

A successful execution-layer call only enqueues the request. Consensus processing happens later and may ignore it or clamp it to the amount available above the validator's activation balance. In a reproduced boundary case, the Coffer emitted 50 ETH as withdrawn for a 40 ETH validator while Electra queued an 8 ETH partial withdrawal and the consensus balance had not yet moved.

No contract accounting depends on this event, and the current backend reads consensus balances directly. The event remains misleading to indexers, monitoring, and future integrations that treat it as completed collateral movement.

03Section · Recommendations

Recommendations

Rename the event to describe a request, preserve the unit supplied to EIP-7002, and emit it after the predeploy call succeeds:

solidity
event ValidatorWithdrawalRequested(uint64 indexed requestedAmountGwei);

Document that consensus may later ignore or clamp the request. Integrations consuming an already deployed ABI should treat the existing value only as requestedAmountWei and derive actual movement from beacon state and the Coffer's execution-layer balance.

04Section · Proof of Concept

Proof of Concept

The production event and real EIP-7002 request were composed at mainnet block 22,500,000. A factory-created Coffer requested 50 ETH from a validator modeled with a 40 ETH consensus balance and 0x02 credentials.

The Coffer emitted:

code
PRODUCT_EVENT_WEI 50000000000000000000

The real predeploy returned this exact EIP-7685 request:

code
0x0e9a081709b93aebddd0ff7d7afefc3635b6fe2e11111111111111111111111111111111111111111111111111111111111111112222222222222222222222222222222200743ba40b000000

Processing those bytes with the pinned official Electra process_withdrawal_request produced:

code
product_event_requested_wei=50000000000000000000
electra_pending_wei=8000000000000000000
balance_at_request_processing_wei=40000000000000000000
ELECTRA_MISMATCH_CONFIRMED

The event therefore reports the requested 50 ETH as withdrawn even though consensus queues only the available 8 ETH excess and the validator balance has not yet changed.

05Section · Mitigation

Mitigation

Fixed. Commit 389600b documents the existing event as a withdrawal request rather than completed movement. Its NatSpec now states that the amount is requested wei, that zero requests a full exit, and that consensus may pay less or drop the request. Integrations are directed to beacon state and the Coffer balance for actual movement. The ABI rename is reserved for a later deployment.

06Section · Report provenance

Report provenance

Source: the corrected final report dated 22 October 2026. Final status and residual conditions are preserved in this write-up. Read the full report.

Status
Fixed
I-04