首页 > 解决方案 > Web3 代币持有者显示图像的要求

问题描述

在 Web3 中,是否可以调用一个要求用户在图像/文本可见之前首先持有 ERC20 令牌的函数?这类似于密码要求,但无需输入密码才能使功能生效,他们只需持有至少 1 个 ERC20 令牌即可。现在,如果 msg.sender 至少有一个 ERC20,我已经能够编写一个简单地返回文本行的函数。我想这样做,但在 web3 中会显示一个 .jpg 指令图像:

function Reveal()override public view returns (string memory) {
    require(ERC20Token(0xB0Bd09D....).balanceOf(msg.sender) >= 1 wei, "Error");
     return 'Thank you for collecting  an ERC20Token, the instructions will be sent out shortly';
}

在一个网站上,我有一个 .jpg 图像,上面写有 msg.sender 的说明,但只希望他们让持有令牌的观众看到这个图像。我有一个标记为“显示”的按钮,带有一个 OnClick,它会触发如下内容:

//sender presses "reveal" button, function checks if sender has at least 1 ERC20Token. If true, then "Instructions" image is made visible. If not, textbox appears.

 contract.methods.reveal.call()({ 
if(ERC20Token(0xB0Bd09D....).balanceOf(msg.sender) >= 1 wei); {
document.getElementById("instructions").style.visibility="visible";
} else{
              //Tell viewer that they require ERC20 token
              buttonx.innerHTML = " You require at least 1 ERC20Token to proceed";

这是我被屠杀的,有声思考的作品。我可能在 Solidity 中遇到了这个错误,但试图弄清楚。到目前为止,我一直在使用 Metamask 并使用“window.web3.currentProvider.selectedAddress”选择当前用户帐户,我也应该合并它吗?感谢您的帮助!

标签: javascriptonclicksolidityweb3erc20

解决方案


A)这是品味问题,但将 Reveal() 重命名为 hasERC20() 并返回“bool”不是更好吗?同样对我来说,在这种情况下似乎“需要”验证有点不必要,因此 Solidity 代码可能如下所示:

function hasERC20() public view returns (bool memory) {  
    return (ERC20Token(0xB0Bd09D....).balanceOf(msg.sender) >= 1);  
}

B)您不必第二次使用 ERC20Token(),因为它已经在 Solidity 代码中,因此代码可能如下所示:

const msgSenderHasERC20 = await contract.methods.hasERC20().call();

if (msgSenderHasERC20){
    document.getElementById("instructionsHasERC20_true").style.visibility="visible";
    document.getElementById("instructionsHasERC20_false").style.visibility="hidden";
} else {
    document.getElementById("instructionsHasERC20_true").style.visibility="hidden";
    document.getElementById("instructionsHasERC20_false").style.visibility="visible";   
}  

C)您不应使用“window.web3.currentProvider.selectedAddress”,因为它已弃用。使用 ethereum.request({ method: 'eth_accounts' }) 代替。“当前选择的”地址是 eth_accounts 返回的数组中的第一项。


推荐阅读