Last active
December 3, 2017 00:53
-
-
Save alecchampaign/ac8078fda7a8494e9f4bb281641613d4 to your computer and use it in GitHub Desktop.
A simple escrow contract between two parties.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity ^0.4.18; | |
contract Escrow { | |
address public buyer; | |
address public seller; | |
uint public balance; | |
uint public requiredDeposit; | |
uint public price; | |
uint public sellerCollateral; | |
uint public buyerCollateral; | |
// Authenticate that balance is enough to pay price | |
modifier fulfilled() { | |
require(balance == price); | |
_; | |
} | |
// Authenticate buyer | |
modifier onlyBuyer() { | |
require(buyer != seller); | |
require(msg.sender == buyer); | |
_; | |
} | |
// Authenticate seller | |
modifier onlySeller() { | |
require(msg.sender == seller); | |
_; | |
} | |
// Authenicate consensus between buyer and seller | |
modifier consensus() { | |
require(signed[buyer] == true); | |
require(signed[seller] == true); | |
_; | |
} | |
// Authenticate whether the buyer or seller are trying to execute a function | |
modifier buyerOrSeller() { | |
require(msg.sender == buyer || msg.sender == seller); | |
_; | |
} | |
event buyerSigned(bool); | |
event sellerSigned(bool); | |
event fundsReleased(); | |
event fundsSent(); | |
// Maps a bool that states whether the buyer and seller have agreed to sign off on the transaction | |
mapping(address => bool) signed; | |
// Constructor | |
function Escrow(uint _requiredDeposit, uint _price) public payable { | |
requiredDeposit = _requiredDeposit; | |
price = _price; | |
require(msg.value == requiredDeposit); | |
seller = msg.sender; | |
sellerCollateral = requiredDeposit; | |
} | |
/** Send funds necessary for purchase */ | |
function purchase() public payable { | |
require(msg.value == price + requiredDeposit && msg.sender != 0 && balance == 0); | |
buyer = msg.sender; | |
buyerCollateral = msg.value - price; | |
balance = msg.value - requiredDeposit; | |
fundsSent(); | |
} | |
/** Agree to release funds and complete transaction as the buyer */ | |
function buyerAgree() public onlyBuyer() { | |
signed[buyer] = true; | |
buyerSigned(signed[buyer]); | |
} | |
/** Agree to release funds and complete transaction as the seller */ | |
function sellerAgree() public onlySeller() { | |
signed[seller] = true; | |
sellerSigned(signed[seller]); | |
} | |
/** Complete the transaction */ | |
function releaseFunds() public fulfilled() consensus() buyerOrSeller() { | |
buyer.transfer(buyerCollateral); | |
buyerCollateral = 0; | |
seller.transfer(sellerCollateral); | |
sellerCollateral = 0; | |
seller.transfer(balance); | |
balance = 0; | |
price = 0; | |
requiredDeposit = 0; | |
fundsReleased(); | |
} | |
function cancelTransaction() public buyerOrSeller() { | |
seller.transfer(sellerCollateral); | |
sellerCollateral = 0; | |
buyer.transfer(buyerCollateral); | |
buyerCollateral = 0; | |
buyer.transfer(balance); | |
balance = 0; | |
} | |
function getBuyerAgree() constant public returns (bool) { | |
return(signed[buyer]); | |
} | |
function getSellerAgree() constant public returns (bool) { | |
return(signed[seller]); | |
} | |
// Kill the contract | |
function killContract() public onlySeller() { | |
buyer.transfer(balance); | |
buyer.transfer(buyerCollateral); | |
seller.transfer(sellerCollateral); | |
selfdestruct(seller); | |
} | |
// Fallback function | |
function() public { | |
revert(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment