4 个版本
0.2.5 | 2024年6月13日 |
---|---|
0.2.4 | 2024年5月25日 |
0.2.3 | 2024年4月4日 |
0.2.2 | 2024年4月3日 |
#2484 in 魔力豆
83KB
1.5K SLoC
此库提供了一种简单的方法与嵌入式以太坊虚拟机 (EVM) 交互。
[dependencies]
simular-core = "0.2.5"
支持
- 内存数据库和从远程节点分叉状态的能力
- 为以后使用而保存 EVM 状态的快照
- 函数调用的原始编码/解码以及 alloy SolTypes
- 从可读语法创建轻量级的 ABI
示例
创建并与 EVM 交互
use simular_core::{BaseEvm, generate_random_addresses};
use alloy_primitives::{Address, U256};
// Generate some random addresses
let addresses = generate_random_addresses(2);
let bob = addresses[0];
let alice = addresses[1];
// create the EVM with in-memory database (default)
let mut evm = BaseEvm::default();
// create 2 accounts. Bob w/ 2 ether, alice w/ none
evm.create_account(bob, Some(U256::from(2e18))).unwrap();
evm.create_account(alice, None).unwrap();
// check the balances
assert!(evm.get_balance(bob).unwrap() == U256::from(2e18));
assert!(evm.get_balance(alice).unwrap() == U256::from(0));
分叉远程合约
与远程合约交互会将远程合约的状态拉入本地内存数据库以供使用。
use simular_core::{BaseEvm, generate_random_addresses, ContractAbi};
use alloy_primitives::{Address, U256, address};
// create ABI inline
let abi = ContractAbi::from_human_readable(vec![
"function totalSupply() (uint256)"
]);
// create a fork using the latest block
let fork_info = CreateFork.latest_block(URL OF JSON-RPC NODE);
let mut evm = BaseEvm::new(Some(fork_info));
// remote contract address.
// using DAI: 0x6B175474E89094C44Da98b954EedeAC495271d0F
let contract_address = address!("6B175474E89094C44Da98b954EedeAC495271d0F");
// encode the function call
let (encoded_total_supply, _, decoder) =
abi.encode_function("totalSupply", "()").unwrap();
// call the function on the remote contract
let output = evm.transact_call(
contract_address,
encoded_total_supply,
U256::from(0)).unwrap();
// decode the result
let value = decoder.unwrap().abi_decode(&output.result)
println!("total supply: {:?}", value);
请参阅 uniswap 以了解使用分叉和快照在 Uniswap 上交易一对的示例。
运行示例
> cargo run --example uniswap
站在巨人的肩膀上...
感谢以下项目使这项工作成为可能!
- revm
- alloy-rs
- foundry-rs 在很大程度上影响了设计
依赖项
~34–54MB
~1M SLoC