Skip to content

Instantly share code, notes, and snippets.

@alecchampaign
Last active December 3, 2017 00:53
Show Gist options
  • Save alecchampaign/ac8078fda7a8494e9f4bb281641613d4 to your computer and use it in GitHub Desktop.
Save alecchampaign/ac8078fda7a8494e9f4bb281641613d4 to your computer and use it in GitHub Desktop.
A simple escrow contract between two parties.
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