Contract 0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf5

Contract Overview

Balance:
0 Ether
TxHash Block Age From To Value [TxFee]
0xa6fbd5f64936f3cd71da4b34c7d3f94ff0af3852498dba47ca07306192467c97489213954 days 22 hrs ago0x9858effd232b4033e47d90003d41ec34ecaeda94 IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000083842409
0x21f2884de38c1db8196dd99ba489192be012591607dfdab95856184d011083ad4459715122 days 1 hr ago0x65c18990c1eabff13dfb922df07f11a6fa6b3c93 IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000025093
0x09b1052cb78576dc237781a5ae75b2e9254bf16552d8c45f37bd30336e9ba31e4295408147 days 7 hrs ago0x2f007fed5413938b48e86cd9131f02c8703ef740 IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf51 Ether0.000042092
0x572bd840d9272ad7985dddd180eb53364fc0cd1ff82b987d0fb5f06b5f9a08d74158275169 days 15 hrs ago0x2932b7a2355d6fecc4b5c0b6bd44cc31df247a2e IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.002503215
0x32f38e67f6ee5c050aea637be446cd76055f11b80d654b3f01db51e2ca71a5624136147173 days 45 mins ago0x25d0858955fbf086063748f1ebe733adb441eefe IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000022131
0xeb3d5b35c41f85296386e038949df2bdaedd082a2668e6110df6e2104e54cf4b4136147173 days 45 mins ago0x25d0858955fbf086063748f1ebe733adb441eefe IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000021889
0x6faeae4209c7cf9bf20b1c245db1f6ca72a8c48086a6c1486140f2e275df69b94136129173 days 48 mins ago0x25d0858955fbf086063748f1ebe733adb441eefe IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000045238
0x8086707eb12fcd9d6b2412f470177f6af2d76d9427594622552039445d643de14135314173 days 3 hrs ago0x25d0858955fbf086063748f1ebe733adb441eefe IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000045238
0xb1f4961370dda54a2d51d5bec4ba6a600fc26d2a31c244926336379b3ddb94114059006184 days 16 hrs ago0xbe862ad9abfe6f22bcb087716c7d89a26051f74c IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.0005057
0x39c5c310eec72f89b7e65adb8fa864407ee171371397c0b63d8b88e79f0e45cc3998736193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.001259377
0x8c6f548cc3f147780b0f039e26595d9198cf8af92595c6ffc347e5a9bc0c7ebd3998735193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000688693
0x530ea6ed91a2b8909358693b502c4488d422a3f67ba7269439994728644be8e43998730193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.001330657
0xad61ac65b28d94952ce5daa75db7b13292f4b27ba68b58f54d4a7341c66382603998730193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000380884
0xcdfba9953ce6338bb9357472126b32fb316109135dd0474890262f6d8dc80f903998728193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.001330849
0x80f1f7a6e378751dc1e7f91e2145a4d2647e3e4987e8d80b6b96f1bbf4b1cb793998725193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000436419
0xa7b38960a943c8f0e3175aff93763664b63ffef98f1211f7f492da912e6313e63998725193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.001188353
0x7fc03836d014092859698e75e7e532d55525085d5d9c58bcacaa96730e53f97f3998725193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000688765
0xcbd45a5e250401e447a91b5ec04dd35e7a997e95d35a0adae4b273c1634fb6cb3998723193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000365079
0xa1dfca50665edcc845174d0cd04c38512e74e97103aa771fce165354121445903998723193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000992326
0x4a6cdcd6934d3c18eb23dc6d84e0a98dfcbae4fae119931206688560ff05df9d3998723193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000577303
0xf95bdd201a3c47df6258b70be60241e9e0303ac2e4824bd020ef42178d9da2973998722193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000990586
0x103d2a12ff84bc31cbab15a8f3747056c7d0db596f47f7efc274a18126e635b13998722193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.001223703
0x12173f6c7c79c7a08f7ff1051f77d865f8f150e146c8ed3a5b5585aaf6ae8a653998722193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000346114
0xbb4e08add7c1eb2ca9f72fcb9722983a69ec7a053eb61d7c2893edd2f6cbd57f3998719193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.00102492
0x52ba446666ea573256cc8c907d7a0c5807bf3051e6bc4e131dbfdf623aa6d0973998719193 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b IN  0xb6af4bfdb7f5c00d1f87a5d62209ef11be6e3cf50 Ether0.000539985
[ Download CSV Export 

Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
Warning: The compiled contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) Solidity Compiler Bugs.

Contract Source Code Verified (Exact Match)

Contract Name:
Token

Compiler Version
v0.4.23+commit.124ca40d

Optimization Enabled:
Yes

Runs (Optimizer):
200

Contract Source Code

pragma solidity 0.4.23;


/**
 * @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 OwnershipTransferred(address indexed previousOwner, address indexed newOwner);


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  function Ownable() 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 transfer control of the contract to a newOwner.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    require(newOwner != address(0));
    emit OwnershipTransferred(owner, newOwner);
    owner = newOwner;
  }

}


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


/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * @dev 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);
}




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

  mapping(address => uint256) balances;

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

    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];
  }

}



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



/**
 * @title Standard ERC20 token
 *
 * @dev Implementation of the basic standard token.
 * @dev https://github.com/ethereum/EIPs/issues/20
 * @dev 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(_to != address(0));
    require(_value <= balances[_from]);
    require(_value <= allowed[_from][msg.sender]);

    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, uint _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, uint _subtractedValue) public returns (bool) {
    uint 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;
  }

}


/// @title   Token
/// @author  Jose Perez - <[email protected]>
/// @notice  ERC20 token
/// @dev     The contract allows to perform a number of token sales in different periods in time.
///          allowing participants in previous token sales to transfer tokens to other accounts.
///          Additionally, token locking logic for KYC/AML compliance checking is supported.

contract Token is StandardToken, Ownable {
    using SafeMath for uint256;

    string public constant name = "Token";
    string public constant symbol = "TOK";
    uint256 public constant decimals = 18;

    // Using same number of decimal figures as ETH (i.e. 18).
    uint256 public constant TOKEN_UNIT = 10 ** uint256(decimals);

    // Maximum number of tokens in circulation
    uint256 public constant MAX_TOKEN_SUPPLY = 5000000000000 * TOKEN_UNIT;

    // Maximum number of tokens sales to be performed.
    uint256 public constant MAX_TOKEN_SALES = 2;

    // Maximum size of the batch functions input arrays.
    uint256 public constant MAX_BATCH_SIZE = 400;

    address public assigner;    // The address allowed to assign or mint tokens during token sale.
    address public locker;      // The address allowed to lock/unlock addresses.

    mapping(address => bool) public locked;        // If true, address' tokens cannot be transferred.

    uint256 public currentTokenSaleId = 0;           // The id of the current token sale.
    mapping(address => uint256) public tokenSaleId;  // In which token sale the address participated.

    bool public tokenSaleOngoing = false;

    event TokenSaleStarting(uint indexed tokenSaleId);
    event TokenSaleEnding(uint indexed tokenSaleId);
    event Lock(address indexed addr);
    event Unlock(address indexed addr);
    event Assign(address indexed to, uint256 amount);
    event Mint(address indexed to, uint256 amount);
    event LockerTransferred(address indexed previousLocker, address indexed newLocker);
    event AssignerTransferred(address indexed previousAssigner, address indexed newAssigner);

    /// @dev Constructor that initializes the contract.
    /// @param _assigner The assigner account.
    /// @param _locker The locker account.
    constructor(address _assigner, address _locker) public {
        require(_assigner != address(0));
        require(_locker != address(0));

        assigner = _assigner;
        locker = _locker;
    }

    /// @dev True if a token sale is ongoing.
    modifier tokenSaleIsOngoing() {
        require(tokenSaleOngoing);
        _;
    }

    /// @dev True if a token sale is not ongoing.
    modifier tokenSaleIsNotOngoing() {
        require(!tokenSaleOngoing);
        _;
    }

    /// @dev Throws if called by any account other than the assigner.
    modifier onlyAssigner() {
        require(msg.sender == assigner);
        _;
    }

    /// @dev Throws if called by any account other than the locker.
    modifier onlyLocker() {
        require(msg.sender == locker);
        _;
    }

    /// @dev Starts a new token sale. Only the owner can start a new token sale. If a token sale
    ///      is ongoing, it has to be ended before a new token sale can be started.
    ///      No more than `MAX_TOKEN_SALES` sales can be carried out.
    /// @return True if the operation was successful.
    function tokenSaleStart() external onlyOwner tokenSaleIsNotOngoing returns(bool) {
        require(currentTokenSaleId < MAX_TOKEN_SALES);
        currentTokenSaleId++;
        tokenSaleOngoing = true;
        emit TokenSaleStarting(currentTokenSaleId);
        return true;
    }

    /// @dev Ends the current token sale. Only the owner can end a token sale.
    /// @return True if the operation was successful.
    function tokenSaleEnd() external onlyOwner tokenSaleIsOngoing returns(bool) {
        emit TokenSaleEnding(currentTokenSaleId);
        tokenSaleOngoing = false;
        return true;
    }

    /// @dev Returns whether or not a token sale is ongoing.
    /// @return True if a token sale is ongoing.
    function isTokenSaleOngoing() external view returns(bool) {
        return tokenSaleOngoing;
    }

    /// @dev Getter of the variable `currentTokenSaleId`.
    /// @return Returns the current token sale id.
    function getCurrentTokenSaleId() external view returns(uint256) {
        return currentTokenSaleId;
    }

    /// @dev Getter of the variable `tokenSaleId[]`.
    /// @param _address The address of the participant.
    /// @return Returns the id of the token sale the address participated in.
    function getAddressTokenSaleId(address _address) external view returns(uint256) {
        return tokenSaleId[_address];
    }

    /// @dev Allows the current owner to change the assigner.
    /// @param _newAssigner The address of the new assigner.
    /// @return True if the operation was successful.
    function transferAssigner(address _newAssigner) external onlyOwner returns(bool) {
        require(_newAssigner != address(0));

        emit AssignerTransferred(assigner, _newAssigner);
        assigner = _newAssigner;
        return true;
    }

    /// @dev Function to mint tokens. It can only be called by the assigner during an ongoing token sale.
    /// @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 onlyAssigner tokenSaleIsOngoing returns(bool) {
        totalSupply_ = totalSupply_.add(_amount);
        require(totalSupply_ <= MAX_TOKEN_SUPPLY);

        if (tokenSaleId[_to] == 0) {
            tokenSaleId[_to] = currentTokenSaleId;
        }
        require(tokenSaleId[_to] == currentTokenSaleId);

        balances[_to] = balances[_to].add(_amount);

        emit Mint(_to, _amount);
        emit Transfer(address(0), _to, _amount);
        return true;
    }

    /// @dev Mints tokens for several addresses in one single call.
    /// @param _to address[] The addresses that get the tokens.
    /// @param _amount address[] The number of tokens to be minted.
    /// @return A boolean that indicates if the operation was successful.
    function mintInBatches(address[] _to, uint256[] _amount) external onlyAssigner tokenSaleIsOngoing returns(bool) {
        require(_to.length > 0);
        require(_to.length == _amount.length);
        require(_to.length <= MAX_BATCH_SIZE);

        for (uint i = 0; i < _to.length; i++) {
            mint(_to[i], _amount[i]);
        }
        return true;
    }

    /// @dev Function to assign any number of tokens to a given address.
    ///      Compared to the `mint` function, the `assign` function allows not just to increase but also to decrease
    ///      the number of tokens of an address by assigning a lower value than the address current balance.
    ///      This function can only be executed during initial token sale.
    /// @param _to The address that will receive the assigned tokens.
    /// @param _amount The amount of tokens to assign.
    /// @return True if the operation was successful.
    function assign(address _to, uint256 _amount) public onlyAssigner tokenSaleIsOngoing returns(bool) {
        require(currentTokenSaleId == 1);

        // The desired value to assign (`_amount`) can be either higher or lower than the current number of tokens
        // of the address (`balances[_to]`). To calculate the new `totalSupply_` value, the difference between `_amount`
        // and `balances[_to]` (`delta`) is calculated first, and then added or substracted to `totalSupply_` accordingly.
        uint256 delta = 0;
        if (balances[_to] < _amount) {
            // balances[_to] will be increased, so totalSupply_ should be increased
            delta = _amount.sub(balances[_to]);
            totalSupply_ = totalSupply_.add(delta);
        } else {
            // balances[_to] will be decreased, so totalSupply_ should be decreased
            delta = balances[_to].sub(_amount);
            totalSupply_ = totalSupply_.sub(delta);
        }
        require(totalSupply_ <= MAX_TOKEN_SUPPLY);

        balances[_to] = _amount;
        tokenSaleId[_to] = currentTokenSaleId;

        emit Assign(_to, _amount);
        emit Transfer(address(0), _to, _amount);
        return true;
    }

    /// @dev Assigns tokens to several addresses in one call.
    /// @param _to address[] The addresses that get the tokens.
    /// @param _amount address[] The number of tokens to be assigned.
    /// @return True if the operation was successful.
    function assignInBatches(address[] _to, uint256[] _amount) external onlyAssigner tokenSaleIsOngoing returns(bool) {
        require(_to.length > 0);
        require(_to.length == _amount.length);
        require(_to.length <= MAX_BATCH_SIZE);

        for (uint i = 0; i < _to.length; i++) {
            assign(_to[i], _amount[i]);
        }
        return true;
    }

    /// @dev Allows the current owner to change the locker.
    /// @param _newLocker The address of the new locker.
    /// @return True if the operation was successful.
    function transferLocker(address _newLocker) external onlyOwner returns(bool) {
        require(_newLocker != address(0));

        emit LockerTransferred(locker, _newLocker);
        locker = _newLocker;
        return true;
    }

    /// @dev Locks an address. A locked address cannot transfer its tokens or other addresses' tokens out.
    ///      Only addresses participating in the current token sale can be locked.
    ///      Only the locker account can lock addresses and only during the token sale.
    /// @param _address address The address to lock.
    /// @return True if the operation was successful.
    function lockAddress(address _address) public onlyLocker tokenSaleIsOngoing returns(bool) {
        require(tokenSaleId[_address] == currentTokenSaleId);
        require(!locked[_address]);

        locked[_address] = true;
        emit Lock(_address);
        return true;
    }

    /// @dev Unlocks an address so that its owner can transfer tokens out again.
    ///      Addresses can be unlocked any time. Only the locker account can unlock addresses
    /// @param _address address The address to unlock.
    /// @return True if the operation was successful.
    function unlockAddress(address _address) public onlyLocker returns(bool) {
        require(locked[_address]);

        locked[_address] = false;
        emit Unlock(_address);
        return true;
    }

    /// @dev Locks several addresses in one single call.
    /// @param _addresses address[] The addresses to lock.
    /// @return True if the operation was successful.
    function lockInBatches(address[] _addresses) external onlyLocker returns(bool) {
        require(_addresses.length > 0);
        require(_addresses.length <= MAX_BATCH_SIZE);

        for (uint i = 0; i < _addresses.length; i++) {
            lockAddress(_addresses[i]);
        }
        return true;
    }

    /// @dev Unlocks several addresses in one single call.
    /// @param _addresses address[] The addresses to unlock.
    /// @return True if the operation was successful.
    function unlockInBatches(address[] _addresses) external onlyLocker returns(bool) {
        require(_addresses.length > 0);
        require(_addresses.length <= MAX_BATCH_SIZE);

        for (uint i = 0; i < _addresses.length; i++) {
            unlockAddress(_addresses[i]);
        }
        return true;
    }

    /// @dev Checks whether or not the given address is locked.
    /// @param _address address The address to be checked.
    /// @return Boolean indicating whether or not the address is locked.
    function isLocked(address _address) external view returns(bool) {
        return locked[_address];
    }

    /// @dev Transfers tokens to the specified address. It prevents transferring tokens from a locked address.
    ///      Locked addresses can receive tokens.
    ///      Current token sale's addresses cannot receive or send tokens until the token sale ends.
    /// @param _to The address to transfer tokens to.
    /// @param _value The number of tokens to be transferred.
    function transfer(address _to, uint256 _value) public returns(bool) {
        require(!locked[msg.sender]);

        if (tokenSaleOngoing) {
            require(tokenSaleId[msg.sender] < currentTokenSaleId);
            require(tokenSaleId[_to] < currentTokenSaleId);
        }

        return super.transfer(_to, _value);
    }

    /// @dev Transfers tokens from one address to another. It prevents transferring tokens if the caller is locked or
    ///      if the allowed address is locked.
    ///      Locked addresses can receive tokens.
    ///      Current token sale's addresses cannot receive or send tokens until the token sale ends.
    /// @param _from address The address to transfer tokens from.
    /// @param _to address The address to transfer tokens to.
    /// @param _value The number of tokens to be transferred.
    function transferFrom(address _from, address _to, uint256 _value) public returns(bool) {
        require(!locked[msg.sender]);
        require(!locked[_from]);

        if (tokenSaleOngoing) {
            require(tokenSaleId[msg.sender] < currentTokenSaleId);
            require(tokenSaleId[_from] < currentTokenSaleId);
            require(tokenSaleId[_to] < currentTokenSaleId);
        }

        return super.transferFrom(_from, _to, _value);
    }
}


/// @title  ExchangeRate
/// @author Jose Perez - <[email protected]>
/// @notice Tamper-proof record of exchange rates e.g. BTC/USD, ETC/USD, etc.
/// @dev    Exchange rates are updated from off-chain server periodically. Rates are taken from a
//          publicly available third-party provider, such as Coinbase, CoinMarketCap, etc.
contract ExchangeRate is Ownable {
    event RateUpdated(string id, uint256 rate);
    event UpdaterTransferred(address indexed previousUpdater, address indexed newUpdater);

    address public updater;

    mapping(string => uint256) internal currentRates;

    /// @dev The ExchangeRate constructor.
    /// @param _updater Account which can update the rates.
    constructor(address _updater) public {
        require(_updater != address(0));
        updater = _updater;
    }

    /// @dev Throws if called by any account other than the updater.
    modifier onlyUpdater() {
        require(msg.sender == updater);
        _;
    }

    /// @dev Allows the current owner to change the updater.
    /// @param _newUpdater The address of the new updater.
    function transferUpdater(address _newUpdater) external onlyOwner {
        require(_newUpdater != address(0));
        emit UpdaterTransferred(updater, _newUpdater);
        updater = _newUpdater;
    }

    /// @dev Allows the current updater account to update a single rate.
    /// @param _id The rate identifier.
    /// @param _rate The exchange rate.
    function updateRate(string _id, uint256 _rate) external onlyUpdater {
        require(_rate != 0);
        currentRates[_id] = _rate;
        emit RateUpdated(_id, _rate);
    }

    /// @dev Allows anyone to read the current rate.
    /// @param _id The rate identifier.
    /// @return The current rate.
    function getRate(string _id) external view returns(uint256) {
        return currentRates[_id];
    }
}


/// @title  VestingTrustee
/// @author Jose Perez - <[email protected]>
/// @notice Vesting trustee contract for Diginex ERC20 tokens. Tokens are granted to specific
///         addresses and vested under certain criteria (vesting period, cliff period, etc.)
///         Tokens must be transferred to the VestingTrustee contract address prior to granting them.
contract VestingTrustee is Ownable {
    using SafeMath for uint256;

    // ERC20 contract.
    Token public token;

    // The address allowed to grant and revoke tokens.
    address public vester;

    // Vesting grant for a specific holder.
    struct Grant {
        uint256 value;
        uint256 start;
        uint256 cliff;
        uint256 end;
        uint256 installmentLength; // In seconds.
        uint256 transferred;
        bool revocable;
    }

    // Holder to grant information mapping.
    mapping (address => Grant) public grants;

    // Total tokens available for vesting.
    uint256 public totalVesting;

    event NewGrant(address indexed _from, address indexed _to, uint256 _value);
    event TokensUnlocked(address indexed _to, uint256 _value);
    event GrantRevoked(address indexed _holder, uint256 _refund);
    event VesterTransferred(address indexed previousVester, address indexed newVester);

    /// @dev Constructor that initializes the VestingTrustee contract.
    /// @param _diginexCoin The address of the previously deployed ERC20 token contract.
    /// @param _vester The vester address.
    constructor(Token _diginexCoin, address _vester) public {
        require(_diginexCoin != address(0));
        require(_vester != address(0));

        token = _diginexCoin;
        vester = _vester;
    }

    // @dev Prevents being called by any account other than the vester.
    modifier onlyVester() {
        require(msg.sender == vester);
        _;
    }

    /// @dev Allows the owner to change the vester.
    /// @param _newVester The address of the new vester.
    /// @return True if the operation was successful.
    function transferVester(address _newVester) external onlyOwner returns(bool) {
        require(_newVester != address(0));

        emit VesterTransferred(vester, _newVester);
        vester = _newVester;
        return true;
    }
    

    /// @dev Grant tokens to a specified address. All time units are in seconds since Unix epoch.
    ///      Tokens must be transferred to the VestingTrustee contract address prior to calling this
    ///      function. The number of tokens assigned to the VestingTrustee contract address must
    //       always be equal or greater than the total number of vested tokens.
    /// @param _to address The holder address.
    /// @param _value uint256 The amount of tokens to be granted.
    /// @param _start uint256 The beginning of the vesting period.
    /// @param _cliff uint256 Time, between _start and _end, when the first installment is made.
    /// @param _end uint256 The end of the vesting period.
    /// @param _installmentLength uint256 The length of each vesting installment.
    /// @param _revocable bool Whether the grant is revocable or not.
    function grant(address _to, uint256 _value, uint256 _start, uint256 _cliff, uint256 _end,
        uint256 _installmentLength, bool _revocable)
        external onlyVester {

        require(_to != address(0));
        require(_to != address(this)); // Don't allow holder to be this contract.
        require(_value > 0);

        // Require that every holder can be granted tokens only once.
        require(grants[_to].value == 0);

        // Require for time ranges to be consistent and valid.
        require(_start <= _cliff && _cliff <= _end);

        // Require installment length to be valid and no longer than (end - start).
        require(_installmentLength > 0 && _installmentLength <= _end.sub(_start));

        // Grant must not exceed the total amount of tokens currently available for vesting.
        require(totalVesting.add(_value) <= token.balanceOf(address(this)));

        // Assign a new grant.
        grants[_to] = Grant({
            value: _value,
            start: _start,
            cliff: _cliff,
            end: _end,
            installmentLength: _installmentLength,
            transferred: 0,
            revocable: _revocable
        });

        // Since tokens have been granted, increase the total amount of vested tokens.
        // This indirectly reduces the total amount available for vesting.
        totalVesting = totalVesting.add(_value);

        emit NewGrant(msg.sender, _to, _value);
    }

    /// @dev Revoke the grant of tokens of a specified grantee address.
    ///      The vester can arbitrarily revoke the tokens of a revocable grant anytime.
    ///      However, the grantee owns `calculateVestedTokens` number of tokens, even if some of them
    ///      have not been transferred to the grantee yet. Therefore, the `revoke` function should
    ///      transfer all non-transferred tokens to their rightful owner. The rest of the granted tokens
    ///      should be transferred to the vester.
    /// @param _holder The address which will have its tokens revoked.
    function revoke(address _holder) public onlyVester {
        Grant storage holderGrant = grants[_holder];

        // Grant must be revocable.
        require(holderGrant.revocable);

        // Calculate number of tokens to be transferred to vester and to holder:
        // holderGrant.value = toVester + vested = toVester + ( toHolder + holderGrant.transferred )
        uint256 vested = calculateVestedTokens(holderGrant, now);
        uint256 toVester = holderGrant.value.sub(vested);
        uint256 toHolder = vested.sub(holderGrant.transferred);

        // Remove grant information.
        delete grants[_holder];

        // Update totalVesting.
        totalVesting = totalVesting.sub(toHolder);
        totalVesting = totalVesting.sub(toVester);

        // Transfer tokens.
        token.transfer(_holder, toHolder);
        token.transfer(vester, toVester);
        
        emit GrantRevoked(_holder, toVester);
    }

    /// @dev Calculate amount of vested tokens at a specifc time.
    /// @param _grant Grant The vesting grant.
    /// @param _time uint256 The time to be checked
    /// @return a uint256 Representing the amount of vested tokens of a specific grant.
    function calculateVestedTokens(Grant _grant, uint256 _time) private pure returns (uint256) {
        // If we're before the cliff, then nothing is vested.
        if (_time < _grant.cliff) {
            return 0;
        }

        // If we're after the end of the vesting period - everything is vested;
        if (_time >= _grant.end) {
            return _grant.value;
        }

        // Calculate amount of installments past until now.
        // NOTE: result gets floored because of integer division.
        uint256 installmentsPast = _time.sub(_grant.start).div(_grant.installmentLength);

        // Calculate amount of days in entire vesting period.
        uint256 vestingDays = _grant.end.sub(_grant.start);

        // Calculate and return installments that have passed according to vesting days that have passed.
        return _grant.value.mul(installmentsPast.mul(_grant.installmentLength)).div(vestingDays);
    }

    /// @dev Calculate the total amount of vested tokens of a holder at a given time.
    /// @param _holder address The address of the holder.
    /// @param _time uint256 The specific time to calculate against.
    /// @return a uint256 Representing a holder's total amount of vested tokens.
    function vestedTokens(address _holder, uint256 _time) external view returns (uint256) {
        Grant memory holderGrant = grants[_holder];

        if (holderGrant.value == 0) {
            return 0;
        }

        return calculateVestedTokens(holderGrant, _time);
    }

    /// @dev Unlock vested tokens and transfer them to their holder.
    /// @param _holder address The address of the holder.
    function unlockVestedTokens(address _holder) external {
        Grant storage holderGrant = grants[_holder];

        // Require that there will be funds left in grant to transfer to holder.
        require(holderGrant.value.sub(holderGrant.transferred) > 0);

        // Get the total amount of vested tokens, according to grant.
        uint256 vested = calculateVestedTokens(holderGrant, now);
        if (vested == 0) {
            return;
        }

        // Make sure the holder doesn't transfer more than what he already has.
        uint256 transferable = vested.sub(holderGrant.transferred);
        if (transferable == 0) {
            return;
        }

        // Update transferred and total vesting amount, then transfer remaining vested funds to holder.
        holderGrant.transferred = holderGrant.transferred.add(transferable);
        totalVesting = totalVesting.sub(transferable);
        token.transfer(_holder, transferable);

        emit TokensUnlocked(_holder, transferable);
    }
}

Contract ABI

[{"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":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"assigner","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":false,"inputs":[{"name":"_to","type":"address[]"},{"name":"_amount","type":"uint256[]"}],"name":"mintInBatches","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"lockAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"tokenSaleStart","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":true,"inputs":[{"name":"_address","type":"address"}],"name":"isLocked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_addresses","type":"address[]"}],"name":"unlockInBatches","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"isTokenSaleOngoing","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","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":"_newAssigner","type":"address"}],"name":"transferAssigner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"getAddressTokenSaleId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address[]"},{"name":"_amount","type":"uint256[]"}],"name":"assignInBatches","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"tokenSaleEnd","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentTokenSaleId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOKEN_SALES","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_UNIT","outputs":[{"name":"","type":"uint256"}],"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":false,"inputs":[{"name":"_newLocker","type":"address"}],"name":"transferLocker","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addresses","type":"address[]"}],"name":"lockInBatches","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"}],"name":"unlockAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"assign","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"locked","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_BATCH_SIZE","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"tokenSaleId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokenSaleOngoing","outputs":[{"name":"","type":"bool"}],"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":"locker","outputs":[{"name":"","type":"address"}],"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":true,"inputs":[],"name":"currentTokenSaleId","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_TOKEN_SUPPLY","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":"_assigner","type":"address"},{"name":"_locker","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenSaleId","type":"uint256"}],"name":"TokenSaleStarting","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"tokenSaleId","type":"uint256"}],"name":"TokenSaleEnding","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"}],"name":"Lock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"addr","type":"address"}],"name":"Unlock","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Assign","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousLocker","type":"address"},{"indexed":true,"name":"newLocker","type":"address"}],"name":"LockerTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousAssigner","type":"address"},{"indexed":true,"name":"newAssigner","type":"address"}],"name":"AssignerTransferred","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":"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"}]

Contract Creation Code

608060405260006007556009805460ff1916905534801561001f57600080fd5b5060405160408061191283398101604052805160209091015160038054600160a060020a03191633600160a060020a03908116919091179091558216151561006657600080fd5b600160a060020a038116151561007b57600080fd5b60048054600160a060020a03938416600160a060020a0319918216179091556005805492909316911617905561185c806100b66000396000f3006080604052600436106101e25763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101e7578063095ea7b31461027157806318160ddd146102a957806319973261146102d057806323b872dd146103015780632ba253661461032b578063313ce5671461035757806334a90d021461036c578063403911a61461038d57806340c10f19146103a25780634a4fbeec146103c65780635b40d5dd146103e75780636007c4f814610407578063661884631461041c57806370a0823114610440578063737a76981461046157806380f6ab86146104825780638da5cb5b146104a35780638eb7ffe8146104b8578063952d6c22146104e457806395d89b41146104f9578063969bf3581461050e578063a413627214610523578063a5c9cd8214610538578063a9059cbb1461054d578063aa736f5714610571578063b0759c3e14610592578063b7eb5e0a146105b2578063be760488146105d3578063cbf9fe5f146105f7578063cfdbf25414610618578063d1bdd92f1461062d578063d4430bc71461064e578063d73dd62314610663578063d7b96d4e14610687578063dd62ed3e1461069c578063e0f0497d146106c3578063e489d510146106d8578063f2fde38b146106ed575b600080fd5b3480156101f357600080fd5b506101fc610710565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023657818101518382015260200161021e565b50505050905090810190601f1680156102635780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561027d57600080fd5b50610295600160a060020a0360043516602435610747565b604080519115158252519081900360200190f35b3480156102b557600080fd5b506102be6107b1565b60408051918252519081900360200190f35b3480156102dc57600080fd5b506102e56107b7565b60408051600160a060020a039092168252519081900360200190f35b34801561030d57600080fd5b50610295600160a060020a03600435811690602435166044356107c6565b34801561033757600080fd5b5061029560246004803582810192908201359181359182019101356108a2565b34801561036357600080fd5b506102be610955565b34801561037857600080fd5b50610295600160a060020a036004351661095a565b34801561039957600080fd5b50610295610a26565b3480156103ae57600080fd5b50610295600160a060020a0360043516602435610aac565b3480156103d257600080fd5b50610295600160a060020a0360043516610c1f565b3480156103f357600080fd5b506102956004803560248101910135610c3d565b34801561041357600080fd5b50610295610cbc565b34801561042857600080fd5b50610295600160a060020a0360043516602435610cc5565b34801561044c57600080fd5b506102be600160a060020a0360043516610dbe565b34801561046d57600080fd5b50610295600160a060020a0360043516610dd9565b34801561048e57600080fd5b506102be600160a060020a0360043516610e78565b3480156104af57600080fd5b506102e5610e93565b3480156104c457600080fd5b506102956024600480358281019290820135918135918201910135610ea2565b3480156104f057600080fd5b50610295610f49565b34801561050557600080fd5b506101fc610fb4565b34801561051a57600080fd5b506102be610feb565b34801561052f57600080fd5b506102be610ff1565b34801561054457600080fd5b506102be610ff6565b34801561055957600080fd5b50610295600160a060020a0360043516602435611002565b34801561057d57600080fd5b50610295600160a060020a0360043516611090565b34801561059e57600080fd5b50610295600480356024810191013561112f565b3480156105be57600080fd5b50610295600160a060020a03600435166111a4565b3480156105df57600080fd5b50610295600160a060020a0360043516602435611237565b34801561060357600080fd5b50610295600160a060020a03600435166113d4565b34801561062457600080fd5b506102be6113e9565b34801561063957600080fd5b506102be600160a060020a03600435166113ef565b34801561065a57600080fd5b50610295611401565b34801561066f57600080fd5b50610295600160a060020a036004351660243561140a565b34801561069357600080fd5b506102e56114ac565b3480156106a857600080fd5b506102be600160a060020a03600435811690602435166114bb565b3480156106cf57600080fd5b506102be6114e6565b3480156106e457600080fd5b506102be6114ec565b3480156106f957600080fd5b5061070e600160a060020a03600435166114fd565b005b60408051808201909152600581527f546f6b656e000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60015490565b600454600160a060020a031681565b600160a060020a03331660009081526006602052604081205460ff16156107ec57600080fd5b600160a060020a03841660009081526006602052604090205460ff161561081257600080fd5b60095460ff161561088f57600754600160a060020a0333166000908152600860205260409020541061084357600080fd5b600754600160a060020a0385166000908152600860205260409020541061086957600080fd5b600754600160a060020a0384166000908152600860205260409020541061088f57600080fd5b61089a848484611596565b949350505050565b600454600090819033600160a060020a039081169116146108c257600080fd5b60095460ff1615156108d357600080fd5b600085116108e057600080fd5b8483146108ec57600080fd5b6101908511156108fb57600080fd5b5060005b848110156109495761094086868381811061091657fe5b90506020020135600160a060020a0316858584818110151561093457fe5b90506020020135610aac565b506001016108ff565b50600195945050505050565b601281565b60055460009033600160a060020a0390811691161461097857600080fd5b60095460ff16151561098957600080fd5b600754600160a060020a038316600090815260086020526040902054146109af57600080fd5b600160a060020a03821660009081526006602052604090205460ff16156109d557600080fd5b600160a060020a038216600081815260066020526040808220805460ff19166001179055517fc1b5f12cea7c200ad495a43bf2d4c7ba1a753343c06c339093937849de84d9139190a2506001919050565b60035460009033600160a060020a03908116911614610a4457600080fd5b60095460ff1615610a5457600080fd5b600754600211610a6357600080fd5b600780546001908101918290556009805460ff191690911790556040517f876ae0acd69a7fae570f9828df9dc478f1772f47906e089652e7d185819f9f4690600090a250600190565b60045460009033600160a060020a03908116911614610aca57600080fd5b60095460ff161515610adb57600080fd5b600154610aee908363ffffffff61170416565b60018190556c3f1bdf10116048a593400000001015610b0c57600080fd5b600160a060020a0383166000908152600860205260409020541515610b4857600754600160a060020a0384166000908152600860205260409020555b600754600160a060020a03841660009081526008602052604090205414610b6e57600080fd5b600160a060020a038316600090815260208190526040902054610b97908363ffffffff61170416565b600160a060020a03841660008181526020818152604091829020939093558051858152905191927f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688592918290030190a2604080518381529051600160a060020a038516916000916000805160206118118339815191529181900360200190a350600192915050565b600160a060020a031660009081526006602052604090205460ff1690565b600554600090819033600160a060020a03908116911614610c5d57600080fd5b60008311610c6a57600080fd5b610190831115610c7957600080fd5b5060005b82811015610cb257610ca9848483818110610c9457fe5b90506020020135600160a060020a03166111a4565b50600101610c7d565b5060019392505050565b60095460ff1690565b600160a060020a03338116600090815260026020908152604080832093861683529290529081205480831115610d2257600160a060020a033381166000908152600260209081526040808320938816835292905290812055610d59565b610d32818463ffffffff61171716565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529482529182902054825190815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35060019392505050565b600160a060020a031660009081526020819052604090205490565b60035460009033600160a060020a03908116911614610df757600080fd5b600160a060020a0382161515610e0c57600080fd5b600454604051600160a060020a038085169216907f96796c61aa903b86a8d91c28b1355e94a6d8126dc339e81028ca80a0b04ac98390600090a35060048054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b600160a060020a031660009081526008602052604090205490565b600354600160a060020a031681565b600454600090819033600160a060020a03908116911614610ec257600080fd5b60095460ff161515610ed357600080fd5b60008511610ee057600080fd5b848314610eec57600080fd5b610190851115610efb57600080fd5b5060005b8481101561094957610f40868683818110610f1657fe5b90506020020135600160a060020a03168585848181101515610f3457fe5b90506020020135611237565b50600101610eff565b60035460009033600160a060020a03908116911614610f6757600080fd5b60095460ff161515610f7857600080fd5b6007546040517f3ab754a2b4b3c6b59edf2e5f7a39e63d76e0ee83c16a8f2160ec8bae241ca62290600090a2506009805460ff19169055600190565b60408051808201909152600381527f544f4b0000000000000000000000000000000000000000000000000000000000602082015281565b60075490565b600281565b670de0b6b3a764000081565b600160a060020a03331660009081526006602052604081205460ff161561102857600080fd5b60095460ff161561107f57600754600160a060020a0333166000908152600860205260409020541061105957600080fd5b600754600160a060020a0384166000908152600860205260409020541061107f57600080fd5b6110898383611729565b9392505050565b60035460009033600160a060020a039081169116146110ae57600080fd5b600160a060020a03821615156110c357600080fd5b600554604051600160a060020a038085169216907fb6a14cb7d716300f94e7de6bf44958c82a682b2aec5d25919186fa610951811090600090a35060058054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b600554600090819033600160a060020a0390811691161461114f57600080fd5b6000831161115c57600080fd5b61019083111561116b57600080fd5b5060005b82811015610cb25761119b84848381811061118657fe5b90506020020135600160a060020a031661095a565b5060010161116f565b60055460009033600160a060020a039081169116146111c257600080fd5b600160a060020a03821660009081526006602052604090205460ff1615156111e957600080fd5b600160a060020a038216600081815260066020526040808220805460ff19169055517f0be774851955c26a1d6a32b13b020663a069006b4a3b643ff0b809d3182605729190a2506001919050565b600454600090819033600160a060020a0390811691161461125757600080fd5b60095460ff16151561126857600080fd5b60075460011461127757600080fd5b50600160a060020a0383166000908152602081905260408120548311156112e057600160a060020a0384166000908152602081905260409020546112c290849063ffffffff61171716565b6001549091506112d8908263ffffffff61170416565b600155611323565b600160a060020a038416600090815260208190526040902054611309908463ffffffff61171716565b60015490915061131f908263ffffffff61171716565b6001555b6001546c3f1bdf10116048a59340000000101561133f57600080fd5b600160a060020a038416600081815260208181526040808320879055600754600883529281902092909255815186815291517f8a0e37b73a0d9c82e205d4d1a3ff3d0b57ce5f4d7bccf6bac03336dc101cb7ba9281900390910190a2604080518481529051600160a060020a038616916000916000805160206118118339815191529181900360200190a35060019392505050565b60066020526000908152604090205460ff1681565b61019081565b60086020526000908152604090205481565b60095460ff1681565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054611442908363ffffffff61170416565b600160a060020a0333811660008181526002602090815260408083209489168084529482529182902085905581519485529051929391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a350600192915050565b600554600160a060020a031681565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60075481565b6c3f1bdf10116048a5934000000081565b60035433600160a060020a0390811691161461151857600080fd5b600160a060020a038116151561152d57600080fd5b600354604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000600160a060020a03831615156115ad57600080fd5b600160a060020a0384166000908152602081905260409020548211156115d257600080fd5b600160a060020a038085166000908152600260209081526040808320339094168352929052205482111561160557600080fd5b600160a060020a03841660009081526020819052604090205461162e908363ffffffff61171716565b600160a060020a038086166000908152602081905260408082209390935590851681522054611663908363ffffffff61170416565b600160a060020a03808516600090815260208181526040808320949094558783168252600281528382203390931682529190915220546116a9908363ffffffff61171716565b600160a060020a03808616600081815260026020908152604080832033861684528252918290209490945580518681529051928716939192600080516020611811833981519152929181900390910190a35060019392505050565b8181018281101561171157fe5b92915050565b60008282111561172357fe5b50900390565b6000600160a060020a038316151561174057600080fd5b600160a060020a03331660009081526020819052604090205482111561176557600080fd5b600160a060020a03331660009081526020819052604090205461178e908363ffffffff61171716565b600160a060020a0333811660009081526020819052604080822093909355908516815220546117c3908363ffffffff61170416565b600160a060020a038085166000818152602081815260409182902094909455805186815290519193339093169260008051602061181183398151915292918290030190a3506001929150505600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058201e2a1065d0d976586c1e31b5c20cecea091070f57696dcafdcd40374c655211800290000000000000000000000002c5dae2d041550abc7b08c2c306b4be640dcfe1b0000000000000000000000001b3e07608d7c6f6b98404996130ba10444f573cf

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

0000000000000000000000002c5dae2d041550abc7b08c2c306b4be640dcfe1b0000000000000000000000001b3e07608d7c6f6b98404996130ba10444f573cf

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000002c5dae2d041550abc7b08c2c306b4be640dcfe1b
Arg [1] : 0000000000000000000000001b3e07608d7c6f6b98404996130ba10444f573cf

Swarm Source

bzzr://1e2a1065d0d976586c1e31b5c20cecea091070f57696dcafdcd40374c6552118
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward