alloy_provider/provider/
wallet.rs1use crate::{
2 fillers::{FillProvider, JoinFill, TxFiller, WalletFiller},
3 Provider,
4};
5use alloy_network::{Ethereum, Network, NetworkWallet};
6use alloy_primitives::Address;
7
8pub trait WalletProvider<N: Network = Ethereum> {
10 type Wallet: NetworkWallet<N>;
12
13 fn wallet(&self) -> &Self::Wallet;
15
16 fn wallet_mut(&mut self) -> &mut Self::Wallet;
18
19 fn default_signer_address(&self) -> Address {
21 self.wallet().default_signer_address()
22 }
23
24 fn has_signer_for(&self, address: &Address) -> bool {
26 self.wallet().has_signer_for(address)
27 }
28
29 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}