Sitelet https://github.com/SharkHand3/examples/commit/403e88452410f001ebd891bba2d85891591c4946
Skip to content

Commit 403e884

Browse files
authored
feat: use signers in provider and demonstrate EthereumWallet (alloy-rs#204)
* chore: use signers instead of `EthereumWallet` * nits * feat: EthereumWallet example * nit * clippy
1 parent 5637573 commit 403e884

14 files changed

Lines changed: 96 additions & 33 deletions

File tree

‎README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ This repository contains the following examples:
109109
- [x] [Ledger signer](./examples/wallets/examples/ledger_signer.rs)
110110
- [x] [Private key signer](./examples/wallets/examples/private_key_signer.rs)
111111
- [x] [Mnemonic signer](./examples/wallets/examples/mnemonic_signer.rs)
112+
- [x] [Ethereum Wallet](./examples/wallets/examples/ethereum_wallet.rs)
112113
- [x] [Sign message](./examples/wallets/examples/sign_message.rs)
113114
- [x] [Verify message](./examples/wallets/examples/verify_message.rs)
114115
- [x] [Sign permit hash](./examples/wallets/examples/sign_permit_hash.rs)

‎examples/advanced/examples/any_network.rs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
//! of Arbitrum's transaction receipts.
66
77
use alloy::{
8-
network::{AnyNetwork, EthereumWallet},
8+
network::AnyNetwork,
99
primitives::{address, Address, U128, U256, U64},
1010
providers::ProviderBuilder,
1111
signers::local::PrivateKeySigner,
@@ -45,11 +45,10 @@ async fn main() -> Result<()> {
4545
// [RISK WARNING! Writing a private key in the code file is insecure behavior.]
4646
// The following code is for testing only. Set up signer from private key, be aware of danger.
4747
let signer: PrivateKeySigner = "<PRIVATE_KEY>".parse().expect("should parse private key");
48-
let wallet = EthereumWallet::from(signer);
4948

5049
// Create a provider with the Arbitrum Sepolia network and the wallet.
5150
let rpc_url = "https://sepolia-rollup.arbitrum.io/rpc".parse()?;
52-
let provider = ProviderBuilder::new().network::<AnyNetwork>().wallet(wallet).on_http(rpc_url);
51+
let provider = ProviderBuilder::new().network::<AnyNetwork>().wallet(signer).on_http(rpc_url);
5352

5453
// Create a contract instance.
5554
let contract = Counter::new(COUNTER_CONTRACT_ADDRESS, &provider);

‎examples/fillers/examples/wallet_filler.rs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Example of using the `WalletFiller` in the provider.
22
33
use alloy::{
4-
network::{EthereumWallet, TransactionBuilder},
4+
network::TransactionBuilder,
55
node_bindings::Anvil,
66
primitives::{address, b256, U256},
77
providers::{Provider, ProviderBuilder},
@@ -18,13 +18,12 @@ async fn main() -> Result<()> {
1818

1919
// Set up signer from the first default Anvil account (Alice).
2020
let signer: PrivateKeySigner = anvil.keys()[0].clone().into();
21-
let wallet = EthereumWallet::from(signer);
2221

2322
// Create a provider with the wallet.
2423
let rpc_url = anvil.endpoint_url();
2524
let provider = ProviderBuilder::new()
2625
// Add the `WalletFiller` to the provider
27-
.wallet(wallet)
26+
.wallet(signer)
2827
.on_http(rpc_url);
2928

3029
// Build an EIP-1559 type transaction to send 100 wei to Vitalik.

‎examples/providers/examples/builder.rs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Example of using the `ProviderBuilder` to create a provider with a signer and network.
22
33
use alloy::{
4-
network::{EthereumWallet, TransactionBuilder},
4+
network::TransactionBuilder,
55
node_bindings::Anvil,
66
primitives::U256,
77
providers::{Provider, ProviderBuilder},
@@ -18,15 +18,14 @@ async fn main() -> Result<()> {
1818

1919
// Set up signer from the first default Anvil account (Alice).
2020
let signer: PrivateKeySigner = anvil.keys()[0].clone().into();
21-
let wallet = EthereumWallet::from(signer.clone());
2221

2322
// Create two users, Alice and Bob.
2423
let alice = signer.address();
2524
let bob = anvil.addresses()[1];
2625

2726
// Set up the HTTP provider with the `reqwest` crate.
2827
let rpc_url = anvil.endpoint_url();
29-
let provider = ProviderBuilder::new().wallet(wallet).on_http(rpc_url);
28+
let provider = ProviderBuilder::new().wallet(signer).on_http(rpc_url);
3029

3130
// Create a transaction.
3231
let tx = TransactionRequest::default().with_to(bob).with_value(U256::from(100));

‎examples/subscriptions/examples/event_multiplexer.rs‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
use std::str::FromStr;
44

55
use alloy::{
6-
network::EthereumWallet,
76
node_bindings::Anvil,
87
primitives::I256,
98
providers::{ProviderBuilder, WsConnect},
@@ -50,11 +49,10 @@ async fn main() -> Result<()> {
5049
let anvil = Anvil::new().block_time(1).try_spawn()?;
5150

5251
let pk: PrivateKeySigner = anvil.keys()[0].clone().into();
53-
let wallet = EthereumWallet::from(pk);
5452

5553
// Create a provider.
5654
let ws = WsConnect::new(anvil.ws_endpoint());
57-
let provider = ProviderBuilder::new().wallet(wallet).on_ws(ws).await?;
55+
let provider = ProviderBuilder::new().wallet(pk).on_ws(ws).await?;
5856

5957
// Deploy the `EventExample` contract.
6058
let contract = EventMultiplexer::deploy(provider).await?;

‎examples/subscriptions/examples/poll_logs.rs‎

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
//! Example of watching and polling for contract events by `WebSocket` subscription.
22
33
use alloy::{
4-
network::EthereumWallet,
54
node_bindings::Anvil,
65
providers::{ProviderBuilder, WsConnect},
76
signers::local::PrivateKeySigner,
@@ -39,11 +38,10 @@ async fn main() -> Result<()> {
3938
// Ensure `anvil` is available in $PATH.
4039
let anvil = Anvil::new().block_time(1).try_spawn()?;
4140
let pk: PrivateKeySigner = anvil.keys()[0].clone().into();
42-
let wallet = EthereumWallet::new(pk);
4341

4442
// Create a WebSocket provider.
4543
let ws = WsConnect::new(anvil.ws_endpoint());
46-
let provider = ProviderBuilder::new().wallet(wallet).on_ws(ws).await?;
44+
let provider = ProviderBuilder::new().wallet(pk).on_ws(ws).await?;
4745

4846
// Deploy the `Counter` contract.
4947
let contract = Counter::deploy(provider.clone()).await?;

‎examples/transactions/examples/send_eip7702_transaction.rs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
33
use alloy::{
44
eips::eip7702::Authorization,
5-
network::{EthereumWallet, TransactionBuilder, TransactionBuilder7702},
5+
network::{TransactionBuilder, TransactionBuilder7702},
66
node_bindings::Anvil,
77
primitives::U256,
88
providers::{Provider, ProviderBuilder},
@@ -45,8 +45,7 @@ async fn main() -> Result<()> {
4545

4646
// Create a provider with the wallet for only Bob (not Alice).
4747
let rpc_url = anvil.endpoint_url();
48-
let wallet = EthereumWallet::from(bob.clone());
49-
let provider = ProviderBuilder::new().wallet(wallet).on_http(rpc_url);
48+
let provider = ProviderBuilder::new().wallet(bob.clone()).on_http(rpc_url);
5049

5150
// Deploy the contract Alice will authorize.
5251
let contract = Log::deploy(&provider).await?;
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
//! Demonstrates how `EthereumWallet` can use multiple different types of signers.
2+
3+
use alloy::{
4+
network::{EthereumWallet, TransactionBuilder, TxSigner},
5+
node_bindings::Anvil,
6+
primitives::{address, U256},
7+
providers::{Provider, ProviderBuilder},
8+
rpc::types::TransactionRequest,
9+
signers::{
10+
aws::AwsSigner,
11+
ledger::{HDPath, LedgerSigner},
12+
local::PrivateKeySigner,
13+
},
14+
};
15+
use aws_config::BehaviorVersion;
16+
17+
#[tokio::main]
18+
async fn main() -> eyre::Result<()> {
19+
// Spin up a local Anvil node.
20+
// Ensure `anvil` is available in $PATH.
21+
let anvil = Anvil::new().try_spawn()?;
22+
23+
// Initialize your signers.
24+
25+
// Set up a local signer.
26+
let pk_signer: PrivateKeySigner =
27+
"0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80".parse()?;
28+
let pk_addr = pk_signer.address();
29+
30+
// Set up a hardware wallet signer
31+
let ledger = LedgerSigner::new(HDPath::LedgerLive(0), Some(1)).await?;
32+
let ledger_addr = ledger.address();
33+
34+
// AWS KMS signer
35+
let key_id = std::env::var("AWS_KEY_ID").expect("AWS_KEY_ID not set in .env file");
36+
let config = aws_config::load_defaults(BehaviorVersion::latest()).await;
37+
let client = aws_sdk_kms::Client::new(&config);
38+
let aws = AwsSigner::new(client, key_id, Some(1)).await?;
39+
let _aws_addr = aws.address();
40+
41+
// Initialize `EthereumWallet`.
42+
// `pk_signer` is set as the default signer.
43+
// This signer is used to sign `TransactionRequest` and `TypedTransaction` objects that do
44+
// not specify a signer address in the `from` field.
45+
let mut wallet = EthereumWallet::new(pk_signer);
46+
// Add aws and ledger signers to the wallet
47+
wallet.register_signer(aws);
48+
wallet.register_signer(ledger);
49+
50+
// Create a provider with the `WalletFiller`.
51+
let provider = ProviderBuilder::new().wallet(wallet).on_http(anvil.endpoint_url());
52+
53+
// Note that the `from` field hasn't been specified.
54+
// The wallet filler in the provider will set to it the default signer's address, which is
55+
// `pk_signer`.
56+
let tx = TransactionRequest::default()
57+
.with_to(address!("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"))
58+
.with_value(U256::from(100));
59+
60+
let receipt = provider.send_transaction(tx).await?.get_receipt().await?;
61+
assert_eq!(pk_addr, receipt.from);
62+
63+
// One can hint the wallet filler about which signer to use by specifying the `from` field.
64+
// In this case, the `ledger` signer will be used to sign the transaction.
65+
let tx = TransactionRequest::default()
66+
.with_from(ledger_addr)
67+
.with_to(address!("0xd8dA6BF26964aF9D7eEd9e03E53415D37aA96045"))
68+
.with_value(U256::from(100));
69+
70+
let receipt = provider.send_transaction(tx).await?.get_receipt().await?;
71+
assert_eq!(ledger_addr, receipt.from);
72+
73+
Ok(())
74+
}

‎examples/wallets/examples/keystore_signer.rs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use std::path::PathBuf;
44

55
use alloy::{
6-
network::{EthereumWallet, TransactionBuilder},
6+
network::TransactionBuilder,
77
primitives::{address, U256},
88
providers::{Provider, ProviderBuilder},
99
rpc::types::TransactionRequest,
@@ -21,11 +21,10 @@ async fn main() -> Result<()> {
2121
let keystore_file_path =
2222
PathBuf::from(std::env::var("CARGO_MANIFEST_DIR")?).join("examples/keystore/alice.json");
2323
let signer = LocalSigner::decrypt_keystore(keystore_file_path, password)?;
24-
let wallet = EthereumWallet::from(signer);
2524

2625
// Create a provider with the wallet.
2726
let provider =
28-
ProviderBuilder::new().wallet(wallet).on_anvil_with_config(|anvil| anvil.block_time(1));
27+
ProviderBuilder::new().wallet(signer).on_anvil_with_config(|anvil| anvil.block_time(1));
2928

3029
// Build a transaction to send 100 wei from Alice to Vitalik.
3130
// The `from` field is automatically filled to the first signer's address (Alice).

‎examples/wallets/examples/ledger_signer.rs‎

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
//! Example of signing and sending a transaction using a Ledger device.
22
33
use alloy::{
4-
network::{EthereumWallet, TransactionBuilder},
4+
network::TransactionBuilder,
55
primitives::{address, U256},
66
providers::{Provider, ProviderBuilder},
77
rpc::types::TransactionRequest,
@@ -13,11 +13,10 @@ use eyre::Result;
1313
async fn main() -> Result<()> {
1414
// Instantiate the application by acquiring a lock on the Ledger device.
1515
let signer = LedgerSigner::new(HDPath::LedgerLive(0), Some(1)).await?;
16-
let wallet = EthereumWallet::from(signer);
1716

1817
// Create a provider with the wallet.
1918
let rpc_url = "https://eth.merkle.io".parse()?;
20-
let provider = ProviderBuilder::new().wallet(wallet).on_http(rpc_url);
19+
let provider = ProviderBuilder::new().wallet(signer).on_http(rpc_url);
2120

2221
// Build a transaction to send 100 wei from Alice to Vitalik.
2322
// The `from` field is automatically filled to the first signer's address (Alice).

0 commit comments

Comments
 (0)