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;
   }
}
shotofcode
  • 148
  • 4

1 Answers1

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

natewelch_
  • 12,021
  • 1
  • 29
  • 43