Latest 25 transactions from a total of 21819 transactions

TxHash Age From To Value [TxFee]
0x93c6edce34a5e0b28715e5f3cb25c38ed8e87113e7da32259279964fbe67ae6f26 days 2 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001989276
0xca3171e120a94d77508a6df12fd5e22a74c1d5d8e1ff598bc1d48362490f572e26 days 2 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.002169276
0x4566f05be4b7ee4b7c59b2bfe0e775cdf4feec49d52b6d5af8683c7476b103b926 days 2 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001147692
0x4482d6bec94fd344a77aba80e620e3359c70c8c4f690bc112fabf6715e94ec7726 days 2 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001385292
0xe656ea3d37013d3f4a67a964c983439866e4c031a2cc12e7e0f641a30854d9be26 days 2 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001989276
0x32724944cd39911004f98dc82876c1bf8f4fc3c1953bd216df6fe9ca942e2cce26 days 2 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.002169276
0xec543d600ef5723a17d42481fae5c46b7ca2be955565cf8e1d17e47ba5f0208426 days 2 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001147692
0x5bdcb8ca440f33e0c79a30cf54f6b3983030b2bc55e215643d7f1c41bccaebb726 days 2 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001385292
0xe363f0dd35113089b8138d954d16903d7b5f4ed705d0215dea0326a841a6c01b26 days 2 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001989276
0x42864e7a0de4d5e1dc7ba77da33869f1eb20b08b81e5b3e61663529a0b87532826 days 2 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.002169276
0x27e2302ae053f7753b8513b7feb8d98232f45d8d0f348719e2cef1f01eccd1ea26 days 2 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001385292
0x14da1d4f0f4e5b1a053b1a92b6c98717e000395499b7dd0056b1c009516af8fd26 days 2 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001147692
0x630b1f54af98793d2ce8ac83a68944ab4ea1cd74e1e16a92f911e5dac28d394526 days 2 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.002169276
0xa8af3a3486dd0e8b316dcad87706f403cd4a3abaacc90b7ed18198364d096cd826 days 2 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001385292
0xac7596931847f2d5d23553d6d0226a72538438a80007100dc5dd05a8a57fd5d226 days 2 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001147692
0x118f0927f75cf736aaf12b87f90b01c6824e1db7b67af3ee5a81847449b036f726 days 3 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.002169276
0x932689ae644beede451cf22c44f0791b0db4149e1855a9368884e18106fc052926 days 3 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001147692
0xafed6343308cb3a34614629a2b6c317fb738ab4d9f19e9403a223b41f06462cf26 days 3 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001385292
0x17fc69412e87ff8f1ecb6cb3e73bdf446a6758ac5123d8d753ff30117ebd13ca26 days 3 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.002168508
0x09a071f72953b626c3d7d1c7fbb88269ab9de26be6171f5fbbda3cca3af2ff6e26 days 3 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001147692
0xce62d4646e4a1078f8aa3c70642998d86d7fa97e4efc8cad18cf419911d0412f26 days 3 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001384524
0xad759b1579d8693aa7173346a3063ade4f5079f5ae5ca6598e6a6da2408b9ec926 days 3 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.002169276
0x24fc02e470982adfff4a31bd99870b43f7aae026681277d960bdda3643651e4526 days 3 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001146924
0x2e1523f11f02eea489daac5276c82e891b4daa45edd3424549ed68e231671d9226 days 3 hrs ago0xd85c3c5e20f6c168c111446583119944b303624d  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001385292
0x727a801bdd42cbb187d4a84f4bd0a6e29c57c69f1d9925cc41e0d0f6ab0d837f26 days 3 hrs ago0x2bf78e554bb2ba204dd3983f692c25f6dd053210  IN   0xe7615ad93bca725eff6350704112a64a3c95d7830 Ether0.001989276
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
 Latest 25 Internal Txns, Click here To View More View All
ParentTxHash Block Age From To Value
0x93c6edce34a5e0b28715e5f3cb25c38ed8e87113e7da32259279964fbe67ae6f489523126 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0xca3171e120a94d77508a6df12fd5e22a74c1d5d8e1ff598bc1d48362490f572e489523126 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x4566f05be4b7ee4b7c59b2bfe0e775cdf4feec49d52b6d5af8683c7476b103b9489522326 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x4482d6bec94fd344a77aba80e620e3359c70c8c4f690bc112fabf6715e94ec77489522226 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0xe656ea3d37013d3f4a67a964c983439866e4c031a2cc12e7e0f641a30854d9be489521126 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x32724944cd39911004f98dc82876c1bf8f4fc3c1953bd216df6fe9ca942e2cce489521126 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0xec543d600ef5723a17d42481fae5c46b7ca2be955565cf8e1d17e47ba5f02084489520126 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x5bdcb8ca440f33e0c79a30cf54f6b3983030b2bc55e215643d7f1c41bccaebb7489520126 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0xe363f0dd35113089b8138d954d16903d7b5f4ed705d0215dea0326a841a6c01b489519126 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x42864e7a0de4d5e1dc7ba77da33869f1eb20b08b81e5b3e61663529a0b875328489519126 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x27e2302ae053f7753b8513b7feb8d98232f45d8d0f348719e2cef1f01eccd1ea489518226 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x14da1d4f0f4e5b1a053b1a92b6c98717e000395499b7dd0056b1c009516af8fd489518226 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x630b1f54af98793d2ce8ac83a68944ab4ea1cd74e1e16a92f911e5dac28d3945489517126 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0xa8af3a3486dd0e8b316dcad87706f403cd4a3abaacc90b7ed18198364d096cd8489516226 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0xac7596931847f2d5d23553d6d0226a72538438a80007100dc5dd05a8a57fd5d2489516226 days 2 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x118f0927f75cf736aaf12b87f90b01c6824e1db7b67af3ee5a81847449b036f7489515126 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x932689ae644beede451cf22c44f0791b0db4149e1855a9368884e18106fc0529489514126 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0xafed6343308cb3a34614629a2b6c317fb738ab4d9f19e9403a223b41f06462cf489514126 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x17fc69412e87ff8f1ecb6cb3e73bdf446a6758ac5123d8d753ff30117ebd13ca489513126 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x09a071f72953b626c3d7d1c7fbb88269ab9de26be6171f5fbbda3cca3af2ff6e489512526 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0xce62d4646e4a1078f8aa3c70642998d86d7fa97e4efc8cad18cf419911d0412f489512526 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0xad759b1579d8693aa7173346a3063ade4f5079f5ae5ca6598e6a6da2408b9ec9489511126 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x24fc02e470982adfff4a31bd99870b43f7aae026681277d960bdda3643651e45489510226 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x2e1523f11f02eea489daac5276c82e891b4daa45edd3424549ed68e231671d92489510226 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 Ether
0x727a801bdd42cbb187d4a84f4bd0a6e29c57c69f1d9925cc41e0d0f6ab0d837f489509226 days 3 hrs ago0xe7615ad93bca725eff6350704112a64a3c95d7830x00c5ce08a2e99d007b5d966bea21e3644e4a6b170 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 (Exact Match)
Contract Name: Chain
Compiler Version: v0.4.24+commit.e67f0147
Optimization Enabled: No
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

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 created,
    uint256 balance,
    uint256 shard
  );

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

  event LogBalancePerShard(uint256 shard, uint256 balance);

  struct Verifier {
    address id;
    string location;
    bool created;
    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.created, "verifier already exists");

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

    addresses.push(verifier.id);

    emit LogVerifierRegistered(
      verifier.id,
      verifier.location,
      verifier.created,
      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.created, "verifier do not exists");

    verifier.location = _location;

    emit LogVerifierUpdated(
      verifier.id,
      verifier.location,
      verifier.created,
      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;
  }
}

// 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 {

  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);

  event LogUpdateRegistryAddress(address indexed newRegistryAddress);

  constructor (address _registryAddress, uint8 _blocksPerPhase, uint8 _minimumStakingTokenPercentage)
  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;

    emit LogChainConfig(_blocksPerPhase, _minimumStakingTokenPercentage);


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


  /// @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;

  constructor (
    address _registryAddress,
    uint8 _blocksPerPhase,
    uint8 _minimumStakingTokenPercentage
  )
  ChainConfig(_registryAddress, _blocksPerPhase, _minimumStakingTokenPercentage)
  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 created;
    uint256 balance;
    uint256 shard;
    (created, balance, shard) = _getVerifierInfo(msg.sender);
    require(created, "verifier is not in the registry");
    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;

    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 created, uint256 shard)
  function _getVerifierInfo(address _verifier)
  internal
  view
  returns (bool created, uint256 balance, uint256 shard) {
    VerifierRegistry registry = VerifierRegistry(registryAddress);

    ( , , created, 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":"_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":"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":"_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"}],"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"}],"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 Switch To Opcodes View
6080604052600160025534801561001557600080fd5b506040516060806120da833981018060405281019080805190602001909291908051906020019092919080519060200190929190505050828282336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008260ff1611151561010a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f5f626c6f636b7350657250686173652063616e277420626520656d707479000081525060200191505060405180910390fd5b81600060146101000a81548160ff021916908360ff16021790555060008160ff161115156101c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f5f6d696e696d756d5374616b696e67546f6b656e50657263656e74616765206381526020017f616e277420626520656d7074790000000000000000000000000000000000000081525060400191505060405180910390fd5b60648160ff1611151515610268576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f5f6d696e696d756d5374616b696e67546f6b656e50657263656e74616765206381526020017f616e2774206265206f766572203130302500000000000000000000000000000081525060400191505060405180910390fd5b80600160146101000a81548160ff021916908360ff1602179055507fb3c249b0ed14c11380d2a5211ff065de51b71d96202934e696de780be8abb1378282604051808360ff1660ff1681526020018260ff1660ff1681526020019250505060405180910390a1600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614151515610373576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f7265676973747279206164647265737320697320656d7074790000000000000081525060200191505060405180910390fd5b82600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508273ffffffffffffffffffffffffffffffffffffffff167f2946e20a9dcd908c83a8dcb3762f39c7dc6117017687921c109b86e3514e83cd60405160405180910390a2505050505050611cce8061040c6000396000f30060806040526004361061011d576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630632a2f31461012257806347a34bcb146101995780635c67dd1e146101e4578063621df4be14610237578063669b7e6914610262578063715018a6146102a357806377d9e5fd146102ba578063793ca3fe146103095780637bb96acb146103345780637ded0c151461035f5780638da5cb5b146103aa578063921f5dec1461040157806399882cdb14610487578063af13aacc146104d0578063bfa8ad3614610501578063c57a88251461055c578063cefc0848146105b7578063d3d44e8b146105e8578063ed9aab5114610641578063f2fde38b14610698578063fc334e8c146106db575b600080fd5b34801561012e57600080fd5b506101576004803603810190808035906020019092919080359060200190929190505050610732565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101a557600080fd5b506101ce600480360381019080803590602001909291908035906020019092919050505061078a565b6040518082815260200191505060405180910390f35b3480156101f057600080fd5b5061021960048036038101908080359060200190929190803590602001909291905050506107bc565b60405180826000191660001916815260200191505060405180910390f35b34801561024357600080fd5b5061024c6107ee565b6040518082815260200191505060405180910390f35b34801561026e57600080fd5b5061028d60048036038101908080359060200190929190505050610816565b6040518082815260200191505060405180910390f35b3480156102af57600080fd5b506102b8610839565b005b3480156102c657600080fd5b506102ef600480360381019080803590602001909291908035906020019092919050505061093b565b604051808215151515815260200191505060405180910390f35b34801561031557600080fd5b5061031e6109d2565b6040518082815260200191505060405180910390f35b34801561034057600080fd5b506103496109f3565b6040518082815260200191505060405180910390f35b34801561036b57600080fd5b506103946004803603810190808035906020019092919080359060200190929190505050610a22565b6040518082815260200191505060405180910390f35b3480156103b657600080fd5b506103bf610a54565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561040d57600080fd5b5061044c60048036038101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a79565b604051808560001916600019168152602001848152602001836000191660001916815260200182815260200194505050505060405180910390f35b34801561049357600080fd5b506104b66004803603810190808035600019169060200190929190505050610afc565b604051808215151515815260200191505060405180910390f35b3480156104dc57600080fd5b506104e5610fdc565b604051808260ff1660ff16815260200191505060405180910390f35b34801561050d57600080fd5b5061053e60048036038101908080356000191690602001909291908035600019169060200190929190505050610fef565b60405180826000191660001916815260200191505060405180910390f35b34801561056857600080fd5b5061059d600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611093565b604051808215151515815260200191505060405180910390f35b3480156105c357600080fd5b506105cc611222565b604051808260ff1660ff16815260200191505060405180910390f35b3480156105f457600080fd5b5061062b60048036038101908080359060200190929190803590602001909291908035600019169060200190929190505050611235565b6040518082815260200191505060405180910390f35b34801561064d57600080fd5b50610656611281565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156106a457600080fd5b506106d9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506112a7565b005b3480156106e757600080fd5b506107186004803603810190808035600019169060200190929190803560001916906020019092919050505061130e565b604051808215151515815260200191505060405180910390f35b6000600360008481526020019081526020016000206006018281548110151561075757fe5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905092915050565b600060036000848152602001908152602001600020600301600083815260200190815260200160002054905092915050565b600060036000848152602001908152602001600020600001600083815260200190815260200160002054905092915050565b60006002600060149054906101000a900460ff1660ff16024381151561081057fe5b06905090565b600060036000838152602001908152602001600020600601805490509050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561089457600080fd5b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482060405160405180910390a260008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b600080600360008581526020019081526020016000209050600081600501600085815260200190815260200160002054141561097a57600091506109cb565b600160149054906101000a900460ff1660ff1681600501600085815260200190815260200160002054606483600301600087815260200190815260200160002054028115156109c557fe5b04101591505b5092915050565b60006109ee6109df6107ee565b4361164090919063ffffffff16565b905090565b6000610a1d6002600060149054906101000a900460ff1660ff16024361165990919063ffffffff16565b905090565b600060036000848152602001908152602001600020600501600083815260200190815260200160002054905092915050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060006003600088815260200190815260200160002060020160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050806000015481600101548260020154836003015494509450945094505092959194509250565b600080600080600080600060149054906101000a900460ff1660ff16610b206107ee565b101515610b95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601b8152602001807f776520617265206e6f7420696e2070726f706f7365207068617365000000000081525060200191505060405180910390fd5b6001600254141515610ba657600080fd5b60028081905550610bb56109f3565b9450600060010260001916876000191614151515610c3b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260198152602001807f5f626c696e64656450726f706f73616c20697320656d7074790000000000000081525060200191505060405180910390fd5b600360008681526020019081526020016000206001016000886000191660001916815260200190815260200160002060009054906101000a900460ff16151515610ced576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f626c696e64656450726f706f73616c206e6f7420756e6971756500000000000081525060200191505060405180910390fd5b610cf63361166f565b809450819550829650505050831515610d77576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f7665726966696572206973206e6f7420696e207468652072656769737472790081525060200191505060405180910390fd5b600083111515610def576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f766572696669657220686173206e6f20726967687420746f2070726f706f736581525060200191505060405180910390fd5b6003600086815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600060010260001916816000015460001916141515610ef1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260278152602001807f766572696669657220616c72656164792070726f706f73656420696e2074686981526020017f7320726f756e640000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600360008781526020019081526020016000206001016000896000191660001916815260200190815260200160002060006101000a81548160ff021916908315150217905550868160000181600019169055508181600101819055508281600301819055503373ffffffffffffffffffffffffffffffffffffffff167f69f47e8a8ef3279604544fd81e85175c04f41a20ff5a1af46b5ef2e7c9848bc38689858760405180858152602001846000191660001916815260200183815260200182815260200194505050505060405180910390a26001955060016002819055505050505050919050565b600060149054906101000a900460ff1681565b600082826040516020018083600019166000191681526020018260001916600019168152602001925050506040516020818303038152906040526040518082805190602001908083835b60208310151561105e5780518252602082019150602081019050602083039250611039565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040518091039020905092915050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156110f057600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614151515611195576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601f8152602001807f5f7265676973747279416464726573732063616e277420626520656d7074790081525060200191505060405180910390fd5b81600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff167f2946e20a9dcd908c83a8dcb3762f39c7dc6117017687921c109b86e3514e83cd60405160405180910390a260019050919050565b600160149054906101000a900460ff1681565b6000600360008581526020019081526020016000206004016000848152602001908152602001600020600083600019166000191681526020019081526020016000205490509392505050565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561130257600080fd5b61130b8161180e565b50565b600080600080600060149054906101000a900460ff1660ff1661132f6107ee565b101515156113a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601a8152602001807f776520617265206e6f7420696e2072657665616c20706861736500000000000081525060200191505060405180910390fd5b6113ad6109f3565b92506113b98686610fef565b91506003600084815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905081600019168160000154600019161415156114b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260408152602001807f796f75722070726f706f73616c20646f206e6f7420657869737473202861726581526020017f20796f752076657269666965723f29204f5220696e76616c69642070726f6f6681525060400191505060405180910390fd5b600060010260001916816002015460001916141515611540576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260148152602001807f796f7520616c72656164792072657665616c656400000000000000000000000081525060200191505060405180910390fd5b8581600201816000191690555061155b816001015487611908565b600360008481526020019081526020016000206006013390806001815401808255809150509060018203906000526020600020016000909192909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550503373ffffffffffffffffffffffffffffffffffffffff167f393ea91a2ccbefa4f42432d1862d4d257233d07d4d1e0e94066e1168df20392684886040518083815260200182600019166000191681526020019250505060405180910390a26001935050505092915050565b600082821115151561164e57fe5b818303905092915050565b6000818381151561166657fe5b04905092915050565b600080600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16636c824487866040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561173557600080fd5b505af1158015611749573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f8201168201806040525060a081101561177357600080fd5b8101908080519060200190929190805164010000000081111561179557600080fd5b828101905060208101848111156117ab57600080fd5b81518560018202830111640100000000821117156117c857600080fd5b5050929190602001805190602001909291908051906020019092919080519060200190929190505050909192935090919250809450819550829650505050509193909250565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561184a57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff166000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008060008060006119186109f3565b94506003600086815260200190815260200160002060020160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206003015493508360036000878152602001908152602001600020600401600089815260200190815260200160002060008860001916600019168152602001908152602001600020600082825401925050819055506003600086815260200190815260200160002060040160008881526020019081526020016000206000876000191660001916815260200190815260200160002054925060036000868152602001908152602001600020600301600088815260200190815260200160002054831115611acd5785600019166003600087815260200190815260200160002060000160008981526020019081526020016000205460001916141515611aa057856003600087815260200190815260200160002060000160008981526020019081526020016000208160001916905550600191505b82600360008781526020019081526020016000206003016000898152602001908152602001600020819055505b611ad687611bc8565b90508060036000878152602001908152602001600020600501600089815260200190815260200160002054141515611b355780600360008781526020019081526020016000206005016000898152602001908152602001600020819055505b3373ffffffffffffffffffffffffffffffffffffffff167f0c4b4d509de37fabf3c5ecde4bc6691e1571594f41511e94a890de070877026b868989878988886040518088815260200187815260200186600019166000191681526020018581526020018481526020018315151515815260200182815260200197505050505050505060405180910390a250505050505050565b600080600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690508073ffffffffffffffffffffffffffffffffffffffff16634ff85794846040518263ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180828152602001915050602060405180830381600087803b158015611c5f57600080fd5b505af1158015611c73573d6000803e3d6000fd5b505050506040513d6020811015611c8957600080fd5b81019080805190602001909291905050509150509190505600a165627a7a7230582097b14e435bef91e73c579ef4a335b682fb39a13035f8fd5a34fb944a2e45b2030029000000000000000000000000dd2cd445c4b0d38addd83c2606b2fbb2a3210d2c000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000046

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

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 000000000000000000000000dd2cd445c4b0d38addd83c2606b2fbb2a3210d2c
Arg [1] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000046


   Swarm Source:
bzzr://97b14e435bef91e73c579ef4a335b682fb39a13035f8fd5a34fb944a2e45b203

 

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