0

Hi everyone at the other side!

I'm doing a pseudo random lottery contract on solidity. It's working 100% good. The logic of the contract is that a player pays for getting a number in order to match with the number that owner put when did deploy. If it's match the jackpot is splitted in both. But, I cannot get the way to show the user the number that he/she got. I want to do that in order to then develop a DApp and show transparency to user. The variable call "numero" is what I want to do a getter, but it doesn't work.

Please, your help will be very appreciated, thank you in advance.

pragma solidity ^0.5.0;

contract Loteriados{
    

    address internal owner;         //creador del contrato
    uint256 internal num;           //contador numero de intentos
    uint256 public precio;          //precio para participar
    uint256 public numeroGanador;   //numero ganador definido por el creador del contrato
    bool public juego;              //indicador si o no esta habilitado el juego para jugar
    address public ganador;         //direccion wallet del ganador de la Loteria
    uint256 public fondoInicial;    //pozo inicial aportado por el creador del contrato
//    uint256 public numero;          //numero obtenido al participar 



//seteo de las variables iniciales e instrucciones que ocurren por unica vez en el deploy
    constructor(uint256 _numeroGanador, uint256 _precio) public payable{
        owner = msg.sender;
        num = 0;
        numeroGanador = _numeroGanador;
        precio = _precio;
        juego = true;
        fondoInicial = msg.value;
    }

//modificador que obliga a que el valor pagado por participante sea igual al precio por particiar
    modifier filtroPrecio(){
        require(precio == msg.value);
        _;
    }

//modificador que define que olo el creador pueda ejecutar partes del contrato
    modifier onlyOwner(){
        require(msg.sender == owner);
        _;
    }

//funcion que define la pseudo aleatoriedad, para el resultado del participante    
    function numeroRandom() private view returns(uint256){
        return uint256( keccak256( abi.encode(block.timestamp, msg.sender, num) ) ) % 10;
    }

//funcion que comprueba si el participante ha acertado 
    function comprobarAciertos(uint256 _numUsuario) private view returns(bool){
        if(_numUsuario == numeroGanador)
                {return true;}
        else    {return false;}    
        }
    
//funcion core del juego de loteria, pide que lo pagado sea igual al precio
    function participar() external payable filtroPrecio returns(bool resultado, uint256 numero){
        require(juego == true);                                 //el juego tiene que estar habilidado para jugar
        uint256 numUsuario = numeroRandom();                    //define que numUsuario es el dado por la funcion psudo aleatoria
        bool acierto = comprobarAciertos(numUsuario);           //usando la funcion comprobarAciertos define si o no el usuario ha acertado
        if(acierto == true)                                     //Si se ha acertado
            {juego = false;                                         //se para eljuego
            msg.sender.transfer((address(this).balance)/2);         //se transfiere la mitad del balance al participante
            ganador = msg.sender;                                   //se obtiene el adress wallet del participante
            resultado = true;                                       //se dice que el acierto es verdadero
            numero = numUsuario;                                   //se escribe el numero del usuario en variable numero
            }
            
        else(acierto == false);                                 //si el participante no ha acertado
            {num = num + 1;                                         //se suma 1 al contador para registrar un nuevo intento
            resultado = false;                                      //se dice que el resultado es falso
            numero = numUsuario;                                    //se escribe el numero del usuario en variable numero
            }                                   
    }


//funcion getter para ver el pozo del premio mientras se encuentre activo el juego    
    function verPremio() public view returns(uint256) {
        if(juego == true)
            {return address(this).balance/2;}
        else
            {return 0;}
    }    
    

//funcion que permite al creador del contrato retirar 50% del monto siepre y cuando un participante haya ganado antes
 function retirarFondosContrato() onlyOwner external returns(uint256) {
        require(juego == false);                                        //ni siquiera el creador puede sacar monto, esto es transparencia!!
        uint256 pagoCreador = address(this).balance;
        msg.sender.transfer(pagoCreador);
        return pagoCreador;
    }
    
}

1 Answer 1

0

If there's a public variable you don't need a getter. The compiler already creates one with the variable name.

uint256 public numero;

From js it can be called like this const num = await myContract.methods.numero().

It should be easy to write a getter in any case

function getNumero() public view returns (uint256) {
    return numero;
}

Old answer

There's a bug in participar function. The else clause is followed by a comparison (acierto == false) that does nothing.

Probably you wanted to surround the whole block with {}

    else { // (acierto == false);                                 //si el participante no ha acertado
        num = num + 1;                                         //se suma 1 al contador para registrar un nuevo intento
        resultado = false;                                      //se dice que el resultado es falso
        numero = numUsuario;                                    //se escribe el numero del usuario en variable numero
    } 
2
  • Hi Ismael, thanks for replying back. But my problem is really how to do a getter function for variable called "numero". I wanna show it to the user in every try that he/she does. Can you help me on that? Aug 6, 2021 at 3:30
  • @MarioSaavedraVergara It should be easy to write a getter, see the updated answer, but perhaps it is not needed.
    – Ismael
    Aug 6, 2021 at 4:46

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.