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

合金-abirpc

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

1 个不稳定版本

0.1.0 2024年8月17日

#405 in 神奇豆

MIT/Apache

33KB
252

合金-abirpc

合金-abirpc 允许开发者在同一应用上下文中通过简单的 API 高效地管理多个区块链上的多个智能合约实例。这个 crate 为 ethers-abirpc crate 提供了 合金-rs 开发社区的实施。

概览

该 crate 定义了 abirpc! 宏以及用于合金提供封装的几个其他实用工具。如以下示例所示,abirpc! 宏被实现为 sol! 宏的扩展。

use alloy_abirpc::prelude::*;

sol!(
    #[sol(rpc)]
    Erc20Token,
    "./tests/abi/Erc20Token.json"
);
abirpc!(Erc20Token);

#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let address = address_from!("0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2")?; // WETH
    let registry = Erc20TokenRegistry::<WsTransport>::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().call().await?._0;; // Query contract abi

    Ok(())
}

在这个例子中,abirpc!(Erc20Token) 调用生成了实现 RPC 提供封装的 Erc20TokenRegistry 类型,前面的 sol! 调用生成了包含合约 ABI 所需的 rust 绑定的底层 Erc20TokenInstance 类型。

网络管理

网络实现由 alloy_chains crate 提供。

let chain = Chain::from(NamedChain::Mainnet);
// OR
let chain = Chain::from_id(1);

如果链 Id 与链上配置不匹配,初始化将失败。

let registry = Erc20TokenRegistry::<WsTransport>::new(
	String::from("wss://ethereum-rpc.publicnode.com"), 
	Chain::from_id(10) // Incorrect ChainId
);
let provider = registry.provider().await?; // Error 

提供者管理

该 crate 还包括用于直接初始化 合金-rs 提供者的包装器。这对于不需要 ABI 的交互很有帮助。

let provider: WsProvider = AbiProvider::new(
    String::from("wss://ethereum-rpc.publicnode.com"),
    Chain::from_id(1),
)
.provider()
.await?;

let sub = provider.subscribe_blocks().await?;
let mut stream = sub.into_stream();
if let Some(block) = stream.next().await {
    println!("{:?}", block)
}

ABI 管理

ABI 文件可以放在系统上的任何位置,同一 .rs 文件中可以初始化多个 ABIs。

use alloy_abirpc::prelude::*;

sol!(
    #[sol(rpc)]
    Erc20Token,
    "./tests/abi/Erc20Token.json"
);
abirpc!(Erc20Token);

sol!(
    #[sol(rpc)]
    Erc721Token,
    "./tests/abi/Erc721Token.json"
);
abirpc!(Erc721Token);

发行说明

  • 0.1.0: 稳定 API。 SemVer 前向兼容性

依赖项

~27–39MB
~772K SLoC