javascript - 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”选择当前用户帐户,我也应该合并它吗?感谢您的帮助!
解决方案
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 返回的数组中的第一项。
推荐阅读
- gcloud - 以编程方式读取 Gcloud 日志
- javascript - React - 样式化的组件获取类名
- python - Flask-Admin:current_user 意外未定义?
- c# - CS5001“不包含适合入口点的静态‘main’方法”
- amazon-web-services - 查找不同类别的产品
- swiftui - 使用 Swift UI 更新滑块值
- three.js - 如何在three.js中的3D对象上放置透明颜色蒙版?
- latex - 在乳胶表中包装多个与 / 符号连接的单词
- ios - 自定义 UITableViewCell 中的操作按钮调用的 UITableView reloadRows() 总是落后一步
- spring - Kafka 消费者在使用主题模式和大消息时不会获取新记录