Sample
unknown
python
a year ago
2.5 kB
6
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