pragma solidity ^0.4.24; import "../math/SafeMath.sol"; import "../ownership/Secondary.sol"; /** * @title Escrow * @dev Base escrow contract, holds funds destinated to a payee until they * withdraw them. 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]; assert(address(this).balance >= payment); deposits_[_payee] = 0; _payee.transfer(payment); emit Withdrawn(_payee, payment); } }