forked from onbjerg/ethers-flashbots
-
Notifications
You must be signed in to change notification settings - Fork 0
/
broadcast.rs
86 lines (77 loc) · 2.81 KB
/
broadcast.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
use ethers::core::{rand::thread_rng, types::transaction::eip2718::TypedTransaction};
use ethers::prelude::*;
use ethers_flashbots::*;
use eyre::Result;
use std::convert::TryFrom;
use url::Url;
// See https://www.mev.to/builders for up to date builder URLs
static BUILDER_URLS: &[&str] = &[
"https://builder0x69.io",
"https://rpc.beaverbuild.org",
"https://relay.flashbots.net",
"https://rsync-builder.xyz",
"https://rpc.titanbuilder.xyz",
"https://api.blocknative.com/v1/auction",
"https://mev.api.blxrbdn.com",
"https://eth-builder.com",
"https://builder.gmbit.co/rpc",
"https://buildai.net",
"https://rpc.payload.de",
"https://rpc.lightspeedbuilder.info",
"https://rpc.nfactorial.xyz",
];
#[tokio::main]
async fn main() -> Result<()> {
// Connect to the network
let provider = Provider::<Http>::try_from("https://mainnet.eth.aragon.network")?;
// This is your searcher identity
let bundle_signer = LocalWallet::new(&mut thread_rng());
// This signs transactions
let wallet = LocalWallet::new(&mut thread_rng());
// Add signer and Flashbots middleware
let client = SignerMiddleware::new(
BroadcasterMiddleware::new(
provider,
BUILDER_URLS
.iter()
.map(|url| Url::parse(url).unwrap())
.collect(),
Url::parse("https://relay.flashbots.net")?,
bundle_signer,
),
wallet,
);
// get last block number
let block_number = client.get_block_number().await?;
// Build a custom bundle that pays 0x0000000000000000000000000000000000000000
let tx = {
let mut inner: TypedTransaction = TransactionRequest::pay(Address::zero(), 100).into();
client.fill_transaction(&mut inner, None).await?;
inner
};
let signature = client.signer().sign_transaction(&tx).await?;
let bundle = BundleRequest::new()
.push_transaction(tx.rlp_signed(&signature))
.set_block(block_number + 1)
.set_simulation_block(block_number)
.set_simulation_timestamp(0);
// Send it
let results = client.inner().send_bundle(&bundle).await?;
// You can also optionally wait to see if the bundle was included
for result in results {
match result {
Ok(pending_bundle) => match pending_bundle.await {
Ok(bundle_hash) => println!(
"Bundle with hash {:?} was included in target block",
bundle_hash
),
Err(PendingBundleError::BundleNotIncluded) => {
println!("Bundle was not included in target block.")
}
Err(e) => println!("An error occured: {}", e),
},
Err(e) => println!("An error occured: {}", e),
}
}
Ok(())
}