#alloy #everyone #address #sol #multicall

alloy-multicall

Multicall for everyone

6 releases

0.9.2 Jan 9, 2025
0.1.4 Nov 22, 2024
0.1.3 Oct 2, 2024
0.1.2 Sep 20, 2024

#3 in #alloy

Download history 21/week @ 2024-09-25 169/week @ 2024-10-02 7/week @ 2024-10-09 6/week @ 2024-10-16 3/week @ 2024-10-30 13/week @ 2024-11-06 3/week @ 2024-11-13 136/week @ 2024-11-20 10/week @ 2024-11-27 2/week @ 2024-12-04 2/week @ 2024-12-11 159/week @ 2025-01-08

159 downloads per month

MIT license

45KB
724 lines

Alloy Multicall

Easily send multicall transactions using Alloy.

Installation

Add alloy-multicall to your Cargo.toml.

alloy-multicall = "0.9.2"

Example

use alloy::{
    dyn_abi::DynSolValue,
    primitives::{address, U256},
    sol,
    sol_types::JsonAbiExt as _,
};
use alloy_multicall::Multicall;

sol! {
    #[derive(Debug)]
    #[sol(abi)]
    function getAmountsOut(uint amountIn, address[] memory path)
        public
        view
        virtual
        override
        returns (uint[] memory amounts);
}

#[tokio::main]
async fn main() {
    tracing_subscriber::fmt::init();

    let rpc_url = "https://rpc.ankr.com/eth".parse().unwrap();
    let provider = alloy::providers::ProviderBuilder::new().on_http(rpc_url);
    let uniswap_v2 = address!("7a250d5630b4cf539739df2c5dacb4c659f2488d");

    let mut multicall = Multicall::with_provider_chain_id(&provider).await.unwrap();

    let amounts_out = getAmountsOutCall::abi();

    multicall.add_call(
        uniswap_v2,
        &amounts_out,
        &[
            DynSolValue::from(U256::from(1000000000000000000_u128)),
            DynSolValue::Array(vec![
                address!("C02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2").into(),
                address!("6982508145454Ce325dDbE47a25d4ec3d2311933").into(),
            ]),
        ],
        false,
    );

    let results = multicall.call().await.unwrap();
    println!("{:?}", results);
}

Credits

Dependencies

~40MB
~734K SLoC