ETH Price: $2,394.82 (-2.12%)

Contract

0xC099567A3f3cb3975B6D9B4C9Ff6A1e342C14C63
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer To IEO83508502019-08-14 20:38:501883 days ago1565815130IN
0xC099567A...342C14C63
0 ETH0.0004942820
Add Whitelisted ...83476732019-08-14 8:54:141883 days ago1565772854IN
0xC099567A...342C14C63
0 ETH0.0004640310
Add Whitelisted ...83410122019-08-13 8:04:521884 days ago1565683492IN
0xC099567A...342C14C63
0 ETH0.0004640310
Buy Tokens83062262019-08-07 22:26:061890 days ago1565216766IN
0xC099567A...342C14C63
0.5 ETH0.000076691
Buy Tokens83060952019-08-07 21:58:521890 days ago1565215132IN
0xC099567A...342C14C63
3 ETH0.000230093
Transfer82999552019-08-06 23:11:511891 days ago1565133111IN
0xC099567A...342C14C63
1.25075 ETH0.0030680741
Add Whitelisted ...82983852019-08-06 17:22:401891 days ago1565112160IN
0xC099567A...342C14C63
0 ETH0.0004640310
Add Whitelisted ...82970202019-08-06 12:15:351891 days ago1565093735IN
0xC099567A...342C14C63
0 ETH0.0004640310
Buy Tokens82927382019-08-05 20:18:591892 days ago1565036339IN
0xC099567A...342C14C63
2.24925 ETH0.000076691
Add Whitelisted ...82907072019-08-05 12:45:111892 days ago1565009111IN
0xC099567A...342C14C63
0 ETH0.0014080310
Buy Tokens82616632019-08-01 0:32:551897 days ago1564619575IN
0xC099567A...342C14C63
0.5 ETH0.0013754515
Add Whitelisted ...82613712019-07-31 23:27:481897 days ago1564615668IN
0xC099567A...342C14C63
0 ETH0.0004640310
Add Whitelisted ...82609912019-07-31 22:05:151897 days ago1564610715IN
0xC099567A...342C14C63
0 ETH0.0004640310
Add Whitelisted ...82608922019-07-31 21:41:161897 days ago1564609276IN
0xC099567A...342C14C63
0 ETH0.0007000310
Add Whitelisted ...82608742019-07-31 21:37:311897 days ago1564609051IN
0xC099567A...342C14C63
0 ETH0.0005121510
Add Whitelisted ...82608722019-07-31 21:36:391897 days ago1564608999IN
0xC099567A...342C14C63
0 ETH0.0021160310
Add Whitelisted ...82608432019-07-31 21:30:411897 days ago1564608641IN
0xC099567A...342C14C63
0 ETH0.0023718710
Add Whitelisted ...82608382019-07-31 21:29:011897 days ago1564608541IN
0xC099567A...342C14C63
0 ETH0.0023718710
Add Whitelisted ...82608312019-07-31 21:27:301897 days ago1564608450IN
0xC099567A...342C14C63
0 ETH0.0023718710
Add Whitelisted ...82608292019-07-31 21:27:191897 days ago1564608439IN
0xC099567A...342C14C63
0 ETH0.0025861110
Add Whitelisted ...82597862019-07-31 17:40:011897 days ago1564594801IN
0xC099567A...342C14C63
0 ETH0.000776023

Latest 6 internal transactions

Advanced mode:
Parent Transaction Hash Block From To
83062262019-08-07 22:26:061890 days ago1565216766
0xC099567A...342C14C63
0.5 ETH
83060952019-08-07 21:58:521890 days ago1565215132
0xC099567A...342C14C63
3 ETH
82999552019-08-06 23:11:511891 days ago1565133111
0xC099567A...342C14C63
1.25075 ETH
82927382019-08-05 20:18:591892 days ago1565036339
0xC099567A...342C14C63
2.24925 ETH
82616632019-08-01 0:32:551897 days ago1564619575
0xC099567A...342C14C63
0.5 ETH
82159572019-07-24 22:01:341904 days ago1564005694  Contract Creation0 ETH
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
AsureCrowdsale

Compiler Version
v0.5.10+commit.5a6ea5b1

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2019-07-25
*/

// File: openzeppelin-solidity/contracts/token/ERC20/IERC20.sol

pragma solidity ^0.5.0;

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
interface IERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);

    function transferFrom(address from, address to, uint256 value) external returns (bool);

    function totalSupply() external view returns (uint256);

    function balanceOf(address who) external view returns (uint256);

    function allowance(address owner, address spender) external view returns (uint256);

    event Transfer(address indexed from, address indexed to, uint256 value);

    event Approval(address indexed owner, address indexed spender, uint256 value);
}

// File: openzeppelin-solidity/contracts/math/SafeMath.sol

pragma solidity ^0.5.0;

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
    * @dev Multiplies two unsigned integers, reverts on overflow.
    */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
        // benefit is lost if 'b' is also tested.
        // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
        if (a == 0) {
            return 0;
        }

        uint256 c = a * b;
        require(c / a == b);

        return c;
    }

    /**
    * @dev Integer division of two unsigned integers truncating the quotient, reverts on division by zero.
    */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 0);
        uint256 c = a / b;
        // assert(a == b * c + a % b); // There is no case in which this doesn't hold

        return c;
    }

    /**
    * @dev Subtracts two unsigned integers, reverts on overflow (i.e. if subtrahend is greater than minuend).
    */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b <= a);
        uint256 c = a - b;

        return c;
    }

    /**
    * @dev Adds two unsigned integers, reverts on overflow.
    */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        uint256 c = a + b;
        require(c >= a);

        return c;
    }

    /**
    * @dev Divides two unsigned integers and returns the remainder (unsigned integer modulo),
    * reverts when dividing by zero.
    */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        require(b != 0);
        return a % b;
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

pragma solidity ^0.5.0;



/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md
 * Originally based on code by FirstBlood:
 * https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 *
 * This implementation emits additional Approval events, allowing applications to reconstruct the allowance status for
 * all accounts just by listening to said events. Note that this isn't required by the specification, and other
 * compliant implementations may not do it.
 */
contract ERC20 is IERC20 {
    using SafeMath for uint256;

    mapping (address => uint256) private _balances;

    mapping (address => mapping (address => uint256)) private _allowed;

    uint256 private _totalSupply;

    /**
    * @dev Total number of tokens in existence
    */
    function totalSupply() public view returns (uint256) {
        return _totalSupply;
    }

    /**
    * @dev Gets the balance of the specified address.
    * @param owner The address to query the balance of.
    * @return An uint256 representing the amount owned by the passed address.
    */
    function balanceOf(address owner) public view returns (uint256) {
        return _balances[owner];
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param owner address The address which owns the funds.
     * @param spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(address owner, address spender) public view returns (uint256) {
        return _allowed[owner][spender];
    }

    /**
    * @dev Transfer token for a specified address
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function transfer(address to, uint256 value) public returns (bool) {
        _transfer(msg.sender, to, value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param spender The address which will spend the funds.
     * @param value The amount of tokens to be spent.
     */
    function approve(address spender, uint256 value) public returns (bool) {
        require(spender != address(0));

        _allowed[msg.sender][spender] = value;
        emit Approval(msg.sender, spender, value);
        return true;
    }

    /**
     * @dev Transfer tokens from one address to another.
     * Note that while this function emits an Approval event, this is not required as per the specification,
     * and other compliant implementations may not emit the event.
     * @param from address The address which you want to send tokens from
     * @param to address The address which you want to transfer to
     * @param value uint256 the amount of tokens to be transferred
     */
    function transferFrom(address from, address to, uint256 value) public returns (bool) {
        _allowed[from][msg.sender] = _allowed[from][msg.sender].sub(value);
        _transfer(from, to, value);
        emit Approval(from, msg.sender, _allowed[from][msg.sender]);
        return true;
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param addedValue The amount of tokens to increase the allowance by.
     */
    function increaseAllowance(address spender, uint256 addedValue) public returns (bool) {
        require(spender != address(0));

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender].add(addedValue);
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed_[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * Emits an Approval event.
     * @param spender The address which will spend the funds.
     * @param subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseAllowance(address spender, uint256 subtractedValue) public returns (bool) {
        require(spender != address(0));

        _allowed[msg.sender][spender] = _allowed[msg.sender][spender].sub(subtractedValue);
        emit Approval(msg.sender, spender, _allowed[msg.sender][spender]);
        return true;
    }

    /**
    * @dev Transfer token for a specified addresses
    * @param from The address to transfer from.
    * @param to The address to transfer to.
    * @param value The amount to be transferred.
    */
    function _transfer(address from, address to, uint256 value) internal {
        require(to != address(0));

        _balances[from] = _balances[from].sub(value);
        _balances[to] = _balances[to].add(value);
        emit Transfer(from, to, value);
    }

    /**
     * @dev Internal function that mints an amount of the token and assigns it to
     * an account. This encapsulates the modification of balances such that the
     * proper events are emitted.
     * @param account The account that will receive the created tokens.
     * @param value The amount that will be created.
     */
    function _mint(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply.add(value);
        _balances[account] = _balances[account].add(value);
        emit Transfer(address(0), account, value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account.
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function _burn(address account, uint256 value) internal {
        require(account != address(0));

        _totalSupply = _totalSupply.sub(value);
        _balances[account] = _balances[account].sub(value);
        emit Transfer(account, address(0), value);
    }

    /**
     * @dev Internal function that burns an amount of the token of a given
     * account, deducting from the sender's allowance for said account. Uses the
     * internal burn function.
     * Emits an Approval event (reflecting the reduced allowance).
     * @param account The account whose tokens will be burnt.
     * @param value The amount that will be burnt.
     */
    function _burnFrom(address account, uint256 value) internal {
        _allowed[account][msg.sender] = _allowed[account][msg.sender].sub(value);
        _burn(account, value);
        emit Approval(account, msg.sender, _allowed[account][msg.sender]);
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol

pragma solidity ^0.5.0;


/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
contract ERC20Burnable is ERC20 {
    /**
     * @dev Burns a specific amount of tokens.
     * @param value The amount of token to be burned.
     */
    function burn(uint256 value) public {
        _burn(msg.sender, value);
    }

    /**
     * @dev Burns a specific amount of tokens from the target address and decrements allowance
     * @param from address The address which you want to send tokens from
     * @param value uint256 The amount of token to be burned
     */
    function burnFrom(address from, uint256 value) public {
        _burnFrom(from, value);
    }
}

// File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol

pragma solidity ^0.5.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using SafeMath for uint256;

    function safeTransfer(IERC20 token, address to, uint256 value) internal {
        require(token.transfer(to, value));
    }

    function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
        require(token.transferFrom(from, to, value));
    }

    function safeApprove(IERC20 token, address spender, uint256 value) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require((value == 0) || (token.allowance(address(this), spender) == 0));
        require(token.approve(spender, value));
    }

    function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).add(value);
        require(token.approve(spender, newAllowance));
    }

    function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
        uint256 newAllowance = token.allowance(address(this), spender).sub(value);
        require(token.approve(spender, newAllowance));
    }
}

// File: openzeppelin-solidity/contracts/utils/ReentrancyGuard.sol

pragma solidity ^0.5.0;

/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <remco@2π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {
    /// @dev counter to allow mutex lock with only one SSTORE operation
    uint256 private _guardCounter;

    constructor () internal {
        // The counter starts at one to prevent changing it from zero to a non-zero
        // value, which is a more expensive operation.
        _guardCounter = 1;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _guardCounter += 1;
        uint256 localCounter = _guardCounter;
        _;
        require(localCounter == _guardCounter);
    }
}

// File: openzeppelin-solidity/contracts/crowdsale/Crowdsale.sol

pragma solidity ^0.5.0;





/**
 * @title Crowdsale
 * @dev Crowdsale is a base contract for managing a token crowdsale,
 * allowing investors to purchase tokens with ether. This contract implements
 * such functionality in its most fundamental form and can be extended to provide additional
 * functionality and/or custom behavior.
 * The external interface represents the basic interface for purchasing tokens, and conform
 * the base architecture for crowdsales. They are *not* intended to be modified / overridden.
 * The internal interface conforms the extensible and modifiable surface of crowdsales. Override
 * the methods to add functionality. Consider using 'super' where appropriate to concatenate
 * behavior.
 */
contract Crowdsale is ReentrancyGuard {
    using SafeMath for uint256;
    using SafeERC20 for IERC20;

    // The token being sold
    IERC20 private _token;

    // Address where funds are collected
    address payable private _wallet;

    // How many token units a buyer gets per wei.
    // The rate is the conversion between wei and the smallest and indivisible token unit.
    // So, if you are using a rate of 1 with a ERC20Detailed token with 3 decimals called TOK
    // 1 wei will give you 1 unit, or 0.001 TOK.
    uint256 private _rate;

    // Amount of wei raised
    uint256 private _weiRaised;

    /**
     * Event for token purchase logging
     * @param purchaser who paid for the tokens
     * @param beneficiary who got the tokens
     * @param value weis paid for purchase
     * @param amount amount of tokens purchased
     */
    event TokensPurchased(address indexed purchaser, address indexed beneficiary, uint256 value, uint256 amount);

    /**
     * @param rate Number of token units a buyer gets per wei
     * @dev The rate is the conversion between wei and the smallest and indivisible
     * token unit. So, if you are using a rate of 1 with a ERC20Detailed token
     * with 3 decimals called TOK, 1 wei will give you 1 unit, or 0.001 TOK.
     * @param wallet Address where collected funds will be forwarded to
     * @param token Address of the token being sold
     */
    constructor (uint256 rate, address payable wallet, IERC20 token) public {
        require(rate > 0);
        require(wallet != address(0));
        require(address(token) != address(0));

        _rate = rate;
        _wallet = wallet;
        _token = token;
    }

    /**
     * @dev fallback function ***DO NOT OVERRIDE***
     * Note that other contracts will transfer fund with a base gas stipend
     * of 2300, which is not enough to call buyTokens. Consider calling
     * buyTokens directly when purchasing tokens from a contract.
     */
    function () external payable {
        buyTokens(msg.sender);
    }

    /**
     * @return the token being sold.
     */
    function token() public view returns (IERC20) {
        return _token;
    }

    /**
     * @return the address where funds are collected.
     */
    function wallet() public view returns (address payable) {
        return _wallet;
    }

    /**
     * @return the number of token units a buyer gets per wei.
     */
    function rate() public view returns (uint256) {
        return _rate;
    }

    /**
     * @return the amount of wei raised.
     */
    function weiRaised() public view returns (uint256) {
        return _weiRaised;
    }

    /**
     * @dev low level token purchase ***DO NOT OVERRIDE***
     * This function has a non-reentrancy guard, so it shouldn't be called by
     * another `nonReentrant` function.
     * @param beneficiary Recipient of the token purchase
     */
    function buyTokens(address beneficiary) public nonReentrant payable {
        uint256 weiAmount = msg.value;
        _preValidatePurchase(beneficiary, weiAmount);

        // calculate token amount to be created
        uint256 tokens = _getTokenAmount(weiAmount);

        // update state
        _weiRaised = _weiRaised.add(weiAmount);

        _processPurchase(beneficiary, tokens);
        emit TokensPurchased(msg.sender, beneficiary, weiAmount, tokens);

        _updatePurchasingState(beneficiary, weiAmount);

        _forwardFunds();
        _postValidatePurchase(beneficiary, weiAmount);
    }

    /**
     * @dev Validation of an incoming purchase. Use require statements to revert state when conditions are not met.
     * Use `super` in contracts that inherit from Crowdsale to extend their validations.
     * Example from CappedCrowdsale.sol's _preValidatePurchase method:
     *     super._preValidatePurchase(beneficiary, weiAmount);
     *     require(weiRaised().add(weiAmount) <= cap);
     * @param beneficiary Address performing the token purchase
     * @param weiAmount Value in wei involved in the purchase
     */
    function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view {
        require(beneficiary != address(0));
        require(weiAmount != 0);
    }

    /**
     * @dev Validation of an executed purchase. Observe state and use revert statements to undo rollback when valid
     * conditions are not met.
     * @param beneficiary Address performing the token purchase
     * @param weiAmount Value in wei involved in the purchase
     */
    function _postValidatePurchase(address beneficiary, uint256 weiAmount) internal view {
        // solhint-disable-previous-line no-empty-blocks
    }

    /**
     * @dev Source of tokens. Override this method to modify the way in which the crowdsale ultimately gets and sends
     * its tokens.
     * @param beneficiary Address performing the token purchase
     * @param tokenAmount Number of tokens to be emitted
     */
    function _deliverTokens(address beneficiary, uint256 tokenAmount) internal {
        _token.safeTransfer(beneficiary, tokenAmount);
    }

    /**
     * @dev Executed when a purchase has been validated and is ready to be executed. Doesn't necessarily emit/send
     * tokens.
     * @param beneficiary Address receiving the tokens
     * @param tokenAmount Number of tokens to be purchased
     */
    function _processPurchase(address beneficiary, uint256 tokenAmount) internal {
        _deliverTokens(beneficiary, tokenAmount);
    }

    /**
     * @dev Override for extensions that require an internal state to check for validity (current user contributions,
     * etc.)
     * @param beneficiary Address receiving the tokens
     * @param weiAmount Value in wei involved in the purchase
     */
    function _updatePurchasingState(address beneficiary, uint256 weiAmount) internal {
        // solhint-disable-previous-line no-empty-blocks
    }

    /**
     * @dev Override to extend the way in which ether is converted to tokens.
     * @param weiAmount Value in wei to be converted into tokens
     * @return Number of tokens that can be purchased with the specified _weiAmount
     */
    function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) {
        return weiAmount.mul(_rate);
    }

    /**
     * @dev Determines how ETH is stored/forwarded on purchases.
     */
    function _forwardFunds() internal {
        _wallet.transfer(msg.value);
    }
}

// File: openzeppelin-solidity/contracts/crowdsale/validation/TimedCrowdsale.sol

pragma solidity ^0.5.0;



/**
 * @title TimedCrowdsale
 * @dev Crowdsale accepting contributions only within a time frame.
 */
contract TimedCrowdsale is Crowdsale {
    using SafeMath for uint256;

    uint256 private _openingTime;
    uint256 private _closingTime;

    /**
     * @dev Reverts if not in crowdsale time range.
     */
    modifier onlyWhileOpen {
        require(isOpen());
        _;
    }

    /**
     * @dev Constructor, takes crowdsale opening and closing times.
     * @param openingTime Crowdsale opening time
     * @param closingTime Crowdsale closing time
     */
    constructor (uint256 openingTime, uint256 closingTime) public {
        // solhint-disable-next-line not-rely-on-time
        require(openingTime >= block.timestamp);
        require(closingTime > openingTime);

        _openingTime = openingTime;
        _closingTime = closingTime;
    }

    /**
     * @return the crowdsale opening time.
     */
    function openingTime() public view returns (uint256) {
        return _openingTime;
    }

    /**
     * @return the crowdsale closing time.
     */
    function closingTime() public view returns (uint256) {
        return _closingTime;
    }

    /**
     * @return true if the crowdsale is open, false otherwise.
     */
    function isOpen() public view returns (bool) {
        // solhint-disable-next-line not-rely-on-time
        return block.timestamp >= _openingTime && block.timestamp <= _closingTime;
    }

    /**
     * @dev Checks whether the period in which the crowdsale is open has already elapsed.
     * @return Whether crowdsale period has elapsed
     */
    function hasClosed() public view returns (bool) {
        // solhint-disable-next-line not-rely-on-time
        return block.timestamp > _closingTime;
    }

    /**
     * @dev Extend parent behavior requiring to be within contributing period
     * @param beneficiary Token purchaser
     * @param weiAmount Amount of wei contributed
     */
    function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal onlyWhileOpen view {
        super._preValidatePurchase(beneficiary, weiAmount);
    }
}

// File: openzeppelin-solidity/contracts/access/Roles.sol

pragma solidity ^0.5.0;

/**
 * @title Roles
 * @dev Library for managing addresses assigned to a Role.
 */
library Roles {
    struct Role {
        mapping (address => bool) bearer;
    }

    /**
     * @dev give an account access to this role
     */
    function add(Role storage role, address account) internal {
        require(account != address(0));
        require(!has(role, account));

        role.bearer[account] = true;
    }

    /**
     * @dev remove an account's access to this role
     */
    function remove(Role storage role, address account) internal {
        require(account != address(0));
        require(has(role, account));

        role.bearer[account] = false;
    }

    /**
     * @dev check if an account has this role
     * @return bool
     */
    function has(Role storage role, address account) internal view returns (bool) {
        require(account != address(0));
        return role.bearer[account];
    }
}

// File: openzeppelin-solidity/contracts/access/roles/WhitelistAdminRole.sol

pragma solidity ^0.5.0;


/**
 * @title WhitelistAdminRole
 * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts.
 */
contract WhitelistAdminRole {
    using Roles for Roles.Role;

    event WhitelistAdminAdded(address indexed account);
    event WhitelistAdminRemoved(address indexed account);

    Roles.Role private _whitelistAdmins;

    constructor () internal {
        _addWhitelistAdmin(msg.sender);
    }

    modifier onlyWhitelistAdmin() {
        require(isWhitelistAdmin(msg.sender));
        _;
    }

    function isWhitelistAdmin(address account) public view returns (bool) {
        return _whitelistAdmins.has(account);
    }

    function addWhitelistAdmin(address account) public onlyWhitelistAdmin {
        _addWhitelistAdmin(account);
    }

    function renounceWhitelistAdmin() public {
        _removeWhitelistAdmin(msg.sender);
    }

    function _addWhitelistAdmin(address account) internal {
        _whitelistAdmins.add(account);
        emit WhitelistAdminAdded(account);
    }

    function _removeWhitelistAdmin(address account) internal {
        _whitelistAdmins.remove(account);
        emit WhitelistAdminRemoved(account);
    }
}

// File: openzeppelin-solidity/contracts/access/roles/WhitelistedRole.sol

pragma solidity ^0.5.0;



/**
 * @title WhitelistedRole
 * @dev Whitelisted accounts have been approved by a WhitelistAdmin to perform certain actions (e.g. participate in a
 * crowdsale). This role is special in that the only accounts that can add it are WhitelistAdmins (who can also remove
 * it), and not Whitelisteds themselves.
 */
contract WhitelistedRole is WhitelistAdminRole {
    using Roles for Roles.Role;

    event WhitelistedAdded(address indexed account);
    event WhitelistedRemoved(address indexed account);

    Roles.Role private _whitelisteds;

    modifier onlyWhitelisted() {
        require(isWhitelisted(msg.sender));
        _;
    }

    function isWhitelisted(address account) public view returns (bool) {
        return _whitelisteds.has(account);
    }

    function addWhitelisted(address account) public onlyWhitelistAdmin {
        _addWhitelisted(account);
    }

    function removeWhitelisted(address account) public onlyWhitelistAdmin {
        _removeWhitelisted(account);
    }

    function renounceWhitelisted() public {
        _removeWhitelisted(msg.sender);
    }

    function _addWhitelisted(address account) internal {
        _whitelisteds.add(account);
        emit WhitelistedAdded(account);
    }

    function _removeWhitelisted(address account) internal {
        _whitelisteds.remove(account);
        emit WhitelistedRemoved(account);
    }
}

// File: openzeppelin-solidity/contracts/crowdsale/validation/WhitelistCrowdsale.sol

pragma solidity ^0.5.0;




/**
 * @title WhitelistCrowdsale
 * @dev Crowdsale in which only whitelisted users can contribute.
 */
contract WhitelistCrowdsale is WhitelistedRole, Crowdsale {
    /**
    * @dev Extend parent behavior requiring beneficiary to be whitelisted. Note that no
    * restriction is imposed on the account sending the transaction.
    * @param _beneficiary Token beneficiary
    * @param _weiAmount Amount of wei contributed
    */
    function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal view {
        require(isWhitelisted(_beneficiary));
        super._preValidatePurchase(_beneficiary, _weiAmount);
    }
}

// File: openzeppelin-solidity/contracts/crowdsale/validation/CappedCrowdsale.sol

pragma solidity ^0.5.0;



/**
 * @title CappedCrowdsale
 * @dev Crowdsale with a limit for total contributions.
 */
contract CappedCrowdsale is Crowdsale {
    using SafeMath for uint256;

    uint256 private _cap;

    /**
     * @dev Constructor, takes maximum amount of wei accepted in the crowdsale.
     * @param cap Max amount of wei to be contributed
     */
    constructor (uint256 cap) public {
        require(cap > 0);
        _cap = cap;
    }

    /**
     * @return the cap of the crowdsale.
     */
    function cap() public view returns (uint256) {
        return _cap;
    }

    /**
     * @dev Checks whether the cap has been reached.
     * @return Whether the cap was reached
     */
    function capReached() public view returns (bool) {
        return weiRaised() >= _cap;
    }

    /**
     * @dev Extend parent behavior requiring purchase to respect the funding cap.
     * @param beneficiary Token purchaser
     * @param weiAmount Amount of wei contributed
     */
    function _preValidatePurchase(address beneficiary, uint256 weiAmount) internal view {
        super._preValidatePurchase(beneficiary, weiAmount);
        require(weiRaised().add(weiAmount) <= _cap);
    }
}

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

pragma solidity ^0.5.0;

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev The Ownable constructor sets the original `owner` of the contract to the sender
     * account.
     */
    constructor () internal {
        _owner = msg.sender;
        emit OwnershipTransferred(address(0), _owner);
    }

    /**
     * @return the address of the owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(isOwner());
        _;
    }

    /**
     * @return true if `msg.sender` is the owner of the contract.
     */
    function isOwner() public view returns (bool) {
        return msg.sender == _owner;
    }

    /**
     * @dev Allows the current owner to relinquish control of the contract.
     * @notice Renouncing to ownership will leave the contract without an owner.
     * It will not be possible to call the functions with the `onlyOwner`
     * modifier anymore.
     */
    function renounceOwnership() public onlyOwner {
        emit OwnershipTransferred(_owner, address(0));
        _owner = address(0);
    }

    /**
     * @dev Allows the current owner to transfer control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function transferOwnership(address newOwner) public onlyOwner {
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers control of the contract to a newOwner.
     * @param newOwner The address to transfer ownership to.
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0));
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

// File: contracts/AsureBonusesCrowdsale.sol

pragma solidity ^0.5.0;









/**
 * @title AsureBonusesCrowdsale,
 * @dev Crowdsale with bonus rate which will be lowered to default rate after
 * bonus time is reached.
 */
contract AsureBonusesCrowdsale is TimedCrowdsale, Ownable {
  using SafeMath for uint256;
  uint256 private _bonusRate;
  uint256 private _bonusTime;
  uint256 private _defaultRate;

  event RatesUpdated(uint256 bonusRate, uint256 bonusTime, uint256 defaultRate);

  /**
   * @dev Constructor, takes initial and bonus rates of tokens received per wei contributed.
   * @param bonusRate Number of token units a buyer gets per wei before bonus time
   * @param bonusTime The crowdsale bonus time in unix epoch seconds
   * @param defaultRate Number of token units a buyer gets per wei after the bonus time
   * @param owner of the crowdsale
   */
  constructor (uint256 bonusRate, uint256 bonusTime, uint256 defaultRate, address owner) public
  {
    updateRates(bonusRate, bonusTime, defaultRate);
    transferOwnership(owner);
  }

  /**
   * The base rate function is overridden to revert, since this crowdsale doesn't use it, and
   * all calls to it are a mistake.
   */
  function rate() public view returns (uint256) {
    revert();
  }

  /**
   * @return the number of token units a buyer gets per wei before the bonus time.
   */
  function bonusRate() public view returns (uint256) {
    return _bonusRate;
  }

  /**
   * @return the crowdsale bonus time in unix epoch seconds.
   */
  function bonusTime() public view returns (uint256) {
    return _bonusTime;
  }

  /**
   * @return the number of token units a buyer gets per wei after the bonus time.
   */
  function defaultRate() public view returns (uint256) {
    return _defaultRate;
  }

  /**
   * @dev Owner can update bonus rate, bonus time, and default rate before crowdsale opened.
   * @param newBonusRate Number of token units a buyer gets per wei before bonus time
   * @param newBonusTime The crowdsale bonus time in unix epoch seconds
   * @param newDefaultRate Number of token units a buyer gets per wei after the bonus time
   */
  function updateRates(uint256 newBonusRate, uint256 newBonusTime, uint256 newDefaultRate) public onlyOwner {
    require(!isOpen() && !hasClosed());
    require(newBonusRate > 0);
    require(newBonusTime >= openingTime() && newBonusTime < closingTime());
    require(newDefaultRate > 0);

    _bonusRate = newBonusRate;
    _bonusTime = newBonusTime;
    _defaultRate = newDefaultRate;

    emit RatesUpdated(_bonusRate, _bonusTime, _defaultRate);
  }

  /**
   * @dev Returns the rate of tokens per wei at the present time.
   * Note that, rate can be changed by the owner until the crowdsale is open.
   * @return The number of tokens a buyer gets per wei at a given time
   */
  function getCurrentRate() public view returns (uint256) {
    if (!isOpen()) {
      return 0;
    }

    if (block.timestamp <= _bonusTime) {
      return _bonusRate;
    }

    return _defaultRate;
  }

  /**
   * @dev Overrides parent method taking into account variable rate.
   * @param weiAmount The value in wei to be converted into tokens
   * @return The number of tokens _weiAmount wei will buy at present time
   */
  function _getTokenAmount(uint256 weiAmount) internal view returns (uint256) {
    uint256 currentRate = getCurrentRate();
    return currentRate.mul(weiAmount);
  }
}

// File: contracts/AsureCrowdsale.sol

pragma solidity ^0.5.0;









contract AsureCrowdsale is Crowdsale, TimedCrowdsale, WhitelistCrowdsale, AsureBonusesCrowdsale {
  using SafeERC20 for ERC20;

  uint256 private constant PURCHASE_MINIMUM_AMOUNT_WEI = 5 * 10 ** 17;  // 0.5 ETH

  constructor(
    uint256 bonusRate,
    uint256 bonusTime,
    uint256 defaultRate,
    address owner,
    address payable wallet,
    IERC20 token,
    uint256 openingTime,
    uint256 closingTime
  )
  public
  Crowdsale(1, wallet, token)
  TimedCrowdsale(openingTime, closingTime)
  AsureBonusesCrowdsale(bonusRate, bonusTime, defaultRate, owner)
  {
    if (!isWhitelistAdmin(owner)) {
      addWhitelistAdmin(owner);
    }
  }

  function addWhitelistedAccounts(address[] memory accounts) public onlyWhitelistAdmin {
    for (uint i = 0; i < accounts.length; i++) {
      _addWhitelisted(accounts[i]);
    }
  }

  function burn() public {
    require(hasClosed());
    ERC20Burnable burnableToken = ERC20Burnable(address(token()));
    burnableToken.burn(burnableToken.balanceOf(address(this)));
  }

  /**
    * @dev Transfer tokens originally intended to be sold as part of this crowdsale to an IEO.
    * @param to Token beneficiary
    * @param value Amount of wei to transfer
    */
  function transferToIEO(address to, uint256 value) onlyOwner public {
    require(!hasClosed());
    token().safeTransfer(to, value);
  }

  /**
    * @dev Extend parent behavior requiring a minimum contribution of 0.5 ETH.
    * @param _beneficiary Token beneficiary
    * @param _weiAmount Amount of wei contributed
    */
  function _preValidatePurchase(address _beneficiary, uint256 _weiAmount) internal view {
    require(_weiAmount >= PURCHASE_MINIMUM_AMOUNT_WEI);
    super._preValidatePurchase(_beneficiary, _weiAmount);
  }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"hasClosed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"removeWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"accounts","type":"address[]"}],"name":"addWhitelistedAccounts","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"weiRaised","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isOpen","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"closingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"wallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"openingTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"bonusTime","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"to","type":"address"},{"name":"value","type":"uint256"}],"name":"transferToIEO","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"newBonusRate","type":"uint256"},{"name":"newBonusTime","type":"uint256"},{"name":"newDefaultRate","type":"uint256"}],"name":"updateRates","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"beneficiary","type":"address"}],"name":"buyTokens","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentRate","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"token","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"bonusRate","type":"uint256"},{"name":"bonusTime","type":"uint256"},{"name":"defaultRate","type":"uint256"},{"name":"owner","type":"address"},{"name":"wallet","type":"address"},{"name":"token","type":"address"},{"name":"openingTime","type":"uint256"},{"name":"closingTime","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":false,"name":"bonusRate","type":"uint256"},{"indexed":false,"name":"bonusTime","type":"uint256"},{"indexed":false,"name":"defaultRate","type":"uint256"}],"name":"RatesUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"purchaser","type":"address"},{"indexed":true,"name":"beneficiary","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"TokensPurchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"WhitelistedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"WhitelistedRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"}]

60806040523480156200001157600080fd5b5060405162001ec538038062001ec583398181016040526101008110156200003857600080fd5b81019080805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919080519060200190929190805190602001909291908051906020019092919050505087878787858560018a8a620000aa336200030960201b60201c565b600160028190555060008311620000c057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620000fb57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200013657600080fd5b8260058190555081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505042821015620001d057600080fd5b818111620001dd57600080fd5b8160078190555080600881905550505033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3620002be8484846200036a60201b60201c565b620002cf816200047460201b60201c565b50505050620002e485620004a260201b60201c565b620002fb57620002fa85620004c660201b60201c565b5b5050505050505050620007cd565b62000324816000620004f560201b620014f11790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b6200037a620005ab60201b60201c565b6200038457600080fd5b620003946200060360201b60201c565b158015620003af5750620003ad6200061f60201b60201c565b155b620003b957600080fd5b60008311620003c757600080fd5b620003d76200062b60201b60201c565b8210158015620003f55750620003f26200063560201b60201c565b82105b620003ff57600080fd5b600081116200040d57600080fd5b82600a8190555081600b8190555080600c819055507f023010bc68e7f4c0be9887f513c570c7a0f5f511b9716abccd42bf3b8943532b600a54600b54600c5460405180848152602001838152602001828152602001935050505060405180910390a1505050565b62000484620005ab60201b60201c565b6200048e57600080fd5b6200049f816200063f60201b60201c565b50565b6000620004bf8260006200073a60201b620011361790919060201c565b9050919050565b620004d733620004a260201b60201c565b620004e157600080fd5b620004f2816200030960201b60201c565b50565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200053057600080fd5b6200054282826200073a60201b60201c565b156200054d57600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b600060075442101580156200061a57506008544211155b905090565b60006008544211905090565b6000600754905090565b6000600854905090565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156200067a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200077657600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116e880620007dd6000396000f3fe6080604052600436106101b75760003560e01c8063715018a6116100ec578063bb5f747b1161008a578063ec8ac4d811610064578063ec8ac4d8146107ba578063f2fde38b146107fe578063f7fb07b01461084f578063fc0c546a1461087a576101b7565b8063bb5f747b146106eb578063c0f3622c14610754578063d6cd9473146107a3576101b7565b80638f32d59b116100c65780638f32d59b1461060b578063b7a8807c1461063a578063b82a0ce814610665578063b8d9141614610690576101b7565b8063715018a61461054c5780637362d9c8146105635780638da5cb5b146105b4576101b7565b80634042b66f116101595780634b6753bc116101335780634b6753bc146104885780634c5a628c146104b3578063521eb273146104ca5780635af123f414610521576101b7565b80634042b66f1461041757806344df8e701461044257806347535d7b14610459576101b7565b8063291d954911610195578063291d95491461026d5780632a4bc321146102be5780632c4e722e146103835780633af32abf146103ae576101b7565b806310154bad146101c25780631515bc2b146102135780632616501d14610242575b6101c0336108d1565b005b3480156101ce57600080fd5b50610211600480360360208110156101e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c7565b005b34801561021f57600080fd5b506102286109e5565b604051808215151515815260200191505060405180910390f35b34801561024e57600080fd5b506102576109f1565b6040518082815260200191505060405180910390f35b34801561027957600080fd5b506102bc6004803603602081101561029057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109fb565b005b3480156102ca57600080fd5b50610381600480360360208110156102e157600080fd5b81019080803590602001906401000000008111156102fe57600080fd5b82018360208201111561031057600080fd5b8035906020019184602083028401116401000000008311171561033257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610a19565b005b34801561038f57600080fd5b50610398610a67565b6040518082815260200191505060405180910390f35b3480156103ba57600080fd5b506103fd600480360360208110156103d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a6e565b604051808215151515815260200191505060405180910390f35b34801561042357600080fd5b5061042c610a8b565b6040518082815260200191505060405180910390f35b34801561044e57600080fd5b50610457610a95565b005b34801561046557600080fd5b5061046e610bd7565b604051808215151515815260200191505060405180910390f35b34801561049457600080fd5b5061049d610bf2565b6040518082815260200191505060405180910390f35b3480156104bf57600080fd5b506104c8610bfc565b005b3480156104d657600080fd5b506104df610c07565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561052d57600080fd5b50610536610c31565b6040518082815260200191505060405180910390f35b34801561055857600080fd5b50610561610c3b565b005b34801561056f57600080fd5b506105b26004803603602081101561058657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d0d565b005b3480156105c057600080fd5b506105c9610d2b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561061757600080fd5b50610620610d55565b604051808215151515815260200191505060405180910390f35b34801561064657600080fd5b5061064f610dad565b6040518082815260200191505060405180910390f35b34801561067157600080fd5b5061067a610db7565b6040518082815260200191505060405180910390f35b34801561069c57600080fd5b506106e9600480360360408110156106b357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dc1565b005b3480156106f757600080fd5b5061073a6004803603602081101561070e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e1a565b604051808215151515815260200191505060405180910390f35b34801561076057600080fd5b506107a16004803603606081101561077757600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610e37565b005b3480156107af57600080fd5b506107b8610f12565b005b6107fc600480360360208110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108d1565b005b34801561080a57600080fd5b5061084d6004803603602081101561082157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f1d565b005b34801561085b57600080fd5b50610864610f3a565b6040518082815260200191505060405180910390f35b34801561088657600080fd5b5061088f610f6d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60016002600082825401925050819055506000600254905060003490506108f88382610f97565b600061090382610fba565b905061091a82600654610fe290919063ffffffff16565b60068190555061092a8482611001565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a36109a1848361100f565b6109a9611013565b6109b3848361107e565b505060025481146109c357600080fd5b5050565b6109d033610e1a565b6109d957600080fd5b6109e281611082565b50565b60006008544211905090565b6000600c54905090565b610a0433610e1a565b610a0d57600080fd5b610a16816110dc565b50565b610a2233610e1a565b610a2b57600080fd5b60008090505b8151811015610a6357610a56828281518110610a4957fe5b6020026020010151611082565b8080600101915050610a31565b5050565b6000806000fd5b6000610a8482600161113690919063ffffffff16565b9050919050565b6000600654905090565b610a9d6109e5565b610aa657600080fd5b6000610ab0610f6d565b90508073ffffffffffffffffffffffffffffffffffffffff166342966c688273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b4b57600080fd5b505afa158015610b5f573d6000803e3d6000fd5b505050506040513d6020811015610b7557600080fd5b81019080805190602001909291905050506040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610bbc57600080fd5b505af1158015610bd0573d6000803e3d6000fd5b5050505050565b60006007544210158015610bed57506008544211155b905090565b6000600854905090565b610c05336111c8565b565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a54905090565b610c43610d55565b610c4c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610d1633610e1a565b610d1f57600080fd5b610d2881611222565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600754905090565b6000600b54905090565b610dc9610d55565b610dd257600080fd5b610dda6109e5565b15610de457600080fd5b610e168282610df1610f6d565b73ffffffffffffffffffffffffffffffffffffffff1661127c9092919063ffffffff16565b5050565b6000610e3082600061113690919063ffffffff16565b9050919050565b610e3f610d55565b610e4857600080fd5b610e50610bd7565b158015610e625750610e606109e5565b155b610e6b57600080fd5b60008311610e7857600080fd5b610e80610dad565b8210158015610e955750610e92610bf2565b82105b610e9e57600080fd5b60008111610eab57600080fd5b82600a8190555081600b8190555080600c819055507f023010bc68e7f4c0be9887f513c570c7a0f5f511b9716abccd42bf3b8943532b600a54600b54600c5460405180848152602001838152602001828152602001935050505060405180910390a1505050565b610f1b336110dc565b565b610f25610d55565b610f2e57600080fd5b610f378161134c565b50565b6000610f44610bd7565b610f515760009050610f6a565b600b544211610f6457600a549050610f6a565b600c5490505b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6706f05b59d3b20000811015610fac57600080fd5b610fb68282611446565b5050565b600080610fc5610f3a565b9050610fda838261146690919063ffffffff16565b915050919050565b600080828401905083811015610ff757600080fd5b8091505092915050565b61100b82826114a0565b5050565b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561107b573d6000803e3d6000fd5b50565b5050565b6110968160016114f190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f60405160405180910390a250565b6110f081600161159d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b660405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561117157600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111dc81600061159d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b6112368160006114f190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561130357600080fd5b505af1158015611317573d6000803e3d6000fd5b505050506040513d602081101561132d57600080fd5b810190808051906020019092919050505061134757600080fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561138657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61144f82610a6e565b61145857600080fd5b6114628282611648565b5050565b600080831415611479576000905061149a565b600082840290508284828161148a57fe5b041461149557600080fd5b809150505b92915050565b6114ed8282600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661127c9092919063ffffffff16565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561152b57600080fd5b6115358282611136565b1561153f57600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115d757600080fd5b6115e18282611136565b6115ea57600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611650610bd7565b61165957600080fd5b6116638282611667565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116a157600080fd5b60008114156116af57600080fd5b505056fea265627a7a72305820e145afcd98bdc57d77227fd4188facc5bb6fe87280b4fb59a566178262e85fbf64736f6c634300050a00320000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000005d4b6600000000000000000000000000000000000000000000000000000000000000010b000000000000000000000000bb6194fbfc974d848722dcab1ef990dc4738df32000000000000000000000000cbbc3d3d381f3a9a48cbae9ca701ac3c92e0aea500000000000000000000000015dfc197e7ac7d81a07250b5bdebaa96fc1c5dfa000000000000000000000000000000000000000000000000000000005d422b80000000000000000000000000000000000000000000000000000000005d54a080

Deployed Bytecode

0x6080604052600436106101b75760003560e01c8063715018a6116100ec578063bb5f747b1161008a578063ec8ac4d811610064578063ec8ac4d8146107ba578063f2fde38b146107fe578063f7fb07b01461084f578063fc0c546a1461087a576101b7565b8063bb5f747b146106eb578063c0f3622c14610754578063d6cd9473146107a3576101b7565b80638f32d59b116100c65780638f32d59b1461060b578063b7a8807c1461063a578063b82a0ce814610665578063b8d9141614610690576101b7565b8063715018a61461054c5780637362d9c8146105635780638da5cb5b146105b4576101b7565b80634042b66f116101595780634b6753bc116101335780634b6753bc146104885780634c5a628c146104b3578063521eb273146104ca5780635af123f414610521576101b7565b80634042b66f1461041757806344df8e701461044257806347535d7b14610459576101b7565b8063291d954911610195578063291d95491461026d5780632a4bc321146102be5780632c4e722e146103835780633af32abf146103ae576101b7565b806310154bad146101c25780631515bc2b146102135780632616501d14610242575b6101c0336108d1565b005b3480156101ce57600080fd5b50610211600480360360208110156101e557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109c7565b005b34801561021f57600080fd5b506102286109e5565b604051808215151515815260200191505060405180910390f35b34801561024e57600080fd5b506102576109f1565b6040518082815260200191505060405180910390f35b34801561027957600080fd5b506102bc6004803603602081101561029057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506109fb565b005b3480156102ca57600080fd5b50610381600480360360208110156102e157600080fd5b81019080803590602001906401000000008111156102fe57600080fd5b82018360208201111561031057600080fd5b8035906020019184602083028401116401000000008311171561033257600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f820116905080830192505050505050509192919290505050610a19565b005b34801561038f57600080fd5b50610398610a67565b6040518082815260200191505060405180910390f35b3480156103ba57600080fd5b506103fd600480360360208110156103d157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a6e565b604051808215151515815260200191505060405180910390f35b34801561042357600080fd5b5061042c610a8b565b6040518082815260200191505060405180910390f35b34801561044e57600080fd5b50610457610a95565b005b34801561046557600080fd5b5061046e610bd7565b604051808215151515815260200191505060405180910390f35b34801561049457600080fd5b5061049d610bf2565b6040518082815260200191505060405180910390f35b3480156104bf57600080fd5b506104c8610bfc565b005b3480156104d657600080fd5b506104df610c07565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561052d57600080fd5b50610536610c31565b6040518082815260200191505060405180910390f35b34801561055857600080fd5b50610561610c3b565b005b34801561056f57600080fd5b506105b26004803603602081101561058657600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610d0d565b005b3480156105c057600080fd5b506105c9610d2b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561061757600080fd5b50610620610d55565b604051808215151515815260200191505060405180910390f35b34801561064657600080fd5b5061064f610dad565b6040518082815260200191505060405180910390f35b34801561067157600080fd5b5061067a610db7565b6040518082815260200191505060405180910390f35b34801561069c57600080fd5b506106e9600480360360408110156106b357600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dc1565b005b3480156106f757600080fd5b5061073a6004803603602081101561070e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610e1a565b604051808215151515815260200191505060405180910390f35b34801561076057600080fd5b506107a16004803603606081101561077757600080fd5b81019080803590602001909291908035906020019092919080359060200190929190505050610e37565b005b3480156107af57600080fd5b506107b8610f12565b005b6107fc600480360360208110156107d057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506108d1565b005b34801561080a57600080fd5b5061084d6004803603602081101561082157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610f1d565b005b34801561085b57600080fd5b50610864610f3a565b6040518082815260200191505060405180910390f35b34801561088657600080fd5b5061088f610f6d565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b60016002600082825401925050819055506000600254905060003490506108f88382610f97565b600061090382610fba565b905061091a82600654610fe290919063ffffffff16565b60068190555061092a8482611001565b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f6faf93231a456e552dbc9961f58d9713ee4f2e69d15f1975b050ef0911053a7b8484604051808381526020018281526020019250505060405180910390a36109a1848361100f565b6109a9611013565b6109b3848361107e565b505060025481146109c357600080fd5b5050565b6109d033610e1a565b6109d957600080fd5b6109e281611082565b50565b60006008544211905090565b6000600c54905090565b610a0433610e1a565b610a0d57600080fd5b610a16816110dc565b50565b610a2233610e1a565b610a2b57600080fd5b60008090505b8151811015610a6357610a56828281518110610a4957fe5b6020026020010151611082565b8080600101915050610a31565b5050565b6000806000fd5b6000610a8482600161113690919063ffffffff16565b9050919050565b6000600654905090565b610a9d6109e5565b610aa657600080fd5b6000610ab0610f6d565b90508073ffffffffffffffffffffffffffffffffffffffff166342966c688273ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060206040518083038186803b158015610b4b57600080fd5b505afa158015610b5f573d6000803e3d6000fd5b505050506040513d6020811015610b7557600080fd5b81019080805190602001909291905050506040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610bbc57600080fd5b505af1158015610bd0573d6000803e3d6000fd5b5050505050565b60006007544210158015610bed57506008544211155b905090565b6000600854905090565b610c05336111c8565b565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600a54905090565b610c43610d55565b610c4c57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610d1633610e1a565b610d1f57600080fd5b610d2881611222565b50565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000600754905090565b6000600b54905090565b610dc9610d55565b610dd257600080fd5b610dda6109e5565b15610de457600080fd5b610e168282610df1610f6d565b73ffffffffffffffffffffffffffffffffffffffff1661127c9092919063ffffffff16565b5050565b6000610e3082600061113690919063ffffffff16565b9050919050565b610e3f610d55565b610e4857600080fd5b610e50610bd7565b158015610e625750610e606109e5565b155b610e6b57600080fd5b60008311610e7857600080fd5b610e80610dad565b8210158015610e955750610e92610bf2565b82105b610e9e57600080fd5b60008111610eab57600080fd5b82600a8190555081600b8190555080600c819055507f023010bc68e7f4c0be9887f513c570c7a0f5f511b9716abccd42bf3b8943532b600a54600b54600c5460405180848152602001838152602001828152602001935050505060405180910390a1505050565b610f1b336110dc565b565b610f25610d55565b610f2e57600080fd5b610f378161134c565b50565b6000610f44610bd7565b610f515760009050610f6a565b600b544211610f6457600a549050610f6a565b600c5490505b90565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6706f05b59d3b20000811015610fac57600080fd5b610fb68282611446565b5050565b600080610fc5610f3a565b9050610fda838261146690919063ffffffff16565b915050919050565b600080828401905083811015610ff757600080fd5b8091505092915050565b61100b82826114a0565b5050565b5050565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561107b573d6000803e3d6000fd5b50565b5050565b6110968160016114f190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f60405160405180910390a250565b6110f081600161159d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b660405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561117157600080fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111dc81600061159d90919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b6112368160006114f190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b8273ffffffffffffffffffffffffffffffffffffffff1663a9059cbb83836040518363ffffffff1660e01b8152600401808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200182815260200192505050602060405180830381600087803b15801561130357600080fd5b505af1158015611317573d6000803e3d6000fd5b505050506040513d602081101561132d57600080fd5b810190808051906020019092919050505061134757600080fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561138657600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61144f82610a6e565b61145857600080fd5b6114628282611648565b5050565b600080831415611479576000905061149a565b600082840290508284828161148a57fe5b041461149557600080fd5b809150505b92915050565b6114ed8282600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661127c9092919063ffffffff16565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561152b57600080fd5b6115358282611136565b1561153f57600080fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156115d757600080fd5b6115e18282611136565b6115ea57600080fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611650610bd7565b61165957600080fd5b6116638282611667565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156116a157600080fd5b60008114156116af57600080fd5b505056fea265627a7a72305820e145afcd98bdc57d77227fd4188facc5bb6fe87280b4fb59a566178262e85fbf64736f6c634300050a0032

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

0000000000000000000000000000000000000000000000000000000000000190000000000000000000000000000000000000000000000000000000005d4b6600000000000000000000000000000000000000000000000000000000000000010b000000000000000000000000bb6194fbfc974d848722dcab1ef990dc4738df32000000000000000000000000cbbc3d3d381f3a9a48cbae9ca701ac3c92e0aea500000000000000000000000015dfc197e7ac7d81a07250b5bdebaa96fc1c5dfa000000000000000000000000000000000000000000000000000000005d422b80000000000000000000000000000000000000000000000000000000005d54a080

-----Decoded View---------------
Arg [0] : bonusRate (uint256): 400
Arg [1] : bonusTime (uint256): 1565222400
Arg [2] : defaultRate (uint256): 267
Arg [3] : owner (address): 0xbB6194FBFc974d848722DCAb1ef990DC4738df32
Arg [4] : wallet (address): 0xcbBc3D3d381f3A9a48CbAE9Ca701aC3c92e0aEA5
Arg [5] : token (address): 0x15DfC197E7ac7D81a07250B5bdebAa96Fc1C5dfA
Arg [6] : openingTime (uint256): 1564617600
Arg [7] : closingTime (uint256): 1565827200

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000190
Arg [1] : 000000000000000000000000000000000000000000000000000000005d4b6600
Arg [2] : 000000000000000000000000000000000000000000000000000000000000010b
Arg [3] : 000000000000000000000000bb6194fbfc974d848722dcab1ef990dc4738df32
Arg [4] : 000000000000000000000000cbbc3d3d381f3a9a48cbae9ca701ac3c92e0aea5
Arg [5] : 00000000000000000000000015dfc197e7ac7d81a07250b5bdebaa96fc1c5dfa
Arg [6] : 000000000000000000000000000000000000000000000000000000005d422b80
Arg [7] : 000000000000000000000000000000000000000000000000000000005d54a080


Deployed Bytecode Sourcemap

35920:1799:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17188:21;17198:10;17188:9;:21::i;:::-;35920:1799;27323:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27323:110:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27323:110:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;23511:159;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23511:159:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34065:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34065:85:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27441:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27441:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27441:116:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;36594:185;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36594:185:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36594:185:0;;;;;;;;;;21:11:-1;8;5:28;2:2;;;46:1;43;36:12;2:2;36594:185:0;;35:9:-1;28:4;12:14;8:25;5:40;2:2;;;58:1;55;48:12;2:2;36594:185:0;;;;;;101:9:-1;95:2;81:12;77:21;67:8;63:36;60:51;39:11;25:12;22:29;11:108;8:2;;;132:1;129;122:12;8:2;36594:185:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;36594:185:0;;;;;;;;;;;;;;;:::i;:::-;;33547:67;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33547:67:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;27196:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27196:119:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;27196:119:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;17764:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17764:87:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;36785:189;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36785:189:0;;;:::i;:::-;;23149:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23149:192:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22968:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22968:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26012:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26012:93:0;;;:::i;:::-;;17440:89;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17440:89:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;33718:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33718:81:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;31535:140;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31535:140:0;;;:::i;:::-;;25888:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25888:116:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25888:116:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;30822:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;30822:79:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;31157:92;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31157:92:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;22807:91;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22807:91:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;33881:81;;8:9:-1;5:2;;;30:1;27;20:12;5:2;33881:81:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;37172:139;;8:9:-1;5:2;;;30:1;27;20:12;5:2;37172:139:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;37172:139:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;25755:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25755:125:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25755:125:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;34516:462;;8:9:-1;5:2;;;30:1;27;20:12;5:2;34516:462:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;34516:462:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;27565:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;27565:87:0;;;:::i;:::-;;18116:620;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;18116:620:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;31852:109;;8:9:-1;5:2;;;30:1;27;20:12;5:2;31852:109:0;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;31852:109:0;;;;;;;;;;;;;;;;;;;:::i;:::-;;35216:213;;8:9:-1;5:2;;;30:1;27;20:12;5:2;35216:213:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;17281:78;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17281:78:0;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;18116:620;14192:1;14175:13;;:18;;;;;;;;;;;14204:20;14227:13;;14204:36;;18195:17;18215:9;18195:29;;18235:44;18256:11;18269:9;18235:20;:44::i;:::-;18341:14;18358:26;18374:9;18358:15;:26::i;:::-;18341:43;;18435:25;18450:9;18435:10;;:14;;:25;;;;:::i;:::-;18422:10;:38;;;;18473:37;18490:11;18503:6;18473:16;:37::i;:::-;18554:11;18526:59;;18542:10;18526:59;;;18567:9;18578:6;18526:59;;;;;;;;;;;;;;;;;;;;;;;;18598:46;18621:11;18634:9;18598:22;:46::i;:::-;18657:15;:13;:15::i;:::-;18683:45;18705:11;18718:9;18683:21;:45::i;:::-;14251:1;;14287:13;;14271:12;:29;14263:38;;;;;;18116:620;;:::o;27323:110::-;25698:28;25715:10;25698:16;:28::i;:::-;25690:37;;;;;;27401:24;27417:7;27401:15;:24::i;:::-;27323:110;:::o;23511:159::-;23553:4;23650:12;;23632:15;:30;23625:37;;23511:159;:::o;34065:85::-;34109:7;34132:12;;34125:19;;34065:85;:::o;27441:116::-;25698:28;25715:10;25698:16;:28::i;:::-;25690:37;;;;;;27522:27;27541:7;27522:18;:27::i;:::-;27441:116;:::o;36594:185::-;25698:28;25715:10;25698:16;:28::i;:::-;25690:37;;;;;;36691:6;36700:1;36691:10;;36686:88;36707:8;:15;36703:1;:19;36686:88;;;36738:28;36754:8;36763:1;36754:11;;;;;;;;;;;;;;36738:15;:28::i;:::-;36724:3;;;;;;;36686:88;;;;36594:185;:::o;33547:67::-;33584:7;33600:8;;;27196:119;27257:4;27281:26;27299:7;27281:13;:17;;:26;;;;:::i;:::-;27274:33;;27196:119;;;:::o;17764:87::-;17806:7;17833:10;;17826:17;;17764:87;:::o;36785:189::-;36823:11;:9;:11::i;:::-;36815:20;;;;;;36842:27;36894:7;:5;:7::i;:::-;36842:61;;36910:13;:18;;;36929:13;:23;;;36961:4;36929:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36929:38:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36929:38:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;36929:38:0;;;;;;;;;;;;;;;;36910:58;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;36910:58:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;36910:58:0;;;;36785:189;:::o;23149:192::-;23188:4;23286:12;;23267:15;:31;;:66;;;;;23321:12;;23302:15;:31;;23267:66;23260:73;;23149:192;:::o;22968:91::-;23012:7;23039:12;;23032:19;;22968:91;:::o;26012:93::-;26064:33;26086:10;26064:21;:33::i;:::-;26012:93::o;17440:89::-;17479:15;17514:7;;;;;;;;;;;17507:14;;17440:89;:::o;33718:81::-;33760:7;33783:10;;33776:17;;33718:81;:::o;31535:140::-;31034:9;:7;:9::i;:::-;31026:18;;;;;;31634:1;31597:40;;31618:6;;;;;;;;;;;31597:40;;;;;;;;;;;;31665:1;31648:6;;:19;;;;;;;;;;;;;;;;;;31535:140::o;25888:116::-;25698:28;25715:10;25698:16;:28::i;:::-;25690:37;;;;;;25969:27;25988:7;25969:18;:27::i;:::-;25888:116;:::o;30822:79::-;30860:7;30887:6;;;;;;;;;;;30880:13;;30822:79;:::o;31157:92::-;31197:4;31235:6;;;;;;;;;;;31221:20;;:10;:20;;;31214:27;;31157:92;:::o;22807:91::-;22851:7;22878:12;;22871:19;;22807:91;:::o;33881:81::-;33923:7;33946:10;;33939:17;;33881:81;:::o;37172:139::-;31034:9;:7;:9::i;:::-;31026:18;;;;;;37255:11;:9;:11::i;:::-;37254:12;37246:21;;;;;;37274:31;37295:2;37299:5;37274:7;:5;:7::i;:::-;:20;;;;:31;;;;;:::i;:::-;37172:139;;:::o;25755:125::-;25819:4;25843:29;25864:7;25843:16;:20;;:29;;;;:::i;:::-;25836:36;;25755:125;;;:::o;34516:462::-;31034:9;:7;:9::i;:::-;31026:18;;;;;;34638:8;:6;:8::i;:::-;34637:9;:25;;;;;34651:11;:9;:11::i;:::-;34650:12;34637:25;34629:34;;;;;;34693:1;34678:12;:16;34670:25;;;;;;34726:13;:11;:13::i;:::-;34710:12;:29;;:61;;;;;34758:13;:11;:13::i;:::-;34743:12;:28;34710:61;34702:70;;;;;;34804:1;34787:14;:18;34779:27;;;;;;34828:12;34815:10;:25;;;;34860:12;34847:10;:25;;;;34894:14;34879:12;:29;;;;34922:50;34935:10;;34947;;34959:12;;34922:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34516:462;;;:::o;27565:87::-;27614:30;27633:10;27614:18;:30::i;:::-;27565:87::o;31852:109::-;31034:9;:7;:9::i;:::-;31026:18;;;;;;31925:28;31944:8;31925:18;:28::i;:::-;31852:109;:::o;35216:213::-;35263:7;35284:8;:6;:8::i;:::-;35279:40;;35310:1;35303:8;;;;35279:40;35350:10;;35331:15;:29;35327:69;;35378:10;;35371:17;;;;35327:69;35411:12;;35404:19;;35216:213;;:::o;17281:78::-;17319:6;17345;;;;;;;;;;;17338:13;;17281:78;:::o;37508:208::-;36108:12;37609:10;:41;;37601:50;;;;;;37658:52;37685:12;37699:10;37658:26;:52::i;:::-;37508:208;;:::o;35662:167::-;35729:7;35745:19;35767:16;:14;:16::i;:::-;35745:38;;35797:26;35813:9;35797:11;:15;;:26;;;;:::i;:::-;35790:33;;;35662:167;;;:::o;2397:150::-;2455:7;2475:9;2491:1;2487;:5;2475:17;;2516:1;2511;:6;;2503:15;;;;;;2538:1;2531:8;;;2397:150;;;;:::o;20615:136::-;20703:40;20718:11;20731;20703:14;:40::i;:::-;20615:136;;:::o;21029:147::-;;;:::o;21646:80::-;21691:7;;;;;;;;;;;:16;;:27;21708:9;21691:27;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;21691:27:0;21646:80::o;19763:151::-;;;:::o;27660:137::-;27722:26;27740:7;27722:13;:17;;:26;;;;:::i;:::-;27781:7;27764:25;;;;;;;;;;;;27660:137;:::o;27805:145::-;27870:29;27891:7;27870:13;:20;;:29;;;;:::i;:::-;27934:7;27915:27;;;;;;;;;;;;27805:145;:::o;24925:165::-;24997:4;25041:1;25022:21;;:7;:21;;;;25014:30;;;;;;25062:4;:11;;:20;25074:7;25062:20;;;;;;;;;;;;;;;;;;;;;;;;;25055:27;;24925:165;;;;:::o;26267:154::-;26335:32;26359:7;26335:16;:23;;:32;;;;:::i;:::-;26405:7;26383:30;;;;;;;;;;;;26267:154;:::o;26113:146::-;26178:29;26199:7;26178:16;:20;;:29;;;;:::i;:::-;26243:7;26223:28;;;;;;;;;;;;26113:146;:::o;11866:125::-;11957:5;:14;;;11972:2;11976:5;11957:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;11957:25:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;11957:25:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;11957:25:0;;;;;;;;;;;;;;;;11949:34;;;;;;11866:125;;;:::o;32111:187::-;32205:1;32185:22;;:8;:22;;;;32177:31;;;;;;32253:8;32224:38;;32245:6;;;;;;;;;;;32224:38;;;;;;;;;;;;32282:8;32273:6;;:17;;;;;;;;;;;;;;;;;;32111:187;:::o;28522:204::-;28627:27;28641:12;28627:13;:27::i;:::-;28619:36;;;;;;28666:52;28693:12;28707:10;28666:26;:52::i;:::-;28522:204;;:::o;1156:433::-;1214:7;1463:1;1458;:6;1454:47;;;1488:1;1481:8;;;;1454:47;1513:9;1529:1;1525;:5;1513:17;;1558:1;1553;1549;:5;;;;;;:10;1541:19;;;;;;1580:1;1573:8;;;1156:433;;;;;:::o;20202:139::-;20288:45;20308:11;20321;20288:6;;;;;;;;;;;:19;;;;:45;;;;;:::i;:::-;20202:139;;:::o;24377:186::-;24473:1;24454:21;;:7;:21;;;;24446:30;;;;;;24496:18;24500:4;24506:7;24496:3;:18::i;:::-;24495:19;24487:28;;;;;;24551:4;24528;:11;;:20;24540:7;24528:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;24377:186;;:::o;24642:189::-;24741:1;24722:21;;:7;:21;;;;24714:30;;;;;;24763:18;24767:4;24773:7;24763:3;:18::i;:::-;24755:27;;;;;;24818:5;24795:4;:11;;:20;24807:7;24795:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;24642:189;;:::o;23869:167::-;22217:8;:6;:8::i;:::-;22209:17;;;;;;23978:50;24005:11;24018:9;23978:26;:50::i;:::-;23869:167;;:::o;19289:171::-;19415:1;19392:25;;:11;:25;;;;19384:34;;;;;;19450:1;19437:9;:14;;19429:23;;;;;;19289:171;;:::o

Swarm Source

bzzr://e145afcd98bdc57d77227fd4188facc5bb6fe87280b4fb59a566178262e85fbf

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.