Contract Overview
Balance: 0 Ether
Ether Value: $0
Transactions: 23342 txns
Token Tracker: Caelum Token (CLM)
Misc:
Address Watch: Add To Watch List
Contract Creator: 0xdb93ce3cca2444ce5da5522a85758af79af0092dat txn 0x125d2d3cb7a00e3e9d055b86261c5f815ed1fe6a478697ef59ef65ddc437982a
Token Balance:
 Latest 25 transactions from a total of 23342 transactions

TxHash Age From To Value [TxFee]
0x1e50176d497c1b84f80af9cfdb4ca9b3c0a38b73178b381c50085e0dff53b7fb3 days 10 hrs ago0x362e79c9b9a647e1587eb81a014fb8e5e5370d6a  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00075846
0x3260a18afc02ae90101013b6e34e760b9ea253c8b2e5404bd12d3b6b8e419a5a7 days 20 hrs ago0x779b585deae5c8944558a25c01605bb4d3131d58  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00075846
0x20b34ea3f634b695346675836b0000c088684826c82b0ff637c7cca1ccae191b11 days 10 hrs ago0x9df626f6d806cbfa25a02153167e5ae453d3ba7a  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001248081
0xb64ce88ea481ba0826c516e3a0230175a0309f6ff6a4f0f96a58323ed7ae136518 days 1 hr ago0x9df626f6d806cbfa25a02153167e5ae453d3ba7a  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001863081
0xbcc523ec1969a79432a68860771ede959c82521f0d621e8c4524879e0ae6b97223 days 2 hrs ago0x89b135620e341269e5625ab1a4ede46d1a98881e  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001250705
0x25f497cd9651a7b7d68b45cb33d1092f9ba9a0763f0ff1f409c20564c995b4e823 days 11 hrs ago0xd79efc8f7a26640718c50ca228c89c7f7bef37d3  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001248081
0xb6b83de0c07045614344a634dc0f6c250fe8922549f605d577179970f68b194b23 days 12 hrs ago0xd79efc8f7a26640718c50ca228c89c7f7bef37d3  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001855209
0xa74a4caecd0fb1099539d886934addb7000fff300e56dacdabe95b6f4646105924 days 1 hr ago0xa9f3304c9b8e79bab8448f2881d9877f9a022fa9  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00071546
0x496c4d1ce8d17c3b6bf64df6573609e447490a51b27811d8625b6fec5b3f000524 days 1 hr ago0xa9f3304c9b8e79bab8448f2881d9877f9a022fa9  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00071546
0xb2652daffd321dd6797dab41e1e0fdcf4707a6442d1e80751e30a7a6032e998124 days 1 hr ago0xa9f3304c9b8e79bab8448f2881d9877f9a022fa9  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00079046
0x9b3e6eb5b1efdb592cb621c72fb3afe374d746785ca80018ff720dc8b700933124 days 2 hrs ago0xa9f3304c9b8e79bab8448f2881d9877f9a022fa9  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00073341
0x2f696fd61bb90114f15856f20fe44a53a6584434613d99da3956bda580adba6124 days 2 hrs ago0xa9f3304c9b8e79bab8448f2881d9877f9a022fa9  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00079046
0x93748b64bc679a4cbdd6aed32c64fb527bb3da73ff1e534fe51c075d62cf89d024 days 2 hrs ago0xa9f3304c9b8e79bab8448f2881d9877f9a022fa9  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00071546
0xa37e79ff931f1e70fea55f6f5480eb510d852427a361a58856ca1d27ef98bc3b24 days 2 hrs ago0xa9f3304c9b8e79bab8448f2881d9877f9a022fa9  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00071578
0xff7f49da3ca16700c407f03747f2805a45e7b86d0d5e4636d71718f1846d22a024 days 3 hrs ago0xa9f3304c9b8e79bab8448f2881d9877f9a022fa9  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00073373
0x136712e6729009999a8037baebce8f7bf7f476912ecfe113522f3a1923921cf924 days 4 hrs ago0xa9f3304c9b8e79bab8448f2881d9877f9a022fa9  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001212092
0x26b929d69eb87d510e5a08986d9d2442fbc5696fc58d19aa1ef00fe8bc1aa95c25 days 11 hrs ago0x84eca34e4a1732113883407e3666b014dcca0a16  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.000227525
0x89061e6621fe5b1e0eab905f526eb45fbadd7d0c026f27955300bb05200f665527 days 2 hrs ago0xe4ac657af0690e9437f36d3e96886dc880b24404  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001001644
0x8f2ea1db930ecd48f85b8832b0ec3b470cc24d03a71a08bb9511bdff891ea32c27 days 3 hrs ago0xe4ac657af0690e9437f36d3e96886dc880b24404  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001001644
0x422477727d57a560e618faf05a046a871d354b370deac32c418bc56d6116d7b027 days 3 hrs ago0xe4ac657af0690e9437f36d3e96886dc880b24404  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001106196
0xd70fb0bc346018311087753006f499710154a147154cbfd4531f2a15c410536928 days 22 hrs ago0x89b135620e341269e5625ab1a4ede46d1a98881e  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.001865705
0xdcf007387186a26d78fbefa79272e7c378413bd18634ad6797f961f72d16678d29 days ago0xadecfb7c2a743c531ba760bea560798111fd6ce8  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.00075846
0x651e5d4859d66a359ce06e927c047bf4bc5dae519c7284426cebcfe709ec330a29 days 19 hrs ago0x16e4b0c5e8f68c260c85f7fa26b3ca3ba3766b94  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.000318535
0x9a327f4dac171fe20ae14f7bc6398a0ab7bf1c7c4e2977bf2b780dcb3ba0b9ff29 days 21 hrs ago0x6f8b5c7ad85c4f7f51b6f34e29e25cd4382fb48c  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.000183384
0x79abecc91701b31fbe5e2380bd35b677728852ee7fdf42e9f8f0084bba10634529 days 21 hrs ago0x8fea1cf4845417f0525f5effca0f312a8c419a4e  IN   0x7600bf5112945f9f006c216d5d6db0df2806edc60 Ether0.000137538
[ Download CSV Export  ] 
 Internal Transactions as a result of Contract Execution
View All
ParentTxHash Block Age From To Value
Contract Source Code Verified (Exact Match)
Contract Name: CaelumMiner
Compiler Text: v0.4.25+commit.59dbf8f1
Optimization Enabled: Yes
Runs (Optimiser):  200



  Contract Source Code   Find Similiar Contracts

//solium-disable linebreak-style
pragma solidity ^0.4.24;

library ExtendedMath {
    function limitLessThan(uint a, uint b) internal pure returns(uint c) {
        if (a > b) return b;
        return a;
    }
}

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

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

contract ERC20Basic {
    function totalSupply() public view returns(uint256);

    function balanceOf(address _who) public view returns(uint256);

    function transfer(address _to, uint256 _value) public returns(bool);
    event Transfer(address indexed from, address indexed to, uint256 value);
}

contract ERC20 is ERC20Basic {
    function allowance(address _owner, address _spender) public view returns(uint256);

    function transferFrom(address _from, address _to, uint256 _value) public returns(bool);

    function approve(address _spender, uint256 _value) public returns(bool);

    event Approval(
        address indexed owner,
        address indexed spender,
        uint256 value
    );
}

contract BasicToken is ERC20Basic {
    using SafeMath
    for uint256;

    mapping(address => uint256) internal balances;

    uint256 internal totalSupply_;

    /**
     * @dev Total number of tokens in existence
     */
    function totalSupply() public view returns(uint256) {
        return totalSupply_;
    }

    /**
     * @dev Transfer token for a specified address
     * @param _to The address to transfer to.
     * @param _value The amount to be transferred.
     */
    function transfer(address _to, uint256 _value) public returns(bool) {
        require(_value <= balances[msg.sender]);
        require(_to != address(0));

        balances[msg.sender] = balances[msg.sender].sub(_value);
        balances[_to] = balances[_to].add(_value);
        emit Transfer(msg.sender, _to, _value);
        return true;
    }

    /**
     * @dev Gets the balance of the specified address.
     * @param _owner The address to query the the balance of.
     * @return An uint256 representing the amount owned by the passed address.
     */
    function balanceOf(address _owner) public view returns(uint256) {
        return balances[_owner];
    }

}

contract StandardToken is ERC20, BasicToken {

    mapping(address => mapping(address => uint256)) internal allowed;


    /**
     * @dev Transfer tokens from one address to another
     * @param _from address The address which you want to send tokens from
     * @param _to address The address which you want to transfer to
     * @param _value uint256 the amount of tokens to be transferred
     */
    function transferFrom(
        address _from,
        address _to,
        uint256 _value
    )
    public
    returns(bool) {
        require(_value <= balances[_from]);
        require(_value <= allowed[_from][msg.sender]);
        require(_to != address(0));

        balances[_from] = balances[_from].sub(_value);
        balances[_to] = balances[_to].add(_value);
        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        emit Transfer(_from, _to, _value);
        return true;
    }

    /**
     * @dev Approve the passed address to spend the specified amount of tokens on behalf of msg.sender.
     * Beware that changing an allowance with this method brings the risk that someone may use both the old
     * and the new allowance by unfortunate transaction ordering. One possible solution to mitigate this
     * race condition is to first reduce the spender's allowance to 0 and set the desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     * @param _spender The address which will spend the funds.
     * @param _value The amount of tokens to be spent.
     */
    function approve(address _spender, uint256 _value) public returns(bool) {
        allowed[msg.sender][_spender] = _value;
        emit Approval(msg.sender, _spender, _value);
        return true;
    }

    /**
     * @dev Function to check the amount of tokens that an owner allowed to a spender.
     * @param _owner address The address which owns the funds.
     * @param _spender address The address which will spend the funds.
     * @return A uint256 specifying the amount of tokens still available for the spender.
     */
    function allowance(
        address _owner,
        address _spender
    )
    public
    view
    returns(uint256) {
        return allowed[_owner][_spender];
    }

    /**
     * @dev Increase the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed[_spender] == 0. To increment
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * @param _spender The address which will spend the funds.
     * @param _addedValue The amount of tokens to increase the allowance by.
     */
    function increaseApproval(
        address _spender,
        uint256 _addedValue
    )
    public
    returns(bool) {
        allowed[msg.sender][_spender] = (
            allowed[msg.sender][_spender].add(_addedValue));
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

    /**
     * @dev Decrease the amount of tokens that an owner allowed to a spender.
     * approve should be called when allowed[_spender] == 0. To decrement
     * allowed value is better to use this function to avoid 2 calls (and wait until
     * the first transaction is mined)
     * From MonolithDAO Token.sol
     * @param _spender The address which will spend the funds.
     * @param _subtractedValue The amount of tokens to decrease the allowance by.
     */
    function decreaseApproval(
        address _spender,
        uint256 _subtractedValue
    )
    public
    returns(bool) {
        uint256 oldValue = allowed[msg.sender][_spender];
        if (_subtractedValue >= oldValue) {
            allowed[msg.sender][_spender] = 0;
        } else {
            allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
        }
        emit Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
        return true;
    }

}

interface IcaelumVoting {
    function getTokenProposalDetails() external view returns(address, uint, uint, uint);
    function getExpiry() external view returns (uint);
    function getContractType () external view returns (uint);
}

contract abstractCaelum {
    function isMasternodeOwner(address _candidate) public view returns(bool);
    function addToWhitelist(address _ad, uint _amount, uint daysAllowed) internal;
    function addMasternode(address _candidate) internal returns(uint);
    function deleteMasternode(uint entityAddress) internal returns(bool success);
    function getLastPerUser(address _candidate) public view returns (uint);
    function getMiningReward() public view returns(uint);
}

contract NewTokenProposal is IcaelumVoting {

    enum VOTE_TYPE {TOKEN, TEAM}

    VOTE_TYPE public contractType = VOTE_TYPE.TOKEN;
    address contractAddress;
    uint requiredAmount;
    uint validUntil;
    uint votingDurationInDays;

    /**
     * @dev Create a new vote proposal for an ERC20 token.
     * @param _contract ERC20 contract
     * @param _amount How many tokens are required as collateral
     * @param _valid How long do we accept these tokens on the contract (UNIX timestamp)
     * @param _voteDuration How many days is this vote available
     */
    constructor(address _contract, uint _amount, uint _valid, uint _voteDuration) public {
        require(_voteDuration >= 14 && _voteDuration <= 50, "Proposed voting duration does not meet requirements");

        contractAddress = _contract;
        requiredAmount = _amount;
        validUntil = _valid;
        votingDurationInDays = _voteDuration;
    }

    /**
     * @dev Returns all details about this proposal
     */
    function getTokenProposalDetails() public view returns(address, uint, uint, uint) {
        return (contractAddress, requiredAmount, validUntil, uint(contractType));
    }

    /**
     * @dev Displays the expiry date of contract
     * @return uint Days valid
     */
    function getExpiry() external view returns (uint) {
        return votingDurationInDays;
    }

    /**
     * @dev Displays the type of contract
     * @return uint Enum value {TOKEN, TEAM}
     */
    function getContractType () external view returns (uint){
        return uint(contractType);
    }
}

contract NewMemberProposal is IcaelumVoting {

    enum VOTE_TYPE {TOKEN, TEAM}
    VOTE_TYPE public contractType = VOTE_TYPE.TEAM;

    address memberAddress;
    uint totalMasternodes;
    uint votingDurationInDays;

    /**
     * @dev Create a new vote proposal for a team member.
     * @param _contract Future team member's address
     * @param _total How many masternodes do we want to give
     * @param _voteDuration How many days is this vote available
     */
    constructor(address _contract, uint _total, uint _voteDuration) public {
        require(_voteDuration >= 14 && _voteDuration <= 50, "Proposed voting duration does not meet requirements");
        memberAddress = _contract;
        totalMasternodes = _total;
        votingDurationInDays = _voteDuration;
    }

    /**
     * @dev Returns all details about this proposal
     */
    function getTokenProposalDetails() public view returns(address, uint, uint, uint) {
        return (memberAddress, totalMasternodes, 0, uint(contractType));
    }

    /**
     * @dev Displays the expiry date of contract
     * @return uint Days valid
     */
    function getExpiry() external view returns (uint) {
        return votingDurationInDays;
    }

    /**
     * @dev Displays the type of contract
     * @return uint Enum value {TOKEN, TEAM}
     */
    function getContractType () external view returns (uint){
        return uint(contractType);
    }
}

contract CaelumVotings is Ownable {
    using SafeMath for uint;

    enum VOTE_TYPE {TOKEN, TEAM}

    struct Proposals {
        address tokenContract;
        uint totalVotes;
        uint proposedOn;
        uint acceptedOn;
        VOTE_TYPE proposalType;
    }

    struct Voters {
        bool isVoter;
        address owner;
        uint[] votedFor;
    }

    uint MAJORITY_PERCENTAGE_NEEDED = 60;
    uint MINIMUM_VOTERS_NEEDED = 10;
    bool public proposalPending;

    mapping(uint => Proposals) public proposalList;
    mapping (address => Voters) public voterMap;
    mapping(uint => address) public voterProposals;
    uint public proposalCounter;
    uint public votersCount;
    uint public votersCountTeam;

    /**
     * @notice Define abstract functions for later user
     */
    function isMasternodeOwner(address _candidate) public view returns(bool);
    function addToWhitelist(address _ad, uint _amount, uint daysAllowed) internal;
    function addMasternode(address _candidate) internal returns(uint);
    function updateMasternodeAsTeamMember(address _member) internal returns (bool);
    function isTeamMember (address _candidate) public view returns (bool);
    
    event NewProposal(uint ProposalID);
    event ProposalAccepted(uint ProposalID);

    /**
     * @dev Create a new proposal.
     * @param _contract Proposal contract address
     * @return uint ProposalID
     */
    function pushProposal(address _contract) onlyOwner public returns (uint) {
        if(proposalCounter != 0)
        require (pastProposalTimeRules (), "You need to wait 90 days before submitting a new proposal.");
        require (!proposalPending, "Another proposal is pending.");

        uint _contractType = IcaelumVoting(_contract).getContractType();
        proposalList[proposalCounter] = Proposals(_contract, 0, now, 0, VOTE_TYPE(_contractType));

        emit NewProposal(proposalCounter);
        
        proposalCounter++;
        proposalPending = true;

        return proposalCounter.sub(1);
    }

    /**
     * @dev Internal function that handles the proposal after it got accepted.
     * This function determines if the proposal is a token or team member proposal and executes the corresponding functions.
     * @return uint Returns the proposal ID.
     */
    function handleLastProposal () internal returns (uint) {
        uint _ID = proposalCounter.sub(1);

        proposalList[_ID].acceptedOn = now;
        proposalPending = false;

        address _address;
        uint _required;
        uint _valid;
        uint _type;
        (_address, _required, _valid, _type) = getTokenProposalDetails(_ID);

        if(_type == uint(VOTE_TYPE.TOKEN)) {
            addToWhitelist(_address,_required,_valid);
        }

        if(_type == uint(VOTE_TYPE.TEAM)) {
            if(_required != 0) {
                for (uint i = 0; i < _required; i++) {
                    addMasternode(_address);
                }
            } else {
                addMasternode(_address);
            }
            updateMasternodeAsTeamMember(_address);
        }
        
        emit ProposalAccepted(_ID);
        
        return _ID;
    }

    /**
     * @dev Rejects the last proposal after the allowed voting time has expired and it's not accepted.
     */
    function discardRejectedProposal() onlyOwner public returns (bool) {
        require(proposalPending);
        require (LastProposalCanDiscard());
        proposalPending = false;
        return (true);
    }

    /**
     * @dev Checks if the last proposal allowed voting time has expired and it's not accepted.
     * @return bool
     */
    function LastProposalCanDiscard () public view returns (bool) {
        
        uint daysBeforeDiscard = IcaelumVoting(proposalList[proposalCounter - 1].tokenContract).getExpiry();
        uint entryDate = proposalList[proposalCounter - 1].proposedOn;
        uint expiryDate = entryDate + (daysBeforeDiscard * 1 days);

        if (now >= expiryDate)
        return true;
    }

    /**
     * @dev Returns all details about a proposal
     */
    function getTokenProposalDetails(uint proposalID) public view returns(address, uint, uint, uint) {
        return IcaelumVoting(proposalList[proposalID].tokenContract).getTokenProposalDetails();
    }

    /**
     * @dev Returns if our 90 day cooldown has passed
     * @return bool
     */
    function pastProposalTimeRules() public view returns (bool) {
        uint lastProposal = proposalList[proposalCounter - 1].proposedOn;
        if (now >= lastProposal + 90 days)
        return true;
    }


    /**
     * @dev Allow any masternode user to become a voter.
     */
    function becomeVoter() public  {
        require (isMasternodeOwner(msg.sender), "User has no masternodes");
        require (!voterMap[msg.sender].isVoter, "User Already voted for this proposal");

        voterMap[msg.sender].owner = msg.sender;
        voterMap[msg.sender].isVoter = true;
        votersCount = votersCount + 1;

        if (isTeamMember(msg.sender))
        votersCountTeam = votersCountTeam + 1;
    }

    /**
     * @dev Allow voters to submit their vote on a proposal. Voters can only cast 1 vote per proposal.
     * If the proposed vote is about adding Team members, only Team members are able to vote.
     * A proposal can only be published if the total of votes is greater then MINIMUM_VOTERS_NEEDED.
     * @param proposalID proposalID
     */
    function voteProposal(uint proposalID) public returns (bool success) {
        require(voterMap[msg.sender].isVoter, "Sender not listed as voter");
        require(proposalID >= 0, "No proposal was selected.");
        require(proposalID <= proposalCounter, "Proposal out of limits.");
        require(voterProposals[proposalID] != msg.sender, "Already voted.");


        if(proposalList[proposalID].proposalType == VOTE_TYPE.TEAM) {
            require (isTeamMember(msg.sender), "Restricted for team members");
            voterProposals[proposalID] = msg.sender;
            proposalList[proposalID].totalVotes++;

            if(reachedMajorityForTeam(proposalID)) {
                // This is the prefered way of handling vote results. It costs more gas but prevents tampering.
                // If gas is an issue, you can comment handleLastProposal out and call it manually as onlyOwner.
                handleLastProposal();
                return true;
            }
        } else {
            require(votersCount >= MINIMUM_VOTERS_NEEDED, "Not enough voters in existence to push a proposal");
            voterProposals[proposalID] = msg.sender;
            proposalList[proposalID].totalVotes++;

            if(reachedMajority(proposalID)) {
                // This is the prefered way of handling vote results. It costs more gas but prevents tampering.
                // If gas is an issue, you can comment handleLastProposal out and call it manually as onlyOwner.
                handleLastProposal();
                return true;
            }
        }


    }

    /**
     * @dev Check if a proposal has reached the majority vote
     * @param proposalID Token ID
     * @return bool
     */
    function reachedMajority (uint proposalID) public view returns (bool) {
        uint getProposalVotes = proposalList[proposalID].totalVotes;
        if (getProposalVotes >= majority())
        return true;
    }

    /**
     * @dev Internal function that calculates the majority
     * @return uint Total of votes needed for majority
     */
    function majority () internal view returns (uint) {
        uint a = (votersCount * MAJORITY_PERCENTAGE_NEEDED );
        return a / 100;
    }

    /**
     * @dev Check if a proposal has reached the majority vote for a team member
     * @param proposalID Token ID
     * @return bool
     */
    function reachedMajorityForTeam (uint proposalID) public view returns (bool) {
        uint getProposalVotes = proposalList[proposalID].totalVotes;
        if (getProposalVotes >= majorityForTeam())
        return true;
    }

    /**
     * @dev Internal function that calculates the majority
     * @return uint Total of votes needed for majority
     */
    function majorityForTeam () internal view returns (uint) {
        uint a = (votersCountTeam * MAJORITY_PERCENTAGE_NEEDED );
        return a / 100;
    }

}

contract CaelumFundraise is Ownable, BasicToken, abstractCaelum {

    /**
     * In no way is Caelum intended to raise funds. We leave this code to demonstrate the potential and functionality.
     * Should you decide to buy a masternode instead of mining, you can by using this function. Feel free to consider this a tipping jar for our dev team.
     * We strongly advice to use the `buyMasternode`function, but simply sending Ether to the contract should work as well.
     */

    uint AMOUNT_FOR_MASTERNODE = 50 ether;
    uint SPOTS_RESERVED = 10;
    uint COUNTER;
    bool fundraiseClosed = false;

    /**
     * @dev Not recommended way to accept Ether. Can be safely used if no storage operations are called
     * The contract may revert all the gas because of the gas limitions on the fallback operator.
     * We leave it in as template for other projects, however, for Caelum the function deposit should be adviced.
     */
    function() payable public {
        require(msg.value == AMOUNT_FOR_MASTERNODE && msg.value != 0);
        receivedFunds();
    }

    /** @dev This is the recommended way for users to deposit Ether in return of a masternode.
     * Users should be encouraged to use this approach as there is not gas risk involved.
     */
    function buyMasternode () payable public {
        require(msg.value == AMOUNT_FOR_MASTERNODE && msg.value != 0);
        receivedFunds();
    }

    /**
     * @dev Forward funds to owner before making any action. owner.transfer will revert if fail.
     */
    function receivedFunds() internal {
        require(!fundraiseClosed);
        require (COUNTER <= SPOTS_RESERVED);
        owner.transfer(msg.value);
        addMasternode(msg.sender);
    }

}

contract CaelumAcceptERC20 is Ownable, CaelumVotings, abstractCaelum { 
    using SafeMath for uint;

    address[] public tokensList;
    bool setOwnContract = true;

    struct _whitelistTokens {
        address tokenAddress;
        bool active;
        uint requiredAmount;
        uint validUntil;
        uint timestamp;
    }

    mapping(address => mapping(address => uint)) public tokens;
    mapping(address => _whitelistTokens) acceptedTokens;

    event Deposit(address token, address user, uint amount, uint balance);
    event Withdraw(address token, address user, uint amount, uint balance);

    /**
     * @dev Return the base rewards. This should be overrided by the miner contract.
     * Return a base value for standalone usage ONLY.
     */
    function getMiningReward() public view returns(uint) {
        return 50 * 1e8;
    }


    /**
     * @notice Allow the dev to set it's own token as accepted payment.
     * @dev Can be hardcoded in the constructor. Given the contract size, we decided to separate it.
     * @return bool
     */
    function addOwnToken() onlyOwner public returns (bool) {
        require(setOwnContract);
        addToWhitelist(this, 5000 * 1e8, 36500);
        setOwnContract = false;
        return true;
    }

    // TODO: Set visibility
    /**
     * @notice Add a new token as accepted payment method.
     * @param _token Token contract address.
     * @param _amount Required amount of this Token as collateral
     * @param daysAllowed How many days will we accept this token?
     */
    function addToWhitelist(address _token, uint _amount, uint daysAllowed) internal {
        _whitelistTokens storage newToken = acceptedTokens[_token];
        newToken.tokenAddress = _token;
        newToken.requiredAmount = _amount;
        newToken.timestamp = now;
        newToken.validUntil = now + (daysAllowed * 1 days);
        newToken.active = true;

        tokensList.push(_token);
    }

    /**
     * @dev internal function to determine if we accept this token.
     * @param _ad Token contract address
     * @return bool
     */
    function isAcceptedToken(address _ad) internal view returns(bool) {
        return acceptedTokens[_ad].active;
    }

    /**
     * @dev internal function to determine the requiredAmount for a specific token.
     * @param _ad Token contract address
     * @return bool
     */
    function getAcceptedTokenAmount(address _ad) internal view returns(uint) {
        return acceptedTokens[_ad].requiredAmount;
    }

    /**
     * @dev internal function to determine if the token is still accepted timewise.
     * @param _ad Token contract address
     * @return bool
     */
    function isValid(address _ad) internal view returns(bool) {
        uint endTime = acceptedTokens[_ad].validUntil;
        if (block.timestamp < endTime) return true;
        return false;
    }

    /**
     * @notice Returns an array of all accepted token. You can get more details by calling getTokenDetails function with this address.
     * @return array Address
     */
    function listAcceptedTokens() public view returns(address[]) {
        return tokensList;
    }

    /**
     * @notice Returns a full list of the token details
     * @param token Token contract address
     */
    function getTokenDetails(address token) public view returns(address ad,uint required, bool active, uint valid) {
        return (acceptedTokens[token].tokenAddress, acceptedTokens[token].requiredAmount,acceptedTokens[token].active, acceptedTokens[token].validUntil);
    }

    /**
     * @notice Public function that allows any user to deposit accepted tokens as collateral to become a masternode.
     * @param token Token contract address
     * @param amount Amount to deposit
     */
    function depositCollateral(address token, uint amount) public {
        require(isAcceptedToken(token), "ERC20 not authorised");  // Should be a token from our list
        require(amount == getAcceptedTokenAmount(token));         // The amount needs to match our set amount
        require(isValid(token));                                  // It should be called within the setup timeframe

        tokens[token][msg.sender] = tokens[token][msg.sender].add(amount);

        require(StandardToken(token).transferFrom(msg.sender, this, amount), "error with token");
        emit Deposit(token, msg.sender, amount, tokens[token][msg.sender]);

        addMasternode(msg.sender);
    }

    /**
     * @notice Public function that allows any user to withdraw deposited tokens and stop as masternode
     * @param token Token contract address
     * @param amount Amount to withdraw
     */
    function withdrawCollateral(address token, uint amount) public {
        require(token != 0); // token should be an actual address
        require(isAcceptedToken(token), "ERC20 not authorised"); // Should be a token from our list
        require(isMasternodeOwner(msg.sender)); // The sender must be a masternode prior to withdraw
        require(tokens[token][msg.sender] == amount); // The amount must be exactly whatever is deposited

        uint amountToWithdraw = tokens[token][msg.sender];
        tokens[token][msg.sender] = 0;

        deleteMasternode(getLastPerUser(msg.sender));

        if (!StandardToken(token).transfer(msg.sender, amountToWithdraw)) revert();
        emit Withdraw(token, msg.sender, amountToWithdraw, amountToWithdraw);
    }

}

contract CaelumMasternode is CaelumFundraise, CaelumAcceptERC20{
    using SafeMath for uint;

    bool onTestnet = false;
    bool genesisAdded = false;

    uint  masternodeRound;
    uint  masternodeCandidate;
    uint  masternodeCounter;
    uint  masternodeEpoch;
    uint  miningEpoch;

    uint rewardsProofOfWork;
    uint rewardsMasternode;
    uint rewardsGlobal = 50 * 1e8;

    uint MINING_PHASE_DURATION_BLOCKS = 4500;

    struct MasterNode {
        address accountOwner;
        bool isActive;
        bool isTeamMember;
        uint storedIndex;
        uint startingRound;
        uint[] indexcounter;
    }

    uint[] userArray;
    address[] userAddressArray;

    mapping(uint => MasterNode) userByIndex; // UINT masterMapping
    mapping(address => MasterNode) userByAddress; //masterMapping
    mapping(address => uint) userAddressIndex;

    event Deposit(address token, address user, uint amount, uint balance);
    event Withdraw(address token, address user, uint amount, uint balance);

    event NewMasternode(address candidateAddress, uint timeStamp);
    event RemovedMasternode(address candidateAddress, uint timeStamp);

    /**
     * @dev Add the genesis accounts
     */
    function addGenesis(address _genesis, bool _team) onlyOwner public {
        require(!genesisAdded);

        addMasternode(_genesis);

        if (_team) {
            updateMasternodeAsTeamMember(msg.sender);
        }

    }

    /**
     * @dev Close the genesis accounts
     */
    function closeGenesis() onlyOwner public {
        genesisAdded = true; // Forever lock this.
    }

    /**
     * @dev Add a user as masternode. Called as internal since we only add masternodes by depositing collateral or by voting.
     * @param _candidate Candidate address
     * @return uint Masternode index
     */
    function addMasternode(address _candidate) internal returns(uint) {
        userByIndex[masternodeCounter].accountOwner = _candidate;
        userByIndex[masternodeCounter].isActive = true;
        userByIndex[masternodeCounter].startingRound = masternodeRound + 1;
        userByIndex[masternodeCounter].storedIndex = masternodeCounter;

        userByAddress[_candidate].accountOwner = _candidate;
        userByAddress[_candidate].indexcounter.push(masternodeCounter);

        userArray.push(userArray.length);
        masternodeCounter++;

        emit NewMasternode(_candidate, now);
        return masternodeCounter - 1; //
    }

    /**
     * @dev Allow us to update a masternode's round to keep progress
     * @param _candidate ID of masternode
     */
    function updateMasternode(uint _candidate) internal returns(bool) {
        userByIndex[_candidate].startingRound++;
        return true;
    }

    /**
     * @dev Allow us to update a masternode to team member status
     * @param _member address
     */
    function updateMasternodeAsTeamMember(address _member) internal returns (bool) {
        userByAddress[_member].isTeamMember = true;
        return (true);
    }

    /**
     * @dev Let us know if an address is part of the team.
     * @param _member address
     */
    function isTeamMember (address _member) public view returns (bool) {
        if (userByAddress[_member].isTeamMember)
        return true;
    }

    /**
     * @dev Remove a specific masternode
     * @param _masternodeID ID of the masternode to remove
     */
    function deleteMasternode(uint _masternodeID) internal returns(bool success) {

        uint rowToDelete = userByIndex[_masternodeID].storedIndex;
        uint keyToMove = userArray[userArray.length - 1];

        userByIndex[_masternodeID].isActive = userByIndex[_masternodeID].isActive = (false);
        userArray[rowToDelete] = keyToMove;
        userByIndex[keyToMove].storedIndex = rowToDelete;
        userArray.length = userArray.length - 1;

        removeFromUserCounter(_masternodeID);

        emit RemovedMasternode(userByIndex[_masternodeID].accountOwner, now);

        return true;
    }

    /**
     * @dev returns what account belongs to a masternode
     */
    function isPartOf(uint mnid) public view returns (address) {
        return userByIndex[mnid].accountOwner;
    }

    /**
     * @dev Internal function to remove a masternode from a user address if this address holds multpile masternodes
     * @param index MasternodeID
     */
    function removeFromUserCounter(uint index)  internal returns(uint[]) {
        address belong = isPartOf(index);

        if (index >= userByAddress[belong].indexcounter.length) return;

        for (uint i = index; i<userByAddress[belong].indexcounter.length-1; i++){
            userByAddress[belong].indexcounter[i] = userByAddress[belong].indexcounter[i+1];
        }

        delete userByAddress[belong].indexcounter[userByAddress[belong].indexcounter.length-1];
        userByAddress[belong].indexcounter.length--;
        return userByAddress[belong].indexcounter;
    }

    /**
     * @dev Primary contract function to update the current user and prepare the next one.
     * A number of steps have been token to ensure the contract can never run out of gas when looping over our masternodes.
     */
    function setMasternodeCandidate() internal returns(address) {

        uint hardlimitCounter = 0;

        while (getFollowingCandidate() == 0x0) {
            // We must return a value not to break the contract. Require is a secondary killswitch now.
            require(hardlimitCounter < 6, "Failsafe switched on");
            // Choose if loop over revert/require to terminate the loop and return a 0 address.
            if (hardlimitCounter == 5) return (0);
            masternodeRound = masternodeRound + 1;
            masternodeCandidate = 0;
            hardlimitCounter++;
        }

        if (masternodeCandidate == masternodeCounter - 1) {
            masternodeRound = masternodeRound + 1;
            masternodeCandidate = 0;
        }

        for (uint i = masternodeCandidate; i < masternodeCounter; i++) {
            if (userByIndex[i].isActive) {
                if (userByIndex[i].startingRound == masternodeRound) {
                    updateMasternode(i);
                    masternodeCandidate = i;
                    return (userByIndex[i].accountOwner);
                }
            }
        }

        masternodeRound = masternodeRound + 1;
        return (0);

    }

    /**
     * @dev Helper function to loop through our masternodes at start and return the correct round
     */
    function getFollowingCandidate() internal view returns(address _address) {
        uint tmpRound = masternodeRound;
        uint tmpCandidate = masternodeCandidate;

        if (tmpCandidate == masternodeCounter - 1) {
            tmpRound = tmpRound + 1;
            tmpCandidate = 0;
        }

        for (uint i = masternodeCandidate; i < masternodeCounter; i++) {
            if (userByIndex[i].isActive) {
                if (userByIndex[i].startingRound == tmpRound) {
                    tmpCandidate = i;
                    return (userByIndex[i].accountOwner);
                }
            }
        }

        tmpRound = tmpRound + 1;
        return (0);
    }

    /**
     * @dev Displays all masternodes belonging to a user address.
     */
    function belongsToUser(address userAddress) public view returns(uint[]) {
        return (userByAddress[userAddress].indexcounter);
    }

    /**
     * @dev Helper function to know if an address owns masternodes
     */
    function isMasternodeOwner(address _candidate) public view returns(bool) {
        if(userByAddress[_candidate].indexcounter.length <= 0) return false;
        if (userByAddress[_candidate].accountOwner == _candidate)
        return true;
    }

    /**
     * @dev Helper function to get the last masternode belonging to a user
     */
    function getLastPerUser(address _candidate) public view returns (uint) {
        return userByAddress[_candidate].indexcounter[userByAddress[_candidate].indexcounter.length - 1];
    }


    /**
     * @dev Calculate and set the reward schema for Caelum.
     * Each mining phase is decided by multiplying the MINING_PHASE_DURATION_BLOCKS with factor 10.
     * Depending on the outcome (solidity always rounds), we can detect the current stage of mining.
     * First stage we cut the rewards to 5% to prevent instamining.
     * Last stage we leave 2% for miners to incentivize keeping miners running.
     */
    function calculateRewardStructures() internal {
        //ToDo: Set
        uint _global_reward_amount = getMiningReward();
        uint getStageOfMining = miningEpoch / MINING_PHASE_DURATION_BLOCKS * 10;

        if (getStageOfMining < 10) {
            rewardsProofOfWork = _global_reward_amount / 100 * 5;
            rewardsMasternode = 0;
            return;
        }

        if (getStageOfMining > 90) {
            rewardsProofOfWork = _global_reward_amount / 100 * 2;
            rewardsMasternode = _global_reward_amount / 100 * 98;
            return;
        }

        uint _mnreward = (_global_reward_amount / 100) * getStageOfMining;
        uint _powreward = (_global_reward_amount - _mnreward);

        setBaseRewards(_powreward, _mnreward);
    }

    function setBaseRewards(uint _pow, uint _mn) internal {
        rewardsMasternode = _mn;
        rewardsProofOfWork = _pow;
    }

    /**
     * @dev Executes the masternode flow. Should be called after mining a block.
     */
    function _arrangeMasternodeFlow() internal {
        calculateRewardStructures();
        setMasternodeCandidate();
        miningEpoch++;
    }

    /**
     * @dev Executes the masternode flow. Should be called after mining a block.
     * This is an emergency manual loop method.
     */
    function _emergencyLoop() onlyOwner public {
        calculateRewardStructures();
        setMasternodeCandidate();
        miningEpoch++;
    }

    function masternodeInfo(uint index) public view returns
    (
        address,
        bool,
        uint,
        uint
    )
    {
        return (
            userByIndex[index].accountOwner,
            userByIndex[index].isActive,
            userByIndex[index].storedIndex,
            userByIndex[index].startingRound
        );
    }

    function contractProgress() public view returns
    (
        uint epoch,
        uint candidate,
        uint round,
        uint miningepoch,
        uint globalreward,
        uint powreward,
        uint masternodereward,
        uint usercounter
    )
    {
        return (
            masternodeEpoch,
            masternodeCandidate,
            masternodeRound,
            miningEpoch,
            getMiningReward(),
            rewardsProofOfWork,
            rewardsMasternode,
            masternodeCounter
        );
    }

}

contract CaelumMiner is StandardToken, CaelumMasternode {
    using SafeMath for uint;
    using ExtendedMath for uint;

    string public symbol = "CLM";
    string public name = "Caelum Token";
    uint8 public decimals = 8;
    uint256 public totalSupply = 2100000000000000;

    uint public latestDifficultyPeriodStarted;
    uint public epochCount;
    uint public baseMiningReward = 50;
    uint public blocksPerReadjustment = 512;
    uint public _MINIMUM_TARGET = 2 ** 16;
    uint public _MAXIMUM_TARGET = 2 ** 234;
    uint public rewardEra = 0;

    uint public maxSupplyForEra;
    uint public MAX_REWARD_ERA = 39;
    uint public MINING_RATE_FACTOR = 60; //mint the token 60 times less often than ether
    //difficulty adjustment parameters- be careful modifying these
    uint public MAX_ADJUSTMENT_PERCENT = 100;
    uint public TARGET_DIVISOR = 2000;
    uint public QUOTIENT_LIMIT = TARGET_DIVISOR.div(2);
    mapping(bytes32 => bytes32) solutionForChallenge;
    mapping(address => mapping(address => uint)) allowed;

    bytes32 public challengeNumber;
    uint public difficulty;
    uint public tokensMinted;


    struct Statistics {
        address lastRewardTo;
        uint lastRewardAmount;
        uint lastRewardEthBlockNumber;
        uint lastRewardTimestamp;
    }

    Statistics public statistics;
    
    event Mint(address indexed from, uint reward_amount, uint epochCount, bytes32 newChallengeNumber);
    event RewardMasternode(address candidate, uint amount);

    constructor() public {
        tokensMinted = 0;
        maxSupplyForEra = totalSupply.div(2);
        difficulty = _MAXIMUM_TARGET;
        latestDifficultyPeriodStarted = block.number;
        _newEpoch(0);

        balances[msg.sender] = balances[msg.sender].add(420000 * 1e8); // 2% Premine as determined by the community meeting.
        emit Transfer(this, msg.sender, 420000 * 1e8);
    }

    function mint(uint256 nonce, bytes32 challenge_digest) public returns(bool success) {
        // perform the hash function validation
        _hash(nonce, challenge_digest);

        _arrangeMasternodeFlow();

        uint rewardAmount = _reward();
        uint rewardMasternode = _reward_masternode();

        tokensMinted += rewardAmount.add(rewardMasternode);

        uint epochCounter = _newEpoch(nonce);

        _adjustDifficulty();

        statistics = Statistics(msg.sender, rewardAmount, block.number, now);

        emit Mint(msg.sender, rewardAmount, epochCounter, challengeNumber);

        return true;
    }

    function _newEpoch(uint256 nonce) internal returns(uint) {

        if (tokensMinted.add(getMiningReward()) > maxSupplyForEra && rewardEra < MAX_REWARD_ERA) {
            rewardEra = rewardEra + 1;
        }
        maxSupplyForEra = totalSupply - totalSupply.div(2 ** (rewardEra + 1));
        epochCount = epochCount.add(1);
        challengeNumber = blockhash(block.number - 1);
        return (epochCount);
    }

    function _hash(uint256 nonce, bytes32 challenge_digest) internal returns(bytes32 digest) {
        digest = keccak256(challengeNumber, msg.sender, nonce);
        if (digest != challenge_digest) revert();
        if (uint256(digest) > difficulty) revert();
        bytes32 solution = solutionForChallenge[challengeNumber];
        solutionForChallenge[challengeNumber] = digest;
        if (solution != 0x0) revert(); //prevent the same answer from awarding twice
    }

    function _reward() internal returns(uint) {

        uint _pow = rewardsProofOfWork;

        balances[msg.sender] = balances[msg.sender].add(_pow);
        emit Transfer(this, msg.sender, _pow);

        return _pow;
    }

    function _reward_masternode() internal returns(uint) {

        uint _mnReward = rewardsMasternode;
        if (masternodeCounter == 0) return 0;

        address _mnCandidate = userByIndex[masternodeCandidate].accountOwner;
        if (_mnCandidate == 0x0) return 0;

        balances[_mnCandidate] = balances[_mnCandidate].add(_mnReward);
        emit Transfer(this, _mnCandidate, _mnReward);

        emit RewardMasternode(_mnCandidate, _mnReward);

        return _mnReward;
    }


    //DO NOT manually edit this method unless you know EXACTLY what you are doing
    function _adjustDifficulty() internal returns(uint) {
        //every so often, readjust difficulty. Dont readjust when deploying
        if (epochCount % blocksPerReadjustment != 0) {
            return difficulty;
        }

        uint ethBlocksSinceLastDifficultyPeriod = block.number - latestDifficultyPeriodStarted;
        //assume 360 ethereum blocks per hour
        //we want miners to spend 10 minutes to mine each 'block', about 60 ethereum blocks = one 0xbitcoin epoch
        uint epochsMined = blocksPerReadjustment;
        uint targetEthBlocksPerDiffPeriod = epochsMined * MINING_RATE_FACTOR;
        //if there were less eth blocks passed in time than expected
        if (ethBlocksSinceLastDifficultyPeriod < targetEthBlocksPerDiffPeriod) {
            uint excess_block_pct = (targetEthBlocksPerDiffPeriod.mul(MAX_ADJUSTMENT_PERCENT)).div(ethBlocksSinceLastDifficultyPeriod);
            uint excess_block_pct_extra = excess_block_pct.sub(100).limitLessThan(QUOTIENT_LIMIT);
            // If there were 5% more blocks mined than expected then this is 5.  If there were 100% more blocks mined than expected then this is 100.
            //make it harder
            difficulty = difficulty.sub(difficulty.div(TARGET_DIVISOR).mul(excess_block_pct_extra)); //by up to 50 %
        } else {
            uint shortage_block_pct = (ethBlocksSinceLastDifficultyPeriod.mul(MAX_ADJUSTMENT_PERCENT)).div(targetEthBlocksPerDiffPeriod);
            uint shortage_block_pct_extra = shortage_block_pct.sub(100).limitLessThan(QUOTIENT_LIMIT); //always between 0 and 1000
            //make it easier
            difficulty = difficulty.add(difficulty.div(TARGET_DIVISOR).mul(shortage_block_pct_extra)); //by up to 50 %
        }
        latestDifficultyPeriodStarted = block.number;
        if (difficulty < _MINIMUM_TARGET) //very difficult
        {
            difficulty = _MINIMUM_TARGET;
        }
        if (difficulty > _MAXIMUM_TARGET) //very easy
        {
            difficulty = _MAXIMUM_TARGET;
        }
    }
    //this is a recent ethereum block hash, used to prevent pre-mining future blocks
    function getChallengeNumber() public view returns(bytes32) {
        return challengeNumber;
    }
    //the number of zeroes the digest of the PoW solution requires.  Auto adjusts
    function getMiningDifficulty() public view returns(uint) {
        return _MAXIMUM_TARGET.div(difficulty);
    }

    function getMiningTarget() public view returns(uint) {
        return difficulty;
    }

    function getMiningReward() public view returns(uint) {
        return (baseMiningReward * 1e8).div(2 ** rewardEra);
    }

    //help debug mining software
    function getMintDigest(
        uint256 nonce,
        bytes32 challenge_digest,
        bytes32 challenge_number
    )
    public view returns(bytes32 digesttest) {
        bytes32 digest = keccak256(challenge_number, msg.sender, nonce);
        return digest;
    }
    //help debug mining software
    function checkMintSolution(
        uint256 nonce,
        bytes32 challenge_digest,
        bytes32 challenge_number,
        uint testTarget
    )
    public view returns(bool success) {
        bytes32 digest = keccak256(challenge_number, msg.sender, nonce);
        if (uint256(digest) > testTarget) revert();
        return (digest == challenge_digest);
    }
}

    Contract ABI  
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"TARGET_DIVISOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"proposalCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"discardRejectedProposal","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"mnid","type":"uint256"}],"name":"isPartOf","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"_emergencyLoop","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"buyMasternode","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getMiningDifficulty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"nonce","type":"uint256"},{"name":"challenge_digest","type":"bytes32"}],"name":"mint","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"difficulty","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_ADJUSTMENT_PERCENT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"voterMap","outputs":[{"name":"isVoter","type":"bool"},{"name":"owner","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"rewardEra","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMiningTarget","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MINING_RATE_FACTOR","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"withdrawCollateral","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_genesis","type":"address"},{"name":"_team","type":"bool"}],"name":"addGenesis","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"voterProposals","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"MAX_REWARD_ERA","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getMiningReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"addOwnToken","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokensList","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"getChallengeNumber","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"maxSupplyForEra","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"tokens","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseMiningReward","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"closeGenesis","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"proposalID","type":"uint256"}],"name":"getTokenProposalDetails","outputs":[{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"becomeVoter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_subtractedValue","type":"uint256"}],"name":"decreaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"tokensMinted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"contractProgress","outputs":[{"name":"epoch","type":"uint256"},{"name":"candidate","type":"uint256"},{"name":"round","type":"uint256"},{"name":"miningepoch","type":"uint256"},{"name":"globalreward","type":"uint256"},{"name":"powreward","type":"uint256"},{"name":"masternodereward","type":"uint256"},{"name":"usercounter","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"proposalID","type":"uint256"}],"name":"voteProposal","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"nonce","type":"uint256"},{"name":"challenge_digest","type":"bytes32"},{"name":"challenge_number","type":"bytes32"},{"name":"testTarget","type":"uint256"}],"name":"checkMintSolution","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"epochCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_MAXIMUM_TARGET","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"listAcceptedTokens","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"token","type":"address"}],"name":"getTokenDetails","outputs":[{"name":"ad","type":"address"},{"name":"required","type":"uint256"},{"name":"active","type":"bool"},{"name":"valid","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"challengeNumber","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_contract","type":"address"}],"name":"pushProposal","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"proposalID","type":"uint256"}],"name":"reachedMajorityForTeam","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"statistics","outputs":[{"name":"lastRewardTo","type":"address"},{"name":"lastRewardAmount","type":"uint256"},{"name":"lastRewardEthBlockNumber","type":"uint256"},{"name":"lastRewardTimestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"proposalID","type":"uint256"}],"name":"reachedMajority","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"nonce","type":"uint256"},{"name":"challenge_digest","type":"bytes32"},{"name":"challenge_number","type":"bytes32"}],"name":"getMintDigest","outputs":[{"name":"digesttest","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"votersCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"pastProposalTimeRules","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_candidate","type":"address"}],"name":"isMasternodeOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"amount","type":"uint256"}],"name":"depositCollateral","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_candidate","type":"address"}],"name":"getLastPerUser","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"QUOTIENT_LIMIT","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_member","type":"address"}],"name":"isTeamMember","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"userAddress","type":"address"}],"name":"belongsToUser","outputs":[{"name":"","type":"uint256[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"proposalPending","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"proposalList","outputs":[{"name":"tokenContract","type":"address"},{"name":"totalVotes","type":"uint256"},{"name":"proposedOn","type":"uint256"},{"name":"acceptedOn","type":"uint256"},{"name":"proposalType","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"latestDifficultyPeriodStarted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"LastProposalCanDiscard","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_addedValue","type":"uint256"}],"name":"increaseApproval","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"blocksPerReadjustment","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"_MINIMUM_TARGET","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"index","type":"uint256"}],"name":"masternodeInfo","outputs":[{"name":"","type":"address"},{"name":"","type":"bool"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"votersCountTeam","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"reward_amount","type":"uint256"},{"indexed":false,"name":"epochCount","type":"uint256"},{"indexed":false,"name":"newChallengeNumber","type":"bytes32"}],"name":"Mint","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"candidate","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"RewardMasternode","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"token","type":"address"},{"indexed":false,"name":"user","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"balance","type":"uint256"}],"name":"Withdraw","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"candidateAddress","type":"address"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"NewMasternode","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"candidateAddress","type":"address"},{"indexed":false,"name":"timeStamp","type":"uint256"}],"name":"RemovedMasternode","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"ProposalID","type":"uint256"}],"name":"NewProposal","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"ProposalID","type":"uint256"}],"name":"ProposalAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"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
603c600455600a60058190556802b5e3af16b1880000600d55600e556010805460ff199081169091556012805490911660011790556015805461ffff1916905564012a05f200601d55611194601e5560c0604052600360808190527f434c4d000000000000000000000000000000000000000000000000000000000060a09081526200008f916024919062000377565b5060408051808201909152600c8082527f4361656c756d20546f6b656e00000000000000000000000000000000000000006020909201918252620000d69160259162000377565b506026805460ff19166008179055660775f05a07400060279081556032602a819055610200602b5562010000602c557d040000000000000000000000000000000000000000000000000000000000602d556000602e55603091909155603c603155606490556107d060338190556200015e90600264010000000062002a806200024d82021704565b6034553480156200016e57600080fd5b5060008054600160a060020a03191633178155603955602754620001a290600264010000000062002a806200024d82021704565b602f55602d5460385543602855620001c4600064010000000062000272810204565b5033600090815260016020526040902054620001f590652632e314a00064010000000062002c756200032b82021704565b33600081815260016020908152604091829020939093558051652632e314a00081529051919230927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a362000419565b6000808083116200025d57600080fd5b82848115156200026957fe5b04949350505050565b6000602f54620002ac6200029462000345640100000000026401000000009004565b6039549064010000000062002c756200032b82021704565b118015620002bd5750603054602e54105b15620002cd57602e805460010190555b602e54602754620002f29160010160020a64010000000062002a806200024d82021704565b60275403602f556029546200031790600164010000000062002c756200032b82021704565b602981905543600019014060375592915050565b6000828201838110156200033e57600080fd5b9392505050565b602e54602a5460009162000371916305f5e100029060020a64010000000062002a806200024d82021704565b90505b90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003ba57805160ff1916838001178555620003ea565b82800160010185558215620003ea579182015b82811115620003ea578251825591602001919060010190620003cd565b50620003f8929150620003fc565b5090565b6200037491905b80821115620003f8576000815560010162000403565b6135d980620004296000396000f30060806040526004361061034d5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde038114610372578063095b6d4c146103fc578063095ea7b3146104235780630c0512e91461045b5780630f8143f61461047057806310cb56281461048557806314dfad27146104b957806316c85710146104ce57806317da485f146104d65780631801fbe5146104eb57806318160ddd1461050657806319cae4621461051b5780631beddf1c1461053057806323b872dd146105455780632be652251461056f5780632d38bf7a146105b3578063313ce567146105c857806332e99708146105f35780633426e5f514610608578063350c35e91461061d578063372210d114610641578063415fe9c41461066757806346eed3f31461067f578063490203a714610694578063493953de146106a95780634d12e34e146106be5780634ef37628146106d65780634fa972e1146106eb578063508493bc1461070057806354bcb1641461072757806355e97e931461073c5780635a43fa901461075157806363d494ea1461079957806366188463146107ae5780636de9f32b146107d257806370a08231146107e7578063715018a6146108085780637558d81e1461081d578063807896d51461087357806381269a561461088b578063829965cc146108ac57806387a2a9d6146108c15780638843c1ba146108d657806388aa8bee1461093b5780638ae0368b1461098c5780638da5cb5b146109a15780638e955978146109b657806391fb4583146109d757806395d89b41146109ef57806395e272bd14610a045780639601065d14610a1957806397566aa014610a3157806398c0793814610a4f5780639b598caf14610a645780639fc7535414610a79578063a5d5db0c14610a9a578063a73c52e714610abe578063a9059cbb14610adf578063ad1dfe3b14610b03578063bbe9f99d14610b18578063c325ae4e14610b39578063c5efa85f14610b5a578063c6311e3f14610b6f578063cb9ae70714610bd9578063cf866d6f14610bee578063d73dd62314610c03578063d87b8fcb14610c27578063dc6e9cf914610c3c578063dd62ed3e14610c51578063eae445ed14610c78578063f2f3eb8214610cc0578063f2fde38b14610cd5575b600d543414801561035d57503415155b151561036857600080fd5b610370610cf6565b005b34801561037e57600080fd5b50610387610d5e565b6040805160208082528351818301528351919283929083019185019080838360005b838110156103c15781810151838201526020016103a9565b50505050905090810190601f1680156103ee5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561040857600080fd5b50610411610dec565b60408051918252519081900360200190f35b34801561042f57600080fd5b50610447600160a060020a0360043516602435610df2565b604080519115158252519081900360200190f35b34801561046757600080fd5b50610411610e59565b34801561047c57600080fd5b50610447610e5f565b34801561049157600080fd5b5061049d600435610eac565b60408051600160a060020a039092168252519081900360200190f35b3480156104c557600080fd5b50610370610eca565b610370610efd565b3480156104e257600080fd5b50610411610f22565b3480156104f757600080fd5b50610447600435602435610f40565b34801561051257600080fd5b5061041161102b565b34801561052757600080fd5b50610411611031565b34801561053c57600080fd5b50610411611037565b34801561055157600080fd5b50610447600160a060020a036004358116906024351660443561103d565b34801561057b57600080fd5b50610590600160a060020a03600435166111a2565b604080519215158352600160a060020a0390911660208301528051918290030190f35b3480156105bf57600080fd5b506104116111c7565b3480156105d457600080fd5b506105dd6111cd565b6040805160ff9092168252519081900360200190f35b3480156105ff57600080fd5b506104116111d6565b34801561061457600080fd5b506104116111dc565b34801561062957600080fd5b50610370600160a060020a03600435166024356111e2565b34801561064d57600080fd5b50610370600160a060020a036004351660243515156113ca565b34801561067357600080fd5b5061049d600435611415565b34801561068b57600080fd5b50610411611430565b3480156106a057600080fd5b50610411611436565b3480156106b557600080fd5b50610447611458565b3480156106ca57600080fd5b5061049d6004356114a3565b3480156106e257600080fd5b506104116114cb565b3480156106f757600080fd5b506104116114d1565b34801561070c57600080fd5b50610411600160a060020a03600435811690602435166114d7565b34801561073357600080fd5b506104116114f4565b34801561074857600080fd5b506103706114fa565b34801561075d57600080fd5b50610769600435611522565b60408051600160a060020a0390951685526020850193909352838301919091526060830152519081900360800190f35b3480156107a557600080fd5b506103706115dd565b3480156107ba57600080fd5b50610447600160a060020a0360043516602435611727565b3480156107de57600080fd5b50610411611818565b3480156107f357600080fd5b50610411600160a060020a036004351661181e565b34801561081457600080fd5b50610370611839565b34801561082957600080fd5b50610832611898565b604080519889526020890197909752878701959095526060870193909352608086019190915260a085015260c084015260e083015251908190036101000190f35b34801561087f57600080fd5b506104476004356118d9565b34801561089757600080fd5b50610447600435602435604435606435611c10565b3480156108b857600080fd5b50610411611c5a565b3480156108cd57600080fd5b50610411611c60565b3480156108e257600080fd5b506108eb611c66565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561092757818101518382015260200161090f565b505050509050019250505060405180910390f35b34801561094757600080fd5b5061095c600160a060020a0360043516611cc8565b60408051600160a060020a0390951685526020850193909352901515838301526060830152519081900360800190f35b34801561099857600080fd5b50610411611d02565b3480156109ad57600080fd5b5061049d611d08565b3480156109c257600080fd5b50610411600160a060020a0360043516611d17565b3480156109e357600080fd5b50610447600435611fcd565b3480156109fb57600080fd5b50610387611ff6565b348015610a1057600080fd5b50610769612051565b348015610a2557600080fd5b5061044760043561206c565b348015610a3d57600080fd5b50610411600435602435604435612086565b348015610a5b57600080fd5b506104116120bb565b348015610a7057600080fd5b506104476120c1565b348015610a8557600080fd5b50610447600160a060020a03600435166120ef565b348015610aa657600080fd5b50610370600160a060020a0360043516602435612144565b348015610aca57600080fd5b50610411600160a060020a036004351661237d565b348015610aeb57600080fd5b50610447600160a060020a03600435166024356123ba565b348015610b0f57600080fd5b50610411612489565b348015610b2457600080fd5b50610447600160a060020a036004351661248f565b348015610b4557600080fd5b506108eb600160a060020a03600435166124d1565b348015610b6657600080fd5b50610447612540565b348015610b7b57600080fd5b50610b87600435612549565b6040518086600160a060020a0316600160a060020a03168152602001858152602001848152602001838152602001826001811115610bc157fe5b60ff1681526020019550505050505060405180910390f35b348015610be557600080fd5b50610411612585565b348015610bfa57600080fd5b5061044761258b565b348015610c0f57600080fd5b50610447600160a060020a0360043516602435612664565b348015610c3357600080fd5b506104116126fd565b348015610c4857600080fd5b50610411612703565b348015610c5d57600080fd5b50610411600160a060020a0360043581169060243516612709565b348015610c8457600080fd5b50610c90600435612734565b60408051600160a060020a0390951685529215156020850152838301919091526060830152519081900360800190f35b348015610ccc57600080fd5b50610411612769565b348015610ce157600080fd5b50610370600160a060020a036004351661276f565b60105460ff1615610d0657600080fd5b600e54600f541115610d1757600080fd5b60008054604051600160a060020a03909116913480156108fc02929091818181858888f19350505050158015610d51573d6000803e3d6000fd5b50610d5b3361278f565b50565b6025805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610de45780601f10610db957610100808354040283529160200191610de4565b820191906000526020600020905b815481529060010190602001808311610dc757829003601f168201915b505050505081565b60335481565b336000818152600360209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a35060015b92915050565b600a5481565b60008054600160a060020a03163314610e7757600080fd5b60065460ff161515610e8857600080fd5b610e9061258b565b1515610e9b57600080fd5b506006805460ff1916905560015b90565b600081815260216020526040902054600160a060020a03165b919050565b600054600160a060020a03163314610ee157600080fd5b610ee96128b4565b610ef1612930565b50601a80546001019055565b600d5434148015610f0d57503415155b1515610f1857600080fd5b610f20610cf6565b565b6000610f3b603854602d54612a8090919063ffffffff16565b905090565b600080600080610f508686612aa3565b50610f59610ee1565b610f61612b13565b9250610f6b612b78565b9150610f7d838363ffffffff612c7516565b603980549091019055610f8f86612c8e565b9050610f99612d16565b506040805160808101825233808252602080830187905243838501819052426060948501819052603a8054600160a060020a03191685179055603b899055603c91909155603d55603754845188815291820186905281850152925190927fcf6fbb9dcea7d07263ab4f5c3a92f53af33dffc421d9d121e1c74b307e68189d92908290030190a250600195945050505050565b60275481565b60385481565b60325481565b600160a060020a03831660009081526001602052604081205482111561106257600080fd5b600160a060020a038416600090815260036020908152604080832033845290915290205482111561109257600080fd5b600160a060020a03831615156110a757600080fd5b600160a060020a0384166000908152600160205260409020546110d0908363ffffffff612e8616565b600160a060020a038086166000908152600160205260408082209390935590851681522054611105908363ffffffff612c7516565b600160a060020a038085166000908152600160209081526040808320949094559187168152600382528281203382529091522054611149908363ffffffff612e8616565b600160a060020a038086166000818152600360209081526040808320338452825291829020949094558051868152905192871693919260008051602061358e833981519152929181900390910190a35060019392505050565b60086020526000908152604090205460ff8116906101009004600160a060020a031682565b602e5481565b60265460ff1681565b60385490565b60315481565b6000600160a060020a03831615156111f957600080fd5b61120283612e9d565b1515611258576040805160e560020a62461bcd02815260206004820152601460248201527f4552433230206e6f7420617574686f7269736564000000000000000000000000604482015290519081900360640190fd5b611261336120ef565b151561126c57600080fd5b600160a060020a0383166000908152601360209081526040808320338452909152902054821461129b57600080fd5b50600160a060020a0382166000908152601360209081526040808320338085529252822080549290556112d6906112d19061237d565b612ec2565b50604080517fa9059cbb000000000000000000000000000000000000000000000000000000008152336004820152602481018390529051600160a060020a0385169163a9059cbb9160448083019260209291908290030181600087803b15801561133f57600080fd5b505af1158015611353573d6000803e3d6000fd5b505050506040513d602081101561136957600080fd5b5051151561137657600080fd5b60408051600160a060020a03851681523360208201528082018390526060810183905290517ff341246adaac6f497bc2a656f546ab9e182111d630394f0c57c710a59a2cb5679181900360800190a1505050565b600054600160a060020a031633146113e157600080fd5b601554610100900460ff16156113f657600080fd5b6113ff8261278f565b5080156114115761140f33612fd7565b505b5050565b600960205260009081526040902054600160a060020a031681565b60305481565b6000610f3b602e5460020a602a546305f5e10002612a8090919063ffffffff16565b60008054600160a060020a0316331461147057600080fd5b60125460ff16151561148157600080fd5b6114933064746a528800618e94613028565b506012805460ff19169055600190565b60118054829081106114b157fe5b600091825260209091200154600160a060020a0316905081565b60375490565b602f5481565b601360209081526000928352604080842090915290825290205481565b602a5481565b600054600160a060020a0316331461151157600080fd5b6015805461ff001916610100179055565b6000818152600760205260408082205481517f08a1b5740000000000000000000000000000000000000000000000000000000081529151839283928392600160a060020a03909116916308a1b57491600480830192608092919082900301818787803b15801561159157600080fd5b505af11580156115a5573d6000803e3d6000fd5b505050506040513d60808110156115bb57600080fd5b5080516020820151604083015160609093015191989097509195509350915050565b6115e6336120ef565b151561163c576040805160e560020a62461bcd02815260206004820152601760248201527f5573657220686173206e6f206d61737465726e6f646573000000000000000000604482015290519081900360640190fd5b3360009081526008602052604090205460ff16156116c9576040805160e560020a62461bcd028152602060048201526024808201527f5573657220416c726561647920766f74656420666f7220746869732070726f7060448201527f6f73616c00000000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b3360008181526008602052604090208054600174ffffffffffffffffffffffffffffffffffffffff001990911661010084021760ff19168117909155600b805490910190556117179061248f565b15610f2057600c80546001019055565b336000908152600360209081526040808320600160a060020a038616845290915281205480831061177b57336000908152600360209081526040808320600160a060020a03881684529091528120556117b0565b61178b818463ffffffff612e8616565b336000908152600360209081526040808320600160a060020a03891684529091529020555b336000818152600360209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a3600191505b5092915050565b60395481565b600160a060020a031660009081526001602052604090205490565b600054600160a060020a0316331461185057600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a260008054600160a060020a0319169055565b600080600080600080600080601954601754601654601a546118b8611436565b601b54601c54601854969f959e50939c50919a509850965094509092509050565b3360009081526008602052604081205460ff161515611942576040805160e560020a62461bcd02815260206004820152601a60248201527f53656e646572206e6f74206c697374656420617320766f746572000000000000604482015290519081900360640190fd5b600082101561199b576040805160e560020a62461bcd02815260206004820152601960248201527f4e6f2070726f706f73616c207761732073656c65637465642e00000000000000604482015290519081900360640190fd5b600a548211156119f5576040805160e560020a62461bcd02815260206004820152601760248201527f50726f706f73616c206f7574206f66206c696d6974732e000000000000000000604482015290519081900360640190fd5b600082815260096020526040902054600160a060020a0316331415611a64576040805160e560020a62461bcd02815260206004820152600e60248201527f416c726561647920766f7465642e000000000000000000000000000000000000604482015290519081900360640190fd5b600160008381526007602052604090206004015460ff166001811115611a8657fe5b1415611b4457611a953361248f565b1515611aeb576040805160e560020a62461bcd02815260206004820152601b60248201527f5265737472696374656420666f72207465616d206d656d626572730000000000604482015290519081900360640190fd5b60008281526009602090815260408083208054600160a060020a0319163317905560079091529020600190810180549091019055611b2882611fcd565b15611b3f57611b356130ca565b5060019050610ec5565b610ec5565b600554600b541015611bc6576040805160e560020a62461bcd02815260206004820152603160248201527f4e6f7420656e6f75676820766f7465727320696e206578697374656e6365207460448201527f6f207075736820612070726f706f73616c000000000000000000000000000000606482015290519081900360840190fd5b60008281526009602090815260408083208054600160a060020a0319163317905560079091529020600190810180549091019055611c038261206c565b15610ec557611b356130ca565b604080518381526c010000000000000000000000003302602082015260348101869052905190819003605401902060009082811115611c4e57600080fd5b93909314949350505050565b60295481565b602d5481565b60606011805480602002602001604051908101604052809291908181526020018280548015611cbe57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311611ca0575b5050505050905090565b600160a060020a0390811660009081526014602052604090208054600182015460029092015492811693919260a060020a90910460ff1691565b60375481565b600054600160a060020a031681565b600080548190600160a060020a03163314611d3157600080fd5b600a5415611dbd57611d416120c1565b1515611dbd576040805160e560020a62461bcd02815260206004820152603a60248201527f596f75206e65656420746f20776169742039302064617973206265666f72652060448201527f7375626d697474696e672061206e65772070726f706f73616c2e000000000000606482015290519081900360840190fd5b60065460ff1615611e18576040805160e560020a62461bcd02815260206004820152601c60248201527f416e6f746865722070726f706f73616c2069732070656e64696e672e00000000604482015290519081900360640190fd5b82600160a060020a031663c51a29e06040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015611e6f57600080fd5b505af1158015611e83573d6000803e3d6000fd5b505050506040513d6020811015611e9957600080fd5b50516040805160a081018252600160a060020a03861681526000602082018190524292820192909252606081019190915290915060808101826001811115611edd57fe5b6001811115611ee857fe5b9052600a5460009081526007602090815260409182902083518154600160a060020a031916600160a060020a039091161781559083015160018083019190915591830151600282015560608301516003820155608083015160048201805492939192909160ff19909116908381811115611f5e57fe5b021790555050600a5460408051918252517f9a863892f20a6b9c6cec64d611b5864be6373191ce2cacc3b05a299bce3bf80e92509081900360200190a1600a80546001908101918290556006805460ff191682179055611fc4919063ffffffff612e8616565b91505b50919050565b600081815260076020526040812060010154611fe76131b7565b8110611fc75760019150611fc7565b6024805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610de45780601f10610db957610100808354040283529160200191610de4565b603a54603b54603c54603d54600160a060020a039093169284565b600081815260076020526040812060010154611fe76131cc565b604080518281526c01000000000000000000000000330260208201526034810185905290519081900360540190209392505050565b600b5481565b600a54600019016000908152600760205260408120600201546276a700810142106120eb57600191505b5090565b600160a060020a038116600090815260226020526040812060030154811061211957506000610ec5565b600160a060020a038083166000818152602260205260409020549091161415610ec557506001610ec5565b61214d82612e9d565b15156121a3576040805160e560020a62461bcd02815260206004820152601460248201527f4552433230206e6f7420617574686f7269736564000000000000000000000000604482015290519081900360640190fd5b6121ac826131de565b81146121b757600080fd5b6121c0826131fc565b15156121cb57600080fd5b600160a060020a03821660009081526013602090815260408083203384529091529020546121ff908263ffffffff612c7516565b600160a060020a0383166000818152601360209081526040808320338085529083528184209590955580517f23b872dd0000000000000000000000000000000000000000000000000000000081526004810195909552306024860152604485018690525192936323b872dd9360648083019491928390030190829087803b15801561228957600080fd5b505af115801561229d573d6000803e3d6000fd5b505050506040513d60208110156122b357600080fd5b5051151561230b576040805160e560020a62461bcd02815260206004820152601060248201527f6572726f72207769746820746f6b656e00000000000000000000000000000000604482015290519081900360640190fd5b600160a060020a03821660008181526013602090815260408083203380855290835292819020548151948552918401929092528282018490526060830152517fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d79181900360800190a161140f3361278f565b600160a060020a0381166000908152602260205260408120600301805460001981019081106123a857fe5b90600052602060002001549050919050565b336000908152600160205260408120548211156123d657600080fd5b600160a060020a03831615156123eb57600080fd5b3360009081526001602052604090205461240b908363ffffffff612e8616565b3360009081526001602052604080822092909255600160a060020a0385168152205461243d908363ffffffff612c7516565b600160a060020a03841660008181526001602090815260409182902093909355805185815290519192339260008051602061358e8339815191529281900390910190a350600192915050565b60345481565b600160a060020a0381166000908152602260205260408120547501000000000000000000000000000000000000000000900460ff1615610ec557506001610ec5565b600160a060020a03811660009081526022602090815260409182902060030180548351818402810184019094528084526060939283018282801561253457602002820191906000526020600020905b815481526020019060010190808311612520575b50505050509050919050565b60065460ff1681565b60076020526000908152604090208054600182015460028301546003840154600490940154600160a060020a0390931693919290919060ff1685565b60285481565b600a546000190160009081526007602090815260408083205481517ff61c266b0000000000000000000000000000000000000000000000000000000081529151849384938493600160a060020a03169263f61c266b9260048084019391929182900301818787803b1580156125ff57600080fd5b505af1158015612613573d6000803e3d6000fd5b505050506040513d602081101561262957600080fd5b5051600a5460001901600090815260076020526040902060020154909350915050620151808202810142811161265e57600193505b50505090565b336000908152600360209081526040808320600160a060020a0386168452909152812054612698908363ffffffff612c7516565b336000818152600360209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b602b5481565b602c5481565b600160a060020a03918216600090815260036020908152604080832093909416825291909152205490565b600090815260216020526040902080546001820154600290920154600160a060020a0382169360a060020a90920460ff169291565b600c5481565b600054600160a060020a0316331461278657600080fd5b610d5b81613232565b6018805460009081526021602090815260408083208054600160a060020a038716600160a060020a0319918216811790925585548552828520805474ff0000000000000000000000000000000000000000191660a060020a17905560165486548652838620600191820160029091015586548087528487208201558286526022855283862080549092168317825586546003909201805480830182559087528587200191909155601f805480830182559086527fa03837a25210ee280c2113ff4b77ca23440b19d4866cca721c801278fd08d80781015585540190945580519384524291840191909152805191927f14fa498a21d9dd10ef5c439bffbff97aa63c4d9186dce598a3ed9c43501b57fb929081900390910190a150506018546000190190565b6000806000806128c2611436565b9350601e54601a548115156128d357fe5b04600a029250600a8310156128f65760648404600502601b556000601c5561292a565b605a831115612915576064840460028102601b55606202601c5561292a565b505060648204810280830361292a81836132a2565b50505050565b600080805b61293d6132aa565b600160a060020a031615156129d157600682106129a4576040805160e560020a62461bcd02815260206004820152601460248201527f4661696c73616665207377697463686564206f6e000000000000000000000000604482015290519081900360640190fd5b81600514156129b65760009250612a7b565b60168054600190810190915560006017559190910190612935565b60016018540360175414156129ef5760168054600101905560006017555b506017545b601854811015612a6d5760008181526021602052604090205460a060020a900460ff1615612a65576016546000828152602160205260409020600201541415612a6557612a408161334a565b506017819055600081815260216020526040902054600160a060020a03169250612a7b565b6001016129f4565b601680546001019055600092505b505090565b600080808311612a8f57600080fd5b8284811515612a9a57fe5b04949350505050565b603754604080519182526c010000000000000000000000003302602083015260348201849052519081900360540190206000828214612ae157600080fd5b603854821115612af057600080fd5b506037546000908152603560205260409020805490829055801561181157600080fd5b601b5433600090815260016020526040812054909190612b39908263ffffffff612c7516565b3360008181526001602090815260409182902093909355805184815290519192309260008051602061358e8339815191529281900390910190a3919050565b601c546018546000919082901515612b935760009250612a7b565b50601754600090815260216020526040902054600160a060020a0316801515612bbf5760009250612a7b565b600160a060020a038116600090815260016020526040902054612be8908363ffffffff612c7516565b600160a060020a03821660008181526001602090815260409182902093909355805185815290519192309260008051602061358e8339815191529281900390910190a360408051600160a060020a03831681526020810184905281517f8f9a423c71e43ad001bebf147d969f424a8fac4e5970a367c5e53abb17cbe710929181900390910190a150919050565b600082820183811015612c8757600080fd5b9392505050565b6000602f54612cad612c9e611436565b6039549063ffffffff612c7516565b118015612cbd5750603054602e54105b15612ccc57602e805460010190555b602e54602754612ce79160010160020a63ffffffff612a8016565b60275403602f55602954612d0290600163ffffffff612c7516565b602981905543600019014060375592915050565b600080600080600080600080602b54602954811515612d3157fe5b0615612d41576038549750612e7c565b60285443039650602b5495506031548602945084871015612deb57612d8187612d756032548861336890919063ffffffff16565b9063ffffffff612a8016565b603454909450612da890612d9c86606463ffffffff612e8616565b9063ffffffff61339616565b9250612de3612dd484612dc8603354603854612a8090919063ffffffff16565b9063ffffffff61336816565b6038549063ffffffff612e8616565b603855612e52565b612e0485612d756032548a61336890919063ffffffff16565b603454909250612e1f90612d9c84606463ffffffff612e8616565b9050612e4e612e3f82612dc8603354603854612a8090919063ffffffff16565b6038549063ffffffff612c7516565b6038555b43602855602c546038541015612e6957602c546038555b602d546038541115612e7c57602d546038555b5050505050505090565b60008083831115612e9657600080fd5b5050900390565b600160a060020a031660009081526014602052604090205460a060020a900460ff1690565b600081815260216020526040812060010154601f80548391906000198101908110612ee957fe5b600091825260208083209091015486835260219091526040909120805474ff000000000000000000000000000000000000000019169055601f8054919250829184908110612f3357fe5b6000918252602080832090910192909255828152602190915260409020600101829055601f80546000190190612f699082613554565b50612f73846133ae565b50600084815260216020908152604091829020548251600160a060020a039091168152429181019190915281517fb9951e039957c4967e11bd6882bc288c70c4c049dd782362a293c2bfeeb5fedc929181900390910190a1600192505b5050919050565b600160a060020a03166000908152602260205260409020805475ff00000000000000000000000000000000000000000019167501000000000000000000000000000000000000000000179055600190565b600160a060020a0390921660008181526014602052604081208054600180830195909555426003830181905562015180909602909501600282015574ff000000000000000000000000000000000000000019600160a060020a031995861684171660a060020a17905560118054938401815590527f31ecc21a745e3968a04e9570e4425bc18fa8019c68028196b546d1669c200c689091018054909216179055565b60008060008060008060006130eb6001600a54612e8690919063ffffffff16565b6000818152600760205260409020426003909101556006805460ff19169055955061311586611522565b9297509095509350915081151561313157613131858585613028565b6001821415613179578315613163575060005b8381101561315e576131558561278f565b50600101613144565b61316e565b61316c8561278f565b505b61317785612fd7565b505b6040805187815290517fd24c2047577899547bacebb29e319fc7d73f6712b5adb401d45556f34bb2aa3b9181900360200190a1509395945050505050565b600454600c54600091026064815b0491505090565b600454600b54600091026064816131c5565b600160a060020a031660009081526014602052604090206001015490565b600160a060020a038116600090815260146020526040812060020154428111156132295760019150611fc7565b50600092915050565b600160a060020a038116151561324757600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a360008054600160a060020a031916600160a060020a0392909216919091179055565b601c55601b55565b60165460175460185460009291908390600019018214156132d057826001019250600091505b506017545b6018548110156133405760008181526021602052604090205460a060020a900460ff16156133385760008181526021602052604090206002015483141561333857600081815260216020526040902054600160a060020a0316935090508061265e565b6001016132d5565b5060009392505050565b60009081526021602052604090206002018054600190810190915590565b60008083151561337b5760009150611811565b5082820282848281151561338b57fe5b0414612c8757600080fd5b6000818311156133a7575080610e53565b5090919050565b60606000806133bc84610eac565b600160a060020a03811660009081526022602052604090206003015490925084106133e657612fd0565b50825b600160a060020a0382166000908152602260205260409020600301546000190181101561348157600160a060020a038216600090815260226020526040902060030180546001830190811061343a57fe5b6000918252602080832090910154600160a060020a03851683526022909152604090912060030180548390811061346d57fe5b6000918252602090912001556001016133e9565b600160a060020a0382166000908152602260205260409020600301805460001981019081106134ac57fe5b60009182526020808320909101829055600160a060020a038416825260229052604090206003018054906134e4906000198301613554565b50600160a060020a0382166000908152602260209081526040918290206003018054835181840281018401909452808452909183018282801561354657602002820191906000526020600020905b815481526020019060010190808311613532575b505050505092505050919050565b81548183558181111561140f5760008381526020902061140f918101908301610ea991905b808211156120eb57600081556001016135795600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a723058202af7da4b6ff170da0b8322f123449c1a370434d9493db63c8bfed116faefe3c10029

   Swarm Source:
bzzr://2af7da4b6ff170da0b8322f123449c1a370434d9493db63c8bfed116faefe3c1

 

View All
Block Age transaction Difficulty GasUsed Reward
View All
Block Age UncleNumber Difficulty GasUsed Reward
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.