{"file_path":"EURSToken.sol","creation_status":"success","source_code":"/**\r\n * EURS Token Smart Contract: EIP-20 compatible token smart contract that\r\n * manages EURS tokens.\r\n */\r\n\r\n/*\r\n * Safe Math Smart Contract.\r\n * Copyright (c) 2018 by STSS (Malta) Limited.\r\n * Contact: <tech@stasis.net>\r\n */\r\npragma solidity ^0.4.20;\r\n\r\n/**\r\n * Provides methods to safely add, subtract and multiply uint256 numbers.\r\n */\r\ncontract SafeMath {\r\n  uint256 constant private MAX_UINT256 =\r\n    0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;\r\n\r\n  /**\r\n   * Add two uint256 values, throw in case of overflow.\r\n   *\r\n   * @param x first value to add\r\n   * @param y second value to add\r\n   * @return x + y\r\n   */\r\n  function safeAdd (uint256 x, uint256 y)\r\n  pure internal\r\n  returns (uint256 z) {\r\n    assert (x <= MAX_UINT256 - y);\r\n    return x + y;\r\n  }\r\n\r\n  /**\r\n   * Subtract one uint256 value from another, throw in case of underflow.\r\n   *\r\n   * @param x value to subtract from\r\n   * @param y value to subtract\r\n   * @return x - y\r\n   */\r\n  function safeSub (uint256 x, uint256 y)\r\n  pure internal\r\n  returns (uint256 z) {\r\n    assert (x >= y);\r\n    return x - y;\r\n  }\r\n\r\n  /**\r\n   * Multiply two uint256 values, throw in case of overflow.\r\n   *\r\n   * @param x first value to multiply\r\n   * @param y second value to multiply\r\n   * @return x * y\r\n   */\r\n  function safeMul (uint256 x, uint256 y)\r\n  pure internal\r\n  returns (uint256 z) {\r\n    if (y == 0) return 0; // Prevent division by zero at the next line\r\n    assert (x <= MAX_UINT256 / y);\r\n    return x * y;\r\n  }\r\n}\r\n/*\r\n * EIP-20 Standard Token Smart Contract Interface.\r\n * Copyright (c) 2018 by STSS (Malta) Limited.\r\n * Contact: <tech@stasis.net>\r\n\r\n * ERC-20 standard token interface, as defined\r\n * <a href=\"https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md\">here</a>.\r\n */\r\ncontract Token {\r\n  /**\r\n   * Get total number of tokens in circulation.\r\n   *\r\n   * @return total number of tokens in circulation\r\n   */\r\n  function totalSupply () public view returns (uint256 supply);\r\n\r\n  /**\r\n   * Get number of tokens currently belonging to given owner.\r\n   *\r\n   * @param _owner address to get number of tokens currently belonging to the\r\n   *        owner of\r\n   * @return number of tokens currently belonging to the owner of given address\r\n   */\r\n  function balanceOf (address _owner) public view returns (uint256 balance);\r\n\r\n  /**\r\n   * Transfer given number of tokens from message sender to given recipient.\r\n   *\r\n   * @param _to address to transfer tokens to the owner of\r\n   * @param _value number of tokens to transfer to the owner of given address\r\n   * @return true if tokens were transferred successfully, false otherwise\r\n   */\r\n  function transfer (address _to, uint256 _value)\r\n  public payable returns (bool success);\r\n\r\n  /**\r\n   * Transfer given number of tokens from given owner to given recipient.\r\n   *\r\n   * @param _from address to transfer tokens from the owner of\r\n   * @param _to address to transfer tokens to the owner of\r\n   * @param _value number of tokens to transfer from given owner to given\r\n   *        recipient\r\n   * @return true if tokens were transferred successfully, false otherwise\r\n   */\r\n  function transferFrom (address _from, address _to, uint256 _value)\r\n  public payable returns (bool success);\r\n\r\n  /**\r\n   * Allow given spender to transfer given number of tokens from message sender.\r\n   *\r\n   * @param _spender address to allow the owner of to transfer tokens from\r\n   *        message sender\r\n   * @param _value number of tokens to allow to transfer\r\n   * @return true if token transfer was successfully approved, false otherwise\r\n   */\r\n  function approve (address _spender, uint256 _value)\r\n  public payable returns (bool success);\r\n\r\n  /**\r\n   * Tell how many tokens given spender is currently allowed to transfer from\r\n   * given owner.\r\n   *\r\n   * @param _owner address to get number of tokens allowed to be transferred\r\n   *        from the owner of\r\n   * @param _spender address to get number of tokens allowed to be transferred\r\n   *        by the owner of\r\n   * @return number of tokens given spender is currently allowed to transfer\r\n   *         from given owner\r\n   */\r\n  function allowance (address _owner, address _spender)\r\n  public view returns (uint256 remaining);\r\n\r\n  /**\r\n   * Logged when tokens were transferred from one owner to another.\r\n   *\r\n   * @param _from address of the owner, tokens were transferred from\r\n   * @param _to address of the owner, tokens were transferred to\r\n   * @param _value number of tokens transferred\r\n   */\r\n  event Transfer (address indexed _from, address indexed _to, uint256 _value);\r\n\r\n  /**\r\n   * Logged when owner approved his tokens to be transferred by some spender.\r\n   *\r\n   * @param _owner owner who approved his tokens to be transferred\r\n   * @param _spender spender who were allowed to transfer the tokens belonging\r\n   *        to the owner\r\n   * @param _value number of tokens belonging to the owner, approved to be\r\n   *        transferred by the spender\r\n   */\r\n  event Approval (\r\n    address indexed _owner, address indexed _spender, uint256 _value);\r\n}\r\n/*\r\n * Abstract Token Smart Contract.\r\n * Copyright (c) 2018 by STSS (Malta) Limited.\r\n * Contact: <tech@stasis.net>\r\n\r\n * Abstract Token Smart Contract that could be used as a base contract for\r\n * ERC-20 token contracts.\r\n */\r\ncontract AbstractToken is Token, SafeMath {\r\n  /**\r\n   * Create new Abstract Token contract.\r\n   */\r\n  function AbstractToken () public {\r\n    // Do nothing\r\n  }\r\n\r\n  /**\r\n   * Get number of tokens currently belonging to given owner.\r\n   *\r\n   * @param _owner address to get number of tokens currently belonging to the\r\n   *        owner of\r\n   * @return number of tokens currently belonging to the owner of given address\r\n   */\r\n  function balanceOf (address _owner) public view returns (uint256 balance) {\r\n    return accounts [_owner];\r\n  }\r\n\r\n  /**\r\n   * Transfer given number of tokens from message sender to given recipient.\r\n   *\r\n   * @param _to address to transfer tokens to the owner of\r\n   * @param _value number of tokens to transfer to the owner of given address\r\n   * @return true if tokens were transferred successfully, false otherwise\r\n   */\r\n  function transfer (address _to, uint256 _value)\r\n  public payable returns (bool success) {\r\n    uint256 fromBalance = accounts [msg.sender];\r\n    if (fromBalance < _value) return false;\r\n    if (_value > 0 && msg.sender != _to) {\r\n      accounts [msg.sender] = safeSub (fromBalance, _value);\r\n      accounts [_to] = safeAdd (accounts [_to], _value);\r\n    }\r\n    Transfer (msg.sender, _to, _value);\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Transfer given number of tokens from given owner to given recipient.\r\n   *\r\n   * @param _from address to transfer tokens from the owner of\r\n   * @param _to address to transfer tokens to the owner of\r\n   * @param _value number of tokens to transfer from given owner to given\r\n   *        recipient\r\n   * @return true if tokens were transferred successfully, false otherwise\r\n   */\r\n  function transferFrom (address _from, address _to, uint256 _value)\r\n  public payable returns (bool success) {\r\n    uint256 spenderAllowance = allowances [_from][msg.sender];\r\n    if (spenderAllowance < _value) return false;\r\n    uint256 fromBalance = accounts [_from];\r\n    if (fromBalance < _value) return false;\r\n\r\n    allowances [_from][msg.sender] =\r\n      safeSub (spenderAllowance, _value);\r\n\r\n    if (_value > 0 && _from != _to) {\r\n      accounts [_from] = safeSub (fromBalance, _value);\r\n      accounts [_to] = safeAdd (accounts [_to], _value);\r\n    }\r\n    Transfer (_from, _to, _value);\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Allow given spender to transfer given number of tokens from message sender.\r\n   *\r\n   * @param _spender address to allow the owner of to transfer tokens from\r\n   *        message sender\r\n   * @param _value number of tokens to allow to transfer\r\n   * @return true if token transfer was successfully approved, false otherwise\r\n   */\r\n  function approve (address _spender, uint256 _value)\r\n  public payable returns (bool success) {\r\n    allowances [msg.sender][_spender] = _value;\r\n    Approval (msg.sender, _spender, _value);\r\n\r\n    return true;\r\n  }\r\n\r\n  /**\r\n   * Tell how many tokens given spender is currently allowed to transfer from\r\n   * given owner.\r\n   *\r\n   * @param _owner address to get number of tokens allowed to be transferred\r\n   *        from the owner of\r\n   * @param _spender address to get number of tokens allowed to be transferred\r\n   *        by the owner of\r\n   * @return number of tokens given spender is currently allowed to transfer\r\n   *         from given owner\r\n   */\r\n  function allowance (address _owner, address _spender)\r\n  public view returns (uint256 remaining) {\r\n    return allowances [_owner][_spender];\r\n  }\r\n\r\n  /**\r\n   * Mapping from addresses of token holders to the numbers of tokens belonging\r\n   * to these token holders.\r\n   */\r\n  mapping (address => uint256) internal accounts;\r\n\r\n  /**\r\n   * Mapping from addresses of token holders to the mapping of addresses of\r\n   * spenders to the allowances set by these token holders to these spenders.\r\n   */\r\n  mapping (address => mapping (address => uint256)) internal allowances;\r\n}\r\n\r\n/*\r\n * EURS Token Smart Contract.\r\n * Copyright (c) 2018 by STSS (Malta) Limited.\r\n * Contact: <tech@stasis.net>\r\n */\r\n\r\ncontract EURSToken is AbstractToken {\r\n  /**\r\n   * Fee denominator (0.001%).\r\n   */\r\n  uint256 constant internal FEE_DENOMINATOR = 100000;\r\n\r\n  /**\r\n   * Maximum fee numerator (100%).\r\n   */\r\n  uint256 constant internal MAX_FEE_NUMERATOR = FEE_DENOMINATOR;\r\n\r\n  /**\r\n   * Minimum fee numerator (0%).\r\n   */\r\n  uint256 constant internal MIN_FEE_NUMERATIOR = 0;\r\n\r\n  /**\r\n   * Maximum allowed number of tokens in circulation.\r\n   */\r\n  uint256 constant internal MAX_TOKENS_COUNT =\r\n    0xffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff /\r\n    MAX_FEE_NUMERATOR;\r\n\r\n  /**\r\n   * Default transfer fee.\r\n   */\r\n  uint256 constant internal DEFAULT_FEE = 5e2;\r\n\r\n  /**\r\n   * Address flag that marks black listed addresses.\r\n   */\r\n  uint256 constant internal BLACK_LIST_FLAG = 0x01;\r\n\r\n  /**\r\n   * Address flag that marks zero fee addresses.\r\n   */\r\n  uint256 constant internal ZERO_FEE_FLAG = 0x02;\r\n\r\n  modifier delegatable {\r\n    if (delegate == address (0)) {\r\n      require (msg.value == 0); // Non payable if not delegated\r\n      _;\r\n    } else {\r\n      assembly {\r\n        // Save owner\r\n        let oldOwner := sload (owner_slot)\r\n\r\n        // Save delegate\r\n        let oldDelegate := sload (delegate_slot)\r\n\r\n        // Solidity stores address of the beginning of free memory at 0x40\r\n        let buffer := mload (0x40)\r\n\r\n        // Copy message call data into buffer\r\n        calldatacopy (buffer, 0, calldatasize)\r\n\r\n        // Lets call our delegate\r\n        let result := delegatecall (gas, oldDelegate, buffer, calldatasize, buffer, 0)\r\n\r\n        // Check, whether owner was changed\r\n        switch eq (oldOwner, sload (owner_slot))\r\n        case 1 {} // Owner was not changed, fine\r\n        default {revert (0, 0) } // Owner was changed, revert!\r\n\r\n        // Check, whether delegate was changed\r\n        switch eq (oldDelegate, sload (delegate_slot))\r\n        case 1 {} // Delegate was not changed, fine\r\n        default {revert (0, 0) } // Delegate was changed, revert!\r\n\r\n        // Copy returned value into buffer\r\n        returndatacopy (buffer, 0, returndatasize)\r\n\r\n        // Check call status\r\n        switch result\r\n        case 0 { revert (buffer, returndatasize) } // Call failed, revert!\r\n        default { return (buffer, returndatasize) } // Call succeeded, return\r\n      }\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Create EURS Token smart contract with message sender as an owner.\r\n   *\r\n   * @param _feeCollector address fees are sent to\r\n   */\r\n  function EURSToken (address _feeCollector) public {\r\n    fixedFee = DEFAULT_FEE;\r\n    minVariableFee = 0;\r\n    maxVariableFee = 0;\r\n    variableFeeNumerator = 0;\r\n\r\n    owner = msg.sender;\r\n    feeCollector = _feeCollector;\r\n  }\r\n\r\n  /**\r\n   * Delegate unrecognized functions.\r\n   */\r\n  function () public delegatable payable {\r\n    revert (); // Revert if not delegated\r\n  }\r\n\r\n  /**\r\n   * Get name of the token.\r\n   *\r\n   * @return name of the token\r\n   */\r\n  function name () public delegatable view returns (string) {\r\n    return \"STASIS EURS Token\";\r\n  }\r\n\r\n  /**\r\n   * Get symbol of the token.\r\n   *\r\n   * @return symbol of the token\r\n   */\r\n  function symbol () public delegatable view returns (string) {\r\n    return \"EURS\";\r\n  }\r\n\r\n  /**\r\n   * Get number of decimals for the token.\r\n   *\r\n   * @return number of decimals for the token\r\n   */\r\n  function decimals () public delegatable view returns (uint8) {\r\n    return 2;\r\n  }\r\n\r\n  /**\r\n   * Get total number of tokens in circulation.\r\n   *\r\n   * @return total number of tokens in circulation\r\n   */\r\n  function totalSupply () public delegatable view returns (uint256) {\r\n    return tokensCount;\r\n  }\r\n\r\n  /**\r\n   * Get number of tokens currently belonging to given owner.\r\n   *\r\n   * @param _owner address to get number of tokens currently belonging to the\r\n   *        owner of\r\n   * @return number of tokens currently belonging to the owner of given address\r\n   */\r\n  function balanceOf (address _owner)\r\n    public delegatable view returns (uint256 balance) {\r\n    return AbstractToken.balanceOf (_owner);\r\n  }\r\n\r\n  /**\r\n   * Transfer given number of tokens from message sender to given recipient.\r\n   *\r\n   * @param _to address to transfer tokens to the owner of\r\n   * @param _value number of tokens to transfer to the owner of given address\r\n   * @return true if tokens were transferred successfully, false otherwise\r\n   */\r\n  function transfer (address _to, uint256 _value)\r\n  public delegatable payable returns (bool) {\r\n    if (frozen) return false;\r\n    else if (\r\n      (addressFlags [msg.sender] | addressFlags [_to]) & BLACK_LIST_FLAG ==\r\n      BLACK_LIST_FLAG)\r\n      return false;\r\n    else {\r\n      uint256 fee =\r\n        (addressFlags [msg.sender] | addressFlags [_to]) & ZERO_FEE_FLAG == ZERO_FEE_FLAG ?\r\n          0 :\r\n          calculateFee (_value);\r\n\r\n      if (_value <= accounts [msg.sender] &&\r\n          fee <= safeSub (accounts [msg.sender], _value)) {\r\n        require (AbstractToken.transfer (_to, _value));\r\n        require (AbstractToken.transfer (feeCollector, fee));\r\n        return true;\r\n      } else return false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Transfer given number of tokens from given owner to given recipient.\r\n   *\r\n   * @param _from address to transfer tokens from the owner of\r\n   * @param _to address to transfer tokens to the owner of\r\n   * @param _value number of tokens to transfer from given owner to given\r\n   *        recipient\r\n   * @return true if tokens were transferred successfully, false otherwise\r\n   */\r\n  function transferFrom (address _from, address _to, uint256 _value)\r\n  public delegatable payable returns (bool) {\r\n    if (frozen) return false;\r\n    else if (\r\n      (addressFlags [_from] | addressFlags [_to]) & BLACK_LIST_FLAG ==\r\n      BLACK_LIST_FLAG)\r\n      return false;\r\n    else {\r\n      uint256 fee =\r\n        (addressFlags [_from] | addressFlags [_to]) & ZERO_FEE_FLAG == ZERO_FEE_FLAG ?\r\n          0 :\r\n          calculateFee (_value);\r\n\r\n      if (_value <= allowances [_from][msg.sender] &&\r\n          fee <= safeSub (allowances [_from][msg.sender], _value) &&\r\n          _value <= accounts [_from] &&\r\n          fee <= safeSub (accounts [_from], _value)) {\r\n        require (AbstractToken.transferFrom (_from, _to, _value));\r\n        require (AbstractToken.transferFrom (_from, feeCollector, fee));\r\n        return true;\r\n      } else return false;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Allow given spender to transfer given number of tokens from message sender.\r\n   *\r\n   * @param _spender address to allow the owner of to transfer tokens from\r\n   *        message sender\r\n   * @param _value number of tokens to allow to transfer\r\n   * @return true if token transfer was successfully approved, false otherwise\r\n   */\r\n  function approve (address _spender, uint256 _value)\r\n  public delegatable payable returns (bool success) {\r\n    return AbstractToken.approve (_spender, _value);\r\n  }\r\n\r\n  /**\r\n   * Tell how many tokens given spender is currently allowed to transfer from\r\n   * given owner.\r\n   *\r\n   * @param _owner address to get number of tokens allowed to be transferred\r\n   *        from the owner of\r\n   * @param _spender address to get number of tokens allowed to be transferred\r\n   *        by the owner of\r\n   * @return number of tokens given spender is currently allowed to transfer\r\n   *         from given owner\r\n   */\r\n  function allowance (address _owner, address _spender)\r\n  public delegatable view returns (uint256 remaining) {\r\n    return AbstractToken.allowance (_owner, _spender);\r\n  }\r\n\r\n  /**\r\n   * Transfer given number of token from the signed defined by digital signature\r\n   * to given recipient.\r\n   *\r\n   * @param _to address to transfer token to the owner of\r\n   * @param _value number of tokens to transfer\r\n   * @param _fee number of tokens to give to message sender\r\n   * @param _nonce nonce of the transfer\r\n   * @param _v parameter V of digital signature\r\n   * @param _r parameter R of digital signature\r\n   * @param _s parameter S of digital signature\r\n   */\r\n  function delegatedTransfer (\r\n    address _to, uint256 _value, uint256 _fee,\r\n    uint256 _nonce, uint8 _v, bytes32 _r, bytes32 _s)\r\n  public delegatable payable returns (bool) {\r\n    if (frozen) return false;\r\n    else {\r\n      address _from = ecrecover (\r\n        keccak256 (\r\n          thisAddress (), messageSenderAddress (), _to, _value, _fee, _nonce),\r\n        _v, _r, _s);\r\n\r\n      if (_nonce != nonces [_from]) return false;\r\n\r\n      if (\r\n        (addressFlags [_from] | addressFlags [_to]) & BLACK_LIST_FLAG ==\r\n        BLACK_LIST_FLAG)\r\n        return false;\r\n\r\n      uint256 fee =\r\n        (addressFlags [_from] | addressFlags [_to]) & ZERO_FEE_FLAG == ZERO_FEE_FLAG ?\r\n          0 :\r\n          calculateFee (_value);\r\n\r\n      uint256 balance = accounts [_from];\r\n      if (_value > balance) return false;\r\n      balance = safeSub (balance, _value);\r\n      if (fee > balance) return false;\r\n      balance = safeSub (balance, fee);\r\n      if (_fee > balance) return false;\r\n      balance = safeSub (balance, _fee);\r\n\r\n      nonces [_from] = _nonce + 1;\r\n\r\n      accounts [_from] = balance;\r\n      accounts [_to] = safeAdd (accounts [_to], _value);\r\n      accounts [feeCollector] = safeAdd (accounts [feeCollector], fee);\r\n      accounts [msg.sender] = safeAdd (accounts [msg.sender], _fee);\r\n\r\n      Transfer (_from, _to, _value);\r\n      Transfer (_from, feeCollector, fee);\r\n      Transfer (_from, msg.sender, _fee);\r\n\r\n      return true;\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Create tokens.\r\n   *\r\n   * @param _value number of tokens to be created.\r\n   */\r\n  function createTokens (uint256 _value)\r\n  public delegatable payable returns (bool) {\r\n    require (msg.sender == owner);\r\n\r\n    if (_value > 0) {\r\n      if (_value <= safeSub (MAX_TOKENS_COUNT, tokensCount)) {\r\n        accounts [msg.sender] = safeAdd (accounts [msg.sender], _value);\r\n        tokensCount = safeAdd (tokensCount, _value);\r\n\r\n        Transfer (address (0), msg.sender, _value);\r\n\r\n        return true;\r\n      } else return false;\r\n    } else return true;\r\n  }\r\n\r\n  /**\r\n   * Burn tokens.\r\n   *\r\n   * @param _value number of tokens to burn\r\n   */\r\n  function burnTokens (uint256 _value)\r\n  public delegatable payable returns (bool) {\r\n    require (msg.sender == owner);\r\n\r\n    if (_value > 0) {\r\n      if (_value <= accounts [msg.sender]) {\r\n        accounts [msg.sender] = safeSub (accounts [msg.sender], _value);\r\n        tokensCount = safeSub (tokensCount, _value);\r\n\r\n        Transfer (msg.sender, address (0), _value);\r\n\r\n        return true;\r\n      } else return false;\r\n    } else return true;\r\n  }\r\n\r\n  /**\r\n   * Freeze token transfers.\r\n   */\r\n  function freezeTransfers () public delegatable payable {\r\n    require (msg.sender == owner);\r\n\r\n    if (!frozen) {\r\n      frozen = true;\r\n\r\n      Freeze ();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Unfreeze token transfers.\r\n   */\r\n  function unfreezeTransfers () public delegatable payable {\r\n    require (msg.sender == owner);\r\n\r\n    if (frozen) {\r\n      frozen = false;\r\n\r\n      Unfreeze ();\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Set smart contract owner.\r\n   *\r\n   * @param _newOwner address of the new owner\r\n   */\r\n  function setOwner (address _newOwner) public {\r\n    require (msg.sender == owner);\r\n\r\n    owner = _newOwner;\r\n  }\r\n\r\n  /**\r\n   * Set fee collector.\r\n   *\r\n   * @param _newFeeCollector address of the new fee collector\r\n   */\r\n  function setFeeCollector (address _newFeeCollector)\r\n  public delegatable payable {\r\n    require (msg.sender == owner);\r\n\r\n    feeCollector = _newFeeCollector;\r\n  }\r\n\r\n  /**\r\n   * Get current nonce for token holder with given address, i.e. nonce this\r\n   * token holder should use for next delegated transfer.\r\n   *\r\n   * @param _owner address of the token holder to get nonce for\r\n   * @return current nonce for token holder with give address\r\n   */\r\n  function nonce (address _owner) public view delegatable returns (uint256) {\r\n    return nonces [_owner];\r\n  }\r\n\r\n  /**\r\n   * Set fee parameters.\r\n   *\r\n   * @param _fixedFee fixed fee in token units\r\n   * @param _minVariableFee minimum variable fee in token units\r\n   * @param _maxVariableFee maximum variable fee in token units\r\n   * @param _variableFeeNumerator variable fee numerator\r\n   */\r\n  function setFeeParameters (\r\n    uint256 _fixedFee,\r\n    uint256 _minVariableFee,\r\n    uint256 _maxVariableFee,\r\n    uint256 _variableFeeNumerator) public delegatable payable {\r\n    require (msg.sender == owner);\r\n\r\n    require (_minVariableFee <= _maxVariableFee);\r\n    require (_variableFeeNumerator <= MAX_FEE_NUMERATOR);\r\n\r\n    fixedFee = _fixedFee;\r\n    minVariableFee = _minVariableFee;\r\n    maxVariableFee = _maxVariableFee;\r\n    variableFeeNumerator = _variableFeeNumerator;\r\n\r\n    FeeChange (\r\n      _fixedFee, _minVariableFee, _maxVariableFee, _variableFeeNumerator);\r\n  }\r\n\r\n  /**\r\n   * Get fee parameters.\r\n   *\r\n   * @return fee parameters\r\n   */\r\n  function getFeeParameters () public delegatable view returns (\r\n    uint256 _fixedFee,\r\n    uint256 _minVariableFee,\r\n    uint256 _maxVariableFee,\r\n    uint256 _variableFeeNumnerator) {\r\n    _fixedFee = fixedFee;\r\n    _minVariableFee = minVariableFee;\r\n    _maxVariableFee = maxVariableFee;\r\n    _variableFeeNumnerator = variableFeeNumerator;\r\n  }\r\n\r\n  /**\r\n   * Calculate fee for transfer of given number of tokens.\r\n   *\r\n   * @param _amount transfer amount to calculate fee for\r\n   * @return fee for transfer of given amount\r\n   */\r\n  function calculateFee (uint256 _amount)\r\n    public delegatable view returns (uint256 _fee) {\r\n    require (_amount <= MAX_TOKENS_COUNT);\r\n\r\n    _fee = safeMul (_amount, variableFeeNumerator) / FEE_DENOMINATOR;\r\n    if (_fee < minVariableFee) _fee = minVariableFee;\r\n    if (_fee > maxVariableFee) _fee = maxVariableFee;\r\n    _fee = safeAdd (_fee, fixedFee);\r\n  }\r\n\r\n  /**\r\n   * Set flags for given address.\r\n   *\r\n   * @param _address address to set flags for\r\n   * @param _flags flags to set\r\n   */\r\n  function setFlags (address _address, uint256 _flags)\r\n  public delegatable payable {\r\n    require (msg.sender == owner);\r\n\r\n    addressFlags [_address] = _flags;\r\n  }\r\n\r\n  /**\r\n   * Get flags for given address.\r\n   *\r\n   * @param _address address to get flags for\r\n   * @return flags for given address\r\n   */\r\n  function flags (address _address) public delegatable view returns (uint256) {\r\n    return addressFlags [_address];\r\n  }\r\n\r\n  /**\r\n   * Set address of smart contract to delegate execution of delegatable methods\r\n   * to.\r\n   *\r\n   * @param _delegate address of smart contract to delegate execution of\r\n   * delegatable methods to, or zero to not delegate delegatable methods\r\n   * execution.\r\n   */\r\n  function setDelegate (address _delegate) public {\r\n    require (msg.sender == owner);\r\n\r\n    if (delegate != _delegate) {\r\n      delegate = _delegate;\r\n      Delegation (delegate);\r\n    }\r\n  }\r\n\r\n  /**\r\n   * Get address of this smart contract.\r\n   *\r\n   * @return address of this smart contract\r\n   */\r\n  function thisAddress () internal view returns (address) {\r\n    return this;\r\n  }\r\n\r\n  /**\r\n   * Get address of message sender.\r\n   *\r\n   * @return address of this smart contract\r\n   */\r\n  function messageSenderAddress () internal view returns (address) {\r\n    return msg.sender;\r\n  }\r\n\r\n  /**\r\n   * Owner of the smart contract.\r\n   */\r\n  address internal owner;\r\n\r\n  /**\r\n   * Address where fees are sent to.\r\n   */\r\n  address internal feeCollector;\r\n\r\n  /**\r\n   * Number of tokens in circulation.\r\n   */\r\n  uint256 internal tokensCount;\r\n\r\n  /**\r\n   * Whether token transfers are currently frozen.\r\n   */\r\n  bool internal frozen;\r\n\r\n  /**\r\n   * Mapping from sender's address to the next delegated transfer nonce.\r\n   */\r\n  mapping (address => uint256) internal nonces;\r\n\r\n  /**\r\n   * Fixed fee amount in token units.\r\n   */\r\n  uint256 internal fixedFee;\r\n\r\n  /**\r\n   * Minimum variable fee in token units.\r\n   */\r\n  uint256 internal minVariableFee;\r\n\r\n  /**\r\n   * Maximum variable fee in token units.\r\n   */\r\n  uint256 internal maxVariableFee;\r\n\r\n  /**\r\n   * Variable fee numerator.\r\n   */\r\n  uint256 internal variableFeeNumerator;\r\n\r\n  /**\r\n   * Maps address to its flags.\r\n   */\r\n  mapping (address => uint256) internal addressFlags;\r\n\r\n  /**\r\n   * Address of smart contract to delegate execution of delegatable methods to,\r\n   * or zero to not delegate delegatable methods execution.\r\n   */\r\n  address internal delegate;\r\n\r\n  /**\r\n   * Logged when token transfers were frozen.\r\n   */\r\n  event Freeze ();\r\n\r\n  /**\r\n   * Logged when token transfers were unfrozen.\r\n   */\r\n  event Unfreeze ();\r\n\r\n  /**\r\n   * Logged when fee parameters were changed.\r\n   *\r\n   * @param fixedFee fixed fee in token units\r\n   * @param minVariableFee minimum variable fee in token units\r\n   * @param maxVariableFee maximum variable fee in token units\r\n   * @param variableFeeNumerator variable fee numerator\r\n   */\r\n  event FeeChange (\r\n    uint256 fixedFee,\r\n    uint256 minVariableFee,\r\n    uint256 maxVariableFee,\r\n    uint256 variableFeeNumerator);\r\n\r\n  /**\r\n   * Logged when address of smart contract execution of delegatable methods is\r\n   * delegated to was changed.\r\n   *\r\n   * @param delegate new address of smart contract execution of delegatable\r\n   * methods is delegated to or zero if execution of delegatable methods is\r\n   * oot delegated.\r\n   */\r\n  event Delegation (address delegate);\r\n}","deployed_bytecode":"0x6060604052600436106101325763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630150246081146101a657806306fdde03146101ae578063095ea7b31461023857806313af40351461026357806318160ddd1461028257806323b872dd146102a7578063313ce567146102c457806331c420d4146102ed5780634722b4a5146102f55780636d1b229d1461033357806370a082311461033e57806370ae92d21461035d5780637e1f2bb81461037c57806395d89b411461038757806399a5d7471461039a5780639fef0c01146103b0578063a42dce80146103cf578063a9059cbb146103e3578063addd9cef146103fa578063c97e848014610411578063ca5eb5e11461043a578063d5bf2dbe14610459578063dd62ed3e1461046d575b600c54600160a060020a0316151561015457341561014f57600080fd5b600080fd5b600254600c5460405136600082376000813683855af460025484146001811461017c57600080fd5b50600c5483146001811461018f57600080fd5b503d6000833e8080156101a0573d83f35b3d83fd5b005b6101a4610492565b34156101b957600080fd5b6101c1610512565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101fd5780820151838201526020016101e5565b50505050905090810190601f16801561022a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024f600160a060020a0360043516602435610571565b604051901515815260200160405180910390f35b341561026e57600080fd5b6101a4600160a060020a03600435166105a4565b341561028d57600080fd5b6102956105ee565b60405190815260200160405180910390f35b61024f600160a060020a0360043581169060243516604435610617565b34156102cf57600080fd5b6102d76107d3565b60405160ff909116815260200160405180910390f35b6101a46107fb565b341561030057600080fd5b610308610879565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61024f6004356108b6565b341561034957600080fd5b610295600160a060020a03600435166109ab565b341561036857600080fd5b610295600160a060020a03600435166109db565b61024f600435610a1a565b341561039257600080fd5b6101c1610af8565b34156103a557600080fd5b610295600435610b58565b34156103bb57600080fd5b610295600160a060020a0360043516610be9565b6101a4600160a060020a0360043516610c28565b61024f600160a060020a0360043516602435610c8c565b6101a4600160a060020a0360043516602435610dd8565b61024f600160a060020a036004351660243560443560643560ff6084351660a43560c435610e2d565b341561044557600080fd5b6101a4600160a060020a03600435166111c2565b6101a4600435602435604435606435611261565b341561047857600080fd5b610295600160a060020a036004358116906024351661131f565b600c54600160a060020a031615156101545734156104af57600080fd5b60025433600160a060020a039081169116146104ca57600080fd5b60055460ff161515610510576005805460ff191660011790557f615acbaede366d76a8b8cb2a9ada6a71495f0786513d71aa97aaf0c3910b78de60405160405180910390a15b565b61051a611692565b600c54600160a060020a0316151561015457341561053757600080fd5b60408051908101604052601181527f535441534953204555525320546f6b656e000000000000000000000000000000602082015290505b90565b600c54600090600160a060020a0316151561015457341561059157600080fd5b61059b8383611349565b90505b92915050565b60025433600160a060020a039081169116146105bf57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c54600090600160a060020a0316151561015457341561060e57600080fd5b5060045461056e565b600c546000908190600160a060020a0316151561015457341561063957600080fd5b60055460ff161561064d57600091506107cb565b600160a060020a038085166000908152600b6020526040808220549288168252902054176001908116141561068557600091506107cb565b600160a060020a038085166000908152600b6020526040808220549288168252902054176002908116146106c1576106bc83610b58565b6106c4565b60005b600160a060020a0380871660009081526001602090815260408083203390941683529290522054909150831180159061072d5750600160a060020a038086166000908152600160209081526040808320339094168352929052205461072990846113b5565b8111155b80156107515750600160a060020a0385166000908152602081905260409020548311155b801561077f5750600160a060020a03851660009081526020819052604090205461077b90846113b5565b8111155b156107c65761078f8585856113c7565b151561079a57600080fd5b6003546107b2908690600160a060020a0316836113c7565b15156107bd57600080fd5b600191506107cb565b600091505b509392505050565b600c54600090600160a060020a031615156101545734156107f357600080fd5b50600261056e565b600c54600160a060020a0316151561015457341561081857600080fd5b60025433600160a060020a0390811691161461083357600080fd5b60055460ff1615610510576005805460ff191690557f2f05ba71d0df11bf5fa562a6569d70c4f80da84284badbe015ce1456063d0ded60405160405180910390a1610510565b600c54600090819081908190600160a060020a0316151561015457341561089f57600080fd5b5050600754600854600954600a5492959194509250565b600c54600090600160a060020a031615156101545734156108d657600080fd5b60025433600160a060020a039081169116146108f157600080fd5b60008211156109a257600160a060020a033316600090815260208190526040902054821161099a57600160a060020a03331660009081526020819052604090205461093c90836113b5565b600160a060020a03331660009081526020819052604090205560045461096290836113b5565b600455600033600160a060020a03166000805160206116a58339815191528460405190815260200160405180910390a35060016109a6565b5060006109a6565b5060015b919050565b600c54600090600160a060020a031615156101545734156109cb57600080fd5b6109d48261151e565b90506109a6565b600c54600090600160a060020a031615156101545734156109fb57600080fd5b50600160a060020a0381166000908152600660205260409020546109a6565b600c54600090600160a060020a03161515610154573415610a3a57600080fd5b60025433600160a060020a03908116911614610a5557600080fd5b60008211156109a257610a71620186a0600019046004546113b5565b821161099a57600160a060020a033316600090815260208190526040902054610a9a9083611539565b600160a060020a033316600090815260208190526040902055600454610ac09083611539565b600455600160a060020a03331660006000805160206116a58339815191528460405190815260200160405180910390a35060016109a6565b610b00611692565b600c54600160a060020a03161515610154573415610b1d57600080fd5b60408051908101604052600481527f45555253000000000000000000000000000000000000000000000000000000006020820152905061056e565b600c54600090600160a060020a03161515610154573415610b7857600080fd5b7da7c5ac471b4784230fcf80dc33721d53cddd6e04c059210385c67dfe32a0821115610ba357600080fd5b620186a0610bb383600a5461154f565b811515610bbc57fe5b049050600854811015610bce57506008545b600954811115610bdd57506009545b6109d481600754611539565b600c54600090600160a060020a03161515610154573415610c0957600080fd5b50600160a060020a0381166000908152600b60205260409020546109a6565b600c54600160a060020a03161515610154573415610c4557600080fd5b60025433600160a060020a03908116911614610c6057600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600c546000908190600160a060020a03161515610154573415610cae57600080fd5b60055460ff1615610cc25760009150610dd1565b600160a060020a038085166000908152600b6020526040808220543390931682529020541760019081161415610cfb5760009150610dd1565b600160a060020a038085166000908152600b60205260408082205433909316825290205417600290811614610d3857610d3383610b58565b610d3b565b60005b600160a060020a0333166000908152602081905260409020549091508311801590610d885750600160a060020a033316600090815260208190526040902054610d8490846113b5565b8111155b15610dcc57610d97848461157c565b1515610da257600080fd5b600354610db890600160a060020a03168261157c565b1515610dc357600080fd5b60019150610dd1565b600091505b5092915050565b600c54600160a060020a03161515610154573415610df557600080fd5b60025433600160a060020a03908116911614610e1057600080fd5b600160a060020a03919091166000908152600b6020526040902055565b600c54600090819081908190600160a060020a03161515610154573415610e5357600080fd5b60055460ff1615610e6757600093506111b4565b6001610e7161165f565b610e79611663565b8d8d8d8d6040516c01000000000000000000000000600160a060020a039788168102825295871686026014820152939095169093026028830152603c820152605c810191909152607c810191909152609c0160405180910390208888886040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515610f2857600080fd5b505060206040510351600160a060020a0381166000908152600660205260409020549093508814610f5c57600093506111b4565b600160a060020a03808c166000908152600b60205260408082205492861682529020541760019081161415610f9457600093506111b4565b600160a060020a03808c166000908152600b602052604080822054928616825290205417600290811614610fd057610fcb8a610b58565b610fd3565b60005b600160a060020a0384166000908152602081905260409020549092509050808a111561100257600093506111b4565b61100c818b6113b5565b90508082111561101f57600093506111b4565b61102981836113b5565b90508089111561103c57600093506111b4565b611046818a6113b5565b600160a060020a03808516600090815260066020908152604080832060018e01905590829052808220849055918e1681522054909150611086908b611539565b600160a060020a03808d1660009081526020819052604080822093909355600354909116815220546110b89083611539565b600354600160a060020a039081166000908152602081905260408082209390935533909116815220546110eb908a611539565b60008033600160a060020a0316600160a060020a03168152602001908152602001600020819055508a600160a060020a031683600160a060020a03166000805160206116a58339815191528c60405190815260200160405180910390a3600354600160a060020a039081169084166000805160206116a58339815191528460405190815260200160405180910390a333600160a060020a031683600160a060020a03166000805160206116a58339815191528b60405190815260200160405180910390a3600193505b505050979650505050505050565b60025433600160a060020a039081169116146111dd57600080fd5b600c54600160a060020a03828116911614610c8957600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290557f600005b3559a025151f4a40f36d9939d94cf5194016895d4ef6362b211e4c3b59116604051600160a060020a03909116815260200160405180910390a150565b600c54600160a060020a0316151561015457341561127e57600080fd5b60025433600160a060020a0390811691161461129957600080fd5b818311156112a657600080fd5b620186a08111156112b657600080fd5b600784905560088390556009829055600a8190557f650bf5314bb5924368ffebaf7dffcfaa4a0f99c2ab08264c26bf0547f8c459e9848484846040518085815260200184815260200183815260200182815260200194505050505060405180910390a150505050565b600c54600090600160a060020a0316151561015457341561133f57600080fd5b61059b8383611667565b600160a060020a03338116600081815260016020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b6000818310156113c157fe5b50900390565b600160a060020a0380841660009081526001602090815260408083203390941683529290529081205481838210156114025760009250611515565b50600160a060020a0385166000908152602081905260409020548381101561142d5760009250611515565b61143782856113b5565b600160a060020a0380881660009081526001602090815260408083203390941683529290529081209190915584118015611483575084600160a060020a031686600160a060020a031614155b156114db5761149281856113b5565b600160a060020a0380881660009081526020819052604080822093909355908716815220546114c19085611539565b600160a060020a0386166000908152602081905260409020555b84600160a060020a031686600160a060020a03166000805160206116a58339815191528660405190815260200160405180910390a3600192505b50509392505050565b600160a060020a031660009081526020819052604090205490565b600060001982900383111561154a57fe5b500190565b60008115156115605750600061059e565b8160001981151561156d57fe5b0483111561157757fe5b500290565b600160a060020a033316600090815260208190526040812054828110156115a65760009150610dd1565b6000831180156115c8575083600160a060020a031633600160a060020a031614155b15611620576115d781846113b5565b600160a060020a0333811660009081526020819052604080822093909355908616815220546116069084611539565b600160a060020a0385166000908152602081905260409020555b83600160a060020a031633600160a060020a03166000805160206116a58339815191528560405190815260200160405180910390a35060019392505050565b3090565b3390565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b602060405190810160405260008152905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582027e03fc3f414023826a7fb6fd321bb5c5ba610cbb273a99d307095a1b3d0b8110029","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"byzantium","libraries":{},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"optimization_runs":200,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/partial_match/1/0xdB25f211AB05b1c97D595516F45794528a807ad8/","decoded_constructor_args":[["0x70250fcFEf983C9b912c8EEFB7021B4b7baE836e",{"name":"_feeCollector","type":"address"}]],"compiler_version":"0.4.21+commit.dfe3193c","is_verified_via_verifier_alliance":false,"verified_at":"2023-11-18T18:39:17.484118Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x6060604052341561000f57600080fd5b604051602080611764833981016040528080516101f4600755600060088190556009819055600a5560028054600160a060020a03338116600160a060020a0319928316179092556003805492909316911617905550506116f0806100746000396000f3006060604052600436106101325763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630150246081146101a657806306fdde03146101ae578063095ea7b31461023857806313af40351461026357806318160ddd1461028257806323b872dd146102a7578063313ce567146102c457806331c420d4146102ed5780634722b4a5146102f55780636d1b229d1461033357806370a082311461033e57806370ae92d21461035d5780637e1f2bb81461037c57806395d89b411461038757806399a5d7471461039a5780639fef0c01146103b0578063a42dce80146103cf578063a9059cbb146103e3578063addd9cef146103fa578063c97e848014610411578063ca5eb5e11461043a578063d5bf2dbe14610459578063dd62ed3e1461046d575b600c54600160a060020a0316151561015457341561014f57600080fd5b600080fd5b600254600c5460405136600082376000813683855af460025484146001811461017c57600080fd5b50600c5483146001811461018f57600080fd5b503d6000833e8080156101a0573d83f35b3d83fd5b005b6101a4610492565b34156101b957600080fd5b6101c1610512565b60405160208082528190810183818151815260200191508051906020019080838360005b838110156101fd5780820151838201526020016101e5565b50505050905090810190601f16801561022a5780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b61024f600160a060020a0360043516602435610571565b604051901515815260200160405180910390f35b341561026e57600080fd5b6101a4600160a060020a03600435166105a4565b341561028d57600080fd5b6102956105ee565b60405190815260200160405180910390f35b61024f600160a060020a0360043581169060243516604435610617565b34156102cf57600080fd5b6102d76107d3565b60405160ff909116815260200160405180910390f35b6101a46107fb565b341561030057600080fd5b610308610879565b6040518085815260200184815260200183815260200182815260200194505050505060405180910390f35b61024f6004356108b6565b341561034957600080fd5b610295600160a060020a03600435166109ab565b341561036857600080fd5b610295600160a060020a03600435166109db565b61024f600435610a1a565b341561039257600080fd5b6101c1610af8565b34156103a557600080fd5b610295600435610b58565b34156103bb57600080fd5b610295600160a060020a0360043516610be9565b6101a4600160a060020a0360043516610c28565b61024f600160a060020a0360043516602435610c8c565b6101a4600160a060020a0360043516602435610dd8565b61024f600160a060020a036004351660243560443560643560ff6084351660a43560c435610e2d565b341561044557600080fd5b6101a4600160a060020a03600435166111c2565b6101a4600435602435604435606435611261565b341561047857600080fd5b610295600160a060020a036004358116906024351661131f565b600c54600160a060020a031615156101545734156104af57600080fd5b60025433600160a060020a039081169116146104ca57600080fd5b60055460ff161515610510576005805460ff191660011790557f615acbaede366d76a8b8cb2a9ada6a71495f0786513d71aa97aaf0c3910b78de60405160405180910390a15b565b61051a611692565b600c54600160a060020a0316151561015457341561053757600080fd5b60408051908101604052601181527f535441534953204555525320546f6b656e000000000000000000000000000000602082015290505b90565b600c54600090600160a060020a0316151561015457341561059157600080fd5b61059b8383611349565b90505b92915050565b60025433600160a060020a039081169116146105bf57600080fd5b6002805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0392909216919091179055565b600c54600090600160a060020a0316151561015457341561060e57600080fd5b5060045461056e565b600c546000908190600160a060020a0316151561015457341561063957600080fd5b60055460ff161561064d57600091506107cb565b600160a060020a038085166000908152600b6020526040808220549288168252902054176001908116141561068557600091506107cb565b600160a060020a038085166000908152600b6020526040808220549288168252902054176002908116146106c1576106bc83610b58565b6106c4565b60005b600160a060020a0380871660009081526001602090815260408083203390941683529290522054909150831180159061072d5750600160a060020a038086166000908152600160209081526040808320339094168352929052205461072990846113b5565b8111155b80156107515750600160a060020a0385166000908152602081905260409020548311155b801561077f5750600160a060020a03851660009081526020819052604090205461077b90846113b5565b8111155b156107c65761078f8585856113c7565b151561079a57600080fd5b6003546107b2908690600160a060020a0316836113c7565b15156107bd57600080fd5b600191506107cb565b600091505b509392505050565b600c54600090600160a060020a031615156101545734156107f357600080fd5b50600261056e565b600c54600160a060020a0316151561015457341561081857600080fd5b60025433600160a060020a0390811691161461083357600080fd5b60055460ff1615610510576005805460ff191690557f2f05ba71d0df11bf5fa562a6569d70c4f80da84284badbe015ce1456063d0ded60405160405180910390a1610510565b600c54600090819081908190600160a060020a0316151561015457341561089f57600080fd5b5050600754600854600954600a5492959194509250565b600c54600090600160a060020a031615156101545734156108d657600080fd5b60025433600160a060020a039081169116146108f157600080fd5b60008211156109a257600160a060020a033316600090815260208190526040902054821161099a57600160a060020a03331660009081526020819052604090205461093c90836113b5565b600160a060020a03331660009081526020819052604090205560045461096290836113b5565b600455600033600160a060020a03166000805160206116a58339815191528460405190815260200160405180910390a35060016109a6565b5060006109a6565b5060015b919050565b600c54600090600160a060020a031615156101545734156109cb57600080fd5b6109d48261151e565b90506109a6565b600c54600090600160a060020a031615156101545734156109fb57600080fd5b50600160a060020a0381166000908152600660205260409020546109a6565b600c54600090600160a060020a03161515610154573415610a3a57600080fd5b60025433600160a060020a03908116911614610a5557600080fd5b60008211156109a257610a71620186a0600019046004546113b5565b821161099a57600160a060020a033316600090815260208190526040902054610a9a9083611539565b600160a060020a033316600090815260208190526040902055600454610ac09083611539565b600455600160a060020a03331660006000805160206116a58339815191528460405190815260200160405180910390a35060016109a6565b610b00611692565b600c54600160a060020a03161515610154573415610b1d57600080fd5b60408051908101604052600481527f45555253000000000000000000000000000000000000000000000000000000006020820152905061056e565b600c54600090600160a060020a03161515610154573415610b7857600080fd5b7da7c5ac471b4784230fcf80dc33721d53cddd6e04c059210385c67dfe32a0821115610ba357600080fd5b620186a0610bb383600a5461154f565b811515610bbc57fe5b049050600854811015610bce57506008545b600954811115610bdd57506009545b6109d481600754611539565b600c54600090600160a060020a03161515610154573415610c0957600080fd5b50600160a060020a0381166000908152600b60205260409020546109a6565b600c54600160a060020a03161515610154573415610c4557600080fd5b60025433600160a060020a03908116911614610c6057600080fd5b6003805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383161790555b50565b600c546000908190600160a060020a03161515610154573415610cae57600080fd5b60055460ff1615610cc25760009150610dd1565b600160a060020a038085166000908152600b6020526040808220543390931682529020541760019081161415610cfb5760009150610dd1565b600160a060020a038085166000908152600b60205260408082205433909316825290205417600290811614610d3857610d3383610b58565b610d3b565b60005b600160a060020a0333166000908152602081905260409020549091508311801590610d885750600160a060020a033316600090815260208190526040902054610d8490846113b5565b8111155b15610dcc57610d97848461157c565b1515610da257600080fd5b600354610db890600160a060020a03168261157c565b1515610dc357600080fd5b60019150610dd1565b600091505b5092915050565b600c54600160a060020a03161515610154573415610df557600080fd5b60025433600160a060020a03908116911614610e1057600080fd5b600160a060020a03919091166000908152600b6020526040902055565b600c54600090819081908190600160a060020a03161515610154573415610e5357600080fd5b60055460ff1615610e6757600093506111b4565b6001610e7161165f565b610e79611663565b8d8d8d8d6040516c01000000000000000000000000600160a060020a039788168102825295871686026014820152939095169093026028830152603c820152605c810191909152607c810191909152609c0160405180910390208888886040516000815260200160405260405193845260ff9092166020808501919091526040808501929092526060840192909252608090920191516020810390808403906000865af11515610f2857600080fd5b505060206040510351600160a060020a0381166000908152600660205260409020549093508814610f5c57600093506111b4565b600160a060020a03808c166000908152600b60205260408082205492861682529020541760019081161415610f9457600093506111b4565b600160a060020a03808c166000908152600b602052604080822054928616825290205417600290811614610fd057610fcb8a610b58565b610fd3565b60005b600160a060020a0384166000908152602081905260409020549092509050808a111561100257600093506111b4565b61100c818b6113b5565b90508082111561101f57600093506111b4565b61102981836113b5565b90508089111561103c57600093506111b4565b611046818a6113b5565b600160a060020a03808516600090815260066020908152604080832060018e01905590829052808220849055918e1681522054909150611086908b611539565b600160a060020a03808d1660009081526020819052604080822093909355600354909116815220546110b89083611539565b600354600160a060020a039081166000908152602081905260408082209390935533909116815220546110eb908a611539565b60008033600160a060020a0316600160a060020a03168152602001908152602001600020819055508a600160a060020a031683600160a060020a03166000805160206116a58339815191528c60405190815260200160405180910390a3600354600160a060020a039081169084166000805160206116a58339815191528460405190815260200160405180910390a333600160a060020a031683600160a060020a03166000805160206116a58339815191528b60405190815260200160405180910390a3600193505b505050979650505050505050565b60025433600160a060020a039081169116146111dd57600080fd5b600c54600160a060020a03828116911614610c8957600c805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a0383811691909117918290557f600005b3559a025151f4a40f36d9939d94cf5194016895d4ef6362b211e4c3b59116604051600160a060020a03909116815260200160405180910390a150565b600c54600160a060020a0316151561015457341561127e57600080fd5b60025433600160a060020a0390811691161461129957600080fd5b818311156112a657600080fd5b620186a08111156112b657600080fd5b600784905560088390556009829055600a8190557f650bf5314bb5924368ffebaf7dffcfaa4a0f99c2ab08264c26bf0547f8c459e9848484846040518085815260200184815260200183815260200182815260200194505050505060405180910390a150505050565b600c54600090600160a060020a0316151561015457341561133f57600080fd5b61059b8383611667565b600160a060020a03338116600081815260016020908152604080832094871680845294909152808220859055909291907f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b9259085905190815260200160405180910390a350600192915050565b6000818310156113c157fe5b50900390565b600160a060020a0380841660009081526001602090815260408083203390941683529290529081205481838210156114025760009250611515565b50600160a060020a0385166000908152602081905260409020548381101561142d5760009250611515565b61143782856113b5565b600160a060020a0380881660009081526001602090815260408083203390941683529290529081209190915584118015611483575084600160a060020a031686600160a060020a031614155b156114db5761149281856113b5565b600160a060020a0380881660009081526020819052604080822093909355908716815220546114c19085611539565b600160a060020a0386166000908152602081905260409020555b84600160a060020a031686600160a060020a03166000805160206116a58339815191528660405190815260200160405180910390a3600192505b50509392505050565b600160a060020a031660009081526020819052604090205490565b600060001982900383111561154a57fe5b500190565b60008115156115605750600061059e565b8160001981151561156d57fe5b0483111561157757fe5b500290565b600160a060020a033316600090815260208190526040812054828110156115a65760009150610dd1565b6000831180156115c8575083600160a060020a031633600160a060020a031614155b15611620576115d781846113b5565b600160a060020a0333811660009081526020819052604080822093909355908616815220546116069084611539565b600160a060020a0385166000908152602081905260409020555b83600160a060020a031633600160a060020a03166000805160206116a58339815191528560405190815260200160405180910390a35060019392505050565b3090565b3390565b600160a060020a03918216600090815260016020908152604080832093909416825291909152205490565b602060405190810160405260008152905600ddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa165627a7a7230582027e03fc3f414023826a7fb6fd321bb5c5ba610cbb273a99d307095a1b3d0b811002900000000000000000000000070250fcfef983c9b912c8eefb7021b4b7bae836e","name":"EURSToken","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"byzantium","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[],"certified":false,"conflicting_implementations":null,"abi":[{"constant":false,"inputs":[],"name":"freezeTransfers","outputs":[],"payable":true,"stateMutability":"payable","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":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"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":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"decimals","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[],"name":"unfreezeTransfers","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getFeeParameters","outputs":[{"name":"_fixedFee","type":"uint256"},{"name":"_minVariableFee","type":"uint256"},{"name":"_maxVariableFee","type":"uint256"},{"name":"_variableFeeNumnerator","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"burnTokens","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"name":"balance","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"}],"name":"nonce","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_value","type":"uint256"}],"name":"createTokens","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"symbol","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_amount","type":"uint256"}],"name":"calculateFee","outputs":[{"name":"_fee","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_address","type":"address"}],"name":"flags","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_newFeeCollector","type":"address"}],"name":"setFeeCollector","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_address","type":"address"},{"name":"_flags","type":"uint256"}],"name":"setFlags","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_to","type":"address"},{"name":"_value","type":"uint256"},{"name":"_fee","type":"uint256"},{"name":"_nonce","type":"uint256"},{"name":"_v","type":"uint8"},{"name":"_r","type":"bytes32"},{"name":"_s","type":"bytes32"}],"name":"delegatedTransfer","outputs":[{"name":"","type":"bool"}],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"_delegate","type":"address"}],"name":"setDelegate","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_fixedFee","type":"uint256"},{"name":"_minVariableFee","type":"uint256"},{"name":"_maxVariableFee","type":"uint256"},{"name":"_variableFeeNumerator","type":"uint256"}],"name":"setFeeParameters","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[{"name":"_owner","type":"address"},{"name":"_spender","type":"address"}],"name":"allowance","outputs":[{"name":"remaining","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"inputs":[{"name":"_feeCollector","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"payable":true,"stateMutability":"payable","type":"fallback"},{"anonymous":false,"inputs":[],"name":"Freeze","type":"event"},{"anonymous":false,"inputs":[],"name":"Unfreeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"fixedFee","type":"uint256"},{"indexed":false,"name":"minVariableFee","type":"uint256"},{"indexed":false,"name":"maxVariableFee","type":"uint256"},{"indexed":false,"name":"variableFeeNumerator","type":"uint256"}],"name":"FeeChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"name":"delegate","type":"address"}],"name":"Delegation","type":"event"},{"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"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":"00000000000000000000000070250fcfef983c9b912c8eefb7021b4b7bae836e"}