代币(solidity)- 用户支付 gas 后,从主应用钱包中奖励用户 X 数量的代币

Posted

技术标签:

【中文标题】代币(solidity)- 用户支付 gas 后,从主应用钱包中奖励用户 X 数量的代币【英文标题】:Token (solidity) - Reward a user X amount of token from main app wallet with user paying the gas 【发布时间】:2021-12-21 18:19:17 【问题描述】:

你好,一切都好吗?

我现在开始研究 Solidity,我正在做一个中心化的游戏,在完成一些成功的任务后,我想给用户“Claim tokens”的选项,我会从游戏钱包中转移给他,并且数量是定义的后端,我将如何实现这一点? (我的问题是如何在合约中创建一个金额由后端授权的函数)

【问题讨论】:

【参考方案1】:

经过大量搜索,我在 Solidity 的文档中找到了答案,我想要的是文档 (readthedocs.org/projects/solidity/downloads/pdf/v0.5.12) 的第 3.3.4 项(微支付渠道),那里它解释了如何授权一个人通过签名和哈希从我的钱包中提现,而我什至不需要调用合约的方法

【讨论】:

【参考方案2】:

您可以创建一个用户可执行的函数(以便他们支付 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() 函数进行一些验证,以便它们执行传输的频率不会超出您的预期。

【讨论】:

感谢您的尝试,但这不是我想要的,经过大量搜索,我在 Solidity 的文档中找到了它,我想要的是文档 (readthedocs.org/projects/solidity/downloads/pdf/v0.5.12) 的第 3.3.4 项(小额支付渠道) ),它解释了如何授权一个人从我的钱包中提取签名和哈希,而不需要我甚至调用合约的方法

以上是关于代币(solidity)- 用户支付 gas 后,从主应用钱包中奖励用户 X 数量的代币的主要内容,如果未能解决你的问题,请参考以下文章

以太坊合约所有者可以支付交易的gas吗?

以太坊 Solidity 的划分

Solidity极简入门#12. 事件

GAS ERC20 代币使用啥?

solidity开发以太坊代币智能合约

如何使用 python/solidity 生成钱包和转移/铸造代币给他们?