Skip to main content
edited tags
Link
Rohan
  • 13
  • 4
Source Link
Rohan
  • 13
  • 4

The constructor should be payable if you send value

I have written a contract as follows:

pragma solidity ^0.4.0;

/*
Simple contract that mediates disputes using a trusted arbiter
*/
contract Taxi {
    
    enum State {IDLE, FINDING_DRIVER, AWAITING_PAYMENT, AWAITING_DESTINATION, COMPLETE}
    State public currentState;
    mapping (address => uint) public balances;
    bytes32 STRING_COMPLETE = "Complete";
    bytes32 STRING_PARTIAL = "Partial";
    
    modifier customerOnly() { require(msg.sender == customer); _; }
    modifier driverOnly() { require(msg.sender == driver); _; }
    modifier arbiterOnly() { require(msg.sender == arbiter); _; }
    modifier inState(State expectedState) { require(currentState == expectedState); _; }
    
    address public customer;
    address public driver;
    address public arbiter;
    
    function Taxi(address _customer, address _driver, address _arbiter) public {
        customer = _customer;
        driver = _driver;
        arbiter = _arbiter;
    }
    
    function assignDriver() customerOnly inState(State.IDLE) public {
        //arbiter.transfer(this.balance);
        currentState = State.FINDING_DRIVER;
    }
    
    function confirmAmount(uint amount) driverOnly inState(State.FINDING_DRIVER) public returns (bool ) {
        if(amount < 0) {
            amount = 20;
        }
        //driver has set this amount and user has accepted this fare, return true if customer has sufficient balance
        if(balances[customer] < amount) {
            return false;
        }
        currentState = State.AWAITING_DESTINATION;
        balances[arbiter] += amount;
        balances[customer] -= amount;
        return true;
    }
}

First I execute the assignDriver function which runs correctly. Later, when I execute the confirmAmount function, I get the error:

transact to Taxi.confirmAmount errored: VM error: revert.
revert The transaction has been reverted to the initial state.
Note: The constructor should be payable if you send value.  Debug the transaction to get more information.

I tried to add the payable keyword to the constructor, but still I got the same error. What can be the problem?