7个版本
新 0.3.0 | 2024年8月20日 |
---|---|
0.2.1 | 2024年8月16日 |
0.1.3 | 2024年7月30日 |
#359 in 神奇豆子
每月717次下载
39KB
684 行
ethers-abirpc
ethers-abirpc
允许用户通过简单的API,在同一应用程序上下文中,高效管理多个区块链上的多个智能合约实例。
概述
该包定义了 abirpc!
宏以及用于 ethers-rs
提供封装的几个其他实用工具。以下示例展示了 abirpc!
宏是如何作为 ethers abigen!
宏的扩展来实现的。
use ethers_abirpc::prelude::*;
abigen!(Erc20Token, "./abi/Erc20Token.json"); // Path to abi
abirpc!(Erc20Token);
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let address = address_from!("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2")?; // WETH
let registry = Erc20TokenRegistry::<WsProvider>::new(
String::from("wss://ethereum-rpc.publicnode.com"),
Chain::from(NamedChain::Mainnet)
);
let provider = registry.provider().await?;
let instance = registry.register(provider, address);
let _ = instance.decimals().await?; // Query contract
Ok(())
}
在这个示例中,abirpc!(Erc20Token)
调用生成了实现 RPC 提供封装的 Erc20TokenRegistry
类型,前面的 abigen!
调用生成了定义合约 ABI 的 Rust 绑定的底层 Erc20Token
类型。
网络管理
网络实现与 alloy-chains
API 保持一致。
let chain = Chain::from(NamedChain::Mainnet);
// OR
let chain = Chain::from_id(1);
如果链ID与链上配置不匹配,初始化将失败。
let registry = Erc20TokenRegistry::<WsProvider>::new(
String::from("wss://ethereum-rpc.publicnode.com"),
Chain::from_id(10) // Incorrect chain id
);
let provider = registry.provider().await?; // Error
传递一个 ChainConfig
结构体提供了对所有配置参数的细粒度控制,包括强制执行链ID检查。
let chain = Chain::ChainConfig(ChainConfig::default())
提供者管理
ethers-abirpc
支持以下 ethers-rs
提供者类型。
Provider<Ws>
Provider<Http>
Provider<RetryClient<Http>>
Provider<Ipc>
Provider<MockProvider>
这些类型通过以下类型别名由 ethers-abirpc
重导出,这样开发者就不需要管理底层的 ethers-rs
提供者类型。
WsProvider
HttpProvider
RetryProvider
IpcProvider
MockProvider
也支持直接初始化提供者。这对于不需要 ABI 交互的应用程序很有帮助。
let provider: WsProvider = AbiProvider::new(
String::from("wss://ethereum-rpc.publicnode.com"),
Chain::from_id(1),
)
.provider()
.await?;
let mut stream = provider.subscribe_blocks().await?;
while let Some(block) = stream.next().await {
println!("{:?}", block)
}
ABI 管理
ABI 文件可以位于系统的任何位置,同一 .rs
文件中可以初始化多个 ABIs。
use ethers_abirpc::prelude::*;
abigen!(Erc20Token, "./abi/Erc20Token.json");
abirpc!(Erc20Token);
abigen!(Erc721Token, "./abi/Erc721Token.json");
abirpc!(Erc721Token);
发布说明
- 0.3.0:改进宏、导入,并为提供者类型添加类型别名
- 0.2.x:稳定 API 并添加合金兼容的链实现
- 0.1.x:开发版本
还开发了一个 alloy-abirpc
实现 ethers-abirpc
,并已努力确保这两个库共享一致的 API。
依赖关系
~27–43MB
~806K SLoC