1 个不稳定版本
新 0.1.0 | 2024年8月17日 |
---|
#405 in 神奇豆
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