Feature Tip: Add private address tag to any address under My Name Tag !
ERC-20
Entertainment
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 SELFValue
$0.00Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
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
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"}]
Contract Creation Code
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.