cast/cmd/
access_list.rs

1use crate::{
2    Cast,
3    tx::{CastTxBuilder, SenderKind},
4};
5use alloy_ens::NameOrAddress;
6use alloy_rpc_types::BlockId;
7use clap::Parser;
8use eyre::Result;
9use foundry_cli::{
10    opts::{RpcOpts, TransactionOpts},
11    utils::{self, LoadConfig},
12};
13use foundry_wallets::WalletOpts;
14use std::str::FromStr;
15
16/// CLI arguments for `cast access-list`.
17#[derive(Debug, Parser)]
18pub struct AccessListArgs {
19    /// The destination of the transaction.
20    #[arg(
21        value_name = "TO",
22        value_parser = NameOrAddress::from_str
23    )]
24    to: Option<NameOrAddress>,
25
26    /// The signature of the function to call.
27    #[arg(value_name = "SIG")]
28    sig: Option<String>,
29
30    /// The arguments of the function to call.
31    #[arg(value_name = "ARGS", allow_negative_numbers = true)]
32    args: Vec<String>,
33
34    /// The block height to query at.
35    ///
36    /// Can also be the tags earliest, finalized, safe, latest, or pending.
37    #[arg(long, short = 'B')]
38    block: Option<BlockId>,
39
40    #[command(flatten)]
41    tx: TransactionOpts,
42
43    #[command(flatten)]
44    rpc: RpcOpts,
45
46    #[command(flatten)]
47    wallet: WalletOpts,
48}
49
50impl AccessListArgs {
51    pub async fn run(self) -> Result<()> {
52        let Self { to, sig, args, tx, rpc, wallet, block } = self;
53
54        let config = rpc.load_config()?;
55        let provider = utils::get_provider(&config)?;
56        let sender = SenderKind::from_wallet_opts(wallet).await?;
57
58        let (tx, _) = CastTxBuilder::new(&provider, tx, &config)
59            .await?
60            .with_to(to)
61            .await?
62            .with_code_sig_and_args(None, sig, args)
63            .await?
64            .build_raw(sender)
65            .await?;
66
67        let cast = Cast::new(&provider);
68
69        let access_list: String = cast.access_list(&tx, block).await?;
70
71        sh_println!("{access_list}")?;
72
73        Ok(())
74    }
75}