You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
83 lines
2.8 KiB
83 lines
2.8 KiB
pragma solidity ^0.5.0;
|
|
|
|
import "../../math/SafeMath.sol";
|
|
import "../../ownership/Secondary.sol";
|
|
import "../../utils/Address.sol";
|
|
|
|
/**
|
|
* @title Escrow
|
|
* @dev Base escrow contract, holds funds designated for a payee until they
|
|
* withdraw them.
|
|
*
|
|
* 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;
|
|
using Address for address payable;
|
|
|
|
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, forwarding 2300 gas (a
|
|
* Solidity `transfer`).
|
|
*
|
|
* NOTE: This function has been deprecated, use {withdrawWithGas} instead.
|
|
* Calling contracts with fixed-gas limits is an anti-pattern and may break
|
|
* contract interactions in network upgrades (hardforks).
|
|
* https://diligence.consensys.net/blog/2019/09/stop-using-soliditys-transfer-now/[Learn more.]
|
|
*
|
|
* @param payee The address whose funds will be withdrawn and transferred to.
|
|
*/
|
|
function withdraw(address payable payee) public onlyPrimary {
|
|
uint256 payment = _deposits[payee];
|
|
|
|
_deposits[payee] = 0;
|
|
|
|
payee.transfer(payment);
|
|
|
|
emit Withdrawn(payee, payment);
|
|
}
|
|
|
|
/**
|
|
* @dev Same as {withdraw}, but forwarding all gas to the recipient.
|
|
*
|
|
* WARNING: Forwarding all gas opens the door to reentrancy vulnerabilities.
|
|
* Make sure you trust the recipient, or are either following the
|
|
* checks-effects-interactions pattern or using {ReentrancyGuard}.
|
|
*
|
|
* _Available since v2.4.0._
|
|
*/
|
|
function withdrawWithGas(address payable payee) public onlyPrimary {
|
|
uint256 payment = _deposits[payee];
|
|
|
|
_deposits[payee] = 0;
|
|
|
|
payee.sendValue(payment);
|
|
|
|
emit Withdrawn(payee, payment);
|
|
}
|
|
}
|
|
|