{"file_path":"EURSToken.sol","creation_status":"success","source_code":"// SPDX-License-Identifier: UNLICENSED\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\npragma solidity ^0.8.0;\r\n\r\nimport \"./AbstractToken.sol\";\r\n\r\n/**\r\n * EURS Token Smart Contract: EIP-20 compatible token smart contract that\r\n * manages EURS tokens.\r\n */\r\ncontract EURSToken is AbstractToken {\r\n  /**\r\n   * @dev Fee denominator (0.001%).\r\n   */\r\n  uint256 constant internal FEE_DENOMINATOR = 100000;\r\n\r\n  /**\r\n   * @dev Maximum fee numerator (100%).\r\n   */\r\n  uint256 constant internal MAX_FEE_NUMERATOR = FEE_DENOMINATOR;\r\n\r\n  /**\r\n   * @dev 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   * @dev Address flag that marks black listed addresses.\r\n   */\r\n  uint256 constant internal BLACK_LIST_FLAG = 0x01;\r\n\r\n  /**\r\n   * Create EURS Token smart contract with message sender as an owner.\r\n   */\r\n  constructor () {\r\n    owner = msg.sender;\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 pure returns (string memory) {\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 pure returns (string memory) {\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 pure 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 override 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 balance number of tokens currently belonging to the owner of given address\r\n   */\r\n  function balanceOf (address _owner)\r\n    public override 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 override virtual 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      if (_value <= accounts [msg.sender]) {\r\n        require (AbstractToken.transfer (_to, _value));\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 override virtual 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      if (_value <= allowances [_from][msg.sender] &&\r\n          _value <= accounts [_from]) {\r\n        require (AbstractToken.transferFrom (_from, _to, _value));\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 success true if token transfer was successfully approved, false otherwise\r\n   */\r\n  function approve (address _spender, uint256 _value)\r\n  public override 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 remaining 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 override 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 virtual returns (bool) {\r\n    if (frozen) return false;\r\n    else {\r\n      address _from = ecrecover (\r\n        keccak256 (\r\n          abi.encodePacked (\r\n            thisAddress (), messageSenderAddress (), _to, _value, _fee, _nonce)),\r\n        _v, _r, _s);\r\n\r\n      if (_from == address (0)) return false;\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 balance = accounts [_from];\r\n      if (_value > balance) return false;\r\n      balance = balance - _value;\r\n      if (_fee > balance) return false;\r\n      balance = balance - _fee;\r\n\r\n      nonces [_from] = _nonce + 1;\r\n\r\n      accounts [_from] = balance;\r\n      accounts [_to] = accounts [_to] + _value;\r\n      accounts [msg.sender] = accounts [msg.sender] + _fee;\r\n\r\n      Transfer (_from, _to, _value);\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 virtual returns (bool) {\r\n    require (msg.sender == owner);\r\n\r\n    if (_value > 0) {\r\n      if (_value <= MAX_TOKENS_COUNT - tokensCount) {\r\n        accounts [msg.sender] = accounts [msg.sender] + _value;\r\n        tokensCount = 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 virtual 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] = accounts [msg.sender] - _value;\r\n        tokensCount = 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 {\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 {\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   * 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 returns (uint256) {\r\n    return nonces [_owner];\r\n  }\r\n\r\n  /**\r\n   * Get fee parameters.\r\n   *\r\n   * @return _fixedFee fixed fee\r\n   * @return _minVariableFee minimum variable fee\r\n   * @return _maxVariableFee maximum variable fee\r\n   * @return _variableFeeNumnerator variable fee numerator\r\n   */\r\n  function getFeeParameters () public pure returns (\r\n    uint256 _fixedFee,\r\n    uint256 _minVariableFee,\r\n    uint256 _maxVariableFee,\r\n    uint256 _variableFeeNumnerator) {\r\n    _fixedFee = 0;\r\n    _minVariableFee = 0;\r\n    _maxVariableFee = 0;\r\n    _variableFeeNumnerator = 0;\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 fee for transfer of given amount\r\n   */\r\n  function calculateFee (uint256 _amount)\r\n    public pure returns (uint256 _fee) {\r\n    require (_amount <= MAX_TOKENS_COUNT);\r\n\r\n    _fee = 0;\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 {\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 view returns (uint256) {\r\n    return addressFlags [_address];\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 virtual view returns (address) {\r\n    return address(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 virtual view returns (address) {\r\n    return msg.sender;\r\n  }\r\n\r\n  /**\r\n   * @dev Owner of the smart contract.\r\n   */\r\n  address internal owner;\r\n\r\n  /**\r\n   * @dev Address where fees are sent to.  Not used anymore.\r\n   */\r\n  address internal feeCollector;\r\n\r\n  /**\r\n   * @dev Number of tokens in circulation.\r\n   */\r\n  uint256 internal tokensCount;\r\n\r\n  /**\r\n   * @dev Whether token transfers are currently frozen.\r\n   */\r\n  bool internal frozen;\r\n\r\n  /**\r\n   * @dev 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   * @dev Fixed fee amount in token units.  Not used anymore.\r\n   */\r\n  uint256 internal fixedFee;\r\n\r\n  /**\r\n   * @dev Minimum variable fee in token units.  Not used anymore.\r\n   */\r\n  uint256 internal minVariableFee;\r\n\r\n  /**\r\n   * @dev Maximum variable fee in token units.  Not used anymore.\r\n   */\r\n  uint256 internal maxVariableFee;\r\n\r\n  /**\r\n   * @dev Variable fee numerator.  Not used anymore.\r\n   */\r\n  uint256 internal variableFeeNumerator;\r\n\r\n  /**\r\n   * @dev Maps address to its flags.\r\n   */\r\n  mapping (address => uint256) internal addressFlags;\r\n\r\n  /**\r\n   * @dev Address of smart contract to delegate execution of delegatable methods to,\r\n   * or zero to not delegate delegatable methods execution.  Not used in upgrade.\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","deployed_bytecode":"0x608060405234801561001057600080fd5b506004361061012c5760003560e01c806370a08231116100ad5780639fef0c01116100715780639fef0c01146102a6578063a9059cbb146102cf578063addd9cef146102e2578063c97e8480146102f5578063dd62ed3e146103085761012c565b806370a082311461022457806370ae92d2146102375780637e1f2bb81461026057806395d89b411461027357806399a5d747146102935761012c565b806323b872dd116100f457806323b872dd146101c2578063313ce567146101d557806331c420d4146101e45780634722b4a5146101ec5780636d1b229d146102115761012c565b8063015024601461013157806306fdde031461013b578063095ea7b31461017a57806313af40351461019d57806318160ddd146101b0575b600080fd5b61013961031b565b005b60408051808201909152601181527029aa20a9a4a99022aaa929902a37b5b2b760791b60208201525b6040516101719190610dbc565b60405180910390f35b61018d610188366004610d11565b610375565b6040519015158152602001610171565b6101396101ab366004610c8a565b61038a565b6004545b604051908152602001610171565b61018d6101d0366004610cd6565b6103c3565b60405160028152602001610171565b610139610487565b6000808080604080519485526020850193909352918301526060820152608001610171565b61018d61021f366004610da4565b6104de565b6101b4610232366004610c8a565b610590565b6101b4610245366004610c8a565b6001600160a01b031660009081526006602052604090205490565b61018d61026e366004610da4565b6105ae565b6040805180820190915260048152634555525360e01b6020820152610164565b6101b46102a1366004610da4565b61064f565b6101b46102b4366004610c8a565b6001600160a01b03166000908152600b602052604090205490565b61018d6102dd366004610d11565b610674565b6101396102f0366004610d11565b6106f7565b61018d610303366004610d3a565b61072a565b6101b4610316366004610ca4565b6109c0565b6002546001600160a01b0316331461033257600080fd5b60055460ff16610373576005805460ff191660011790556040517f615acbaede366d76a8b8cb2a9ada6a71495f0786513d71aa97aaf0c3910b78de90600090a15b565b600061038183836109ed565b90505b92915050565b6002546001600160a01b031633146103a157600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60055460009060ff16156103d957506000610480565b6001600160a01b038084166000908152600b6020526040808220549287168252902054176001908116141561041057506000610480565b6001600160a01b0384166000908152600160209081526040808320338452909152902054821180159061045b57506001600160a01b0384166000908152602081905260409020548211155b1561047c5761046b848484610a59565b61047457600080fd5b506001610480565b5060005b9392505050565b6002546001600160a01b0316331461049e57600080fd5b60055460ff1615610373576005805460ff191690556040517f2f05ba71d0df11bf5fa562a6569d70c4f80da84284badbe015ce1456063d0ded90600090a1565b6002546000906001600160a01b031633146104f857600080fd5b81156105875733600090815260208190526040902054821161057f573360009081526020819052604090205461052f908390610e47565b3360009081526020819052604090205560045461054d908390610e47565b6004556040518281526000903390600080516020610e75833981519152906020015b60405180910390a350600161058b565b50600061058b565b5060015b919050565b6001600160a01b038116600090815260208190526040812054610384565b6002546000906001600160a01b031633146105c857600080fd5b8115610587576004546105e0620186a0600019610e27565b6105ea9190610e47565b821161057f573360009081526020819052604090205461060b908390610e0f565b33600090815260208190526040902055600454610629908390610e0f565b6004556040518281523390600090600080516020610e758339815191529060200161056f565b6000610660620186a0600019610e27565b82111561066c57600080fd5b506000919050565b60055460009060ff161561068a57506000610384565b6001600160a01b0383166000908152600b60205260408082205433835291205417600190811614156106be57506000610384565b3360009081526020819052604090205482116106ef576106de8383610baa565b6106e757600080fd5b506001610384565b506000610384565b6002546001600160a01b0316331461070e57600080fd5b6001600160a01b039091166000908152600b6020526040902055565b60055460009060ff1615610740575060006109b5565b6000600130336040516bffffffffffffffffffffffff19606093841b8116602083015291831b82166034820152918c901b166048820152605c81018a9052607c8101899052609c810188905260bc0160408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156107ed573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108125760009150506109b5565b6001600160a01b038116600090815260066020526040902054861461083b5760009150506109b5565b6001600160a01b03808a166000908152600b602052604080822054928416825290205417600190811614156108745760009150506109b5565b6001600160a01b038116600090815260208190526040902054808911156108a0576000925050506109b5565b6108aa8982610e47565b9050808811156108bf576000925050506109b5565b6108c98882610e47565b90506108d6876001610e0f565b6001600160a01b03808416600090815260066020908152604080832094909455819052828120849055908c1681522054610911908a90610e0f565b6001600160a01b038b1660009081526020819052604080822092909255338152205461093e908990610e0f565b336000908152602081815260409182902092909255518a81526001600160a01b038c81169290851691600080516020610e75833981519152910160405180910390a360405188815233906001600160a01b03841690600080516020610e758339815191529060200160405180910390a36001925050505b979650505050505050565b6001600160a01b038083166000908152600160209081526040808320938516835292905290812054610381565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a489086815260200190565b60405180910390a350600192915050565b6001600160a01b038316600090815260016020908152604080832033845290915281205482811015610a8f576000915050610480565b6001600160a01b03851660009081526020819052604090205483811015610abb57600092505050610480565b610ac58483610e47565b6001600160a01b03871660009081526001602090815260408083203384529091529020558315801590610b0a5750846001600160a01b0316866001600160a01b031614155b15610b6357610b198482610e47565b6001600160a01b038088166000908152602081905260408082209390935590871681522054610b49908590610e0f565b6001600160a01b0386166000908152602081905260409020555b846001600160a01b0316866001600160a01b0316600080516020610e7583398151915286604051610b9691815260200190565b60405180910390a350600195945050505050565b3360009081526020819052604081205482811015610bcc576000915050610384565b600083118015610be55750336001600160a01b03851614155b15610c3b57610bf48382610e47565b33600090815260208190526040808220929092556001600160a01b03861681522054610c21908490610e0f565b6001600160a01b0385166000908152602081905260409020555b6040518381526001600160a01b038516903390600080516020610e758339815191529060200160405180910390a35060019392505050565b80356001600160a01b038116811461058b57600080fd5b600060208284031215610c9b578081fd5b61038182610c73565b60008060408385031215610cb6578081fd5b610cbf83610c73565b9150610ccd60208401610c73565b90509250929050565b600080600060608486031215610cea578081fd5b610cf384610c73565b9250610d0160208501610c73565b9150604084013590509250925092565b60008060408385031215610d23578182fd5b610d2c83610c73565b946020939093013593505050565b600080600080600080600060e0888a031215610d54578283fd5b610d5d88610c73565b9650602088013595506040880135945060608801359350608088013560ff81168114610d87578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215610db5578081fd5b5035919050565b6000602080835283518082850152825b81811015610de857858101830151858201604001528201610dcc565b81811115610df95783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610e2257610e22610e5e565b500190565b600082610e4257634e487b7160e01b81526012600452602481fd5b500490565b600082821015610e5957610e59610e5e565b500390565b634e487b7160e01b600052601160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220df4e3e266821e883512d7c5271b452d2ce60507dca618724873c6ad644ef2f5164736f6c63430008030033","optimization_enabled":true,"verified_twin_address_hash":null,"is_verified":true,"compiler_settings":{"evmVersion":"istanbul","libraries":{},"metadata":{"bytecodeHash":"ipfs"},"optimizer":{"enabled":true,"runs":200},"remappings":[]},"optimization_runs":200,"sourcify_repo_url":"https://repo.sourcify.dev/contracts/partial_match/1/0x25d772b21b0e5197f2DC8169E3Aa976B16bE04aC/","decoded_constructor_args":null,"compiler_version":"0.8.3+commit.8d00100c","is_verified_via_verifier_alliance":false,"verified_at":"2024-11-28T15:22:15.459971Z","implementations":[],"proxy_type":null,"external_libraries":[],"creation_bytecode":"0x608060405234801561001057600080fd5b50600280546001600160a01b03191633179055610eca806100326000396000f3fe608060405234801561001057600080fd5b506004361061012c5760003560e01c806370a08231116100ad5780639fef0c01116100715780639fef0c01146102a6578063a9059cbb146102cf578063addd9cef146102e2578063c97e8480146102f5578063dd62ed3e146103085761012c565b806370a082311461022457806370ae92d2146102375780637e1f2bb81461026057806395d89b411461027357806399a5d747146102935761012c565b806323b872dd116100f457806323b872dd146101c2578063313ce567146101d557806331c420d4146101e45780634722b4a5146101ec5780636d1b229d146102115761012c565b8063015024601461013157806306fdde031461013b578063095ea7b31461017a57806313af40351461019d57806318160ddd146101b0575b600080fd5b61013961031b565b005b60408051808201909152601181527029aa20a9a4a99022aaa929902a37b5b2b760791b60208201525b6040516101719190610dbc565b60405180910390f35b61018d610188366004610d11565b610375565b6040519015158152602001610171565b6101396101ab366004610c8a565b61038a565b6004545b604051908152602001610171565b61018d6101d0366004610cd6565b6103c3565b60405160028152602001610171565b610139610487565b6000808080604080519485526020850193909352918301526060820152608001610171565b61018d61021f366004610da4565b6104de565b6101b4610232366004610c8a565b610590565b6101b4610245366004610c8a565b6001600160a01b031660009081526006602052604090205490565b61018d61026e366004610da4565b6105ae565b6040805180820190915260048152634555525360e01b6020820152610164565b6101b46102a1366004610da4565b61064f565b6101b46102b4366004610c8a565b6001600160a01b03166000908152600b602052604090205490565b61018d6102dd366004610d11565b610674565b6101396102f0366004610d11565b6106f7565b61018d610303366004610d3a565b61072a565b6101b4610316366004610ca4565b6109c0565b6002546001600160a01b0316331461033257600080fd5b60055460ff16610373576005805460ff191660011790556040517f615acbaede366d76a8b8cb2a9ada6a71495f0786513d71aa97aaf0c3910b78de90600090a15b565b600061038183836109ed565b90505b92915050565b6002546001600160a01b031633146103a157600080fd5b600280546001600160a01b0319166001600160a01b0392909216919091179055565b60055460009060ff16156103d957506000610480565b6001600160a01b038084166000908152600b6020526040808220549287168252902054176001908116141561041057506000610480565b6001600160a01b0384166000908152600160209081526040808320338452909152902054821180159061045b57506001600160a01b0384166000908152602081905260409020548211155b1561047c5761046b848484610a59565b61047457600080fd5b506001610480565b5060005b9392505050565b6002546001600160a01b0316331461049e57600080fd5b60055460ff1615610373576005805460ff191690556040517f2f05ba71d0df11bf5fa562a6569d70c4f80da84284badbe015ce1456063d0ded90600090a1565b6002546000906001600160a01b031633146104f857600080fd5b81156105875733600090815260208190526040902054821161057f573360009081526020819052604090205461052f908390610e47565b3360009081526020819052604090205560045461054d908390610e47565b6004556040518281526000903390600080516020610e75833981519152906020015b60405180910390a350600161058b565b50600061058b565b5060015b919050565b6001600160a01b038116600090815260208190526040812054610384565b6002546000906001600160a01b031633146105c857600080fd5b8115610587576004546105e0620186a0600019610e27565b6105ea9190610e47565b821161057f573360009081526020819052604090205461060b908390610e0f565b33600090815260208190526040902055600454610629908390610e0f565b6004556040518281523390600090600080516020610e758339815191529060200161056f565b6000610660620186a0600019610e27565b82111561066c57600080fd5b506000919050565b60055460009060ff161561068a57506000610384565b6001600160a01b0383166000908152600b60205260408082205433835291205417600190811614156106be57506000610384565b3360009081526020819052604090205482116106ef576106de8383610baa565b6106e757600080fd5b506001610384565b506000610384565b6002546001600160a01b0316331461070e57600080fd5b6001600160a01b039091166000908152600b6020526040902055565b60055460009060ff1615610740575060006109b5565b6000600130336040516bffffffffffffffffffffffff19606093841b8116602083015291831b82166034820152918c901b166048820152605c81018a9052607c8101899052609c810188905260bc0160408051601f198184030181528282528051602091820120600084529083018083525260ff881690820152606081018690526080810185905260a0016020604051602081039080840390855afa1580156107ed573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166108125760009150506109b5565b6001600160a01b038116600090815260066020526040902054861461083b5760009150506109b5565b6001600160a01b03808a166000908152600b602052604080822054928416825290205417600190811614156108745760009150506109b5565b6001600160a01b038116600090815260208190526040902054808911156108a0576000925050506109b5565b6108aa8982610e47565b9050808811156108bf576000925050506109b5565b6108c98882610e47565b90506108d6876001610e0f565b6001600160a01b03808416600090815260066020908152604080832094909455819052828120849055908c1681522054610911908a90610e0f565b6001600160a01b038b1660009081526020819052604080822092909255338152205461093e908990610e0f565b336000908152602081815260409182902092909255518a81526001600160a01b038c81169290851691600080516020610e75833981519152910160405180910390a360405188815233906001600160a01b03841690600080516020610e758339815191529060200160405180910390a36001925050505b979650505050505050565b6001600160a01b038083166000908152600160209081526040808320938516835292905290812054610381565b3360008181526001602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92590610a489086815260200190565b60405180910390a350600192915050565b6001600160a01b038316600090815260016020908152604080832033845290915281205482811015610a8f576000915050610480565b6001600160a01b03851660009081526020819052604090205483811015610abb57600092505050610480565b610ac58483610e47565b6001600160a01b03871660009081526001602090815260408083203384529091529020558315801590610b0a5750846001600160a01b0316866001600160a01b031614155b15610b6357610b198482610e47565b6001600160a01b038088166000908152602081905260408082209390935590871681522054610b49908590610e0f565b6001600160a01b0386166000908152602081905260409020555b846001600160a01b0316866001600160a01b0316600080516020610e7583398151915286604051610b9691815260200190565b60405180910390a350600195945050505050565b3360009081526020819052604081205482811015610bcc576000915050610384565b600083118015610be55750336001600160a01b03851614155b15610c3b57610bf48382610e47565b33600090815260208190526040808220929092556001600160a01b03861681522054610c21908490610e0f565b6001600160a01b0385166000908152602081905260409020555b6040518381526001600160a01b038516903390600080516020610e758339815191529060200160405180910390a35060019392505050565b80356001600160a01b038116811461058b57600080fd5b600060208284031215610c9b578081fd5b61038182610c73565b60008060408385031215610cb6578081fd5b610cbf83610c73565b9150610ccd60208401610c73565b90509250929050565b600080600060608486031215610cea578081fd5b610cf384610c73565b9250610d0160208501610c73565b9150604084013590509250925092565b60008060408385031215610d23578182fd5b610d2c83610c73565b946020939093013593505050565b600080600080600080600060e0888a031215610d54578283fd5b610d5d88610c73565b9650602088013595506040880135945060608801359350608088013560ff81168114610d87578384fd5b9699959850939692959460a0840135945060c09093013592915050565b600060208284031215610db5578081fd5b5035919050565b6000602080835283518082850152825b81811015610de857858101830151858201604001528201610dcc565b81811115610df95783604083870101525b50601f01601f1916929092016040019392505050565b60008219821115610e2257610e22610e5e565b500190565b600082610e4257634e487b7160e01b81526012600452602481fd5b500490565b600082821015610e5957610e59610e5e565b500390565b634e487b7160e01b600052601160045260246000fdfeddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efa2646970667358221220df4e3e266821e883512d7c5271b452d2ce60507dca618724873c6ad644ef2f5164736f6c63430008030033","name":"EURSToken","is_blueprint":false,"license_type":"none","is_fully_verified":false,"is_verified_via_eth_bytecode_db":true,"language":"solidity","evm_version":"istanbul","can_be_visualized_via_sol2uml":true,"is_verified_via_sourcify":true,"additional_sources":[{"file_path":"AbstractToken.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\r\n/*\r\n * Abstract Token Smart Contract.  Copyright © 2017 by ABDK Consulting.\r\n * Copyright (c) 2018 by STSS (Malta) Limited.\r\n * Contact: <tech@stasis.net>\r\n */\r\npragma solidity ^0.8.0;\r\n\r\nimport \"./Token.sol\";\r\n\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\nabstract contract AbstractToken is Token {\r\n  /**\r\n   * Create new Abstract Token contract.\r\n   */\r\n  constructor () {\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 balance number of tokens currently belonging to the owner of given address\r\n   */\r\n  function balanceOf (address _owner) public override virtual 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 success true if tokens were transferred successfully, false otherwise\r\n   */\r\n  function transfer (address _to, uint256 _value)\r\n  public override virtual 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] = fromBalance - _value;\r\n      accounts [_to] = accounts [_to] + _value;\r\n    }\r\n    emit 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 success true if tokens were transferred successfully, false otherwise\r\n   */\r\n  function transferFrom (address _from, address _to, uint256 _value)\r\n  public override virtual 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      spenderAllowance - _value;\r\n\r\n    if (_value > 0 && _from != _to) {\r\n      accounts [_from] = fromBalance - _value;\r\n      accounts [_to] = accounts [_to] + _value;\r\n    }\r\n    emit 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 success true if token transfer was successfully approved, false otherwise\r\n   */\r\n  function approve (address _spender, uint256 _value)\r\n  public override virtual returns (bool success) {\r\n    allowances [msg.sender][_spender] = _value;\r\n    emit 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 remaining 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 override virtual view returns (uint256 remaining) {\r\n    return allowances [_owner][_spender];\r\n  }\r\n\r\n  /**\r\n   * @dev 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   * @dev 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"},{"file_path":"Token.sol","source_code":"// SPDX-License-Identifier: UNLICENSED\n/*\n * EIP-20 Standard Token Smart Contract Interface.\n * Copyright (c) 2018 by STSS (Malta) Limited.\n * Contact: <tech@stasis.net>\n */\npragma solidity ^0.8.0;\n\n/**\n * ERC-20 standard token interface, as defined\n * <a href=\"https://github.com/ethereum/EIPs/blob/master/EIPS/eip-20.md\">here</a>.\n */\ninterface Token {\n  /**\n   * Get total number of tokens in circulation.\n   *\n   * @return supply total number of tokens in circulation\n   */\n  function totalSupply () external view returns (uint256 supply);\n\n  /**\n   * Get number of tokens currently belonging to given owner.\n   *\n   * @param _owner address to get number of tokens currently belonging to the\n   *        owner of\n   * @return balance number of tokens currently belonging to the owner of given address\n   */\n  function balanceOf (address _owner) external view returns (uint256 balance);\n\n  /**\n   * Transfer given number of tokens from message sender to given recipient.\n   *\n   * @param _to address to transfer tokens to the owner of\n   * @param _value number of tokens to transfer to the owner of given address\n   * @return success true if tokens were transferred successfully, false otherwise\n   */\n  function transfer (address _to, uint256 _value)\n  external returns (bool success);\n\n  /**\n   * Transfer given number of tokens from given owner to given recipient.\n   *\n   * @param _from address to transfer tokens from the owner of\n   * @param _to address to transfer tokens to the owner of\n   * @param _value number of tokens to transfer from given owner to given\n   *        recipient\n   * @return success true if tokens were transferred successfully, false otherwise\n   */\n  function transferFrom (address _from, address _to, uint256 _value)\n  external returns (bool success);\n\n  /**\n   * Allow given spender to transfer given number of tokens from message sender.\n   *\n   * @param _spender address to allow the owner of to transfer tokens from\n   *        message sender\n   * @param _value number of tokens to allow to transfer\n   * @return success true if token transfer was successfully approved, false otherwise\n   */\n  function approve (address _spender, uint256 _value)\n  external returns (bool success);\n\n  /**\n   * Tell how many tokens given spender is currently allowed to transfer from\n   * given owner.\n   *\n   * @param _owner address to get number of tokens allowed to be transferred\n   *        from the owner of\n   * @param _spender address to get number of tokens allowed to be transferred\n   *        by the owner of\n   * @return remaining number of tokens given spender is currently allowed to transfer\n   *         from given owner\n   */\n  function allowance (address _owner, address _spender)\n  external view returns (uint256 remaining);\n\n  /**\n   * Logged when tokens were transferred from one owner to another.\n   *\n   * @param _from address of the owner, tokens were transferred from\n   * @param _to address of the owner, tokens were transferred to\n   * @param _value number of tokens transferred\n   */\n  event Transfer (address indexed _from, address indexed _to, uint256 _value);\n\n  /**\n   * Logged when owner approved his tokens to be transferred by some spender.\n   *\n   * @param _owner owner who approved his tokens to be transferred\n   * @param _spender spender who were allowed to transfer the tokens belonging\n   *        to the owner\n   * @param _value number of tokens belonging to the owner, approved to be\n   *        transferred by the spender\n   */\n  event Approval (\n    address indexed _owner, address indexed _spender, uint256 _value);\n}\n"}],"certified":false,"conflicting_implementations":null,"abi":[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[],"name":"Freeze","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_value","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[],"name":"Unfreeze","type":"event"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"remaining","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_spender","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"burnTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"_fee","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"createTokens","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"},{"internalType":"uint256","name":"_fee","type":"uint256"},{"internalType":"uint256","name":"_nonce","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"delegatedTransfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"flags","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freezeTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"getFeeParameters","outputs":[{"internalType":"uint256","name":"_fixedFee","type":"uint256"},{"internalType":"uint256","name":"_minVariableFee","type":"uint256"},{"internalType":"uint256","name":"_maxVariableFee","type":"uint256"},{"internalType":"uint256","name":"_variableFeeNumnerator","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"nonce","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_flags","type":"uint256"}],"name":"setFlags","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"setOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_value","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unfreezeTransfers","outputs":[],"stateMutability":"nonpayable","type":"function"}],"is_changed_bytecode":false,"is_partially_verified":true,"constructor_args":null}