ETH Price: $2,415.02 (-8.68%)
 

Overview

Max Total Supply

20,419 xEUR

Holders

10 (0.00%)

Transfers

-
0

Market

Onchain Market Cap

-

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Transparent and legally compliant euro stablecoin automatically convertible to fiat.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
xEuro

Compiler Version
v0.5.7+commit.6da8b019

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
/**
 *Submitted for verification at Etherscan.io on 2019-04-29
*/

pragma solidity 0.5.7;

/*
*  xEuro.sol
*  xEUR tokens smart contract
*  implements [ERC-20 Token Standard](https://eips.ethereum.org/EIPS/eip-20)
*  ver. 1.0.7
*  2019-04-29
*  https://xeuro.online
*  address: https://etherscan.io/address/0xe577e0B200d00eBdecbFc1cd3F7E8E04C70476BE 
*  deployed on block: 7660532
*  solc version : 0.5.7+commit.6da8b019
**/

/**
 * @title SafeMath
 * @dev Unsigned math operations with safety checks that revert on error
 */
library SafeMath {
    /**
     * @dev Multiplies two unsigned integers, 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 unsigned integers truncating the quotient, reverts on division by zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        // Solidity only automatically asserts when dividing by 0
        require(b > 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 unsigned integers, 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 unsigned integers, 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 unsigned integers 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;
    }
}

/**
* ERC-677
* see: https://github.com/ethereum/EIPs/issues/677
* Allow tokens to be transferred to contracts and have the contract trigger logic for how to respond to receiving
* the tokens within a single transaction.
*/
contract TokenRecipient {

    function onTokenTransfer(address _from, uint256 _value, bytes calldata _extraData) external returns (bool);
    // function tokenFallback(address _from, uint256 _value, bytes calldata _extraData) external returns (bool);

}

/**
* see: https://www.cryptonomica.net/#!/verifyEthAddress/
* in our smart contract every new admin should have a verified identity on cryptonomica.net
*/
contract CryptonomicaVerification {

    // returns 0 if verification is not revoked
    function revokedOn(address _address) external view returns (uint unixTime);

    function keyCertificateValidUntil(address _address) external view returns (uint unixTime);

}

contract xEuro {

    /**
    * see: https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/contracts/token/ERC20/BasicToken.sol
    */
    using SafeMath for uint256;

    CryptonomicaVerification public cryptonomicaVerification;

    /* --- ERC-20 variables ----- */

    /**
    * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#name
    * function name() constant returns (string name)
    */
    string public constant name = "xEuro";

    /**
    * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#symbol
    * function symbol() constant returns (string symbol)
    */
    string public constant symbol = "xEUR";

    /**
    * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#decimals
    * function decimals() constant returns (uint8 decimals)
    */
    uint8 public constant decimals = 0; // 1 token = €1, no smaller unit

    /**
    * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#totalsupply
    * function totalSupply() constant returns (uint256 totalSupply)
    * we start with zero
    */
    uint256 public totalSupply = 0;

    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#balanceof
    // function balanceOf(address _owner) constant returns (uint256 balance)
    mapping(address => uint256) public balanceOf;

    /**
    * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#allowance
    * function allowance(address _owner, address _spender) constant returns (uint256 remaining)
    */
    mapping(address => mapping(address => uint256)) public allowance;

    /* --- administrative variables */

    /**
    * addresses that are admins in this smart contracts
    * admin can assign and revoke authority to perform functions (mint, burn, transfer) in this contract
    * for other addresses and for himself
    */
    mapping(address => bool) public isAdmin;

    /**
    * addresses that can mint tokens
    */
    mapping(address => bool) public canMint;

    /**
    * addresses allowed to transfer tokens from contract's own address to another address
    * for example after tokens were minted, they can be transferred to user
    * (tokenholder of new (fresh minted) tokens is always this smart contract itself)
    */
    mapping(address => bool) public canTransferFromContract;

    /**
    * addresses allowed to burn tokens
    * tokens can burned only if their tokenholder is smart contract itself
    * nobody can burn tokens owned by user
    */
    mapping(address => bool) public canBurn;

    /* --- ERC-20 events */

    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#events

    /**
    * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#transfer-1
    */
    event Transfer(address indexed _from, address indexed _to, uint256 _value);

    /**
    * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#approval
    */
    event Approval(address indexed _owner, address indexed _spender, uint256 _value);

    /**
    * event we fire when data are sent from this smart contract to other smart contract
    * @param _from will be msg.sender
    * @param _toContract address of smart contract information is sent to
    * @param _extraData any data that msg.sender sends to another smart contract
    */
    event DataSentToAnotherContract(address indexed _from, address indexed _toContract, bytes _extraData);

    /* --- ERC-20 Functions */
    // https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#methods

    /*
    *  https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#approve
    * there is and attack:
    * https://github.com/CORIONplatform/solidity/issues/6,
    * https://drive.google.com/file/d/0ByMtMw2hul0EN3NCaVFHSFdxRzA/view
    * but this function is required by ERC-20:
    * To prevent attack vectors like the one described on https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/
    * and discussed on https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 ,
    * clients SHOULD make sure to create user interfaces in such a way that they set the allowance first to 0 before
    * setting it to another value for the same spender.
    * THOUGH The contract itself shouldn’t enforce it, to allow backwards compatibility with contracts deployed before
    *
    * @param _spender The address which will spend the funds.
    * @param _value The amount of tokens to be spent.
    */
    function approve(address _spender, uint256 _value) public returns (bool success){

        allowance[msg.sender][_spender] = _value;

        emit Approval(msg.sender, _spender, _value);

        return true;
    }

    /**
    * Overloaded (see https://solidity.readthedocs.io/en/v0.5.7/contracts.html#function-overloading) approve function
    * see https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/
    */
    function approve(address _spender, uint256 _currentValue, uint256 _value) external returns (bool success){

        require(allowance[msg.sender][_spender] == _currentValue);

        return approve(_spender, _value);
    }

    /**
    * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#transfer
    */
    function transfer(address _to, uint256 _value) public returns (bool success){
        return transferFrom(msg.sender, _to, _value);
    }

    /**
    * https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20-token-standard.md#transferfrom
    */
    function transferFrom(address _from, address _to, uint256 _value) public returns (bool success){

        // Transfers of 0 values MUST be treated as normal transfers and fire the Transfer event (ERC-20)
        // Variables of uint type cannot be negative. Thus, comparing uint variable with zero (greater than or equal) is redundant
        // require(_value >= 0);

        require(_to != address(0));

        // The function SHOULD throw unless the _from account has deliberately authorized the sender of the message via some mechanism
        require(
            msg.sender == _from
        || _value <= allowance[_from][msg.sender]
        || (_from == address(this) && canTransferFromContract[msg.sender]),
            "Sender not authorized");

        // check if _from account have required amount
        require(_value <= balanceOf[_from], "Account doesn't have required amount");

        if (_to == address(this)) {// tokens sent to smart contract itself (for exchange to fiat)

            // (!) only token holder can send tokens to smart contract address to get fiat, not using allowance
            require(_from == msg.sender, "Only token holder can do this");

            require(_value >= minExchangeAmount, "Value is less than min. exchange amount");

            // this event used by our bot to monitor tokens that have to be burned and to make a fiat payment
            // bot also verifies this information checking 'tokensInTransfer' mapping, which contains the same data
            tokensInEventsCounter++;
            emit TokensIn(
                _from,
                _value,
                tokensInEventsCounter
            );

            // here we write information about this transfer
            // (the same as in event, but stored in contract variable and with timestamp)
            tokensInTransfer[tokensInEventsCounter].from = _from;
            tokensInTransfer[tokensInEventsCounter].value = _value;
            // timestamp:
            tokensInTransfer[tokensInEventsCounter].receivedOn = now;

        }

        balanceOf[_from] = balanceOf[_from].sub(_value);
        balanceOf[_to] = balanceOf[_to].add(_value);

        // If allowance used, change allowances correspondingly
        if (_from != msg.sender && _from != address(this)) {
            allowance[_from][msg.sender] = allowance[_from][msg.sender].sub(_value);
        }

        emit Transfer(_from, _to, _value);

        return true;
    }

    /*  ---------- Interaction with other contracts  */

    /**
    * ERC-677
    * https://github.com/ethereum/EIPs/issues/677
    * transfer tokens with additional info to another smart contract, and calls its correspondent function
    * @param _to - another smart contract address
    * @param _value - number of tokens
    * @param _extraData - data to send to another contract
    * this is a recommended method to send tokens to smart contracts
    */
    function transferAndCall(address _to, uint256 _value, bytes memory _extraData) public returns (bool success){

        TokenRecipient receiver = TokenRecipient(_to);

        if (transferFrom(msg.sender, _to, _value)) {

            // if (receiver.tokenFallback(msg.sender, _value, _extraData)) {
            if (receiver.onTokenTransfer(msg.sender, _value, _extraData)) {
                emit DataSentToAnotherContract(msg.sender, _to, _extraData);
                return true;
            }

        }

        return false;
    }

    /**
    * the same as above ('transferAndCall'), but for all tokens on user account
    * for example for converting ALL tokens of user account to another tokens
    */
    function transferAllAndCall(address _to, bytes calldata _extraData) external returns (bool){
        return transferAndCall(_to, balanceOf[msg.sender], _extraData);
    }

    /* --- Administrative functions */

    /**
    * @param from old address
    * @param to new address
    * @param by who made a change
    */
    event CryptonomicaArbitrationContractAddressChanged(address from, address to, address indexed by);

    /*
    * @param _newAddress address of new contract to be used to verify identity of new admins
    */
    function changeCryptonomicaVerificationContractAddress(address _newAddress) public returns (bool success) {

        require(isAdmin[msg.sender], "Only admin can do that");

        emit CryptonomicaArbitrationContractAddressChanged(address(cryptonomicaVerification), _newAddress, msg.sender);

        cryptonomicaVerification = CryptonomicaVerification(_newAddress);

        return true;
    }

    /**
   * @param by who added new admin
   * @param newAdmin address of new admin
   */
    event AdminAdded(address indexed by, address indexed newAdmin);

    function addAdmin(address _newAdmin) public returns (bool success){

        require(isAdmin[msg.sender], "Only admin can do that");
        require(_newAdmin != address(0), "Address can not be zero-address");

        require(cryptonomicaVerification.keyCertificateValidUntil(_newAdmin) > now, "New admin has to be verified on Cryptonomica.net");

        // revokedOn returns uint256 (unix time), it's 0 if verification is not revoked
        require(cryptonomicaVerification.revokedOn(_newAdmin) == 0, "Verification for this address was revoked, can not add");

        isAdmin[_newAdmin] = true;

        emit AdminAdded(msg.sender, _newAdmin);

        return true;
    }

    /**
    * @param by an address who removed admin
    * @param _oldAdmin address of the admin removed
    */
    event AdminRemoved(address indexed by, address indexed _oldAdmin);

    /**
    * @param _oldAdmin address to be removed from admins
    */
    function removeAdmin(address _oldAdmin) external returns (bool success){

        require(isAdmin[msg.sender], "Only admin can do that");

        // prevents from deleting the last admin (can be multisig smart contract) by itself:
        require(msg.sender != _oldAdmin, "Admin can't remove himself");

        isAdmin[_oldAdmin] = false;

        emit AdminRemoved(msg.sender, _oldAdmin);

        return true;
    }

    /**
    * minimum amount of tokens than can be exchanged to fiat
    * can be changed by admin
    */
    uint256 public minExchangeAmount;

    /**
    * @param by address who made a change
    * @param from value before the change
    * @param to value after the change
    */
    event MinExchangeAmountChanged (address indexed by, uint256 from, uint256 to);

    /**
    * @param _minExchangeAmount new value of minimum amount of tokens that can be exchanged to fiat
    * only admin can make this change
    */
    function changeMinExchangeAmount(uint256 _minExchangeAmount) public returns (bool success){

        require(isAdmin[msg.sender], "Only admin can do that");

        uint256 from = minExchangeAmount;

        minExchangeAmount = _minExchangeAmount;

        emit MinExchangeAmountChanged(msg.sender, from, minExchangeAmount);

        return true;
    }

    /**
    * @param by who add permission to mint (only admin can do this)
    * @param newAddress address that was authorized to mint new tokens
    */
    event AddressAddedToCanMint(address indexed by, address indexed newAddress);

    /**
    * Add permission to mint new tokens to address _newAddress
    */
    function addToCanMint(address _newAddress) public returns (bool success){

        require(isAdmin[msg.sender], "Only admin can do that");
        require(_newAddress != address(0), "Address can not be zero-address");

        canMint[_newAddress] = true;

        emit AddressAddedToCanMint(msg.sender, _newAddress);

        return true;
    }

    event AddressRemovedFromCanMint(address indexed by, address indexed removedAddress);

    function removeFromCanMint(address _addressToRemove) external returns (bool success){

        require(isAdmin[msg.sender], "Only admin can do that");

        canMint[_addressToRemove] = false;

        emit AddressRemovedFromCanMint(msg.sender, _addressToRemove);

        return true;
    }

    /**
    * @param by who add permission (should be admin)
    * @param newAddress address that got permission
    */
    event AddressAddedToCanTransferFromContract(address indexed by, address indexed newAddress);

    function addToCanTransferFromContract(address _newAddress) public returns (bool success){

        require(isAdmin[msg.sender], "Only admin can do that");
        require(_newAddress != address(0), "Address can not be zero-address");

        canTransferFromContract[_newAddress] = true;

        emit AddressAddedToCanTransferFromContract(msg.sender, _newAddress);

        return true;
    }

    event AddressRemovedFromCanTransferFromContract(address indexed by, address indexed removedAddress);

    function removeFromCanTransferFromContract(address _addressToRemove) external returns (bool success){

        require(isAdmin[msg.sender], "Only admin can do that");

        canTransferFromContract[_addressToRemove] = false;

        emit AddressRemovedFromCanTransferFromContract(msg.sender, _addressToRemove);

        return true;
    }

    /**
    * @param by who add permission (should be admin)
    * @param newAddress address that got permission
    */
    event AddressAddedToCanBurn(address indexed by, address indexed newAddress);

    function addToCanBurn(address _newAddress) public returns (bool success){

        require(isAdmin[msg.sender], "Only admin can do that");
        require(_newAddress != address(0), "Address can not be zero-address");

        canBurn[_newAddress] = true;

        emit AddressAddedToCanBurn(msg.sender, _newAddress);

        return true;
    }

    event AddressRemovedFromCanBurn(address indexed by, address indexed removedAddress);

    function removeFromCanBurn(address _addressToRemove) external returns (bool success){

        require(isAdmin[msg.sender], "Only admin can do that");

        canBurn[_addressToRemove] = false;

        emit AddressRemovedFromCanBurn(msg.sender, _addressToRemove);

        return true;
    }

    /* ---------- Create and burn tokens  */

    /**
    * number (id) for MintTokensEvent
    */
    uint public mintTokensEventsCounter = 0;

    /**
    * struct used to write information about every transaction that mint new tokens (we call it 'MintTokensEvent')
    * every 'MintTokensEvent' has its number/id (mintTokensEventsCounter)
    */
    struct MintTokensEvent {
        address mintedBy; // address that minted tokens (msg.sender)
        uint256 fiatInPaymentId; // reference to fiat transfer (deposit)
        uint value;  // number of new tokens minted
        uint on;    // UnixTime
        uint currentTotalSupply; // new value of totalSupply
    }

    /**
    * keep all fiat tx ids, to prevent minting tokens twice (or more times) for the same fiat deposit
    * @param uint256 reference (id) of fiat deposit
    * @param bool if true tokens already were minted for this fiat deposit
    * (see: require(!fiatInPaymentIds[fiatInPaymentId]); in function mintTokens
    */
    mapping(uint256 => bool) public fiatInPaymentIds;

    /**
    * here we can find a MintTokensEvent by fiatInPaymentId (id of fiat deposit),
    * so we now if tokens were minted for given incoming fiat payment (deposit), and if yes when and how many
    * @param uint256 reference (id) of fiat deposit
    */
    mapping(uint256 => MintTokensEvent) public fiatInPaymentsToMintTokensEvent;

    /**
    * here we store MintTokensEvent with its ordinal numbers/ids (mintTokensEventsCounter)
    * @param uint256 > mintTokensEventsCounter
    */
    mapping(uint256 => MintTokensEvent) public mintTokensEvent;

    /**
    * an event with the same information as in struct MintTokensEvent
    */
    event TokensMinted(
        address indexed by, // who minted new tokens
        uint256 indexed fiatInPaymentId, // reference to fiat payment (deposit)
        uint value, // number of new minted tokens
        uint currentTotalSupply, // totalSupply value after new tokens were minted
        uint indexed mintTokensEventsCounter //
    );

    /**
    * tokens should be minted to contract own address, (!) after that tokens should be transferred using transferFrom
    * @param value number of tokens to create
    * @param fiatInPaymentId fiat payment (deposit) id
    */
    function mintTokens(uint256 value, uint256 fiatInPaymentId) public returns (bool success){

        require(canMint[msg.sender], "Sender not authorized");

        // require that this fiatInPaymentId was not used before:
        require(!fiatInPaymentIds[fiatInPaymentId], "This fiat payment id is already used");

        // Variables of uint type cannot be negative. Thus, comparing uint variable with zero (greater than or equal) is redundant
        // require(value >= 0);

        // this is the moment when new tokens appear in the system
        totalSupply = totalSupply.add(value);

        // first token holder of fresh minted tokens always is the contract itself
        // (than tokens have to be transferred from contract address to user address)
        balanceOf[address(this)] = balanceOf[address(this)].add(value);

        mintTokensEventsCounter++;
        mintTokensEvent[mintTokensEventsCounter].mintedBy = msg.sender;
        mintTokensEvent[mintTokensEventsCounter].fiatInPaymentId = fiatInPaymentId;
        mintTokensEvent[mintTokensEventsCounter].value = value;
        mintTokensEvent[mintTokensEventsCounter].on = block.timestamp;
        mintTokensEvent[mintTokensEventsCounter].currentTotalSupply = totalSupply;

        // fiatInPaymentId => struct mintTokensEvent
        fiatInPaymentsToMintTokensEvent[fiatInPaymentId] = mintTokensEvent[mintTokensEventsCounter];

        emit TokensMinted(msg.sender, fiatInPaymentId, value, totalSupply, mintTokensEventsCounter);

        // mark fiatInPaymentId as used to mint tokens
        fiatInPaymentIds[fiatInPaymentId] = true;

        return true;
    }

    /**
    * mint and transfer new tokens to user in one tx
    * requires msg.sender to have both 'canMint' and 'canTransferFromContract' permissions
    * @param _value number of new tokens to create (to mint)
    * @param fiatInPaymentId id of fiat payment (deposit) received for new tokens
    * @param _to receiver of new tokens
    */
    function mintAndTransfer(uint256 _value, uint256 fiatInPaymentId, address _to) public returns (bool success){

        if (mintTokens(_value, fiatInPaymentId) && transferFrom(address(this), _to, _value)) {
            return true;
        }

        return false;
    }

    /* -- Exchange tokens to fiat (tokens sent to contract owns address > fiat payment) */

    /**
    * number for every 'event' when we receive tokens to contract own address for exchange to fiat
    */
    uint public tokensInEventsCounter = 0;

    /**
    * @param from who sent tokens for exchange
    * @param value number of tokens received for exchange
    * @param receivedOn timestamp (UnixTime)
    */
    struct TokensInTransfer {// <<< used in 'transfer'
        address from; //
        uint value;   //
        uint receivedOn; // unix time
    }

    /**
    * @param uint256 < tokensInEventsCounter
    */
    mapping(uint256 => TokensInTransfer) public tokensInTransfer;

    /**
    * @param from address that sent tokens for exchange to fiat
    * @param value number of tokens received
    * @param tokensInEventsCounter number of event
    */
    event TokensIn(
        address indexed from,
        uint256 value,
        uint256 indexed tokensInEventsCounter
    );

    /**
    * we also count every every token burning
    */
    uint public burnTokensEventsCounter = 0;//

    /**
    * @param by who burned tokens
    * @param value number of tokens burned
    * @param tokensInEventId corresponding id on tokensInEvent, after witch tokens were burned
    * @param fiatOutPaymentId id of outgoing fiat payment to user
    * @param burnedOn timestamp (unix time)
    * @param currentTotalSupply totalSupply after tokens were burned
    */
    struct burnTokensEvent {
        address by; //
        uint256 value;   //
        uint256 tokensInEventId;
        uint256 fiatOutPaymentId;
        uint256 burnedOn; // UnixTime
        uint256 currentTotalSupply;
    }

    /**
    * @param uint256 < burnTokensEventsCounter
    */
    mapping(uint256 => burnTokensEvent) public burnTokensEvents;

    /**
    *  we count every fiat payment id used when burn tokens to prevent using it twice
    */
    mapping(uint256 => bool) public fiatOutPaymentIdsUsed; //

    /**
    * smart contract event with the same data as in struct burnTokensEvent
    */
    event TokensBurned(
        address indexed by,
        uint256 value,
        uint256 indexed tokensInEventId, // this is the same as uint256 indexed tokensInEventsCounter in event TokensIn
        uint256 indexed fiatOutPaymentId,
        uint burnedOn, // UnixTime
        uint currentTotalSupply
    );

    /**
    * (!) only contract's own tokens (balanceOf[this]) can be burned
    * @param value number of tokens to burn
    * @param tokensInEventId reference to tokensInEventsCounter value for incoming tokens event (tokensInEvent)
    * @param fiatOutPaymentId id of outgoing fiat payment (from the bank)
    */
    function burnTokens(
        uint256 value,
        uint256 tokensInEventId, // this is the same as uint256 indexed tokensInEventsCounter in event TokensIn
        uint256 fiatOutPaymentId
    ) public returns (bool success){

        // Variables of uint type cannot be negative. Thus, comparing uint variable with zero (greater than or equal) is redundant
        // require(value >= 0);

        require(canBurn[msg.sender], "Sender not authorized");
        require(balanceOf[address(this)] >= value, "Account does not have required amount");

        // require(!tokensInEventIdsUsed[tokensInEventId]);
        require(!fiatOutPaymentIdsUsed[fiatOutPaymentId], "This fiat payment id is already used");

        balanceOf[address(this)] = balanceOf[address(this)].sub(value);
        totalSupply = totalSupply.sub(value);

        burnTokensEventsCounter++;
        burnTokensEvents[burnTokensEventsCounter].by = msg.sender;
        burnTokensEvents[burnTokensEventsCounter].value = value;
        burnTokensEvents[burnTokensEventsCounter].tokensInEventId = tokensInEventId;
        burnTokensEvents[burnTokensEventsCounter].fiatOutPaymentId = fiatOutPaymentId;
        burnTokensEvents[burnTokensEventsCounter].burnedOn = block.timestamp;
        burnTokensEvents[burnTokensEventsCounter].currentTotalSupply = totalSupply;

        emit TokensBurned(msg.sender, value, tokensInEventId, fiatOutPaymentId, block.timestamp, totalSupply);

        fiatOutPaymentIdsUsed[fiatOutPaymentId] = true;

        return true;
    }

    /* ---------- Constructor */
    constructor() public {// Constructor must be public or internal

        // initial admin:
        isAdmin[msg.sender] = true;

        addToCanMint(msg.sender);
        addToCanTransferFromContract(msg.sender);
        addToCanBurn(msg.sender);

        changeCryptonomicaVerificationContractAddress(0x846942953c3b2A898F10DF1e32763A823bf6b27f);
        addAdmin(0xD851d045d8Aee53EF24890afBa3d701163AcbC8B);

        // to test main functions and events (can be removed in production, or can be not):
        changeMinExchangeAmount(12);
        mintAndTransfer(12, 0, msg.sender);
        transfer(msg.sender, 12);
        transfer(address(this), 12);
        burnTokens(12, 1, 0);

    }

}

Contract Security Audit

Contract ABI

API
[{"constant":false,"inputs":[{"name":"_addressToRemove","type":"address"}],"name":"removeFromCanTransferFromContract","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"},{"name":"tokensInEventId","type":"uint256"},{"name":"fiatOutPaymentId","type":"uint256"}],"name":"burnTokens","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","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":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_minExchangeAmount","type":"uint256"}],"name":"changeMinExchangeAmount","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"canTransferFromContract","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"burnTokensEventsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_oldAdmin","type":"address"}],"name":"removeAdmin","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":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"isAdmin","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"addToCanTransferFromContract","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"value","type":"uint256"},{"name":"fiatInPaymentId","type":"uint256"}],"name":"mintTokens","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addressToRemove","type":"address"}],"name":"removeFromCanBurn","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"cryptonomicaVerification","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"canBurn","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"mintTokensEvent","outputs":[{"name":"mintedBy","type":"address"},{"name":"fiatInPaymentId","type":"uint256"},{"name":"value","type":"uint256"},{"name":"on","type":"uint256"},{"name":"currentTotalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_extraData","type":"bytes"}],"name":"transferAndCall","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_spender","type":"address"},{"name":"_currentValue","type":"uint256"},{"name":"_value","type":"uint256"}],"name":"approve","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"tokensInTransfer","outputs":[{"name":"from","type":"address"},{"name":"value","type":"uint256"},{"name":"receivedOn","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"minExchangeAmount","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"},{"name":"fiatInPaymentId","type":"uint256"},{"name":"_to","type":"address"}],"name":"mintAndTransfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAdmin","type":"address"}],"name":"addAdmin","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_addressToRemove","type":"address"}],"name":"removeFromCanMint","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"balanceOf","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"changeCryptonomicaVerificationContractAddress","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"addToCanMint","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"mintTokensEventsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newAddress","type":"address"}],"name":"addToCanBurn","outputs":[{"name":"success","type":"bool"}],"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":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"success","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"burnTokensEvents","outputs":[{"name":"by","type":"address"},{"name":"value","type":"uint256"},{"name":"tokensInEventId","type":"uint256"},{"name":"fiatOutPaymentId","type":"uint256"},{"name":"burnedOn","type":"uint256"},{"name":"currentTotalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"tokensInEventsCounter","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"}],"name":"canMint","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fiatOutPaymentIdsUsed","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fiatInPaymentIds","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_extraData","type":"bytes"}],"name":"transferAllAndCall","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"uint256"}],"name":"fiatInPaymentsToMintTokensEvent","outputs":[{"name":"mintedBy","type":"address"},{"name":"fiatInPaymentId","type":"uint256"},{"name":"value","type":"uint256"},{"name":"on","type":"uint256"},{"name":"currentTotalSupply","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"address"}],"name":"allowance","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_to","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_owner","type":"address"},{"indexed":true,"name":"_spender","type":"address"},{"indexed":false,"name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"_from","type":"address"},{"indexed":true,"name":"_toContract","type":"address"},{"indexed":false,"name":"_extraData","type":"bytes"}],"name":"DataSentToAnotherContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"from","type":"address"},{"indexed":false,"name":"to","type":"address"},{"indexed":true,"name":"by","type":"address"}],"name":"CryptonomicaArbitrationContractAddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"newAdmin","type":"address"}],"name":"AdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"_oldAdmin","type":"address"}],"name":"AdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":false,"name":"from","type":"uint256"},{"indexed":false,"name":"to","type":"uint256"}],"name":"MinExchangeAmountChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"newAddress","type":"address"}],"name":"AddressAddedToCanMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"removedAddress","type":"address"}],"name":"AddressRemovedFromCanMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"newAddress","type":"address"}],"name":"AddressAddedToCanTransferFromContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"removedAddress","type":"address"}],"name":"AddressRemovedFromCanTransferFromContract","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"newAddress","type":"address"}],"name":"AddressAddedToCanBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"removedAddress","type":"address"}],"name":"AddressRemovedFromCanBurn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":true,"name":"fiatInPaymentId","type":"uint256"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"currentTotalSupply","type":"uint256"},{"indexed":true,"name":"mintTokensEventsCounter","type":"uint256"}],"name":"TokensMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"from","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"tokensInEventsCounter","type":"uint256"}],"name":"TokensIn","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"by","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":true,"name":"tokensInEventId","type":"uint256"},{"indexed":true,"name":"fiatOutPaymentId","type":"uint256"},{"indexed":false,"name":"burnedOn","type":"uint256"},{"indexed":false,"name":"currentTotalSupply","type":"uint256"}],"name":"TokensBurned","type":"event"}]

6080604052600060015560006009556000600d556000600f553480156200002557600080fd5b50336000818152600460209081526040909120805460ff1916600117905562000053919062000132811b901c565b5062000065336200025760201b60201c565b5062000077336200037c60201b60201c565b506200009d73846942953c3b2a898f10df1e32763a823bf6b27f620004a160201b60201c565b50620000c373d851d045d8aee53ef24890afba3d701163acbc8b6200057d60201b60201c565b50620000d6600c6200087f60201b60201c565b50620000ec600c6000336200093860201b60201c565b506200010033600c6200098160201b60201c565b506200011430600c6200098160201b60201c565b506200012b600c600160006200099660201b60201c565b50620012dc565b3360009081526004602052604081205460ff16620001a057604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b6001600160a01b0382166200020557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f6024820152600080516020620035a2833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191660011790555133917fdac4748568425c8dfc8706e3c3eb5191272f7d331ecec6c4e5e6bd0efc0b75bd91a3506001919050565b3360009081526004602052604081205460ff16620002c557604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b6001600160a01b0382166200032a57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f6024820152600080516020620035a2833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191660011790555133917f0a3824f403289d915446d591615857435fbf94fa18a273bf37f75ebecbde650c91a3506001919050565b3360009081526004602052604081205460ff16620003ea57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b6001600160a01b0382166200044f57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f6024820152600080516020620035a2833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191660011790555133917f0839a19aaf317047bdfffbd8e7dd2055c38842f33268dbc18016460178e17c2191a3506001919050565b3360009081526004602052604081205460ff166200050f57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b600054604080516001600160a01b0392831681529184166020830152805133927fdeee135e9ab3644341d22e8715d2d21eef558921ca6eb86764de7125302f200f92908290030190a250600080546001600160a01b0383166001600160a01b03199091161790556001919050565b3360009081526004602052604081205460ff16620005eb57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b6001600160a01b0382166200065057604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f6024820152600080516020620035a2833981519152604482015290519081900360640190fd5b600054604080517f5b3d0bc10000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152915142939290921691635b3d0bc191602480820192602092909190829003018186803b158015620006ba57600080fd5b505afa158015620006cf573d6000803e3d6000fd5b505050506040513d6020811015620006e657600080fd5b50511162000740576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526030815260200180620035156030913960400191505060405180910390fd5b600054604080517f836afead0000000000000000000000000000000000000000000000000000000081526001600160a01b0385811660048301529151919092169163836afead916024808301926020929190829003018186803b158015620007a757600080fd5b505afa158015620007bc573d6000803e3d6000fd5b505050506040513d6020811015620007d357600080fd5b5051156200082d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260368152602001806200356c6036913960400191505060405180910390fd5b6001600160a01b038216600081815260046020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a3506001919050565b3360009081526004602052604081205460ff16620008ed57604080517f08c379a00000000000000000000000000000000000000000000000000000000081526020600482015260166024820152600080516020620034f5833981519152604482015290519081900360640190fd5b60088054908390556040805182815260208101859052815133927f647ea6b9c0886d71b598c86e2dea5324cecd56394fb1c54c794462e31abd4b17928290030190a250600192915050565b60006200094c848462000c2260201b60201c565b80156200096757506200096730838662000e7960201b60201c565b1562000976575060016200097a565b5060005b9392505050565b60006200097a33848462000e7960201b60201c565b3360009081526007602052604081205460ff1662000a1557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420617574686f72697a65640000000000000000000000604482015290519081900360640190fd5b3060009081526002602052604090205484111562000a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526025815260200180620034d06025913960400191505060405180910390fd5b60008281526011602052604090205460ff161562000ae9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620034ac6024913960400191505060405180910390fd5b3060009081526002602090815260409091205462000b129186906200200f620012b3821b17901c565b3060009081526002602090815260409091209190915560015462000b419186906200200f620012b3821b17901c565b6001908155600f80548201808255600090815260106020908152604080832080546001600160a01b031916339081179091558454845281842086018a9055845484528184206002018990558454845281842060030188905584548452818420426004909101819055955494548452928190206005018490558051898152918201949094528084019290925291518492869290917f535315e7d1c7278469a90807aa28576a16d9dda00727fca7937f7ebc658a11fc9181900360600190a4506000818152601160205260409020805460ff191660019081179091559392505050565b3360009081526005602052604081205460ff1662000ca157604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420617574686f72697a65640000000000000000000000604482015290519081900360640190fd5b6000828152600a602052604090205460ff161562000d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620034ac6024913960400191505060405180910390fd5b62000d2783600154620012c960201b620020241790919060201c565b6001553060009081526002602090815260409091205462000d5391859062002024620012c9821b17901c565b306000908152600260208181526040808420949094556009805460019081018083558552600c83528585208054336001600160a01b031991821681179092558354875287872083018a90558354875287872086018b90558354875287872042600391820155835485548952898920600490810191909155855489528989208c8a52600b8852988a9020895481546001600160a01b0390911694169390931783558885015483860155888801549783019790975587810154908201559585015495909401949094555492548451888152918201528351929386937f3446268fc8181c87ca8580504fff9cf33b6de9c160e4989ae91343e75ff741609281900390910190a4506000818152600a60205260409020805460ff1916600190811790915592915050565b60006001600160a01b03831662000e8f57600080fd5b336001600160a01b038516148062000eca57506001600160a01b03841660009081526003602090815260408083203384529091529020548211155b8062000ef957506001600160a01b0384163014801562000ef957503360009081526006602052604090205460ff165b62000f6557604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f53656e646572206e6f7420617574686f72697a65640000000000000000000000604482015290519081900360640190fd5b6001600160a01b03841660009081526002602052604090205482111562000fd8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526024815260200180620034886024913960400191505060405180910390fd5b6001600160a01b0383163014156200114f576001600160a01b03841633146200106257604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4f6e6c7920746f6b656e20686f6c6465722063616e20646f2074686973000000604482015290519081900360640190fd5b600854821015620010bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526027815260200180620035456027913960400191505060405180910390fd5b600d8054600101908190556040805184815290516001600160a01b038716917f9f2fe8c128eb2cf4c04e739244f557be16604328557233a7a2a6c1fbf1cf8c4a919081900360200190a3600d80546000908152600e602052604080822080546001600160a01b0319166001600160a01b038916179055825482528082206001018590559154815220426002909101555b6001600160a01b038416600090815260026020908152604090912054620011819184906200200f620012b3821b17901c565b6001600160a01b0380861660009081526002602090815260408083209490945591861681529190912054620011c191849062002024620012c9821b17901c565b6001600160a01b0380851660009081526002602052604090209190915584163314801590620011f957506001600160a01b0384163014155b156200125e576001600160a01b0384166000908152600360209081526040808320338452825290912054620012399184906200200f620012b3821b17901c565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35060019392505050565b600082821115620012c357600080fd5b50900390565b6000828201838110156200097a57600080fd5b61219c80620012ec6000396000f3fe608060405234801561001057600080fd5b50600436106102485760003560e01c8063439e6e091161013b57806395d89b41116100b8578063c3250df21161007c578063c3250df21461087d578063c9d599491461089a578063d87692d9146108b7578063dc78ab8e14610937578063dd62ed3e1461095457610248565b806395d89b41146107c1578063a9059cbb146107c9578063b3dc174e146107f5578063b82dfbcb1461084f578063c2ba47441461085757610248565b806370a08231116100ff57806370a08231146107215780637b56afa7146107475780637c390bd81461076d57806390136322146107935780639484d4a21461079b57610248565b8063439e6e0914610656578063551f59c91461069b57806366e02dda146106a357806370480275146106d557806370532b44146106fb57610248565b806324d7806c116101c957806336953c161161018d57806336953c16146104cd5780633820a686146104f157806339a7412b146105175780634000aea014610569578063426a84931461062457610248565b806324d7806c1461041a5780632b5e071a14610440578063313ce5671461046657806334a7c2e71461048457806335e80056146104a757610248565b806312b8b3241161021057806312b8b3241461037657806315a74a991461039c5780631785f53c146103b657806318160ddd146103dc57806323b872dd146103e457610248565b80630143faba1461024d57806304681a281461028757806306fdde03146102b0578063095ea7b31461032d5780630e5d127d14610359575b600080fd5b6102736004803603602081101561026357600080fd5b50356001600160a01b0316610982565b604080519115158252519081900360200190f35b6102736004803603606081101561029d57600080fd5b5080359060208101359060400135610a26565b6102b8610c4f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102f25781810151838201526020016102da565b50505050905090810190601f16801561031f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102736004803603604081101561034357600080fd5b506001600160a01b038135169060200135610c73565b6102736004803603602081101561036f57600080fd5b5035610cd9565b6102736004803603602081101561038c57600080fd5b50356001600160a01b0316610d79565b6103a4610d8e565b60408051918252519081900360200190f35b610273600480360360208110156103cc57600080fd5b50356001600160a01b0316610d94565b6103a4610e99565b610273600480360360608110156103fa57600080fd5b506001600160a01b03813581169160208101359091169060400135610e9f565b6102736004803603602081101561043057600080fd5b50356001600160a01b0316611251565b6102736004803603602081101561045657600080fd5b50356001600160a01b0316611266565b61046e611359565b6040805160ff9092168252519081900360200190f35b6102736004803603604081101561049a57600080fd5b508035906020013561135e565b610273600480360360208110156104bd57600080fd5b50356001600160a01b031661156d565b6104d5611611565b604080516001600160a01b039092168252519081900360200190f35b6102736004803603602081101561050757600080fd5b50356001600160a01b0316611620565b6105346004803603602081101561052d57600080fd5b5035611635565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102736004803603606081101561057f57600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156105af57600080fd5b8201836020820111156105c157600080fd5b803590602001918460018302840111640100000000831117156105e357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061166e945050505050565b6102736004803603606081101561063a57600080fd5b506001600160a01b03813516906020810135906040013561183e565b6106736004803603602081101561066c57600080fd5b503561187f565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b6103a46118aa565b610273600480360360608110156106b957600080fd5b50803590602081013590604001356001600160a01b03166118b0565b610273600480360360208110156106eb57600080fd5b50356001600160a01b03166118e5565b6102736004803603602081101561071157600080fd5b50356001600160a01b0316611b51565b6103a46004803603602081101561073757600080fd5b50356001600160a01b0316611bf5565b6102736004803603602081101561075d57600080fd5b50356001600160a01b0316611c07565b6102736004803603602081101561078357600080fd5b50356001600160a01b0316611cca565b6103a4611dbd565b610273600480360360208110156107b157600080fd5b50356001600160a01b0316611dc3565b6102b8611eb6565b610273600480360360408110156107df57600080fd5b506001600160a01b038135169060200135611ed9565b6108126004803603602081101561080b57600080fd5b5035611ee6565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6103a4611f25565b6102736004803603602081101561086d57600080fd5b50356001600160a01b0316611f2b565b6102736004803603602081101561089357600080fd5b5035611f40565b610273600480360360208110156108b057600080fd5b5035611f55565b610273600480360360408110156108cd57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156108f857600080fd5b82018360208201111561090a57600080fd5b8035906020019184600183028401116401000000008311171561092c57600080fd5b509092509050611f6a565b6105346004803603602081101561094d57600080fd5b5035611fb9565b6103a46004803603604081101561096a57600080fd5b506001600160a01b0381358116916020013516611ff2565b3360009081526004602052604081205460ff166109d75760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191690555133917f360cc1ecf7efd70487c243952543c7d95ab444c9c52dde253f7979c33a1cab7891a3506001919050565b3360009081526007602052604081205460ff16610a885760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b30600090815260026020526040902054841115610ad957604051600160e51b62461bcd02815260040180806020018281038252602581526020018061207f6025913960400191505060405180910390fd5b60008281526011602052604090205460ff1615610b2a57604051600160e51b62461bcd02815260040180806020018281038252602481526020018061205b6024913960400191505060405180910390fd5b30600090815260026020526040902054610b4a908563ffffffff61200f16565b30600090815260026020526040902055600154610b6d908563ffffffff61200f16565b6001908155600f80548201808255600090815260106020908152604080832080546001600160a01b031916339081179091558454845281842086018a9055845484528184206002018990558454845281842060030188905584548452818420426004909101819055955494548452928190206005018490558051898152918201949094528084019290925291518492869290917f535315e7d1c7278469a90807aa28576a16d9dda00727fca7937f7ebc658a11fc9181900360600190a4506000818152601160205260409020805460ff191660019081179091555b9392505050565b604051806040016040528060058152602001600160d81b64784575726f0281525081565b3360008181526003602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b3360009081526004602052604081205460ff16610d2e5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b60088054908390556040805182815260208101859052815133927f647ea6b9c0886d71b598c86e2dea5324cecd56394fb1c54c794462e31abd4b17928290030190a250600192915050565b60066020526000908152604090205460ff1681565b600f5481565b3360009081526004602052604081205460ff16610de95760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b336001600160a01b0383161415610e4a5760408051600160e51b62461bcd02815260206004820152601a60248201527f41646d696e2063616e27742072656d6f76652068696d73656c66000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a3506001919050565b60015481565b60006001600160a01b038316610eb457600080fd5b336001600160a01b0385161480610eee57506001600160a01b03841660009081526003602090815260408083203384529091529020548211155b80610f1b57506001600160a01b03841630148015610f1b57503360009081526006602052604090205460ff165b610f6a5760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6001600160a01b038416600090815260026020526040902054821115610fc457604051600160e51b62461bcd0281526004018080602001828103825260248152602001806120376024913960400191505060405180910390fd5b6001600160a01b038316301415611109576001600160a01b03841633146110355760408051600160e51b62461bcd02815260206004820152601d60248201527f4f6e6c7920746f6b656e20686f6c6465722063616e20646f2074686973000000604482015290519081900360640190fd5b60085482101561107957604051600160e51b62461bcd0281526004018080602001828103825260278152602001806120f46027913960400191505060405180910390fd5b600d8054600101908190556040805184815290516001600160a01b038716917f9f2fe8c128eb2cf4c04e739244f557be16604328557233a7a2a6c1fbf1cf8c4a919081900360200190a3600d80546000908152600e602052604080822080546001600160a01b0319166001600160a01b038916179055825482528082206001018590559154815220426002909101555b6001600160a01b038416600090815260026020526040902054611132908363ffffffff61200f16565b6001600160a01b038086166000908152600260205260408082209390935590851681522054611167908363ffffffff61202416565b6001600160a01b038085166000908152600260205260409020919091558416331480159061119e57506001600160a01b0384163014155b156111fc576001600160a01b03841660009081526003602090815260408083203384529091529020546111d7908363ffffffff61200f16565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35060019392505050565b60046020526000908152604090205460ff1681565b3360009081526004602052604081205460ff166112bb5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b0382166113075760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191660011790555133917f0a3824f403289d915446d591615857435fbf94fa18a273bf37f75ebecbde650c91a3506001919050565b600081565b3360009081526005602052604081205460ff166113c05760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6000828152600a602052604090205460ff161561141157604051600160e51b62461bcd02815260040180806020018281038252602481526020018061205b6024913960400191505060405180910390fd5b600154611424908463ffffffff61202416565b60015530600090815260026020526040902054611447908463ffffffff61202416565b306000908152600260208181526040808420949094556009805460019081018083558552600c83528585208054336001600160a01b031991821681179092558354875287872083018a90558354875287872086018b90558354875287872042600391820155835485548952898920600490810191909155855489528989208c8a52600b8852988a9020895481546001600160a01b0390911694169390931783558885015483860155888801549783019790975587810154908201559585015495909401949094555492548451888152918201528351929386937f3446268fc8181c87ca8580504fff9cf33b6de9c160e4989ae91343e75ff741609281900390910190a4506000818152600a60205260409020805460ff1916600190811790915592915050565b3360009081526004602052604081205460ff166115c25760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191690555133917f712c2fc592e9be8dffbbe4227d1906927facef2da8a401921e916d864971b6bb91a3506001919050565b6000546001600160a01b031681565b60076020526000908152604090205460ff1681565b600c60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b60008361167c338286610e9f565b1561183357806001600160a01b031663a4c0ed363386866040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156116fd5781810151838201526020016116e5565b50505050905090810190601f16801561172a5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505050506040513d602081101561177557600080fd5b50511561183357846001600160a01b0316336001600160a01b03167f21ef8368734ad953ed9ae3c3035d58f91f69a15ebc986c4e008bc18f8cdc4d69856040518080602001828103825283818151815260200191508051906020019080838360005b838110156117ef5781810151838201526020016117d7565b50505050905090810190601f16801561181c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a36001915050610c48565b506000949350505050565b3360009081526003602090815260408083206001600160a01b0387168452909152812054831461186d57600080fd5b6118778483610c73565b949350505050565b600e602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b60085481565b60006118bc848461135e565b80156118ce57506118ce308386610e9f565b156118db57506001610c48565b5060009392505050565b3360009081526004602052604081205460ff1661193a5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b0382166119865760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b60005460408051600160e01b635b3d0bc10281526001600160a01b038581166004830152915142939290921691635b3d0bc191602480820192602092909190829003018186803b1580156119d957600080fd5b505afa1580156119ed573d6000803e3d6000fd5b505050506040513d6020811015611a0357600080fd5b505111611a4457604051600160e51b62461bcd0281526004018080602001828103825260308152602001806120c46030913960400191505060405180910390fd5b60005460408051600160e01b63836afead0281526001600160a01b0385811660048301529151919092169163836afead916024808301926020929190829003018186803b158015611a9457600080fd5b505afa158015611aa8573d6000803e3d6000fd5b505050506040513d6020811015611abe57600080fd5b505115611aff57604051600160e51b62461bcd02815260040180806020018281038252603681526020018061211b6036913960400191505060405180910390fd5b6001600160a01b038216600081815260046020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a3506001919050565b3360009081526004602052604081205460ff16611ba65760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191690555133917fd4373432dc9e869df5c22a4fa3c90d5cca453140523c9e076c2a347ee8d806f391a3506001919050565b60026020526000908152604090205481565b3360009081526004602052604081205460ff16611c5c5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b600054604080516001600160a01b0392831681529184166020830152805133927fdeee135e9ab3644341d22e8715d2d21eef558921ca6eb86764de7125302f200f92908290030190a250600080546001600160a01b0383166001600160a01b03199091161790556001919050565b3360009081526004602052604081205460ff16611d1f5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216611d6b5760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191660011790555133917fdac4748568425c8dfc8706e3c3eb5191272f7d331ecec6c4e5e6bd0efc0b75bd91a3506001919050565b60095481565b3360009081526004602052604081205460ff16611e185760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216611e645760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191660011790555133917f0839a19aaf317047bdfffbd8e7dd2055c38842f33268dbc18016460178e17c2191a3506001919050565b604051806040016040528060048152602001600160e11b633c22aaa90281525081565b6000610c48338484610e9f565b6010602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039094169492939192909186565b600d5481565b60056020526000908152604090205460ff1681565b60116020526000908152604090205460ff1681565b600a6020526000908152604090205460ff1681565b336000908152600260209081526040808320548151601f860184900484028101840190925284825261187792879290879087908190840183828082843760009201919091525061166e92505050565b600b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b600360209081526000928352604080842090915290825290205481565b60008282111561201e57600080fd5b50900390565b600082820183811015610c4857600080fdfe4163636f756e7420646f65736e2774206861766520726571756972656420616d6f756e74546869732066696174207061796d656e7420696420697320616c726561647920757365644163636f756e7420646f6573206e6f74206861766520726571756972656420616d6f756e744f6e6c792061646d696e2063616e20646f2074686174000000000000000000004e65772061646d696e2068617320746f206265207665726966696564206f6e2043727970746f6e6f6d6963612e6e657456616c7565206973206c657373207468616e206d696e2e2065786368616e676520616d6f756e74566572696669636174696f6e20666f722074686973206164647265737320776173207265766f6b65642c2063616e206e6f7420616464416464726573732063616e206e6f74206265207a65726f2d6164647265737300a165627a7a72305820b8b84e4364cf3182798956bb634089593885af05d1b7002241a82fdf40a8b36f00294163636f756e7420646f65736e2774206861766520726571756972656420616d6f756e74546869732066696174207061796d656e7420696420697320616c726561647920757365644163636f756e7420646f6573206e6f74206861766520726571756972656420616d6f756e744f6e6c792061646d696e2063616e20646f2074686174000000000000000000004e65772061646d696e2068617320746f206265207665726966696564206f6e2043727970746f6e6f6d6963612e6e657456616c7565206973206c657373207468616e206d696e2e2065786368616e676520616d6f756e74566572696669636174696f6e20666f722074686973206164647265737320776173207265766f6b65642c2063616e206e6f7420616464416464726573732063616e206e6f74206265207a65726f2d6164647265737300

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102485760003560e01c8063439e6e091161013b57806395d89b41116100b8578063c3250df21161007c578063c3250df21461087d578063c9d599491461089a578063d87692d9146108b7578063dc78ab8e14610937578063dd62ed3e1461095457610248565b806395d89b41146107c1578063a9059cbb146107c9578063b3dc174e146107f5578063b82dfbcb1461084f578063c2ba47441461085757610248565b806370a08231116100ff57806370a08231146107215780637b56afa7146107475780637c390bd81461076d57806390136322146107935780639484d4a21461079b57610248565b8063439e6e0914610656578063551f59c91461069b57806366e02dda146106a357806370480275146106d557806370532b44146106fb57610248565b806324d7806c116101c957806336953c161161018d57806336953c16146104cd5780633820a686146104f157806339a7412b146105175780634000aea014610569578063426a84931461062457610248565b806324d7806c1461041a5780632b5e071a14610440578063313ce5671461046657806334a7c2e71461048457806335e80056146104a757610248565b806312b8b3241161021057806312b8b3241461037657806315a74a991461039c5780631785f53c146103b657806318160ddd146103dc57806323b872dd146103e457610248565b80630143faba1461024d57806304681a281461028757806306fdde03146102b0578063095ea7b31461032d5780630e5d127d14610359575b600080fd5b6102736004803603602081101561026357600080fd5b50356001600160a01b0316610982565b604080519115158252519081900360200190f35b6102736004803603606081101561029d57600080fd5b5080359060208101359060400135610a26565b6102b8610c4f565b6040805160208082528351818301528351919283929083019185019080838360005b838110156102f25781810151838201526020016102da565b50505050905090810190601f16801561031f5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6102736004803603604081101561034357600080fd5b506001600160a01b038135169060200135610c73565b6102736004803603602081101561036f57600080fd5b5035610cd9565b6102736004803603602081101561038c57600080fd5b50356001600160a01b0316610d79565b6103a4610d8e565b60408051918252519081900360200190f35b610273600480360360208110156103cc57600080fd5b50356001600160a01b0316610d94565b6103a4610e99565b610273600480360360608110156103fa57600080fd5b506001600160a01b03813581169160208101359091169060400135610e9f565b6102736004803603602081101561043057600080fd5b50356001600160a01b0316611251565b6102736004803603602081101561045657600080fd5b50356001600160a01b0316611266565b61046e611359565b6040805160ff9092168252519081900360200190f35b6102736004803603604081101561049a57600080fd5b508035906020013561135e565b610273600480360360208110156104bd57600080fd5b50356001600160a01b031661156d565b6104d5611611565b604080516001600160a01b039092168252519081900360200190f35b6102736004803603602081101561050757600080fd5b50356001600160a01b0316611620565b6105346004803603602081101561052d57600080fd5b5035611635565b604080516001600160a01b03909616865260208601949094528484019290925260608401526080830152519081900360a00190f35b6102736004803603606081101561057f57600080fd5b6001600160a01b03823516916020810135918101906060810160408201356401000000008111156105af57600080fd5b8201836020820111156105c157600080fd5b803590602001918460018302840111640100000000831117156105e357600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061166e945050505050565b6102736004803603606081101561063a57600080fd5b506001600160a01b03813516906020810135906040013561183e565b6106736004803603602081101561066c57600080fd5b503561187f565b604080516001600160a01b039094168452602084019290925282820152519081900360600190f35b6103a46118aa565b610273600480360360608110156106b957600080fd5b50803590602081013590604001356001600160a01b03166118b0565b610273600480360360208110156106eb57600080fd5b50356001600160a01b03166118e5565b6102736004803603602081101561071157600080fd5b50356001600160a01b0316611b51565b6103a46004803603602081101561073757600080fd5b50356001600160a01b0316611bf5565b6102736004803603602081101561075d57600080fd5b50356001600160a01b0316611c07565b6102736004803603602081101561078357600080fd5b50356001600160a01b0316611cca565b6103a4611dbd565b610273600480360360208110156107b157600080fd5b50356001600160a01b0316611dc3565b6102b8611eb6565b610273600480360360408110156107df57600080fd5b506001600160a01b038135169060200135611ed9565b6108126004803603602081101561080b57600080fd5b5035611ee6565b604080516001600160a01b0390971687526020870195909552858501939093526060850191909152608084015260a0830152519081900360c00190f35b6103a4611f25565b6102736004803603602081101561086d57600080fd5b50356001600160a01b0316611f2b565b6102736004803603602081101561089357600080fd5b5035611f40565b610273600480360360208110156108b057600080fd5b5035611f55565b610273600480360360408110156108cd57600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156108f857600080fd5b82018360208201111561090a57600080fd5b8035906020019184600183028401116401000000008311171561092c57600080fd5b509092509050611f6a565b6105346004803603602081101561094d57600080fd5b5035611fb9565b6103a46004803603604081101561096a57600080fd5b506001600160a01b0381358116916020013516611ff2565b3360009081526004602052604081205460ff166109d75760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191690555133917f360cc1ecf7efd70487c243952543c7d95ab444c9c52dde253f7979c33a1cab7891a3506001919050565b3360009081526007602052604081205460ff16610a885760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b30600090815260026020526040902054841115610ad957604051600160e51b62461bcd02815260040180806020018281038252602581526020018061207f6025913960400191505060405180910390fd5b60008281526011602052604090205460ff1615610b2a57604051600160e51b62461bcd02815260040180806020018281038252602481526020018061205b6024913960400191505060405180910390fd5b30600090815260026020526040902054610b4a908563ffffffff61200f16565b30600090815260026020526040902055600154610b6d908563ffffffff61200f16565b6001908155600f80548201808255600090815260106020908152604080832080546001600160a01b031916339081179091558454845281842086018a9055845484528184206002018990558454845281842060030188905584548452818420426004909101819055955494548452928190206005018490558051898152918201949094528084019290925291518492869290917f535315e7d1c7278469a90807aa28576a16d9dda00727fca7937f7ebc658a11fc9181900360600190a4506000818152601160205260409020805460ff191660019081179091555b9392505050565b604051806040016040528060058152602001600160d81b64784575726f0281525081565b3360008181526003602090815260408083206001600160a01b038716808552908352818420869055815186815291519394909390927f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925928290030190a350600192915050565b3360009081526004602052604081205460ff16610d2e5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b60088054908390556040805182815260208101859052815133927f647ea6b9c0886d71b598c86e2dea5324cecd56394fb1c54c794462e31abd4b17928290030190a250600192915050565b60066020526000908152604090205460ff1681565b600f5481565b3360009081526004602052604081205460ff16610de95760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b336001600160a01b0383161415610e4a5760408051600160e51b62461bcd02815260206004820152601a60248201527f41646d696e2063616e27742072656d6f76652068696d73656c66000000000000604482015290519081900360640190fd5b6001600160a01b038216600081815260046020526040808220805460ff191690555133917fdb9d5d31320daf5bc7181d565b6da4d12e30f0f4d5aa324a992426c14a1d19ce91a3506001919050565b60015481565b60006001600160a01b038316610eb457600080fd5b336001600160a01b0385161480610eee57506001600160a01b03841660009081526003602090815260408083203384529091529020548211155b80610f1b57506001600160a01b03841630148015610f1b57503360009081526006602052604090205460ff165b610f6a5760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6001600160a01b038416600090815260026020526040902054821115610fc457604051600160e51b62461bcd0281526004018080602001828103825260248152602001806120376024913960400191505060405180910390fd5b6001600160a01b038316301415611109576001600160a01b03841633146110355760408051600160e51b62461bcd02815260206004820152601d60248201527f4f6e6c7920746f6b656e20686f6c6465722063616e20646f2074686973000000604482015290519081900360640190fd5b60085482101561107957604051600160e51b62461bcd0281526004018080602001828103825260278152602001806120f46027913960400191505060405180910390fd5b600d8054600101908190556040805184815290516001600160a01b038716917f9f2fe8c128eb2cf4c04e739244f557be16604328557233a7a2a6c1fbf1cf8c4a919081900360200190a3600d80546000908152600e602052604080822080546001600160a01b0319166001600160a01b038916179055825482528082206001018590559154815220426002909101555b6001600160a01b038416600090815260026020526040902054611132908363ffffffff61200f16565b6001600160a01b038086166000908152600260205260408082209390935590851681522054611167908363ffffffff61202416565b6001600160a01b038085166000908152600260205260409020919091558416331480159061119e57506001600160a01b0384163014155b156111fc576001600160a01b03841660009081526003602090815260408083203384529091529020546111d7908363ffffffff61200f16565b6001600160a01b03851660009081526003602090815260408083203384529091529020555b826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef846040518082815260200191505060405180910390a35060019392505050565b60046020526000908152604090205460ff1681565b3360009081526004602052604081205460ff166112bb5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b0382166113075760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260066020526040808220805460ff191660011790555133917f0a3824f403289d915446d591615857435fbf94fa18a273bf37f75ebecbde650c91a3506001919050565b600081565b3360009081526005602052604081205460ff166113c05760408051600160e51b62461bcd02815260206004820152601560248201526001605a1b7414d95b99195c881b9bdd08185d5d1a1bdc9a5e995902604482015290519081900360640190fd5b6000828152600a602052604090205460ff161561141157604051600160e51b62461bcd02815260040180806020018281038252602481526020018061205b6024913960400191505060405180910390fd5b600154611424908463ffffffff61202416565b60015530600090815260026020526040902054611447908463ffffffff61202416565b306000908152600260208181526040808420949094556009805460019081018083558552600c83528585208054336001600160a01b031991821681179092558354875287872083018a90558354875287872086018b90558354875287872042600391820155835485548952898920600490810191909155855489528989208c8a52600b8852988a9020895481546001600160a01b0390911694169390931783558885015483860155888801549783019790975587810154908201559585015495909401949094555492548451888152918201528351929386937f3446268fc8181c87ca8580504fff9cf33b6de9c160e4989ae91343e75ff741609281900390910190a4506000818152600a60205260409020805460ff1916600190811790915592915050565b3360009081526004602052604081205460ff166115c25760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191690555133917f712c2fc592e9be8dffbbe4227d1906927facef2da8a401921e916d864971b6bb91a3506001919050565b6000546001600160a01b031681565b60076020526000908152604090205460ff1681565b600c60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b60008361167c338286610e9f565b1561183357806001600160a01b031663a4c0ed363386866040518463ffffffff1660e01b815260040180846001600160a01b03166001600160a01b0316815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b838110156116fd5781810151838201526020016116e5565b50505050905090810190601f16801561172a5780820380516001836020036101000a031916815260200191505b50945050505050602060405180830381600087803b15801561174b57600080fd5b505af115801561175f573d6000803e3d6000fd5b505050506040513d602081101561177557600080fd5b50511561183357846001600160a01b0316336001600160a01b03167f21ef8368734ad953ed9ae3c3035d58f91f69a15ebc986c4e008bc18f8cdc4d69856040518080602001828103825283818151815260200191508051906020019080838360005b838110156117ef5781810151838201526020016117d7565b50505050905090810190601f16801561181c5780820380516001836020036101000a031916815260200191505b509250505060405180910390a36001915050610c48565b506000949350505050565b3360009081526003602090815260408083206001600160a01b0387168452909152812054831461186d57600080fd5b6118778483610c73565b949350505050565b600e602052600090815260409020805460018201546002909201546001600160a01b03909116919083565b60085481565b60006118bc848461135e565b80156118ce57506118ce308386610e9f565b156118db57506001610c48565b5060009392505050565b3360009081526004602052604081205460ff1661193a5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b0382166119865760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b60005460408051600160e01b635b3d0bc10281526001600160a01b038581166004830152915142939290921691635b3d0bc191602480820192602092909190829003018186803b1580156119d957600080fd5b505afa1580156119ed573d6000803e3d6000fd5b505050506040513d6020811015611a0357600080fd5b505111611a4457604051600160e51b62461bcd0281526004018080602001828103825260308152602001806120c46030913960400191505060405180910390fd5b60005460408051600160e01b63836afead0281526001600160a01b0385811660048301529151919092169163836afead916024808301926020929190829003018186803b158015611a9457600080fd5b505afa158015611aa8573d6000803e3d6000fd5b505050506040513d6020811015611abe57600080fd5b505115611aff57604051600160e51b62461bcd02815260040180806020018281038252603681526020018061211b6036913960400191505060405180910390fd5b6001600160a01b038216600081815260046020526040808220805460ff191660011790555133917fbf3f493c772c8c283fd124432c2d0f539ab343faa04258fe88e52912d36b102b91a3506001919050565b3360009081526004602052604081205460ff16611ba65760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191690555133917fd4373432dc9e869df5c22a4fa3c90d5cca453140523c9e076c2a347ee8d806f391a3506001919050565b60026020526000908152604090205481565b3360009081526004602052604081205460ff16611c5c5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b600054604080516001600160a01b0392831681529184166020830152805133927fdeee135e9ab3644341d22e8715d2d21eef558921ca6eb86764de7125302f200f92908290030190a250600080546001600160a01b0383166001600160a01b03199091161790556001919050565b3360009081526004602052604081205460ff16611d1f5760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216611d6b5760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260056020526040808220805460ff191660011790555133917fdac4748568425c8dfc8706e3c3eb5191272f7d331ecec6c4e5e6bd0efc0b75bd91a3506001919050565b60095481565b3360009081526004602052604081205460ff16611e185760408051600160e51b62461bcd02815260206004820152601660248201526000805160206120a4833981519152604482015290519081900360640190fd5b6001600160a01b038216611e645760408051600160e51b62461bcd02815260206004820152601f6024820152600080516020612151833981519152604482015290519081900360640190fd5b6001600160a01b038216600081815260076020526040808220805460ff191660011790555133917f0839a19aaf317047bdfffbd8e7dd2055c38842f33268dbc18016460178e17c2191a3506001919050565b604051806040016040528060048152602001600160e11b633c22aaa90281525081565b6000610c48338484610e9f565b6010602052600090815260409020805460018201546002830154600384015460048501546005909501546001600160a01b039094169492939192909186565b600d5481565b60056020526000908152604090205460ff1681565b60116020526000908152604090205460ff1681565b600a6020526000908152604090205460ff1681565b336000908152600260209081526040808320548151601f860184900484028101840190925284825261187792879290879087908190840183828082843760009201919091525061166e92505050565b600b60205260009081526040902080546001820154600283015460038401546004909401546001600160a01b0390931693919290919085565b600360209081526000928352604080842090915290825290205481565b60008282111561201e57600080fd5b50900390565b600082820183811015610c4857600080fdfe4163636f756e7420646f65736e2774206861766520726571756972656420616d6f756e74546869732066696174207061796d656e7420696420697320616c726561647920757365644163636f756e7420646f6573206e6f74206861766520726571756972656420616d6f756e744f6e6c792061646d696e2063616e20646f2074686174000000000000000000004e65772061646d696e2068617320746f206265207665726966696564206f6e2043727970746f6e6f6d6963612e6e657456616c7565206973206c657373207468616e206d696e2e2065786368616e676520616d6f756e74566572696669636174696f6e20666f722074686973206164647265737320776173207265766f6b65642c2063616e206e6f7420616464416464726573732063616e206e6f74206265207a65726f2d6164647265737300a165627a7a72305820b8b84e4364cf3182798956bb634089593885af05d1b7002241a82fdf40a8b36f0029

Swarm Source

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