繁体   English   中英

已解决 | Solidity:在 Remix IDE 上正确返回布尔值,但在 JS 上总是返回“false”

[英]SOLVED | Solidity: the bool values returned correctly on Remix IDE but always return "false" on JS

这个问题看起来很傻,但它让我发疯,因为我找不到解决方案。 我会在下面说清楚。

我使用 useDApp 框架和useCall钩子。 我可以正确地获得从 Solidity 函数返回的值,并且一切都非常完美。 但是这两个功能有问题:

function showRemainingDate(uint _id) public view returns(uint) {
    for (uint i = 0; i < users[msg.sender].numberOfCards; i++) {
        if (users[msg.sender].purchase[i].card.id == cards[_id].id) {
            return 30*86400 - (block.timestamp - users[msg.sender].purchase[i].purchaseDate);
        }
    }
    return 0;
}

function checkPurchase(uint _id) public view returns (bool) {
    for (uint i = 0; i < users[msg.sender].numberOfCards; i++) {
        if (users[msg.sender].purchase[i].card.id == cards[_id].id) {
            return true;
        }
    }
    return false;
}

在 Remix 上部署后,我为我的 dApp 项目导入了它的地址和ABI ,然后像这样使用useCall钩子:

export function useCheckPurchase(index) {
  const { value: checkPurchase } = useCall({
    contract: contract,
    method: "checkPurchase",
    args: [index],
  }) ?? {};
  return checkPurchase;
}

export function useShowRemainingDate(index) {
  const { value: showRemainingDate } = useCall({
    contract: contract,
    method: "showRemainingDate",
    args: [index],
  }) ?? {};
  return showRemainingDate;
}

奇怪的点从这里开始,如果我使用purchaseCard钩子/函数(无论是在 JS 还是 Remix 上)然后console.log值(仅作为示例):

console.log(useCheckPurchase(3))
console.log(parseInt(useShowRemainingDate(3)))

对于所有参数,它总是返回false0

出现在控制台上的值

虽然这些值在 Remix 上总是会正确返回:

检查购买 显示剩余日期

这是一个非常奇怪的错误,我确定名称中没有任何拼写错误。

这是我的示例中的合约地址0x29588f4714223bd492ce6500D6CEE0eCD4f1c51e这是我的 Solidity 代码

谢谢大家,大家的任何回答都非常感谢。

好吧,我终于知道原因了。
在将msg.sender更改为我在 Solidity 代码上的钱包地址后,它运行良好。
从这里,我可以证明问题出在msg.sender

这是解决方案帖子,你们可以阅读更多相关信息: Solidity function 在 ethersjs/hardhat 上返回空数组,但在混音 ide 中没有?

希望这会帮助遇到我的问题的人。

暂无
暂无

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

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