【问题标题】:A Lottery Solidity Smart Contract Accept token as payment instead of ether彩票 Solidity 智能合约 接受代币而不是以太币作为支付
【发布时间】:2021-05-24 09:39:49
【问题描述】:
pragma solidity ^0.4.21;

contract Lottery {
  address public manager;
  address[] public players;

  constructor() public {
    manager = msg.sender;
  }

  function enter() public payable {
    require(msg.value > .01 ether);

    players.push(msg.sender);
  }

  function random() private view returns (uint) {
    return uint(keccak256(abi.encodePacked(block.difficulty, now, players)));
  }

  function pickWinner() public restricted {
    uint index = random() % players.length;

    players[index].transfer(address(this).balance);

    players = new address[](0);
  }

  function getPlayers() public view returns (address[]) {
    return players;
  }

  modifier restricted() {
    require(msg.sender == manager);
    _;
  }
}

我想改变功能

function enter() public payable {
    require(msg.value > .01 ether);

    players.push(msg.sender);
}

用户使用我们的代币/erc20 代替以太币进入彩票

【问题讨论】:

    标签: solidity


    【解决方案1】:

    您可以定义代币合约的接口(在您的合约中)。由于您将只使用transferFrom() 函数,因此这是您需要在接口中定义的唯一函数(无论令牌合约还包含其他函数)。

    interface IERC20 {
        function transferFrom(address _from, address _to, uint256 _amount) external returns (bool);
    }
    

    你可以执行令牌的transferFrom()函数,传递参数:

    • 来自:执行enter()函数的用户
    • 致:您的合同
    • 金额:假设令牌有18位小数(大多数令牌都有),您可以使用ether辅助单元,因为它有效地计算令牌最小的“0.01 * 10^18(或10^16,或10000000000000000)单位”,即代币的 0.01。否则,您需要根据令牌小数重新计算此数字。
    function enter() public payable {
        IERC20 token = IERC20(address(0x123)); // Insert the token contract address instead of `0x123`
        require(token.transferFrom(msg.sender, address(this), .01 ether));
    
        players.push(msg.sender);
    }
    

    重要提示:请注意,用户需要先approve()您的合约才能使用他们的代币(从他们的地址),否则代币转移将失败。这是出于安全原因,请在this answer 的底部阅读更多相关信息。

    【讨论】:

    • 谢谢你,你能给我一个例子来调用用户批准代币合约作为他们的付款吗?
    • 用户需要执行代币合约(例如USDT)的approve()函数,参数为1)您的合约作为支出者,2)您被允许花费的最大代币数量.示例:approve(0x123, 1000) - 这将允许地址 0x123 花费 1000 令牌单位(注意小数 - 如果令牌使用 18 位小数,则此值需要为 1000 * 10^18)... 他们可以执行该功能使用他们的钱包软件(只有一些有此功能)或某些第三方应用程序。或者网页可以准备交易执行该功能,然后只需打开一个 MetaMask 窗口进行确认。
    • 先生最后一个问题,我可以将“payableAmount (BNB)”的占位符文本更改为payableAmount (TokenName)吗?
    • 占位符文本在哪里?我看不到你的问题,也看不到答案。
    猜你喜欢
    • 2018-06-29
    • 2023-01-16
    • 2021-09-13
    • 2021-09-02
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多