Last active
October 29, 2018 00:08
-
-
Save buddies2705/538000dd91f3d99c6c6ed4200102bb0a to your computer and use it in GitHub Desktop.
Escrow Smart Contract
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.24; | |
import "../../math/SafeMath.sol"; | |
import "../../ownership/Secondary.sol"; | |
/** | |
* @title Escrow | |
* @dev Base escrow contract, holds funds designated for a payee until they | |
* withdraw them. | |
* @dev Intended usage: This contract (and derived escrow contracts) should be a | |
* standalone contract, that only interacts with the contract that instantiated | |
* it. That way, it is guaranteed that all Ether will be handled according to | |
* the Escrow rules, and there is no need to check for payable functions or | |
* transfers in the inheritance tree. The contract that uses the escrow as its | |
* payment method should be its primary, and provide public methods redirecting | |
* to the escrow's deposit and withdraw. | |
*/ | |
contract Escrow is Secondary { | |
using SafeMath for uint256; | |
event Deposited(address indexed payee, uint256 weiAmount); | |
event Withdrawn(address indexed payee, uint256 weiAmount); | |
mapping(address => uint256) private _deposits; | |
function depositsOf(address payee) public view returns (uint256) { | |
return _deposits[payee]; | |
} | |
/** | |
* @dev Stores the sent amount as credit to be withdrawn. | |
* @param payee The destination address of the funds. | |
*/ | |
function deposit(address payee) public onlyPrimary payable { | |
uint256 amount = msg.value; | |
_deposits[payee] = _deposits[payee].add(amount); | |
emit Deposited(payee, amount); | |
} | |
/** | |
* @dev Withdraw accumulated balance for a payee. | |
* @param payee The address whose funds will be withdrawn and transferred to. | |
*/ | |
function withdraw(address payee) public onlyPrimary { | |
uint256 payment = _deposits[payee]; | |
_deposits[payee] = 0; | |
payee.transfer(payment); | |
emit Withdrawn(payee, payment); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment