You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用ethers.rs的Multicall在Polygon批量调用合约获取Vec<Address>

问题排查与修复方案

1. 修复节点端点硬编码错误

代码中已经从NODE_ENDPOINTS_MAP获取了正确的链节点地址,但创建Provider时却硬编码了无效字符串"NODE_ENDPOINT",这会导致Multicall连接到错误节点,直接引发调用失败。

修改这一行:

let client = Provider::<Http>::try_from("NODE_ENDPOINT")?;

替换为:

let client = Provider::<Http>::try_from(endpoint)?;

2. 修正返回类型不匹配问题

函数返回类型定义为Vec<Result<Token, Bytes>>,但合约方法symbolArray实际返回Vec<Address>,类型不匹配会触发解码错误。需要统一类型:

调整函数签名:

pub async fn get_pair_traders_array_two(chain: &str) -> Result<Vec<Result<Vec<Address>, Bytes>>, Box<dyn std::error::Error>> {

确保合约方法调用的泛型参数与返回类型一致:

let call = contract.method::<_, Vec<Address>>("symbolArray", argument)?;

3. 明确指定Multicall版本适配Polygon链

你使用的0x11ce4B23bD875D7F5C6a31084f55fDe1e9A87507是Polygon上的Multicall2合约地址,建议明确使用Multicall2实例而非默认Multicall,避免版本兼容问题:

// 先导入Multicall2
use ethers::contract::multicall::Multicall2;

// 替换原Multicall实例化代码
let mut multicall = Multicall2::new(client.clone(), multicall_address).await?;

4. 确认ABI完整性

确保传入的ABI包含symbolArray函数的完整定义,示例格式如下:

[{"inputs":[{"internalType":"uint256","name":"arg","type":"uint256"}],"name":"symbolArray","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"}]

不完整的ABI会导致函数选择器生成错误,触发Revert或解码失败。

5. 调试调用数据(可选)

如果以上修复后仍有问题,可打印调用的calldata,对比单调用时的calldata是否一致:

let call_data = call.calldata().unwrap();
println!("Calldata: {:?}", call_data);

若两者不同,说明合约方法的参数或函数名存在隐性错误。


内容的提问来源于stack exchange,提问作者SelfLearnedNoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:01:22