ETH Price: $2,279.01 (+1.57%)

Token

Ethereum wizard (ETHW)
 

Overview

Max Total Supply

698,999,999.999900000001 ETHW

Holders

214

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 12 Decimals)

Balance
4,500 ETHW

Value
$0.00
0xfe4516415cdd802570074694ad77c1021a9000ce
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

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

[{"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
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.