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;
}
}