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; #[tokio::main] async fn main() -> Result<()> { // Connect to the network let provider = Provider::::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( FlashbotsMiddleware::new( provider, 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); // Simulate it let simulated_bundle = client.inner().simulate_bundle(&bundle).await?; println!("Simulated bundle: {:?}", simulated_bundle); // Send it let pending_bundle = client.inner().send_bundle(&bundle).await?; // You can also optionally wait to see if the bundle was included 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), } Ok(()) }