文件 1 的 4:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 4:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
}
文件 3 的 4:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_setOwner(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_setOwner(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_setOwner(newOwner);
}
function _setOwner(address newOwner) private {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 4 的 4:RevestPublicSaleBatch.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
contract RevestPublicSaleBatch is Ownable {
address public token;
uint public tokenAmount;
uint public startTimestamp;
uint public earlybirdTimestamp;
uint public endTimestamp;
uint public earlybirdBonus;
uint public earlybirdDenominator = 100;
mapping(address => uint) public allocs;
uint public totalAlloc;
constructor(uint _startTimestamp, uint _endTimestamp, uint _earlybirdTimestamp, uint _earlybirdBonus) Ownable() {
require(
block.timestamp < _startTimestamp
&& _startTimestamp < _earlybirdTimestamp
&& _earlybirdTimestamp < _endTimestamp,
"E061"
);
require(_earlybirdBonus > earlybirdDenominator, "E062");
startTimestamp = _startTimestamp;
endTimestamp = _endTimestamp;
earlybirdTimestamp = _earlybirdTimestamp;
earlybirdBonus = _earlybirdBonus;
}
receive() external payable {
require(startTimestamp <= block.timestamp && block.timestamp <= endTimestamp, "E063");
uint amount = msg.value;
uint effective = block.timestamp <= earlybirdTimestamp ? amount * earlybirdBonus / earlybirdDenominator : amount;
allocs[msg.sender] += effective;
totalAlloc += effective;
}
function claim() external {
_claim(msg.sender);
}
function claimOnBehalf(address user) external onlyOwner {
_claim(user);
}
function _claim(address user) internal claimable {
require(allocs[user] > 0, "E064");
uint amount = claimableTokens(user);
allocs[user] = 0;
IERC20(token).transfer(user, amount);
}
function claimableTokens(address user) public view claimable returns (uint) {
return allocs[user] * tokenAmount / totalAlloc;
}
modifier claimable() {
require(block.timestamp > endTimestamp, "E065");
require(token != address(0x0), "E066");
_;
}
function setTokenAddress(address _tokenAddress) external onlyOwner {
token = _tokenAddress;
}
function setTokenAmount(uint _tokenAmount) external onlyOwner {
tokenAmount = _tokenAmount;
}
function manualMapAllocation(address[] memory users, uint[] memory etherAlloc) external onlyOwner {
uint len = users.length;
require(len == etherAlloc.length, "E067");
for(uint iter = 0; iter < len; iter++) {
uint ethAll = etherAlloc[iter];
allocs[users[iter]] += ethAll;
totalAlloc += ethAll;
}
}
function withdraw() public onlyOwner {
uint amount = address(this).balance;
(bool success,) = owner().call{value: amount}("");
require(success, "E068");
}
}
{
"compilationTarget": {
"contracts/public/RevestPublicSaleBatch.sol": "RevestPublicSaleBatch"
},
"evmVersion": "istanbul",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 10000
},
"remappings": []
}
[{"inputs":[{"internalType":"uint256","name":"_startTimestamp","type":"uint256"},{"internalType":"uint256","name":"_endTimestamp","type":"uint256"},{"internalType":"uint256","name":"_earlybirdTimestamp","type":"uint256"},{"internalType":"uint256","name":"_earlybirdBonus","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"allocs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimOnBehalf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"claimableTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlybirdBonus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlybirdDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"earlybirdTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"endTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"users","type":"address[]"},{"internalType":"uint256[]","name":"etherAlloc","type":"uint256[]"}],"name":"manualMapAllocation","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"setTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"setTokenAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"token","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAlloc","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]