trident-evm-aa 0.3.0

Rust glue for the Trident minimal EIP-7702 smart account: deploy, install, and batch transactions.
Documentation
//! Run three actions in one transaction from your 7702-delegated EOA:
//!   1. wrap 0.5 ETH into WETH
//!   2. transfer 0.1 WETH to bob
//!   3. send 0.3 ETH to carol
//!
//! Prerequisite: your EOA has already been delegated to `TridentAccount`
//! (see the `install` example).
//!
//! ```sh
//! export RPC_URL=https://...
//! export PRIVATE_KEY=0x...
//! cargo run --example batch -p trident-evm-aa
//! ```

#![allow(clippy::print_stdout)]

use alloy_network::{AnyNetwork, ReceiptResponse};
use alloy_primitives::{Address, U256, address};
use alloy_provider::ProviderBuilder;
use alloy_signer_local::PrivateKeySigner;
use alloy_sol_types::sol;
use trident_evm_aa::call_builder::MulticallBuilder;

sol! {
    interface IWETH9 {
        function deposit() external payable;
        function transfer(address to, uint256 amount) external returns (bool);
    }
}

const WETH9: Address = address!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2");
const BOB: Address = address!("00000000000000000000000000000000000000bb");
const CAROL: Address = address!("00000000000000000000000000000000000000cc");

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let rpc_url = std::env::var("RPC_URL")?;
    let signer: PrivateKeySigner = std::env::var("PRIVATE_KEY")?.parse()?;

    let provider = ProviderBuilder::new()
        .network::<AnyNetwork>()
        .wallet(signer)
        .connect_http(rpc_url.parse()?);

    let receipt = MulticallBuilder::new()
        .call_with_value(
            WETH9,
            &IWETH9::depositCall {},
            U256::from(500_000_000_000_000_000u128),
        )
        .call(
            WETH9,
            &IWETH9::transferCall {
                to: BOB,
                amount: U256::from(100_000_000_000_000_000u128),
            },
        )
        .send_value(CAROL, U256::from(300_000_000_000_000_000u128))
        .send_with_wallet_provider(provider)
        .await?
        .get_receipt()
        .await?;

    println!("batch tx: {}", receipt.transaction_hash());

    Ok(())
}