weiroll 0.1.1

Weiroll planner for EVM using ethers-rs
Documentation
use std::sync::Arc;

use ethers::abi::RawLog;
use ethers::{abi::ParamType, prelude::*, utils::Anvil};
use weiroll::bindings::events::{Events, EventsEvents};
use weiroll::{
    bindings::{
        erc20::BalanceOfCall,
        events::{LogStringCall, LogUintCall},
        testable_vm::TestableVM,
    },
    Planner,
};

const WETH_ADDR: &str = "0xc02aaa39b223fe8d0a0e5c4f27ead9083c756cc2";
const VIT_ADDR: &str = "0xab5801a7d398351b8be11c439e05c5b3259aec9b";
const PROVIDER_URL: &str = "http://localhost:8545";

#[tokio::main]
pub async fn main() {
    println!("Spawning anvil..");
    let anvil = Anvil::new().fork(PROVIDER_URL).spawn();
    let wallet: LocalWallet = anvil.keys().first().unwrap().clone().into();
    let client = Arc::new(
        Provider::<Http>::try_from(anvil.endpoint())
            .unwrap()
            .with_signer(wallet),
    );

    println!("Deploying contracts..");
    let events = Events::deploy(client.clone(), ())
        .unwrap()
        .send()
        .await
        .unwrap();
    let vm = TestableVM::deploy(client.clone(), ())
        .unwrap()
        .send()
        .await
        .unwrap();

    println!("Planner..");
    let mut planner = Planner::default();
    planner
        .call::<LogStringCall>(
            events.address(),
            vec![String::from("Checking balance..").into()],
            ParamType::Uint(256),
        )
        .unwrap();
    let balance = planner
        .call::<BalanceOfCall>(
            WETH_ADDR.parse::<Address>().unwrap(),
            vec![VIT_ADDR.parse::<Address>().unwrap().into()],
            ParamType::Uint(256),
        )
        .unwrap();
    planner
        .call::<LogUintCall>(events.address(), vec![balance.into()], ParamType::Uint(256))
        .unwrap();
    let (commands, state) = planner.plan().unwrap();

    println!("Executing..");
    let receipt = vm
        .execute(commands, state)
        .send()
        .await
        .unwrap()
        .await
        .unwrap()
        .unwrap();

    println!("Logs:");
    for log in receipt.logs {
        let raw = RawLog {
            topics: log.topics,
            data: log.data.to_vec(),
        };
        let call = EventsEvents::decode_log(&raw).unwrap();
        println!("{:?}", call);
    }
}