Consensus withdrawal event reports the requested amount as withdrawn
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.
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.
Recommendations
Rename the event to describe a request, preserve the unit supplied to EIP-7002, and emit it after the predeploy call succeeds:
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.
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:
PRODUCT_EVENT_WEI 50000000000000000000
The real predeploy returned this exact EIP-7685 request:
0x0e9a081709b93aebddd0ff7d7afefc3635b6fe2e11111111111111111111111111111111111111111111111111111111111111112222222222222222222222222222222200743ba40b000000
Processing those bytes with the pinned official Electra process_withdrawal_request produced:
product_event_requested_wei=50000000000000000000electra_pending_wei=8000000000000000000balance_at_request_processing_wei=40000000000000000000ELECTRA_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.
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.
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.