use crate::{eip4844, eip7691};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct BlobScheduleItem {
#[cfg_attr(feature = "serde", serde(rename = "target"))]
pub target_blob_count: u64,
#[cfg_attr(feature = "serde", serde(rename = "max"))]
pub max_blob_count: u64,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct BlobParams {
pub target_blob_count: u64,
pub max_blob_count: u64,
pub update_fraction: u128,
pub min_blob_fee: u128,
}
impl BlobParams {
pub const fn cancun() -> Self {
Self {
target_blob_count: eip4844::TARGET_BLOBS_PER_BLOCK,
max_blob_count: eip4844::MAX_BLOBS_PER_BLOCK as u64,
update_fraction: eip4844::BLOB_GASPRICE_UPDATE_FRACTION,
min_blob_fee: eip4844::BLOB_TX_MIN_BLOB_GASPRICE,
}
}
pub const fn prague() -> Self {
Self {
target_blob_count: eip7691::TARGET_BLOBS_PER_BLOCK_ELECTRA,
max_blob_count: eip7691::MAX_BLOBS_PER_BLOCK_ELECTRA,
update_fraction: eip7691::BLOB_GASPRICE_UPDATE_FRACTION_PECTRA,
min_blob_fee: eip4844::BLOB_TX_MIN_BLOB_GASPRICE,
}
}
#[inline]
pub const fn next_block_excess_blob_gas(
&self,
excess_blob_gas: u64,
blob_gas_used: u64,
) -> u64 {
(excess_blob_gas + blob_gas_used)
.saturating_sub(eip4844::DATA_GAS_PER_BLOB * self.target_blob_count)
}
#[inline]
pub const fn calc_blob_fee(&self, excess_blob_gas: u64) -> u128 {
eip4844::fake_exponential(self.min_blob_fee, excess_blob_gas as u128, self.update_fraction)
}
}