use alloy::{
network::{EthereumWallet, TransactionBuilder},
primitives::U256,
providers::{Provider, ProviderBuilder},
signers::local::PrivateKeySigner,
};
use alloy_flashblocks::FlashblocksProviderExt;
use eyre::{eyre, Result};
use std::time::Instant;
const RPC_URL: &str = "https://sepolia-preconf.base.org";
#[tokio::main]
async fn main() -> Result<()> {
let pk = std::env::var("PRIVATE_KEY")
.map_err(|_| eyre!("PRIVATE_KEY env var not set"))?;
let signer: PrivateKeySigner = pk.parse()?;
let wallet = EthereumWallet::from(signer.clone());
let address = signer.address();
println!("Using address: {}", address);
let provider = ProviderBuilder::new()
.wallet(wallet)
.connect_http(RPC_URL.parse()?);
let balance = provider.get_balance(address).await?;
println!("Balance: {} wei", balance);
let tx = alloy::rpc::types::TransactionRequest::default()
.with_to(address)
.with_value(U256::from(200_000_000_000u64));
let start = Instant::now();
let pending = provider.send_transaction(tx).await?;
let tx_hash = *pending.tx_hash();
println!("\nSent tx: {}", tx_hash);
println!("Send took: {:?}", start.elapsed());
println!("\nWaiting for preconfirmation...");
let preconf_start = Instant::now();
let preconf_receipt = provider.wait_for_preconfirmation(tx_hash).await?;
let preconf_time = preconf_start.elapsed();
println!("Preconfirmed in {:?}", preconf_time);
println!(" Block: {:?}", preconf_receipt.block_number);
println!(" Status: {:?}", preconf_receipt.status());
println!(" Gas used: {}", preconf_receipt.gas_used);
println!(" Effective gas price: {:?}", preconf_receipt.effective_gas_price);
let is_preconf = provider.is_preconfirmed(tx_hash).await?;
println!(" is_preconfirmed: {}", is_preconf);
println!("\nTotal time from send to preconfirmation: {:?}", start.elapsed());
Ok(())
}