#ethereum #ethers #crypto #celo #web3 #smart-contracts

ethers-abirpc

以太坊智能合约的ethers-rs提供封装

7个版本

0.3.0 2024年8月20日
0.2.1 2024年8月16日
0.1.3 2024年7月30日

#359 in 神奇豆子

Download history 202/week @ 2024-07-20 282/week @ 2024-07-27 6/week @ 2024-08-03 160/week @ 2024-08-10 236/week @ 2024-08-17

每月717次下载

MIT/Apache

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