pragma solidity ^0.5.17;

library SafeMath {
	//funcoes pure nao alteram nem consultam coisas na blockchain e sao gratuitas
   function sum(uint num1, uint num2) internal pure returns(uint){
   		uint num3 = num1+num2;
   		require(num3 >=num1, "Erro de soma: Sum Overflow");
   		return num3;	
   	
   }
   function sub(uint num1, uint num2) internal pure returns(uint){
   		require(num2 <= num1, "Erro de Subtracao: Sub Underflow");
   		uint num3 = num1 - num2;
   		return num3;   	
   }
   function prod(uint num1, uint num2) internal pure returns(uint){
   		if (num1 == 0){
   			return 0;
   		}
   		uint num3 = num1 * num2;
   		require(num3 / num1 == num2, "Erro multiplicacao: Prod Overflow");
   		return num3;
   }
   
    function div(uint num1, uint num2) internal pure returns(uint){

   		uint num3 = num1 / num2;
   		return num3;	
   	
   }
  
}

contract Ownable { 
	address payable public owner; // variavei para enderecos que enviam ou recebem eth devem ser payable.
	//evento que pode ser disparado ao ser executada uma determinada tarefa do contrato.
	event OwnershipTranferred(address newOwner);
	
// a funcao constructor, por fdefinicao, so e chamada uma vez, nao podendo ser alterada.
  constructor()public {
  	owner = msg.sender;
  }
//exige que o usuario seja o dono do contrato para executar  a funcao que vier posterior.
  modifier onlyOwner() { 
  	require (msg.sender == owner, "You are not the owner!"); 
  	_; //executa o resto da funcao, ou seja, o que vier apos quando for chamado.
  }

// essa so executada apos tere certeza que o usuario e o dono do contrato para poder executa-la.
  function transferOwnerShip(address payable newOwner) onlyOwner public{
  	owner = newOwner;
  	emit OwnershipTranferred(owner);
  }

}


contract desafio_01 is Ownable{

  using SafeMath for uint;

  string public retorno;
  // mapping (address => uint) public balances;//saldo da conta;
  //mapping (address => uint) public hasInteracted;
  //essa variavel recebe a quantidade de vezes em que houve interacao no contrato(modelo_2)

  
    function setNumber (uint myNumber) public payable{	
       require(myNumber <=10, "Number out of range");
		require (msg.value == 25 finney, "Insufficient ETH sent.");
		
		if(myNumber > 5){
          retorno = "maior que 5";
        } else {
        retorno = "menor ou igual a 5";}
      
		
   }
    //podia ser implementada direto na funcao de cima,
    //mas prefiro uma funcao especifica para exibir a string.
    function getString() public view returns (string memory) { 
        return retorno;
        
    }
    
    


}