pragma solidity ^0.5.0; contract Betting{ mapping(address => bool) owners; address[] private admins; constructor () public payable { owners[msg.sender] = true; admins.push(msg.sender); } struct Gamer{ uint id; uint idMatch; address payable player; string descriptions; uint256 valueWin; uint256 valueDraw; uint256 valueLose; } struct Match{ uint id; string matchName; string dateTime; uint256 rateWin; uint256 rateDraw; uint256 rateLose; uint winer; uint status; } mapping (uint=> Gamer) public gamers; uint gamerCounter; mapping (uint=> Match) public matches; uint matchCounter; //Gamer place a bet function PlaceBet(uint _idMatch, string memory _descriptions, uint256 _valueWin, uint256 _valueDraw, uint256 _valueLose) public payable returns(bool){ uint256 totalValue = _valueWin + _valueDraw + _valueLose; require(msg.sender.balance >= totalValue); gamerCounter++; gamers[gamerCounter] = Gamer( gamerCounter, _idMatch, msg.sender, _descriptions, _valueWin, _valueDraw, _valueLose ); } //Create a mtach function CreateMatch(string memory _matchName, string memory _dateTime, uint256 _rateWin, uint256 _rateDraw, uint256 _rateLose) public onlyOwner returns(bool){ matchCounter++; uint _winer = 0; uint _status = 0; matches[matchCounter] = Match( matchCounter, _matchName, _dateTime, _rateWin, _rateDraw, _rateLose, _winer, _status ); } //Get amount gamer function getAllPlayers() external view returns ( uint[] memory u){ uint[] memory gamerIds = new uint[](gamerCounter); uint count = 0; for(uint i = 1; i <= gamerCounter; i++){ if (gamers[i].player != address(0x0)){ gamerIds[count] = gamers[i].id; count++; } } uint[] memory fordishPlay = new uint[](count); for(uint j=0; j < count; j++){ fordishPlay[j] = gamerIds[j]; } return fordishPlay; } //withdraw from smart cotract only admin function withdraw() public onlyOwner{ msg.sender.transfer(address(this).balance); } //Pay winer function payWiners(uint _idMatch) public onlyOwner returns(bool pay){ uint256[] memory idgamers = getGamerOfMatch(_idMatch); for(uint i = 0; i< idgamers.length; i++){ Gamer memory gamer = gamers[idgamers[i]]; payMoneyForGamerOfMatch(gamer,_idMatch); } return true; } //Get list gamer place bet function getNumberOfGamers() public view returns (uint){ return gamerCounter; } //////////////////////////////Function Addmin//////////////////////////////////// //Return array id winer function getGamerOfMatch(uint _idMatch) public view onlyOwner returns(uint256[] memory list){ uint256[] memory gamerIds = new uint[](gamerCounter); uint numberGamerOfMatch = 0; for(uint i = 1; i <= gamerCounter; i++){ if (gamers[i].idMatch == _idMatch){ gamerIds[numberGamerOfMatch] = gamers[i].id; numberGamerOfMatch++; } } uint256[] memory winerIds = new uint[](numberGamerOfMatch); //return smaller array for(uint j = 0; j < numberGamerOfMatch; j++){ winerIds[j] = gamerIds[j]; } return winerIds; } //Pay winer _money function payMoneyForGamerOfMatch(Gamer memory _gamer, uint _idMatch)private onlyOwner returns(bool ispay){ Match memory mat = matches[_idMatch]; // if the match finish do smt else do not if(mat.status == 3){ // calculate value pay for gamer int256 value = 0; if(mat.winer == 1) value = (int256)(mat.rateWin * _gamer.valueWin - mat.rateDraw * _gamer.valueDraw - mat.rateLose * _gamer.valueLose); if(mat.winer == 2) value = (int256) (mat.rateDraw * _gamer.valueDraw - mat.rateWin * _gamer.valueWin -mat.rateLose * _gamer.valueLose); if(mat.winer == 3) value = (int256)(mat.rateWin * _gamer.valueWin - mat.rateDraw * _gamer.valueDraw - mat.rateLose * _gamer.valueLose); if(value > 0){ transferETHFromContract(_gamer.player, uint256(value)); return true; } } return false; } //Add Onwer to admins function addOwners(address _newAddress) public onlyOwner returns(bool isadmin){ require(_newAddress !=address(0x0) && !owners[_newAddress] && owners[msg.sender]); owners[_newAddress] = true; admins.push(_newAddress); return true; } //tranfer Eth from contract to Address function transferETHFromContract(address payable _to, uint256 _value) payable public onlyOwner { // allowance has big enough require(address(this).balance >= _value); _to.transfer(_value); } //View Owners function viewOwners() public onlyOwner view returns (address[] memory list ){ require(owners[msg.sender]); return admins; } //require Owner modifier onlyOwner(){ require(owners[msg.sender]); _; } }
0.5.0