如何用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
相关产品推荐
相关产品推荐

