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#[derive(Debug, Clone, Default, Args, PartialEq, Eq)]
12#[command(next_help_heading = "Faucet")]
13pub struct FaucetArgs {
14 #[arg(long = "faucet.enabled", default_value_t = false)]
16 pub enabled: bool,
17
18 #[arg(
20 long = "faucet.private-key",
21 requires = "enabled",
22 required_if_eq("enabled", "true")
23 )]
24 pub private_key: Option<B256>,
25
26 #[arg(
28 long = "faucet.amount",
29 requires = "enabled",
30 required_if_eq("enabled", "true")
31 )]
32 pub amount: Option<U256>,
33
34 #[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}