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#[derive(Debug, Parser)]
18pub struct AccessListArgs {
19 #[arg(
21 value_name = "TO",
22 value_parser = NameOrAddress::from_str
23 )]
24 to: Option<NameOrAddress>,
25
26 #[arg(value_name = "SIG")]
28 sig: Option<String>,
29
30 #[arg(value_name = "ARGS", allow_negative_numbers = true)]
32 args: Vec<String>,
33
34 #[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}