ETH Price: $3,482.96 (+0.99%)

Token

ORCA Token (ORCA)
 

Overview

Max Total Supply

293,310,823.00000000000006 ORCA

Holders

1,565 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
11,017 ORCA

Value
$0.00
0x8d5a9bbdf1ee8e974000dec395c73d3ce8a205b2
Loading...
Loading
Loading...
Loading
Loading...
Loading

ICO Information

ICO Start Date : 2018-08-06  
ICO End Date : 2018-09-06
Hard Cap : $9 800 000
Bonus : 20% - 0%
Country : Estonia

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
OrcaToken

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-08-05
*/

pragma solidity ^0.4.24;

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

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

  /**
  * @dev Multiplies two numbers, throws on overflow.
  */
  function mul(uint256 a, uint256 b) internal pure returns (uint256 c) {
    // Gas optimization: this is cheaper than asserting 'a' not being zero, but the
    // benefit is lost if 'b' is also tested.
    // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522
    if (a == 0) {
      return 0;
    }

    c = a * b;
    assert(c / a == b);
    return c;
  }

  /**
  * @dev Integer division of two numbers, truncating the quotient.
  */
  function div(uint256 a, uint256 b) internal pure returns (uint256) {
    // assert(b > 0); // Solidity automatically throws when dividing by 0
    // uint256 c = a / b;
    // assert(a == b * c + a % b); // There is no case in which this doesn't hold
    return a / b;
  }

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

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

// File: openzeppelin-solidity/contracts/ownership/Ownable.sol

/**
 * @title Ownable
 * @dev The Ownable contract has an owner address, and provides basic authorization control
 * functions, this simplifies the implementation of "user permissions".
 */
contract Ownable {
  address public owner;


  event OwnershipRenounced(address indexed previousOwner);
  event OwnershipTransferred(
    address indexed previousOwner,
    address indexed newOwner
  );


  /**
   * @dev The Ownable constructor sets the original `owner` of the contract to the sender
   * account.
   */
  constructor() public {
    owner = msg.sender;
  }

  /**
   * @dev Throws if called by any account other than the owner.
   */
  modifier onlyOwner() {
    require(msg.sender == owner);
    _;
  }

  /**
   * @dev Allows the current owner to relinquish control of the contract.
   * @notice Renouncing to ownership will leave the contract without an owner.
   * It will not be possible to call the functions with the `onlyOwner`
   * modifier anymore.
   */
  function renounceOwnership() public onlyOwner {
    emit OwnershipRenounced(owner);
    owner = address(0);
  }

  /**
   * @dev Allows the current owner to transfer control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function transferOwnership(address _newOwner) public onlyOwner {
    _transferOwnership(_newOwner);
  }

  /**
   * @dev Transfers control of the contract to a newOwner.
   * @param _newOwner The address to transfer ownership to.
   */
  function _transferOwnership(address _newOwner) internal {
    require(_newOwner != address(0));
    emit OwnershipTransferred(owner, _newOwner);
    owner = _newOwner;
  }
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20Basic.sol

/**
 * @title ERC20Basic
 * @dev Simpler version of ERC20 interface
 * See https://github.com/ethereum/EIPs/issues/179
 */
contract ERC20Basic {
  function totalSupply() public view returns (uint256);
  function balanceOf(address who) public view returns (uint256);
  function transfer(address to, uint256 value) public returns (bool);
  event Transfer(address indexed from, address indexed to, uint256 value);
}

// File: openzeppelin-solidity/contracts/token/ERC20/ERC20.sol

/**
 * @title ERC20 interface
 * @dev see https://github.com/ethereum/EIPs/issues/20
 */
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
  );
}

// File: openzeppelin-solidity/contracts/token/ERC20/SafeERC20.sol

/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure.
 * To use this library you can add a `using SafeERC20 for ERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
  function safeTransfer(ERC20Basic token, address to, uint256 value) internal {
    require(token.transfer(to, value));
  }

  function safeTransferFrom(
    ERC20 token,
    address from,
    address to,
    uint256 value
  )
    internal
  {
    require(token.transferFrom(from, to, value));
  }

  function safeApprove(ERC20 token, address spender, uint256 value) internal {
    require(token.approve(spender, value));
  }
}

// Custom contracts developed or adapted for OrcaToken
// ---------------------------------------------------

contract TokenRecoverable is Ownable {
    using SafeERC20 for ERC20Basic;

    function recoverTokens(ERC20Basic token, address to, uint256 amount) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        require(balance >= amount);
        token.safeTransfer(to, amount);
    }
}

// File: contracts/eip820/contracts/ERC820Implementer.sol

contract ERC820Registry {
    function getManager(address addr) public view returns(address);
    function setManager(address addr, address newManager) public;
    function getInterfaceImplementer(address addr, bytes32 iHash) public constant returns (address);
    function setInterfaceImplementer(address addr, bytes32 iHash, address implementer) public;
}


contract ERC820Implementer {
    ERC820Registry erc820Registry = ERC820Registry(0x991a1bcb077599290d7305493c9A630c20f8b798);

    function setInterfaceImplementation(string ifaceLabel, address impl) internal {
        bytes32 ifaceHash = keccak256(abi.encodePacked(ifaceLabel));
        erc820Registry.setInterfaceImplementer(this, ifaceHash, impl);
    }

    function interfaceAddr(address addr, string ifaceLabel) internal constant returns(address) {
        bytes32 ifaceHash = keccak256(abi.encodePacked(ifaceLabel));
        return erc820Registry.getInterfaceImplementer(addr, ifaceHash);
    }

    function delegateManagement(address newManager) internal {
        erc820Registry.setManager(this, newManager);
    }
}

contract ERC20Token {
    function name() public view returns (string);
    function symbol() public view returns (string);
    function decimals() public view returns (uint8);
    function totalSupply() public view returns (uint256);
    function balanceOf(address owner) public view returns (uint256);
    function transfer(address to, uint256 amount) public returns (bool);
    function transferFrom(address from, address to, uint256 amount) public returns (bool);
    function approve(address spender, uint256 amount) public returns (bool);
    function allowance(address owner, address spender) public view returns (uint256);

    // solhint-disable-next-line no-simple-event-func-name
    event Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
}

contract ERC777Token {
    function name() public view returns (string);
    function symbol() public view returns (string);
    function totalSupply() public view returns (uint256);
    function balanceOf(address owner) public view returns (uint256);
    function granularity() public view returns (uint256);

    function defaultOperators() public view returns (address[]);
    function isOperatorFor(address operator, address tokenHolder) public view returns (bool);
    function authorizeOperator(address operator) public;
    function revokeOperator(address operator) public;

    function send(address to, uint256 amount, bytes holderData) public;
    function operatorSend(address from, address to, uint256 amount, bytes holderData, bytes operatorData) public;

    function burn(uint256 amount, bytes holderData) public;
    function operatorBurn(address from, uint256 amount, bytes holderData, bytes operatorData) public;

    event Sent(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256 amount,
        bytes holderData,
        bytes operatorData
    ); // solhint-disable-next-line separate-by-one-line-in-contract
    event Minted(address indexed operator, address indexed to, uint256 amount, bytes operatorData);
    event Burned(address indexed operator, address indexed from, uint256 amount, bytes holderData, bytes operatorData);
    event AuthorizedOperator(address indexed operator, address indexed tokenHolder);
    event RevokedOperator(address indexed operator, address indexed tokenHolder);
}

contract ERC777TokensRecipient {
    function tokensReceived(
        address operator,
        address from,
        address to,
        uint amount,
        bytes userData,
        bytes operatorData
    ) public;
}

contract ERC777TokensSender {
    function tokensToSend(
        address operator,
        address from,
        address to,
        uint amount,
        bytes userData,
        bytes operatorData
    ) public;
}

contract ERC777BaseToken is ERC777Token, ERC820Implementer {
    using SafeMath for uint256;

    string internal mName;
    string internal mSymbol;
    uint256 internal mGranularity;
    uint256 internal mTotalSupply;


    mapping(address => uint) internal mBalances;
    mapping(address => mapping(address => bool)) internal mAuthorized;

    address[] internal mDefaultOperators;
    mapping(address => bool) internal mIsDefaultOperator;
    mapping(address => mapping(address => bool)) internal mRevokedDefaultOperator;

    /* -- Constructor -- */
    //
    /// @notice Constructor to create a ReferenceToken
    /// @param _name Name of the new token
    /// @param _symbol Symbol of the new token.
    /// @param _granularity Minimum transferable chunk.
    constructor(string _name, string _symbol, uint256 _granularity, address[] _defaultOperators) internal {
        mName = _name;
        mSymbol = _symbol;
        mTotalSupply = 0;
        require(_granularity >= 1);
        mGranularity = _granularity;

        mDefaultOperators = _defaultOperators;
        for (uint i = 0; i < mDefaultOperators.length; i++) { mIsDefaultOperator[mDefaultOperators[i]] = true; }

        setInterfaceImplementation("ERC777Token", this);
    }

    /* -- ERC777 Interface Implementation -- */
    //
    /// @return the name of the token
    function name() public constant returns (string) { return mName; }

    /// @return the symbol of the token
    function symbol() public constant returns (string) { return mSymbol; }

    /// @return the granularity of the token
    function granularity() public constant returns (uint256) { return mGranularity; }

    /// @return the total supply of the token
    function totalSupply() public constant returns (uint256) { return mTotalSupply; }

    /// @notice Return the account balance of some account
    /// @param _tokenHolder Address for which the balance is returned
    /// @return the balance of `_tokenAddress`.
    function balanceOf(address _tokenHolder) public constant returns (uint256) { return mBalances[_tokenHolder]; }

    /// @notice Return the list of default operators
    /// @return the list of all the default operators
    function defaultOperators() public view returns (address[]) { return mDefaultOperators; }

    /// @notice Send `_amount` of tokens to address `_to` passing `_userData` to the recipient
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be sent
    function send(address _to, uint256 _amount, bytes _userData) public {
        doSend(msg.sender, msg.sender, _to, _amount, _userData, "", true);
    }

    /// @notice Authorize a third party `_operator` to manage (send) `msg.sender`'s tokens.
    /// @param _operator The operator that wants to be Authorized
    function authorizeOperator(address _operator) public {
        require(_operator != msg.sender);
        if (mIsDefaultOperator[_operator]) {
            mRevokedDefaultOperator[_operator][msg.sender] = false;
        } else {
            mAuthorized[_operator][msg.sender] = true;
        }
        emit AuthorizedOperator(_operator, msg.sender);
    }

    /// @notice Revoke a third party `_operator`'s rights to manage (send) `msg.sender`'s tokens.
    /// @param _operator The operator that wants to be Revoked
    function revokeOperator(address _operator) public {
        require(_operator != msg.sender);
        if (mIsDefaultOperator[_operator]) {
            mRevokedDefaultOperator[_operator][msg.sender] = true;
        } else {
            mAuthorized[_operator][msg.sender] = false;
        }
        emit RevokedOperator(_operator, msg.sender);
    }

    /// @notice Check whether the `_operator` address is allowed to manage the tokens held by `_tokenHolder` address.
    /// @param _operator address to check if it has the right to manage the tokens
    /// @param _tokenHolder address which holds the tokens to be managed
    /// @return `true` if `_operator` is authorized for `_tokenHolder`
    function isOperatorFor(address _operator, address _tokenHolder) public constant returns (bool) {
        return (_operator == _tokenHolder
            || mAuthorized[_operator][_tokenHolder]
            || (mIsDefaultOperator[_operator] && !mRevokedDefaultOperator[_operator][_tokenHolder]));
    }

    /// @notice Send `_amount` of tokens on behalf of the address `from` to the address `to`.
    /// @param _from The address holding the tokens being sent
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be sent
    /// @param _userData Data generated by the user to be sent to the recipient
    /// @param _operatorData Data generated by the operator to be sent to the recipient
    function operatorSend(address _from, address _to, uint256 _amount, bytes _userData, bytes _operatorData) public {
        require(isOperatorFor(msg.sender, _from));
        doSend(msg.sender, _from, _to, _amount, _userData, _operatorData, true);
    }

    function burn(uint256 _amount, bytes _holderData) public {
        doBurn(msg.sender, msg.sender, _amount, _holderData, "");
    }

    function operatorBurn(address _tokenHolder, uint256 _amount, bytes _holderData, bytes _operatorData) public {
        require(isOperatorFor(msg.sender, _tokenHolder));
        doBurn(msg.sender, _tokenHolder, _amount, _holderData, _operatorData);
    }

    /* -- Helper Functions -- */
    //
    /// @notice Internal function that ensures `_amount` is multiple of the granularity
    /// @param _amount The quantity that want's to be checked
    function requireMultiple(uint256 _amount) internal view {
        require(_amount.div(mGranularity).mul(mGranularity) == _amount);
    }

    /// @notice Check whether an address is a regular address or not.
    /// @param _addr Address of the contract that has to be checked
    /// @return `true` if `_addr` is a regular address (not a contract)
    function isRegularAddress(address _addr) internal constant returns(bool) {
        if (_addr == 0) { return false; }
        uint size;
        assembly { size := extcodesize(_addr) } // solhint-disable-line no-inline-assembly
        return size == 0;
    }

    /// @notice Helper function actually performing the sending of tokens.
    /// @param _operator The address performing the send
    /// @param _from The address holding the tokens being sent
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be sent
    /// @param _userData Data generated by the user to be passed to the recipient
    /// @param _operatorData Data generated by the operator to be passed to the recipient
    /// @param _preventLocking `true` if you want this function to throw when tokens are sent to a contract not
    ///  implementing `erc777_tokenHolder`.
    ///  ERC777 native Send functions MUST set this parameter to `true`, and backwards compatible ERC20 transfer
    ///  functions SHOULD set this parameter to `false`.
    function doSend(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes _userData,
        bytes _operatorData,
        bool _preventLocking
    )
        internal
    {
        requireMultiple(_amount);

        callSender(_operator, _from, _to, _amount, _userData, _operatorData);

        require(_to != address(0));          // forbid sending to 0x0 (=burning)
        require(mBalances[_from] >= _amount); // ensure enough funds

        mBalances[_from] = mBalances[_from].sub(_amount);
        mBalances[_to] = mBalances[_to].add(_amount);

        callRecipient(_operator, _from, _to, _amount, _userData, _operatorData, _preventLocking);

        emit Sent(_operator, _from, _to, _amount, _userData, _operatorData);
    }

    /// @notice Helper function actually performing the burning of tokens.
    /// @param _operator The address performing the burn
    /// @param _tokenHolder The address holding the tokens being burn
    /// @param _amount The number of tokens to be burnt
    /// @param _holderData Data generated by the token holder
    /// @param _operatorData Data generated by the operator
    function doBurn(address _operator, address _tokenHolder, uint256 _amount, bytes _holderData, bytes _operatorData)
        internal
    {
        requireMultiple(_amount);
        require(balanceOf(_tokenHolder) >= _amount);

        mBalances[_tokenHolder] = mBalances[_tokenHolder].sub(_amount);
        mTotalSupply = mTotalSupply.sub(_amount);

        callSender(_operator, _tokenHolder, 0x0, _amount, _holderData, _operatorData);
        emit Burned(_operator, _tokenHolder, _amount, _holderData, _operatorData);
    }

    /// @notice Helper function that checks for ERC777TokensRecipient on the recipient and calls it.
    ///  May throw according to `_preventLocking`
    /// @param _operator The address performing the send or mint
    /// @param _from The address holding the tokens being sent
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be sent
    /// @param _userData Data generated by the user to be passed to the recipient
    /// @param _operatorData Data generated by the operator to be passed to the recipient
    /// @param _preventLocking `true` if you want this function to throw when tokens are sent to a contract not
    ///  implementing `ERC777TokensRecipient`.
    ///  ERC777 native Send functions MUST set this parameter to `true`, and backwards compatible ERC20 transfer
    ///  functions SHOULD set this parameter to `false`.
    function callRecipient(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes _userData,
        bytes _operatorData,
        bool _preventLocking
    )
        internal
    {
        address recipientImplementation = interfaceAddr(_to, "ERC777TokensRecipient");
        if (recipientImplementation != 0) {
            ERC777TokensRecipient(recipientImplementation).tokensReceived(
                _operator, _from, _to, _amount, _userData, _operatorData);
        } else if (_preventLocking) {
            require(isRegularAddress(_to));
        }
    }

    /// @notice Helper function that checks for ERC777TokensSender on the sender and calls it.
    ///  May throw according to `_preventLocking`
    /// @param _from The address holding the tokens being sent
    /// @param _to The address of the recipient
    /// @param _amount The amount of tokens to be sent
    /// @param _userData Data generated by the user to be passed to the recipient
    /// @param _operatorData Data generated by the operator to be passed to the recipient
    ///  implementing `ERC777TokensSender`.
    ///  ERC777 native Send functions MUST set this parameter to `true`, and backwards compatible ERC20 transfer
    ///  functions SHOULD set this parameter to `false`.
    function callSender(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes _userData,
        bytes _operatorData
    )
        internal
    {
        address senderImplementation = interfaceAddr(_from, "ERC777TokensSender");
        if (senderImplementation == 0) { return; }
        ERC777TokensSender(senderImplementation).tokensToSend(_operator, _from, _to, _amount, _userData, _operatorData);
    }
}

contract ERC777ERC20BaseToken is ERC20Token, ERC777BaseToken {
    bool internal mErc20compatible;

    mapping(address => mapping(address => bool)) internal mAuthorized;
    mapping(address => mapping(address => uint256)) internal mAllowed;

    constructor(
        string _name,
        string _symbol,
        uint256 _granularity,
        address[] _defaultOperators
    )
        internal ERC777BaseToken(_name, _symbol, _granularity, _defaultOperators)
    {
        mErc20compatible = true;
        setInterfaceImplementation("ERC20Token", this);
    }

    /// @notice This modifier is applied to erc20 obsolete methods that are
    ///  implemented only to maintain backwards compatibility. When the erc20
    ///  compatibility is disabled, this methods will fail.
    modifier erc20 () {
        require(mErc20compatible);
        _;
    }

    /// @notice For Backwards compatibility
    /// @return The decimls of the token. Forced to 18 in ERC777.
    function decimals() public erc20 constant returns (uint8) { return uint8(18); }

    /// @notice ERC20 backwards compatible transfer.
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be transferred
    /// @return `true`, if the transfer can't be done, it should fail.
    function transfer(address _to, uint256 _amount) public erc20 returns (bool success) {
        doSend(msg.sender, msg.sender, _to, _amount, "", "", false);
        return true;
    }

    /// @notice ERC20 backwards compatible transferFrom.
    /// @param _from The address holding the tokens being transferred
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be transferred
    /// @return `true`, if the transfer can't be done, it should fail.
    function transferFrom(address _from, address _to, uint256 _amount) public erc20 returns (bool success) {
        require(_amount <= mAllowed[_from][msg.sender]);

        // Cannot be after doSend because of tokensReceived re-entry
        mAllowed[_from][msg.sender] = mAllowed[_from][msg.sender].sub(_amount);
        doSend(msg.sender, _from, _to, _amount, "", "", false);
        return true;
    }

    /// @notice ERC20 backwards compatible approve.
    ///  `msg.sender` approves `_spender` to spend `_amount` tokens on its behalf.
    /// @param _spender The address of the account able to transfer the tokens
    /// @param _amount The number of tokens to be approved for transfer
    /// @return `true`, if the approve can't be done, it should fail.
    function approve(address _spender, uint256 _amount) public erc20 returns (bool success) {
        mAllowed[msg.sender][_spender] = _amount;
        emit Approval(msg.sender, _spender, _amount);
        return true;
    }

    /// @notice ERC20 backwards compatible allowance.
    ///  This function makes it easy to read the `allowed[]` map
    /// @param _owner The address of the account that owns the token
    /// @param _spender The address of the account able to transfer the tokens
    /// @return Amount of remaining tokens of _owner that _spender is allowed
    ///  to spend
    function allowance(address _owner, address _spender) public erc20 constant returns (uint256 remaining) {
        return mAllowed[_owner][_spender];
    }

    function doSend(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes _userData,
        bytes _operatorData,
        bool _preventLocking
    )
        internal
    {
        super.doSend(_operator, _from, _to, _amount, _userData, _operatorData, _preventLocking);
        if (mErc20compatible) { emit Transfer(_from, _to, _amount); }
    }

    function doBurn(address _operator, address _tokenHolder, uint256 _amount, bytes _holderData, bytes _operatorData)
        internal
    {
        super.doBurn(_operator, _tokenHolder, _amount, _holderData, _operatorData);
        if (mErc20compatible) { emit Transfer(_tokenHolder, 0x0, _amount); }
    }
}

contract OrcaToken is TokenRecoverable, ERC777ERC20BaseToken {
    using SafeMath for uint256;

    string private constant name_ = "ORCA Token";
    string private constant symbol_ = "ORCA";
    uint256 private constant granularity_ = 1;

    bool public throwOnIncompatibleContract = true;
    bool public burnEnabled = false;
    bool public mintingFinished = false;

    address public communityLock = address(0);

    event MintFinished();

    /// @notice Constructor to create a OrcaToken
    constructor() public ERC777ERC20BaseToken(name_, symbol_, granularity_, new address[](0)) {
        setInterfaceImplementation("ERC20Token", address(this));
        setInterfaceImplementation("ERC777Token", address(this));
    }

    modifier canMint() {
        require(!mintingFinished);
      _;
    }

    modifier canTrade() {
        require(mintingFinished);
        _;
    }

    modifier canBurn() {
        require(burnEnabled || msg.sender == communityLock);
        _;
    }

    /// @notice Disables the ERC20 interface. This function can only be called
    ///  by the owner.
    function disableERC20() public onlyOwner {
        mErc20compatible = false;
        setInterfaceImplementation("ERC20Token", 0x0);
    }

    /// @notice Re enables the ERC20 interface. This function can only be called
    ///  by the owner.
    function enableERC20() public onlyOwner {
        mErc20compatible = true;
        setInterfaceImplementation("ERC20Token", this);
    }

    function send(address _to, uint256 _amount, bytes _userData) public canTrade {
        super.send(_to, _amount, _userData);
    }

    function operatorSend(address _from, address _to, uint256 _amount, bytes _userData, bytes _operatorData) public canTrade {
        super.operatorSend(_from, _to, _amount, _userData, _operatorData);
    }

    function transfer(address _to, uint256 _amount) public erc20 canTrade returns (bool success) {
        return super.transfer(_to, _amount);
    }

    function transferFrom(address _from, address _to, uint256 _amount) public erc20 canTrade returns (bool success) {
        return super.transferFrom(_from, _to, _amount);
    }

    /* -- Mint And Burn Functions (not part of the ERC777 standard, only the Events/tokensReceived call are) -- */
    //
    /// @notice Generates `_amount` tokens to be assigned to `_tokenHolder`
    ///  Sample mint function to showcase the use of the `Minted` event and the logic to notify the recipient.
    /// @param _tokenHolder The address that will be assigned the new tokens
    /// @param _amount The quantity of tokens generated
    /// @param _operatorData Data that will be passed to the recipient as a first transfer
    function mint(address _tokenHolder, uint256 _amount, bytes _operatorData) public onlyOwner canMint {
        requireMultiple(_amount);
        mTotalSupply = mTotalSupply.add(_amount);
        mBalances[_tokenHolder] = mBalances[_tokenHolder].add(_amount);

        callRecipient(msg.sender, 0x0, _tokenHolder, _amount, "", _operatorData, false);

        emit Minted(msg.sender, _tokenHolder, _amount, _operatorData);
        if (mErc20compatible) { emit Transfer(0x0, _tokenHolder, _amount); }
    }

    /// @notice Burns `_amount` tokens from `_tokenHolder`
    ///  Sample burn function to showcase the use of the `Burned` event.
    /// @param _amount The quantity of tokens to burn
    function burn(uint256 _amount, bytes _holderData) public canBurn {
        super.burn(_amount, _holderData);
    }

    /**
     * @dev Function to stop minting new tokens.
     * @return True if the operation was successful.
     */
    function finishMinting() public onlyOwner canMint {
        mintingFinished = true;
        emit MintFinished();
    }

    function setThrowOnIncompatibleContract(bool _throwOnIncompatibleContract) public onlyOwner {
        throwOnIncompatibleContract = _throwOnIncompatibleContract;
    }

    function setCommunityLock(address _communityLock) public onlyOwner {
        require(_communityLock != address(0));
        communityLock = _communityLock;
    }

    function permitBurning(bool _enable) public onlyOwner {
        burnEnabled = _enable;
    }

    /// @notice Helper function that checks for ERC777TokensRecipient on the recipient and calls it.
    ///  May throw according to `_preventLocking`
    /// @param _from The address holding the tokens being sent
    /// @param _to The address of the recipient
    /// @param _amount The number of tokens to be sent
    /// @param _userData Data generated by the user to be passed to the recipient
    /// @param _operatorData Data generated by the operator to be passed to the recipient
    /// @param _preventLocking `true` if you want this function to throw when tokens are sent to a contract not
    ///  implementing `ERC777TokensRecipient`.
    ///  ERC777 native Send functions MUST set this parameter to `true`, and backwards compatible ERC20 transfer
    ///  functions SHOULD set this parameter to `false`.
    function callRecipient(
        address _operator,
        address _from,
        address _to,
        uint256 _amount,
        bytes _userData,
        bytes _operatorData,
        bool _preventLocking
    ) internal {
        address recipientImplementation = interfaceAddr(_to, "ERC777TokensRecipient");
        if (recipientImplementation != 0) {
            ERC777TokensRecipient(recipientImplementation).tokensReceived(
                _operator, _from, _to, _amount, _userData, _operatorData);
        } else if (throwOnIncompatibleContract && _preventLocking) {
            require(isRegularAddress(_to));
        }
    }
}

Contract Security Audit

Contract ABI

[{"constant":true,"inputs":[],"name":"mintingFinished","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultOperators","outputs":[{"name":"","type":"address[]"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"enableERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupply","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_throwOnIncompatibleContract","type":"bool"}],"name":"setThrowOnIncompatibleContract","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_communityLock","type":"address"}],"name":"setCommunityLock","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"granularity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnEnabled","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"token","type":"address"},{"name":"to","type":"address"},{"name":"amount","type":"uint256"}],"name":"recoverTokens","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_enable","type":"bool"}],"name":"permitBurning","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_userData","type":"bytes"},{"name":"_operatorData","type":"bytes"}],"name":"operatorSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"communityLock","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_tokenHolder","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"finishMinting","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_tokenHolder","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_operatorData","type":"bytes"}],"name":"mint","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"authorizeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_userData","type":"bytes"}],"name":"send","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_operator","type":"address"},{"name":"_tokenHolder","type":"address"}],"name":"isOperatorFor","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"disableERC20","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_operator","type":"address"}],"name":"revokeOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenHolder","type":"address"},{"name":"_amount","type":"uint256"},{"name":"_holderData","type":"bytes"},{"name":"_operatorData","type":"bytes"}],"name":"operatorBurn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"throwOnIncompatibleContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_amount","type":"uint256"},{"name":"_holderData","type":"bytes"}],"name":"burn","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[],"name":"MintFinished","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"holderData","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Sent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"amount","type":"uint256"},{"indexed":false,"name":"holderData","type":"bytes"},{"indexed":false,"name":"operatorData","type":"bytes"}],"name":"Burned","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"tokenHolder","type":"address"}],"name":"AuthorizedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"operator","type":"address"},{"indexed":true,"name":"tokenHolder","type":"address"}],"name":"RevokedOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":true,"name":"to","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"owner","type":"address"},{"indexed":true,"name":"spender","type":"address"},{"indexed":false,"name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"}],"name":"OwnershipRenounced","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"previousOwner","type":"address"},{"indexed":true,"name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"}]

60806040526001805473991a1bcb077599290d7305493c9a630c20f8b798600160a060020a0319909116178155600e805460ff191690911761010060b860020a03191690553480156200005157600080fd5b50604080518082018252600a81527f4f52434120546f6b656e0000000000000000000000000000000000000000000060208083019190915282518084018452600481527f4f52434100000000000000000000000000000000000000000000000000000000818301528351600080825292810190945291926001915060008054600160a060020a0319163317815584518591859185918591620000fb90600290602088019062000446565b5083516200011190600390602087019062000446565b50600060055560018310156200012657600080fd5b6004839055815162000140906008906020850190620004cb565b50600090505b600854811015620001a4576001600960006008848154811015156200016757fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff191691151591909117905560010162000146565b60408051808201909152600b81527f455243373737546f6b656e0000000000000000000000000000000000000000006020820152620001ed9030640100000000620002eb810204565b5050600b805460ff19166001179055505060408051808201909152600a81527f4552433230546f6b656e00000000000000000000000000000000000000000000602082015262000248915030640100000000620002eb810204565b505050506200029c6040805190810160405280600a81526020017f4552433230546f6b656e0000000000000000000000000000000000000000000081525030620002eb640100000000026401000000009004565b60408051808201909152600b81527f455243373737546f6b656e0000000000000000000000000000000000000000006020820152620002e59030640100000000620002eb810204565b62000578565b6000826040516020018082805190602001908083835b60208310620003225780518252601f19909201916020918201910162000301565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310620003875780518252601f19909201916020918201910162000366565b5181516020939093036101000a6000190180199091169216919091179052604080519190930181900381206001547f29965a1d00000000000000000000000000000000000000000000000000000000835230600484015260248301829052600160a060020a03898116604485015294519197509390931694506329965a1d9350606480820193600093509182900301818387803b1580156200042857600080fd5b505af11580156200043d573d6000803e3d6000fd5b50505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106200048957805160ff1916838001178555620004b9565b82800160010185558215620004b9579182015b82811115620004b95782518255916020019190600101906200049c565b50620004c792915062000531565b5090565b82805482825590600052602060002090810192821562000523579160200282015b82811115620005235782518254600160a060020a031916600160a060020a03909116178255602090920191600190910190620004ec565b50620004c792915062000551565b6200054e91905b80821115620004c7576000815560010162000538565b90565b6200054e91905b80821115620004c7578054600160a060020a031916815560010162000558565b6121d880620005886000396000f3006080604052600436106101875763ffffffff60e060020a60003504166305d2035b811461018c57806306e48538146101b557806306fdde031461021a578063070c87f9146102a4578063095ea7b3146102bb57806318160ddd146102df57806323b872dd14610306578063313ce56714610330578063382228581461035b5780634f93b9e814610375578063556f0dc7146103965780635dc96d16146103ab5780635f3e849f146103c057806361025532146103ea57806362ad1b83146104045780636c8b4e60146104b157806370a08231146104e2578063715018a6146105035780637d64bcb4146105185780638da5cb5b1461052d57806394d008ef14610542578063959b8c3f146105ab57806395d89b41146105cc5780639bd9bbc6146105e1578063a9059cbb1461064a578063d95b63711461066e578063dd62ed3e14610695578063f2fde38b146106bc578063f922f216146106dd578063fad8b32a146106f2578063fc673c4f14610713578063fe8705d5146107ba578063fe9d9303146107cf575b600080fd5b34801561019857600080fd5b506101a161082d565b604080519115158252519081900360200190f35b3480156101c157600080fd5b506101ca61083c565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102065781810151838201526020016101ee565b505050509050019250505060405180910390f35b34801561022657600080fd5b5061022f61089e565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610269578181015183820152602001610251565b50505050905090810190601f1680156102965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b057600080fd5b506102b9610928565b005b3480156102c757600080fd5b506101a1600160a060020a036004351660243561098c565b3480156102eb57600080fd5b506102f4610a08565b60408051918252519081900360200190f35b34801561031257600080fd5b506101a1600160a060020a0360043581169060243516604435610a0e565b34801561033c57600080fd5b50610345610a4c565b6040805160ff9092168252519081900360200190f35b34801561036757600080fd5b506102b96004351515610a66565b34801561038157600080fd5b506102b9600160a060020a0360043516610a90565b3480156103a257600080fd5b506102f4610af5565b3480156103b757600080fd5b506101a1610afb565b3480156103cc57600080fd5b506102b9600160a060020a0360043581169060243516604435610b09565b3480156103f657600080fd5b506102b96004351515610bdd565b34801561041057600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526102b994600160a060020a03813581169560248035909216956044359536956084940191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610c0e9650505050505050565b3480156104bd57600080fd5b506104c6610c39565b60408051600160a060020a039092168252519081900360200190f35b3480156104ee57600080fd5b506102f4600160a060020a0360043516610c4f565b34801561050f57600080fd5b506102b9610c6a565b34801561052457600080fd5b506102b9610cd6565b34801561053957600080fd5b506104c6610d3f565b34801561054e57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b9948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750610d4e9650505050505050565b3480156105b757600080fd5b506102b9600160a060020a0360043516610f14565b3480156105d857600080fd5b5061022f610fe3565b3480156105ed57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b9948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506110449650505050505050565b34801561065657600080fd5b506101a1600160a060020a0360043516602435611066565b34801561067a57600080fd5b506101a1600160a060020a03600435811690602435166110a2565b3480156106a157600080fd5b506102f4600160a060020a0360043581169060243516611142565b3480156106c857600080fd5b506102b9600160a060020a0360043516611182565b3480156106e957600080fd5b506102b96111a5565b3480156106fe57600080fd5b506102b9600160a060020a0360043516611205565b34801561071f57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b9948235600160a060020a031694602480359536959460649492019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506112d49650505050505050565b3480156107c657600080fd5b506101a16112f6565b3480156107db57600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526102b99583359536956044949193909101919081908401838280828437509497506112ff9650505050505050565b600e5462010000900460ff1681565b6060600880548060200260200160405190810160405280929190818152602001828054801561089457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610876575b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156108945780601f106108fc57610100808354040283529160200191610894565b820191906000526020600020905b81548152906001019060200180831161090a57509395945050505050565b600054600160a060020a0316331461093f57600080fd5b600b805460ff1916600117905560408051808201909152600a81527f4552433230546f6b656e00000000000000000000000000000000000000000000602082015261098a903061133f565b565b600b5460009060ff1615156109a057600080fd5b336000818152600d60209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60055490565b600b5460009060ff161515610a2257600080fd5b600e5462010000900460ff161515610a3957600080fd5b610a44848484611494565b949350505050565b600b5460009060ff161515610a6057600080fd5b50601290565b600054600160a060020a03163314610a7d57600080fd5b600e805460ff1916911515919091179055565b600054600160a060020a03163314610aa757600080fd5b600160a060020a0381161515610abc57600080fd5b600e8054600160a060020a0390921663010000000276ffffffffffffffffffffffffffffffffffffffff00000019909216919091179055565b60045490565b600e54610100900460ff1681565b60008054600160a060020a03163314610b2157600080fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038616916370a082319160248083019260209291908290030181600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505050506040513d6020811015610bac57600080fd5b5051905081811015610bbd57600080fd5b610bd7600160a060020a038516848463ffffffff61156716565b50505050565b600054600160a060020a03163314610bf457600080fd5b600e80549115156101000261ff0019909216919091179055565b600e5462010000900460ff161515610c2557600080fd5b610c328585858585611601565b5050505050565b600e5463010000009004600160a060020a031681565b600160a060020a031660009081526006602052604090205490565b600054600160a060020a03163314610c8157600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a03163314610ced57600080fd5b600e5462010000900460ff1615610d0357600080fd5b600e805462ff00001916620100001790556040517fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0890600090a1565b600054600160a060020a031681565b600054600160a060020a03163314610d6557600080fd5b600e5462010000900460ff1615610d7b57600080fd5b610d8482611626565b600554610d97908363ffffffff61165516565b600555600160a060020a038316600090815260066020526040902054610dc3908363ffffffff61165516565b6006600085600160a060020a0316600160a060020a0316815260200190815260200160002081905550610e0d33600085856020604051908101604052806000815250866000611662565b82600160a060020a031633600160a060020a03167fbcd28e05e57d4bcd5bfcc92a4661d412893e6112c44a2e25d96cfdfc30d5f22e84846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e87578181015183820152602001610e6f565b50505050905090810190601f168015610eb45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3600b5460ff1615610f0f57604080518381529051600160a060020a038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b505050565b600160a060020a038116331415610f2a57600080fd5b600160a060020a03811660009081526009602052604090205460ff1615610f7b57600160a060020a0381166000908152600a602090815260408083203384529091529020805460ff19169055610faa565b600160a060020a03811660009081526007602090815260408083203384529091529020805460ff191660011790555b6040513390600160a060020a038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108945780601f106108fc57610100808354040283529160200191610894565b600e5462010000900460ff16151561105b57600080fd5b610f0f83838361186a565b600b5460009060ff16151561107a57600080fd5b600e5462010000900460ff16151561109157600080fd5b61109b838361188a565b9392505050565b600081600160a060020a031683600160a060020a031614806110e95750600160a060020a0380841660009081526007602090815260408083209386168352929052205460ff165b8061109b5750600160a060020a03831660009081526009602052604090205460ff16801561109b575050600160a060020a039182166000908152600a6020908152604080832093909416825291909152205460ff161590565b600b5460009060ff16151561115657600080fd5b50600160a060020a039182166000908152600d6020908152604080832093909416825291909152205490565b600054600160a060020a0316331461119957600080fd5b6111a2816118d7565b50565b600054600160a060020a031633146111bc57600080fd5b600b805460ff1916905560408051808201909152600a81527f4552433230546f6b656e00000000000000000000000000000000000000000000602082015261098a90600061133f565b600160a060020a03811633141561121b57600080fd5b600160a060020a03811660009081526009602052604090205460ff161561126f57600160a060020a0381166000908152600a602090815260408083203384529091529020805460ff1916600117905561129b565b600160a060020a03811660009081526007602090815260408083203384529091529020805460ff191690555b6040513390600160a060020a038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b6112de33856110a2565b15156112e957600080fd5b610bd73385858585611954565b600e5460ff1681565b600e54610100900460ff16806113265750600e5463010000009004600160a060020a031633145b151561133157600080fd5b61133b82826119b4565b5050565b6000826040516020018082805190602001908083835b602083106113745780518252601f199092019160209182019101611355565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106113d75780518252601f1990920191602091820191016113b8565b5181516020939093036101000a6000190180199091169216919091179052604080519190930181900381206001547f29965a1d00000000000000000000000000000000000000000000000000000000835230600484015260248301829052600160a060020a03898116604485015294519197509390931694506329965a1d9350606480820193600093509182900301818387803b15801561147757600080fd5b505af115801561148b573d6000803e3d6000fd5b50505050505050565b600b5460009060ff1615156114a857600080fd5b600160a060020a0384166000908152600d602090815260408083203384529091529020548211156114d857600080fd5b600160a060020a0384166000908152600d6020908152604080832033845290915290205461150c908363ffffffff6119d116565b600160a060020a0385166000908152600d60209081526040808320338085529083528184209490945580518083018252838152815192830190915282825261155d93928892889288929091906119e3565b5060019392505050565b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156115ca57600080fd5b505af11580156115de573d6000803e3d6000fd5b505050506040513d60208110156115f457600080fd5b50511515610f0f57600080fd5b61160b33866110a2565b151561161657600080fd5b610c3233868686868660016119e3565b600454819061164b9061163f838263ffffffff611a5116565b9063ffffffff611a6616565b146111a257600080fd5b81810182811015610a0257fe5b60006116a3866040805190810160405280601581526020017f455243373737546f6b656e73526563697069656e740000000000000000000000815250611a8f565b9050600160a060020a038116156118385780600160a060020a03166223de298989898989896040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015611769578181015183820152602001611751565b50505050905090810190601f1680156117965780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156117c95781810151838201526020016117b1565b50505050905090810190601f1680156117f65780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561181b57600080fd5b505af115801561182f573d6000803e3d6000fd5b50505050611860565b600e5460ff1680156118475750815b156118605761185586611bf3565b151561186057600080fd5b5050505050505050565b610f0f3333858585602060405190810160405280600081525060016119e3565b600b5460009060ff16151561189e57600080fd5b6118ce333385856020604051908101604052806000815250602060405190810160405280600081525060006119e3565b50600192915050565b600160a060020a03811615156118ec57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6119618585858585611c1d565b600b5460ff1615610c3257604080518481529051600091600160a060020a038716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b61133b333384846020604051908101604052806000815250611954565b6000828211156119dd57fe5b50900390565b6119f287878787878787611dc5565b600b5460ff161561148b5784600160a060020a031686600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a350505050505050565b60008183811515611a5e57fe5b049392505050565b6000821515611a7757506000610a02565b50818102818382811515611a8757fe5b0414610a0257fe5b600080826040516020018082805190602001908083835b60208310611ac55780518252601f199092019160209182019101611aa6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310611b285780518252601f199092019160209182019101611b09565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206001547faabbb8ca000000000000000000000000000000000000000000000000000000008452600160a060020a038c8116600486015260248501839052955191985094909416955063aabbb8ca945060448083019491935090918290030181600087803b158015611bbf57600080fd5b505af1158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b5051949350505050565b600080600160a060020a0383161515611c0f5760009150611c17565b5050803b8015905b50919050565b611c2683611626565b82611c3085610c4f565b1015611c3b57600080fd5b600160a060020a038416600090815260066020526040902054611c64908463ffffffff6119d116565b600160a060020a038516600090815260066020526040902055600554611c90908463ffffffff6119d116565b600555611ca285856000868686611fcb565b83600160a060020a031685600160a060020a03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098858585604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015611d21578181015183820152602001611d09565b50505050905090810190601f168015611d4e5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015611d81578181015183820152602001611d69565b50505050905090810190601f168015611dae5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a35050505050565b611dce84611626565b611ddc878787878787611fcb565b600160a060020a0385161515611df157600080fd5b600160a060020a038616600090815260066020526040902054841115611e1657600080fd5b600160a060020a038616600090815260066020526040902054611e3f908563ffffffff6119d116565b600160a060020a038088166000908152600660205260408082209390935590871681522054611e74908563ffffffff61165516565b600160a060020a038616600090815260066020526040902055611e9c87878787878787611662565b84600160a060020a031686600160a060020a031688600160a060020a03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015611f25578181015183820152602001611f0d565b50505050905090810190601f168015611f525780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015611f85578181015183820152602001611f6d565b50505050905090810190601f168015611fb25780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450505050505050565b600061200c866040805190810160405280601281526020017f455243373737546f6b656e7353656e6465720000000000000000000000000000815250611a8f565b9050600160a060020a03811615156120235761148b565b80600160a060020a03166375ab97828888888888886040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156120d95781810151838201526020016120c1565b50505050905090810190601f1680156121065780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612139578181015183820152602001612121565b50505050905090810190601f1680156121665780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561218b57600080fd5b505af115801561219f573d6000803e3d6000fd5b50505050505050505050505600a165627a7a723058201055312ec40c4f859980e2e4e93f2d5804555cf8f4473150a1b946650ef0cbaa0029

Deployed Bytecode

0x6080604052600436106101875763ffffffff60e060020a60003504166305d2035b811461018c57806306e48538146101b557806306fdde031461021a578063070c87f9146102a4578063095ea7b3146102bb57806318160ddd146102df57806323b872dd14610306578063313ce56714610330578063382228581461035b5780634f93b9e814610375578063556f0dc7146103965780635dc96d16146103ab5780635f3e849f146103c057806361025532146103ea57806362ad1b83146104045780636c8b4e60146104b157806370a08231146104e2578063715018a6146105035780637d64bcb4146105185780638da5cb5b1461052d57806394d008ef14610542578063959b8c3f146105ab57806395d89b41146105cc5780639bd9bbc6146105e1578063a9059cbb1461064a578063d95b63711461066e578063dd62ed3e14610695578063f2fde38b146106bc578063f922f216146106dd578063fad8b32a146106f2578063fc673c4f14610713578063fe8705d5146107ba578063fe9d9303146107cf575b600080fd5b34801561019857600080fd5b506101a161082d565b604080519115158252519081900360200190f35b3480156101c157600080fd5b506101ca61083c565b60408051602080825283518183015283519192839290830191858101910280838360005b838110156102065781810151838201526020016101ee565b505050509050019250505060405180910390f35b34801561022657600080fd5b5061022f61089e565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610269578181015183820152602001610251565b50505050905090810190601f1680156102965780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b3480156102b057600080fd5b506102b9610928565b005b3480156102c757600080fd5b506101a1600160a060020a036004351660243561098c565b3480156102eb57600080fd5b506102f4610a08565b60408051918252519081900360200190f35b34801561031257600080fd5b506101a1600160a060020a0360043581169060243516604435610a0e565b34801561033c57600080fd5b50610345610a4c565b6040805160ff9092168252519081900360200190f35b34801561036757600080fd5b506102b96004351515610a66565b34801561038157600080fd5b506102b9600160a060020a0360043516610a90565b3480156103a257600080fd5b506102f4610af5565b3480156103b757600080fd5b506101a1610afb565b3480156103cc57600080fd5b506102b9600160a060020a0360043581169060243516604435610b09565b3480156103f657600080fd5b506102b96004351515610bdd565b34801561041057600080fd5b50604080516020601f6064356004818101359283018490048402850184019095528184526102b994600160a060020a03813581169560248035909216956044359536956084940191819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a999881019791965091820194509250829150840183828082843750949750610c0e9650505050505050565b3480156104bd57600080fd5b506104c6610c39565b60408051600160a060020a039092168252519081900360200190f35b3480156104ee57600080fd5b506102f4600160a060020a0360043516610c4f565b34801561050f57600080fd5b506102b9610c6a565b34801561052457600080fd5b506102b9610cd6565b34801561053957600080fd5b506104c6610d3f565b34801561054e57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b9948235600160a060020a0316946024803595369594606494920191908190840183828082843750949750610d4e9650505050505050565b3480156105b757600080fd5b506102b9600160a060020a0360043516610f14565b3480156105d857600080fd5b5061022f610fe3565b3480156105ed57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b9948235600160a060020a03169460248035953695946064949201919081908401838280828437509497506110449650505050505050565b34801561065657600080fd5b506101a1600160a060020a0360043516602435611066565b34801561067a57600080fd5b506101a1600160a060020a03600435811690602435166110a2565b3480156106a157600080fd5b506102f4600160a060020a0360043581169060243516611142565b3480156106c857600080fd5b506102b9600160a060020a0360043516611182565b3480156106e957600080fd5b506102b96111a5565b3480156106fe57600080fd5b506102b9600160a060020a0360043516611205565b34801561071f57600080fd5b50604080516020600460443581810135601f81018490048402850184019095528484526102b9948235600160a060020a031694602480359536959460649492019190819084018382808284375050604080516020601f89358b018035918201839004830284018301909452808352979a9998810197919650918201945092508291508401838280828437509497506112d49650505050505050565b3480156107c657600080fd5b506101a16112f6565b3480156107db57600080fd5b5060408051602060046024803582810135601f81018590048502860185019096528585526102b99583359536956044949193909101919081908401838280828437509497506112ff9650505050505050565b600e5462010000900460ff1681565b6060600880548060200260200160405190810160405280929190818152602001828054801561089457602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610876575b5050505050905090565b60028054604080516020601f60001961010060018716150201909416859004938401819004810282018101909252828152606093909290918301828280156108945780601f106108fc57610100808354040283529160200191610894565b820191906000526020600020905b81548152906001019060200180831161090a57509395945050505050565b600054600160a060020a0316331461093f57600080fd5b600b805460ff1916600117905560408051808201909152600a81527f4552433230546f6b656e00000000000000000000000000000000000000000000602082015261098a903061133f565b565b600b5460009060ff1615156109a057600080fd5b336000818152600d60209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a35060015b92915050565b60055490565b600b5460009060ff161515610a2257600080fd5b600e5462010000900460ff161515610a3957600080fd5b610a44848484611494565b949350505050565b600b5460009060ff161515610a6057600080fd5b50601290565b600054600160a060020a03163314610a7d57600080fd5b600e805460ff1916911515919091179055565b600054600160a060020a03163314610aa757600080fd5b600160a060020a0381161515610abc57600080fd5b600e8054600160a060020a0390921663010000000276ffffffffffffffffffffffffffffffffffffffff00000019909216919091179055565b60045490565b600e54610100900460ff1681565b60008054600160a060020a03163314610b2157600080fd5b604080517f70a082310000000000000000000000000000000000000000000000000000000081523060048201529051600160a060020a038616916370a082319160248083019260209291908290030181600087803b158015610b8257600080fd5b505af1158015610b96573d6000803e3d6000fd5b505050506040513d6020811015610bac57600080fd5b5051905081811015610bbd57600080fd5b610bd7600160a060020a038516848463ffffffff61156716565b50505050565b600054600160a060020a03163314610bf457600080fd5b600e80549115156101000261ff0019909216919091179055565b600e5462010000900460ff161515610c2557600080fd5b610c328585858585611601565b5050505050565b600e5463010000009004600160a060020a031681565b600160a060020a031660009081526006602052604090205490565b600054600160a060020a03163314610c8157600080fd5b60008054604051600160a060020a03909116917ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482091a26000805473ffffffffffffffffffffffffffffffffffffffff19169055565b600054600160a060020a03163314610ced57600080fd5b600e5462010000900460ff1615610d0357600080fd5b600e805462ff00001916620100001790556040517fae5184fba832cb2b1f702aca6117b8d265eaf03ad33eb133f19dde0f5920fa0890600090a1565b600054600160a060020a031681565b600054600160a060020a03163314610d6557600080fd5b600e5462010000900460ff1615610d7b57600080fd5b610d8482611626565b600554610d97908363ffffffff61165516565b600555600160a060020a038316600090815260066020526040902054610dc3908363ffffffff61165516565b6006600085600160a060020a0316600160a060020a0316815260200190815260200160002081905550610e0d33600085856020604051908101604052806000815250866000611662565b82600160a060020a031633600160a060020a03167fbcd28e05e57d4bcd5bfcc92a4661d412893e6112c44a2e25d96cfdfc30d5f22e84846040518083815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610e87578181015183820152602001610e6f565b50505050905090810190601f168015610eb45780820380516001836020036101000a031916815260200191505b50935050505060405180910390a3600b5460ff1615610f0f57604080518381529051600160a060020a038516916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b505050565b600160a060020a038116331415610f2a57600080fd5b600160a060020a03811660009081526009602052604090205460ff1615610f7b57600160a060020a0381166000908152600a602090815260408083203384529091529020805460ff19169055610faa565b600160a060020a03811660009081526007602090815260408083203384529091529020805460ff191660011790555b6040513390600160a060020a038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60038054604080516020601f60026000196101006001881615020190951694909404938401819004810282018101909252828152606093909290918301828280156108945780601f106108fc57610100808354040283529160200191610894565b600e5462010000900460ff16151561105b57600080fd5b610f0f83838361186a565b600b5460009060ff16151561107a57600080fd5b600e5462010000900460ff16151561109157600080fd5b61109b838361188a565b9392505050565b600081600160a060020a031683600160a060020a031614806110e95750600160a060020a0380841660009081526007602090815260408083209386168352929052205460ff165b8061109b5750600160a060020a03831660009081526009602052604090205460ff16801561109b575050600160a060020a039182166000908152600a6020908152604080832093909416825291909152205460ff161590565b600b5460009060ff16151561115657600080fd5b50600160a060020a039182166000908152600d6020908152604080832093909416825291909152205490565b600054600160a060020a0316331461119957600080fd5b6111a2816118d7565b50565b600054600160a060020a031633146111bc57600080fd5b600b805460ff1916905560408051808201909152600a81527f4552433230546f6b656e00000000000000000000000000000000000000000000602082015261098a90600061133f565b600160a060020a03811633141561121b57600080fd5b600160a060020a03811660009081526009602052604090205460ff161561126f57600160a060020a0381166000908152600a602090815260408083203384529091529020805460ff1916600117905561129b565b600160a060020a03811660009081526007602090815260408083203384529091529020805460ff191690555b6040513390600160a060020a038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b6112de33856110a2565b15156112e957600080fd5b610bd73385858585611954565b600e5460ff1681565b600e54610100900460ff16806113265750600e5463010000009004600160a060020a031633145b151561133157600080fd5b61133b82826119b4565b5050565b6000826040516020018082805190602001908083835b602083106113745780518252601f199092019160209182019101611355565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b602083106113d75780518252601f1990920191602091820191016113b8565b5181516020939093036101000a6000190180199091169216919091179052604080519190930181900381206001547f29965a1d00000000000000000000000000000000000000000000000000000000835230600484015260248301829052600160a060020a03898116604485015294519197509390931694506329965a1d9350606480820193600093509182900301818387803b15801561147757600080fd5b505af115801561148b573d6000803e3d6000fd5b50505050505050565b600b5460009060ff1615156114a857600080fd5b600160a060020a0384166000908152600d602090815260408083203384529091529020548211156114d857600080fd5b600160a060020a0384166000908152600d6020908152604080832033845290915290205461150c908363ffffffff6119d116565b600160a060020a0385166000908152600d60209081526040808320338085529083528184209490945580518083018252838152815192830190915282825261155d93928892889288929091906119e3565b5060019392505050565b82600160a060020a031663a9059cbb83836040518363ffffffff1660e060020a0281526004018083600160a060020a0316600160a060020a0316815260200182815260200192505050602060405180830381600087803b1580156115ca57600080fd5b505af11580156115de573d6000803e3d6000fd5b505050506040513d60208110156115f457600080fd5b50511515610f0f57600080fd5b61160b33866110a2565b151561161657600080fd5b610c3233868686868660016119e3565b600454819061164b9061163f838263ffffffff611a5116565b9063ffffffff611a6616565b146111a257600080fd5b81810182811015610a0257fe5b60006116a3866040805190810160405280601581526020017f455243373737546f6b656e73526563697069656e740000000000000000000000815250611a8f565b9050600160a060020a038116156118385780600160a060020a03166223de298989898989896040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015611769578181015183820152602001611751565b50505050905090810190601f1680156117965780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b838110156117c95781810151838201526020016117b1565b50505050905090810190601f1680156117f65780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561181b57600080fd5b505af115801561182f573d6000803e3d6000fd5b50505050611860565b600e5460ff1680156118475750815b156118605761185586611bf3565b151561186057600080fd5b5050505050505050565b610f0f3333858585602060405190810160405280600081525060016119e3565b600b5460009060ff16151561189e57600080fd5b6118ce333385856020604051908101604052806000815250602060405190810160405280600081525060006119e3565b50600192915050565b600160a060020a03811615156118ec57600080fd5b60008054604051600160a060020a03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a36000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b6119618585858585611c1d565b600b5460ff1615610c3257604080518481529051600091600160a060020a038716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35050505050565b61133b333384846020604051908101604052806000815250611954565b6000828211156119dd57fe5b50900390565b6119f287878787878787611dc5565b600b5460ff161561148b5784600160a060020a031686600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a350505050505050565b60008183811515611a5e57fe5b049392505050565b6000821515611a7757506000610a02565b50818102818382811515611a8757fe5b0414610a0257fe5b600080826040516020018082805190602001908083835b60208310611ac55780518252601f199092019160209182019101611aa6565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310611b285780518252601f199092019160209182019101611b09565b51815160209384036101000a6000190180199092169116179052604080519290940182900382206001547faabbb8ca000000000000000000000000000000000000000000000000000000008452600160a060020a038c8116600486015260248501839052955191985094909416955063aabbb8ca945060448083019491935090918290030181600087803b158015611bbf57600080fd5b505af1158015611bd3573d6000803e3d6000fd5b505050506040513d6020811015611be957600080fd5b5051949350505050565b600080600160a060020a0383161515611c0f5760009150611c17565b5050803b8015905b50919050565b611c2683611626565b82611c3085610c4f565b1015611c3b57600080fd5b600160a060020a038416600090815260066020526040902054611c64908463ffffffff6119d116565b600160a060020a038516600090815260066020526040902055600554611c90908463ffffffff6119d116565b600555611ca285856000868686611fcb565b83600160a060020a031685600160a060020a03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098858585604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015611d21578181015183820152602001611d09565b50505050905090810190601f168015611d4e5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015611d81578181015183820152602001611d69565b50505050905090810190601f168015611dae5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a35050505050565b611dce84611626565b611ddc878787878787611fcb565b600160a060020a0385161515611df157600080fd5b600160a060020a038616600090815260066020526040902054841115611e1657600080fd5b600160a060020a038616600090815260066020526040902054611e3f908563ffffffff6119d116565b600160a060020a038088166000908152600660205260408082209390935590871681522054611e74908563ffffffff61165516565b600160a060020a038616600090815260066020526040902055611e9c87878787878787611662565b84600160a060020a031686600160a060020a031688600160a060020a03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015611f25578181015183820152602001611f0d565b50505050905090810190601f168015611f525780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015611f85578181015183820152602001611f6d565b50505050905090810190601f168015611fb25780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450505050505050565b600061200c866040805190810160405280601281526020017f455243373737546f6b656e7353656e6465720000000000000000000000000000815250611a8f565b9050600160a060020a03811615156120235761148b565b80600160a060020a03166375ab97828888888888886040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156120d95781810151838201526020016120c1565b50505050905090810190601f1680156121065780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612139578181015183820152602001612121565b50505050905090810190601f1680156121665780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561218b57600080fd5b505af115801561219f573d6000803e3d6000fd5b50505050505050505050505600a165627a7a723058201055312ec40c4f859980e2e4e93f2d5804555cf8f4473150a1b946650ef0cbaa0029

Swarm Source

bzzr://1055312ec40c4f859980e2e4e93f2d5804555cf8f4473150a1b946650ef0cbaa
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.