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}