Sample

 avatar
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