显示图像的 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 编辑的数组中的第一项。
在 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 编辑的数组中的第一项。