4 个版本

0.2.1 2024年7月23日
0.2.0 2024年7月12日
0.1.1 2024年6月23日
0.1.0 2024年6月23日

#2083 in 魔法豆

Download history 297/week @ 2024-06-21 22/week @ 2024-06-28 1/week @ 2024-07-05 102/week @ 2024-07-12 119/week @ 2024-07-19 44/week @ 2024-07-26 21/week @ 2024-08-02

每月286次下载

MIT 许可证

24KB
499 代码行

Alloy MEV

使用 Alloy 轻松发送交易包。

安装

alloy-mev 添加到您的 Cargo.toml

alloy-mev = "0.2"

特性

MEV-Share

此包包含 MevShareProviderExt 扩展 trait。在其作用域内,它为基于 HTTP 传输的提供商添加了向 Flashbots 匹配器发送包的方法。

#[tokio::main]
async fn main() -> Result<()> {
    dotenv().ok();
    let eth_rpc = env::var("ETH_HTTP_RPC")?;

    // This is your searcher identity
    let bundle_signer = LocalSigner::random();

    // This signs transactions
    let tx_signer = EthereumWallet::from(LocalSigner::random());

    // Build a provider with MEV
    let provider = ProviderBuilder::new()
        .with_recommended_fillers()
        .signer(tx_signer.clone())
        .on_http(eth_rpc.parse()?);

    // Pay Vitalik using a MEV-Share bundle!
    let tx = TransactionRequest::default()
        .from(tx_signer.default_signer_address())
        .to(Some(address!("d8dA6BF26964aF9D7eEd9e03E53415D37aA96045"))) // vitalik.eth
        .value(U256::from(1000000000));

    // Build a bundle...
    let bundle = SendBundleRequest {
        bundle_body: vec![provider.build_bundle_item(tx, false).await?],
        inclusion: Inclusion::at_block(provider.get_block_number().await? + 1),
        ..Default::default()
    };

    // ... and send it!
    let response = provider.send_mev_bundle(bundle, bundle_signer).await?;

    println!("Bundle hash: {}", response.bundle_hash);

    Ok(())
}

区块构建器

此包还包含 EthMevProviderExt 扩展 trait,它为基于 HTTP 传输的提供商添加了向区块构建器广播包的方法。

#[tokio::main]
async fn main() -> Result<()> {
    dotenv().ok();
    let eth_rpc = env::var("ETH_HTTP_RPC").unwrap();
    let bundle_signer = PrivateKeySigner::random();
    let tx_signer = EthereumWallet::new(signer.clone());

    let provider = ProviderBuilder::new()
        .with_recommended_fillers()
        .wallet(tx_signer.clone())
        .on_http(eth_rpc.parse().unwrap());

    // Select which builders the bundle will be sent to
    let endpoints = provider
        .endpoints_builder()
        .beaverbuild()
        .titan(BundleSigner::flashbots(bundle_signer.clone()))
        .build();

    let block_number: u64 = provider.get_block_number().await.unwrap().into();

    // Pay Vitalik using a MEV-Share bundle!
    let tx = TransactionRequest::default()
        .from(tx_signer.default_signer_address())
        .to(Some(address!("d8dA6BF26964aF9D7eEd9e03E53415D37aA96045"))) // vitalik.eth
        .value(U256::from(1000000000));

    // Broadcast the bundle to all builders setup above!
    let responses = provider
        .send_eth_bundle(
            EthSendBundle {
                txs: vec![provider.encode_request(tx)],
                block_number: block_number + 1,
                min_timestamp: None,
                max_timestamp: None,
                reverting_tx_hashes: vec![],
                replacement_uuid: None,
            },
            &endpoints,
        )
        .await;

    println!("{responses:#?}");
}

鸣谢

依赖

~27–40MB
~771K SLoC