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

为何ethers.js调用合约函数返回值为数组而非单个值?

问题原因分析

当你通过myContract.functions.MAX_COUNT()调用合约函数时,ethers.js(主流以太坊开发库)的函数调用接口无论合约函数返回几个值,都会把结果包装成数组返回。

你的Solidity合约里,MAX_COUNT是public constant,Solidity会自动为它生成一个同名的getter函数,这个函数的返回值是单个uint256类型。但在functions调用方式下,哪怕只有一个返回值,也会被放在数组里,所以你拿到的是[BigNumber { value: "64" }]而不是单个BigNumber对象。

修复方案

有两种常见的解决方式:

  1. 直接访问合约的属性(而非通过functions方法):
it('should access MAX_COUNT', async () => {
    const maxCount = await myContract.MAX_COUNT(); // 直接访问属性,返回单个BigNumber
    expect(maxCount.toNumber()).to.equal(64);
});
  1. 从返回数组中取出第一个元素:
it('should access MAX_COUNT', async () => {
    const maxCount = await myContract.functions.MAX_COUNT();
    expect(maxCount[0].toNumber()).to.equal(64);
});

另外要注意,Solidity的数值在ethers.js里会被转为BigNumber类型,不能直接和普通数字用equal比较,要么用toNumber()转成数字,要么用BigNumber的比较逻辑:

expect(maxCount[0]).to.equal(BigNumber.from(64));

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 15:37:07