revm_context_interface/transaction/
eip4844.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
use super::eip1559::Eip1559CommonTxFields;
use auto_impl::auto_impl;
use primitives::{Address, B256, U256};
use specification::eip4844::GAS_PER_BLOB;

#[auto_impl(&, Box, Arc, Rc)]
pub trait Eip4844Tx: Eip1559CommonTxFields {
    /// Call destination
    fn destination(&self) -> Address;

    /// Returns vector of fixed size hash(32 bytes)
    fn blob_versioned_hashes(&self) -> &[B256];

    /// Max fee per data gas
    fn max_fee_per_blob_gas(&self) -> u128;

    /// Total gas for all blobs. Max number of blocks is already checked
    /// so we dont need to check for overflow.
    fn total_blob_gas(&self) -> u64 {
        GAS_PER_BLOB * self.blob_versioned_hashes().len() as u64
    }

    /// Calculates the maximum [EIP-4844] `data_fee` of the transaction.
    ///
    /// This is used for ensuring that the user has at least enough funds to pay the
    /// `max_fee_per_blob_gas * total_blob_gas`, on top of regular gas costs.
    ///
    /// See EIP-4844:
    /// <https://github.com/ethereum/EIPs/blob/master/EIPS/eip-4844.md#execution-layer-validation>
    fn calc_max_data_fee(&self) -> U256 {
        let blob_gas = U256::from(self.total_blob_gas());
        let max_blob_fee = U256::from(self.max_fee_per_blob_gas());
        max_blob_fee.saturating_mul(blob_gas)
    }
}