cast/cmd/
da_estimate.rs

1//! Estimates the data availability size of a block for opstack.
2
3use alloy_consensus::BlockHeader;
4use alloy_network::eip2718::Encodable2718;
5use alloy_provider::Provider;
6use alloy_rpc_types::BlockId;
7use clap::Parser;
8use foundry_cli::{
9    opts::RpcOpts,
10    utils::{self, LoadConfig},
11};
12use op_alloy_consensus::OpTxEnvelope;
13
14/// CLI arguments for `cast da-estimate`.
15#[derive(Debug, Parser)]
16pub struct DAEstimateArgs {
17    /// The block to estimate the data availability size for.
18    pub block: BlockId,
19    #[command(flatten)]
20    pub rpc: RpcOpts,
21}
22
23impl DAEstimateArgs {
24    /// Load the RPC URL from the config file.
25    pub async fn run(self) -> eyre::Result<()> {
26        let Self { block, rpc } = self;
27        let config = rpc.load_config()?;
28        let provider = utils::get_provider(&config)?;
29        let block = provider
30            .get_block(block)
31            .full()
32            .await?
33            .ok_or_else(|| eyre::eyre!("Block not found"))?;
34
35        let block_number = block.header.number();
36        let tx_count = block.transactions.len();
37        let mut da_estimate = 0;
38        for tx in block.into_transactions_iter() {
39            // try to convert into opstack transaction
40            let tx = OpTxEnvelope::try_from(tx)?;
41            da_estimate += op_alloy_flz::tx_estimated_size_fjord(&tx.encoded_2718());
42        }
43
44        sh_println!("Estimated data availability size for block {block_number} with {tx_count} transactions: {da_estimate}")?;
45
46        Ok(())
47    }
48}