Contract 0xb3df87beb7035f551709aa6bde7daa4e13ce1e51

Contract Overview

Balance:
0 Ether
TxHash Block Age From To Value [TxFee]
0x4b01a603dd8e895e11e9fd62df5d2606367b6233ece75fe739a449874bd16ecd52585822 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001504932
0x571339f26ef4414103168fe53fcdcfa7784b8b1c1afe0b9d398ace44ac33821352585822 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001324932
0xfe15d8818e79c04feed61efc999568851e01e0496dada7e93f109f62ba9842d152585714 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001990332
0x79ba3ab018ae65d58da8c110e25dee44643b9f4ada71450a65b08879807c4e4f52585714 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.002170332
0x89e257426f638957aea831052268c60a58056de0f1bf904f2290f638151ef64252585625 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001324932
0x3ebea3c15f5d52058505d83c2a385b257361eff9fe24856888287938cad0c17e52585625 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001504932
0x8eb977fe626144c9b69742ea9fd7f7381bc4023a654ce5bd8c4c849d7f2c24c952585528 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.002170332
0x0ece7e509eae2471c5096de0aace34a07c73535dfd5fb9f9379360dbe79a5b7552585419 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001504932
0x69de088f72dbc45d792472567aed8590cdc31c261b5c474096b557f52fbeecf952585419 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001324932
0xb5646f178d8809b23d33546fc65856ff037e0e8e266ad6f62754a7079e2b69b8525853112 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001990332
0xeadd5b0a73bbdc0b8f7e6b741a4f165f3b24270446d8ae00d1f3be085f821eed525853112 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.002170332
0xb4684479285acadfaff9cf47ec754432910c11517574daf656e6471d29f37a22525852214 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001324932
0xee541d9a1d5939ba478a09e6e3c820babf9bffe0233999b33cd1e8bb71d675d3525852214 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001504932
0xbdc43efd379451d6e3ac5540cb6e0e3d9b8dda9ed7bf4992e9d48e3bf76d19c5525851116 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.002170332
0x51d84a2c60a71bc91a7ff2f63bd6b250b15e1966cf53d3b2c41165f669164d78525850217 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001504932
0x0c1a2d70467abc04aa810ebc6e4dd33a3f3715921f133a7024e49fcd1a3ad469525850118 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001324164
0x2f5cc0b7dc275271dc233dd13fbae94e50651cb42a0968f722c958e791a5c205525849220 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001990332
0x83ccb4035d49c5b6614d6b39ecbabac4f22e86ca0883648fc609190d0d848041525849220 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.002170332
0xd2e7d935565df6bcb5ebb9b99aa9a05784203a7fdc7852bd431bdb8a67b1fd4e525848324 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001324932
0x1ad6ed6a1b2b1b08bce3cc0c3a91afa2558b1c127ba4cb01f85836448e7e4151525848324 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001504932
0xf308639fd1e8edecfa5e25d9fdc584a2b560dd8cf162efbac7375b2005943f8b525847126 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.002170332
0x6fb1900be4cfd6db942f7dc021a096cb089de3b7d0c53ef039f89e420f75efb9525846129 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001324932
0x6e7f563b5c380690b5cf5f61aac49a98357751fbd5d2bff71a7dcd123fedfe6d525846129 mins ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210 IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001504932
0x4e3d92658026e90e3b275786104bc4813622871e7ec983bf0adc7ec9f78b87f4525845131 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.002170332
0xef8d9735d6d87947be8879a538af5634c3de7e30620eb1819d43b657797d69f8525844332 mins ago0xd85c3c5e20f6c168c111446583119944b303624d IN  0xb3df87beb7035f551709aa6bde7daa4e13ce1e510 Ether0.001324164
[ Download CSV Export 

Latest 25 internal transaction, Click here to view more Internal Transactions as a result of Contract Execution

Parent TxHash Block Age From To Value
0x4b01a603dd8e895e11e9fd62df5d2606367b6233ece75fe739a449874bd16ecd52585822 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x571339f26ef4414103168fe53fcdcfa7784b8b1c1afe0b9d398ace44ac33821352585822 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0xfe15d8818e79c04feed61efc999568851e01e0496dada7e93f109f62ba9842d152585714 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x79ba3ab018ae65d58da8c110e25dee44643b9f4ada71450a65b08879807c4e4f52585714 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x89e257426f638957aea831052268c60a58056de0f1bf904f2290f638151ef64252585625 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x3ebea3c15f5d52058505d83c2a385b257361eff9fe24856888287938cad0c17e52585625 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x8eb977fe626144c9b69742ea9fd7f7381bc4023a654ce5bd8c4c849d7f2c24c952585528 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x0ece7e509eae2471c5096de0aace34a07c73535dfd5fb9f9379360dbe79a5b7552585419 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x69de088f72dbc45d792472567aed8590cdc31c261b5c474096b557f52fbeecf952585419 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0xb5646f178d8809b23d33546fc65856ff037e0e8e266ad6f62754a7079e2b69b8525853112 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0xeadd5b0a73bbdc0b8f7e6b741a4f165f3b24270446d8ae00d1f3be085f821eed525853112 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0xb4684479285acadfaff9cf47ec754432910c11517574daf656e6471d29f37a22525852214 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0xee541d9a1d5939ba478a09e6e3c820babf9bffe0233999b33cd1e8bb71d675d3525852214 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0xbdc43efd379451d6e3ac5540cb6e0e3d9b8dda9ed7bf4992e9d48e3bf76d19c5525851116 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x51d84a2c60a71bc91a7ff2f63bd6b250b15e1966cf53d3b2c41165f669164d78525850217 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x0c1a2d70467abc04aa810ebc6e4dd33a3f3715921f133a7024e49fcd1a3ad469525850118 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x2f5cc0b7dc275271dc233dd13fbae94e50651cb42a0968f722c958e791a5c205525849220 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x83ccb4035d49c5b6614d6b39ecbabac4f22e86ca0883648fc609190d0d848041525849220 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0xd2e7d935565df6bcb5ebb9b99aa9a05784203a7fdc7852bd431bdb8a67b1fd4e525848324 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x1ad6ed6a1b2b1b08bce3cc0c3a91afa2558b1c127ba4cb01f85836448e7e4151525848324 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0xf308639fd1e8edecfa5e25d9fdc584a2b560dd8cf162efbac7375b2005943f8b525847126 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x6fb1900be4cfd6db942f7dc021a096cb089de3b7d0c53ef039f89e420f75efb9525846129 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x6e7f563b5c380690b5cf5f61aac49a98357751fbd5d2bff71a7dcd123fedfe6d525846129 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0x4e3d92658026e90e3b275786104bc4813622871e7ec983bf0adc7ec9f78b87f4525845131 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
0xef8d9735d6d87947be8879a538af5634c3de7e30620eb1819d43b657797d69f8525844332 mins ago0xb3df87beb7035f551709aa6bde7daa4e13ce1e510x614cb086657c47739068c12eeff43a4018be11900 Ether
[ Download CSV Export 
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:
Chain

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
No

Runs (Optimizer):
200

Contract Source Code

pragma solidity 0.4.24;

// File: zeppelin-solidity/contracts/ReentrancyGuard.sol

/**
 * @title Helps contracts guard against reentrancy attacks.
 * @author Remco Bloemen <[email protected]π.com>, Eenae <[email protected]>
 * @dev If you mark a function `nonReentrant`, you should also
 * mark it `external`.
 */
contract ReentrancyGuard {

  /// @dev Constant for unlocked guard state - non-zero to prevent extra gas costs.
  /// See: https://github.com/OpenZeppelin/openzeppelin-solidity/issues/1056
  uint private constant REENTRANCY_GUARD_FREE = 1;

  /// @dev Constant for locked guard state
  uint private constant REENTRANCY_GUARD_LOCKED = 2;

  /**
   * @dev We use a single lock for the whole contract.
   */
  uint private reentrancyLock = REENTRANCY_GUARD_FREE;

  /**
   * @dev Prevents a contract from calling itself, directly or indirectly.
   * If you mark a function `nonReentrant`, you should also
   * mark it `external`. Calling one `nonReentrant` function from
   * another is not supported. Instead, you can implement a
   * `private` function doing the actual work, and an `external`
   * wrapper marked as `nonReentrant`.
   */
  modifier nonReentrant() {
    require(reentrancyLock == REENTRANCY_GUARD_FREE);
    reentrancyLock = REENTRANCY_GUARD_LOCKED;
    _;
    reentrancyLock = REENTRANCY_GUARD_FREE;
  }

}

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

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


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


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

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

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

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

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

// File: token-sale-contracts/contracts/Token.sol

// Abstract contract for the full ERC 20 Token standard
// https://github.com/ethereum/EIPs/issues/20

contract Token {
    /* This is a slight change to the ERC20 base standard.
    function totalSupply() constant returns (uint256 supply);
    is replaced with:
    uint256 public totalSupply;
    This automatically creates a getter function for the totalSupply.
    This is moved to the base contract since public getter functions are not
    currently recognised as an implementation of the matching abstract
    function by the compiler.
    */
    /// total amount of tokens
    uint256 public totalSupply;

    /// @param _owner The address from which the balance will be retrieved
    /// @return The balance
    function balanceOf(address _owner) constant returns (uint256 balance);

    /// @notice send `_value` token to `_to` from `msg.sender`
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transfer(address _to, uint256 _value) returns (bool success);

    /// @notice send `_value` token to `_to` from `_from` on the condition it is approved by `_from`
    /// @param _from The address of the sender
    /// @param _to The address of the recipient
    /// @param _value The amount of token to be transferred
    /// @return Whether the transfer was successful or not
    function transferFrom(address _from, address _to, uint256 _value) returns (bool success);

    /// @notice `msg.sender` approves `_spender` to spend `_value` tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _value The amount of tokens to be approved for transfer
    /// @return Whether the approval was successful or not
    function approve(address _spender, uint256 _value) returns (bool success);

    /// @param _owner The address of the account owning tokens
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens allowed to spent
    function allowance(address _owner, address _spender) constant returns (uint256 remaining);

    event Transfer(address indexed _from, address indexed _to, uint256 _value);
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);
}

// File: token-sale-contracts/contracts/StandardToken.sol

/*
You should inherit from StandardToken or, for a token like you would want to
deploy in something like Mist, see HumanStandardToken.sol.
(This implements ONLY the standard functions and NOTHING else.
If you deploy this, you won't have anything useful.)

Implements ERC 20 Token standard: https://github.com/ethereum/EIPs/issues/20
.*/


contract StandardToken is Token {

    function transfer(address _to, uint256 _value) returns (bool success) {
        //Default assumes totalSupply can't be over max (2^256 - 1).
        //If your token leaves out totalSupply and can issue more tokens as time goes on, you need to check if it doesn't wrap.
        //Replace the if with this one instead.
        //if (balances[msg.sender] >= _value && balances[_to] + _value > balances[_to]) {
        if (balances[msg.sender] >= _value && _value > 0) {
            balances[msg.sender] -= _value;
            balances[_to] += _value;
            Transfer(msg.sender, _to, _value);
            return true;
        } else { return false; }
    }

    function transferFrom(address _from, address _to, uint256 _value) returns (bool success) {
        //same as above. Replace this line with the following if you want to protect against wrapping uints.
        //if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && balances[_to] + _value > balances[_to]) {
        if (balances[_from] >= _value && allowed[_from][msg.sender] >= _value && _value > 0) {
            balances[_to] += _value;
            balances[_from] -= _value;
            allowed[_from][msg.sender] -= _value;
            Transfer(_from, _to, _value);
            return true;
        } else { return false; }
    }

    function balanceOf(address _owner) constant returns (uint256 balance) {
        return balances[_owner];
    }

    function approve(address _spender, uint256 _value) returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);
        return true;
    }

    function allowance(address _owner, address _spender) constant returns (uint256 remaining) {
      return allowed[_owner][_spender];
    }

    mapping (address => uint256) balances;
    mapping (address => mapping (address => uint256)) allowed;
}

// File: token-sale-contracts/contracts/HumanStandardToken.sol

/*
This Token Contract implements the standard token functionality (https://github.com/ethereum/EIPs/issues/20) as well as the following OPTIONAL extras intended for use by humans.

In other words. This is intended for deployment in something like a Token Factory or Mist wallet, and then used by humans.
Imagine coins, currencies, shares, voting weight, etc.
Machine-based, rapid creation of many tokens would not necessarily need these extra features or will be minted in other manners.

1) Initial Finite Supply (upon creation one specifies how much is minted).
2) In the absence of a token registry: Optional Decimal, Symbol & Name.
3) Optional approveAndCall() functionality to notify a contract if an approval() has occurred.

.*/


contract HumanStandardToken is StandardToken {

    function () {
        //if ether is sent to this address, send it back.
        throw;
    }

    /* Public variables of the token */

    /*
    NOTE:
    The following variables are OPTIONAL vanities. One does not have to include them.
    They allow one to customise the token contract & in no way influences the core functionality.
    Some wallets/interfaces might not even bother to look at this information.
    */
    string public name;                   //fancy name: eg Simon Bucks
    uint8 public decimals;                //How many decimals to show. ie. There could 1000 base units with 3 decimals. Meaning 0.980 SBX = 980 base units. It's like comparing 1 wei to 1 ether.
    string public symbol;                 //An identifier: eg SBX
    string public version = 'H0.1';       //human 0.1 standard. Just an arbitrary versioning scheme.

    function HumanStandardToken(
        uint256 _initialAmount,
        string _tokenName,
        uint8 _decimalUnits,
        string _tokenSymbol
        ) {
        balances[msg.sender] = _initialAmount;               // Give the creator all initial tokens
        totalSupply = _initialAmount;                        // Update total supply
        name = _tokenName;                                   // Set the name for display purposes
        decimals = _decimalUnits;                            // Amount of decimals for display purposes
        symbol = _tokenSymbol;                               // Set the symbol for display purposes
    }

    /* Approves and then calls the receiving contract */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData) returns (bool success) {
        allowed[msg.sender][_spender] = _value;
        Approval(msg.sender, _spender, _value);

        //call the receiveApproval function on the contract you want to be notified. This crafts the function signature manually so one doesn't have to include a contract in here just for this.
        //receiveApproval(address _from, uint256 _value, address _tokenContract, bytes _extraData)
        //it is assumed that when does this that the call *should* succeed, otherwise one would use vanilla approve instead.
        if(!_spender.call(bytes4(bytes32(sha3("receiveApproval(address,uint256,address,bytes)"))), msg.sender, _value, this, _extraData)) { throw; }
        return true;
    }
}

// File: digivice/contracts/VerifierRegistry.sol

contract VerifierRegistry is Ownable {
  event LogVerifierRegistered(
    address id,
    string location,
    bool active,
    uint256 balance,
    uint256 shard
  );

  event LogVerifierUpdated(
    address id,
    string location,
    bool active,
    uint256 balance,
    uint256 shard
  );

  event LogBalancePerShard(uint256 shard, uint256 balance);

  event LogUpdateActiveStatus(address executor, address verifier, bool active);

  struct Verifier {
    address id;
    string location;
    bool active;
    uint256 balance;
    uint256 shard;
  }

  mapping(address => Verifier) public verifiers;

  /// @dev shard => balance
  mapping(uint256 => uint256) public balancesPerShard;

  address[] public addresses;
  address public tokenAddress;
  uint256 public verifiersPerShard;

  constructor(address _tokenAddress, uint256 _verifiersPerShard)
  public {
    tokenAddress = _tokenAddress;
    verifiersPerShard = _verifiersPerShard;
  }

  function create(string _location) public {
    Verifier storage verifier = verifiers[msg.sender];

    require(verifier.id == address(0), "verifier already exists");

    verifier.id = msg.sender;
    verifier.location = _location;
    verifier.active = true;
    verifier.shard = uint256(addresses.length) / verifiersPerShard;

    addresses.push(verifier.id);

    emit LogVerifierRegistered(
      verifier.id,
      verifier.location,
      verifier.active,
      verifier.balance,
      verifier.shard
    );
  }

  function getNumberOfVerifiers() public view returns (uint) {
    return addresses.length;
  }

  function receiveApproval(address _from, uint256 _value, address _token, bytes _data) public returns (bool success) {
    Token token = Token(tokenAddress);

    uint256 allowance = token.allowance(_from, this);

    require(allowance > 0, "nothing to approve");

    require(token.transferFrom(_from, this, allowance), "transferFrom failed");

    verifiers[_from].balance += allowance;

    uint256 shard = verifiers[_from].shard;
    uint256 shardBalance = balancesPerShard[shard] + allowance;
    balancesPerShard[shard] = shardBalance;

    emit LogBalancePerShard(shard, shardBalance);

    return true;
  }

  function update(string _location) public {
    Verifier storage verifier = verifiers[msg.sender];

    require(verifier.id != address(0), "verifier do not exists");

    verifier.location = _location;

    emit LogVerifierUpdated(
      verifier.id,
      verifier.location,
      verifier.active,
      verifier.balance,
      verifier.shard
    );
  }

  function withdraw(uint256 _value) public returns (bool) {
    Verifier storage verifier = verifiers[msg.sender];

    require(_value > 0 && verifier.balance >= _value, "nothing to withdraw");

    verifier.balance -= _value;

    uint256 shard = verifier.shard;
    uint256 shardBalance = balancesPerShard[shard] - _value;
    balancesPerShard[shard] = shardBalance;

    emit LogBalancePerShard(shard, shardBalance);

    Token token = Token(tokenAddress);

    require(token.transfer(msg.sender, _value), "transfer failed");

    return true;
  }

  function updateTokenAddress(address _newTokenAddress) public onlyOwner {
    require(_newTokenAddress != address(0), "empty token address");

    tokenAddress = _newTokenAddress;
  }

  function updateVerifiersPerShard(uint256 _newVerifiersPerShard) public onlyOwner {
    require(_newVerifiersPerShard > 0, "_newVerifiersPerShard is empty");

    verifiersPerShard = _newVerifiersPerShard;
  }

  function updateActiveStatus(address _verifierAddress, bool _active) public onlyOwner {
    Verifier storage verifier = verifiers[_verifierAddress];
    require(verifier.id != address(0), "verifier do not exists");
    require(verifier.active != _active, "no changes to active flag");

    verifier.active = _active;

    emit LogUpdateActiveStatus(msg.sender, _verifierAddress, _active);
  }

}

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

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

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 _a, uint256 _b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (_a == 0) {
      return 0;
    }

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

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

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

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

// File: contracts/ChainConfig.sol

/// @title Andromeda chain election configuration
/// @dev configuration methods for Chain contract
///      `proposeDuration` and `revealDuration` are durations in blocks (not timestamp).
contract ChainConfig is Ownable {

  bool public updateMinimumStakingTokenPercentageEnabled;

  using SafeMath for uint256;

  uint8 public blocksPerPhase;

  /// @dev address of `VerifierRegistry.sol`
  address public registryAddress;

  /// @dev required percent of all tokens for value for election tobe valid
  uint8 public minimumStakingTokenPercentage;

  modifier whenProposePhase() {
    require(getCurrentElectionCycleBlock() < blocksPerPhase, "we are not in propose phase");
    _;
  }
  modifier whenRevealPhase() {
    require(getCurrentElectionCycleBlock() >= blocksPerPhase, "we are not in reveal phase");
    _;
  }

  event LogChainConfig(uint8 blocksPerPhase, uint8 requirePercentOfTokens, bool updateMinimumStakingTokenPercentageEnabled);

  event LogUpdateRegistryAddress(address indexed newRegistryAddress);

  constructor (
    address _registryAddress,
    uint8 _blocksPerPhase,
    uint8 _minimumStakingTokenPercentage,
    bool _updateMinimumStakingTokenPercentageEnabled
  )
  public {

    require(_blocksPerPhase > 0, "_blocksPerPhase can't be empty");
    blocksPerPhase = _blocksPerPhase;

    require(_minimumStakingTokenPercentage > 0, "_minimumStakingTokenPercentage can't be empty");
    require(_minimumStakingTokenPercentage <= 100, "_minimumStakingTokenPercentage can't be over 100%");
    minimumStakingTokenPercentage = _minimumStakingTokenPercentage;

    updateMinimumStakingTokenPercentageEnabled = _updateMinimumStakingTokenPercentageEnabled;

    emit LogChainConfig(_blocksPerPhase, _minimumStakingTokenPercentage, _updateMinimumStakingTokenPercentageEnabled);


    require(_registryAddress != address(0), "registry address is empty");
    registryAddress = _registryAddress;

    emit LogUpdateRegistryAddress(_registryAddress);
  }

  function updateRegistryAddress(address _registryAddress)
  public
  onlyOwner
  returns (bool) {
    require(_registryAddress != address(0), "_registryAddress can't be empty");
    registryAddress = _registryAddress;
    emit LogUpdateRegistryAddress(_registryAddress);
    return true;
  }


  function updateMinimumStakingTokenPercentage(uint8 _minimumStakingTokenPercentage)
  public
  onlyOwner
  returns (bool) {
    require(updateMinimumStakingTokenPercentageEnabled, "update not available");

    require(_minimumStakingTokenPercentage > 0, "_minimumStakingTokenPercentage can't be empty");
    require(_minimumStakingTokenPercentage <= 100, "_minimumStakingTokenPercentage can't be over 100%");
    minimumStakingTokenPercentage = _minimumStakingTokenPercentage;

    emit LogChainConfig(blocksPerPhase, _minimumStakingTokenPercentage, true);

    return true;
  }


  /// @return current block number with reference to whole cycle,
  ///         returned value will be between [0..C), where C is sum of all phases durations
  function getCurrentElectionCycleBlock()
  public
  view
  returns (uint256) {
    return block.number % (uint256(blocksPerPhase) * 2);
  }

  /// @return first block number (blockchain block) of current cycle
  function getFirstCycleBlock()
  public
  view
  returns (uint256) {
    return block.number.sub(getCurrentElectionCycleBlock());
  }

}

// File: contracts/Chain.sol

/// @title Andromeda chain election contract
/// @dev https://lucidity.slab.com/posts/andromeda-election-mechanism-e9a79c2a
contract Chain is  ChainConfig, ReentrancyGuard {

  event LogPropose(address indexed sender, uint256 blockHeight, bytes32 blindedProposal, uint256 shard, uint256 balance);

  event LogReveal(address indexed sender, uint256 blockHeight, bytes32 proposal);

  event LogUpdateCounters(
    address indexed sender,
    uint256 blockHeight,
    uint256 shard,
    bytes32 proposal,
    uint256 counts,
    uint256 balance,
    bool newWinner,
    uint256 totalTokenBalanceForShard
  );


  /// @dev this is our structure for holding getBlockVoter/proposals
  ///      each vote will be deleted after reveal
  struct Voter {
    bytes32 blindedProposal;
    uint256 shard;
    bytes32 proposal;
    uint256 balance;
  }

  /// @dev structure of block that is created for each election
  struct Block {
    /// @dev shard => root of merkle tree (the winner)
    mapping (uint256 => bytes32) roots;
    mapping (bytes32 => bool) uniqueBlindedProposals;
    mapping (address => Voter) voters;

    /// @dev shard => max votes
    mapping (uint256 => uint256) maxsVotes;

    // shard => proposal => counts
    // Im using mapping, because its less gas consuming that array,
    // and also it is much easier to work with mapping than with array
    // unfortunately we can't be able to delete this data to release gas, why?
    // because to do this, we need to save all the keys and then run loop for all keys... that may cause OOG
    // also storing keys is more gas consuming so... I made decision to stay with mapping and never delete history
    mapping (uint256 => mapping(bytes32 => uint256)) counts;

    /// @dev shard => total amount of tokens
    mapping (uint256 => uint256) balancesPerShard;

    address[] verifierAddresses;
  }

  /// @dev blockHeight => Block - results of each elections will be saved here: one block (array element) per election
  mapping (uint256 => Block) blocks;

  /// @dev shard => blockHeight
  mapping (uint256 => uint256) public initialBlockHeights;

  constructor (
    address _registryAddress,
    uint8 _blocksPerPhase,
    uint8 _minimumStakingTokenPercentage,
    bool _updateMinimumStakingTokenPercentageEnabled
  )
  ChainConfig(_registryAddress, _blocksPerPhase, _minimumStakingTokenPercentage, _updateMinimumStakingTokenPercentageEnabled)
  public {

  }

  /// @dev Each operator / verifier submits an encrypted proposal, where each proposal
  ///      is a unique (per cycle) to avoid propsal peeking. When we start proposing,
  ///      we need one of the following:
  ///      1. a clear state (counters must be cleared)
  ///      2. OR, if nobody revealed in previous cycle, we continue previous state
  ///         with all previous getBlockVoter/proposals
  /// @param _blindedProposal this is hash of the proposal + secret
  function propose(bytes32 _blindedProposal)
  external
  whenProposePhase
  // we have external call in `_getVerifierInfo` to `verifierRegistry`,
  // so `nonReentrant` can be additional safety feature here
  nonReentrant
  returns (bool) {

    uint256 blockHeight = getBlockHeight();

    require(_blindedProposal != bytes32(0), "_blindedProposal is empty");
    require(!blocks[blockHeight].uniqueBlindedProposals[_blindedProposal], "blindedProposal not unique");

    bool active;
    uint256 balance;
    uint256 shard;
    (active, balance, shard) = _getVerifierInfo(msg.sender);
    require(active, "verifier is not in the registry or not active");
    require(balance > 0, "verifier has no right to propose");


    Voter storage voter = blocks[blockHeight].voters[msg.sender];
    require(voter.blindedProposal == bytes32(0), "verifier already proposed in this round");

    // now we can save proposal

    blocks[blockHeight].uniqueBlindedProposals[_blindedProposal] = true;

    voter.blindedProposal = _blindedProposal;
    voter.shard = shard;
    voter.balance = balance;

    if (initialBlockHeights[shard] == 0) {
      initialBlockHeights[shard] = blockHeight;
    }

    emit LogPropose(msg.sender, blockHeight, _blindedProposal, shard, balance);

    return true;
  }

  function createProof(bytes32 _proposal, bytes32 _secret)
  public
  pure
  returns (bytes32) {
    return keccak256(abi.encodePacked(_proposal, _secret));
  }

  /// @param _proposal this is proposal in clear form
  /// @param _secret this is secret in clear form
  function reveal(bytes32 _proposal, bytes32 _secret)
  external
  whenRevealPhase
  returns (bool) {

    uint256 blockHeight = getBlockHeight();
    bytes32 proof = createProof(_proposal, _secret);

    Voter storage voter = blocks[blockHeight].voters[msg.sender];
    require(voter.blindedProposal == proof, "your proposal do not exists (are you verifier?) OR invalid proof");
    require(voter.proposal == bytes32(0), "you already revealed");

    voter.proposal = _proposal;
    _updateCounters(voter.shard, _proposal);

    blocks[blockHeight].verifierAddresses.push(msg.sender);

    emit LogReveal(msg.sender, blockHeight, _proposal);

    return true;
  }

  /// @dev gets information about verifier from global registry
  /// @return (bool active, uint256 balance, uint256 shard)
  function _getVerifierInfo(address _verifier)
  internal
  view
  returns (bool active, uint256 balance, uint256 shard) {
    VerifierRegistry registry = VerifierRegistry(registryAddress);

    ( , , active, balance, shard) = registry.verifiers(_verifier);
  }

  function _getTotalTokenBalancePerShard(uint256 _shard)
  internal
  view
  returns (uint256) {
    VerifierRegistry registry = VerifierRegistry(registryAddress);
    return registry.balancesPerShard(_shard);
  }

  function getBlockHeight()
  public
  view
  returns (uint256) {
    return block.number.div(uint256(blocksPerPhase) * 2);
  }


  /// @dev this function needs to be called each time we successfully reveal a proposal
  function _updateCounters(uint256 _shard, bytes32 _proposal)
  internal {
    uint256 blockHeight = getBlockHeight();

    uint256 balance = blocks[blockHeight].voters[msg.sender].balance;

    blocks[blockHeight].counts[_shard][_proposal] += balance;
    uint256 shardProposalsCount = blocks[blockHeight].counts[_shard][_proposal];
    bool newWinner;

    // unless it is not important for some reason, lets use `>` not `>=` in condition below
    // when we ignoring equal values we gain two important things:
    //  1. we save a lot of gas: we do not change state each time we have equal result
    //  2. we encourage voters to vote asap, because in case of equal results,
    //     winner is the first one that was revealed
    if (shardProposalsCount > blocks[blockHeight].maxsVotes[_shard]) {

      // we do expect that all (or most of) voters will agree about proposal.
      // We can save gas, if we read `roots[shard]` value and check, if we need a change.
      if (blocks[blockHeight].roots[_shard] != _proposal) {
        blocks[blockHeight].roots[_shard] = _proposal;
        newWinner = true;
      }

      blocks[blockHeight].maxsVotes[_shard] = shardProposalsCount;
    }

    uint256 tokensBalance = _getTotalTokenBalancePerShard(_shard);
    if (blocks[blockHeight].balancesPerShard[_shard] != tokensBalance) {
      blocks[blockHeight].balancesPerShard[_shard] = tokensBalance;
    }

    emit LogUpdateCounters(msg.sender, blockHeight, _shard, _proposal, shardProposalsCount, balance, newWinner, tokensBalance);
  }



  function getBlockRoot(uint256 _blockHeight, uint256 _shard) external view returns (bytes32) {
    return blocks[_blockHeight].roots[_shard];
  }

  function getBlockVoter(uint256 _blockHeight, address _voter)
  external
  view
  returns (bytes32, uint256, bytes32, uint256) {
    Voter storage voter = blocks[_blockHeight].voters[_voter];
    return (voter.blindedProposal, voter.shard, voter.proposal, voter.balance);
  }

  function getBlockMaxVotes(uint256 _blockHeight, uint256 _shard) external view returns (uint256) {
    return blocks[_blockHeight].maxsVotes[_shard];
  }

  function getBlockCount(uint256 _blockHeight, uint256 _shard, bytes32 _proposal) external view returns (uint256) {
    return blocks[_blockHeight].counts[_shard][_proposal];
  }

  function getBlockAddress(uint256 _blockHeight, uint256 _i) external view returns (address) {
    return blocks[_blockHeight].verifierAddresses[_i];
  }

  function getBlockAddressCount(uint256 _blockHeight) external view returns (uint256) {
    return blocks[_blockHeight].verifierAddresses.length;
  }

  function getStakeTokenBalanceFor(uint256 _blockHeight, uint256 _shard) external view returns (uint256) {
    return blocks[_blockHeight].balancesPerShard[_shard];
  }

  function isElectionValid(uint256 _blockHeight, uint256 _shard) external view returns (bool) {
    Block storage electionBlock = blocks[_blockHeight];
    if (electionBlock.balancesPerShard[_shard] == 0) return false;
    return electionBlock.maxsVotes[_shard] * 100 / electionBlock.balancesPerShard[_shard] >= minimumStakingTokenPercentage;
  }



}

Contract ABI

[{"constant":true,"inputs":[{"name":"_blockHeight","type":"uint256"},{"name":"_i","type":"uint256"}],"name":"getBlockAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_blockHeight","type":"uint256"},{"name":"_shard","type":"uint256"}],"name":"getBlockMaxVotes","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"updateMinimumStakingTokenPercentageEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_blockHeight","type":"uint256"},{"name":"_shard","type":"uint256"}],"name":"getBlockRoot","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getCurrentElectionCycleBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_blockHeight","type":"uint256"}],"name":"getBlockAddressCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_blockHeight","type":"uint256"},{"name":"_shard","type":"uint256"}],"name":"isElectionValid","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getFirstCycleBlock","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getBlockHeight","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_blockHeight","type":"uint256"},{"name":"_shard","type":"uint256"}],"name":"getStakeTokenBalanceFor","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"initialBlockHeights","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":true,"inputs":[{"name":"_blockHeight","type":"uint256"},{"name":"_voter","type":"address"}],"name":"getBlockVoter","outputs":[{"name":"","type":"bytes32"},{"name":"","type":"uint256"},{"name":"","type":"bytes32"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_blindedProposal","type":"bytes32"}],"name":"propose","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"blocksPerPhase","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_proposal","type":"bytes32"},{"name":"_secret","type":"bytes32"}],"name":"createProof","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":false,"inputs":[{"name":"_minimumStakingTokenPercentage","type":"uint8"}],"name":"updateMinimumStakingTokenPercentage","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_registryAddress","type":"address"}],"name":"updateRegistryAddress","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"minimumStakingTokenPercentage","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_blockHeight","type":"uint256"},{"name":"_shard","type":"uint256"},{"name":"_proposal","type":"bytes32"}],"name":"getBlockCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"registryAddress","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_proposal","type":"bytes32"},{"name":"_secret","type":"bytes32"}],"name":"reveal","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"_registryAddress","type":"address"},{"name":"_blocksPerPhase","type":"uint8"},{"name":"_minimumStakingTokenPercentage","type":"uint8"},{"name":"_updateMinimumStakingTokenPercentageEnabled","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"blockHeight","type":"uint256"},{"indexed":false,"name":"blindedProposal","type":"bytes32"},{"indexed":false,"name":"shard","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"LogPropose","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"blockHeight","type":"uint256"},{"indexed":false,"name":"proposal","type":"bytes32"}],"name":"LogReveal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"sender","type":"address"},{"indexed":false,"name":"blockHeight","type":"uint256"},{"indexed":false,"name":"shard","type":"uint256"},{"indexed":false,"name":"proposal","type":"bytes32"},{"indexed":false,"name":"counts","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"},{"indexed":false,"name":"newWinner","type":"bool"},{"indexed":false,"name":"totalTokenBalanceForShard","type":"uint256"}],"name":"LogUpdateCounters","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"blocksPerPhase","type":"uint8"},{"indexed":false,"name":"requirePercentOfTokens","type":"uint8"},{"indexed":false,"name":"updateMinimumStakingTokenPercentageEnabled","type":"bool"}],"name":"LogChainConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"newRegistryAddress","type":"address"}],"name":"LogUpdateRegistryAddress","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

Contract Creation Code

6080604052600160025534801561001557600080fd5b5060405160808061251b8339810180604052810190808051906020019092919080519060200190929190805190602001909291908051906020019092919050505083838383336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008360ff16111515610115576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5f626c6f636b7350657250686173652063616e277420626520656d707479000081525060200191505060405180910390fd5b82600060156101000a81548160ff021916908360ff16021790555060008260ff161115156101d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f5f6d696e696d756d5374616b696e67546f6b656e50657263656e74616765206381526020017f616e277420626520656d7074790000000000000000000000000000000000000081525060400191505060405180910390fd5b60648260ff1611151515610273576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f5f6d696e696d756d5374616b696e67546f6b656e50657263656e74616765206381526020017f616e2774206265206f766572203130302500000000000000000000000000000081525060400191505060405180910390fd5b81600160146101000a81548160ff021916908360ff16021790555080600060146101000a81548160ff0219169083151502179055507f2e993764f1eb4681fdc62a41b1f541d2a8fb0f11a69d2805efbf94da3e85caa7838383604051808460ff1660ff1681526020018360ff1660ff16815260200182151515158152602001935050505060405180910390a1600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141515156103a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7265676973747279206164647265737320697320656d7074790000000000000081525060200191505060405180910390fd5b83600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508373ffffffffffffffffffffffffffffffffffffffff167f2946e20a9dcd908c83a8dcb3762f39c7dc6117017687921c109b86e3514e83cd60405160405180910390a250505050505050506120dc8061043f6000396000f30060806040526004361061013e576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630632a2f31461014357806347a34bcb146101ba57806354be44f0146102055780635c67dd1e14610234578063621df4be14610287578063669b7e69146102b2578063715018a6146102f357806377d9e5fd1461030a578063793ca3fe146103595780637bb96acb146103845780637ded0c15146103af5780638aba9215146103fa5780638da5cb5b1461043b578063921f5dec1461049257806399882cdb14610518578063af13aacc14610561578063bfa8ad3614610592578063c2b41ac4146105ed578063c57a882514610635578063cefc084814610690578063d3d44e8b146106c1578063ed9aab511461071a578063f2fde38b14610771578063fc334e8c146107b4575b600080fd5b34801561014f57600080fd5b50610178600480360381019080803590602001909291908035906020019092919050505061080b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101c657600080fd5b506101ef6004803603810190808035906020019092919080359060200190929190505050610863565b6040518082815260200191505060405180910390f35b34801561021157600080fd5b5061021a610895565b604051808215151515815260200191505060405180910390f35b34801561024057600080fd5b5061026960048036038101908080359060200190929190803590602001909291905050506108a8565b60405180826000191660001916815260200191505060405180910390f35b34801561029357600080fd5b5061029c6108da565b6040518082815260200191505060405180910390f35b3480156102be57600080fd5b506102dd60048036038101908080359060200190929190505050610902565b6040518082815260200191505060405180910390f35b3480156102ff57600080fd5b50610308610925565b005b34801561031657600080fd5b5061033f6004803603810190808035906020019092919080359060200190929190505050610a27565b604051808215151515815260200191505060405180910390f35b34801561036557600080fd5b5061036e610abe565b6040518082815260200191505060405180910390f35b34801561039057600080fd5b50610399610adf565b6040518082815260200191505060405180910390f35b3480156103bb57600080fd5b506103e46004803603810190808035906020019092919080359060200190929190505050610b0e565b6040518082815260200191505060405180910390f35b34801561040657600080fd5b5061042560048036038101908080359060200190929190505050610b40565b6040518082815260200191505060405180910390f35b34801561044757600080fd5b50610450610b58565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561049e57600080fd5b506104dd60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b7d565b604051808560001916600019168152602001848152602001836000191660001916815260200182815260200194505050505060405180910390f35b34801561052457600080fd5b506105476004803603810190808035600019169060200190929190505050610c00565b604051808215151515815260200191505060405180910390f35b34801561056d57600080fd5b5061057661113b565b604051808260ff1660ff16815260200191505060405180910390f35b34801561059e57600080fd5b506105cf6004803603810190808035600019169060200190929190803560001916906020019092919050505061114e565b60405180826000191660001916815260200191505060405180910390f35b3480156105f957600080fd5b5061061b600480360381019080803560ff1690602001909291905050506111f2565b604051808215151515815260200191505060405180910390f35b34801561064157600080fd5b50610676600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114a1565b604051808215151515815260200191505060405180910390f35b34801561069c57600080fd5b506106a5611630565b604051808260ff1660ff16815260200191505060405180910390f35b3480156106cd57600080fd5b5061070460048036038101908080359060200190929190803590602001909291908035600019169060200190929190505050611643565b6040518082815260200191505060405180910390f35b34801561072657600080fd5b5061072f61168f565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561077d57600080fd5b506107b2600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506116b5565b005b3480156107c057600080fd5b506107f16004803603810190808035600019169060200190929190803560001916906020019092919050505061171c565b604051808215151515815260200191505060405180910390f35b6000600360008481526020019081526020016000206006018281548110151561083057fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b600060036000848152602001908152602001600020600301600083815260200190815260200160002054905092915050565b600060149054906101000a900460ff1681565b600060036000848152602001908152602001600020600001600083815260200190815260200160002054905092915050565b60006002600060159054906101000a900460ff1660ff1602438115156108fc57fe5b06905090565b600060036000838152602001908152602001600020600601805490509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561098057600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000806003600085815260200190815260200160002090506000816005016000858152602001908152602001600020541415610a665760009150610ab7565b600160149054906101000a900460ff1660ff168160050160008581526020019081526020016000205460648360030160008781526020019081526020016000205402811515610ab157fe5b04101591505b5092915050565b6000610ada610acb6108da565b43611a4e90919063ffffffff16565b905090565b6000610b096002600060159054906101000a900460ff1660ff160243611a6790919063ffffffff16565b905090565b600060036000848152602001908152602001600020600501600083815260200190815260200160002054905092915050565b60046020528060005260406000206000915090505481565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060006003600088815260200190815260200160002060020160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260020154836003015494509450945094505092959194509250565b600080600080600080600060159054906101000a900460ff1660ff16610c246108da565b101515610c99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f776520617265206e6f7420696e2070726f706f7365207068617365000000000081525060200191505060405180910390fd5b6001600254141515610caa57600080fd5b60028081905550610cb9610adf565b9450600060010260001916876000191614151515610d3f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5f626c696e64656450726f706f73616c20697320656d7074790000000000000081525060200191505060405180910390fd5b600360008681526020019081526020016000206001016000886000191660001916815260200190815260200160002060009054906101000a900460ff16151515610df1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f626c696e64656450726f706f73616c206e6f7420756e6971756500000000000081525060200191505060405180910390fd5b610dfa33611a7d565b809450819550829650505050831515610ea1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f7665726966696572206973206e6f7420696e207468652072656769737472792081526020017f6f72206e6f74206163746976650000000000000000000000000000000000000081525060400191505060405180910390fd5b600083111515610f19576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f766572696669657220686173206e6f20726967687420746f2070726f706f736581525060200191505060405180910390fd5b6003600086815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060006001026000191681600001546000191614151561101b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f766572696669657220616c72656164792070726f706f73656420696e2074686981526020017f7320726f756e640000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600360008781526020019081526020016000206001016000896000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550868160000181600019169055508181600101819055508281600301819055506000600460008481526020019081526020016000205414156110b7578460046000848152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f69f47e8a8ef3279604544fd81e85175c04f41a20ff5a1af46b5ef2e7c9848bc38689858760405180858152602001846000191660001916815260200183815260200182815260200194505050505060405180910390a26001955060016002819055505050505050919050565b600060159054906101000a900460ff1681565b600082826040516020018083600019166000191681526020018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b6020831015156111bd5780518252602082019150602081019050602083039250611198565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561124f57600080fd5b600060149054906101000a900460ff1615156112d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f757064617465206e6f7420617661696c61626c6500000000000000000000000081525060200191505060405180910390fd5b60008260ff16111515611374576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f5f6d696e696d756d5374616b696e67546f6b656e50657263656e74616765206381526020017f616e277420626520656d7074790000000000000000000000000000000000000081525060400191505060405180910390fd5b60648260ff1611151515611416576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f5f6d696e696d756d5374616b696e67546f6b656e50657263656e74616765206381526020017f616e2774206265206f766572203130302500000000000000000000000000000081525060400191505060405180910390fd5b81600160146101000a81548160ff021916908360ff1602179055507f2e993764f1eb4681fdc62a41b1f541d2a8fb0f11a69d2805efbf94da3e85caa7600060159054906101000a900460ff16836001604051808460ff1660ff1681526020018360ff1660ff16815260200182151515158152602001935050505060405180910390a160019050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156114fe57600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156115a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5f7265676973747279416464726573732063616e277420626520656d7074790081525060200191505060405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f2946e20a9dcd908c83a8dcb3762f39c7dc6117017687921c109b86e3514e83cd60405160405180910390a260019050919050565b600160149054906101000a900460ff1681565b6000600360008581526020019081526020016000206004016000848152602001908152602001600020600083600019166000191681526020019081526020016000205490509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561171057600080fd5b61171981611c1c565b50565b600080600080600060159054906101000a900460ff1660ff1661173d6108da565b101515156117b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f776520617265206e6f7420696e2072657665616c20706861736500000000000081525060200191505060405180910390fd5b6117bb610adf565b92506117c7868661114e565b91506003600084815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081600019168160000154600019161415156118c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001807f796f75722070726f706f73616c20646f206e6f7420657869737473202861726581526020017f20796f752076657269666965723f29204f5220696e76616c69642070726f6f6681525060400191505060405180910390fd5b60006001026000191681600201546000191614151561194e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f796f7520616c72656164792072657665616c656400000000000000000000000081525060200191505060405180910390fd5b85816002018160001916905550611969816001015487611d16565b600360008481526020019081526020016000206006013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550503373ffffffffffffffffffffffffffffffffffffffff167f393ea91a2ccbefa4f42432d1862d4d257233d07d4d1e0e94066e1168df20392684886040518083815260200182600019166000191681526020019250505060405180910390a26001935050505092915050565b6000828211151515611a5c57fe5b818303905092915050565b60008183811515611a7457fe5b04905092915050565b600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16636c824487866040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b158015611b4357600080fd5b505af1158015611b57573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060a0811015611b8157600080fd5b81019080805190602001909291908051640100000000811115611ba357600080fd5b82810190506020810184811115611bb957600080fd5b8151856001820283011164010000000082111715611bd657600080fd5b5050929190602001805190602001909291908051906020019092919080519060200190929190505050909192935090919250809450819550829650505050509193909250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151515611c5857600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000806000806000611d26610adf565b94506003600086815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015493508360036000878152602001908152602001600020600401600089815260200190815260200160002060008860001916600019168152602001908152602001600020600082825401925050819055506003600086815260200190815260200160002060040160008881526020019081526020016000206000876000191660001916815260200190815260200160002054925060036000868152602001908152602001600020600301600088815260200190815260200160002054831115611edb5785600019166003600087815260200190815260200160002060000160008981526020019081526020016000205460001916141515611eae57856003600087815260200190815260200160002060000160008981526020019081526020016000208160001916905550600191505b82600360008781526020019081526020016000206003016000898152602001908152602001600020819055505b611ee487611fd6565b90508060036000878152602001908152602001600020600501600089815260200190815260200160002054141515611f435780600360008781526020019081526020016000206005016000898152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f0c4b4d509de37fabf3c5ecde4bc6691e1571594f41511e94a890de070877026b868989878988886040518088815260200187815260200186600019166000191681526020018581526020018481526020018315151515815260200182815260200197505050505050505060405180910390a250505050505050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16634ff85794846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b15801561206d57600080fd5b505af1158015612081573d6000803e3d6000fd5b505050506040513d602081101561209757600080fd5b81019080805190602001909291905050509150509190505600a165627a7a7230582033495d094b09837aaa44cd4e91b290f7febdb871e3e1dd683c72669a84f520f10029000000000000000000000000614cb086657c47739068c12eeff43a4018be1190000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000000000000000000000000000000000000001

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

000000000000000000000000614cb086657c47739068c12eeff43a4018be1190000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000004b0000000000000000000000000000000000000000000000000000000000000001

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 000000000000000000000000614cb086657c47739068c12eeff43a4018be1190
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 000000000000000000000000000000000000000000000000000000000000004b
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000001

Swarm Source

bzzr://33495d094b09837aaa44cd4e91b290f7febdb871e3e1dd683c72669a84f520f1
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward