Sample
unknown
python
a year ago
2.5 kB
9
Indexable
/ SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";
contract WhitelistICO is Ownable {
using SafeMath for uint256;
IERC20 public token;
uint256 public rate;
uint256 public weiRaised;
mapping(address => bool) public whitelist;
uint256 public phase;
uint256 public phaseEndTime;
event TokensPurchased(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);
constructor(uint256 _rate, address _tokenAddress, uint256 _initialPhaseEndTime) {
require(_rate > 0, "Rate is 0");
require(_tokenAddress != address(0), "Token address is 0");
rate = _rate;
token = IERC20(_tokenAddress);
phase = 1;
phaseEndTime = _initialPhaseEndTime;
}
modifier onlyWhitelisted() {
require(whitelist[msg.sender], "Not whitelisted");
_;
}
modifier onlyWhileOpen() {
require(block.timestamp <= phaseEndTime, "ICO is closed");
_;
}
function whitelistAddress(address _address) external onlyOwner {
whitelist[_address] = true;
}
function removeWhitelistAddress(address _address) external onlyOwner {
whitelist[_address] = false;
}
function buyTokens(address beneficiary) external payable onlyWhitelisted onlyWhileOpen {
uint256 weiAmount = msg.value;
_preValidatePurchase(beneficiary, weiAmount);
uint256 tokens = _getTokenAmount(weiAmount);
weiRaised = weiRaised.add(weiAmount);
_processPurchase(beneficiary, tokens);
emit TokensPurchased(msg.sender, beneficiary, weiAmount, tokens);
_forwardFunds();
}
function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal pure {
require(beneficiary != address(0), "Beneficiary is 0");
require(weiAmount != 0, "Wei amount is 0");
}
function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) {
return weiAmount.mul(rate);
}
function _processPurchase(address beneficiary, uint256 tokenAmount) internal {
token.transfer(beneficiary, tokenAmount);
}
function _forwardFunds() internal {
payable(owner()).transfer(msg.value);
}
function startNextPhase(uint256 newPhaseEndTime) external onlyOwner {
phase = phase.add(1);
phaseEndTime = newPhaseEndTime;
}
}Editor is loading...
Leave a Comment