ETH Price: $2,092.37 (+1.34%)

Contract

0xe577e0B200d00eBdecbFc1cd3F7E8E04C70476BE
 

Overview

ETH Balance

0 ETH

Eth Value

$0.00

Token Holdings

More Info

Private Name Tags

TokenTracker

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Transfer118239722021-02-09 18:41:461875 days ago1612896106IN
xEuro Token
0 ETH0.01001052270
Transfer99741702020-04-30 13:30:322161 days ago1588253432IN
xEuro Token
0 ETH0.0006622830
Transfer99741452020-04-30 13:23:592161 days ago1588253039IN
xEuro Token
0 ETH0.0021095340.5086984
Transfer99740602020-04-30 13:02:192161 days ago1588251739IN
xEuro Token
0 ETH0.0006622830
Transfer99740482020-04-30 12:59:152161 days ago1588251555IN
xEuro Token
0 ETH0.0041690980.05785436
Transfer99432372020-04-25 18:27:132165 days ago1587839233IN
xEuro Token
0 ETH0.0006622830
Transfer99432212020-04-25 18:23:482165 days ago1587839028IN
xEuro Token
0 ETH0.0006478512.44054835
Transfer99312692020-04-23 22:01:572167 days ago1587679317IN
xEuro Token
0 ETH0.0006619230
Transfer99312622020-04-23 22:00:372167 days ago1587679237IN
xEuro Token
0 ETH0.000111193
Transfer99239252020-04-22 18:45:022168 days ago1587581102IN
xEuro Token
0 ETH0.0006619230
Transfer99239012020-04-22 18:39:352168 days ago1587580775IN
xEuro Token
0 ETH0.0010488720.14595059
Transfer97244372020-03-23 0:06:262199 days ago1584921986IN
xEuro Token
0 ETH0.000156193
Transfer97101162020-03-20 18:18:182201 days ago1584728298IN
xEuro Token
0 ETH0.000104122
Transfer96981912020-03-18 22:04:152203 days ago1584569055IN
xEuro Token
0 ETH0.0004013910.82980265
Transfer96882702020-03-17 9:45:122205 days ago1584438312IN
xEuro Token
0 ETH0.001103250
Transfer96882382020-03-17 9:37:442205 days ago1584437864IN
xEuro Token
0 ETH0.0028506754.75326755
Transfer96624132020-03-13 9:41:022209 days ago1584092462IN
xEuro Token
0 ETH0.0012135255
Transfer96603352020-03-13 1:51:582209 days ago1584064318IN
xEuro Token
0 ETH0.01904557365.81088389
Transfer96326972020-03-08 19:33:562213 days ago1583696036IN
xEuro Token
0 ETH0.000052061
Transfer95710872020-02-28 8:43:482223 days ago1582879428IN
xEuro Token
0 ETH0.0004633421
Transfer95710722020-02-28 8:41:152223 days ago1582879275IN
xEuro Token
0 ETH0.0008695916.70239711
Transfer95682472020-02-27 22:04:592223 days ago1582841099IN
xEuro Token
0 ETH0.0004633421
Transfer95682282020-02-27 21:59:132223 days ago1582840753IN
xEuro Token
0 ETH0.0009556218.35474776
Transfer94074462020-02-03 4:42:332248 days ago1580704953IN
xEuro Token
0 ETH0.0010933421
Transfer94042702020-02-02 16:51:402248 days ago1580662300IN
xEuro Token
0 ETH0.0010933421
View all transactions

View more zero value Internal Transactions in Advanced View mode

Advanced mode:
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions

Block Transaction Difficulty Gas Used Reward
View All Blocks Produced

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
Loading...
Loading

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

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.