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?
modifier customerOnly() { require(msg.sender == customer); _; }
modifier driverOnly() { require(msg.sender == driver); _; }
was false in my case.