Skip to content

Latest commit

 

History

History
55 lines (38 loc) · 1.98 KB

File metadata and controls

55 lines (38 loc) · 1.98 KB

32. 代幣水龍頭

所謂的代幣水龍頭,是指一個網站或者應用程式,可以免費獲得代幣。這些代幣通常是測試網路上的代幣,用於測試智能合約,當然如果是生態上的那可就是真金白銀了。

當你想要什麼話費就可以一直取得聽起來很棒,這就是這樣的和約

可以沿用剛剛的 ERC20 代幣合約

實現

建立 faucet.sol

// SPDX-License-Identifier: MIT
// WTF Solidity by 0xAA

pragma solidity ^0.8.21;

import "contracts/ERC20/IERC20.sol"; // 看路徑在哪

contract Faucet {
    
    uint256 public amountAllowed = 100; // 每次领 100 单位代币
    address public tokenContract;   // token合约地址
    mapping(address => bool) public requestedAddress;   // 记录领取过代币的地址

    // SendToken事件    
    event SendToken(address indexed Receiver, uint256 indexed Amount); 

    constructor(address _tokenContract) {
        tokenContract = _tokenContract; // set token contract
    }

    // 用户领取代币函数
    function requestTokens() external {
        require(!requestedAddress[msg.sender], "Can't Request Multiple Times!"); // 每个地址只能领一次
        IERC20 token = IERC20(tokenContract); // 创建IERC20合约对象
        require(token.balanceOf(address(this)) >= amountAllowed, "Faucet Empty!"); // 水龙头空了

        token.transfer(msg.sender, amountAllowed); // 发送token
        requestedAddress[msg.sender] = true; // 记录领取地址 
        
        emit SendToken(msg.sender, amountAllowed); // 释放SendToken事件
    }
}

要點:

  • 設置每次提領空投可以提領的數量
  • 設置 tokenContract 合約地址
  • 記錄提領紀錄
  1. 部署 faucet 合約的時候記得把 ERC20 合約地址傳入
  2. 先把代幣轉到 faucet 合約地址裡面方便分發,切記不要直接透過 ERC20 去 mint 代幣,這樣會讓代幣失去價值(真的無限了...)
  3. 起他使用者透過 requestTokens 函數可以提領代幣。