Escrow
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.18;
contract Escrow {
address payable public buyer;
address payable public seller;
address payable public arbiter;
enum State {
await_payment,
await_delivery,
complete
}
State public state;
event ConfirmPayement(uint balance,uint timestamp,State state);
event ConfirmDelivery(uint balance,uint timestamp,State state);
modifier inState(State _state) {
require(state==_state,"Invalid contract state");
_;
}
constructor(address payable _buyer,address payable _seller) {
arbiter = payable(msg.sender);
require(_buyer!=_seller && _buyer!=arbiter && _seller!=arbiter);
buyer = _buyer;
seller = _seller;
state = State.await_payment;
}
function confirmPayement() external payable inState(State.await_payment) {
require(msg.value!=0);
require(msg.sender == buyer, "Only buyer can send payments");
state = State.await_delivery;
emit ConfirmPayement(msg.value,block.timestamp, state);
}
function confirmDelivery() external inState(State.await_delivery) {
require(msg.sender==arbiter || msg.sender==buyer,"Only buyer or arbiter can call this function");
uint balance = address(this).balance;
seller.transfer(balance);
state = State.complete;
emit ConfirmDelivery(balance,block.timestamp,state);
}
function getState() external view returns(State){
return state;
}
}
Last updated