tempo_faucet/
args.rs

1use alloy::{
2    network::EthereumWallet,
3    primitives::{Address, B256, U256},
4    providers::{DynProvider, Provider, ProviderBuilder},
5    signers::local::PrivateKeySigner,
6};
7use clap::Args;
8use tempo_alloy::{TempoNetwork, provider::ext::TempoProviderBuilderExt};
9
10/// Faucet-specific CLI arguments
11#[derive(Debug, Clone, Default, Args, PartialEq, Eq)]
12#[command(next_help_heading = "Faucet")]
13pub struct FaucetArgs {
14    /// Whether the faucet is enabled
15    #[arg(long = "faucet.enabled", default_value_t = false)]
16    pub enabled: bool,
17
18    /// Faucet funding private key
19    #[arg(
20        long = "faucet.private-key",
21        requires = "enabled",
22        required_if_eq("enabled", "true")
23    )]
24    pub private_key: Option<B256>,
25
26    /// Amount for each faucet funding transaction
27    #[arg(
28        long = "faucet.amount",
29        requires = "enabled",
30        required_if_eq("enabled", "true")
31    )]
32    pub amount: Option<U256>,
33
34    /// Target token address for the faucet to be funding with
35    #[arg(
36        long = "faucet.address",
37        requires = "enabled",
38        required_if_eq("enabled", "true"),
39        num_args(0..)
40    )]
41    pub token_addresses: Option<Vec<Address>>,
42
43    #[arg(
44        long = "faucet.node-address",
45        default_value = "http://localhost:8545",
46        requires = "enabled"
47    )]
48    pub node_address: String,
49}
50
51impl FaucetArgs {
52    pub fn wallet(&self) -> EthereumWallet {
53        let signer: PrivateKeySigner = PrivateKeySigner::from_bytes(
54            &self.private_key.expect("No faucet private key provided"),
55        )
56        .expect("Failed to decode private key");
57        EthereumWallet::new(signer)
58    }
59
60    pub fn addresses(&self) -> Vec<Address> {
61        self.token_addresses
62            .clone()
63            .expect("No TIP20 token addresses provided")
64    }
65
66    pub fn amount(&self) -> U256 {
67        self.amount.expect("No TIP20 token amount provided")
68    }
69
70    pub fn provider(&self) -> DynProvider<TempoNetwork> {
71        ProviderBuilder::new_with_network::<TempoNetwork>()
72            .with_random_2d_nonces()
73            .wallet(self.wallet())
74            .connect_http(
75                self.node_address
76                    .parse()
77                    .expect("Failed to parse node address"),
78            )
79            .erased()
80    }
81}