0

The below code gets Out Of Gas when the callback is triggered and the rest of the code starts executing. I don't know how to solve the gas issue. Any help?

pragma solidity ^0.4.20;
import "./oraclize.sol";

contract Casino is usingOraclize {
   address owner;
   uint public betAmount = 30 finney; //Equal to 0.01 Ether
   uint public totalBets; //Amount of Ether bet for current game
   uint public numberOfBets; //Total number of current bets
   //uint public maxAmountOfBets = 1 //Maximum amount of bets can be made for each game by each user
   uint public limitAmountOfBets = 2; //Maximum amount of bets for each game
   uint public numberWinner; //Number that won last game
   bool public gameStatus;
   uint public stage = 0;
   uint public winnerEtherAmount;
   mapping(uint => address[]) public numberBetPlayers; //Who bet for which number
   mapping(address => uint) public playerBetsNumber; //Number bet by each player

   uint public numberLengths;

   modifier onEndGame() {
       if(numberOfBets >= limitAmountOfBets) _;
   }

   //constructor - set bet amount and max bets in each game
   function Casino(uint _betAmount, uint _limitAmountOfBets) {
       owner = msg.sender; //set creator of contract to owner

       if(_betAmount > 0) betAmount = _betAmount;
       if(_limitAmountOfBets > 0) limitAmountOfBets = _limitAmountOfBets;

       oraclize_setProof(proofType_Ledger); //arge
   }

   //check if player exists in current game
   function checkPlayerExists(address player) constant public returns(bool) {
       if(playerBetsNumber[player] > 0) return true;
       else return false;
   }

   //bet function
   function bet(uint numberToBet) payable {
       require(numberOfBets <= limitAmountOfBets); //check if limit has been reached
       require(!checkPlayerExists(msg.sender)); //check that player hasn't bet before
       require(numberToBet >=1 && numberToBet <= 10); //check that the bet is between 1 and 10
       require(msg.value == betAmount); //check that ether send by sender is equal to bet amount
       gameStatus = true;

       playerBetsNumber[msg.sender] = numberToBet;
       numberBetPlayers[numberToBet].push(msg.sender);

       numberOfBets += 1;
       totalBets += msg.value;

       if(numberOfBets >= limitAmountOfBets) generateNumberWinner();
   }

   //generate random numbers using oraclize_newRandomDSQuery function
   function generateNumberWinner() payable onEndGame {
       gameStatus = false;
       stage = 1;
       uint numberRandomBytes = 7;
       uint delay = 0;
       uint callbackGas = 200000;

       oraclize_newRandomDSQuery(delay, numberRandomBytes, callbackGas);
   }

   function __callback(bytes32 _queryId, string _result, bytes _proof) {
       stage = 2;
       require (msg.sender == oraclize_cbAddress());

       if (oraclize_randomDS_proofVerify__returnCode(_queryId, _result, _proof) != 0) {
           stage = 9;
       }
       else {
           numberWinner = uint(sha3(_result)) % 10;
           //numberWinner = (uint(keccak256(_result))%10+1);
           distributePrizes();
       }
   }

   function distributePrizes() internal onEndGame {
       stage = 3;

       if(numberBetPlayers[numberWinner].length > 0) {
           winnerEtherAmount = totalBets / numberBetPlayers[numberWinner].length; //how much each winner will get

           for(uint i = 0; i < numberBetPlayers[numberWinner].length; i++) { //sent ether to addresses
               numberBetPlayers[numberWinner][i].transfer(winnerEtherAmount);
           }
       }

       for(uint j = 1; j <= 10; j++) {
           if(numberBetPlayers[j].length > 0) delete numberBetPlayers[j];
       }

       totalBets = 0;
       numberOfBets = 0;
   }
}
1

You may just have to increase the gas limit. Transfers of ETH in a contract cost around 10k each. A better way to do this would be have the result stored in the contract and have the betters withdraw the value they're owed instead

  • how can I achieve that? Are there any sample codes? – shotofcode Feb 22 '18 at 18:02
  • Also I changed this if clause to: if(numberBetPlayers[11].length > 0) but it again fails because of gas. any ideas what might be wrong? – shotofcode Feb 22 '18 at 20:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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