29 lines
1.1 KiB
Solidity
29 lines
1.1 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.24;
|
|
|
|
import {ERC20} from "./ERC20.sol";
|
|
|
|
/// A test token with its own faucet: anyone takes DRIP tokens once an hour. Devnet 3, test tokens, no value.
|
|
contract TestToken is ERC20 {
|
|
uint256 public constant DRIP = 1_000 ether;
|
|
uint256 public constant DRIP_INTERVAL = 1 hours;
|
|
mapping(address => uint256) public lastDrip;
|
|
|
|
event Drip(address indexed to, uint256 value);
|
|
|
|
constructor(string memory name_, string memory symbol_) ERC20(name_, symbol_) {}
|
|
|
|
/// Mints DRIP tokens to the caller; refused inside DRIP_INTERVAL of the caller's last drip.
|
|
function drip() external {
|
|
require(block.timestamp >= lastDrip[msg.sender] + DRIP_INTERVAL, "TestToken: one drip an hour");
|
|
lastDrip[msg.sender] = block.timestamp;
|
|
_mint(msg.sender, DRIP);
|
|
emit Drip(msg.sender, DRIP);
|
|
}
|
|
|
|
/// Seconds until the caller may drip again (0 when it may).
|
|
function dripWait(address who) external view returns (uint256) {
|
|
uint256 next = lastDrip[who] + DRIP_INTERVAL;
|
|
return block.timestamp >= next ? 0 : next - block.timestamp;
|
|
}
|
|
}
|