ETH Price: $3,190.23 (+2.36%)
Gas: 2 Gwei

Contract

0x722a89F1b925fE41883978219c2176AECc7D6699
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

More Info

Private Name Tags

TokenTracker

Kinka (XNK) (@$2,408.80)

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer203024442024-07-14 4:46:119 mins ago1720932371IN
Kinka: XNK Token
0 ETH0.0005987910
Approve202810522024-07-11 5:04:352 days ago1720674275IN
Kinka: XNK Token
0 ETH0.000098392.11871663
Transfer201873862024-06-28 3:05:5916 days ago1719543959IN
Kinka: XNK Token
0 ETH0.0004937213
Transfer201873782024-06-28 3:04:2316 days ago1719543863IN
Kinka: XNK Token
0 ETH0.000351816.38747363
Transfer201873582024-06-28 3:00:2316 days ago1719543623IN
Kinka: XNK Token
0 ETH0.000238976.29241696
Transfer201812082024-06-27 6:23:1116 days ago1719469391IN
Kinka: XNK Token
0 ETH0.000658811
Transfer201732162024-06-26 3:36:5918 days ago1719373019IN
Kinka: XNK Token
0 ETH0.000106882.81423228
Transfer201659032024-06-25 3:06:1119 days ago1719284771IN
Kinka: XNK Token
0 ETH0.0005989110
Transfer201658102024-06-25 2:47:3519 days ago1719283655IN
Kinka: XNK Token
0 ETH0.000175113.17939498
Transfer201597422024-06-24 6:25:4719 days ago1719210347IN
Kinka: XNK Token
0 ETH0.000299455
Transfer201597352024-06-24 6:24:2319 days ago1719210263IN
Kinka: XNK Token
0 ETH0.000065291.71872892
Transfer201590062024-06-24 3:57:5920 days ago1719201479IN
Kinka: XNK Token
0 ETH0.000275455
Transfer201586222024-06-24 2:40:1120 days ago1719196811IN
Kinka: XNK Token
0 ETH0.0004279110
Transfer201585402024-06-24 2:23:1120 days ago1719195791IN
Kinka: XNK Token
0 ETH0.000385119
Transfer200886242024-06-14 7:42:3529 days ago1718350955IN
Kinka: XNK Token
0 ETH0.0008740623
Transfer200885782024-06-14 7:33:1129 days ago1718350391IN
Kinka: XNK Token
0 ETH0.0006649812.06804697
Transfer200880572024-06-14 5:48:3529 days ago1718344115IN
Kinka: XNK Token
0 ETH0.000281447.40598055
Transfer200880392024-06-14 5:44:5929 days ago1718343899IN
Kinka: XNK Token
0 ETH0.000269697.09903916
Transfer200724862024-06-12 1:32:1132 days ago1718155931IN
Kinka: XNK Token
0 ETH0.0008983615
Transfer200598012024-06-10 7:00:2333 days ago1718002823IN
Kinka: XNK Token
0 ETH0.000236625.5281182
Transfer200597582024-06-10 6:51:4733 days ago1718002307IN
Kinka: XNK Token
0 ETH0.000325235.43147778
Transfer200592722024-06-10 5:14:1133 days ago1717996451IN
Kinka: XNK Token
0 ETH0.000183583.33306545
Transfer200582762024-06-10 1:54:1134 days ago1717984451IN
Kinka: XNK Token
0 ETH0.0007185412
Transfer199746052024-05-29 9:24:1145 days ago1716974651IN
Kinka: XNK Token
0 ETH0.0010057916.79705448
Transfer199451902024-05-25 6:46:2349 days ago1716619583IN
Kinka: XNK Token
0 ETH0.000337095.63076702
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
ERC20Token

Compiler Version
v0.4.26+commit.4563c3fc

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-12-19
*/

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

pragma solidity ^0.4.24;


/**
 * @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 public owner;


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


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(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 OwnershipRenounced(owner);
    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/WhiteList.sol

pragma solidity ^0.4.18;

contract WhiteList is Ownable {
    mapping(address => uint8) public whitelist;
    bool public presaleNeedWhitelist = true;
    bool public publicsaleNeedWhitelist = true;

    event ImportList(address indexed owner, address[] users, uint8 flag);
    event UpdatePresaleWhitelistStatus(address indexed owner, bool flag);
    event UpdatePublicSaleWhitelistStatus(address indexed owner, bool flag);

    /**
     * @dev Function to import user's address into whitelist, only user who in the whitelist can purchase token.
     *      Whitelistにユーザーアドレスを記録。sale期間に、Whitelistに記録したユーザーたちしかトークンを購入できない
     * @param _users The address list that can purchase token when sale period.
     * @param _flag The flag for record different lv user, 1: pre sale user, 2: public sale user.
     * @return A bool that indicates if the operation was successful.
     */
    function importList(address[] _users, uint8 _flag)
        public
        onlyOwner
        returns (bool)
    {
        require(_users.length > 0);

        for (uint256 i = 0; i < _users.length; i++) {
            whitelist[_users[i]] = _flag;
        }

        emit ImportList(msg.sender, _users, _flag);

        return true;
    }

    /**
     * @dev Function check the current user can purchase token or not.
     * ユーザーアドレスはWhitelistに記録かどうかチェック
     * @param _user The user address that can purchase token or not when public salse.
     * @return A bool that indicates if the operation was successful.
     */
    function checkList(address _user) public view returns (uint8) {
        return whitelist[_user];
    }

    /**
     * @dev Function get whitelist able status in presale
     * @return A bool that indicates if the operation was successful.
     */
    function getPresaleWhitelistStatus() public view returns (bool) {
        return presaleNeedWhitelist;
    }

    /**
     * @dev Function get whitelist able status in public sale
     * @return A bool that indicates if the operation was successful.
     */
    function getPublicSaleWhitelistStatus() public view returns (bool) {
        return publicsaleNeedWhitelist;
    }

    /**
     * @dev Function update whitelist able status in presale
     * @param _flag bool whitelist status
     * @return A bool that indicates if the operation was successful.
     */
    function updatePresaleWhitelistStatus(bool _flag)
        public
        onlyOwner
        returns (bool)
    {
        presaleNeedWhitelist = _flag;

        emit UpdatePresaleWhitelistStatus(msg.sender, _flag);

        return true;
    }

    /**
     * @dev Function update whitelist able status in public sale
     * @param _flag bool whitelist status
     * @return A bool that indicates if the operation was successful.
     */
    function updatePublicSaleWhitelistStatus(bool _flag)
        public
        onlyOwner
        returns (bool)
    {
        publicsaleNeedWhitelist = _flag;

        emit UpdatePublicSaleWhitelistStatus(msg.sender, _flag);

        return true;
    }
}

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

pragma solidity ^0.4.24;


/**
 * @title SafeMath
 * @dev Math operations with safety checks that throw on error
 */
library SafeMath {

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting '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;
    }

    c = _a * _b;
    assert(c / _a == _b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 _a, uint256 _b) internal pure returns (uint256) {
    // assert(_b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = _a / _b;
    // assert(_a == _b * c + _a % _b); // There is no case in which this doesn't hold
    return _a / _b;
  }

  /**
  * @dev Subtracts two numbers, throws on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 _a, uint256 _b) internal pure returns (uint256) {
    assert(_b <= _a);
    return _a - _b;
  }

  /**
  * @dev Adds two numbers, throws on overflow.
  */
  function add(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    c = _a + _b;
    assert(c >= _a);
    return c;
  }
}

// File: contracts/GroupLockup.sol

pragma solidity ^0.4.18;


contract GroupLockup is Ownable {
    using SafeMath for uint256;

    mapping(address => uint256) public lockupList; //users lockup list
    mapping(uint256 => bool) public lockupListFlag;
    address[] public userList; //users address list

    event UpdateLockupList(
        address indexed owner,
        address indexed userAddress,
        uint256 lockupDate
    );
    event UpdateLockupTime(
        address indexed owner,
        uint256 indexed oldLockupDate,
        uint256 newLockupDate
    );
    event LockupTimeList(uint256 indexed lockupDate, bool active);

    /**
     * @dev Function to get lockup list
     * @param userAddress address
     * @return A uint256 that indicates if the operation was successful.
     */
    function getLockupTime(address userAddress) public view returns (uint256) {
        return lockupList[userAddress];
    }

    /**
     * @dev Function to check token locked date that is reach or not
     * @param lockupDate uint256
     * @return A bool that indicates if the operation was successful.
     */
    function isLockup(uint256 lockupDate) public view returns (bool) {
        return (now < lockupDate);
    }

    /**
     * @dev Function get user's lockup status
     * @param userAddress address
     * @return A bool that indicates if the operation was successful.
     */
    function inLockupList(address userAddress) public view returns (bool) {
        if (lockupList[userAddress] == 0) {
            return false;
        }
        return true;
    }

    /**
     * @dev Function update lockup status for purchaser, if user in the lockup list, they can only transfer token after lockup date
     * @param userAddress address
     * @param lockupDate uint256 this user's token time
     * @return A bool that indicates if the operation was successful.
     */
    function updateLockupList(address userAddress, uint256 lockupDate)
        public
        onlyOwner
        returns (bool)
    {
        if (lockupDate == 0) {
            delete lockupList[userAddress];

            for (
                uint256 userListIndex = 0;
                userListIndex < userList.length;
                userListIndex++
            ) {
                if (userList[userListIndex] == userAddress) {
                    //Swap and pop the array instead of deleting by index,
                    //so that we do not leave a gap in the array. (Storage and gas efficiency.)
                    //delete userList[userListIndex];
                    userList[userListIndex] = userList[userList.length - 1];
                    delete userList[userList.length - 1];
                    userList.length--;
                    break;
                }
            }
        } else {
            bool userIsExist = inLockupList(userAddress);

            if (!userIsExist) {
                userList.push(userAddress);
            }
            //Limit the userList size to prevent gas exhaustion.
            uint8 maxUserListLength = 100;
            require(userList.length <= maxUserListLength, "user list too large");

            lockupList[userAddress] = lockupDate;

            //insert lockup time into lockup time list, if this lockup time is the new one
            if (!lockupListFlag[lockupDate]) {
                lockupListFlag[lockupDate] = true;
                emit LockupTimeList(lockupDate, true);
            }
        }
        emit UpdateLockupList(msg.sender, userAddress, lockupDate);

        return true;
    }

    /**
     * @dev Function update lockup time
     * @param oldLockupDate uint256 old group lockup time
     * @param newLockupDate uint256 new group lockup time
     * @return A bool that indicates if the operation was successful.
     */
    function updateLockupTime(uint256 oldLockupDate, uint256 newLockupDate)
        public
        onlyOwner
        returns (bool)
    {
        require(oldLockupDate != 0);
        require(newLockupDate != 0);
        require(newLockupDate != oldLockupDate);

        address userAddress;
        uint256 userLockupTime;

        //update the user's lockup time who was be setted as old lockup time
        for (
            uint256 userListIndex = 0;
            userListIndex < userList.length;
            userListIndex++
        ) {
            if (userList[userListIndex] != 0) {
                userAddress = userList[userListIndex];
                userLockupTime = getLockupTime(userAddress);
                if (userLockupTime == oldLockupDate) {
                    lockupList[userAddress] = newLockupDate;
                    emit UpdateLockupList(
                        msg.sender,
                        userAddress,
                        newLockupDate
                    );
                }
            }
        }

        //delete the old lockup time from lockup time list, if this old lockup time is existing in the lockup time list
        if (lockupListFlag[oldLockupDate]) {
            lockupListFlag[oldLockupDate] = false;
            emit LockupTimeList(oldLockupDate, false);
        }

        //insert lockup time into lockup time list, if this lockup time is the new one
        if (!lockupListFlag[newLockupDate]) {
            lockupListFlag[newLockupDate] = true;
            emit LockupTimeList(newLockupDate, true);
        }

        emit UpdateLockupTime(msg.sender, oldLockupDate, newLockupDate);
        return true;
    }
}

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

pragma solidity ^0.4.24;


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address _who) public view returns (uint256);
  function transfer(address _to, uint256 _value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

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

pragma solidity ^0.4.24;


/**
 * @title Basic token
 * @dev Basic version of StandardToken, with no allowances.
 */
contract BasicToken is ERC20Basic {
  using SafeMath for uint256;

  mapping(address => uint256) internal balances;

  uint256 internal totalSupply_;

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

  /**
  * @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) {
    require(_value <= balances[msg.sender]);
    require(_to != address(0));

    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    emit Transfer(msg.sender, _to, _value);
    return true;
  }

  /**
  * @dev Gets the balance of the specified address.
  * @param _owner The address to query the 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];
  }

}

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

pragma solidity ^0.4.24;

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
contract ERC20 is ERC20Basic {
  function allowance(address _owner, address _spender)
    public view returns (uint256);

  function transferFrom(address _from, address _to, uint256 _value)
    public returns (bool);

  function approve(address _spender, uint256 _value) public returns (bool);
  event Approval(
    address indexed owner,
    address indexed spender,
    uint256 value
  );
}

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

pragma solidity ^0.4.24;


/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * https://github.com/ethereum/EIPs/issues/20
 * Based on code by FirstBlood: https://github.com/Firstbloodio/token/blob/master/smart_contract/FirstBloodToken.sol
 */
contract StandardToken is ERC20, BasicToken {

  mapping (address => mapping (address => uint256)) internal allowed;


  /**
   * @dev Transfer tokens from one address to another
   * @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)
  {
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);
    require(_to != address(0));

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    emit Transfer(_from, _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) {
    allowed[msg.sender][_spender] = _value;
    emit Approval(msg.sender, _spender, _value);
    return true;
  }

  /**
   * @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 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
   * @param _spender The address which will spend the funds.
   * @param _addedValue The amount of tokens to increase the allowance by.
   */
  function increaseApproval(
    address _spender,
    uint256 _addedValue
  )
    public
    returns (bool)
  {
    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
   * @param _spender The address which will spend the funds.
   * @param _subtractedValue The amount of tokens to decrease the allowance by.
   */
  function decreaseApproval(
    address _spender,
    uint256 _subtractedValue
  )
    public
    returns (bool)
  {
    uint256 oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue >= oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

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

pragma solidity ^0.4.24;


/**
 * @title Mintable token
 * @dev Simple ERC20 Token example, with mintable token creation
 * Based on code by TokenMarketNet: https://github.com/TokenMarketNet/ico/blob/master/contracts/MintableToken.sol
 */
contract MintableToken is StandardToken, Ownable {
  event Mint(address indexed to, uint256 amount);
  event MintFinished();

  bool public mintingFinished = false;


  modifier canMint() {
    require(!mintingFinished);
    _;
  }

  modifier hasMintPermission() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Function to mint tokens
   * @param _to The address that will receive the minted tokens.
   * @param _amount The amount of tokens to mint.
   * @return A boolean that indicates if the operation was successful.
   */
  function mint(
    address _to,
    uint256 _amount
  )
    public
    hasMintPermission
    canMint
    returns (bool)
  {
    totalSupply_ = totalSupply_.add(_amount);
    balances[_to] = balances[_to].add(_amount);
    emit Mint(_to, _amount);
    emit Transfer(address(0), _to, _amount);
    return true;
  }

  /**
   * @dev Function to stop minting new tokens.
   * @return True if the operation was successful.
   */
  function finishMinting() public onlyOwner canMint returns (bool) {
    mintingFinished = true;
    emit MintFinished();
    return true;
  }
}

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

pragma solidity ^0.4.24;

/**
 * @title Burnable Token
 * @dev Token that can be irreversibly burned (destroyed).
 */
contract BurnableToken is BasicToken {

  event Burn(address indexed burner, uint256 value);

  /**
   * @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);
  }

  function _burn(address _who, uint256 _value) internal {
    require(_value <= balances[_who]);
    // no need to require value <= totalSupply, since that would imply the
    // sender's balance is greater than the totalSupply, which *should* be an assertion failure

    balances[_who] = balances[_who].sub(_value);
    totalSupply_ = totalSupply_.sub(_value);
    emit Burn(_who, _value);
    emit Transfer(_who, address(0), _value);
  }
}

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

pragma solidity ^0.4.24;


/**
 * @title Standard Burnable Token
 * @dev Adds burnFrom method to ERC20 implementations
 */
contract StandardBurnableToken is BurnableToken, StandardToken {

  /**
   * @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 {
    require(_value <= allowed[_from][msg.sender]);
    // Should https://github.com/OpenZeppelin/zeppelin-solidity/issues/707 be accepted,
    // this function needs to emit an event with the updated approval.
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    _burn(_from, _value);
  }
}

// File: contracts/ERC20Token.sol

pragma solidity ^0.4.18;




contract ERC20Token is MintableToken, StandardBurnableToken {
    using SafeMath for uint256;

    string public constant name = "Kinka";
    string public constant symbol = "XNK";
    uint8 public constant decimals = 18;
    uint256 public constant INITIAL_SUPPLY =
        482 * (10**uint256(decimals));
    uint256 public constant INITIAL_SALE_SUPPLY =
        482 * (10**uint256(decimals));
    uint256 public constant INITIAL_UNSALE_SUPPLY =
        INITIAL_SUPPLY - INITIAL_SALE_SUPPLY;

    address public ownerWallet;
    address public unsaleOwnerWallet;

    GroupLockup public groupLockup;

    event BatchTransferFail(
        address indexed from,
        address indexed to,
        uint256 value,
        string msg
    );

    /**
     * @dev Constructor that gives msg.sender all of existing tokens.
     */
    constructor(
        address _saleOwnerWallet,
        address _unsaleOwnerWallet,
        GroupLockup _groupLockup
    ) public {
        groupLockup = _groupLockup;
        ownerWallet = _saleOwnerWallet;
        unsaleOwnerWallet = _unsaleOwnerWallet;

        mint(ownerWallet, INITIAL_SALE_SUPPLY);
        mint(unsaleOwnerWallet, INITIAL_UNSALE_SUPPLY);
    }

    /**
     * @dev transfer token for a specified address
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function sendTokens(address _to, uint256 _value)
        public
        onlyOwner
        returns (bool)
    {
        require(_to != address(0));
        require(_value <= balances[ownerWallet]);

        // SafeMath.sub will throw if there is not enough balance.
        balances[ownerWallet] = balances[ownerWallet].sub(_value);
        balances[_to] = balances[_to].add(_value);

        emit Transfer(ownerWallet, _to, _value);
        return true;
    }

    /**
     * @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) {
        require(_to != address(0));
        require(_value <= balances[msg.sender]);
        require(_value > 0);

        bool inLockupList = groupLockup.inLockupList(msg.sender);

        //if user in the lockup list, they can only transfer token after lockup date
        if (inLockupList) {
            uint256 lockupTime = groupLockup.getLockupTime(msg.sender);
            require(groupLockup.isLockup(lockupTime) == false);
        }

        // SafeMath.sub will throw if there is not enough balance.
        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);

        emit Transfer(msg.sender, _to, _value);
        return true;
    }

  /**
   * @dev Transfer tokens from one address to another
   * @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) {
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);
        require(_to != address(0));

        //Validate the lockup time about the `from` address.
        bool inLockupList = groupLockup.inLockupList(_from);
        //if user in the lockup list, they can only transfer token after lockup date
        if (inLockupList) {
            uint256 lockupTime = groupLockup.getLockupTime(_from);
            require(groupLockup.isLockup(lockupTime) == false);
        }

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

    /**
     * @dev transfer token to mulitipule user
     * @param _from which wallet's token will be taken.
     * @param _users The address list to transfer to.
     * @param _values The amount list to be transferred.
     */
    function batchTransfer(
        address _from,
        address[] _users,
        uint256[] _values
    ) public onlyOwner returns (bool) {
        address to;
        uint256 value;
        bool isUserAddress;
        bool canTransfer;
        string memory transferFailMsg;

        for (uint256 i = 0; i < _users.length; i++) {
            to = _users[i];
            value = _values[i];
            isUserAddress = false;
            canTransfer = false;
            transferFailMsg = "";

            // can not send token to contract address
            //コントラクトアドレスにトークンを発送できない検証
            assembly {
                isUserAddress := iszero(extcodesize(to))
            }

            //data check
            if (!isUserAddress) {
                transferFailMsg = "try to send token to contract";
            } else if (value <= 0) {
                transferFailMsg = "try to send wrong token amount";
            } else if (to == address(0)) {
                transferFailMsg = "try to send token to empty address";
            } else if (value > balances[_from]) {
                transferFailMsg = "token amount is larger than giver holding";
            } else {
                canTransfer = true;
            }

            if (canTransfer) {
                balances[_from] = balances[_from].sub(value);
                balances[to] = balances[to].add(value);
                emit Transfer(_from, to, value);
            } else {
                emit BatchTransferFail(_from, to, value, transferFailMsg);
            }
        }

        return true;
    }

    /**
     * @dev Burns msg.sender's token.
     * @param _value The amount to burn.
     */
    function burn(uint256 _value) public onlyOwner {
        super.burn(_value);
    }

    /**
     * @dev Burns token of an address.
     * @param _from The address to burn token from.
     * @param _value The amount to burn.
     */
    function burnFrom(address _from, uint256 _value) public onlyOwner {
        super.burnFrom(_from, _value);
    }

}

// File: contracts/SaleInfo.sol

pragma solidity ^0.4.18;

contract SaleInfo {
    using SafeMath for uint256;

    uint256 public privateOpeningTime;
    uint256 public privateClosingTime;
    uint256 public publicOpeningTime;
    uint256 public publicClosingTime;
    address public adminWallet;
    address public saleOwnerWallet;
    address public unsaleOwnerWallet;
    address public ethManagementWallet;

    constructor(
        uint256 _privateOpeningTime,
        uint256 _privateClosingTime,
        uint256 _publicOpeningTime,
        uint256 _publicClosingTime,
        address _adminWallet,
        address _saleOwnerWallet,
        address _unsaleOwnerWallet,
        address _ethManagementWallet
    ) public {
        privateOpeningTime = _privateOpeningTime;
        privateClosingTime = _privateClosingTime;
        publicOpeningTime = _publicOpeningTime;
        publicClosingTime = _publicClosingTime;
        adminWallet = _adminWallet;
        saleOwnerWallet = _saleOwnerWallet;
        unsaleOwnerWallet = _unsaleOwnerWallet;
        ethManagementWallet = _ethManagementWallet;
    }

    /**
     * @dev get admin wallet
     */
    function getAdminAddress() public view returns (address) {
        return adminWallet;
    }

    /**
     * @dev get owner wallet
     */
    function getSaleOwnerAddress() public view returns (address) {
        return saleOwnerWallet;
    }

    /**
     * @dev get unsale owner wallet
     */
    function getUnsaleOwnerAddress() public view returns (address) {
        return unsaleOwnerWallet;
    }

    /**
     * @dev get eth management owner wallet
     */
    function getEtherManagementAddress() public view returns (address) {
        return ethManagementWallet;
    }

    /**
     * @dev get start date for presale
     */
    function getPresaleOpeningDate() public view returns (uint256) {
        return privateOpeningTime;
    }

    /**
     * @dev get end date for presale
     */
    function getPresaleClosingDate() public view returns (uint256) {
        return privateClosingTime;
    }

    /**
     * @dev get start date for public sale
     */
    function getPublicsaleOpeningDate() public view returns (uint256) {
        return publicOpeningTime;
    }

    /**
     * @dev get end date for public sale
     */
    function getPublicsaleClosingDate() public view returns (uint256) {
        return publicClosingTime;
    }

    /**
     * @dev current time is in presale period or not
     */
    function inPresalePeriod() public view returns (bool) {
        return ((now >= privateOpeningTime) && (now <= privateClosingTime));
    }

    /**
     * @dev current time is in public sale period or not
     */
    function inPublicsalePeriod() public view returns (bool) {
        return ((now >= publicOpeningTime) && (now <= publicClosingTime));
    }
}

// File: contracts/BatchTransferable.sol

pragma solidity ^0.4.18;

/**
 * @title BatchTransferable
 * @dev Base contract which allows children to run batch transfer token.
 */
contract BatchTransferable is Ownable {
    event BatchTransferStop();

    bool public batchTransferStopped = false;

    /**
     * @dev Modifier to make a function callable only when the contract is do batch transfer token.
     */
    modifier whenBatchTransferNotStopped() {
        require(!batchTransferStopped);
        _;
    }

    /**
     * @dev called by the owner to stop, triggers stopped state
     */
    function batchTransferStop() public onlyOwner whenBatchTransferNotStopped {
        batchTransferStopped = true;
        emit BatchTransferStop();
    }

    /**
     * @dev called to check that can do batch transfer or not
     */
    function isBatchTransferStop() public view returns (bool) {
        return batchTransferStopped;
    }
}

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

pragma solidity ^0.4.24;


/**
 * @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 {
  function safeTransfer(
    ERC20Basic _token,
    address _to,
    uint256 _value
  )
    internal
  {
    require(_token.transfer(_to, _value));
  }

  function safeTransferFrom(
    ERC20 _token,
    address _from,
    address _to,
    uint256 _value
  )
    internal
  {
    require(_token.transferFrom(_from, _to, _value));
  }

  function safeApprove(
    ERC20 _token,
    address _spender,
    uint256 _value
  )
    internal
  {
    require(_token.approve(_spender, _value));
  }
}

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

pragma solidity ^0.4.24;



/**
 * @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 {
  using SafeMath for uint256;
  using SafeERC20 for ERC20;

  // The token being sold
  ERC20 public token;

  // Address where funds are collected
  address public 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 DetailedERC20 token with 3 decimals called TOK
  // 1 wei will give you 1 unit, or 0.001 TOK.
  uint256 public rate;

  // Amount of wei raised
  uint256 public 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 TokenPurchase(
    address indexed purchaser,
    address indexed beneficiary,
    uint256 value,
    uint256 amount
  );

  /**
   * @param _rate Number of token units a buyer gets per wei
   * @param _wallet Address where collected funds will be forwarded to
   * @param _token Address of the token being sold
   */
  constructor(uint256 _rate, address _wallet, ERC20 _token) public {
    require(_rate > 0);
    require(_wallet != address(0));
    require(_token != address(0));

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

  // -----------------------------------------
  // Crowdsale external interface
  // -----------------------------------------

  /**
   * @dev fallback function ***DO NOT OVERRIDE***
   */
  function () external payable {
    buyTokens(msg.sender);
  }

  /**
   * @dev low level token purchase ***DO NOT OVERRIDE***
   * @param _beneficiary Address performing the token purchase
   */
  function buyTokens(address _beneficiary) public 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 TokenPurchase(
      msg.sender,
      _beneficiary,
      weiAmount,
      tokens
    );

    _updatePurchasingState(_beneficiary, weiAmount);

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

  // -----------------------------------------
  // Internal interface (extensible)
  // -----------------------------------------

  /**
   * @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
  {
    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
  {
    // optional override
  }

  /**
   * @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. Not necessarily emits/sends 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
  {
    // optional override
  }

  /**
   * @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.4.24;


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

  uint256 public openingTime;
  uint256 public closingTime;

  /**
   * @dev Reverts if not in crowdsale time range.
   */
  modifier onlyWhileOpen {
    // solium-disable-next-line security/no-block-members
    require(block.timestamp >= openingTime && block.timestamp <= closingTime);
    _;
  }

  /**
   * @dev Constructor, takes crowdsale opening and closing times.
   * @param _openingTime Crowdsale opening time
   * @param _closingTime Crowdsale closing time
   */
  constructor(uint256 _openingTime, uint256 _closingTime) public {
    // solium-disable-next-line security/no-block-members
    require(_openingTime >= block.timestamp);
    require(_closingTime >= _openingTime);

    openingTime = _openingTime;
    closingTime = _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) {
    // solium-disable-next-line security/no-block-members
    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
  {
    super._preValidatePurchase(_beneficiary, _weiAmount);
  }

}

// File: openzeppelin-solidity/contracts/lifecycle/Pausable.sol

pragma solidity ^0.4.24;

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() public onlyOwner whenNotPaused {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() public onlyOwner whenPaused {
    paused = false;
    emit Unpause();
  }
}

// File: contracts/ERC20TokenCrowdsale.sol

pragma solidity ^0.4.18;









contract ERC20TokenCrowdsale is
    TimedCrowdsale,
    Ownable,
    Pausable,
    BatchTransferable
{
    using SafeMath for uint256;

    address public adminWallet; //wallet to controll system
    address public saleOwnerWallet;
    address public unsaleOwnerWallet;
    address public ethManagementWallet; //wallet to reveive eth

    uint256 public minimumWeiAmount;
    uint256 private rateDigit;

    ERC20Token public erc20Token;
    SaleInfo public saleInfo;
    WhiteList public whiteList;
    GroupLockup public groupLockup;

    event PresalePurchase(address indexed purchaser, uint256 value);
    event PublicsalePurchase(
        address indexed purchaser,
        uint256 value,
        uint256 amount,
        uint256 rate
    );
    event UpdateRate(address indexed updater, uint256 rate);
    event UpdateMinimumAmount(
        address indexed updater,
        uint256 minimumWeiAmount
    );
    event GiveToken(
        address indexed purchaser,
        uint256 amount,
        uint256 lockupTime
    );

    constructor(
        uint256 _openingTime,
        uint256 _closingTime,
        uint256 _rate,
        uint256 _rateDigit,
        uint256 _minimumWeiAmount,
        address _adminWallet,
        address _saleOwnerWallet,
        address _unsaleOwnerWallet,
        address _ethManagementWallet,
        ERC20Token _erc20,
        SaleInfo _saleInfo,
        WhiteList _whiteList,
        GroupLockup _groupLockup
    )
        public
        Crowdsale(_rate, _ethManagementWallet, _erc20)
        TimedCrowdsale(_openingTime, _closingTime)
    {
        adminWallet = _adminWallet;
        saleOwnerWallet = _saleOwnerWallet;
        unsaleOwnerWallet = _unsaleOwnerWallet;
        ethManagementWallet = _ethManagementWallet;
        erc20Token = _erc20;
        saleInfo = _saleInfo;
        whiteList = _whiteList;
        groupLockup = _groupLockup;
        rateDigit = _rateDigit;
        minimumWeiAmount = _minimumWeiAmount;

        emit UpdateRate(msg.sender, _rate);
        emit UpdateMinimumAmount(msg.sender, _minimumWeiAmount);
    }

    /**
     * @dev low level token purchase ***DO NOT OVERRIDE***
     * @param _beneficiary Address performing the token purchase
     */
    function buyTokens(address _beneficiary)
        public
        payable
        onlyWhileOpen
        whenNotPaused
    {
        uint256 weiAmount = msg.value;
        _preValidatePurchase(_beneficiary, weiAmount);

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

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

        _processPurchase(_beneficiary, tokens);
        emit TokenPurchase(msg.sender, _beneficiary, weiAmount, tokens);

        _updatePurchasingState(_beneficiary, weiAmount);

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

    /**
     * @dev Validation of an incoming purchase. Use require statemens to revert state when conditions are not met. Use super to concatenate validations.
     * @param _beneficiary Address performing the token purchase
     * @param _weiAmount Value in wei involved in the purchase
     */
    function _preValidatePurchase(address _beneficiary, uint256 _weiAmount)
        internal
    {
        require(_beneficiary != address(0));
        require(_weiAmount != 0);
        require(_weiAmount % rateDigit == 0);

        //minimum ether check
        require(_weiAmount >= minimumWeiAmount);

        //owner can not purchase token
        require(_beneficiary != adminWallet);
        require(_beneficiary != saleOwnerWallet);
        require(_beneficiary != unsaleOwnerWallet);
        require(_beneficiary != ethManagementWallet);

        require(saleInfo.inPresalePeriod() || saleInfo.inPublicsalePeriod());

        //whitelist check
        //whitelist status:1-presale user, 2-public sale user
        uint8 inWhitelist = whiteList.checkList(_beneficiary);

        if (saleInfo.inPresalePeriod()) {
            //if need to check whitelist status in presale period
            if (whiteList.getPresaleWhitelistStatus()) {
                require(inWhitelist == 1);
            }
        } else {
            //if need to check whitelist status in public sale period
            if (whiteList.getPublicSaleWhitelistStatus()) {
                require((inWhitelist == 1) || (inWhitelist == 2));
            }
        }
    }

    /**
     * @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
    {
        //will not send token directly when purchaser purchase the token in presale
        if (saleInfo.inPresalePeriod()) {
            emit PresalePurchase(_beneficiary, msg.value);
        } else {
            require(erc20Token.sendTokens(_beneficiary, _tokenAmount));
            emit PublicsalePurchase(
                _beneficiary,
                msg.value,
                _tokenAmount,
                rate
            );
        }
    }

    /**
     * @dev send token and set token lockup status to specific user
     *  file format:
     *          [
     *                  [<address>, <token amount>, <lockup time>],
     *                  [<address>, <token amount>, <lockup time>],...
     *          ]
     * @param _beneficiary Address
     * @param _tokenAmount token amount
     * @param _lockupTime uint256 this address's lockup time
     * @return A bool that indicates if the operation was successful.
     */
    function giveToken(
        address _beneficiary,
        uint256 _tokenAmount,
        uint256 _lockupTime
    ) public onlyOwner returns (bool) {
        require(_beneficiary != address(0));

        require(_tokenAmount > 0);

        if (_lockupTime != 0) {
            //add this account in to lockup list
            require(updateLockupList(_beneficiary, _lockupTime));
        }

        require(erc20Token.sendTokens(_beneficiary, _tokenAmount));

        emit GiveToken(_beneficiary, _tokenAmount, _lockupTime);

        return true;
    }

    /**
     * @dev send token to mulitple user
     * @param _from token provider address
     * @param _users user address list
     * @param _values the token amount list that want to deliver
     * @return A bool the operation was successful.
     */
    function batchTransfer(
        address _from,
        address[] _users,
        uint256[] _values
    ) public onlyOwner whenBatchTransferNotStopped returns (bool) {
        require(
            _users.length > 0 &&
                _values.length > 0 &&
                _users.length == _values.length,
            "list error"
        );

        require(
            _from != address(0),
            "token giver wallet is not the correct address"
        );

        require(erc20Token.batchTransfer(_from, _users, _values), "batch transfer failed");
        return true;
    }

    /**
     * @dev set lockup status to mulitple user
     * @param _users user address list
     * @param _lockupDates uint256 user lockup time
     * @return A bool the operation was successful.
     */
    function batchUpdateLockupList(address[] _users, uint256[] _lockupDates)
        public
        onlyOwner
        returns (bool)
    {
        require(
            _users.length > 0 &&
                _lockupDates.length > 0 &&
                _users.length == _lockupDates.length,
            "list error"
        );

        address user;
        uint256 lockupDate;

        for (uint256 i = 0; i < _users.length; i++) {
            user = _users[i];
            lockupDate = _lockupDates[i];

            updateLockupList(user, lockupDate);
        }

        return true;
    }

    /**
     * @dev Function update lockup status for purchaser
     * @param _add address
     * @param _lockupDate uint256 this user's lockup time
     * @return A bool that indicates if the operation was successful.
     */
    function updateLockupList(address _add, uint256 _lockupDate)
        public
        onlyOwner
        returns (bool)
    {
        return groupLockup.updateLockupList(_add, _lockupDate);
    }

    /**
     * @dev Function update lockup time
     * @param _oldLockupDate uint256
     * @param _newLockupDate uint256
     * @return A bool that indicates if the operation was successful.
     */
    function updateLockupTime(uint256 _oldLockupDate, uint256 _newLockupDate)
        public
        onlyOwner
        returns (bool)
    {
        return groupLockup.updateLockupTime(_oldLockupDate, _newLockupDate);
    }

    /**
     * @dev called for get status of pause.
     */
    function ispause() public view returns (bool) {
        return paused;
    }

    /**
     * @dev Function update rate
     * @param _newRate rate
     * @return A bool that indicates if the operation was successful.
     */
    function updateRate(int256 _newRate) public onlyOwner returns (bool) {
        require(_newRate >= 1);

        rate = uint256(_newRate);

        emit UpdateRate(msg.sender, rate);

        return true;
    }

    /**
     * @dev Function get rate
     * @return A uint256 that indicates if the operation was successful.
     */
    function getRate() public view returns (uint256) {
        return rate;
    }

    /**
     * @dev Function get minimum wei amount
     * @return A uint256 that indicates if the operation was successful.
     */
    function getMinimumAmount() public view returns (uint256) {
        return minimumWeiAmount;
    }

    /**
     * @dev Function update minimum wei amount
     * @return A uint256 that indicates if the operation was successful.
     */
    function updateMinimumAmount(int256 _newMnimumWeiAmount)
        public
        onlyOwner
        returns (bool)
    {
        require(_newMnimumWeiAmount >= 0);

        minimumWeiAmount = uint256(_newMnimumWeiAmount);

        emit UpdateMinimumAmount(msg.sender, minimumWeiAmount);

        return true;
    }

    /**
     * @dev Function mint token
     * @param _add user wallet
     * @param _amount amount want to mint
     * @return A bool that indicates if the operation was successful.
     */
    function mint(address _add, int256 _amount)
        public
        onlyOwner
        returns (bool)
    {
        require(_add != address(0), "user wallet is not the correct address");

        require(_amount > 0, "invalid amount");

        uint256 amount = uint256(_amount);

        erc20Token.mint(_add, amount);

        return true;
    }

    /**
     * @dev Function mint stop
     * @return A bool that indicates if the operation was successful.
     */
    function finishMinting() public onlyOwner returns (bool) {
        erc20Token.finishMinting();

        return true;
    }

    /**
     * @dev Function burn token
     * @param _amount amount to burn.
     * @return A bool that indicates if the operation was successful.
     */
    function burn(int256 _amount)
        public
        onlyOwner
        returns (bool)
    {
        require(_amount > 0, "invalid amount");

        uint256 amount = uint256(_amount);
        erc20Token.burn(amount);
        return true;
    }

    /**
     * @dev Function burn token
     * @param _add address to burn token from
     * @param _amount amount to burn.
     * @return A bool that indicates if the operation was successful.
     */
    function burnFrom(address _add, int256 _amount)
        public
        onlyOwner
        returns (bool)
    {
        require(_add != address(0), "user wallet is not the correct address");
        require(_amount > 0, "invalid amount");

        uint256 amount = uint256(_amount);
        erc20Token.burnFrom(_add, amount);

        return true;
    }
}

Contract Security Audit

Contract ABI

[{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"sendTokens","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_users","type":"address[]"},{"name":"_values","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"unsaleOwnerWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"mint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_UNSALE_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_value","type":"uint256"}],"name":"burnFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[{"name":"","type":"bool"}],"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":"ownerWallet","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"groupLockup","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"INITIAL_SALE_SUPPLY","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_saleOwnerWallet","type":"address"},{"name":"_unsaleOwnerWallet","type":"address"},{"name":"_groupLockup","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"msg","type":"string"}],"name":"BatchTransferFail","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","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":"burner","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Burn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"}]

60806040526000600360146101000a81548160ff0219169083151502179055503480156200002c57600080fd5b50604051606080620033fd83398101806040528101908080519060200190929190805190602001909291908051906020019092919050505033600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600560006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550620001b0600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260ff16600a0a6101e20262000210640100000000026401000000009004565b5062000206600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16601260ff16600a0a6101e202601260ff16600a0a6101e2020362000210640100000000026401000000009004565b5050505062000435565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200026f57600080fd5b600360149054906101000a900460ff161515156200028c57600080fd5b620002b182600154620004186401000000000262002b0c179091906401000000009004565b60018190555062000318826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054620004186401000000000262002b0c179091906401000000009004565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600081830190508281101515156200042c57fe5b80905092915050565b612fb880620004456000396000f30060806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305ab421d1461016457806305d2035b146101c957806306fdde03146101f8578063095ea7b3146102885780631239ec8c146102ed57806318160ddd146103ce5780631b187267146103f957806323b872dd146104505780632ff2e9dc146104d5578063313ce5671461050057806340c10f191461053157806342966c681461059657806366188463146105c357806370a0823114610628578063715018a61461067f57806379151acc1461069657806379cc6790146106c15780637d64bcb41461070e5780638da5cb5b1461073d5780639335dcb71461079457806395d89b41146107eb578063a9059cbb1461087b578063bb81408f146108e0578063d73dd62314610937578063d874e4531461099c578063dd62ed3e146109c7578063f2fde38b14610a3e575b600080fd5b34801561017057600080fd5b506101af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a81565b604051808215151515815260200191505060405180910390f35b3480156101d557600080fd5b506101de610d85565b604051808215151515815260200191505060405180910390f35b34801561020457600080fd5b5061020d610d98565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024d578082015181840152602081019050610232565b50505050905090810190601f16801561027a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029457600080fd5b506102d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dd1565b604051808215151515815260200191505060405180910390f35b3480156102f957600080fd5b506103b4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610ec3565b604051808215151515815260200191505060405180910390f35b3480156103da57600080fd5b506103e36113ea565b6040518082815260200191505060405180910390f35b34801561040557600080fd5b5061040e6113f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561045c57600080fd5b506104bb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061141a565b604051808215151515815260200191505060405180910390f35b3480156104e157600080fd5b506104ea611ab3565b6040518082815260200191505060405180910390f35b34801561050c57600080fd5b50610515611ac2565b604051808260ff1660ff16815260200191505060405180910390f35b34801561053d57600080fd5b5061057c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac7565b604051808215151515815260200191505060405180910390f35b3480156105a257600080fd5b506105c160048036038101908080359060200190929190505050611cad565b005b3480156105cf57600080fd5b5061060e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d15565b604051808215151515815260200191505060405180910390f35b34801561063457600080fd5b50610669600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa7565b6040518082815260200191505060405180910390f35b34801561068b57600080fd5b50610694611fef565b005b3480156106a257600080fd5b506106ab6120f4565b6040518082815260200191505060405180910390f35b3480156106cd57600080fd5b5061070c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612110565b005b34801561071a57600080fd5b5061072361217a565b604051808215151515815260200191505060405180910390f35b34801561074957600080fd5b50610752612242565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a057600080fd5b506107a9612268565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107f757600080fd5b5061080061228e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610840578082015181840152602081019050610825565b50505050905090810190601f16801561086d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561088757600080fd5b506108c6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122c7565b604051808215151515815260200191505060405180910390f35b3480156108ec57600080fd5b506108f56127d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561094357600080fd5b50610982600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127f9565b604051808215151515815260200191505060405180910390f35b3480156109a857600080fd5b506109b16129f5565b6040518082815260200191505060405180910390f35b3480156109d357600080fd5b50610a28600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a04565b6040518082815260200191505060405180910390f35b348015610a4a57600080fd5b50610a7f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a8b565b005b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610adf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b1b57600080fd5b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610b8a57600080fd5b610bfd82600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cb2826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600360149054906101000a900460ff1681565b6040805190810160405280600581526020017f4b696e6b6100000000000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600080600080600060606000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f2b57600080fd5b600090505b88518110156113d9578881815181101515610f4757fe5b9060200190602002015195508781815181101515610f6157fe5b906020019060200201519450600093506000925060206040519081016040528060008152509150853b159350831515610fd1576040805190810160405280601d81526020017f74727920746f2073656e6420746f6b656e20746f20636f6e74726163740000008152509150611163565b600085111515611018576040805190810160405280601e81526020017f74727920746f2073656e642077726f6e6720746f6b656e20616d6f756e7400008152509150611162565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156110b157606060405190810160405280602281526020017f74727920746f2073656e6420746f6b656e20746f20656d70747920616464726581526020017f73730000000000000000000000000000000000000000000000000000000000008152509150611161565b6000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485111561115b57606060405190810160405280602981526020017f746f6b656e20616d6f756e74206973206c6172676572207468616e206769766581526020017f7220686f6c64696e6700000000000000000000000000000000000000000000008152509150611160565b600192505b5b5b5b82156112f9576111ba856000808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b6000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061124d856000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a36113cc565b8573ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f652ae18456b6dd0d8b5d75716afe0a82b4b565dc0391b2635b4ee38203b54e4a87856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611390578082015181840152602081019050611375565b50505050905090810190601f1680156113bd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35b8080600101915050610f30565b600196505050505050509392505050565b6000600154905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561146c57600080fd5b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111515156114f757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561153357600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166326511869876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b81019080805190602001909291905050509150811561180c57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a599182876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156116f057600080fd5b505af1158015611704573d6000803e3d6000fd5b505050506040513d602081101561171a57600080fd5b8101908080519060200190929190505050905060001515600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d6c97b92836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156117c257600080fd5b505af11580156117d6573d6000803e3d6000fd5b505050506040513d60208110156117ec57600080fd5b8101908080519060200190929190505050151514151561180b57600080fd5b5b61185d846000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118f0846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119c184600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a36001925050509392505050565b601260ff16600a0a6101e20281565b601281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b2557600080fd5b600360149054906101000a900460ff16151515611b4157600080fd5b611b5682600154612b0c90919063ffffffff16565b600181905550611bad826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d0957600080fd5b611d1281612b28565b50565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083101515611e27576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ebb565b611e3a8382612af390919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561204b57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601260ff16600a0a6101e202601260ff16600a0a6101e2020381565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561216c57600080fd5b6121768282612b35565b5050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121d857600080fd5b600360149054906101000a900460ff161515156121f457600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f584e4b000000000000000000000000000000000000000000000000000000000081525081565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561230757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561235457600080fd5b60008411151561236357600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166326511869336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561242057600080fd5b505af1158015612434573d6000803e3d6000fd5b505050506040513d602081101561244a57600080fd5b81019080805190602001909291905050509150811561263c57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a599182336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d602081101561254a57600080fd5b8101908080519060200190929190505050905060001515600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d6c97b92836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156125f257600080fd5b505af1158015612606573d6000803e3d6000fd5b505050506040513d602081101561261c57600080fd5b8101908080519060200190929190505050151514151561263b57600080fd5b5b61268d846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612720846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a360019250505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061288a82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b601260ff16600a0a6101e20281565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ae757600080fd5b612af081612cdd565b50565b6000828211151515612b0157fe5b818303905092915050565b60008183019050828110151515612b1f57fe5b80905092915050565b612b323382612dd9565b50565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515612bc057600080fd5b612c4f81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612cd98282612dd9565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612d1957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515612e2657600080fd5b612e77816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612ece81600154612af390919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505600a165627a7a7230582099f1fc96d91e9ad993885232b0a055a1bf18c8c136e5e639835bcd8d0c92329c0029000000000000000000000000b88e8407aaf69382994234e4d64f5933a89541b80000000000000000000000005ec59b6ea0b67b90c732e5efa7f78c441adc0838000000000000000000000000b7a1070179f4b093e1fc391a8221afdb681ddead

Deployed Bytecode

0x60806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305ab421d1461016457806305d2035b146101c957806306fdde03146101f8578063095ea7b3146102885780631239ec8c146102ed57806318160ddd146103ce5780631b187267146103f957806323b872dd146104505780632ff2e9dc146104d5578063313ce5671461050057806340c10f191461053157806342966c681461059657806366188463146105c357806370a0823114610628578063715018a61461067f57806379151acc1461069657806379cc6790146106c15780637d64bcb41461070e5780638da5cb5b1461073d5780639335dcb71461079457806395d89b41146107eb578063a9059cbb1461087b578063bb81408f146108e0578063d73dd62314610937578063d874e4531461099c578063dd62ed3e146109c7578063f2fde38b14610a3e575b600080fd5b34801561017057600080fd5b506101af600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610a81565b604051808215151515815260200191505060405180910390f35b3480156101d557600080fd5b506101de610d85565b604051808215151515815260200191505060405180910390f35b34801561020457600080fd5b5061020d610d98565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561024d578082015181840152602081019050610232565b50505050905090810190601f16801561027a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561029457600080fd5b506102d3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610dd1565b604051808215151515815260200191505060405180910390f35b3480156102f957600080fd5b506103b4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019082018035906020019080806020026020016040519081016040528093929190818152602001838360200280828437820191505050505050919291929080359060200190820180359060200190808060200260200160405190810160405280939291908181526020018383602002808284378201915050505050509192919290505050610ec3565b604051808215151515815260200191505060405180910390f35b3480156103da57600080fd5b506103e36113ea565b6040518082815260200191505060405180910390f35b34801561040557600080fd5b5061040e6113f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561045c57600080fd5b506104bb600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035906020019092919050505061141a565b604051808215151515815260200191505060405180910390f35b3480156104e157600080fd5b506104ea611ab3565b6040518082815260200191505060405180910390f35b34801561050c57600080fd5b50610515611ac2565b604051808260ff1660ff16815260200191505060405180910390f35b34801561053d57600080fd5b5061057c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611ac7565b604051808215151515815260200191505060405180910390f35b3480156105a257600080fd5b506105c160048036038101908080359060200190929190505050611cad565b005b3480156105cf57600080fd5b5061060e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611d15565b604051808215151515815260200191505060405180910390f35b34801561063457600080fd5b50610669600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611fa7565b6040518082815260200191505060405180910390f35b34801561068b57600080fd5b50610694611fef565b005b3480156106a257600080fd5b506106ab6120f4565b6040518082815260200191505060405180910390f35b3480156106cd57600080fd5b5061070c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050612110565b005b34801561071a57600080fd5b5061072361217a565b604051808215151515815260200191505060405180910390f35b34801561074957600080fd5b50610752612242565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107a057600080fd5b506107a9612268565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156107f757600080fd5b5061080061228e565b6040518080602001828103825283818151815260200191508051906020019080838360005b83811015610840578082015181840152602081019050610825565b50505050905090810190601f16801561086d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561088757600080fd5b506108c6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506122c7565b604051808215151515815260200191505060405180910390f35b3480156108ec57600080fd5b506108f56127d3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561094357600080fd5b50610982600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506127f9565b604051808215151515815260200191505060405180910390f35b3480156109a857600080fd5b506109b16129f5565b6040518082815260200191505060405180910390f35b3480156109d357600080fd5b50610a28600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a04565b6040518082815260200191505060405180910390f35b348015610a4a57600080fd5b50610a7f600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050612a8b565b005b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610adf57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610b1b57600080fd5b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548211151515610b8a57600080fd5b610bfd82600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b600080600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550610cb2826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff16600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600360149054906101000a900460ff1681565b6040805190810160405280600581526020017f4b696e6b6100000000000000000000000000000000000000000000000000000081525081565b600081600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925846040518082815260200191505060405180910390a36001905092915050565b600080600080600060606000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515610f2b57600080fd5b600090505b88518110156113d9578881815181101515610f4757fe5b9060200190602002015195508781815181101515610f6157fe5b906020019060200201519450600093506000925060206040519081016040528060008152509150853b159350831515610fd1576040805190810160405280601d81526020017f74727920746f2073656e6420746f6b656e20746f20636f6e74726163740000008152509150611163565b600085111515611018576040805190810160405280601e81526020017f74727920746f2073656e642077726f6e6720746f6b656e20616d6f756e7400008152509150611162565b600073ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff1614156110b157606060405190810160405280602281526020017f74727920746f2073656e6420746f6b656e20746f20656d70747920616464726581526020017f73730000000000000000000000000000000000000000000000000000000000008152509150611161565b6000808b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205485111561115b57606060405190810160405280602981526020017f746f6b656e20616d6f756e74206973206c6172676572207468616e206769766581526020017f7220686f6c64696e6700000000000000000000000000000000000000000000008152509150611160565b600192505b5b5b5b82156112f9576111ba856000808d73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b6000808c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555061124d856000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508573ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef876040518082815260200191505060405180910390a36113cc565b8573ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f652ae18456b6dd0d8b5d75716afe0a82b4b565dc0391b2635b4ee38203b54e4a87856040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015611390578082015181840152602081019050611375565b50505050905090810190601f1680156113bd5780820380516001836020036101000a031916815260200191505b50935050505060405180910390a35b8080600101915050610f30565b600196505050505050509392505050565b6000600154905090565b600560009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561146c57600080fd5b600260008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484111515156114f757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561153357600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166326511869876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156115f057600080fd5b505af1158015611604573d6000803e3d6000fd5b505050506040513d602081101561161a57600080fd5b81019080805190602001909291905050509150811561180c57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a599182876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156116f057600080fd5b505af1158015611704573d6000803e3d6000fd5b505050506040513d602081101561171a57600080fd5b8101908080519060200190929190505050905060001515600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d6c97b92836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156117c257600080fd5b505af11580156117d6573d6000803e3d6000fd5b505050506040513d60208110156117ec57600080fd5b8101908080519060200190929190505050151514151561180b57600080fd5b5b61185d846000808973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b6000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506118f0846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506119c184600260008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b600260008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a36001925050509392505050565b601260ff16600a0a6101e20281565b601281565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611b2557600080fd5b600360149054906101000a900460ff16151515611b4157600080fd5b611b5682600154612b0c90919063ffffffff16565b600181905550611bad826000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff167f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d4121396885836040518082815260200191505060405180910390a28273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a36001905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515611d0957600080fd5b611d1281612b28565b50565b600080600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508083101515611e27576000600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611ebb565b611e3a8382612af390919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b8373ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a3600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561204b57600080fd5b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a26000600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b601260ff16600a0a6101e202601260ff16600a0a6101e2020381565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561216c57600080fd5b6121768282612b35565b5050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156121d857600080fd5b600360149054906101000a900460ff161515156121f457600080fd5b6001600360146101000a81548160ff0219169083151502179055507fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0860405160405180910390a16001905090565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6040805190810160405280600381526020017f584e4b000000000000000000000000000000000000000000000000000000000081525081565b60008060008073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415151561230757600080fd5b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054841115151561235457600080fd5b60008411151561236357600080fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166326511869336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561242057600080fd5b505af1158015612434573d6000803e3d6000fd5b505050506040513d602081101561244a57600080fd5b81019080805190602001909291905050509150811561263c57600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635a599182336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561252057600080fd5b505af1158015612534573d6000803e3d6000fd5b505050506040513d602081101561254a57600080fd5b8101908080519060200190929190505050905060001515600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d6c97b92836040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b1580156125f257600080fd5b505af1158015612606573d6000803e3d6000fd5b505050506040513d602081101561261c57600080fd5b8101908080519060200190929190505050151514151561263b57600080fd5b5b61268d846000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b6000803373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612720846000808873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b6000808773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a360019250505092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600061288a82600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612b0c90919063ffffffff16565b600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925600260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546040518082815260200191505060405180910390a36001905092915050565b601260ff16600a0a6101e20281565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515612ae757600080fd5b612af081612cdd565b50565b6000828211151515612b0157fe5b818303905092915050565b60008183019050828110151515612b1f57fe5b80905092915050565b612b323382612dd9565b50565b600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515612bc057600080fd5b612c4f81600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612cd98282612dd9565b5050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515612d1957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000808373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020548111151515612e2657600080fd5b612e77816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612af390919063ffffffff16565b6000808473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550612ece81600154612af390919063ffffffff16565b6001819055508173ffffffffffffffffffffffffffffffffffffffff167fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca5826040518082815260200191505060405180910390a2600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef836040518082815260200191505060405180910390a350505600a165627a7a7230582099f1fc96d91e9ad993885232b0a055a1bf18c8c136e5e639835bcd8d0c92329c0029

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

000000000000000000000000b88e8407aaf69382994234e4d64f5933a89541b80000000000000000000000005ec59b6ea0b67b90c732e5efa7f78c441adc0838000000000000000000000000b7a1070179f4b093e1fc391a8221afdb681ddead

-----Decoded View---------------
Arg [0] : _saleOwnerWallet (address): 0xb88e8407aAF69382994234e4D64F5933A89541B8
Arg [1] : _unsaleOwnerWallet (address): 0x5ec59B6Ea0B67B90C732E5eFa7f78C441ADC0838
Arg [2] : _groupLockup (address): 0xB7A1070179F4B093e1fC391A8221aFdb681dDeaD

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000b88e8407aaf69382994234e4d64f5933a89541b8
Arg [1] : 0000000000000000000000005ec59b6ea0b67b90c732e5efa7f78c441adc0838
Arg [2] : 000000000000000000000000b7a1070179f4b093e1fc391a8221afdb681ddead


Deployed Bytecode Sourcemap

22309:6424:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23719:473;;8:9:-1;5:2;;;30:1;27;20:12;5:2;23719:473:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19349:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19349:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22411:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22411:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;22411:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16521:192;;8:9:-1;5:2;;;30:1;27;20:12;5:2;16521:192:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26594:1668;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26594:1668:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13144:85;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13144:85:0;;;;;;;;;;;;;;;;;;;;;;;22853:32;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22853:32:0;;;;;;;;;;;;;;;;;;;;;;;;;;;25444:907;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25444:907:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22541:79;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22541:79:0;;;;;;;;;;;;;;;;;;;;;;;22499:35;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22499:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;19786:326;;8:9:-1;5:2;;;30:1;27;20:12;5:2;19786:326:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28369:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28369:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;18440:447;;8:9:-1;5:2;;;30:1;27;20:12;5:2;18440:447:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13928:101;;8:9:-1;5:2;;;30:1;27;20:12;5:2;13928:101:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1108:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1108:114:0;;;;;;22718:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22718:93:0;;;;;;;;;;;;;;;;;;;;;;;28614:114;;8:9:-1;5:2;;;30:1;27;20:12;5:2;28614:114:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20232:144;;8:9:-1;5:2;;;30:1;27;20:12;5:2;20232:144:0;;;;;;;;;;;;;;;;;;;;;;;;;;;313:20;;8:9:-1;5:2;;;30:1;27;20:12;5:2;313:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22820:26;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22820:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;22455:37;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22455:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;22455:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24369:790;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24369:790:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22894:30;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22894:30:0;;;;;;;;;;;;;;;;;;;;;;;;;;;17665:307;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17665:307:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22627:84;;8:9:-1;5:2;;;30:1;27;20:12;5:2;22627:84:0;;;;;;;;;;;;;;;;;;;;;;;17040:162;;8:9:-1;5:2;;;30:1;27;20:12;5:2;17040:162:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1390:105;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1390:105:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;23719:473;23821:4;816:5;;;;;;;;;;;802:19;;:10;:19;;;794:28;;;;;;;;23866:1;23851:17;;:3;:17;;;;23843:26;;;;;;;;23898:8;:21;23907:11;;;;;;;;;;;23898:21;;;;;;;;;;;;;;;;23888:6;:31;;23880:40;;;;;;;;24025:33;24051:6;24025:8;:21;24034:11;;;;;;;;;;;24025:21;;;;;;;;;;;;;;;;:25;;:33;;;;:::i;:::-;24001:8;:21;24010:11;;;;;;;;;;;24001:21;;;;;;;;;;;;;;;:57;;;;24085:25;24103:6;24085:8;:13;24094:3;24085:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;24069:8;:13;24078:3;24069:13;;;;;;;;;;;;;;;:41;;;;24150:3;24128:34;;24137:11;;;;;;;;;;;24128:34;;;24155:6;24128:34;;;;;;;;;;;;;;;;;;24180:4;24173:11;;23719:473;;;;:::o;19349:35::-;;;;;;;;;;;;;:::o;22411:37::-;;;;;;;;;;;;;;;;;;;;:::o;16521:192::-;16588:4;16633:6;16601:7;:19;16609:10;16601:19;;;;;;;;;;;;;;;:29;16621:8;16601:29;;;;;;;;;;;;;;;:38;;;;16672:8;16651:38;;16660:10;16651:38;;;16682:6;16651:38;;;;;;;;;;;;;;;;;;16703:4;16696:11;;16521:192;;;;:::o;26594:1668::-;26729:4;26746:10;26767:13;26791:18;26820:16;26847:29;26894:9;816:5;;;;;;;;;;;802:19;;:10;:19;;;794:28;;;;;;;;26906:1;26894:13;;26889:1342;26913:6;:13;26909:1;:17;26889:1342;;;26953:6;26960:1;26953:9;;;;;;;;;;;;;;;;;;26948:14;;26985:7;26993:1;26985:10;;;;;;;;;;;;;;;;;;26977:18;;27026:5;27010:21;;27060:5;27046:19;;27080:20;;;;;;;;;;;;;;;27324:2;27312:15;27305:23;27288:40;;27390:13;27389:14;27385:518;;;27424:49;;;;;;;;;;;;;;;;;;;;27385:518;;;27508:1;27499:5;:10;;27495:408;;;27530:50;;;;;;;;;;;;;;;;;;;;27495:408;;;27620:1;27606:16;;:2;:16;;;27602:301;;;27643:54;;;;;;;;;;;;;;;;;;;;;;;;;27602:301;;;27731:8;:15;27740:5;27731:15;;;;;;;;;;;;;;;;27723:5;:23;27719:184;;;27767:61;;;;;;;;;;;;;;;;;;;;;;;;;27719:184;;;27883:4;27869:18;;27719:184;27602:301;27495:408;27385:518;27923:11;27919:301;;;27973:26;27993:5;27973:8;:15;27982:5;27973:15;;;;;;;;;;;;;;;;:19;;:26;;;;:::i;:::-;27955:8;:15;27964:5;27955:15;;;;;;;;;;;;;;;:44;;;;28033:23;28050:5;28033:8;:12;28042:2;28033:12;;;;;;;;;;;;;;;;:16;;:23;;;;:::i;:::-;28018:8;:12;28027:2;28018:12;;;;;;;;;;;;;;;:38;;;;28096:2;28080:26;;28089:5;28080:26;;;28100:5;28080:26;;;;;;;;;;;;;;;;;;27919:301;;;28177:2;28152:52;;28170:5;28152:52;;;28181:5;28188:15;28152:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23:1:-1;8:100;33:3;30:1;27:10;8:100;;;99:1;94:3;90:11;84:18;80:1;75:3;71:11;64:39;52:2;49:1;45:10;40:15;;8:100;;;12:14;28152:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27919:301;26928:3;;;;;;;26889:1342;;;28250:4;28243:11;;26594:1668;;;;;;;;;;;:::o;13144:85::-;13188:7;13211:12;;13204:19;;13144:85;:::o;22853:32::-;;;;;;;;;;;;;:::o;25444:907::-;25560:4;25779:17;25960:18;25595:8;:15;25604:5;25595:15;;;;;;;;;;;;;;;;25585:6;:25;;25577:34;;;;;;;;25640:7;:14;25648:5;25640:14;;;;;;;;;;;;;;;:26;25655:10;25640:26;;;;;;;;;;;;;;;;25630:6;:36;;25622:45;;;;;;;;25701:1;25686:17;;:3;:17;;;;25678:26;;;;;;;;25799:11;;;;;;;;;;;:24;;;25824:5;25799:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25799:31:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25799:31:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25799:31:0;;;;;;;;;;;;;;;;25779:51;;25931:12;25927:163;;;25981:11;;;;;;;;;;;:25;;;26007:5;25981:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;25981:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;25981:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;25981:32:0;;;;;;;;;;;;;;;;25960:53;;26072:5;26036:41;;:11;;;;;;;;;;;:20;;;26057:10;26036:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;26036:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;26036:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;26036:32:0;;;;;;;;;;;;;;;;:41;;;26028:50;;;;;;;;25927:163;26120:27;26140:6;26120:8;:15;26129:5;26120:15;;;;;;;;;;;;;;;;:19;;:27;;;;:::i;:::-;26102:8;:15;26111:5;26102:15;;;;;;;;;;;;;;;:45;;;;26174:25;26192:6;26174:8;:13;26183:3;26174:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;26158:8;:13;26167:3;26158:13;;;;;;;;;;;;;;;:41;;;;26239:38;26270:6;26239:7;:14;26247:5;26239:14;;;;;;;;;;;;;;;:26;26254:10;26239:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;26210:7;:14;26218:5;26210:14;;;;;;;;;;;;;;;:26;26225:10;26210:26;;;;;;;;;;;;;;;:67;;;;26309:3;26293:28;;26302:5;26293:28;;;26314:6;26293:28;;;;;;;;;;;;;;;;;;26339:4;26332:11;;25444:907;;;;;;;:::o;22541:79::-;22532:2;22602:17;;22598:2;:21;22591:3;:29;22541:79;:::o;22499:35::-;22532:2;22499:35;:::o;19786:326::-;19907:4;19522:5;;;;;;;;;;;19508:19;;:10;:19;;;19500:28;;;;;;;;19428:15;;;;;;;;;;;19427:16;19419:25;;;;;;;;19938;19955:7;19938:12;;:16;;:25;;;;:::i;:::-;19923:12;:40;;;;19986:26;20004:7;19986:8;:13;19995:3;19986:13;;;;;;;;;;;;;;;;:17;;:26;;;;:::i;:::-;19970:8;:13;19979:3;19970:13;;;;;;;;;;;;;;;:42;;;;20029:3;20024:18;;;20034:7;20024:18;;;;;;;;;;;;;;;;;;20075:3;20054:34;;20071:1;20054:34;;;20080:7;20054:34;;;;;;;;;;;;;;;;;;20102:4;20095:11;;19786:326;;;;:::o;28369:84::-;816:5;;;;;;;;;;;802:19;;:10;:19;;;794:28;;;;;;;;28427:18;28438:6;28427:10;:18::i;:::-;28369:84;:::o;18440:447::-;18551:4;18567:16;18586:7;:19;18594:10;18586:19;;;;;;;;;;;;;;;:29;18606:8;18586:29;;;;;;;;;;;;;;;;18567:48;;18646:8;18626:16;:28;;18622:169;;;18697:1;18665:7;:19;18673:10;18665:19;;;;;;;;;;;;;;;:29;18685:8;18665:29;;;;;;;;;;;;;;;:33;;;;18622:169;;;18753:30;18766:16;18753:8;:12;;:30;;;;:::i;:::-;18721:7;:19;18729:10;18721:19;;;;;;;;;;;;;;;:29;18741:8;18721:29;;;;;;;;;;;;;;;:62;;;;18622:169;18823:8;18802:61;;18811:10;18802:61;;;18833:7;:19;18841:10;18833:19;;;;;;;;;;;;;;;:29;18853:8;18833:29;;;;;;;;;;;;;;;;18802:61;;;;;;;;;;;;;;;;;;18877:4;18870:11;;18440:447;;;;;:::o;13928:101::-;13984:7;14007:8;:16;14016:6;14007:16;;;;;;;;;;;;;;;;14000:23;;13928:101;;;:::o;1108:114::-;816:5;;;;;;;;;;;802:19;;:10;:19;;;794:28;;;;;;;;1185:5;;;;;;;;;;;1166:25;;;;;;;;;;;;1214:1;1198:5;;:18;;;;;;;;;;;;;;;;;;1108:114::o;22718:93::-;22532:2;22693:17;;22689:2;:21;22682:3;:29;22532:2;22602:17;;22598:2;:21;22591:3;:29;22775:36;22718:93;:::o;28614:114::-;816:5;;;;;;;;;;;802:19;;:10;:19;;;794:28;;;;;;;;28691:29;28706:5;28713:6;28691:14;:29::i;:::-;28614:114;;:::o;20232:144::-;20291:4;816:5;;;;;;;;;;;802:19;;:10;:19;;;794:28;;;;;;;;19428:15;;;;;;;;;;;19427:16;19419:25;;;;;;;;20322:4;20304:15;;:22;;;;;;;;;;;;;;;;;;20338:14;;;;;;;;;;20366:4;20359:11;;20232:144;:::o;313:20::-;;;;;;;;;;;;;:::o;22820:26::-;;;;;;;;;;;;;:::o;22455:37::-;;;;;;;;;;;;;;;;;;;;:::o;24369:790::-;24432:4;24568:17;24756:18;24472:1;24457:17;;:3;:17;;;;24449:26;;;;;;;;24504:8;:20;24513:10;24504:20;;;;;;;;;;;;;;;;24494:6;:30;;24486:39;;;;;;;;24553:1;24544:6;:10;24536:19;;;;;;;;24588:11;;;;;;;;;;;:24;;;24613:10;24588:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24588:36:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24588:36:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24588:36:0;;;;;;;;;;;;;;;;24568:56;;24727:12;24723:168;;;24777:11;;;;;;;;;;;:25;;;24803:10;24777:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24777:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24777:37:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24777:37:0;;;;;;;;;;;;;;;;24756:58;;24873:5;24837:41;;:11;;;;;;;;;;;:20;;;24858:10;24837:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;24837:32:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;24837:32:0;;;;;;;13:2:-1;8:3;5:11;2:2;;;29:1;26;19:12;2:2;24837:32:0;;;;;;;;;;;;;;;;:41;;;24829:50;;;;;;;;24723:168;24994:32;25019:6;24994:8;:20;25003:10;24994:20;;;;;;;;;;;;;;;;:24;;:32;;;;:::i;:::-;24971:8;:20;24980:10;24971:20;;;;;;;;;;;;;;;:55;;;;25053:25;25071:6;25053:8;:13;25062:3;25053:13;;;;;;;;;;;;;;;;:17;;:25;;;;:::i;:::-;25037:8;:13;25046:3;25037:13;;;;;;;;;;;;;;;:41;;;;25117:3;25096:33;;25105:10;25096:33;;;25122:6;25096:33;;;;;;;;;;;;;;;;;;25147:4;25140:11;;24369:790;;;;;;:::o;22894:30::-;;;;;;;;;;;;;:::o;17665:307::-;17771:4;17828:46;17862:11;17828:7;:19;17836:10;17828:19;;;;;;;;;;;;;;;:29;17848:8;17828:29;;;;;;;;;;;;;;;;:33;;:46;;;;:::i;:::-;17787:7;:19;17795:10;17787:19;;;;;;;;;;;;;;;:29;17807:8;17787:29;;;;;;;;;;;;;;;:88;;;;17908:8;17887:61;;17896:10;17887:61;;;17918:7;:19;17926:10;17918:19;;;;;;;;;;;;;;;:29;17938:8;17918:29;;;;;;;;;;;;;;;;17887:61;;;;;;;;;;;;;;;;;;17962:4;17955:11;;17665:307;;;;:::o;22627:84::-;22532:2;22693:17;;22689:2;:21;22682:3;:29;22627:84;:::o;17040:162::-;17145:7;17171;:15;17179:6;17171:15;;;;;;;;;;;;;;;:25;17187:8;17171:25;;;;;;;;;;;;;;;;17164:32;;17040:162;;;;:::o;1390:105::-;816:5;;;;;;;;;;;802:19;;:10;:19;;;794:28;;;;;;;;1460:29;1479:9;1460:18;:29::i;:::-;1390:105;:::o;6252:119::-;6312:7;6341:2;6335;:8;;6328:16;;;;;;6363:2;6358;:7;6351:14;;6252:119;;;;:::o;6438:132::-;6498:9;6525:2;6520;:7;6516:11;;6546:2;6541:1;:7;;6534:15;;;;;;6563:1;6556:8;;6438:132;;;;:::o;20795:75::-;20839:25;20845:10;20857:6;20839:5;:25::i;:::-;20795:75;:::o;21855:376::-;21936:7;:14;21944:5;21936:14;;;;;;;;;;;;;;;:26;21951:10;21936:26;;;;;;;;;;;;;;;;21926:6;:36;;21918:45;;;;;;;;22160:38;22191:6;22160:7;:14;22168:5;22160:14;;;;;;;;;;;;;;;:26;22175:10;22160:26;;;;;;;;;;;;;;;;:30;;:38;;;;:::i;:::-;22131:7;:14;22139:5;22131:14;;;;;;;;;;;;;;;:26;22146:10;22131:26;;;;;;;;;;;;;;;:67;;;;22205:20;22211:5;22218:6;22205:5;:20::i;:::-;21855:376;;:::o;1636:175::-;1728:1;1707:23;;:9;:23;;;;1699:32;;;;;;;;1771:9;1743:38;;1764:5;;;;;;;;;;;1743:38;;;;;;;;;;;;1796:9;1788:5;;:17;;;;;;;;;;;;;;;;;;1636:175;:::o;20876:447::-;20955:8;:14;20964:4;20955:14;;;;;;;;;;;;;;;;20945:6;:24;;20937:33;;;;;;;;21169:26;21188:6;21169:8;:14;21178:4;21169:14;;;;;;;;;;;;;;;;:18;;:26;;;;:::i;:::-;21152:8;:14;21161:4;21152:14;;;;;;;;;;;;;;;:43;;;;21217:24;21234:6;21217:12;;:16;;:24;;;;:::i;:::-;21202:12;:39;;;;21258:4;21253:18;;;21264:6;21253:18;;;;;;;;;;;;;;;;;;21306:1;21283:34;;21292:4;21283:34;;;21310:6;21283:34;;;;;;;;;;;;;;;;;;20876:447;;:::o

Swarm Source

bzzr://99f1fc96d91e9ad993885232b0a055a1bf18c8c136e5e639835bcd8d0c92329c

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

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

OVERVIEW

Kinka (XNK) is a real-world stable coin launched in collaboration between Daiichi Commodities, a publicly traded company on the Tokyo Stock Exchange (TSE) under the ticker symbol 8746.T, and Crowd Bank, Japan's largest crowdfunding platform.

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ 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.