#lens #alloy #retrieving

alloy-ephemeral-lens

Ephemeral lens call helper for simulation and data retrieving

1 unstable release

Uses new Rust 2024

new 0.1.0 Apr 3, 2025

#157 in Magic Beans

MIT license

36KB
194 lines

Alloy Ephemeral Lens

Leverage state overrides with eth_call for on-chain simulation and data retrieval using Alloy

Installation

Add alloy-ephemeral-lens to your Cargo.toml.

alloy-ephemeral-lens = "0.1.0"

Example

/*
    Simple Lens to fetch ERC20 metadata

    TokenLens.sol implements a simple view function to get
    Symbol, Name and Decimals of an ERC20 token
*/

use std::env;

use alloy::{primitives::{address, Address}, providers::{ProviderBuilder, WsConnect}, sol};
use alloy_ephemeral_lens::Lens;

sol! {
    // `$ solc --bin-runtime examples/ERC20_metadata/TokenLens.sol`
    #[sol(deployed_bytecode="608060405234801561000f575f5ffd5b5060043610610029575f3560e01c8063597704381461002d575b5f5ffd5b6100476004803603810190610042919061022d565b610060565b60405161005794939291906102f2565b60405180910390f35b5f6060805f848573ffffffffffffffffffffffffffffffffffffffff166306fdde036040518163ffffffff1660e01b81526004015f60405180830381865afa1580156100ae573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906100d69190610461565b8673ffffffffffffffffffffffffffffffffffffffff166395d89b416040518163ffffffff1660e01b81526004015f60405180830381865afa15801561011e573d5f5f3e3d5ffd5b505050506040513d5f823e3d601f19601f820116820180604052508101906101469190610461565b8773ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa15801561018f573d5f5f3e3d5ffd5b505050506040513d601f19601f820116820180604052508101906101b391906104d2565b93509350935093509193509193565b5f604051905090565b5f5ffd5b5f5ffd5b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f6101fc826101d3565b9050919050565b61020c816101f2565b8114610216575f5ffd5b50565b5f8135905061022781610203565b92915050565b5f60208284031215610242576102416101cb565b5b5f61024f84828501610219565b91505092915050565b610261816101f2565b82525050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f601f19601f8301169050919050565b5f6102a982610267565b6102b38185610271565b93506102c3818560208601610281565b6102cc8161028f565b840191505092915050565b5f60ff82169050919050565b6102ec816102d7565b82525050565b5f6080820190506103055f830187610258565b8181036020830152610317818661029f565b9050818103604083015261032b818561029f565b905061033a60608301846102e3565b95945050505050565b5f5ffd5b5f5ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6103818261028f565b810181811067ffffffffffffffff821117156103a05761039f61034b565b5b80604052505050565b5f6103b26101c2565b90506103be8282610378565b919050565b5f67ffffffffffffffff8211156103dd576103dc61034b565b5b6103e68261028f565b9050602081019050919050565b5f610405610400846103c3565b6103a9565b90508281526020810184848401111561042157610420610347565b5b61042c848285610281565b509392505050565b5f82601f83011261044857610447610343565b5b81516104588482602086016103f3565b91505092915050565b5f60208284031215610476576104756101cb565b5b5f82015167ffffffffffffffff811115610493576104926101cf565b5b61049f84828501610434565b91505092915050565b6104b1816102d7565b81146104bb575f5ffd5b50565b5f815190506104cc816104a8565b92915050565b5f602082840312156104e7576104e66101cb565b5b5f6104f4848285016104be565b9150509291505056fea2646970667358221220d5d294ac677abffccafbb280cacd721e1a7c7a47be2c649ef5fa01609c9f721364736f6c634300081b0033")]
    interface ITokenLens {
        #[sol(abi)]
        function getToken(address) external view returns (address,string,string,uint8);
    }
}

#[tokio::main]
async fn main() {

    let rpc_url = env::var("RPC_URL").unwrap();
    let ws = WsConnect::new(rpc_url);
    let provider = ProviderBuilder::new().on_ws(ws).await.unwrap();

    let lens_address = Address::repeat_byte(0xca);

    let result= Lens::new(&provider)
        .with_ephemeral(&lens_address, ITokenLens::DEPLOYED_BYTECODE.clone())
        .with_call::<ITokenLens::getTokenCall>(&lens_address, (address!("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2"),))
        .with_call::<ITokenLens::getTokenCall>(&lens_address, (address!("0xA0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48"),))
        .call().await;

    println!("{:?}", result);
}

Credits

Dependencies

~9MB
~172K SLoC