Solidity ParseError: Expected primary expression

Viewed 1201

When I compile with truffle I get this error

When I am compiling with truffle it is giving me this error I got this error after adding payable prior to that it was

winners[j].transfer(betwa*(10000+(LoserBet*10000/WinnerBet))/10000);

I had to add it because I was getting another error Which was

TypeError: "send" and "transfer" are only available for objects of type "address payable", not "address".

My Complete Contract :

pragma solidity ^0.5.16;


contract Betting {
   address public owner;
   uint256 public minimumBet;
   uint256 public totalBetsOne;
   uint256 public totalBetsTwo;
   address[] public players;
   struct Player {
      uint256 amountBet;
      uint16 teamSelected;
    }
// The address of the player and => the user info
   mapping(address => Player) public playerInfo;
   function() external payable {}
 constructor() public {
      owner = msg.sender;
      minimumBet = 100000000000000;
    }
function kill() public {
      if(msg.sender == owner) selfdestruct(msg.sender);
    }
function checkPlayerExists(address player) public view returns(bool){
      for(uint256 i = 0; i < players.length; i++){
         if(players[i] == player) return true;
      }
      return false;
    }


    function bet(uint8 _teamSelected) public payable {
      //The first require is used to check if the player already exist
      require(!checkPlayerExists(msg.sender));
      //The second one is used to see if the value sended by the player is
      //Higher than the minimum value
      require(msg.value >= minimumBet);

      //We set the player informations : amount of the bet and selected team
      playerInfo[msg.sender].amountBet = msg.value;
      playerInfo[msg.sender].teamSelected = _teamSelected;

      //then we add the address of the player to the players array
      players.push(msg.sender);

      //at the end, we increment the stakes of the team selected with the player bet
      if ( _teamSelected == 1){
          totalBetsOne += msg.value;
      }
      else{
          totalBetsTwo += msg.value;
      }
    }
    // Generates a number between 1 and 10 that will be the winner
    function distributePrizes(uint16 teamWinner) public {
      address[1000] memory winners;
      //We have to create a temporary in memory array with fixed size
      //Let's choose 1000
      uint256 count = 0; // This is the count for the array of winners
      uint256 LoserBet = 0; //This will take the value of all losers bet
      uint256 WinnerBet = 0; //This will take the value of all winners bet
        address  playerAddress;
      //We loop through the player array to check who selected the winner team
      for(uint256 i = 0; i < players.length; i++){
           playerAddress = players[i];

         //If the player selected the winner team
         //We add his address to the winners array
         if(playerInfo[playerAddress].teamSelected == teamWinner){
            winners[count] = playerAddress;
            count++;
         }
      }

      //We define which bet sum is the Loser one and which one is the winner
      if ( teamWinner == 1){
         LoserBet = totalBetsTwo;
         WinnerBet = totalBetsOne;
      }
      else{
          LoserBet = totalBetsOne;
          WinnerBet = totalBetsTwo;
      }


      //We loop through the array of winners, to give ethers to the winners
      for(uint256 j = 0; j < count; j++){
          // Check that the address in this fixed array is not empty
         if(winners[j] != address(0)){
            address add = winners[j];
            uint256 betwa = playerInfo[add].amountBet;
            //Transfer the money to the user
            payable(winners[j]).transfer( (betwa*(10000+(LoserBet*10000/WinnerBet)))/10000 );
            }
      }
      delete playerInfo[playerAddress]; // Delete all the players
      players.length = 0; // Delete all the players array
      LoserBet = 0; //reinitialize the bets
      WinnerBet = 0;
      totalBetsOne = 0;
      totalBetsTwo = 0;
    }

    function AmountOne() public view returns(uint256){
       return totalBetsOne;
    }

    function AmountTwo() public view returns(uint256){
       return totalBetsTwo;
    }
}

What I have tried is making the address payable in this function but It is not working I have tried to replace memory with payable but still it isn't working My versions Truffle v5.4.18 (core: 5.4.18) Solidity v0.5.16 (solc-js) Node v14.15.1 Web3.js v1.5.3

1 Answers

The payable() conversion from address to address payable was introduced in Solidity 0.6.

Source: https://docs.soliditylang.org/en/latest/060-breaking-changes.html#new-features

Since your contract is using (deprecated) version 0.5.16, it doesn't allow this conversion. So you need to define the winners array already as address payable:

// added `payable`
address payable[1000] memory winners;

Then you'll be able to use the .transfer() method of the address payable type:

// `winners[j]` is payable
winners[j].transfer(...);
Related