reth_optimism_consensus/validation/shanghai.rs
1//! L2 Shanghai consensus rule checks.
2
3use crate::OpConsensusError;
4use reth_consensus::ConsensusError;
5use reth_primitives_traits::BlockBody;
6
7/// Verifies that withdrawals in block body (Shanghai) is always empty in Canyon.
8/// <https://specs.optimism.io/protocol/rollup-node-p2p.html#block-validation>
9#[inline]
10pub fn ensure_empty_shanghai_withdrawals<T: BlockBody>(body: &T) -> Result<(), OpConsensusError> {
11 // Shanghai rule
12 let withdrawals = body.withdrawals().ok_or(ConsensusError::BodyWithdrawalsMissing)?;
13
14 // Canyon rule
15 if !withdrawals.as_ref().is_empty() {
16 return Err(OpConsensusError::WithdrawalsNonEmpty)
17 }
18
19 Ok(())
20}