繁体   English   中英

EthersJS 未正确从 function 调用的智能合约返回值

[英]EthersJS not properly returning a value from a smart contract on function call

我正在以太坊网络上开发 DApp,并在反应前端使用 EthersJS 与智能合约进行交互。 我已经部署了我的智能合约,我的大部分function 调用似乎一切正常,但是由于某种原因,我无法从 EtherJS 正确调用几个合约函数。 这就是我的意思...

在 Remix(我部署了智能合约的地方)中,我可以调用视图没有问题; 我得到了我期望的结果。 重新混合显示正确的值

但是,当我从 EthersJS 调用相同的视图时,我得到以下信息: EthersJS 只为这个视图和这个视图返回任何内容。

正如您在屏幕截图中看到的,来自 EthersJS 的视图调用返回0x00而不是所需的值。

这是我正在调用的智能合约的片段(可靠):

function getAllPendingRewardsByAddress(address _addr) public view returns (uint256) {
    uint256 pendingRewardsFromSnapshot;
    for (uint256 i = 1; i < currentMonth; i++) {
        pendingRewardsFromSnapshot += getPendingRewardPerSnapshot(i, _addr);
    }

    return pendingRewardsFromSnapshot;
}

...这是我为访问数据而调用的前端代码:

  const provider = new ethers.providers.Web3Provider(window.ethereum)
  const accounts = await provider.send("eth_requestAccounts", []);
  const pendingRewards = await dividendContract.getAllPendingRewardsByAddress(accounts[0])
  console.log("PENDING", pendingRewards)

我已经尝试了以下调试步骤:

  1. 我已经将十六进制地址直接放在getAllPendingRewardsByAddress("ADDRESS")中,没有骰子。
  2. 我已经验证了 ABI 是正确的。
  3. 我试过调用其他视图,它们似乎都工作正常。

我有一些预感...

  • 这与视图中的 for 循环有关吗? 也许 EthersJS 需要更多的气体来正确执行 for 循环,或者类似的东西?
  • ^ 以此为基础......也许这与分配一个导致 TX 没有足够气体的局部变量pendingRewardsFromSnapshot值有关?

我正在为这个挠头,以前从未见过这样的问题。 想知道有没有人遇到过类似的问题,请告诉我,非常感谢!

我发现了这个问题,显然 EthersJS 使用单独的帐户调用视图,而不是我调用视图的帐户(真的很奇怪)。 无论如何,我不得不更改我的一个支持视图( getBalanceOfCallerWithPrecisionPerSnapshot )以使用传递的地址而不是 msg.sender,这解决了我的问题。 如果您有类似的问题,请检查那里。 谢谢你成为我的橡皮鸭@sms!

你能告诉我 getPendingRewardPerSnapshot() function 也许问题出在 function 或者你从 1 开始你的 for 循环,也许你应该重新检查它!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM