所謂的代幣水龍頭,是指一個網站或者應用程式,可以免費獲得代幣。這些代幣通常是測試網路上的代幣,用於測試智能合約,當然如果是生態上的那可就是真金白銀了。
當你想要什麼話費就可以一直取得聽起來很棒,這就是這樣的和約
可以沿用剛剛的 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 合約地址
- 記錄提領紀錄
- 部署 faucet 合約的時候記得把 ERC20 合約地址傳入
- 先把代幣轉到 faucet 合約地址裡面方便分發,切記不要直接透過 ERC20 去 mint 代幣,這樣會讓代幣失去價值(真的無限了...)
- 起他使用者透過 requestTokens 函數可以提領代幣。