ETH Price: $1,522.22 (-7.53%)
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

Transaction Hash
Method
Block
From
To
Transfer104572462020-07-14 11:05:501731 days ago1594724750IN
0xfBd86312...bbAfCAf9C
0 ETH0.0014648238
Transfer98425862020-04-10 5:11:561826 days ago1586495516IN
0xfBd86312...bbAfCAf9C
0 ETH0.000070683
Add Owner95710682020-02-28 8:40:521868 days ago1582879252IN
0xfBd86312...bbAfCAf9C
0 ETH0.000124955
Transfer95671472020-02-27 17:57:041869 days ago1582826224IN
0xfBd86312...bbAfCAf9C
0 ETH0.000038561
Transfer95622032020-02-26 23:46:371870 days ago1582760797IN
0xfBd86312...bbAfCAf9C
0 ETH0.000107072
Transfer95612802020-02-26 20:23:041870 days ago1582748584IN
0xfBd86312...bbAfCAf9C
0 ETH0.000214144
Transfer93667872020-01-27 22:38:541900 days ago1580164734IN
0xfBd86312...bbAfCAf9C
0 ETH0.000047072
Transfer93667302020-01-27 22:25:361900 days ago1580163936IN
0xfBd86312...bbAfCAf9C
0 ETH0.000077092
Transfer93489022020-01-25 4:41:531902 days ago1579927313IN
0xfBd86312...bbAfCAf9C
0 ETH0.000038541
Transfer92866282020-01-15 15:55:041912 days ago1579103704IN
0xfBd86312...bbAfCAf9C
0 ETH0.00005251.5
Transfer92597312020-01-11 12:54:191916 days ago1578747259IN
0xfBd86312...bbAfCAf9C
0 ETH0.000270686
Transfer92597142020-01-11 12:50:531916 days ago1578747053IN
0xfBd86312...bbAfCAf9C
0 ETH0.000045111
Transfer92596292020-01-11 12:28:561916 days ago1578745736IN
0xfBd86312...bbAfCAf9C
0 ETH0.000115643
Transfer92419852020-01-08 19:48:251919 days ago1578512905IN
0xfBd86312...bbAfCAf9C
0 ETH0.000321286
Transfer90246322019-11-30 3:32:571958 days ago1575084777IN
0xfBd86312...bbAfCAf9C
0 ETH0.000037641
Transfer90040772019-11-26 12:05:461962 days ago1574769946IN
0xfBd86312...bbAfCAf9C
0 ETH0.000263545
Transfer90040772019-11-26 12:05:461962 days ago1574769946IN
0xfBd86312...bbAfCAf9C
0 ETH0.000263545
Transfer89643252019-11-19 20:15:461969 days ago1574194546IN
0xfBd86312...bbAfCAf9C
0 ETH0.000037641
Transfer89643082019-11-19 20:11:431969 days ago1574194303IN
0xfBd86312...bbAfCAf9C
0 ETH0.000037641
Transfer89625562019-11-19 13:00:271969 days ago1574168427IN
0xfBd86312...bbAfCAf9C
0 ETH0.0005745110.9
Approve89488082019-11-17 5:58:551971 days ago1573970335IN
0xfBd86312...bbAfCAf9C
0 ETH0.000120382.55
Transfer89470412019-11-16 22:46:351972 days ago1573944395IN
0xfBd86312...bbAfCAf9C
0 ETH0.000339949
Transfer89434162019-11-16 8:33:471972 days ago1573893227IN
0xfBd86312...bbAfCAf9C
0 ETH0.000105412
Transfer89396082019-11-15 17:04:581973 days ago1573837498IN
0xfBd86312...bbAfCAf9C
0 ETH0.000188545
Transfer89396032019-11-15 17:03:291973 days ago1573837409IN
0xfBd86312...bbAfCAf9C
0 ETH0.000075412
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
SmartzToken

Compiler Version
v0.4.24+commit.e67f0147

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2018-11-07
*/

pragma solidity ^0.4.18;

interface IApprovalRecipient {
    /**
     * @notice Signals that token holder approved spending of tokens and some action should be taken.
     *
     * @param _sender token holder which approved spending of his tokens
     * @param _value amount of tokens approved to be spent
     * @param _extraData any extra data token holder provided to the call
     *
     * @dev warning: implementors should validate sender of this message (it should be the token) and make no further
     *      assumptions unless validated them via ERC20 methods.
     */
    function receiveApproval(address _sender, uint256 _value, bytes _extraData) public;
}

interface IKYCProvider {
    function isKYCPassed(address _address) public view returns (bool);
}

library SafeMath {
  function mul(uint256 a, uint256 b) internal pure returns (uint256) {
    if (a == 0) {
      return 0;
    }
    uint256 c = a * b;
    assert(c / a == b);
    return c;
  }

  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return c;
  }

  function sub(uint256 a, uint256 b) internal pure returns (uint256) {
    assert(b <= a);
    return a - b;
  }

  function add(uint256 a, uint256 b) internal pure returns (uint256) {
    uint256 c = a + b;
    assert(c >= a);
    return c;
  }
}

contract ArgumentsChecker {

    /// @dev check which prevents short address attack
    modifier payloadSizeIs(uint size) {
       require(msg.data.length == size + 4 /* function selector */);
       _;
    }

    /// @dev check that address is valid
    modifier validAddress(address addr) {
        require(addr != address(0));
        _;
    }
}

contract multiowned {

	// TYPES

    // struct for the status of a pending operation.
    struct MultiOwnedOperationPendingState {
        // count of confirmations needed
        uint yetNeeded;

        // bitmap of confirmations where owner #ownerIndex's decision corresponds to 2**ownerIndex bit
        uint ownersDone;

        // position of this operation key in m_multiOwnedPendingIndex
        uint index;
    }

	// EVENTS

    event Confirmation(address owner, bytes32 operation);
    event Revoke(address owner, bytes32 operation);
    event FinalConfirmation(address owner, bytes32 operation);

    // some others are in the case of an owner changing.
    event OwnerChanged(address oldOwner, address newOwner);
    event OwnerAdded(address newOwner);
    event OwnerRemoved(address oldOwner);

    // the last one is emitted if the required signatures change
    event RequirementChanged(uint newRequirement);

	// MODIFIERS

    // simple single-sig function modifier.
    modifier onlyowner {
        require(isOwner(msg.sender));
        _;
    }
    // multi-sig function modifier: the operation must have an intrinsic hash in order
    // that later attempts can be realised as the same underlying operation and
    // thus count as confirmations.
    modifier onlymanyowners(bytes32 _operation) {
        if (confirmAndCheck(_operation)) {
            _;
        }
        // Even if required number of confirmations has't been collected yet,
        // we can't throw here - because changes to the state have to be preserved.
        // But, confirmAndCheck itself will throw in case sender is not an owner.
    }

    modifier validNumOwners(uint _numOwners) {
        require(_numOwners > 0 && _numOwners <= c_maxOwners);
        _;
    }

    modifier multiOwnedValidRequirement(uint _required, uint _numOwners) {
        require(_required > 0 && _required <= _numOwners);
        _;
    }

    modifier ownerExists(address _address) {
        require(isOwner(_address));
        _;
    }

    modifier ownerDoesNotExist(address _address) {
        require(!isOwner(_address));
        _;
    }

    modifier multiOwnedOperationIsActive(bytes32 _operation) {
        require(isOperationActive(_operation));
        _;
    }

	// METHODS

    // constructor is given number of sigs required to do protected "onlymanyowners" transactions
    // as well as the selection of addresses capable of confirming them (msg.sender is not added to the owners!).
    function multiowned(address[] _owners, uint _required)
        public
        validNumOwners(_owners.length)
        multiOwnedValidRequirement(_required, _owners.length)
    {
        assert(c_maxOwners <= 255);

        m_numOwners = _owners.length;
        m_multiOwnedRequired = _required;

        for (uint i = 0; i < _owners.length; ++i)
        {
            address owner = _owners[i];
            // invalid and duplicate addresses are not allowed
            require(0 != owner && !isOwner(owner) /* not isOwner yet! */);

            uint currentOwnerIndex = checkOwnerIndex(i + 1 /* first slot is unused */);
            m_owners[currentOwnerIndex] = owner;
            m_ownerIndex[owner] = currentOwnerIndex;
        }

        assertOwnersAreConsistent();
    }

    /// @notice replaces an owner `_from` with another `_to`.
    /// @param _from address of owner to replace
    /// @param _to address of new owner
    // All pending operations will be canceled!
    function changeOwner(address _from, address _to)
        external
        ownerExists(_from)
        ownerDoesNotExist(_to)
        onlymanyowners(keccak256(msg.data))
    {
        assertOwnersAreConsistent();

        clearPending();
        uint ownerIndex = checkOwnerIndex(m_ownerIndex[_from]);
        m_owners[ownerIndex] = _to;
        m_ownerIndex[_from] = 0;
        m_ownerIndex[_to] = ownerIndex;

        assertOwnersAreConsistent();
        OwnerChanged(_from, _to);
    }

    /// @notice adds an owner
    /// @param _owner address of new owner
    // All pending operations will be canceled!
    function addOwner(address _owner)
        external
        ownerDoesNotExist(_owner)
        validNumOwners(m_numOwners + 1)
        onlymanyowners(keccak256(msg.data))
    {
        assertOwnersAreConsistent();

        clearPending();
        m_numOwners++;
        m_owners[m_numOwners] = _owner;
        m_ownerIndex[_owner] = checkOwnerIndex(m_numOwners);

        assertOwnersAreConsistent();
        OwnerAdded(_owner);
    }

    /// @notice removes an owner
    /// @param _owner address of owner to remove
    // All pending operations will be canceled!
    function removeOwner(address _owner)
        external
        ownerExists(_owner)
        validNumOwners(m_numOwners - 1)
        multiOwnedValidRequirement(m_multiOwnedRequired, m_numOwners - 1)
        onlymanyowners(keccak256(msg.data))
    {
        assertOwnersAreConsistent();

        clearPending();
        uint ownerIndex = checkOwnerIndex(m_ownerIndex[_owner]);
        m_owners[ownerIndex] = 0;
        m_ownerIndex[_owner] = 0;
        //make sure m_numOwners is equal to the number of owners and always points to the last owner
        reorganizeOwners();

        assertOwnersAreConsistent();
        OwnerRemoved(_owner);
    }

    /// @notice changes the required number of owner signatures
    /// @param _newRequired new number of signatures required
    // All pending operations will be canceled!
    function changeRequirement(uint _newRequired)
        external
        multiOwnedValidRequirement(_newRequired, m_numOwners)
        onlymanyowners(keccak256(msg.data))
    {
        m_multiOwnedRequired = _newRequired;
        clearPending();
        RequirementChanged(_newRequired);
    }

    /// @notice Gets an owner by 0-indexed position
    /// @param ownerIndex 0-indexed owner position
    function getOwner(uint ownerIndex) public constant returns (address) {
        return m_owners[ownerIndex + 1];
    }

    /// @notice Gets owners
    /// @return memory array of owners
    function getOwners() public constant returns (address[]) {
        address[] memory result = new address[](m_numOwners);
        for (uint i = 0; i < m_numOwners; i++)
            result[i] = getOwner(i);

        return result;
    }

    /// @notice checks if provided address is an owner address
    /// @param _addr address to check
    /// @return true if it's an owner
    function isOwner(address _addr) public constant returns (bool) {
        return m_ownerIndex[_addr] > 0;
    }

    /// @notice Tests ownership of the current caller.
    /// @return true if it's an owner
    // It's advisable to call it by new owner to make sure that the same erroneous address is not copy-pasted to
    // addOwner/changeOwner and to isOwner.
    function amIOwner() external constant onlyowner returns (bool) {
        return true;
    }

    /// @notice Revokes a prior confirmation of the given operation
    /// @param _operation operation value, typically keccak256(msg.data)
    function revoke(bytes32 _operation)
        external
        multiOwnedOperationIsActive(_operation)
        onlyowner
    {
        uint ownerIndexBit = makeOwnerBitmapBit(msg.sender);
        var pending = m_multiOwnedPending[_operation];
        require(pending.ownersDone & ownerIndexBit > 0);

        assertOperationIsConsistent(_operation);

        pending.yetNeeded++;
        pending.ownersDone -= ownerIndexBit;

        assertOperationIsConsistent(_operation);
        Revoke(msg.sender, _operation);
    }

    /// @notice Checks if owner confirmed given operation
    /// @param _operation operation value, typically keccak256(msg.data)
    /// @param _owner an owner address
    function hasConfirmed(bytes32 _operation, address _owner)
        external
        constant
        multiOwnedOperationIsActive(_operation)
        ownerExists(_owner)
        returns (bool)
    {
        return !(m_multiOwnedPending[_operation].ownersDone & makeOwnerBitmapBit(_owner) == 0);
    }

    // INTERNAL METHODS

    function confirmAndCheck(bytes32 _operation)
        private
        onlyowner
        returns (bool)
    {
        if (512 == m_multiOwnedPendingIndex.length)
            // In case m_multiOwnedPendingIndex grows too much we have to shrink it: otherwise at some point
            // we won't be able to do it because of block gas limit.
            // Yes, pending confirmations will be lost. Dont see any security or stability implications.
            // TODO use more graceful approach like compact or removal of clearPending completely
            clearPending();

        var pending = m_multiOwnedPending[_operation];

        // if we're not yet working on this operation, switch over and reset the confirmation status.
        if (! isOperationActive(_operation)) {
            // reset count of confirmations needed.
            pending.yetNeeded = m_multiOwnedRequired;
            // reset which owners have confirmed (none) - set our bitmap to 0.
            pending.ownersDone = 0;
            pending.index = m_multiOwnedPendingIndex.length++;
            m_multiOwnedPendingIndex[pending.index] = _operation;
            assertOperationIsConsistent(_operation);
        }

        // determine the bit to set for this owner.
        uint ownerIndexBit = makeOwnerBitmapBit(msg.sender);
        // make sure we (the message sender) haven't confirmed this operation previously.
        if (pending.ownersDone & ownerIndexBit == 0) {
            // ok - check if count is enough to go ahead.
            assert(pending.yetNeeded > 0);
            if (pending.yetNeeded == 1) {
                // enough confirmations: reset and run interior.
                delete m_multiOwnedPendingIndex[m_multiOwnedPending[_operation].index];
                delete m_multiOwnedPending[_operation];
                FinalConfirmation(msg.sender, _operation);
                return true;
            }
            else
            {
                // not enough: record that this owner in particular confirmed.
                pending.yetNeeded--;
                pending.ownersDone |= ownerIndexBit;
                assertOperationIsConsistent(_operation);
                Confirmation(msg.sender, _operation);
            }
        }
    }

    // Reclaims free slots between valid owners in m_owners.
    // TODO given that its called after each removal, it could be simplified.
    function reorganizeOwners() private {
        uint free = 1;
        while (free < m_numOwners)
        {
            // iterating to the first free slot from the beginning
            while (free < m_numOwners && m_owners[free] != 0) free++;

            // iterating to the first occupied slot from the end
            while (m_numOwners > 1 && m_owners[m_numOwners] == 0) m_numOwners--;

            // swap, if possible, so free slot is located at the end after the swap
            if (free < m_numOwners && m_owners[m_numOwners] != 0 && m_owners[free] == 0)
            {
                // owners between swapped slots should't be renumbered - that saves a lot of gas
                m_owners[free] = m_owners[m_numOwners];
                m_ownerIndex[m_owners[free]] = free;
                m_owners[m_numOwners] = 0;
            }
        }
    }

    function clearPending() private onlyowner {
        uint length = m_multiOwnedPendingIndex.length;
        // TODO block gas limit
        for (uint i = 0; i < length; ++i) {
            if (m_multiOwnedPendingIndex[i] != 0)
                delete m_multiOwnedPending[m_multiOwnedPendingIndex[i]];
        }
        delete m_multiOwnedPendingIndex;
    }

    function checkOwnerIndex(uint ownerIndex) private pure returns (uint) {
        assert(0 != ownerIndex && ownerIndex <= c_maxOwners);
        return ownerIndex;
    }

    function makeOwnerBitmapBit(address owner) private constant returns (uint) {
        uint ownerIndex = checkOwnerIndex(m_ownerIndex[owner]);
        return 2 ** ownerIndex;
    }

    function isOperationActive(bytes32 _operation) private constant returns (bool) {
        return 0 != m_multiOwnedPending[_operation].yetNeeded;
    }


    function assertOwnersAreConsistent() private constant {
        assert(m_numOwners > 0);
        assert(m_numOwners <= c_maxOwners);
        assert(m_owners[0] == 0);
        assert(0 != m_multiOwnedRequired && m_multiOwnedRequired <= m_numOwners);
    }

    function assertOperationIsConsistent(bytes32 _operation) private constant {
        var pending = m_multiOwnedPending[_operation];
        assert(0 != pending.yetNeeded);
        assert(m_multiOwnedPendingIndex[pending.index] == _operation);
        assert(pending.yetNeeded <= m_multiOwnedRequired);
    }


   	// FIELDS

    uint constant c_maxOwners = 250;

    // the number of owners that must confirm the same operation before it is run.
    uint public m_multiOwnedRequired;


    // pointer used to find a free slot in m_owners
    uint public m_numOwners;

    // list of owners (addresses),
    // slot 0 is unused so there are no owner which index is 0.
    // TODO could we save space at the end of the array for the common case of <10 owners? and should we?
    address[256] internal m_owners;

    // index on the list of owners to allow reverse lookup: owner address => index in m_owners
    mapping(address => uint) internal m_ownerIndex;


    // the ongoing operations.
    mapping(bytes32 => MultiOwnedOperationPendingState) internal m_multiOwnedPending;
    bytes32[] internal m_multiOwnedPendingIndex;
}

contract ERC20Basic {
  uint256 public totalSupply;
  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) balances;

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

    // SafeMath.sub will throw if there is not enough balance.
    balances[msg.sender] = balances[msg.sender].sub(_value);
    balances[_to] = balances[_to].add(_value);
    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 balance) {
    return balances[_owner];
  }

}

contract BurnableToken is BasicToken {

    event Burn(address indexed from, uint256 amount);

    /**
     * Function to burn msg.sender's tokens.
     *
     * @param _amount amount of tokens to burn
     *
     * @return boolean that indicates if the operation was successful
     */
    function burn(uint256 _amount)
        public
        returns (bool)
    {
        address from = msg.sender;

        require(_amount > 0);
        require(_amount <= balances[from]);

        totalSupply = totalSupply.sub(_amount);
        balances[from] = balances[from].sub(_amount);
        Burn(from, _amount);
        Transfer(from, address(0), _amount);

        return true;
    }
}

contract StandardToken is ERC20, BasicToken {

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


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

    balances[_from] = balances[_from].sub(_value);
    balances[_to] = balances[_to].add(_value);
    allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
    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;
    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];
  }

  /**
   * 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
   */
  function increaseApproval(address _spender, uint _addedValue) public returns (bool) {
    allowed[msg.sender][_spender] = allowed[msg.sender][_spender].add(_addedValue);
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

  function decreaseApproval(address _spender, uint _subtractedValue) public returns (bool) {
    uint oldValue = allowed[msg.sender][_spender];
    if (_subtractedValue > oldValue) {
      allowed[msg.sender][_spender] = 0;
    } else {
      allowed[msg.sender][_spender] = oldValue.sub(_subtractedValue);
    }
    Approval(msg.sender, _spender, allowed[msg.sender][_spender]);
    return true;
  }

}

contract TokenWithApproveAndCallMethod is StandardToken {

    /**
     * @notice Approves spending tokens and immediately triggers token recipient logic.
     *
     * @param _spender contract which supports IApprovalRecipient and allowed to receive tokens
     * @param _value amount of tokens approved to be spent
     * @param _extraData any extra data which to be provided to the _spender
     *
     * By invoking this utility function token holder could do two things in one transaction: approve spending his
     * tokens and execute some external contract which spends them on token holder's behalf.
     * It can't be known if _spender's invocation succeed or not.
     * This function will throw if approval failed.
     */
    function approveAndCall(address _spender, uint256 _value, bytes _extraData) public {
        require(approve(_spender, _value));
        IApprovalRecipient(_spender).receiveApproval(msg.sender, _value, _extraData);
    }
}

contract SmartzToken is ArgumentsChecker, multiowned, BurnableToken, StandardToken, TokenWithApproveAndCallMethod {

    /// @title Unit of frozen tokens - tokens which can't be spent until certain conditions is met.
    struct FrozenCell {
        /// @notice amount of frozen tokens
        uint amount;

        /// @notice until this unix time the cell is considered frozen
        uint128 thawTS;

        /// @notice is KYC required for a token holder to spend this cell?
        uint128 isKYCRequired;
    }


    // MODIFIERS

    modifier onlySale(address account) {
        require(isSale(account));
        _;
    }

    modifier validUnixTS(uint ts) {
        require(ts >= 1522046326 && ts <= 1800000000);
        _;
    }

    modifier checkTransferInvariant(address from, address to) {
        uint initial = balanceOf(from).add(balanceOf(to));
        _;
        assert(balanceOf(from).add(balanceOf(to)) == initial);
    }

    modifier privilegedAllowed {
        require(m_allowPrivileged);
        _;
    }


    // PUBLIC FUNCTIONS

    /**
     * @notice Constructs token.
     *
     * Initial owners have power over the token contract only during bootstrap phase (early investments and token
     * sales). To be precise, the owners can set KYC provider and sales (which can freeze transfered tokens) during
     * bootstrap phase. After final token sale any control over the token removed by issuing disablePrivileged call.
     */
    function SmartzToken()
        public
        payable
        multiowned(getInitialOwners(), 2)
    {
        if (0 != 900000000000000000000) {
            totalSupply = 900000000000000000000;
            balances[msg.sender] = totalSupply;
            Transfer(address(0), msg.sender, totalSupply);
        }

        
totalSupply = totalSupply.add(0);

        
    }

    function getInitialOwners() private pure returns (address[]) {
        address[] memory result = new address[](2);
result[0] = address(0x46C7736d82470BfE6526d3770351f296f03a5DE3);
result[1] = address(0xc96e7a6344b35b9275620C6643ecdac3fa002506);
        return result;
    }

    /**
     * @notice Version of balanceOf() which includes all frozen tokens.
     *
     * @param _owner the address to query the balance of
     *
     * @return an uint256 representing the amount owned by the passed address
     */
    function balanceOf(address _owner) public view returns (uint256) {
        uint256 balance = balances[_owner];

        for (uint cellIndex = 0; cellIndex < frozenBalances[_owner].length; ++cellIndex) {
            balance = balance.add(frozenBalances[_owner][cellIndex].amount);
        }

        return balance;
    }

    /**
     * @notice Version of balanceOf() which includes only currently spendable tokens.
     *
     * @param _owner the address to query the balance of
     *
     * @return an uint256 representing the amount spendable by the passed address
     */
    function availableBalanceOf(address _owner) public view returns (uint256) {
        uint256 balance = balances[_owner];

        for (uint cellIndex = 0; cellIndex < frozenBalances[_owner].length; ++cellIndex) {
            if (isSpendableFrozenCell(_owner, cellIndex))
                balance = balance.add(frozenBalances[_owner][cellIndex].amount);
        }

        return balance;
    }

    /**
     * @notice Standard transfer() overridden to have a chance to thaw sender's tokens.
     *
     * @param _to the address to transfer to
     * @param _value the amount to be transferred
     *
     * @return true iff operation was successfully completed
     */
    function transfer(address _to, uint256 _value)
        public
        payloadSizeIs(2 * 32)
        returns (bool)
    {
        thawSomeTokens(msg.sender, _value);
        return super.transfer(_to, _value);
    }

    /**
     * @notice Standard transferFrom overridden to have a chance to thaw sender's tokens.
     *
     * @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
     *
     * @return true iff operation was successfully completed
     */
    function transferFrom(address _from, address _to, uint256 _value)
        public
        payloadSizeIs(3 * 32)
        returns (bool)
    {
        thawSomeTokens(_from, _value);
        return super.transferFrom(_from, _to, _value);
    }

    
    /**
     * Function to burn msg.sender's tokens. Overridden to have a chance to thaw sender's tokens.
     *
     * @param _amount amount of tokens to burn
     *
     * @return boolean that indicates if the operation was successful
     */
    function burn(uint256 _amount)
        public
        payloadSizeIs(1 * 32)
        returns (bool)
    {
        thawSomeTokens(msg.sender, _amount);
        return super.burn(_amount);
    }


    // INFORMATIONAL FUNCTIONS (VIEWS)

    /**
     * @notice Number of frozen cells of an account.
     *
     * @param owner account address
     *
     * @return number of frozen cells
     */
    function frozenCellCount(address owner) public view returns (uint) {
        return frozenBalances[owner].length;
    }

    /**
     * @notice Retrieves information about account frozen tokens.
     *
     * @param owner account address
     * @param index index of so-called frozen cell from 0 (inclusive) up to frozenCellCount(owner) exclusive
     *
     * @return amount amount of tokens frozen in this cell
     * @return thawTS unix timestamp at which tokens'll become available
     * @return isKYCRequired it's required to pass KYC to spend tokens iff isKYCRequired is true
     */
    function frozenCell(address owner, uint index) public view returns (uint amount, uint thawTS, bool isKYCRequired) {
        require(index < frozenCellCount(owner));

        amount = frozenBalances[owner][index].amount;
        thawTS = uint(frozenBalances[owner][index].thawTS);
        isKYCRequired = decodeKYCFlag(frozenBalances[owner][index].isKYCRequired);
    }


    // ADMINISTRATIVE FUNCTIONS

    /**
     * @notice Sets current KYC provider of the token.
     *
     * @param KYCProvider address of the IKYCProvider-compatible contract
     *
     * Function is used only during token sale phase, before disablePrivileged() is called.
     */
    function setKYCProvider(address KYCProvider)
        external
        validAddress(KYCProvider)
        privilegedAllowed
        onlymanyowners(keccak256(msg.data))
    {
        m_KYCProvider = IKYCProvider(KYCProvider);
    }

    /**
     * @notice Sets sale status of an account.
     *
     * @param account account address
     * @param isSale is this account has access to frozen* functions
     *
     * Function is used only during token sale phase, before disablePrivileged() is called.
     */
    function setSale(address account, bool isSale)
        external
        validAddress(account)
        privilegedAllowed
        onlymanyowners(keccak256(msg.data))
    {
        m_sales[account] = isSale;
    }


    /**
     * @notice Transfers tokens to a recipient and freezes it.
     *
     * @param _to account to which tokens are sent
     * @param _value amount of tokens to send
     * @param thawTS unix timestamp at which tokens'll become available
     * @param isKYCRequired it's required to pass KYC to spend tokens iff isKYCRequired is true
     *
     * Function is used only during token sale phase and available only to sale accounts.
     */
    function frozenTransfer(address _to, uint256 _value, uint thawTS, bool isKYCRequired)
        external
        validAddress(_to)
        validUnixTS(thawTS)
        payloadSizeIs(4 * 32)
        privilegedAllowed
        onlySale(msg.sender)
        checkTransferInvariant(msg.sender, _to)
        returns (bool)
    {
        require(_value <= balances[msg.sender]);

        balances[msg.sender] = balances[msg.sender].sub(_value);
        addFrozen(_to, _value, thawTS, isKYCRequired);
        Transfer(msg.sender, _to, _value);

        return true;
    }

    /**
     * @notice Transfers frozen tokens back.
     *
     * @param _from account to send tokens from
     * @param _to account to which tokens are sent
     * @param _value amount of tokens to send
     * @param thawTS unix timestamp at which tokens'll become available
     * @param isKYCRequired it's required to pass KYC to spend tokens iff isKYCRequired is true
     *
     * Function is used only during token sale phase to make a refunds and available only to sale accounts.
     * _from account has to explicitly approve spending with the approve() call.
     * thawTS and isKYCRequired parameters are required to withdraw exact "same" tokens (to not affect availability of
     * other tokens of the account).
     */
    function frozenTransferFrom(address _from, address _to, uint256 _value, uint thawTS, bool isKYCRequired)
        external
        validAddress(_to)
        validUnixTS(thawTS)
        payloadSizeIs(5 * 32)
        privilegedAllowed
        //onlySale(msg.sender) too many local variables - compiler fails
        //onlySale(_to)
        checkTransferInvariant(_from, _to)
        returns (bool)
    {
        require(isSale(msg.sender) && isSale(_to));
        require(_value <= allowed[_from][msg.sender]);

        allowed[_from][msg.sender] = allowed[_from][msg.sender].sub(_value);
        subFrozen(_from, _value, thawTS, isKYCRequired);
        balances[_to] = balances[_to].add(_value);
        Transfer(_from, _to, _value);

        return true;
    }

    /// @notice Disables further use of any privileged functions like freezing tokens.
    function disablePrivileged()
        external
        privilegedAllowed
        onlymanyowners(keccak256(msg.data))
    {
        m_allowPrivileged = false;
    }


    // INTERNAL FUNCTIONS

    function isSale(address account) private view returns (bool) {
        return m_sales[account];
    }

    /**
     * @dev Tries to find existent FrozenCell that matches (thawTS, isKYCRequired).
     *
     * @return index in frozenBalances[_owner] which equals to frozenBalances[_owner].length in case cell is not found
     *
     * Because frozen* functions are only for token sales and token sale number is limited, expecting cellIndex
     * to be ~ 1-5 and the following loop to be O(1).
     */
    function findFrozenCell(address owner, uint128 thawTSEncoded, uint128 isKYCRequiredEncoded)
        private
        view
        returns (uint cellIndex)
    {
        for (cellIndex = 0; cellIndex < frozenBalances[owner].length; ++cellIndex) {
            FrozenCell storage checkedCell = frozenBalances[owner][cellIndex];
            if (checkedCell.thawTS == thawTSEncoded && checkedCell.isKYCRequired == isKYCRequiredEncoded)
                break;
        }

        assert(cellIndex <= frozenBalances[owner].length);
    }

    /// @dev Says if the given cell could be spent now
    function isSpendableFrozenCell(address owner, uint cellIndex)
        private
        view
        returns (bool)
    {
        FrozenCell storage cell = frozenBalances[owner][cellIndex];
        if (uint(cell.thawTS) > getTime())
            return false;

        if (0 == cell.amount)   // already spent
            return false;

        if (decodeKYCFlag(cell.isKYCRequired) && !m_KYCProvider.isKYCPassed(owner))
            return false;

        return true;
    }

    /// @dev Internal function to increment or create frozen cell.
    function addFrozen(address _to, uint256 _value, uint thawTS, bool isKYCRequired)
        private
        validAddress(_to)
        validUnixTS(thawTS)
    {
        uint128 thawTSEncoded = uint128(thawTS);
        uint128 isKYCRequiredEncoded = encodeKYCFlag(isKYCRequired);

        uint cellIndex = findFrozenCell(_to, thawTSEncoded, isKYCRequiredEncoded);

        // In case cell is not found - creating new.
        if (cellIndex == frozenBalances[_to].length) {
            frozenBalances[_to].length++;
            targetCell = frozenBalances[_to][cellIndex];
            assert(0 == targetCell.amount);

            targetCell.thawTS = thawTSEncoded;
            targetCell.isKYCRequired = isKYCRequiredEncoded;
        }

        FrozenCell storage targetCell = frozenBalances[_to][cellIndex];
        assert(targetCell.thawTS == thawTSEncoded && targetCell.isKYCRequired == isKYCRequiredEncoded);

        targetCell.amount = targetCell.amount.add(_value);
    }

    /// @dev Internal function to decrement frozen cell.
    function subFrozen(address _from, uint256 _value, uint thawTS, bool isKYCRequired)
        private
        validUnixTS(thawTS)
    {
        uint cellIndex = findFrozenCell(_from, uint128(thawTS), encodeKYCFlag(isKYCRequired));
        require(cellIndex != frozenBalances[_from].length);   // has to be found

        FrozenCell storage cell = frozenBalances[_from][cellIndex];
        require(cell.amount >= _value);

        cell.amount = cell.amount.sub(_value);
    }

    /// @dev Thaws tokens of owner until enough tokens could be spent or no more such tokens found.
    function thawSomeTokens(address owner, uint requiredAmount)
        private
    {
        if (balances[owner] >= requiredAmount)
            return;     // fast path

        // Checking that our goal is reachable before issuing expensive storage modifications.
        require(availableBalanceOf(owner) >= requiredAmount);

        for (uint cellIndex = 0; cellIndex < frozenBalances[owner].length; ++cellIndex) {
            if (isSpendableFrozenCell(owner, cellIndex)) {
                uint amount = frozenBalances[owner][cellIndex].amount;
                frozenBalances[owner][cellIndex].amount = 0;
                balances[owner] = balances[owner].add(amount);
            }
        }

        assert(balances[owner] >= requiredAmount);
    }

    /// @dev to be overridden in tests
    function getTime() internal view returns (uint) {
        return now;
    }

    function encodeKYCFlag(bool isKYCRequired) private pure returns (uint128) {
        return isKYCRequired ? uint128(1) : uint128(0);
    }

    function decodeKYCFlag(uint128 isKYCRequired) private pure returns (bool) {
        return isKYCRequired != uint128(0);
    }


    // FIELDS

    /// @notice current KYC provider of the token
    IKYCProvider public m_KYCProvider;

    /// @notice set of sale accounts which can freeze tokens
    mapping (address => bool) public m_sales;

    /// @notice frozen tokens
    mapping (address => FrozenCell[]) public frozenBalances;

    /// @notice allows privileged functions (token sale phase)
    bool public m_allowPrivileged = true;


    // CONSTANTS

    string public constant name = 'Ethereum wizard';
    string public constant symbol = 'ETHW';
    uint8 public constant decimals = 12;
}

Contract Security Audit

Contract ABI

API
[{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"account","type":"address"},{"name":"isSale","type":"bool"}],"name":"setSale","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_owner","type":"address"}],"name":"removeOwner","outputs":[],"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":"m_allowPrivileged","outputs":[{"name":"","type":"bool"}],"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":"_owner","type":"address"}],"name":"availableBalanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_addr","type":"address"}],"name":"isOwner","outputs":[{"name":"","type":"bool"}],"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":"m_numOwners","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"}],"name":"burn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"amIOwner","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"thawTS","type":"uint256"},{"name":"isKYCRequired","type":"bool"}],"name":"frozenTransfer","outputs":[{"name":"","type":"bool"}],"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":false,"inputs":[{"name":"_owner","type":"address"}],"name":"addOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"}],"name":"frozenCellCount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_multiOwnedRequired","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"uint256"}],"name":"frozenBalances","outputs":[{"name":"amount","type":"uint256"},{"name":"thawTS","type":"uint128"},{"name":"isKYCRequired","type":"uint128"}],"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":"getOwners","outputs":[{"name":"","type":"address[]"}],"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":"","type":"address"}],"name":"m_sales","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_operation","type":"bytes32"}],"name":"revoke","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newRequired","type":"uint256"}],"name":"changeRequirement","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"KYCProvider","type":"address"}],"name":"setKYCProvider","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operation","type":"bytes32"},{"name":"_owner","type":"address"}],"name":"hasConfirmed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"ownerIndex","type":"uint256"}],"name":"getOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","outputs":[],"payable":false,"stateMutability":"nonpayable","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":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"m_KYCProvider","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"thawTS","type":"uint256"},{"name":"isKYCRequired","type":"bool"}],"name":"frozenTransferFrom","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"}],"name":"changeOwner","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"owner","type":"address"},{"name":"index","type":"uint256"}],"name":"frozenCell","outputs":[{"name":"amount","type":"uint256"},{"name":"thawTS","type":"uint256"},{"name":"isKYCRequired","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"disablePrivileged","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":true,"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Burn","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":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Confirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"Revoke","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"owner","type":"address"},{"indexed":false,"name":"operation","type":"bytes32"}],"name":"FinalConfirmation","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"},{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newOwner","type":"address"}],"name":"OwnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"oldOwner","type":"address"}],"name":"OwnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"newRequirement","type":"uint256"}],"name":"RequirementChanged","type":"event"}]

608060405261010b805460ff1916600117905562000025640100000000620001d9810204565b60026000806000845160008111801562000040575060fa8111155b15156200004c57600080fd5b848651600082118015620000605750808211155b15156200006c57600080fd5b8751600155600087815595505b87518610156200013b5787868151811015156200009257fe5b90602001906020020151945084600160a060020a0316600014158015620000ca5750620000c8856401000000006200027b810204565b155b1515620000d657600080fd5b620000ed6001870164010000000062000298810204565b9350846002856101008110620000ff57fe5b018054600160a060020a031916600160a060020a0392831617905585166000908152610102602052604090208490556001959095019462000079565b6200014e640100000000620002b8810204565b50505050505050506830ca024f987b90000061010581905533600081815261010660209081526040808320859055805194855251929391927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9281900390910190a361010554620001cf906000640100000000620022196200030882021704565b610105556200031f565b6040805160028082526060808301845292839291906020830190803883390190505090507346c7736d82470bfe6526d3770351f296f03a5de38160008151811015156200022257fe5b600160a060020a03909216602092830290910190910152805173c96e7a6344b35b9275620c6643ecdac3fa00250690829060019081106200025f57fe5b600160a060020a03909216602092830290910190910152905090565b600160a060020a0316600090815261010260205260408120541190565b60008115801590620002ab575060fa8211155b1515620002b457fe5b5090565b600154600010620002c557fe5b60015460fa1015620002d357fe5b600254600160a060020a031615620002e757fe5b60005415801590620002fd575060015460005411155b15156200030657fe5b565b6000828201838110156200031857fe5b9392505050565b61294c806200032f6000396000f3006080604052600436106101cc5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101d1578063095ea7b31461025b5780631019dc5914610293578063173825d9146102bb57806318160ddd146102dc5780632090b0a81461030357806323b872dd1461031857806325d998bb146103425780632f54bf6e14610363578063313ce567146103845780634123cb6b146103af57806342966c68146103c45780634e4ab830146103dc5780635ab92022146103f1578063661884631461041d5780637065cb481461044157806370a08231146104625780637696f0db14610483578063787d64e4146104a457806380340314146104b957806395d89b4114610505578063a0e67e2b1461051a578063a9059cbb1461057f578063b51fdb9a146105a3578063b75c7dc6146105c4578063ba51a6df146105dc578063c24366f0146105f4578063c2cf732614610615578063c41a360a14610639578063cae9ca511461066d578063d73dd623146106d6578063dd62ed3e146106fa578063e2ba6ce814610721578063ef18e45814610736578063f00d4b5d14610768578063f27a73ca1461078f578063f450cfee146107d3575b600080fd5b3480156101dd57600080fd5b506101e66107e8565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610220578181015183820152602001610208565b50505050905090810190601f16801561024d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026757600080fd5b5061027f600160a060020a036004351660243561081f565b604080519115158252519081900360200190f35b34801561029f57600080fd5b506102b9600160a060020a03600435166024351515610886565b005b3480156102c757600080fd5b506102b9600160a060020a0360043516610906565b3480156102e857600080fd5b506102f1610a62565b60408051918252519081900360200190f35b34801561030f57600080fd5b5061027f610a69565b34801561032457600080fd5b5061027f600160a060020a0360043581169060243516604435610a73565b34801561034e57600080fd5b506102f1600160a060020a0360043516610aa4565b34801561036f57600080fd5b5061027f600160a060020a0360043516610b4e565b34801561039057600080fd5b50610399610b6b565b6040805160ff9092168252519081900360200190f35b3480156103bb57600080fd5b506102f1610b70565b3480156103d057600080fd5b5061027f600435610b76565b3480156103e857600080fd5b5061027f610ba1565b3480156103fd57600080fd5b5061027f600160a060020a03600435166024356044356064351515610bbe565b34801561042957600080fd5b5061027f600160a060020a0360043516602435610d11565b34801561044d57600080fd5b506102b9600160a060020a0360043516610e07565b34801561046e57600080fd5b506102f1600160a060020a0360043516610f2f565b34801561048f57600080fd5b506102f1600160a060020a0360043516610fa0565b3480156104b057600080fd5b506102f1610fbc565b3480156104c557600080fd5b506104dd600160a060020a0360043516602435610fc2565b604080519384526001608060020a039283166020850152911682820152519081900360600190f35b34801561051157600080fd5b506101e661101f565b34801561052657600080fd5b5061052f611056565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561056b578181015183820152602001610553565b505050509050019250505060405180910390f35b34801561058b57600080fd5b5061027f600160a060020a03600435166024356110d5565b3480156105af57600080fd5b5061027f600160a060020a0360043516611102565b3480156105d057600080fd5b506102b9600435611118565b3480156105e857600080fd5b506102b96004356111d8565b34801561060057600080fd5b506102b9600160a060020a0360043516611269565b34801561062157600080fd5b5061027f600435600160a060020a03602435166112ec565b34801561064557600080fd5b50610651600435611341565b60408051600160a060020a039092168252519081900360200190f35b34801561067957600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b9948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506113659650505050505050565b3480156106e257600080fd5b5061027f600160a060020a0360043516602435611474565b34801561070657600080fd5b506102f1600160a060020a036004358116906024351661150f565b34801561072d57600080fd5b5061065161153b565b34801561074257600080fd5b5061027f600160a060020a0360043581169060243516604435606435608435151561154b565b34801561077457600080fd5b506102b9600160a060020a0360043581169060243516611729565b34801561079b57600080fd5b506107b3600160a060020a0360043516602435611861565b604080519384526020840192909252151582820152519081900360600190f35b3480156107df57600080fd5b506102b9611957565b60408051808201909152600f81527f457468657265756d2077697a6172640000000000000000000000000000000000602082015281565b33600081815261010760209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b81600160a060020a038116151561089c57600080fd5b61010b5460ff1615156108ae57600080fd5b6000366040518083838082843782019150509250505060405180910390206108d5816119a4565b1561090057600160a060020a038416600090815261010960205260409020805460ff19168415151790555b50505050565b60008161091281610b4e565b151561091d57600080fd5b6001805403600081118015610933575060fa8111155b151561093e57600080fd5b60005460018054036000821180156109565750808211155b151561096157600080fd5b600036604051808383808284378201915050925050506040518091039020610988816119a4565b15610a5957610995611b5d565b61099d611ba8565b600160a060020a038716600090815261010260205260409020546109c090611c48565b9550600060028761010081106109d257fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055871660009081526101026020526040812055610a14611c66565b610a1c611b5d565b60408051600160a060020a038916815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b50505050505050565b6101055481565b61010b5460ff1681565b6000606036606414610a8457600080fd5b610a8e8584611e07565b610a99858585611f5c565b91505b509392505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610b4357610aeb84826120ca565b15610b3b57600160a060020a038416600090815261010a602052604090208054610b38919083908110610b1a57fe5b6000918252602090912060029091020154839063ffffffff61221916565b91505b600101610ac0565b8192505b5050919050565b600160a060020a0316600090815261010260205260408120541190565b600c81565b60015481565b6000602036602414610b8757600080fd5b610b913384611e07565b610b9a83612228565b9392505050565b6000610bac33610b4e565b1515610bb757600080fd5b5060015b90565b600084600160a060020a0381161515610bd657600080fd5b83635ab895768110158015610bef5750636b49d2008111155b1515610bfa57600080fd5b608036608414610c0957600080fd5b61010b5460ff161515610c1b57600080fd5b33610c258161232a565b1515610c3057600080fd5b33896000610c55610c4083610f2f565b610c4985610f2f565b9063ffffffff61221916565b33600090815261010660205260409020549091508b1115610c7557600080fd5b3360009081526101066020526040902054610c96908c63ffffffff61234916565b3360009081526101066020526040902055610cb38c8c8c8c61235b565b604080518c81529051600160a060020a038e169133916000805160206129018339815191529181900360200190a36001975080610cfb610cf284610f2f565b610c4986610f2f565b14610d0257fe5b50505050505050949350505050565b33600090815261010760209081526040808320600160a060020a038616845290915281205480831115610d685733600090815261010760209081526040808320600160a060020a0388168452909152812055610d9e565b610d78818463ffffffff61234916565b33600090815261010760209081526040808320600160a060020a03891684529091529020555b33600081815261010760209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a3600191505b5092915050565b80610e1181610b4e565b15610e1b57600080fd5b600154600101600081118015610e32575060fa8111155b1515610e3d57600080fd5b600036604051808383808284378201915050925050506040518091039020610e64816119a4565b1561090057610e71611b5d565b610e79611ba8565b6001805481019081905584906002906101008110610e9357fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600154610ecb90611c48565b600160a060020a03851660009081526101026020526040902055610eed611b5d565b60408051600160a060020a038616815290517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c39181900360200190a150505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610b4357600160a060020a038416600090815261010a602052604090208054610f96919083908110610b1a57fe5b9150600101610f4b565b600160a060020a0316600090815261010a602052604090205490565b60005481565b61010a60205281600052604060002081815481101515610fde57fe5b6000918252602090912060029091020180546001909101549092506001608060020a0380821692507001000000000000000000000000000000009091041683565b60408051808201909152600481527f4554485700000000000000000000000000000000000000000000000000000000602082015281565b6060806000600154604051908082528060200260200182016040528015611087578160200160208202803883390190505b509150600090505b6001548110156110cf576110a281611341565b82828151811015156110b057fe5b600160a060020a0390921660209283029091019091015260010161108f565b50919050565b60006040366044146110e657600080fd5b6110f03384611e07565b6110fa8484612529565b949350505050565b6101096020526000908152604090205460ff1681565b60008082611125816125fe565b151561113057600080fd5b61113933610b4e565b151561114457600080fd5b61114d33612613565b600085815261010360205260408120600181015492955093509084161161117357600080fd5b61117c84612642565b81546001908101835582018054849003905561119784612642565b604080513381526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a150505050565b806001546000821180156111ec5750808211155b15156111f757600080fd5b60003660405180838380828437820191505092505050604051809103902061121e816119a4565b15610900576000849055611230611ba8565b6040805185815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a150505050565b80600160a060020a038116151561127f57600080fd5b61010b5460ff16151561129157600080fd5b6000366040518083838082843782019150509250505060405180910390206112b8816119a4565b156112e757610108805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b505050565b6000826112f8816125fe565b151561130357600080fd5b8261130d81610b4e565b151561131857600080fd5b61132184612613565b600086815261010360205260409020600101541615159250505092915050565b6000600260018301610100811061135457fe5b0154600160a060020a031692915050565b61136f838361081f565b151561137a57600080fd5b82600160a060020a031663a2d578533384846040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114125781810151838201526020016113fa565b50505050905090810190601f16801561143f5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561146057600080fd5b505af1158015610a59573d6000803e3d6000fd5b33600090815261010760209081526040808320600160a060020a03861684529091528120546114a9908363ffffffff61221916565b33600081815261010760209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a0391821660009081526101076020908152604080832093909416825291909152205490565b61010854600160a060020a031681565b600084600160a060020a038116151561156357600080fd5b83635ab89576811015801561157c5750636b49d2008111155b151561158757600080fd5b60a03660a41461159657600080fd5b61010b5460ff1615156115a857600080fd5b888860006115b8610c4083610f2f565b90506115c33361232a565b80156115d357506115d38b61232a565b15156115de57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020548a111561160f57600080fd5b600160a060020a038c16600090815261010760209081526040808320338452909152902054611644908b63ffffffff61234916565b600160a060020a038d166000908152610107602090815260408083203384529091529020556116758c8b8b8b612690565b600160a060020a038b166000908152610106602052604090205461169f908b63ffffffff61221916565b61010660008d600160a060020a0316600160a060020a03168152602001908152602001600020819055508a600160a060020a03168c600160a060020a03166000805160206129018339815191528c6040518082815260200191505060405180910390a36001965080611713610cf284610f2f565b1461171a57fe5b50505050505095945050505050565b60008261173581610b4e565b151561174057600080fd5b8261174a81610b4e565b1561175457600080fd5b60003660405180838380828437820191505092505050604051809103902061177b816119a4565b1561185957611788611b5d565b611790611ba8565b600160a060020a038616600090815261010260205260409020546117b390611c48565b93508460028561010081106117c457fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392831617905586811660009081526101026020526040808220829055918716815220849055611813611b5d565b60408051600160a060020a0380891682528716602082015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b505050505050565b600080600061186f85610fa0565b841061187a57600080fd5b600160a060020a038516600090815261010a6020526040902080548590811061189f57fe5b60009182526020808320600290920290910154600160a060020a038816835261010a9091526040909120805491945090859081106118d957fe5b6000918252602080832060016002909302019190910154600160a060020a038816835261010a909152604090912080546001608060020a03909216935061194e918690811061192457fe5b906000526020600020906002020160010160109054906101000a90046001608060020a0316612758565b90509250925092565b61010b5460ff16151561196957600080fd5b600036604051808383808284378201915050925050506040518091039020611990816119a4565b156119a15761010b805460ff191690555b50565b60008060006119b233610b4e565b15156119bd57600080fd5b6101045461020014156119d2576119d2611ba8565b60008481526101036020526040902091506119ec846125fe565b1515611a3f57600080548355600180840191909155610104805491611a1391908301612858565b6002830181905561010480548692908110611a2a57fe5b600091825260209091200155611a3f84612642565b611a4833612613565b90508082600101541660001415610b47578154600010611a6457fe5b815460011415611b00576000848152610103602052604090206002015461010480549091908110611a9157fe5b60009182526020808320909101829055858252610103815260408083208381556001810184905560020192909255815133815290810186905281517f367569357efc39b74a025c4ba1d64068b2b574e3b0d081c48d42f7feeca4cd16929181900390910190a160019250610b47565b815460001901825560018201805482179055611b1b84612642565b604080513381526020810186905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a15050919050565b600154600010611b6957fe5b60015460fa1015611b7657fe5b600254600160a060020a031615611b8957fe5b60005415801590611b9e575060015460005411155b1515611ba657fe5b565b600080611bb433610b4e565b1515611bbf57600080fd5b50506101045460005b81811015611c3757610104805482908110611bdf57fe5b60009182526020909120015415611c2f57610103600061010483815481101515611c0557fe5b60009182526020808320909101548352820192909252604001812081815560018101829055600201555b600101611bc8565b611c44610104600061287c565b5050565b60008115801590611c5a575060fa8211155b1515611c6257fe5b5090565b60015b6001548110156119a1575b60015481108015611c9c57506002816101008110611c8e57fe5b0154600160a060020a031615155b15611ca957600101611c74565b60018054118015611cd357506001546002906101008110611cc657fe5b0154600160a060020a0316155b15611ce75760018054600019019055611ca9565b60015481108015611d1257506001546002906101008110611d0457fe5b0154600160a060020a031615155b8015611d3457506002816101008110611d2757fe5b0154600160a060020a0316155b15611e02576001546002906101008110611d4a57fe5b0154600160a060020a03166002826101008110611d6357fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790558061010260006002836101008110611da357fe5b0154600160a060020a0316815260208101919091526040016000908120919091556001546002906101008110611dd557fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555b611c69565b600160a060020a0382166000908152610106602052604081205481908311611e2e57610900565b82611e3885610aa4565b1015611e4357600080fd5b600091505b600160a060020a038416600090815261010a6020526040902054821015611f3957611e7384836120ca565b15611f2e57600160a060020a038416600090815261010a60205260409020805483908110611e9d57fe5b60009182526020808320600290920290910154600160a060020a038716835261010a9091526040822080549193509084908110611ed657fe5b60009182526020808320600290920290910192909255600160a060020a03861681526101069091526040902054611f13908263ffffffff61221916565b600160a060020a038516600090815261010660205260409020555b816001019150611e48565b600160a060020a0384166000908152610106602052604090205483111561090057fe5b6000600160a060020a0383161515611f7357600080fd5b600160a060020a03841660009081526101066020526040902054821115611f9957600080fd5b600160a060020a038416600090815261010760209081526040808320338452909152902054821115611fca57600080fd5b600160a060020a03841660009081526101066020526040902054611ff4908363ffffffff61234916565b600160a060020a0380861660009081526101066020526040808220939093559085168152205461202a908363ffffffff61221916565b600160a060020a0380851660009081526101066020908152604080832094909455918716815261010782528281203382529091522054612070908363ffffffff61234916565b600160a060020a038086166000818152610107602090815260408083203384528252918290209490945580518681529051928716939192600080516020612901833981519152929181900390910190a35060019392505050565b600160a060020a038216600090815261010a602052604081208054829190849081106120f257fe5b9060005260206000209060020201905061210a612766565b60018201546001608060020a031611156121275760009150610e00565b805415156121385760009150610e00565b60018101546121639070010000000000000000000000000000000090046001608060020a0316612758565b8015612201575061010854604080517fb35be68c000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151919092169163b35be68c9160248083019260209291908290030181600087803b1580156121d357600080fd5b505af11580156121e7573d6000803e3d6000fd5b505050506040513d60208110156121fd57600080fd5b5051155b1561220f5760009150610e00565b5060019392505050565b600082820183811015610b9a57fe5b60003381831161223757600080fd5b600160a060020a0381166000908152610106602052604090205483111561225d57600080fd5b61010554612271908463ffffffff61234916565b61010555600160a060020a0381166000908152610106602052604090205461229f908463ffffffff61234916565b600160a060020a03821660008181526101066020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a2604080518481529051600091600160a060020a038416916000805160206129018339815191529181900360200190a350600192915050565b600160a060020a03166000908152610109602052604090205460ff1690565b60008282111561235557fe5b50900390565b600080808087600160a060020a038116151561237657600080fd5b86635ab89576811015801561238f5750636b49d2008111155b151561239a57600080fd5b8795506123a68761276a565b94506123b38a8787612781565b600160a060020a038b16600090815261010a602052604090205490945084141561248757600160a060020a038a16600090815261010a60205260409020805490612400906001830161289a565b50600160a060020a038a16600090815261010a6020526040902080548590811061242657fe5b6000918252602090912060029091020180549093501561244257fe5b6001830180546001608060020a0387811670010000000000000000000000000000000002818a166fffffffffffffffffffffffffffffffff1990931692909217161790555b600160a060020a038a16600090815261010a602052604090208054859081106124ac57fe5b6000918252602090912060029091020160018101549093506001608060020a038781169116148015612501575060018301546001608060020a0386811670010000000000000000000000000000000090920416145b151561250957fe5b825461251b908a63ffffffff61221916565b909255505050505050505050565b6000600160a060020a038316151561254057600080fd5b336000908152610106602052604090205482111561255d57600080fd5b336000908152610106602052604090205461257e908363ffffffff61234916565b336000908152610106602052604080822092909255600160a060020a038516815220546125b1908363ffffffff61221916565b600160a060020a038416600081815261010660209081526040918290209390935580518581529051919233926000805160206129018339815191529281900390910190a350600192915050565b60009081526101036020526040902054151590565b600160a060020a03811660009081526101026020526040812054819061263890611c48565b60020a9392505050565b6000818152610103602052604090208054151561265b57fe5b60028101546101048054849290811061267057fe5b6000918252602090912001541461268357fe5b60005481541115611c4457fe5b60008083635ab8957681101580156126ac5750636b49d2008111155b15156126b757600080fd5b6126ca87866126c58761276a565b612781565b600160a060020a038816600090815261010a60205260409020549093508314156126f357600080fd5b600160a060020a038716600090815261010a6020526040902080548490811061271857fe5b906000526020600020906002020191508582600001541015151561273b57600080fd5b815461274d908763ffffffff61234916565b909155505050505050565b6001608060020a0316151590565b4290565b60008161277857600061277b565b60015b92915050565b6000805b600160a060020a038516600090815261010a602052604090205482101561283557600160a060020a038516600090815261010a602052604090208054839081106127cb57fe5b6000918252602090912060029091020160018101549091506001608060020a038581169116148015612820575060018101546001608060020a0384811670010000000000000000000000000000000090920416145b1561282a57612835565b816001019150612785565b600160a060020a038516600090815261010a6020526040902054821115610a9c57fe5b8154818355818111156112e7576000838152602090206112e79181019083016128c6565b50805460008255906000526020600020908101906119a191906128c6565b8154818355818111156112e7576002028160020283600052602060002091820191016112e791906128e0565b610bbb91905b80821115611c6257600081556001016128cc565b610bbb91905b80821115611c6257600080825560018201556002016128e65600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820bc16149cfb99bf347b0d883bfcc8b726fdda7b31dea0ab5a86bb59e4a6e0e5f40029

Deployed Bytecode

0x6080604052600436106101cc5763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166306fdde0381146101d1578063095ea7b31461025b5780631019dc5914610293578063173825d9146102bb57806318160ddd146102dc5780632090b0a81461030357806323b872dd1461031857806325d998bb146103425780632f54bf6e14610363578063313ce567146103845780634123cb6b146103af57806342966c68146103c45780634e4ab830146103dc5780635ab92022146103f1578063661884631461041d5780637065cb481461044157806370a08231146104625780637696f0db14610483578063787d64e4146104a457806380340314146104b957806395d89b4114610505578063a0e67e2b1461051a578063a9059cbb1461057f578063b51fdb9a146105a3578063b75c7dc6146105c4578063ba51a6df146105dc578063c24366f0146105f4578063c2cf732614610615578063c41a360a14610639578063cae9ca511461066d578063d73dd623146106d6578063dd62ed3e146106fa578063e2ba6ce814610721578063ef18e45814610736578063f00d4b5d14610768578063f27a73ca1461078f578063f450cfee146107d3575b600080fd5b3480156101dd57600080fd5b506101e66107e8565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610220578181015183820152602001610208565b50505050905090810190601f16801561024d5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561026757600080fd5b5061027f600160a060020a036004351660243561081f565b604080519115158252519081900360200190f35b34801561029f57600080fd5b506102b9600160a060020a03600435166024351515610886565b005b3480156102c757600080fd5b506102b9600160a060020a0360043516610906565b3480156102e857600080fd5b506102f1610a62565b60408051918252519081900360200190f35b34801561030f57600080fd5b5061027f610a69565b34801561032457600080fd5b5061027f600160a060020a0360043581169060243516604435610a73565b34801561034e57600080fd5b506102f1600160a060020a0360043516610aa4565b34801561036f57600080fd5b5061027f600160a060020a0360043516610b4e565b34801561039057600080fd5b50610399610b6b565b6040805160ff9092168252519081900360200190f35b3480156103bb57600080fd5b506102f1610b70565b3480156103d057600080fd5b5061027f600435610b76565b3480156103e857600080fd5b5061027f610ba1565b3480156103fd57600080fd5b5061027f600160a060020a03600435166024356044356064351515610bbe565b34801561042957600080fd5b5061027f600160a060020a0360043516602435610d11565b34801561044d57600080fd5b506102b9600160a060020a0360043516610e07565b34801561046e57600080fd5b506102f1600160a060020a0360043516610f2f565b34801561048f57600080fd5b506102f1600160a060020a0360043516610fa0565b3480156104b057600080fd5b506102f1610fbc565b3480156104c557600080fd5b506104dd600160a060020a0360043516602435610fc2565b604080519384526001608060020a039283166020850152911682820152519081900360600190f35b34801561051157600080fd5b506101e661101f565b34801561052657600080fd5b5061052f611056565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561056b578181015183820152602001610553565b505050509050019250505060405180910390f35b34801561058b57600080fd5b5061027f600160a060020a03600435166024356110d5565b3480156105af57600080fd5b5061027f600160a060020a0360043516611102565b3480156105d057600080fd5b506102b9600435611118565b3480156105e857600080fd5b506102b96004356111d8565b34801561060057600080fd5b506102b9600160a060020a0360043516611269565b34801561062157600080fd5b5061027f600435600160a060020a03602435166112ec565b34801561064557600080fd5b50610651600435611341565b60408051600160a060020a039092168252519081900360200190f35b34801561067957600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b9948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506113659650505050505050565b3480156106e257600080fd5b5061027f600160a060020a0360043516602435611474565b34801561070657600080fd5b506102f1600160a060020a036004358116906024351661150f565b34801561072d57600080fd5b5061065161153b565b34801561074257600080fd5b5061027f600160a060020a0360043581169060243516604435606435608435151561154b565b34801561077457600080fd5b506102b9600160a060020a0360043581169060243516611729565b34801561079b57600080fd5b506107b3600160a060020a0360043516602435611861565b604080519384526020840192909252151582820152519081900360600190f35b3480156107df57600080fd5b506102b9611957565b60408051808201909152600f81527f457468657265756d2077697a6172640000000000000000000000000000000000602082015281565b33600081815261010760209081526040808320600160a060020a038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b81600160a060020a038116151561089c57600080fd5b61010b5460ff1615156108ae57600080fd5b6000366040518083838082843782019150509250505060405180910390206108d5816119a4565b1561090057600160a060020a038416600090815261010960205260409020805460ff19168415151790555b50505050565b60008161091281610b4e565b151561091d57600080fd5b6001805403600081118015610933575060fa8111155b151561093e57600080fd5b60005460018054036000821180156109565750808211155b151561096157600080fd5b600036604051808383808284378201915050925050506040518091039020610988816119a4565b15610a5957610995611b5d565b61099d611ba8565b600160a060020a038716600090815261010260205260409020546109c090611c48565b9550600060028761010081106109d257fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03928316179055871660009081526101026020526040812055610a14611c66565b610a1c611b5d565b60408051600160a060020a038916815290517f58619076adf5bb0943d100ef88d52d7c3fd691b19d3a9071b555b651fbf418da9181900360200190a15b50505050505050565b6101055481565b61010b5460ff1681565b6000606036606414610a8457600080fd5b610a8e8584611e07565b610a99858585611f5c565b91505b509392505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610b4357610aeb84826120ca565b15610b3b57600160a060020a038416600090815261010a602052604090208054610b38919083908110610b1a57fe5b6000918252602090912060029091020154839063ffffffff61221916565b91505b600101610ac0565b8192505b5050919050565b600160a060020a0316600090815261010260205260408120541190565b600c81565b60015481565b6000602036602414610b8757600080fd5b610b913384611e07565b610b9a83612228565b9392505050565b6000610bac33610b4e565b1515610bb757600080fd5b5060015b90565b600084600160a060020a0381161515610bd657600080fd5b83635ab895768110158015610bef5750636b49d2008111155b1515610bfa57600080fd5b608036608414610c0957600080fd5b61010b5460ff161515610c1b57600080fd5b33610c258161232a565b1515610c3057600080fd5b33896000610c55610c4083610f2f565b610c4985610f2f565b9063ffffffff61221916565b33600090815261010660205260409020549091508b1115610c7557600080fd5b3360009081526101066020526040902054610c96908c63ffffffff61234916565b3360009081526101066020526040902055610cb38c8c8c8c61235b565b604080518c81529051600160a060020a038e169133916000805160206129018339815191529181900360200190a36001975080610cfb610cf284610f2f565b610c4986610f2f565b14610d0257fe5b50505050505050949350505050565b33600090815261010760209081526040808320600160a060020a038616845290915281205480831115610d685733600090815261010760209081526040808320600160a060020a0388168452909152812055610d9e565b610d78818463ffffffff61234916565b33600090815261010760209081526040808320600160a060020a03891684529091529020555b33600081815261010760209081526040808320600160a060020a0389168085529083529281902054815190815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a3600191505b5092915050565b80610e1181610b4e565b15610e1b57600080fd5b600154600101600081118015610e32575060fa8111155b1515610e3d57600080fd5b600036604051808383808284378201915050925050506040518091039020610e64816119a4565b1561090057610e71611b5d565b610e79611ba8565b6001805481019081905584906002906101008110610e9357fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055600154610ecb90611c48565b600160a060020a03851660009081526101026020526040902055610eed611b5d565b60408051600160a060020a038616815290517f994a936646fe87ffe4f1e469d3d6aa417d6b855598397f323de5b449f765f0c39181900360200190a150505050565b600160a060020a03811660009081526101066020526040812054815b600160a060020a038416600090815261010a6020526040902054811015610b4357600160a060020a038416600090815261010a602052604090208054610f96919083908110610b1a57fe5b9150600101610f4b565b600160a060020a0316600090815261010a602052604090205490565b60005481565b61010a60205281600052604060002081815481101515610fde57fe5b6000918252602090912060029091020180546001909101549092506001608060020a0380821692507001000000000000000000000000000000009091041683565b60408051808201909152600481527f4554485700000000000000000000000000000000000000000000000000000000602082015281565b6060806000600154604051908082528060200260200182016040528015611087578160200160208202803883390190505b509150600090505b6001548110156110cf576110a281611341565b82828151811015156110b057fe5b600160a060020a0390921660209283029091019091015260010161108f565b50919050565b60006040366044146110e657600080fd5b6110f03384611e07565b6110fa8484612529565b949350505050565b6101096020526000908152604090205460ff1681565b60008082611125816125fe565b151561113057600080fd5b61113933610b4e565b151561114457600080fd5b61114d33612613565b600085815261010360205260408120600181015492955093509084161161117357600080fd5b61117c84612642565b81546001908101835582018054849003905561119784612642565b604080513381526020810186905281517fc7fb647e59b18047309aa15aad418e5d7ca96d173ad704f1031a2c3d7591734b929181900390910190a150505050565b806001546000821180156111ec5750808211155b15156111f757600080fd5b60003660405180838380828437820191505092505050604051809103902061121e816119a4565b15610900576000849055611230611ba8565b6040805185815290517facbdb084c721332ac59f9b8e392196c9eb0e4932862da8eb9beaf0dad4f550da9181900360200190a150505050565b80600160a060020a038116151561127f57600080fd5b61010b5460ff16151561129157600080fd5b6000366040518083838082843782019150509250505060405180910390206112b8816119a4565b156112e757610108805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0385161790555b505050565b6000826112f8816125fe565b151561130357600080fd5b8261130d81610b4e565b151561131857600080fd5b61132184612613565b600086815261010360205260409020600101541615159250505092915050565b6000600260018301610100811061135457fe5b0154600160a060020a031692915050565b61136f838361081f565b151561137a57600080fd5b82600160a060020a031663a2d578533384846040518463ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018084600160a060020a0316600160a060020a0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156114125781810151838201526020016113fa565b50505050905090810190601f16801561143f5780820380516001836020036101000a031916815260200191505b50945050505050600060405180830381600087803b15801561146057600080fd5b505af1158015610a59573d6000803e3d6000fd5b33600090815261010760209081526040808320600160a060020a03861684529091528120546114a9908363ffffffff61221916565b33600081815261010760209081526040808320600160a060020a0389168085529083529281902085905580519485525191937f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929081900390910190a350600192915050565b600160a060020a0391821660009081526101076020908152604080832093909416825291909152205490565b61010854600160a060020a031681565b600084600160a060020a038116151561156357600080fd5b83635ab89576811015801561157c5750636b49d2008111155b151561158757600080fd5b60a03660a41461159657600080fd5b61010b5460ff1615156115a857600080fd5b888860006115b8610c4083610f2f565b90506115c33361232a565b80156115d357506115d38b61232a565b15156115de57600080fd5b600160a060020a038c166000908152610107602090815260408083203384529091529020548a111561160f57600080fd5b600160a060020a038c16600090815261010760209081526040808320338452909152902054611644908b63ffffffff61234916565b600160a060020a038d166000908152610107602090815260408083203384529091529020556116758c8b8b8b612690565b600160a060020a038b166000908152610106602052604090205461169f908b63ffffffff61221916565b61010660008d600160a060020a0316600160a060020a03168152602001908152602001600020819055508a600160a060020a03168c600160a060020a03166000805160206129018339815191528c6040518082815260200191505060405180910390a36001965080611713610cf284610f2f565b1461171a57fe5b50505050505095945050505050565b60008261173581610b4e565b151561174057600080fd5b8261174a81610b4e565b1561175457600080fd5b60003660405180838380828437820191505092505050604051809103902061177b816119a4565b1561185957611788611b5d565b611790611ba8565b600160a060020a038616600090815261010260205260409020546117b390611c48565b93508460028561010081106117c457fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392831617905586811660009081526101026020526040808220829055918716815220849055611813611b5d565b60408051600160a060020a0380891682528716602082015281517fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c929181900390910190a15b505050505050565b600080600061186f85610fa0565b841061187a57600080fd5b600160a060020a038516600090815261010a6020526040902080548590811061189f57fe5b60009182526020808320600290920290910154600160a060020a038816835261010a9091526040909120805491945090859081106118d957fe5b6000918252602080832060016002909302019190910154600160a060020a038816835261010a909152604090912080546001608060020a03909216935061194e918690811061192457fe5b906000526020600020906002020160010160109054906101000a90046001608060020a0316612758565b90509250925092565b61010b5460ff16151561196957600080fd5b600036604051808383808284378201915050925050506040518091039020611990816119a4565b156119a15761010b805460ff191690555b50565b60008060006119b233610b4e565b15156119bd57600080fd5b6101045461020014156119d2576119d2611ba8565b60008481526101036020526040902091506119ec846125fe565b1515611a3f57600080548355600180840191909155610104805491611a1391908301612858565b6002830181905561010480548692908110611a2a57fe5b600091825260209091200155611a3f84612642565b611a4833612613565b90508082600101541660001415610b47578154600010611a6457fe5b815460011415611b00576000848152610103602052604090206002015461010480549091908110611a9157fe5b60009182526020808320909101829055858252610103815260408083208381556001810184905560020192909255815133815290810186905281517f367569357efc39b74a025c4ba1d64068b2b574e3b0d081c48d42f7feeca4cd16929181900390910190a160019250610b47565b815460001901825560018201805482179055611b1b84612642565b604080513381526020810186905281517fe1c52dc63b719ade82e8bea94cc41a0d5d28e4aaf536adb5e9cccc9ff8c1aeda929181900390910190a15050919050565b600154600010611b6957fe5b60015460fa1015611b7657fe5b600254600160a060020a031615611b8957fe5b60005415801590611b9e575060015460005411155b1515611ba657fe5b565b600080611bb433610b4e565b1515611bbf57600080fd5b50506101045460005b81811015611c3757610104805482908110611bdf57fe5b60009182526020909120015415611c2f57610103600061010483815481101515611c0557fe5b60009182526020808320909101548352820192909252604001812081815560018101829055600201555b600101611bc8565b611c44610104600061287c565b5050565b60008115801590611c5a575060fa8211155b1515611c6257fe5b5090565b60015b6001548110156119a1575b60015481108015611c9c57506002816101008110611c8e57fe5b0154600160a060020a031615155b15611ca957600101611c74565b60018054118015611cd357506001546002906101008110611cc657fe5b0154600160a060020a0316155b15611ce75760018054600019019055611ca9565b60015481108015611d1257506001546002906101008110611d0457fe5b0154600160a060020a031615155b8015611d3457506002816101008110611d2757fe5b0154600160a060020a0316155b15611e02576001546002906101008110611d4a57fe5b0154600160a060020a03166002826101008110611d6357fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790558061010260006002836101008110611da357fe5b0154600160a060020a0316815260208101919091526040016000908120919091556001546002906101008110611dd557fe5b01805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555b611c69565b600160a060020a0382166000908152610106602052604081205481908311611e2e57610900565b82611e3885610aa4565b1015611e4357600080fd5b600091505b600160a060020a038416600090815261010a6020526040902054821015611f3957611e7384836120ca565b15611f2e57600160a060020a038416600090815261010a60205260409020805483908110611e9d57fe5b60009182526020808320600290920290910154600160a060020a038716835261010a9091526040822080549193509084908110611ed657fe5b60009182526020808320600290920290910192909255600160a060020a03861681526101069091526040902054611f13908263ffffffff61221916565b600160a060020a038516600090815261010660205260409020555b816001019150611e48565b600160a060020a0384166000908152610106602052604090205483111561090057fe5b6000600160a060020a0383161515611f7357600080fd5b600160a060020a03841660009081526101066020526040902054821115611f9957600080fd5b600160a060020a038416600090815261010760209081526040808320338452909152902054821115611fca57600080fd5b600160a060020a03841660009081526101066020526040902054611ff4908363ffffffff61234916565b600160a060020a0380861660009081526101066020526040808220939093559085168152205461202a908363ffffffff61221916565b600160a060020a0380851660009081526101066020908152604080832094909455918716815261010782528281203382529091522054612070908363ffffffff61234916565b600160a060020a038086166000818152610107602090815260408083203384528252918290209490945580518681529051928716939192600080516020612901833981519152929181900390910190a35060019392505050565b600160a060020a038216600090815261010a602052604081208054829190849081106120f257fe5b9060005260206000209060020201905061210a612766565b60018201546001608060020a031611156121275760009150610e00565b805415156121385760009150610e00565b60018101546121639070010000000000000000000000000000000090046001608060020a0316612758565b8015612201575061010854604080517fb35be68c000000000000000000000000000000000000000000000000000000008152600160a060020a0387811660048301529151919092169163b35be68c9160248083019260209291908290030181600087803b1580156121d357600080fd5b505af11580156121e7573d6000803e3d6000fd5b505050506040513d60208110156121fd57600080fd5b5051155b1561220f5760009150610e00565b5060019392505050565b600082820183811015610b9a57fe5b60003381831161223757600080fd5b600160a060020a0381166000908152610106602052604090205483111561225d57600080fd5b61010554612271908463ffffffff61234916565b61010555600160a060020a0381166000908152610106602052604090205461229f908463ffffffff61234916565b600160a060020a03821660008181526101066020908152604091829020939093558051868152905191927fcc16f5dbb4873280815c1ee09dbd06736cffcc184412cf7a71a0fdb75d397ca592918290030190a2604080518481529051600091600160a060020a038416916000805160206129018339815191529181900360200190a350600192915050565b600160a060020a03166000908152610109602052604090205460ff1690565b60008282111561235557fe5b50900390565b600080808087600160a060020a038116151561237657600080fd5b86635ab89576811015801561238f5750636b49d2008111155b151561239a57600080fd5b8795506123a68761276a565b94506123b38a8787612781565b600160a060020a038b16600090815261010a602052604090205490945084141561248757600160a060020a038a16600090815261010a60205260409020805490612400906001830161289a565b50600160a060020a038a16600090815261010a6020526040902080548590811061242657fe5b6000918252602090912060029091020180549093501561244257fe5b6001830180546001608060020a0387811670010000000000000000000000000000000002818a166fffffffffffffffffffffffffffffffff1990931692909217161790555b600160a060020a038a16600090815261010a602052604090208054859081106124ac57fe5b6000918252602090912060029091020160018101549093506001608060020a038781169116148015612501575060018301546001608060020a0386811670010000000000000000000000000000000090920416145b151561250957fe5b825461251b908a63ffffffff61221916565b909255505050505050505050565b6000600160a060020a038316151561254057600080fd5b336000908152610106602052604090205482111561255d57600080fd5b336000908152610106602052604090205461257e908363ffffffff61234916565b336000908152610106602052604080822092909255600160a060020a038516815220546125b1908363ffffffff61221916565b600160a060020a038416600081815261010660209081526040918290209390935580518581529051919233926000805160206129018339815191529281900390910190a350600192915050565b60009081526101036020526040902054151590565b600160a060020a03811660009081526101026020526040812054819061263890611c48565b60020a9392505050565b6000818152610103602052604090208054151561265b57fe5b60028101546101048054849290811061267057fe5b6000918252602090912001541461268357fe5b60005481541115611c4457fe5b60008083635ab8957681101580156126ac5750636b49d2008111155b15156126b757600080fd5b6126ca87866126c58761276a565b612781565b600160a060020a038816600090815261010a60205260409020549093508314156126f357600080fd5b600160a060020a038716600090815261010a6020526040902080548490811061271857fe5b906000526020600020906002020191508582600001541015151561273b57600080fd5b815461274d908763ffffffff61234916565b909155505050505050565b6001608060020a0316151590565b4290565b60008161277857600061277b565b60015b92915050565b6000805b600160a060020a038516600090815261010a602052604090205482101561283557600160a060020a038516600090815261010a602052604090208054839081106127cb57fe5b6000918252602090912060029091020160018101549091506001608060020a038581169116148015612820575060018101546001608060020a0384811670010000000000000000000000000000000090920416145b1561282a57612835565b816001019150612785565b600160a060020a038516600090815261010a6020526040902054821115610a9c57fe5b8154818355818111156112e7576000838152602090206112e79181019083016128c6565b50805460008255906000526020600020908101906119a191906128c6565b8154818355818111156112e7576002028160020283600052602060002091820191016112e791906128e0565b610bbb91905b80821115611c6257600081556001016128cc565b610bbb91905b80821115611c6257600080825560018201556002016128e65600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a72305820bc16149cfb99bf347b0d883bfcc8b726fdda7b31dea0ab5a86bb59e4a6e0e5f40029

Swarm Source

bzzr://bc16149cfb99bf347b0d883bfcc8b726fdda7b31dea0ab5a86bb59e4a6e0e5f4

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.