Contract 0x695192edbcdd5a13b63ec2cb917dd0ffedf83be9

Contract Overview

Balance:
0 Ether

Internal Transactions as a result of Contract Execution

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

Contract Source Code Verified (Exact Match)

Contract Name:
CnusPoolForStaking

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes

Runs (Optimizer):
500

Contract Source Code

pragma solidity ^0.4.24;

// File: bancor-contracts/solidity/contracts/utility/interfaces/IOwned.sol

/*
    Owned contract interface
*/
contract IOwned {
    // this function isn't abstract since the compiler emits automatically generated getter functions as external
    function owner() public view returns (address) {}

    function transferOwnership(address _newOwner) public;
    function acceptOwnership() public;
}

// File: bancor-contracts/solidity/contracts/utility/Owned.sol

/*
    Provides support and utilities for contract ownership
*/
contract Owned is IOwned {
    address public owner;
    address public newOwner;

    event OwnerUpdate(address indexed _prevOwner, address indexed _newOwner);

    /**
        @dev constructor
    */
    constructor() public {
        owner = msg.sender;
    }

    // allows execution by the owner only
    modifier ownerOnly {
        require(msg.sender == owner);
        _;
    }

    /**
        @dev allows transferring the contract ownership
        the new owner still needs to accept the transfer
        can only be called by the contract owner

        @param _newOwner    new contract owner
    */
    function transferOwnership(address _newOwner) public ownerOnly {
        require(_newOwner != owner);
        newOwner = _newOwner;
    }

    /**
        @dev used by a new owner to accept an ownership transfer
    */
    function acceptOwnership() public {
        require(msg.sender == newOwner);
        emit OwnerUpdate(owner, newOwner);
        owner = newOwner;
        newOwner = address(0);
    }
}

// File: bancor-contracts/solidity/contracts/utility/Utils.sol

/*
    Utilities & Common Modifiers
*/
contract Utils {
    /**
        constructor
    */
    constructor() public {
    }

    // verifies that an amount is greater than zero
    modifier greaterThanZero(uint256 _amount) {
        require(_amount > 0);
        _;
    }

    // validates an address - currently only checks that it isn't null
    modifier validAddress(address _address) {
        require(_address != address(0));
        _;
    }

    // verifies that the address is different than this contract address
    modifier notThis(address _address) {
        require(_address != address(this));
        _;
    }

    // Overflow protected math functions

    /**
        @dev returns the sum of _x and _y, asserts if the calculation overflows

        @param _x   value 1
        @param _y   value 2

        @return sum
    */
    function safeAdd(uint256 _x, uint256 _y) internal pure returns (uint256) {
        uint256 z = _x + _y;
        assert(z >= _x);
        return z;
    }

    /**
        @dev returns the difference of _x minus _y, asserts if the subtraction results in a negative number

        @param _x   minuend
        @param _y   subtrahend

        @return difference
    */
    function safeSub(uint256 _x, uint256 _y) internal pure returns (uint256) {
        assert(_x >= _y);
        return _x - _y;
    }

    /**
        @dev returns the product of multiplying _x by _y, asserts if the calculation overflows

        @param _x   factor 1
        @param _y   factor 2

        @return product
    */
    function safeMul(uint256 _x, uint256 _y) internal pure returns (uint256) {
        uint256 z = _x * _y;
        assert(_x == 0 || z / _x == _y);
        return z;
    }
}

// File: bancor-contracts/solidity/contracts/token/interfaces/IERC20Token.sol

/*
    ERC20 Standard Token interface
*/
contract IERC20Token {
    // these functions aren't abstract since the compiler emits automatically generated getter functions as external
    function name() public view returns (string) {}
    function symbol() public view returns (string) {}
    function decimals() public view returns (uint8) {}
    function totalSupply() public view returns (uint256) {}
    function balanceOf(address _owner) public view returns (uint256) { _owner; }
    function allowance(address _owner, address _spender) public view returns (uint256) { _owner; _spender; }

    function transfer(address _to, uint256 _value) public returns (bool success);
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success);
    function approve(address _spender, uint256 _value) public returns (bool success);
}

// File: bancor-contracts/solidity/contracts/utility/interfaces/ITokenHolder.sol

/*
    Token Holder interface
*/
contract ITokenHolder is IOwned {
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount) public;
}

// File: bancor-contracts/solidity/contracts/utility/TokenHolder.sol

/*
    We consider every contract to be a 'token holder' since it's currently not possible
    for a contract to deny receiving tokens.

    The TokenHolder's contract sole purpose is to provide a safety mechanism that allows
    the owner to send tokens that were sent to the contract by mistake back to their sender.
*/
contract TokenHolder is ITokenHolder, Owned, Utils {
    /**
        @dev constructor
    */
    constructor() public {
    }

    /**
        @dev withdraws tokens held by the contract and sends them to an account
        can only be called by the owner

        @param _token   ERC20 token contract address
        @param _to      account to receive the new amount
        @param _amount  amount to withdraw
    */
    function withdrawTokens(IERC20Token _token, address _to, uint256 _amount)
        public
        ownerOnly
        validAddress(_token)
        validAddress(_to)
        notThis(_to)
    {
        assert(_token.transfer(_to, _amount));
    }
}

// File: bancor-contracts/solidity/contracts/utility/interfaces/IContractRegistry.sol

/*
    Contract Registry interface
*/
contract IContractRegistry {
    function addressOf(bytes32 _contractName) public view returns (address);

    // deprecated, backward compatibility
    function getAddress(bytes32 _contractName) public view returns (address);
}

// File: openzeppelin-solidity/contracts/cryptography/ECDSA.sol

/**
 * @title Elliptic curve signature operations
 * @dev Based on https://gist.github.com/axic/5b33912c6f61ae6fd96d6c4a47afde6d
 * TODO Remove this library once solidity supports passing a signature to ecrecover.
 * See https://github.com/ethereum/solidity/issues/864
 */

library ECDSA {

  /**
   * @dev Recover signer address from a message by using their signature
   * @param hash bytes32 message, the hash is the signed message. What is recovered is the signer address.
   * @param signature bytes signature, the signature is generated using web3.eth.sign()
   */
  function recover(bytes32 hash, bytes signature)
    internal
    pure
    returns (address)
  {
    bytes32 r;
    bytes32 s;
    uint8 v;

    // Check the signature length
    if (signature.length != 65) {
      return (address(0));
    }

    // Divide the signature in r, s and v variables
    // ecrecover takes the signature parameters, and the only way to get them
    // currently is to use assembly.
    // solium-disable-next-line security/no-inline-assembly
    assembly {
      r := mload(add(signature, 0x20))
      s := mload(add(signature, 0x40))
      v := byte(0, mload(add(signature, 0x60)))
    }

    // Version of signature should be 27 or 28, but 0 and 1 are also possible versions
    if (v < 27) {
      v += 27;
    }

    // If the version is correct return the signer address
    if (v != 27 && v != 28) {
      return (address(0));
    } else {
      // solium-disable-next-line arg-overflow
      return ecrecover(hash, v, r, s);
    }
  }

  /**
   * toEthSignedMessageHash
   * @dev prefix a bytes32 value with "\x19Ethereum Signed Message:"
   * and hash the result
   */
  function toEthSignedMessageHash(bytes32 hash)
    internal
    pure
    returns (bytes32)
  {
    // 32 is the length in bytes of hash,
    // enforced by the type signature above
    return keccak256(
      abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)
    );
  }
}

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

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

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

    uint256 c = a * b;
    require(c / a == b);

    return c;
  }

  /**
  * @dev Integer division of two numbers truncating the quotient, reverts on division by zero.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b > 0); // Solidity only automatically asserts 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 c;
  }

  /**
  * @dev Subtracts two numbers, reverts on overflow (i.e. if subtrahend is greater than minuend).
  */
  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b <= a);
    uint256 c = a - b;

    return c;
  }

  /**
  * @dev Adds two numbers, reverts on overflow.
  */
  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    require(c >= a);

    return c;
  }

  /**
  * @dev Divides two numbers and returns the remainder (unsigned integer modulo),
  * reverts when dividing by zero.
  */
  function mod(uint256 a, uint256 b) internal pure returns (uint256) {
    require(b != 0);
    return a % b;
  }
}

// File: bancor-contracts/solidity/contracts/ContractIds.sol

/**
    Id definitions for bancor contracts

    Can be used in conjunction with the contract registry to get contract addresses
*/
contract ContractIds {
    // generic
    bytes32 public constant CONTRACT_FEATURES = "ContractFeatures";
    bytes32 public constant CONTRACT_REGISTRY = "ContractRegistry";

    // bancor logic
    bytes32 public constant BANCOR_NETWORK = "BancorNetwork";
    bytes32 public constant BANCOR_FORMULA = "BancorFormula";
    bytes32 public constant BANCOR_GAS_PRICE_LIMIT = "BancorGasPriceLimit";
    bytes32 public constant BANCOR_CONVERTER_UPGRADER = "BancorConverterUpgrader";
    bytes32 public constant BANCOR_CONVERTER_FACTORY = "BancorConverterFactory";

    // Ids of BNT converter and BNT token
    bytes32 public constant BNT_TOKEN = "BNTToken";
    bytes32 public constant BNT_CONVERTER = "BNTConverter";

    // Id of BancorX contract
    bytes32 public constant BANCOR_X = "BancorX";
}

// File: contracts/CoinVerseContractIds.sol

contract CoinVerseContractIds {
    bytes32 public constant BNUS_TOKEN = "BnusToken";
    bytes32 public constant CNUS_TOKEN = "CnusToken";
    bytes32 public constant TOKEN_POOL = "TokenPool";
    bytes32 public constant CNUS_POOL_FOR_STAKING = "CnusPoolForStaking";
}

// File: contracts/interfaces/ICnusPoolForStaking.sol

contract ICnusPoolForStaking {
    /**
       @dev can stake Cnus
       @param _amount amount of Cnus to stake
       @param _udid  unique Device Id to prevent abusing
       @param _signature signed udid with the private key of CoinUs wallet
    */
    function stake(uint256 _amount, bytes _udid, uint256 _expiration, bytes _signature) public;

    /**
       @dev withdrawing for approved requests
       @param _amount amount of Cnus to withdraw
       @param _udid  unique Device Id to prevent abusing
       @param _signature signed udid with the private key of CoinUs wallet
    */
    function withdraw(uint256 _amount, bytes _udid, uint256 _expiration, bytes _signature) public;

    /**
        @dev returns total amount of staked Cnus
    */
    function getStakedAmount() public view returns (uint256);

    function stakeOf(address _account) public view returns (uint256);
}

// File: contracts/CnusPoolForStaking.sol

contract CnusPoolForStaking is ICnusPoolForStaking, TokenHolder, CoinVerseContractIds {
    using ECDSA for bytes32;
    using SafeMath for uint256;


    IContractRegistry registry;
    address public coinUsAccount;
    mapping(address => uint256) staking;

    event Deposit(address indexed _account, uint256 _amount, uint256 _timestamp);
    event Withdrawal(address indexed _account, uint256 _amount, uint256 _timestamp);

    constructor() public {}

    function setRegistry(address _registry) ownerOnly {
        registry = IContractRegistry(_registry);
    }

    modifier coinUsOnly(uint256 _amount, bytes _udid, uint256 _expiration, bytes _signature) {
        bytes32 hash = keccak256(abi.encodePacked(_amount, _udid, _expiration));
        address _signer = hash.toEthSignedMessageHash().recover(_signature);
        require(_signer == coinUsAccount);
        _;
    }


    function setCoinUsAccount(address _account) public ownerOnly {
        coinUsAccount = _account;
    }

    /**
       @dev can stake Cnus
       @param _amount amount of Cnus to stake
       @param _udid  unique Device Id to prevent abusing
       @param _signature signed udid with the private key of CoinUs wallet
    */
    function stake(uint256 _amount, bytes _udid, uint256 _expiration, bytes _signature)
    public
    coinUsOnly(_amount, _udid, _expiration, _signature)
    {
        IERC20Token(registry.addressOf(CNUS_TOKEN)).transferFrom(msg.sender, this, _amount);
        staking[msg.sender] = staking[msg.sender].add(_amount);
        emit Deposit(msg.sender, _amount, now);
    }

    /**
       @dev withdrawing for approved requests
       @param _amount amount of Cnus to withdraw
       @param _udid  unique Device Id to prevent abusing
       @param _signature signed udid with the private key of CoinUs wallet
    */
    function withdraw(uint256 _amount, bytes _udid, uint256 _expiration, bytes _signature)
    public
    coinUsOnly(_amount, _udid, _expiration, _signature)
    {
        require(staking[msg.sender] >= _amount);
        IERC20Token(registry.addressOf(CNUS_TOKEN)).transfer(msg.sender, _amount);
        staking[msg.sender] = staking[msg.sender].sub(_amount);
        emit Withdrawal(msg.sender, _amount, now);
    }

    /**
        @dev returns total amount of staked Cnus
    */
    function getStakedAmount() public view returns (uint256) {
        return stakeOf(msg.sender);
    }

    function stakeOf(address _account) public view returns (uint256) {
        return staking[_account];
    }
}

Contract ABI

[{"constant":true,"inputs":[{"name":"_account","type":"address"}],"name":"stakeOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_token","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"withdrawTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"CNUS_POOL_FOR_STAKING","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"CNUS_TOKEN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"setCoinUsAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_udid","type":"bytes"},{"name":"_expiration","type":"uint256"},{"name":"_signature","type":"bytes"}],"name":"withdraw","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getStakedAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_registry","type":"address"}],"name":"setRegistry","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"TOKEN_POOL","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"BNUS_TOKEN","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_udid","type":"bytes"},{"name":"_expiration","type":"uint256"},{"name":"_signature","type":"bytes"}],"name":"stake","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"newOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"coinUsAccount","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"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_account","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_account","type":"address"},{"indexed":false,"name":"_amount","type":"uint256"},{"indexed":false,"name":"_timestamp","type":"uint256"}],"name":"Withdrawal","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_prevOwner","type":"address"},{"indexed":true,"name":"_newOwner","type":"address"}],"name":"OwnerUpdate","type":"event"}]

Contract Creation Code

608060405234801561001057600080fd5b5060008054600160a060020a03191633179055610ecf806100326000396000f3006080604052600436106100e55763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416634262336081146100ea5780635e35359e1461011d5780636594eac3146101495780636ebd49401461015e57806379ba50971461017357806382f91c75146101885780638a9e70e1146101a95780638da5cb5b1461024b578063a4e15db91461027c578063a91ee0dc14610291578063b25ba451146102b2578063ba33cde5146102c7578063bc7f567a146102dc578063d4ee1d901461037e578063e9b2acba14610393578063f2fde38b146103a8575b600080fd5b3480156100f657600080fd5b5061010b600160a060020a03600435166103c9565b60408051918252519081900360200190f35b34801561012957600080fd5b50610147600160a060020a03600435811690602435166044356103e4565b005b34801561015557600080fd5b5061010b6104f6565b34801561016a57600080fd5b5061010b61051a565b34801561017f57600080fd5b5061014761053e565b34801561019457600080fd5b50610147600160a060020a03600435166105c6565b3480156101b557600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261014795833595369560449491939091019190819084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b8a359b909a90999401975091955091820193509150819084018382808284375094975061060c9650505050505050565b34801561025757600080fd5b506102606108fb565b60408051600160a060020a039092168252519081900360200190f35b34801561028857600080fd5b5061010b61090a565b34801561029d57600080fd5b50610147600160a060020a036004351661091a565b3480156102be57600080fd5b5061010b610960565b3480156102d357600080fd5b5061010b610984565b3480156102e857600080fd5b5060408051602060046024803582810135601f810185900485028601850190965285855261014795833595369560449491939091019190819084018382808284375050604080516020601f818a01358b0180359182018390048302840183018552818452989b8a359b909a9099940197509195509182019350915081908401838280828437509497506109a89650505050505050565b34801561038a57600080fd5b50610260610c75565b34801561039f57600080fd5b50610260610c84565b3480156103b457600080fd5b50610147600160a060020a0360043516610c93565b600160a060020a031660009081526004602052604090205490565b600054600160a060020a031633146103fb57600080fd5b82600160a060020a038116151561041157600080fd5b82600160a060020a038116151561042757600080fd5b83600160a060020a03811630141561043e57600080fd5b85600160a060020a031663a9059cbb86866040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156104ba57600080fd5b505af11580156104ce573d6000803e3d6000fd5b505050506040513d60208110156104e457600080fd5b505115156104ee57fe5b505050505050565b7f436e7573506f6f6c466f725374616b696e67000000000000000000000000000081565b7f436e7573546f6b656e000000000000000000000000000000000000000000000081565b600154600160a060020a0316331461055557600080fd5b60015460008054604051600160a060020a0393841693909116917f343765429aea5a34b3ff6a3785a98a5abb2597aca87bfbb58632c173d585373a91a3600180546000805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b600054600160a060020a031633146105dd57600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b838383836000808585856040516020018084815260200183805190602001908083835b6020831061064e5780518252601f19909201916020918201910161062f565b51815160209384036101000a60001901801990921691161790529201938452506040805180850381529382019081905283519395509350839290850191508083835b602083106106af5780518252601f199092019160209182019101610690565b6001836020036101000a038019825116818451168082178552505050505050905001915050604051809103902091506106fb836106ef8460001916610cf4565b9063ffffffff610d9e16565b600354909150600160a060020a0380831691161461071857600080fd5b336000908152600460205260409020548a111561073457600080fd5b600254604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436e7573546f6b656e000000000000000000000000000000000000000000000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b1580156107ba57600080fd5b505af11580156107ce573d6000803e3d6000fd5b505050506040513d60208110156107e457600080fd5b5051604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018d90529051600160a060020a039092169163a9059cbb916044808201926020929091908290030181600087803b15801561085057600080fd5b505af1158015610864573d6000803e3d6000fd5b505050506040513d602081101561087a57600080fd5b50503360009081526004602052604090205461089c908b63ffffffff610e7316565b336000818152600460209081526040918290209390935580518d81524293810193909352805191927fdf273cb619d95419a9cd0ec88123a0538c85064229baa6363788f743fff90deb929081900390910190a250505050505050505050565b600054600160a060020a031681565b6000610915336103c9565b905090565b600054600160a060020a0316331461093157600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b7f546f6b656e506f6f6c000000000000000000000000000000000000000000000081565b7f426e7573546f6b656e000000000000000000000000000000000000000000000081565b838383836000808585856040516020018084815260200183805190602001908083835b602083106109ea5780518252601f1990920191602091820191016109cb565b51815160209384036101000a60001901801990921691161790529201938452506040805180850381529382019081905283519395509350839290850191508083835b60208310610a4b5780518252601f199092019160209182019101610a2c565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405180910390209150610a8b836106ef8460001916610cf4565b600354909150600160a060020a03808316911614610aa857600080fd5b600254604080517fbb34534c0000000000000000000000000000000000000000000000000000000081527f436e7573546f6b656e000000000000000000000000000000000000000000000060048201529051600160a060020a039092169163bb34534c916024808201926020929091908290030181600087803b158015610b2e57600080fd5b505af1158015610b42573d6000803e3d6000fd5b505050506040513d6020811015610b5857600080fd5b5051604080517f23b872dd000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018d90529051600160a060020a03909216916323b872dd916064808201926020929091908290030181600087803b158015610bca57600080fd5b505af1158015610bde573d6000803e3d6000fd5b505050506040513d6020811015610bf457600080fd5b505033600090815260046020526040902054610c16908b63ffffffff610e8a16565b336000818152600460209081526040918290209390935580518d81524293810193909352805191927f90890809c654f11d6e72a28fa60149770a0d11ec6c92319d6ceb2bb0a4ea1a15929081900390910190a250505050505050505050565b600154600160a060020a031681565b600354600160a060020a031681565b600054600160a060020a03163314610caa57600080fd5b600054600160a060020a0382811691161415610cc557600080fd5b6001805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b604080517f19457468657265756d205369676e6564204d6573736167653a0a333200000000602080830191909152603c80830185905283518084039091018152605c909201928390528151600093918291908401908083835b60208310610d6c5780518252601f199092019160209182019101610d4d565b5181516020939093036101000a6000190180199091169216919091179052604051920182900390912095945050505050565b60008060008084516041141515610db85760009350610e6a565b50505060208201516040830151606084015160001a601b60ff82161015610ddd57601b015b8060ff16601b14158015610df557508060ff16601c14155b15610e035760009350610e6a565b60408051600080825260208083018085528a905260ff8516838501526060830187905260808301869052925160019360a0808501949193601f19840193928390039091019190865af1158015610e5d573d6000803e3d6000fd5b5050506020604051035193505b50505092915050565b60008083831115610e8357600080fd5b5050900390565b600082820183811015610e9c57600080fd5b93925050505600a165627a7a723058203e6e44ee9de4db3dcf89a0e77f38e1d24bc873644d04d345dfa2234a4db045610029

Swarm Source

bzzr://3e6e44ee9de4db3dcf89a0e77f38e1d24bc873644d04d345dfa2234a4db04561
Block Age Transaction Difficulty GasUsed Reward
Block Age Uncle Number Difficulty GasUsed Reward