ETH Price: $2,653.09 (+7.78%)
 

Overview

Max Total Supply

200,000,000 SELF

Holders

1,688 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
741,141.168571808990524288 SELF

Value
$0.00
0xAb048A030C381C99b0c9bD38C07427B1bc847fF7
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

An entertainment platform democratizing content creation and distribution through a blockchain crowdfunding program and a digital asset for entertainment consumption and application.

ICO Information

ICO Start Date : Sep 4, 2018
ICO End Date : Nov 30, 2018
ICO Price  : $0.083333

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SelfToken

Compiler Version
v0.4.25+commit.59dbf8f1

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion

Contract Source Code (Solidity)

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

pragma solidity 0.4.25;

// File: contracts/ERC777/ERC20Token.sol

/* This Source Code Form is subject to the terms of the Mozilla external
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This code has not been reviewed.
 * Do not use or deploy this code before reviewing it personally first.
 */


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

  event Transfer(address indexed from, address indexed to, uint256 amount);
  event Approval(address indexed owner, address indexed spender, uint256 amount);
}

// File: contracts/ERC820/ERC820Client.sol

contract ERC820Registry {
    function setInterfaceImplementer(address _addr, bytes32 _interfaceHash, address _implementer) external;
    function getInterfaceImplementer(address _addr, bytes32 _interfaceHash) external view returns (address);
    function setManager(address _addr, address _newManager) external;
    function getManager(address _addr) public view returns(address);
}


/// Base client to interact with the registry.
contract ERC820Client {
    ERC820Registry erc820Registry = ERC820Registry(0x820c4597Fc3E4193282576750Ea4fcfe34DdF0a7);

    function setInterfaceImplementation(string _interfaceLabel, address _implementation) internal {
        bytes32 interfaceHash = keccak256(abi.encodePacked(_interfaceLabel));
        erc820Registry.setInterfaceImplementer(this, interfaceHash, _implementation);
    }

    function interfaceAddr(address addr, string _interfaceLabel) internal view returns(address) {
        bytes32 interfaceHash = keccak256(abi.encodePacked(_interfaceLabel));
        return erc820Registry.getInterfaceImplementer(addr, interfaceHash);
    }

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

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

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

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

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

    return c;
  }

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

    return c;
  }

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

    return c;
  }

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

    return c;
  }

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

// File: contracts/openzeppelin-solidity/Address.sol

/**
 * Utility library of inline functions on addresses
 */
library Address {

  /**
   * Returns whether the target address is a contract
   * @dev This function will return false if invoked during the constructor of a contract,
   * as the code is not actually created until after the constructor finishes.
   * @param account address of the account to check
   * @return whether the target address is a contract
   */
  function isContract(address account) internal view returns (bool) {
    uint256 size;
    // XXX Currently there is no better way to check if there is a contract in an address
    // than to check the size of the code at that address.
    // See https://ethereum.stackexchange.com/a/14016/36603
    // for more details about how this works.
    // TODO Check this again before the Serenity release, because all addresses will be
    // contracts then.
    // solium-disable-next-line security/no-inline-assembly
    assembly { size := extcodesize(account) }
    return size > 0;
  }

}

// File: contracts/ERC777/ERC777Token.sol

/* This Source Code Form is subject to the terms of the Mozilla external
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This code has not been reviewed.
 * Do not use or deploy this code before reviewing it personally first.
 */


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

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

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

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

  event Sent(
    address indexed operator,
    address indexed from,
    address indexed to,
    uint256 amount,
    bytes holderData,
    bytes operatorData
  );
  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);
}

// File: contracts/ERC777/ERC777TokensSender.sol

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This code has not been reviewed.
 * Do not use or deploy this code before reviewing it personally first.
 */


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

// File: contracts/ERC777/ERC777TokensRecipient.sol

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
 *
 * This code has not been reviewed.
 * Do not use or deploy this code before reviewing it personally first.
 */


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

// File: contracts/ERC777/ERC777BaseToken.sol

/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */








contract ERC777BaseToken is ERC777Token, ERC820Client {
  using SafeMath for uint256;
  using Address for address;

  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 SelfToken
  /// @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 -- */

  /// @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) external {
    doSend(msg.sender, msg.sender, _to, _amount, _userData, "", true);
  }

  /// @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) external {
    require(isOperatorFor(msg.sender, _from));
    doSend(msg.sender, _from, _to, _amount, _userData, _operatorData, true);
  }

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

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

  /// @return the name of the token
  function name() external view returns (string) { return mName; }

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

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

  /// @return the total supply of the token
  function totalSupply() public view 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 view returns (uint256) { return mBalances[_tokenHolder]; }

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

  /// @notice Authorize a third party `_operator` to manage (send) `msg.sender`'s tokens. An operator cannot be reauthorized
  /// @param _operator The operator that wants to be Authorized
  function authorizeOperator(address _operator) external {
    require(_operator != msg.sender);
    require(!mAuthorized[_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) external {
    require(_operator != msg.sender);
    require(mAuthorized[_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 view returns (bool) {
    return (
      _operator == _tokenHolder
      || mAuthorized[_operator][_tokenHolder]
      || (mIsDefaultOperator[_operator] && !mRevokedDefaultOperator[_operator][_tokenHolder])
    );
  }

  /* -- 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 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 `ERC777TokensRecipient`.
  ///  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(!_to.isContract());
    }
  }

  /// @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);
  }
}

// File: contracts/ERC777/ERC777ERC20BaseToken.sol

/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */




contract ERC777ERC20BaseToken is ERC20Token, ERC777BaseToken {
  bool internal mErc20compatible;

  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() external erc20 view 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 view 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);
    }
  }
}

// File: contracts/openzeppelin-solidity/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: contracts/openzeppelin-solidity/lifecycle/Pausable.sol

/**
 * @title Pausable
 * @dev Base contract which allows children to implement an emergency stop mechanism.
 */
contract Pausable is Ownable {
  event Pause();
  event Unpause();

  bool public paused = false;


  /**
   * @dev Modifier to make a function callable only when the contract is not paused.
   */
  modifier whenNotPaused() {
    require(!paused);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the contract is paused.
   */
  modifier whenPaused() {
    require(paused);
    _;
  }

  /**
   * @dev called by the owner to pause, triggers stopped state
   */
  function pause() public onlyOwner whenNotPaused {
    paused = true;
    emit Pause();
  }

  /**
   * @dev called by the owner to unpause, returns to normal state
   */
  function unpause() public onlyOwner whenPaused {
    paused = false;
    emit Unpause();
  }
}

// File: contracts/utils/Freezable.sol

/// @title An inheritable extension for a contract to freeze accessibility of any specific addresses
/// @author Jeff Hu
/// @notice Have a contract inherited from this to use the modifiers: whenAccountFrozen(), whenAccountNotFrozen()
/// @dev Concern: Ownable may cause multiple owners; You need to pass in msg.sender when using modifiers
contract Freezable is Ownable {

  event AccountFrozen(address indexed _account);
  event AccountUnfrozen(address indexed _account);

  // frozen status of all accounts
  mapping(address=>bool) public frozenAccounts;


   /**
   * @dev Modifier to make a function callable only when the address is frozen.
   */
  modifier whenAccountFrozen(address _account) {
    require(frozenAccounts[_account] == true);
    _;
  }

  /**
   * @dev Modifier to make a function callable only when the address is not frozen.
   */
  modifier whenAccountNotFrozen(address _account) {
    require(frozenAccounts[_account] == false);
    _;
  }


  /**
   * @dev Function to freeze an account from transactions
   */
  function freeze(address _account)
    external
    onlyOwner
    whenAccountNotFrozen(_account)
    returns (bool)
  {
    frozenAccounts[_account] = true;
    emit AccountFrozen(_account);
    return true;
  }

  /**
   * @dev Function to unfreeze an account form frozen state
   */
  function unfreeze(address _account)
    external
    onlyOwner
    whenAccountFrozen(_account)
    returns (bool)
  {
    frozenAccounts[_account] = false;
    emit AccountUnfrozen(_account);
    return true;
  }


  /**
   * @dev A user can choose to freeze her account (not unfreezable)
   */
  function freezeMyAccount()
    external
    whenAccountNotFrozen(msg.sender)
    returns (bool)
  {
    // require(msg.sender != owner);       // Only the owner cannot freeze herself

    frozenAccounts[msg.sender] = true;
    emit AccountFrozen(msg.sender);
    return true;
  }
}

// File: contracts/PausableFreezableERC777ERC20Token.sol

/// @dev The owner can pause/unpause the token.
/// When paused, all functions that may change the token balances are prohibited.
/// Function approve is prohibited too.
contract PausableFreezableERC777ERC20Token is ERC777ERC20BaseToken, Pausable, Freezable {

  // ERC777 methods

  /// @dev We can not call super.send() because send() is an external function.
  /// We can only override it.
  function send(address _to, uint256 _amount, bytes _userData)
    external
    whenNotPaused
    whenAccountNotFrozen(msg.sender)
    whenAccountNotFrozen(_to)
  {
    doSend(msg.sender, msg.sender, _to, _amount, _userData, "", true);
  }

  function operatorSend(address _from, address _to, uint256 _amount, bytes _userData, bytes _operatorData)
    external
    whenNotPaused
    whenAccountNotFrozen(msg.sender)
    whenAccountNotFrozen(_from)
    whenAccountNotFrozen(_to)
  {
    require(isOperatorFor(msg.sender, _from));
    doSend(msg.sender, _from, _to, _amount, _userData, _operatorData, true);
  }

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

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

  // ERC20 methods

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

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

  function approve(address _spender, uint256 _amount)
    public
    erc20
    whenNotPaused
    whenAccountNotFrozen(msg.sender)
    whenAccountNotFrozen(_spender)
    returns (bool success)
  {
    return super.approve(_spender, _amount);
  }

  /// @dev allow Owner to transfer funds from a Frozen account
  /// @notice the "_from" account must be frozen
  /// @notice only the owner can trigger this function
  /// @notice super.doSend to skip "_from" frozen checking
  function transferFromFrozenAccount(
    address _from,
    address _to,
    uint256 _amount
  )
    external
    onlyOwner
    whenNotPaused
    whenAccountFrozen(_from)
    whenAccountNotFrozen(_to)
    whenAccountNotFrozen(msg.sender)
  {
    super.doSend(msg.sender, _from, _to, _amount, "", "", true);
  }

  function doSend(
    address _operator,
    address _from,
    address _to,
    uint256 _amount,
    bytes _userData,
    bytes _operatorData,
    bool _preventLocking
  )
    internal
    whenNotPaused
    whenAccountNotFrozen(msg.sender)
    whenAccountNotFrozen(_operator)
    whenAccountNotFrozen(_from)
    whenAccountNotFrozen(_to)
  {
    super.doSend(_operator, _from, _to, _amount, _userData, _operatorData, _preventLocking);
  }

  function doBurn(address _operator, address _tokenHolder, uint256 _amount, bytes _holderData, bytes _operatorData)
    internal
    whenNotPaused
    whenAccountNotFrozen(msg.sender)
    whenAccountNotFrozen(_operator)
    whenAccountNotFrozen(_tokenHolder)
  {
    super.doBurn(_operator, _tokenHolder, _amount, _holderData, _operatorData);
  }
}

// File: contracts/ERC777ERC20TokenWithOfficialOperators.sol

/// @title ERC777 ERC20 Token with Official Operators
/// @author Roger-Wu
/// @notice Official operators are officially recommended operator contracts.
/// By adding new official operators, we can keep adding new features to
/// an already deployed token contract, which can be viewed as a way to
/// upgrade the token contract.
/// Rules of official operators:
/// 1. An official operator must be a contract.
/// 2. An official operator can only be added or removed by the contract owner.
/// 3. A token holder can either accept all official operators or not.
///    By default, a token holder accepts all official operators, including
///    the official operators added in the future.
/// 4. If a token holder accepts all official operators, it works as if all
///    the addresses of official operators has been authorized to be his operator.
///    In this case, an official operator will always be the token holder's
///    operator even if he tries to revoke it by sending `revokeOperator` transactions.
/// 5. If a token holder chooses not to accept all official operators, it works as if
///    there is no official operator at all for him. The token holder can still authorize
///    any addresses, including which of official operators, to be his operators.
contract ERC777ERC20TokenWithOfficialOperators is ERC777ERC20BaseToken, Ownable {
  using Address for address;

  mapping(address => bool) internal mIsOfficialOperator;
  mapping(address => bool) internal mIsUserNotAcceptingAllOfficialOperators;

  event OfficialOperatorAdded(address operator);
  event OfficialOperatorRemoved(address operator);
  event OfficialOperatorsAcceptedByUser(address indexed user);
  event OfficialOperatorsRejectedByUser(address indexed user);

  /// @notice Add an address into the list of official operators.
  /// @param _operator The address of a new official operator.
  /// An official operator must be a contract.
  function addOfficialOperator(address _operator) external onlyOwner {
    require(_operator.isContract(), "An official operator must be a contract.");
    require(!mIsOfficialOperator[_operator], "_operator is already an official operator.");

    mIsOfficialOperator[_operator] = true;
    emit OfficialOperatorAdded(_operator);
  }

  /// @notice Delete an address from the list of official operators.
  /// @param _operator The address of an official operator.
  function removeOfficialOperator(address _operator) external onlyOwner {
    require(mIsOfficialOperator[_operator], "_operator is not an official operator.");

    mIsOfficialOperator[_operator] = false;
    emit OfficialOperatorRemoved(_operator);
  }

  /// @notice Unauthorize all official operators to manage `msg.sender`'s tokens.
  function rejectAllOfficialOperators() external {
    require(!mIsUserNotAcceptingAllOfficialOperators[msg.sender], "Official operators are already rejected by msg.sender.");

    mIsUserNotAcceptingAllOfficialOperators[msg.sender] = true;
    emit OfficialOperatorsRejectedByUser(msg.sender);
  }

  /// @notice Authorize all official operators to manage `msg.sender`'s tokens.
  function acceptAllOfficialOperators() external {
    require(mIsUserNotAcceptingAllOfficialOperators[msg.sender], "Official operators are already accepted by msg.sender.");

    mIsUserNotAcceptingAllOfficialOperators[msg.sender] = false;
    emit OfficialOperatorsAcceptedByUser(msg.sender);
  }

  /// @return true if the address is an official operator, false if not.
  function isOfficialOperator(address _operator) external view returns(bool) {
    return mIsOfficialOperator[_operator];
  }

  /// @return true if a user is accepting all official operators, false if not.
  function isUserAcceptingAllOfficialOperators(address _user) external view returns(bool) {
    return !mIsUserNotAcceptingAllOfficialOperators[_user];
  }

  /// @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 view returns (bool) {
    return (
      _operator == _tokenHolder
      || (!mIsUserNotAcceptingAllOfficialOperators[_tokenHolder] && mIsOfficialOperator[_operator])
      || mAuthorized[_operator][_tokenHolder]
      || (mIsDefaultOperator[_operator] && !mRevokedDefaultOperator[_operator][_tokenHolder])
    );
  }
}

// File: contracts/ApprovalRecipient.sol

interface ApprovalRecipient {
  function receiveApproval(
    address _from,
    uint256 _value,
    address _token,
    bytes _extraData
  ) external;
}

// File: contracts/ERC777ERC20TokenWithApproveAndCall.sol

contract ERC777ERC20TokenWithApproveAndCall is PausableFreezableERC777ERC20Token {
  /// Set allowance for other address and notify
  /// Allows `_spender` to spend no more than `_value` tokens on your behalf, and then ping the contract about it
  /// From https://www.ethereum.org/token
  /// @param _spender The address authorized to spend
  /// @param _value the max amount they can spend
  /// @param _extraData some extra information to send to the approved contract
  function approveAndCall(address _spender, uint256 _value, bytes _extraData)
    external
    whenNotPaused
    whenAccountNotFrozen(msg.sender)
    whenAccountNotFrozen(_spender)
    returns (bool success)
  {
    ApprovalRecipient spender = ApprovalRecipient(_spender);
    if (approve(_spender, _value)) {
      spender.receiveApproval(msg.sender, _value, this, _extraData);
      return true;
    }
  }
}

// File: contracts/ERC777ERC20TokenWithBatchTransfer.sol

contract ERC777ERC20TokenWithBatchTransfer is PausableFreezableERC777ERC20Token {
  /// @notice ERC20 backwards compatible batch transfer.
  /// The transaction will revert if any of the recipients is frozen.
  /// We check whether a recipient is frozen in `doSend`.
  /// @param _recipients The addresses of the recipients
  /// @param _amounts The numbers of tokens to be transferred
  /// @return `true`, if the transfer can't be done, it should fail.
  function batchTransfer(address[] _recipients, uint256[] _amounts)
    external
    erc20
    whenNotPaused
    whenAccountNotFrozen(msg.sender)
    returns (bool success)
  {
    require(
      _recipients.length == _amounts.length,
      "The lengths of _recipients and _amounts should be the same."
    );

    for (uint256 i = 0; i < _recipients.length; i++) {
      doSend(msg.sender, msg.sender, _recipients[i], _amounts[i], "", "", false);
    }
    return true;
  }

  /// @notice Send tokens to multiple recipients.
  /// The transaction will revert if any of the recipients is frozen.
  /// We check whether a recipient is frozen in `doSend`.
  /// @param _recipients The addresses of the recipients
  /// @param _amounts The numbers of tokens to be transferred
  /// @param _userData Data generated by the user to be sent to the recipient
  function batchSend(
    address[] _recipients,
    uint256[] _amounts,
    bytes _userData
  )
    external
    whenNotPaused
    whenAccountNotFrozen(msg.sender)
  {
    require(
      _recipients.length == _amounts.length,
      "The lengths of _recipients and _amounts should be the same."
    );

    for (uint256 i = 0; i < _recipients.length; i++) {
      doSend(msg.sender, msg.sender, _recipients[i], _amounts[i], _userData, "", true);
    }
  }

  /// @notice Send tokens to multiple recipients on behalf of the address `from`
  /// The transaction will revert if any of the recipients is frozen.
  /// We check whether a recipient is frozen in `doSend`.
  /// @param _from The address holding the tokens being sent
  /// @param _recipients The addresses of the recipients
  /// @param _amounts The numbers of tokens to be transferred
  /// @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 operatorBatchSend(
    address _from,
    address[] _recipients,
    uint256[] _amounts,
    bytes _userData,
    bytes _operatorData
  )
    external
    whenNotPaused
    whenAccountNotFrozen(msg.sender)
    whenAccountNotFrozen(_from)
  {
    require(
      _recipients.length == _amounts.length,
      "The lengths of _recipients and _amounts should be the same."
    );
    require(isOperatorFor(msg.sender, _from));

    for (uint256 i = 0; i < _recipients.length; i++) {
      doSend(msg.sender, _from, _recipients[i], _amounts[i], _userData, _operatorData, true);
    }
  }
}

// File: contracts/CappedMintableERC777ERC20Token.sol

/// @title Capped Mintable ERC777 ERC20 Token
/// @author Roger-Wu
/// @dev Mintable token with a minting cap.
///  The owner can mint any amount of tokens until the cap is reached.
contract CappedMintableERC777ERC20Token is ERC777ERC20BaseToken, Ownable {
  uint256 internal mTotalSupplyCap;

  constructor(uint256 _totalSupplyCap) public {
    mTotalSupplyCap = _totalSupplyCap;
  }

  /// @return the cap of total supply
  function totalSupplyCap() external view returns(uint _totalSupplyCap) {
    return mTotalSupplyCap;
  }

  /// @dev 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.
  ///  Reference: https://github.com/jacquesd/ERC777/blob/devel/contracts/examples/SelfToken.sol
  /// @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) external onlyOwner {
    requireMultiple(_amount);
    require(mTotalSupply.add(_amount) <= mTotalSupplyCap);

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

    callRecipient(msg.sender, address(0), _tokenHolder, _amount, "", _operatorData, true);

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

// File: contracts/ERC777ERC20TokenWithOperatorApprove.sol

/// @title ERC777 ERC20 Token with Operator Approve
/// @author Roger-Wu
/// @notice Allow an operator to approve tokens for a token holder.
contract ERC777ERC20TokenWithOperatorApprove is ERC777ERC20BaseToken {
  function operatorApprove(
    address _tokenHolder,
    address _spender,
    uint256 _amount
  )
    external
    erc20
    returns (bool success)
  {
    require(
      isOperatorFor(msg.sender, _tokenHolder),
      "msg.sender is not an operator for _tokenHolder"
    );

    mAllowed[_tokenHolder][_spender] = _amount;
    emit Approval(_tokenHolder, _spender, _amount);
    return true;
  }
}

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

/**
 * @title Claimable
 * @dev Extension for the Ownable contract, where the ownership needs to be claimed.
 * This allows the new owner to accept the transfer.
 */
contract Claimable is Ownable {
  address public pendingOwner;

  /**
   * @dev Modifier throws if called by any account other than the pendingOwner.
   */
  modifier onlyPendingOwner() {
    require(msg.sender == pendingOwner);
    _;
  }

  /**
   * @dev Allows the current owner to set the pendingOwner address.
   * @param newOwner The address to transfer ownership to.
   */
  function transferOwnership(address newOwner) public onlyOwner {
    pendingOwner = newOwner;
  }

  /**
   * @dev Allows the pendingOwner address to finalize the transfer.
   */
  function claimOwnership() public onlyPendingOwner {
    emit OwnershipTransferred(owner, pendingOwner);
    owner = pendingOwner;
    pendingOwner = address(0);
  }
}

// File: contracts/SelfToken.sol

/// @title SelfToken
/// @author Roger Wu (Roger-Wu), Tina Lee (tina1998612), Jeff Hu (yhuag)
/// @dev The inheritance order is important.
contract SelfToken is
  ERC777ERC20BaseToken,
  PausableFreezableERC777ERC20Token,
  ERC777ERC20TokenWithOfficialOperators,
  ERC777ERC20TokenWithApproveAndCall,
  ERC777ERC20TokenWithBatchTransfer,
  CappedMintableERC777ERC20Token,
  ERC777ERC20TokenWithOperatorApprove,
  Claimable
{
  constructor()
    public
    ERC777ERC20BaseToken("SELF TOKEN", "SELF", 1, new address[](0))
    CappedMintableERC777ERC20Token(1e9 * 1e18)
  {}
}

Contract Security Audit

Contract ABI

[{"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":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_tokenHolder","type":"address"},{"name":"_spender","type":"address"},{"name":"_amount","type":"uint256"}],"name":"operatorApprove","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":false,"inputs":[{"name":"_operator","type":"address"}],"name":"addOfficialOperator","outputs":[],"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":"freezeMyAccount","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_recipients","type":"address[]"},{"name":"_amounts","type":"uint256[]"},{"name":"_userData","type":"bytes"}],"name":"batchSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"unpause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"unfreeze","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_to","type":"address"},{"name":"_amount","type":"uint256"}],"name":"transferFromFrozenAccount","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"claimOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"granularity","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"rejectAllOfficialOperators","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"paused","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","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":"_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":"pause","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"frozenAccounts","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_recipients","type":"address[]"},{"name":"_amounts","type":"uint256[]"}],"name":"batchTransfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_account","type":"address"}],"name":"freeze","outputs":[{"name":"","type":"bool"}],"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":true,"inputs":[{"name":"_operator","type":"address"}],"name":"isOfficialOperator","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"acceptAllOfficialOperators","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":false,"inputs":[{"name":"_operator","type":"address"}],"name":"removeOfficialOperator","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"totalSupplyCap","outputs":[{"name":"_totalSupplyCap","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"approveAndCall","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":"_user","type":"address"}],"name":"isUserAcceptingAllOfficialOperators","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":true,"inputs":[],"name":"pendingOwner","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_from","type":"address"},{"name":"_recipients","type":"address[]"},{"name":"_amounts","type":"uint256[]"},{"name":"_userData","type":"bytes"},{"name":"_operatorData","type":"bytes"}],"name":"operatorBatchSend","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"newOwner","type":"address"}],"name":"transferOwnership","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":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":[{"indexed":false,"name":"operator","type":"address"}],"name":"OfficialOperatorAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"operator","type":"address"}],"name":"OfficialOperatorRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"}],"name":"OfficialOperatorsAcceptedByUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"user","type":"address"}],"name":"OfficialOperatorsRejectedByUser","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_account","type":"address"}],"name":"AccountFrozen","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_account","type":"address"}],"name":"AccountUnfrozen","type":"event"},{"anonymous":false,"inputs":[],"name":"Pause","type":"event"},{"anonymous":false,"inputs":[],"name":"Unpause","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"},{"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"}]

608060405260008054600160a060020a03191673820c4597fc3e4193282576750ea4fcfe34ddf0a7179055600c805460a060020a60ff02191690553480156200004757600080fd5b50604080518082018252600a81527f53454c4620544f4b454e00000000000000000000000000000000000000000000602080830191825283518085018552600481527f53454c4600000000000000000000000000000000000000000000000000000000818301528451600080825292810190955283516b033b2e3c9fd0803ce800000095919360019386928692869286929091620000e891859190620003b0565b508351620000fe906002906020870190620003b0565b50600060045560018310156200011357600080fd5b600383905581516200012d90600790602085019062000435565b50600090505b60075481101562000191576001600860006007848154811015156200015457fe5b600091825260208083209190910154600160a060020a031683528201929092526040019020805460ff191691151591909117905560010162000133565b60408051808201909152600b81527f455243373737546f6b656e0000000000000000000000000000000000000000006020820152620001da903064010000000062000255810204565b5050600a805460ff19166001178155604080518082019091529081527f4552433230546f6b656e000000000000000000000000000000000000000000006020820152620002369350915030905064010000000062000255810204565b5050600c8054600160a060020a031916331790555050601055620004e2565b6000826040516020018082805190602001908083835b602083106200028c5780518252601f1990920191602091820191016200026b565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310620002f15780518252601f199092019160209182019101620002d0565b5181516020939093036101000a600019018019909116921691909117905260408051919093018190038120600080547f29965a1d00000000000000000000000000000000000000000000000000000000845230600485015260248401839052600160a060020a038a8116604486015295519298509490941695506329965a1d94506064808301949350909182900301818387803b1580156200039257600080fd5b505af1158015620003a7573d6000803e3d6000fd5b50505050505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10620003f357805160ff191683800117855562000423565b8280016001018555821562000423579182015b828111156200042357825182559160200191906001019062000406565b50620004319291506200049b565b5090565b8280548282559060005260206000209081019282156200048d579160200282015b828111156200048d5782518254600160a060020a031916600160a060020a0390911617825560209092019160019091019062000456565b5062000431929150620004bb565b620004b891905b80821115620004315760008155600101620004a2565b90565b620004b891905b8082111562000431578054600160a060020a0319168155600101620004c2565b61319680620004f26000396000f3006080604052600436106102005763ffffffff60e060020a60003504166306e48538811461020557806306fdde031461026a578063095ea7b3146102f45780630c2970291461032c57806318160ddd1461035657806323b872dd1461037d578063263cfbe0146103a7578063313ce567146103ca57806332081f9e146103f557806337f26e5b1461040a5780633f4ba83a1461044257806345c8b1a61461045757806348d3321f146104785780634e71e0c8146104a2578063556f0dc7146104b75780635c59ed7b146104cc5780635c975abb146104e157806362ad1b83146104f657806370a082311461053b578063715018a61461055c5780638456cb5914610571578063860838a51461058657806388d695b2146105a75780638d1fdf2f146105d35780638da5cb5b146105f457806394d008ef14610625578063959b8c3f1461065657806395d89b41146106775780639bd9bbc61461068c578063a506a0a1146106bd578063a60c2312146106de578063a9059cbb146106f3578063b1c4c72b14610717578063bb102aea14610738578063cae9ca511461074d578063d95b63711461077e578063daa4eb53146107a5578063dd62ed3e146107c6578063e30c3978146107ed578063f040cd0b14610802578063f2fde38b14610853578063fad8b32a14610874578063fc673c4f14610895578063fe9d9303146108d2575b600080fd5b34801561021157600080fd5b5061021a6108f6565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561025657818101518382015260200161023e565b505050509050019250505060405180910390f35b34801561027657600080fd5b5061027f610958565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b95781810151838201526020016102a1565b50505050905090810190601f1680156102e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030057600080fd5b50610318600160a060020a03600435166024356109e4565b604080519115158252519081900360200190f35b34801561033857600080fd5b50610318600160a060020a0360043581169060243516604435610a67565b34801561036257600080fd5b5061036b610b68565b60408051918252519081900360200190f35b34801561038957600080fd5b50610318600160a060020a0360043581169060243516604435610b6e565b3480156103b357600080fd5b506103c8600160a060020a0360043516610c1c565b005b3480156103d657600080fd5b506103df610db3565b6040805160ff9092168252519081900360200190f35b34801561040157600080fd5b50610318610dcd565b34801561041657600080fd5b506103c86024600480358281019290820135918135808301929082013591604435918201910135610e35565b34801561044e57600080fd5b506103c8610f8a565b34801561046357600080fd5b50610318600160a060020a0360043516611002565b34801561048457600080fd5b506103c8600160a060020a0360043581169060243516604435611097565b3480156104ae57600080fd5b506103c861116e565b3480156104c357600080fd5b5061036b6111f8565b3480156104d857600080fd5b506103c86111fe565b3480156104ed57600080fd5b506103186112ce565b34801561050257600080fd5b506103c8600160a060020a03600480358216916024803590911691604435916064358082019290810135916084359081019101356112de565b34801561054757600080fd5b5061036b600160a060020a03600435166113f6565b34801561056857600080fd5b506103c8611411565b34801561057d57600080fd5b506103c861147f565b34801561059257600080fd5b50610318600160a060020a03600435166114fc565b3480156105b357600080fd5b506103186024600480358281019290820135918135918201910135611511565b3480156105df57600080fd5b50610318600160a060020a036004351661165c565b34801561060057600080fd5b506106096116f0565b60408051600160a060020a039092168252519081900360200190f35b34801561063157600080fd5b506103c860048035600160a060020a03169060248035916044359182019101356116ff565b34801561066257600080fd5b506103c8600160a060020a03600435166118a6565b34801561068357600080fd5b5061027f6119a6565b34801561069857600080fd5b506103c860048035600160a060020a0316906024803591604435918201910135611a04565b3480156106c957600080fd5b50610318600160a060020a0360043516611ab0565b3480156106ea57600080fd5b506103c8611ace565b3480156106ff57600080fd5b50610318600160a060020a0360043516602435611b9c565b34801561072357600080fd5b506103c8600160a060020a0360043516611c16565b34801561074457600080fd5b5061036b611d1d565b34801561075957600080fd5b5061031860048035600160a060020a0316906024803591604435918201910135611d23565b34801561078a57600080fd5b50610318600160a060020a0360043581169060243516611e56565b3480156107b157600080fd5b50610318600160a060020a0360043516611f3f565b3480156107d257600080fd5b5061036b600160a060020a0360043581169060243516611f5e565b3480156107f957600080fd5b50610609611f9e565b34801561080e57600080fd5b506103c860048035600160a060020a03169060248035808201929081013591604435808201929081013591606435808201929081013591608435908101910135611fad565b34801561085f57600080fd5b506103c8600160a060020a0360043516612166565b34801561088057600080fd5b506103c8600160a060020a03600435166121ac565b3480156108a157600080fd5b506103c860048035600160a060020a03169060248035916044358083019290820135916064359182019101356122ad565b3480156108de57600080fd5b506103c8600480359060248035908101910135612388565b6060600780548060200260200160405190810160405280929190818152602001828054801561094e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610930575b5050505050905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109b85761010080835404028352916020019161094e565b820191906000526020600020905b8154815290600101906020018083116109c657509395945050505050565b600a5460009060ff1615156109f857600080fd5b600c5460a060020a900460ff1615610a0f57600080fd5b336000818152600d602052604090205460ff1615610a2c57600080fd5b600160a060020a0384166000908152600d6020526040902054849060ff1615610a5457600080fd5b610a5e8585612408565b95945050505050565b600a5460009060ff161515610a7b57600080fd5b610a853385611e56565b1515610b01576040805160e560020a62461bcd02815260206004820152602e60248201527f6d73672e73656e646572206973206e6f7420616e206f70657261746f7220666f60448201527f72205f746f6b656e486f6c646572000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038085166000818152600b6020908152604080832094881680845294825291829020869055815186815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35060019392505050565b60045490565b600a5460009060ff161515610b8257600080fd5b600c5460a060020a900460ff1615610b9957600080fd5b336000818152600d602052604090205460ff1615610bb657600080fd5b600160a060020a0385166000908152600d6020526040902054859060ff1615610bde57600080fd5b600160a060020a0385166000908152600d6020526040902054859060ff1615610c0657600080fd5b610c11878787612483565b979650505050505050565b600c54600160a060020a03163314610c3357600080fd5b610c4581600160a060020a0316612556565b1515610cc1576040805160e560020a62461bcd02815260206004820152602860248201527f416e206f6666696369616c206f70657261746f72206d7573742062652061206360448201527f6f6e74726163742e000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0381166000908152600e602052604090205460ff1615610d58576040805160e560020a62461bcd02815260206004820152602a60248201527f5f6f70657261746f7220697320616c726561647920616e206f6666696369616c60448201527f206f70657261746f722e00000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0381166000818152600e6020908152604091829020805460ff19166001179055815192835290517fcc19abc65009012e41c631da2d8277d8740ebceb112ef974cc784ea191e470a79281900390910190a150565b600a5460009060ff161515610dc757600080fd5b50601290565b336000818152600d602052604081205490919060ff1615610ded57600080fd5b336000818152600d6020526040808220805460ff19166001179055517f4f2a367e694e71282f29ab5eaa04c4c0be45ac5bf2ca74fb67068b98bdc2887d9190a2600191505090565b600c5460009060a060020a900460ff1615610e4f57600080fd5b336000818152600d602052604090205460ff1615610e6c57600080fd5b868514610ee9576040805160e560020a62461bcd02815260206004820152603b60248201527f546865206c656e67746873206f66205f726563697069656e747320616e64205f60448201527f616d6f756e74732073686f756c64206265207468652073616d652e0000000000606482015290519081900360840190fd5b600091505b86821015610f8057610f7533808a8a86818110610f0757fe5b90506020020135600160a060020a03168989878181101515610f2557fe5b9050602002013588888080601f016020809104026020016040519081016040528093929190818152602001838380828437505060408051602081019091526000815293506001925061255e915050565b600190910190610eee565b5050505050505050565b600c54600160a060020a03163314610fa157600080fd5b600c5460a060020a900460ff161515610fb957600080fd5b600c805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600c54600090600160a060020a0316331461101c57600080fd5b600160a060020a0382166000908152600d6020526040902054829060ff16151560011461104857600080fd5b600160a060020a0383166000818152600d6020526040808220805460ff19169055517ff915cd9fe234de6e8d3afe7bf2388d35b2b6d48e8c629a24602019bde79c213a9190a250600192915050565b600c54600160a060020a031633146110ae57600080fd5b600c5460a060020a900460ff16156110c557600080fd5b600160a060020a0383166000908152600d6020526040902054839060ff1615156001146110f157600080fd5b600160a060020a0383166000908152600d6020526040902054839060ff161561111957600080fd5b336000818152600d602052604090205460ff161561113657600080fd5b61116633878787602060405190810160405280600081525060206040519081016040528060008152506001612626565b505050505050565b601154600160a060020a0316331461118557600080fd5b601154600c54604051600160a060020a0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360118054600c805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b60035490565b336000908152600f602052604090205460ff161561128c576040805160e560020a62461bcd02815260206004820152603660248201527f4f6666696369616c206f70657261746f72732061726520616c7265616479207260448201527f656a6563746564206279206d73672e73656e6465722e00000000000000000000606482015290519081900360840190fd5b336000818152600f6020526040808220805460ff19166001179055517fe41b009a6b640ace2118aefe12476c796e8c6c81a737ff53284b0ffbdefb70ca9190a2565b600c5460a060020a900460ff1681565b600c5460a060020a900460ff16156112f557600080fd5b336000818152600d602052604090205460ff161561131257600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff161561133a57600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff161561136257600080fd5b61136c338b611e56565b151561137757600080fd5b6113ea338b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437506001945061255e9350505050565b50505050505050505050565b600160a060020a031660009081526005602052604090205490565b600c54600160a060020a0316331461142857600080fd5b600c54604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2600c805473ffffffffffffffffffffffffffffffffffffffff19169055565b600c54600160a060020a0316331461149657600080fd5b600c5460a060020a900460ff16156114ad57600080fd5b600c805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600d6020526000908152604090205460ff1681565b600a54600090819060ff16151561152757600080fd5b600c5460a060020a900460ff161561153e57600080fd5b336000818152600d602052604090205460ff161561155b57600080fd5b8584146115d8576040805160e560020a62461bcd02815260206004820152603b60248201527f546865206c656e67746873206f66205f726563697069656e747320616e64205f60448201527f616d6f756e74732073686f756c64206265207468652073616d652e0000000000606482015290519081900360840190fd5b600091505b8582101561164f5761164433808989868181106115f657fe5b90506020020135600160a060020a0316888887818110151561161457fe5b9050602002013560206040519081016040528060008152506020604051908101604052806000815250600061255e565b6001909101906115dd565b5060019695505050505050565b600c54600090600160a060020a0316331461167657600080fd5b600160a060020a0382166000908152600d6020526040902054829060ff161561169e57600080fd5b600160a060020a0383166000818152600d6020526040808220805460ff19166001179055517f4f2a367e694e71282f29ab5eaa04c4c0be45ac5bf2ca74fb67068b98bdc2887d9190a250600192915050565b600c54600160a060020a031681565b600c54600160a060020a0316331461171657600080fd5b61171f83612695565b601054600454611735908563ffffffff6126c716565b111561174057600080fd5b600454611753908463ffffffff6126c716565b600455600160a060020a03841660009081526005602052604090205461177f908463ffffffff6126c716565b600160a060020a038516600090815260056020908152604080832093909355825180820184528281528351601f86018390048302810183019094528484526117e793339392899289929091899089908190840183828082843750600194506126e49350505050565b83600160a060020a031633600160a060020a03167fbcd28e05e57d4bcd5bfcc92a4661d412893e6112c44a2e25d96cfdfc30d5f22e858585604051808481526020018060200182810382528484828181526020019250808284376040519201829003965090945050505050a3600a5460ff16156118a057604080518481529051600160a060020a038616916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b50505050565b600160a060020a0381163314156118bc57600080fd5b600160a060020a038116600090815260066020908152604080832033845290915290205460ff16156118ed57600080fd5b600160a060020a03811660009081526008602052604090205460ff161561193e57600160a060020a03811660009081526009602090815260408083203384529091529020805460ff1916905561196d565b600160a060020a03811660009081526006602090815260408083203384529091529020805460ff191660011790555b6040513390600160a060020a038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109b85761010080835404028352916020019161094e565b600c5460a060020a900460ff1615611a1b57600080fd5b336000818152600d602052604090205460ff1615611a3857600080fd5b600160a060020a0385166000908152600d6020526040902054859060ff1615611a6057600080fd5b6111663333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437505060408051602081019091526000815293506001925061255e915050565b600160a060020a03166000908152600e602052604090205460ff1690565b336000908152600f602052604090205460ff161515611b5d576040805160e560020a62461bcd02815260206004820152603660248201527f4f6666696369616c206f70657261746f72732061726520616c7265616479206160448201527f63636570746564206279206d73672e73656e6465722e00000000000000000000606482015290519081900360840190fd5b336000818152600f6020526040808220805460ff19169055517fad3793ccba4bf145fba17f6e508c1db7de72afcee73d854cb0d5220cb4022c9f9190a2565b600a5460009060ff161515611bb057600080fd5b600c5460a060020a900460ff1615611bc757600080fd5b336000818152600d602052604090205460ff1615611be457600080fd5b600160a060020a0384166000908152600d6020526040902054849060ff1615611c0c57600080fd5b610a5e85856128dc565b600c54600160a060020a03163314611c2d57600080fd5b600160a060020a0381166000908152600e602052604090205460ff161515611cc5576040805160e560020a62461bcd02815260206004820152602660248201527f5f6f70657261746f72206973206e6f7420616e206f6666696369616c206f706560448201527f7261746f722e0000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0381166000818152600e6020908152604091829020805460ff19169055815192835290517fdbac57781dae8783301559623b7c269c0945af5afc6741c1eb02d6cbe21e54509281900390910190a150565b60105490565b600c54600090819060a060020a900460ff1615611d3f57600080fd5b336000818152600d602052604090205460ff1615611d5c57600080fd5b600160a060020a0387166000908152600d6020526040902054879060ff1615611d8457600080fd5b879250611d9188886109e4565b15611e4b576040517f8f4ffcb10000000000000000000000000000000000000000000000000000000081523360048201818152602483018a90523060448401819052608060648501908152608485018a9052600160a060020a03881694638f4ffcb194938d93928d928d92919060a40184848082843782019150509650505050505050600060405180830381600087803b158015611e2e57600080fd5b505af1158015611e42573d6000803e3d6000fd5b50505050600193505b505050949350505050565b600081600160a060020a031683600160a060020a03161480611eb45750600160a060020a0382166000908152600f602052604090205460ff16158015611eb45750600160a060020a0383166000908152600e602052604090205460ff165b80611ee45750600160a060020a0380841660009081526006602090815260408083209386168352929052205460ff165b80611f385750600160a060020a03831660009081526008602052604090205460ff168015611f385750600160a060020a0380841660009081526009602090815260408083209386168352929052205460ff16155b9392505050565b600160a060020a03166000908152600f602052604090205460ff161590565b600a5460009060ff161515611f7257600080fd5b50600160a060020a039182166000908152600b6020908152604080832093909416825291909152205490565b601154600160a060020a031681565b600c5460009060a060020a900460ff1615611fc757600080fd5b336000818152600d602052604090205460ff1615611fe457600080fd5b600160a060020a038b166000908152600d60205260409020548b9060ff161561200c57600080fd5b898814612089576040805160e560020a62461bcd02815260206004820152603b60248201527f546865206c656e67746873206f66205f726563697069656e747320616e64205f60448201527f616d6f756e74732073686f756c64206265207468652073616d652e0000000000606482015290519081900360840190fd5b612093338d611e56565b151561209e57600080fd5b600092505b898310156121585761214d338d8d8d878181106120bc57fe5b90506020020135600160a060020a03168c8c8881811015156120da57fe5b905060200201358b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437506001945061255e9350505050565b6001909201916120a3565b505050505050505050505050565b600c54600160a060020a0316331461217d57600080fd5b6011805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a0381163314156121c257600080fd5b600160a060020a038116600090815260066020908152604080832033845290915290205460ff1615156121f457600080fd5b600160a060020a03811660009081526008602052604090205460ff161561224857600160a060020a03811660009081526009602090815260408083203384529091529020805460ff19166001179055612274565b600160a060020a03811660009081526006602090815260408083203384529091529020805460ff191690555b6040513390600160a060020a038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b600c5460a060020a900460ff16156122c457600080fd5b336000818152600d602052604090205460ff16156122e157600080fd5b600160a060020a0387166000908152600d6020526040902054879060ff161561230957600080fd5b6123133389611e56565b151561231e57600080fd5b610f8033898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8f018190048102820181019092528d815294508d93508c9250829150840183828082843750612929945050505050565b600c5460a060020a900460ff161561239f57600080fd5b336000818152600d602052604090205460ff16156123bc57600080fd5b6118a033338686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020810190915260008152935061292992505050565b600a5460009060ff16151561241c57600080fd5b336000818152600b60209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b600a5460009060ff16151561249757600080fd5b600160a060020a0384166000908152600b602090815260408083203384529091529020548211156124c757600080fd5b600160a060020a0384166000908152600b602090815260408083203384529091529020546124fb908363ffffffff6129ba16565b600160a060020a0385166000908152600b60209081526040808320338085529083528184209490945580518083018252838152815192830190915282825261254c939288928892889290919061255e565b5060019392505050565b6000903b1190565b600c5460a060020a900460ff161561257557600080fd5b336000818152600d602052604090205460ff161561259257600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff16156125ba57600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff16156125e257600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff161561260a57600080fd5b6126198b8b8b8b8b8b8b612626565b5050505050505050505050565b612635878787878787876129d1565b600a5460ff161561268c5784600160a060020a031686600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a35b50505050505050565b60035481906126ba906126ae838263ffffffff612bd716565b9063ffffffff612bfa16565b146126c457600080fd5b50565b6000828201838110156126d957600080fd5b8091505b5092915050565b6000612725866040805190810160405280601581526020017f455243373737546f6b656e73526563697069656e740000000000000000000000815250612c28565b9050600160a060020a038116156128ba5780600160a060020a03166223de298989898989896040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156127eb5781810151838201526020016127d3565b50505050905090810190601f1680156128185780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561284b578181015183820152602001612833565b50505050905090810190601f1680156128785780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561289d57600080fd5b505af11580156128b1573d6000803e3d6000fd5b50505050610f80565b8115610f80576128d286600160a060020a0316612556565b15610f8057600080fd5b600a5460009060ff1615156128f057600080fd5b6129203333858560206040519081016040528060008152506020604051908101604052806000815250600061255e565b50600192915050565b600c5460a060020a900460ff161561294057600080fd5b336000818152600d602052604090205460ff161561295d57600080fd5b600160a060020a0386166000908152600d6020526040902054869060ff161561298557600080fd5b600160a060020a0386166000908152600d6020526040902054869060ff16156129ad57600080fd5b610f808888888888612d8d565b600080838311156129ca57600080fd5b5050900390565b6129da84612695565b6129e8878787878787612dee565b600160a060020a03851615156129fd57600080fd5b600160a060020a038616600090815260056020526040902054841115612a2257600080fd5b600160a060020a038616600090815260056020526040902054612a4b908563ffffffff6129ba16565b600160a060020a038088166000908152600560205260408082209390935590871681522054612a80908563ffffffff6126c716565b600160a060020a038616600090815260056020526040902055612aa8878787878787876126e4565b84600160a060020a031686600160a060020a031688600160a060020a03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612b31578181015183820152602001612b19565b50505050905090810190601f168015612b5e5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612b91578181015183820152602001612b79565b50505050905090810190601f168015612bbe5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450505050505050565b600080808311612be657600080fd5b8284811515612bf157fe5b04949350505050565b600080831515612c0d57600091506126dd565b50828202828482811515612c1d57fe5b04146126d957600080fd5b600080826040516020018082805190602001908083835b60208310612c5e5780518252601f199092019160209182019101612c3f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612cc15780518252601f199092019160209182019101612ca2565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080547faabbb8ca000000000000000000000000000000000000000000000000000000008552600160a060020a038d8116600487015260248601849052965192995095909516965063aabbb8ca955060448084019592945090928390030190829087803b158015612d5957600080fd5b505af1158015612d6d573d6000803e3d6000fd5b505050506040513d6020811015612d8357600080fd5b5051949350505050565b612d9a8585858585612fc2565b600a5460ff1615612de757604080518481529051600091600160a060020a038716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b5050505050565b6000612e2f866040805190810160405280601281526020017f455243373737546f6b656e7353656e6465720000000000000000000000000000815250612c28565b9050600160a060020a0381161515612e465761268c565b80600160a060020a03166375ab97828888888888886040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612efc578181015183820152602001612ee4565b50505050905090810190601f168015612f295780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612f5c578181015183820152602001612f44565b50505050905090810190601f168015612f895780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015612fae57600080fd5b505af1158015612619573d6000803e3d6000fd5b612fcb83612695565b82612fd5856113f6565b1015612fe057600080fd5b600160a060020a038416600090815260056020526040902054613009908463ffffffff6129ba16565b600160a060020a038516600090815260056020526040902055600454613035908463ffffffff6129ba16565b60045561304785856000868686612dee565b83600160a060020a031685600160a060020a03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098858585604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156130c65781810151838201526020016130ae565b50505050905090810190601f1680156130f35780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561312657818101518382015260200161310e565b50505050905090810190601f1680156131535780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a350505050505600a165627a7a72305820ce7b008a531dcb9b84c92c7c60cb3ec229eb837fdff63e98d15b3194279d143d0029

Deployed Bytecode

0x6080604052600436106102005763ffffffff60e060020a60003504166306e48538811461020557806306fdde031461026a578063095ea7b3146102f45780630c2970291461032c57806318160ddd1461035657806323b872dd1461037d578063263cfbe0146103a7578063313ce567146103ca57806332081f9e146103f557806337f26e5b1461040a5780633f4ba83a1461044257806345c8b1a61461045757806348d3321f146104785780634e71e0c8146104a2578063556f0dc7146104b75780635c59ed7b146104cc5780635c975abb146104e157806362ad1b83146104f657806370a082311461053b578063715018a61461055c5780638456cb5914610571578063860838a51461058657806388d695b2146105a75780638d1fdf2f146105d35780638da5cb5b146105f457806394d008ef14610625578063959b8c3f1461065657806395d89b41146106775780639bd9bbc61461068c578063a506a0a1146106bd578063a60c2312146106de578063a9059cbb146106f3578063b1c4c72b14610717578063bb102aea14610738578063cae9ca511461074d578063d95b63711461077e578063daa4eb53146107a5578063dd62ed3e146107c6578063e30c3978146107ed578063f040cd0b14610802578063f2fde38b14610853578063fad8b32a14610874578063fc673c4f14610895578063fe9d9303146108d2575b600080fd5b34801561021157600080fd5b5061021a6108f6565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561025657818101518382015260200161023e565b505050509050019250505060405180910390f35b34801561027657600080fd5b5061027f610958565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102b95781810151838201526020016102a1565b50505050905090810190601f1680156102e65780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561030057600080fd5b50610318600160a060020a03600435166024356109e4565b604080519115158252519081900360200190f35b34801561033857600080fd5b50610318600160a060020a0360043581169060243516604435610a67565b34801561036257600080fd5b5061036b610b68565b60408051918252519081900360200190f35b34801561038957600080fd5b50610318600160a060020a0360043581169060243516604435610b6e565b3480156103b357600080fd5b506103c8600160a060020a0360043516610c1c565b005b3480156103d657600080fd5b506103df610db3565b6040805160ff9092168252519081900360200190f35b34801561040157600080fd5b50610318610dcd565b34801561041657600080fd5b506103c86024600480358281019290820135918135808301929082013591604435918201910135610e35565b34801561044e57600080fd5b506103c8610f8a565b34801561046357600080fd5b50610318600160a060020a0360043516611002565b34801561048457600080fd5b506103c8600160a060020a0360043581169060243516604435611097565b3480156104ae57600080fd5b506103c861116e565b3480156104c357600080fd5b5061036b6111f8565b3480156104d857600080fd5b506103c86111fe565b3480156104ed57600080fd5b506103186112ce565b34801561050257600080fd5b506103c8600160a060020a03600480358216916024803590911691604435916064358082019290810135916084359081019101356112de565b34801561054757600080fd5b5061036b600160a060020a03600435166113f6565b34801561056857600080fd5b506103c8611411565b34801561057d57600080fd5b506103c861147f565b34801561059257600080fd5b50610318600160a060020a03600435166114fc565b3480156105b357600080fd5b506103186024600480358281019290820135918135918201910135611511565b3480156105df57600080fd5b50610318600160a060020a036004351661165c565b34801561060057600080fd5b506106096116f0565b60408051600160a060020a039092168252519081900360200190f35b34801561063157600080fd5b506103c860048035600160a060020a03169060248035916044359182019101356116ff565b34801561066257600080fd5b506103c8600160a060020a03600435166118a6565b34801561068357600080fd5b5061027f6119a6565b34801561069857600080fd5b506103c860048035600160a060020a0316906024803591604435918201910135611a04565b3480156106c957600080fd5b50610318600160a060020a0360043516611ab0565b3480156106ea57600080fd5b506103c8611ace565b3480156106ff57600080fd5b50610318600160a060020a0360043516602435611b9c565b34801561072357600080fd5b506103c8600160a060020a0360043516611c16565b34801561074457600080fd5b5061036b611d1d565b34801561075957600080fd5b5061031860048035600160a060020a0316906024803591604435918201910135611d23565b34801561078a57600080fd5b50610318600160a060020a0360043581169060243516611e56565b3480156107b157600080fd5b50610318600160a060020a0360043516611f3f565b3480156107d257600080fd5b5061036b600160a060020a0360043581169060243516611f5e565b3480156107f957600080fd5b50610609611f9e565b34801561080e57600080fd5b506103c860048035600160a060020a03169060248035808201929081013591604435808201929081013591606435808201929081013591608435908101910135611fad565b34801561085f57600080fd5b506103c8600160a060020a0360043516612166565b34801561088057600080fd5b506103c8600160a060020a03600435166121ac565b3480156108a157600080fd5b506103c860048035600160a060020a03169060248035916044358083019290820135916064359182019101356122ad565b3480156108de57600080fd5b506103c8600480359060248035908101910135612388565b6060600780548060200260200160405190810160405280929190818152602001828054801561094e57602002820191906000526020600020905b8154600160a060020a03168152600190910190602001808311610930575b5050505050905090565b60018054604080516020601f6002600019610100878916150201909516949094049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109b85761010080835404028352916020019161094e565b820191906000526020600020905b8154815290600101906020018083116109c657509395945050505050565b600a5460009060ff1615156109f857600080fd5b600c5460a060020a900460ff1615610a0f57600080fd5b336000818152600d602052604090205460ff1615610a2c57600080fd5b600160a060020a0384166000908152600d6020526040902054849060ff1615610a5457600080fd5b610a5e8585612408565b95945050505050565b600a5460009060ff161515610a7b57600080fd5b610a853385611e56565b1515610b01576040805160e560020a62461bcd02815260206004820152602e60248201527f6d73672e73656e646572206973206e6f7420616e206f70657261746f7220666f60448201527f72205f746f6b656e486f6c646572000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a038085166000818152600b6020908152604080832094881680845294825291829020869055815186815291517f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259281900390910190a35060019392505050565b60045490565b600a5460009060ff161515610b8257600080fd5b600c5460a060020a900460ff1615610b9957600080fd5b336000818152600d602052604090205460ff1615610bb657600080fd5b600160a060020a0385166000908152600d6020526040902054859060ff1615610bde57600080fd5b600160a060020a0385166000908152600d6020526040902054859060ff1615610c0657600080fd5b610c11878787612483565b979650505050505050565b600c54600160a060020a03163314610c3357600080fd5b610c4581600160a060020a0316612556565b1515610cc1576040805160e560020a62461bcd02815260206004820152602860248201527f416e206f6666696369616c206f70657261746f72206d7573742062652061206360448201527f6f6e74726163742e000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0381166000908152600e602052604090205460ff1615610d58576040805160e560020a62461bcd02815260206004820152602a60248201527f5f6f70657261746f7220697320616c726561647920616e206f6666696369616c60448201527f206f70657261746f722e00000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0381166000818152600e6020908152604091829020805460ff19166001179055815192835290517fcc19abc65009012e41c631da2d8277d8740ebceb112ef974cc784ea191e470a79281900390910190a150565b600a5460009060ff161515610dc757600080fd5b50601290565b336000818152600d602052604081205490919060ff1615610ded57600080fd5b336000818152600d6020526040808220805460ff19166001179055517f4f2a367e694e71282f29ab5eaa04c4c0be45ac5bf2ca74fb67068b98bdc2887d9190a2600191505090565b600c5460009060a060020a900460ff1615610e4f57600080fd5b336000818152600d602052604090205460ff1615610e6c57600080fd5b868514610ee9576040805160e560020a62461bcd02815260206004820152603b60248201527f546865206c656e67746873206f66205f726563697069656e747320616e64205f60448201527f616d6f756e74732073686f756c64206265207468652073616d652e0000000000606482015290519081900360840190fd5b600091505b86821015610f8057610f7533808a8a86818110610f0757fe5b90506020020135600160a060020a03168989878181101515610f2557fe5b9050602002013588888080601f016020809104026020016040519081016040528093929190818152602001838380828437505060408051602081019091526000815293506001925061255e915050565b600190910190610eee565b5050505050505050565b600c54600160a060020a03163314610fa157600080fd5b600c5460a060020a900460ff161515610fb957600080fd5b600c805474ff0000000000000000000000000000000000000000191690556040517f7805862f689e2f13df9f062ff482ad3ad112aca9e0847911ed832e158c525b3390600090a1565b600c54600090600160a060020a0316331461101c57600080fd5b600160a060020a0382166000908152600d6020526040902054829060ff16151560011461104857600080fd5b600160a060020a0383166000818152600d6020526040808220805460ff19169055517ff915cd9fe234de6e8d3afe7bf2388d35b2b6d48e8c629a24602019bde79c213a9190a250600192915050565b600c54600160a060020a031633146110ae57600080fd5b600c5460a060020a900460ff16156110c557600080fd5b600160a060020a0383166000908152600d6020526040902054839060ff1615156001146110f157600080fd5b600160a060020a0383166000908152600d6020526040902054839060ff161561111957600080fd5b336000818152600d602052604090205460ff161561113657600080fd5b61116633878787602060405190810160405280600081525060206040519081016040528060008152506001612626565b505050505050565b601154600160a060020a0316331461118557600080fd5b601154600c54604051600160a060020a0392831692909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a360118054600c805473ffffffffffffffffffffffffffffffffffffffff19908116600160a060020a03841617909155169055565b60035490565b336000908152600f602052604090205460ff161561128c576040805160e560020a62461bcd02815260206004820152603660248201527f4f6666696369616c206f70657261746f72732061726520616c7265616479207260448201527f656a6563746564206279206d73672e73656e6465722e00000000000000000000606482015290519081900360840190fd5b336000818152600f6020526040808220805460ff19166001179055517fe41b009a6b640ace2118aefe12476c796e8c6c81a737ff53284b0ffbdefb70ca9190a2565b600c5460a060020a900460ff1681565b600c5460a060020a900460ff16156112f557600080fd5b336000818152600d602052604090205460ff161561131257600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff161561133a57600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff161561136257600080fd5b61136c338b611e56565b151561137757600080fd5b6113ea338b8b8b8b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437506001945061255e9350505050565b50505050505050505050565b600160a060020a031660009081526005602052604090205490565b600c54600160a060020a0316331461142857600080fd5b600c54604051600160a060020a03909116907ff8df31144d9c2f0f6b59d69b8b98abd5459d07f2742c4df920b25aae33c6482090600090a2600c805473ffffffffffffffffffffffffffffffffffffffff19169055565b600c54600160a060020a0316331461149657600080fd5b600c5460a060020a900460ff16156114ad57600080fd5b600c805474ff0000000000000000000000000000000000000000191660a060020a1790556040517f6985a02210a168e66602d3235cb6db0e70f92b3ba4d376a33c0f3d9434bff62590600090a1565b600d6020526000908152604090205460ff1681565b600a54600090819060ff16151561152757600080fd5b600c5460a060020a900460ff161561153e57600080fd5b336000818152600d602052604090205460ff161561155b57600080fd5b8584146115d8576040805160e560020a62461bcd02815260206004820152603b60248201527f546865206c656e67746873206f66205f726563697069656e747320616e64205f60448201527f616d6f756e74732073686f756c64206265207468652073616d652e0000000000606482015290519081900360840190fd5b600091505b8582101561164f5761164433808989868181106115f657fe5b90506020020135600160a060020a0316888887818110151561161457fe5b9050602002013560206040519081016040528060008152506020604051908101604052806000815250600061255e565b6001909101906115dd565b5060019695505050505050565b600c54600090600160a060020a0316331461167657600080fd5b600160a060020a0382166000908152600d6020526040902054829060ff161561169e57600080fd5b600160a060020a0383166000818152600d6020526040808220805460ff19166001179055517f4f2a367e694e71282f29ab5eaa04c4c0be45ac5bf2ca74fb67068b98bdc2887d9190a250600192915050565b600c54600160a060020a031681565b600c54600160a060020a0316331461171657600080fd5b61171f83612695565b601054600454611735908563ffffffff6126c716565b111561174057600080fd5b600454611753908463ffffffff6126c716565b600455600160a060020a03841660009081526005602052604090205461177f908463ffffffff6126c716565b600160a060020a038516600090815260056020908152604080832093909355825180820184528281528351601f86018390048302810183019094528484526117e793339392899289929091899089908190840183828082843750600194506126e49350505050565b83600160a060020a031633600160a060020a03167fbcd28e05e57d4bcd5bfcc92a4661d412893e6112c44a2e25d96cfdfc30d5f22e858585604051808481526020018060200182810382528484828181526020019250808284376040519201829003965090945050505050a3600a5460ff16156118a057604080518481529051600160a060020a038616916000917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b50505050565b600160a060020a0381163314156118bc57600080fd5b600160a060020a038116600090815260066020908152604080832033845290915290205460ff16156118ed57600080fd5b600160a060020a03811660009081526008602052604090205460ff161561193e57600160a060020a03811660009081526009602090815260408083203384529091529020805460ff1916905561196d565b600160a060020a03811660009081526006602090815260408083203384529091529020805460ff191660011790555b6040513390600160a060020a038316907ff4caeb2d6ca8932a215a353d0703c326ec2d81fc68170f320eb2ab49e9df61f990600090a350565b60028054604080516020601f600019610100600187161502019094168590049384018190048102820181019092528281526060939092909183018282801561094e5780601f106109b85761010080835404028352916020019161094e565b600c5460a060020a900460ff1615611a1b57600080fd5b336000818152600d602052604090205460ff1615611a3857600080fd5b600160a060020a0385166000908152600d6020526040902054859060ff1615611a6057600080fd5b6111663333888888888080601f016020809104026020016040519081016040528093929190818152602001838380828437505060408051602081019091526000815293506001925061255e915050565b600160a060020a03166000908152600e602052604090205460ff1690565b336000908152600f602052604090205460ff161515611b5d576040805160e560020a62461bcd02815260206004820152603660248201527f4f6666696369616c206f70657261746f72732061726520616c7265616479206160448201527f63636570746564206279206d73672e73656e6465722e00000000000000000000606482015290519081900360840190fd5b336000818152600f6020526040808220805460ff19169055517fad3793ccba4bf145fba17f6e508c1db7de72afcee73d854cb0d5220cb4022c9f9190a2565b600a5460009060ff161515611bb057600080fd5b600c5460a060020a900460ff1615611bc757600080fd5b336000818152600d602052604090205460ff1615611be457600080fd5b600160a060020a0384166000908152600d6020526040902054849060ff1615611c0c57600080fd5b610a5e85856128dc565b600c54600160a060020a03163314611c2d57600080fd5b600160a060020a0381166000908152600e602052604090205460ff161515611cc5576040805160e560020a62461bcd02815260206004820152602660248201527f5f6f70657261746f72206973206e6f7420616e206f6666696369616c206f706560448201527f7261746f722e0000000000000000000000000000000000000000000000000000606482015290519081900360840190fd5b600160a060020a0381166000818152600e6020908152604091829020805460ff19169055815192835290517fdbac57781dae8783301559623b7c269c0945af5afc6741c1eb02d6cbe21e54509281900390910190a150565b60105490565b600c54600090819060a060020a900460ff1615611d3f57600080fd5b336000818152600d602052604090205460ff1615611d5c57600080fd5b600160a060020a0387166000908152600d6020526040902054879060ff1615611d8457600080fd5b879250611d9188886109e4565b15611e4b576040517f8f4ffcb10000000000000000000000000000000000000000000000000000000081523360048201818152602483018a90523060448401819052608060648501908152608485018a9052600160a060020a03881694638f4ffcb194938d93928d928d92919060a40184848082843782019150509650505050505050600060405180830381600087803b158015611e2e57600080fd5b505af1158015611e42573d6000803e3d6000fd5b50505050600193505b505050949350505050565b600081600160a060020a031683600160a060020a03161480611eb45750600160a060020a0382166000908152600f602052604090205460ff16158015611eb45750600160a060020a0383166000908152600e602052604090205460ff165b80611ee45750600160a060020a0380841660009081526006602090815260408083209386168352929052205460ff165b80611f385750600160a060020a03831660009081526008602052604090205460ff168015611f385750600160a060020a0380841660009081526009602090815260408083209386168352929052205460ff16155b9392505050565b600160a060020a03166000908152600f602052604090205460ff161590565b600a5460009060ff161515611f7257600080fd5b50600160a060020a039182166000908152600b6020908152604080832093909416825291909152205490565b601154600160a060020a031681565b600c5460009060a060020a900460ff1615611fc757600080fd5b336000818152600d602052604090205460ff1615611fe457600080fd5b600160a060020a038b166000908152600d60205260409020548b9060ff161561200c57600080fd5b898814612089576040805160e560020a62461bcd02815260206004820152603b60248201527f546865206c656e67746873206f66205f726563697069656e747320616e64205f60448201527f616d6f756e74732073686f756c64206265207468652073616d652e0000000000606482015290519081900360840190fd5b612093338d611e56565b151561209e57600080fd5b600092505b898310156121585761214d338d8d8d878181106120bc57fe5b90506020020135600160a060020a03168c8c8881811015156120da57fe5b905060200201358b8b8080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050508a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437506001945061255e9350505050565b6001909201916120a3565b505050505050505050505050565b600c54600160a060020a0316331461217d57600080fd5b6011805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600160a060020a0381163314156121c257600080fd5b600160a060020a038116600090815260066020908152604080832033845290915290205460ff1615156121f457600080fd5b600160a060020a03811660009081526008602052604090205460ff161561224857600160a060020a03811660009081526009602090815260408083203384529091529020805460ff19166001179055612274565b600160a060020a03811660009081526006602090815260408083203384529091529020805460ff191690555b6040513390600160a060020a038316907f50546e66e5f44d728365dc3908c63bc5cfeeab470722c1677e3073a6ac294aa190600090a350565b600c5460a060020a900460ff16156122c457600080fd5b336000818152600d602052604090205460ff16156122e157600080fd5b600160a060020a0387166000908152600d6020526040902054879060ff161561230957600080fd5b6123133389611e56565b151561231e57600080fd5b610f8033898989898080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020601f8f018190048102820181019092528d815294508d93508c9250829150840183828082843750612929945050505050565b600c5460a060020a900460ff161561239f57600080fd5b336000818152600d602052604090205460ff16156123bc57600080fd5b6118a033338686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375050604080516020810190915260008152935061292992505050565b600a5460009060ff16151561241c57600080fd5b336000818152600b60209081526040808320600160a060020a03881680855290835292819020869055805186815290519293927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925929181900390910190a350600192915050565b600a5460009060ff16151561249757600080fd5b600160a060020a0384166000908152600b602090815260408083203384529091529020548211156124c757600080fd5b600160a060020a0384166000908152600b602090815260408083203384529091529020546124fb908363ffffffff6129ba16565b600160a060020a0385166000908152600b60209081526040808320338085529083528184209490945580518083018252838152815192830190915282825261254c939288928892889290919061255e565b5060019392505050565b6000903b1190565b600c5460a060020a900460ff161561257557600080fd5b336000818152600d602052604090205460ff161561259257600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff16156125ba57600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff16156125e257600080fd5b600160a060020a0388166000908152600d6020526040902054889060ff161561260a57600080fd5b6126198b8b8b8b8b8b8b612626565b5050505050505050505050565b612635878787878787876129d1565b600a5460ff161561268c5784600160a060020a031686600160a060020a03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef866040518082815260200191505060405180910390a35b50505050505050565b60035481906126ba906126ae838263ffffffff612bd716565b9063ffffffff612bfa16565b146126c457600080fd5b50565b6000828201838110156126d957600080fd5b8091505b5092915050565b6000612725866040805190810160405280601581526020017f455243373737546f6b656e73526563697069656e740000000000000000000000815250612c28565b9050600160a060020a038116156128ba5780600160a060020a03166223de298989898989896040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156127eb5781810151838201526020016127d3565b50505050905090810190601f1680156128185780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561284b578181015183820152602001612833565b50505050905090810190601f1680156128785780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b15801561289d57600080fd5b505af11580156128b1573d6000803e3d6000fd5b50505050610f80565b8115610f80576128d286600160a060020a0316612556565b15610f8057600080fd5b600a5460009060ff1615156128f057600080fd5b6129203333858560206040519081016040528060008152506020604051908101604052806000815250600061255e565b50600192915050565b600c5460a060020a900460ff161561294057600080fd5b336000818152600d602052604090205460ff161561295d57600080fd5b600160a060020a0386166000908152600d6020526040902054869060ff161561298557600080fd5b600160a060020a0386166000908152600d6020526040902054869060ff16156129ad57600080fd5b610f808888888888612d8d565b600080838311156129ca57600080fd5b5050900390565b6129da84612695565b6129e8878787878787612dee565b600160a060020a03851615156129fd57600080fd5b600160a060020a038616600090815260056020526040902054841115612a2257600080fd5b600160a060020a038616600090815260056020526040902054612a4b908563ffffffff6129ba16565b600160a060020a038088166000908152600560205260408082209390935590871681522054612a80908563ffffffff6126c716565b600160a060020a038616600090815260056020526040902055612aa8878787878787876126e4565b84600160a060020a031686600160a060020a031688600160a060020a03167f06b541ddaa720db2b10a4d0cdac39b8d360425fc073085fac19bc82614677987878787604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612b31578181015183820152602001612b19565b50505050905090810190601f168015612b5e5780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612b91578181015183820152602001612b79565b50505050905090810190601f168015612bbe5780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a450505050505050565b600080808311612be657600080fd5b8284811515612bf157fe5b04949350505050565b600080831515612c0d57600091506126dd565b50828202828482811515612c1d57fe5b04146126d957600080fd5b600080826040516020018082805190602001908083835b60208310612c5e5780518252601f199092019160209182019101612c3f565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040526040518082805190602001908083835b60208310612cc15780518252601f199092019160209182019101612ca2565b51815160209384036101000a600019018019909216911617905260408051929094018290038220600080547faabbb8ca000000000000000000000000000000000000000000000000000000008552600160a060020a038d8116600487015260248601849052965192995095909516965063aabbb8ca955060448084019592945090928390030190829087803b158015612d5957600080fd5b505af1158015612d6d573d6000803e3d6000fd5b505050506040513d6020811015612d8357600080fd5b5051949350505050565b612d9a8585858585612fc2565b600a5460ff1615612de757604080518481529051600091600160a060020a038716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9181900360200190a35b5050505050565b6000612e2f866040805190810160405280601281526020017f455243373737546f6b656e7353656e6465720000000000000000000000000000815250612c28565b9050600160a060020a0381161515612e465761268c565b80600160a060020a03166375ab97828888888888886040518763ffffffff1660e060020a0281526004018087600160a060020a0316600160a060020a0316815260200186600160a060020a0316600160a060020a0316815260200185600160a060020a0316600160a060020a031681526020018481526020018060200180602001838103835285818151815260200191508051906020019080838360005b83811015612efc578181015183820152602001612ee4565b50505050905090810190601f168015612f295780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b83811015612f5c578181015183820152602001612f44565b50505050905090810190601f168015612f895780820380516001836020036101000a031916815260200191505b5098505050505050505050600060405180830381600087803b158015612fae57600080fd5b505af1158015612619573d6000803e3d6000fd5b612fcb83612695565b82612fd5856113f6565b1015612fe057600080fd5b600160a060020a038416600090815260056020526040902054613009908463ffffffff6129ba16565b600160a060020a038516600090815260056020526040902055600454613035908463ffffffff6129ba16565b60045561304785856000868686612dee565b83600160a060020a031685600160a060020a03167fa78a9be3a7b862d26933ad85fb11d80ef66b8f972d7cbba06621d583943a4098858585604051808481526020018060200180602001838103835285818151815260200191508051906020019080838360005b838110156130c65781810151838201526020016130ae565b50505050905090810190601f1680156130f35780820380516001836020036101000a031916815260200191505b50838103825284518152845160209182019186019080838360005b8381101561312657818101518382015260200161310e565b50505050905090810190601f1680156131535780820380516001836020036101000a031916815260200191505b509550505050505060405180910390a350505050505600a165627a7a72305820ce7b008a531dcb9b84c92c7c60cb3ec229eb837fdff63e98d15b3194279d143d0029

Swarm Source

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