显示图像的 Web3 令牌持有者要求

Web3 Token Holder Requirement to Show Image

在 Web3 中,是否可以调用一个函数,要求用户在 image/text 可见之前先持有 ERC20 令牌?这类似于密码要求,但无需输入密码即可使功能生效,他们只需持有至少 1 个 ERC20 令牌即可。现在,如果 msg.sender 至少有一个 ERC20,我已经能够编写一个简单的 returns 文本行的函数。我想这样做,但在 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”选择当前用户帐户,我也应该合并它吗?感谢您的帮助!

A​​) 这是个人喜好问题,但将 Reveal() 重命名为 hasERC20() 和 return “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) You should not use "window.web3.currentProvider.selectedAddress" because it is DEPRECATED。使用 ethereum.request({ method: 'eth_accounts' }) 代替。 “当前选择的”地址是 return 由 eth_accounts 编辑的数组中的第一项。