【发布时间】:2021-12-21 18:19:17
【问题描述】:
你好,一切都好吗?
我现在开始研究 Solidity,我正在做一个中心化的游戏,在完成一些成功的任务后,我想给用户“Claim tokens”的选项,我会从游戏钱包中转移给他,并且数量是定义的后端,我将如何实现这一点? (我的问题是如何在合约中创建一个金额由后端授权的函数)
【问题讨论】:
标签: ethereum solidity erc20 binance-smart-chain bep20
你好,一切都好吗?
我现在开始研究 Solidity,我正在做一个中心化的游戏,在完成一些成功的任务后,我想给用户“Claim tokens”的选项,我会从游戏钱包中转移给他,并且数量是定义的后端,我将如何实现这一点? (我的问题是如何在合约中创建一个金额由后端授权的函数)
【问题讨论】:
标签: ethereum solidity erc20 binance-smart-chain bep20
经过大量搜索,我在 Solidity 的文档中找到了答案,我想要的是文档 (readthedocs.org/projects/solidity/downloads/pdf/v0.5.12) 的第 3.3.4 项(微支付渠道),那里它解释了如何授权一个人通过签名和哈希从我的钱包中提现,而我什至不需要调用合约的方法
【讨论】:
您可以创建一个用户可执行的函数(以便他们支付 gas 费用),该函数使用 ERC-20 transfer() 函数(假设您的代币将是 ERC-20)。
在这个例子中,只要用户执行claimToken()函数,他们就会从MyGame合约地址收到claimAmount的代币。
对于授权,我使用了Ownable 模式,只有授权的地址才能执行该功能(在本例中为setClaimAmount())。
pragma solidity ^0.8;
interface ITokenContract {
function transfer(address _receiver, uint256 _amount) external returns (bool);
}
contract MyGame {
ITokenContract tokenContract = ITokenContract(address(0x123));
uint256 public claimAmount;
address public owner;
modifier onlyOwner {
require(msg.sender == owner);
_;
}
function claimTokens() external {
// send `claimAmount` of tokens from this contract address
// to the user executing the `claimTokens()` function
bool success = tokenContract.transfer(msg.sender, claimAmount);
require(success);
}
function setClaimAmount(uint256 _claimAmount) external onlyOwner {
claimAmount = _claimAmount;
}
}
此外,您可能希望对 claimTokens() 函数进行一些验证,以便它们执行传输的频率不会超出您的预期。
【讨论】: