![](/img/trans.png)
[英]Solidity function returning true in remix but false in web3 function call
[英]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)))
对于所有参数,它总是返回false
和0
:
虽然这些值在 Remix 上总是会正确返回:
这是一个非常奇怪的错误,我确定名称中没有任何拼写错误。
这是我的示例中的合约地址0x29588f4714223bd492ce6500D6CEE0eCD4f1c51e
,这是我的 Solidity 代码。
谢谢大家,大家的任何回答都非常感谢。
好吧,我终于知道原因了。
在将msg.sender
更改为我在 Solidity 代码上的钱包地址后,它运行良好。
从这里,我可以证明问题出在msg.sender
。
这是解决方案帖子,你们可以阅读更多相关信息: Solidity function 在 ethersjs/hardhat 上返回空数组,但在混音 ide 中没有?
希望这会帮助遇到我的问题的人。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.