ParserError: Expected identifier but got ‘(‘

soliditytruffle

enter image description here

The receive function shows an error while compiling in truffle.

//SPDX-License-Identifier: UNLICENSED

pragma solidity >=0.5.0 <0.9.0;

contract Lottery {
    address payable[] public players;
    address public manager;

    constructor() {
        manager = msg.sender;
    }
    

//Error Function

    receive() external payable{
        require(msg.value == 0.1 ether);
        players.push(payable(msg.sender));
    }

    function getBalance() public view returns (uint256) {
        require(msg.sender == manager);
        return address(this).balance;
    }

    function random() internal view returns (uint256) {
        return
            uint256(
                keccak256(
                    abi.encodePacked(
                        block.difficulty,
                        block.timestamp,
                        players.length
                    )
                )
            );
    }

    function pickWinner() public {
        require(msg.sender == manager);
        require(players.length >= 3);

        uint256 r = random();
        address payable winner;

        uint256 index = r % players.length;

        winner = players[index];

        winner.transfer(getBalance());

        players = new address payable[](0);
    }

}

ParserError: Expected identifier but got '('
receive() external payable{
^

Best Answer

You're probably using an old version of solidity to compile the contract, receive is a keyword of the language that was added around 0.6.x.

https://blog.soliditylang.org/2020/03/26/fallback-receive-split/

To use version 0.8.x for instance, you first have to update your code -

pragma solidity >=0.8.0 <0.9.0;

In your truffle config file, you can specify the solidity version to use -

  compilers: {
    solc: {
      version: "^0.8.0"
    }
  }

See Truffle Configuration docs here.