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?