Contract Overview
Balance: 0 Ether
Transactions: 2955 txns
Token Tracker: Token (TOK)
 Latest 25 transactions from a total of 2955 transactions

TxHash Age From To Value [TxFee]
0x56dac13ca5bf11ec8df626e44e8c822cbde9add9761e1e2a36ad8c4bb6899123119 days 1 hr ago0x2f007fed5413938b48e86cd9131f02c8703ef740  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7391 Ether0.000042092
0x774e13142978864038c429fbe994711a89251129e48f41d6f97982e3863b7e8d130 days 16 hrs ago0x2f007fed5413938b48e86cd9131f02c8703ef740  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.00010523
0x3d90fbcad133863e35eb7b64094f9a5f0d918a9d0234a3bf19a3512b1537cf28130 days 16 hrs ago0x2f007fed5413938b48e86cd9131f02c8703ef740  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390.01 Ether0.00010523
0xa39091e17a2001d6aca2d322b0856945d99749e5ba1ab2379519c04f41ef283b130 days 16 hrs ago0x2f007fed5413938b48e86cd9131f02c8703ef740  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e73910 Ether0.00147322
0x1d8403c41a92d9c5ca57a79b660908f356b454df29a5496460658ef782ddf8fc145 days 11 hrs ago0x2f007fed5413938b48e86cd9131f02c8703ef740  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.00147322
0x97f78c625af8601e0a8f167415eeff5894ad77a47d06ba704ec21c0eaa587d4d145 days 11 hrs ago0x2f007fed5413938b48e86cd9131f02c8703ef740  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7391 Ether0.00147322
0xda705551c9aeab6f1fcd22714de6305d49309a1167024e86353db655855b270c158 days 17 hrs ago0x8e9e3d9ab15249bc76def5f7fb2464a17ff68486  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000075279
0xd05bac21a2c5765d4cc3c8021328503a0cbd731b254454a973234e3e1ff24a30159 days 17 hrs ago0x5c8f033e2a29467d867c664d62baa08c2d332761  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000025093
0x1fbc69a4c2a44140456d43dce7771f9b70a3af4e511cfc53d04bf1860cee063e163 days 11 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000118596
0xb21fd1682177a8e8affaf2377c11767c727a62d43905b1b754ef0fda7920f086163 days 11 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000110148
0xe1dfc398c15940e771bfcf7a11faece96bcb0faebed5b347a66ef05de40155b0163 days 11 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000046596
0x4a31ec33735e6576281c066e9c65ad6b8889dcbfba82c96cd58f2838b94f49c1163 days 11 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000110404
0x5bc2dae8ba738d37b079f26c0f50a4dba18d7a8710ea386c481854df979b5bdc163 days 11 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000094148
0x1251084b4fa5c8c80bd448b04fab7f3808960598d754ecee44ed1196f3c39c77163 days 11 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000044676
0x840fc374139b5542688460f86a43e11eea652999914ceae3990394cc9c9131d4163 days 11 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000098372
0x99cc7a3ecffa674362f0e5ca95c699d0eb47f97c9326cbc418d3dad310e1f6c6163 days 11 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000043012
0x630e4957aa76bebe6206e6ca27fb8c3d8372ff6fab4159cb8804c157292ab27e168 days 15 hrs ago0x7d068eb54d3160a24e3a80a4c4d148d07fb3f4e1  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000075245
0xd6cd51129a1fa42393ebdf75ae585b9bf6b7c39f78a393ed2943a0ca529cd858168 days 15 hrs ago0xce1b28c91391e29ce0c69172fe992793c1b4ad96  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000030817
0xfc2c8b26e8a079e38b06195d95c0838ee88c7b39b20fe41287b58fbab43ce836168 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000226263
0x740f727752dfa254b706aabc05761faf670621abda87697c55ec959794e3a978168 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000303988
0xbaf095e188746e5d8bc822030d3a9cc94d0ff76b290fedc1f4bb71fe2b3cb80e168 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000403454
0x7e30fb4aed2551adfaa418e04045529bf661ae64962a07b45a2c5b130be1b055168 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000254157
0xce4d79947a3c636c28f681ac6c4262bbd9b3f9e8399df020a2027c5f0e52ab2a168 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000566396
0x20bc8e2bd195d8fbcde207d7f4857f24b9822df2f955df0965aaade29f9ed648168 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000370724
0xdcf881741e2d2c6b19ba44140c39b9d7e9f4cae454cadb4a6fe345eda22d94ed168 days 18 hrs ago0x2c5dae2d041550abc7b08c2c306b4be640dcfe1b  IN   0x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether0.000434452
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 3 Internal Transactions

ParentTxHash Block Age From To Value
0x0ce2e459e07a3bb7d3ab0435e1e656dbedf2d0620869c10bc482509176a529ee4011095163 days 13 hrs ago0x818e6fecd516ecc3849daf6845e3ec868087b7550x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether
0x50117e1698e59eb73f09a25810aa856a6e1b4b018805ea585ea216b6ae5226134010855163 days 14 hrs ago0x818e6fecd516ecc3849daf6845e3ec868087b7550x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether
0x069bd3687aa27231b02cac2eb1327128778e762aebefacfb6fe15722f88882bc4010799163 days 14 hrs ago0x818e6fecd516ecc3849daf6845e3ec868087b7550x04761f1c7842b4b08c63ded6fc8c102949a8e7390 Ether
[ Download CSV Export  ] 
Warning: The Compiled Contract might be susceptible to ExpExponentCleanup (medium/high-severity), EventStructWrongData (very low-severity) SolidityCompiler Bugs.

Contract Source Code Verified (Similar Match)
Note: This contract matches the deployed ByteCode of the Verified Source Code for Contract 0xf4596144ae74f71f3f8a0725943b5f30397a2f1a
Contract Name: Token
Compiler Version: v0.4.23+commit.124ca40d
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

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 = 3000000000 * 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 Switch To Opcodes View
608060405260006007556009805460ff1916905534801561001f57600080fd5b5060405160408061190f83398101604052805160209091015160038054600160a060020a03191633600160a060020a03908116919091179091558216151561006657600080fd5b600160a060020a038116151561007b57600080fd5b60048054600160a060020a03938416600160a060020a03199182161790915560058054929093169116179055611859806100b66000396000f3006080604052600436106101e25763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101e7578063095ea7b31461027157806318160ddd146102a957806319973261146102d057806323b872dd146103015780632ba253661461032b578063313ce5671461035757806334a90d021461036c578063403911a61461038d57806340c10f19146103a25780634a4fbeec146103c65780635b40d5dd146103e75780636007c4f814610407578063661884631461041c57806370a0823114610440578063737a76981461046157806380f6ab86146104825780638da5cb5b146104a35780638eb7ffe8146104b8578063952d6c22146104e457806395d89b41146104f9578063969bf3581461050e578063a413627214610523578063a5c9cd8214610538578063a9059cbb1461054d578063aa736f5714610571578063b0759c3e14610592578063b7eb5e0a146105b2578063be760488146105d3578063cbf9fe5f146105f7578063cfdbf25414610618578063d1bdd92f1461062d578063d4430bc71461064e578063d73dd62314610663578063d7b96d4e14610687578063dd62ed3e1461069c578063e0f0497d146106c3578063e489d510146106d8578063f2fde38b146106ed575b600080fd5b3480156101f357600080fd5b506101fc610710565b6040805160208082528351818301528351919283929083019185019080838360005b8381101561023657818101518382015260200161021e565b50505050905090810190601f1680156102635780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561027d57600080fd5b50610295600160a060020a0360043516602435610747565b604080519115158252519081900360200190f35b3480156102b557600080fd5b506102be6107b1565b60408051918252519081900360200190f35b3480156102dc57600080fd5b506102e56107b7565b60408051600160a060020a039092168252519081900360200190f35b34801561030d57600080fd5b50610295600160a060020a03600435811690602435166044356107c6565b34801561033757600080fd5b5061029560246004803582810192908201359181359182019101356108a2565b34801561036357600080fd5b506102be610955565b34801561037857600080fd5b50610295600160a060020a036004351661095a565b34801561039957600080fd5b50610295610a26565b3480156103ae57600080fd5b50610295600160a060020a0360043516602435610aac565b3480156103d257600080fd5b50610295600160a060020a0360043516610c1e565b3480156103f357600080fd5b506102956004803560248101910135610c3c565b34801561041357600080fd5b50610295610cbb565b34801561042857600080fd5b50610295600160a060020a0360043516602435610cc4565b34801561044c57600080fd5b506102be600160a060020a0360043516610dbd565b34801561046d57600080fd5b50610295600160a060020a0360043516610dd8565b34801561048e57600080fd5b506102be600160a060020a0360043516610e77565b3480156104af57600080fd5b506102e5610e92565b3480156104c457600080fd5b506102956024600480358281019290820135918135918201910135610ea1565b3480156104f057600080fd5b50610295610f48565b34801561050557600080fd5b506101fc610fb3565b34801561051a57600080fd5b506102be610fea565b34801561052f57600080fd5b506102be610ff0565b34801561054457600080fd5b506102be610ff5565b34801561055957600080fd5b50610295600160a060020a0360043516602435611001565b34801561057d57600080fd5b50610295600160a060020a036004351661108f565b34801561059e57600080fd5b50610295600480356024810191013561112e565b3480156105be57600080fd5b50610295600160a060020a03600435166111a3565b3480156105df57600080fd5b50610295600160a060020a0360043516602435611236565b34801561060357600080fd5b50610295600160a060020a03600435166113d2565b34801561062457600080fd5b506102be6113e7565b34801561063957600080fd5b506102be600160a060020a03600435166113ed565b34801561065a57600080fd5b506102956113ff565b34801561066f57600080fd5b50610295600160a060020a0360043516602435611408565b34801561069357600080fd5b506102e56114aa565b3480156106a857600080fd5b506102be600160a060020a03600435811690602435166114b9565b3480156106cf57600080fd5b506102be6114e4565b3480156106e457600080fd5b506102be6114ea565b3480156106f957600080fd5b5061070e600160a060020a03600435166114fa565b005b60408051808201909152600581527f546f6b656e000000000000000000000000000000000000000000000000000000602082015281565b600160a060020a03338116600081815260026020908152604080832094871680845294825280832086905580518681529051929493927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b60015490565b600454600160a060020a031681565b600160a060020a03331660009081526006602052604081205460ff16156107ec57600080fd5b600160a060020a03841660009081526006602052604090205460ff161561081257600080fd5b60095460ff161561088f57600754600160a060020a0333166000908152600860205260409020541061084357600080fd5b600754600160a060020a0385166000908152600860205260409020541061086957600080fd5b600754600160a060020a0384166000908152600860205260409020541061088f57600080fd5b61089a848484611593565b949350505050565b600454600090819033600160a060020a039081169116146108c257600080fd5b60095460ff1615156108d357600080fd5b600085116108e057600080fd5b8483146108ec57600080fd5b6101908511156108fb57600080fd5b5060005b848110156109495761094086868381811061091657fe5b90506020020135600160a060020a0316858584818110151561093457fe5b90506020020135610aac565b506001016108ff565b50600195945050505050565b601281565b60055460009033600160a060020a0390811691161461097857600080fd5b60095460ff16151561098957600080fd5b600754600160a060020a038316600090815260086020526040902054146109af57600080fd5b600160a060020a03821660009081526006602052604090205460ff16156109d557600080fd5b600160a060020a038216600081815260066020526040808220805460ff19166001179055517fc1b5f12cea7c200ad495a43bf2d4c7ba1a753343c06c339093937849de84d9139190a2506001919050565b60035460009033600160a060020a03908116911614610a4457600080fd5b60095460ff1615610a5457600080fd5b600754600211610a6357600080fd5b600780546001908101918290556009805460ff191690911790556040517f876ae0acd69a7fae570f9828df9dc478f1772f47906e089652e7d185819f9f4690600090a250600190565b60045460009033600160a060020a03908116911614610aca57600080fd5b60095460ff161515610adb57600080fd5b600154610aee908363ffffffff61170116565b60018190556b09b18ab5df7180b6b80000001015610b0b57600080fd5b600160a060020a0383166000908152600860205260409020541515610b4757600754600160a060020a0384166000908152600860205260409020555b600754600160a060020a03841660009081526008602052604090205414610b6d57600080fd5b600160a060020a038316600090815260208190526040902054610b96908363ffffffff61170116565b600160a060020a03841660008181526020818152604091829020939093558051858152905191927f0f6798a560793a54c3bcfe86a93cde1e73087d944c0ea20544137d412139688592918290030190a2604080518381529051600160a060020a0385169160009160008051602061180e8339815191529181900360200190a350600192915050565b600160a060020a031660009081526006602052604090205460ff1690565b600554600090819033600160a060020a03908116911614610c5c57600080fd5b60008311610c6957600080fd5b610190831115610c7857600080fd5b5060005b82811015610cb157610ca8848483818110610c9357fe5b90506020020135600160a060020a03166111a3565b50600101610c7c565b5060019392505050565b60095460ff1690565b600160a060020a03338116600090815260026020908152604080832093861683529290529081205480831115610d2157600160a060020a033381166000908152600260209081526040808320938816835292905290812055610d58565b610d31818463ffffffff61171416565b600160a060020a033381166000908152600260209081526040808320938916835292905220555b600160a060020a0333811660008181526002602090815260408083209489168084529482529182902054825190815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35060019392505050565b600160a060020a031660009081526020819052604090205490565b60035460009033600160a060020a03908116911614610df657600080fd5b600160a060020a0382161515610e0b57600080fd5b600454604051600160a060020a038085169216907f96796c61aa903b86a8d91c28b1355e94a6d8126dc339e81028ca80a0b04ac98390600090a35060048054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b600160a060020a031660009081526008602052604090205490565b600354600160a060020a031681565b600454600090819033600160a060020a03908116911614610ec157600080fd5b60095460ff161515610ed257600080fd5b60008511610edf57600080fd5b848314610eeb57600080fd5b610190851115610efa57600080fd5b5060005b8481101561094957610f3f868683818110610f1557fe5b90506020020135600160a060020a03168585848181101515610f3357fe5b90506020020135611236565b50600101610efe565b60035460009033600160a060020a03908116911614610f6657600080fd5b60095460ff161515610f7757600080fd5b6007546040517f3ab754a2b4b3c6b59edf2e5f7a39e63d76e0ee83c16a8f2160ec8bae241ca62290600090a2506009805460ff19169055600190565b60408051808201909152600381527f544f4b0000000000000000000000000000000000000000000000000000000000602082015281565b60075490565b600281565b670de0b6b3a764000081565b600160a060020a03331660009081526006602052604081205460ff161561102757600080fd5b60095460ff161561107e57600754600160a060020a0333166000908152600860205260409020541061105857600080fd5b600754600160a060020a0384166000908152600860205260409020541061107e57600080fd5b6110888383611726565b9392505050565b60035460009033600160a060020a039081169116146110ad57600080fd5b600160a060020a03821615156110c257600080fd5b600554604051600160a060020a038085169216907fb6a14cb7d716300f94e7de6bf44958c82a682b2aec5d25919186fa610951811090600090a35060058054600160a060020a03831673ffffffffffffffffffffffffffffffffffffffff199091161790556001919050565b600554600090819033600160a060020a0390811691161461114e57600080fd5b6000831161115b57600080fd5b61019083111561116a57600080fd5b5060005b82811015610cb15761119a84848381811061118557fe5b90506020020135600160a060020a031661095a565b5060010161116e565b60055460009033600160a060020a039081169116146111c157600080fd5b600160a060020a03821660009081526006602052604090205460ff1615156111e857600080fd5b600160a060020a038216600081815260066020526040808220805460ff19169055517f0be774851955c26a1d6a32b13b020663a069006b4a3b643ff0b809d3182605729190a2506001919050565b600454600090819033600160a060020a0390811691161461125657600080fd5b60095460ff16151561126757600080fd5b60075460011461127657600080fd5b50600160a060020a0383166000908152602081905260408120548311156112df57600160a060020a0384166000908152602081905260409020546112c190849063ffffffff61171416565b6001549091506112d7908263ffffffff61170116565b600155611322565b600160a060020a038416600090815260208190526040902054611308908463ffffffff61171416565b60015490915061131e908263ffffffff61171416565b6001555b6001546b09b18ab5df7180b6b8000000101561133d57600080fd5b600160a060020a038416600081815260208181526040808320879055600754600883529281902092909255815186815291517f8a0e37b73a0d9c82e205d4d1a3ff3d0b57ce5f4d7bccf6bac03336dc101cb7ba9281900390910190a2604080518481529051600160a060020a0386169160009160008051602061180e8339815191529181900360200190a35060019392505050565b60066020526000908152604090205460ff1681565b61019081565b60086020526000908152604090205481565b60095460ff1681565b600160a060020a033381166000908152600260209081526040808320938616835292905290812054611440908363ffffffff61170116565b600160a060020a0333811660008181526002602090815260408083209489168084529482529182902085905581519485529051929391927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a350600192915050565b600554600160a060020a031681565b600160a060020a03918216600090815260026020908152604080832093909416825291909152205490565b60075481565b6b09b18ab5df7180b6b800000081565b60035433600160a060020a0390811691161461151557600080fd5b600160a060020a038116151561152a57600080fd5b600354604051600160a060020a038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a36003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6000600160a060020a03831615156115aa57600080fd5b600160a060020a0384166000908152602081905260409020548211156115cf57600080fd5b600160a060020a038085166000908152600260209081526040808320339094168352929052205482111561160257600080fd5b600160a060020a03841660009081526020819052604090205461162b908363ffffffff61171416565b600160a060020a038086166000908152602081905260408082209390935590851681522054611660908363ffffffff61170116565b600160a060020a03808516600090815260208181526040808320949094558783168252600281528382203390931682529190915220546116a6908363ffffffff61171416565b600160a060020a0380861660008181526002602090815260408083203386168452825291829020949094558051868152905192871693919260008051602061180e833981519152929181900390910190a35060019392505050565b8181018281101561170e57fe5b92915050565b60008282111561172057fe5b50900390565b6000600160a060020a038316151561173d57600080fd5b600160a060020a03331660009081526020819052604090205482111561176257600080fd5b600160a060020a03331660009081526020819052604090205461178b908363ffffffff61171416565b600160a060020a0333811660009081526020819052604080822093909355908516815220546117c0908363ffffffff61170116565b600160a060020a038085166000818152602081815260409182902094909455805186815290519193339093169260008051602061180e83398151915292918290030190a3506001929150505600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820590834d180d56bd7f9ece46719c67fc342871708c6d022099c1915d58aaed71c00290000000000000000000000002c5dae2d041550abc7b08c2c306b4be640dcfe1b000000000000000000000000ce1b28c91391e29ce0c69172fe992793c1b4ad96

   Swarm Source:
bzzr://590834d180d56bd7f9ece46719c67fc342871708c6d022099c1915d58aaed71c

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward