alloy_provider/provider/
wallet.rs

1use crate::{
2    fillers::{FillProvider, JoinFill, TxFiller, WalletFiller},
3    Provider,
4};
5use alloy_network::{Ethereum, Network, NetworkWallet};
6use alloy_primitives::Address;
7
8/// Trait for Providers, Fill stacks, etc, which contain [`NetworkWallet`].
9pub trait WalletProvider<N: Network = Ethereum> {
10    /// The underlying [`NetworkWallet`] type contained in this stack.
11    type Wallet: NetworkWallet<N>;
12
13    /// Get a reference to the underlying wallet.
14    fn wallet(&self) -> &Self::Wallet;
15
16    /// Get a mutable reference to the underlying wallet.
17    fn wallet_mut(&mut self) -> &mut Self::Wallet;
18
19    /// Get the default signer address.
20    fn default_signer_address(&self) -> Address {
21        self.wallet().default_signer_address()
22    }
23
24    /// Check if the signer can sign for the given address.
25    fn has_signer_for(&self, address: &Address) -> bool {
26        self.wallet().has_signer_for(address)
27    }
28
29    /// Get an iterator of all signer addresses. Note that because the signer
30    /// always has at least one address, this iterator will always have at least
31    /// one element.
32    fn signer_addresses(&self) -> impl Iterator<Item = Address> {
33        self.wallet().signer_addresses()
34    }
35}
36
37impl<W, N> WalletProvider<N> for WalletFiller<W>
38where
39    W: NetworkWallet<N> + Clone,
40    N: Network,
41{
42    type Wallet = W;
43
44    #[inline(always)]
45    fn wallet(&self) -> &Self::Wallet {
46        self.as_ref()
47    }
48
49    #[inline(always)]
50    fn wallet_mut(&mut self) -> &mut Self::Wallet {
51        self.as_mut()
52    }
53}
54
55impl<L, R, N> WalletProvider<N> for JoinFill<L, R>
56where
57    R: WalletProvider<N>,
58    N: Network,
59{
60    type Wallet = R::Wallet;
61
62    #[inline(always)]
63    fn wallet(&self) -> &Self::Wallet {
64        self.right().wallet()
65    }
66
67    #[inline(always)]
68    fn wallet_mut(&mut self) -> &mut Self::Wallet {
69        self.right_mut().wallet_mut()
70    }
71}
72
73impl<F, P, N> WalletProvider<N> for FillProvider<F, P, N>
74where
75    F: TxFiller<N> + WalletProvider<N>,
76    P: Provider<N>,
77    N: Network,
78{
79    type Wallet = F::Wallet;
80
81    #[inline(always)]
82    fn wallet(&self) -> &Self::Wallet {
83        self.filler.wallet()
84    }
85
86    #[inline(always)]
87    fn wallet_mut(&mut self) -> &mut Self::Wallet {
88        self.filler.wallet_mut()
89    }
90}
91
92#[cfg(test)]
93mod test {
94    use super::*;
95    use crate::ProviderBuilder;
96    use itertools::Itertools;
97
98    #[test]
99    fn basic_usage() {
100        let provider = ProviderBuilder::new().disable_recommended_fillers().on_anvil_with_wallet();
101
102        assert!(provider.signer_addresses().contains(&provider.default_signer_address()));
103    }
104
105    #[test]
106    fn bubbles_through_fillers() {
107        let provider = ProviderBuilder::new().on_anvil_with_wallet();
108
109        assert!(provider.signer_addresses().contains(&provider.default_signer_address()));
110    }
111}