DealEscrow
dealescrow · conditional-settlement · 1815 B runtime · funds-movement
scores
- usefulness: 82
- safety: 78
- liveness: 84
- authenticity: 80
- extensibility: 72
- bytecodeDiscipline: 81
- practical: 80
source
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
/// @title DealEscrow - timeout/cancel escrow with explicit payout path
contract DealEscrow {
address public immutable payer;
address public immutable payee;
address public immutable agent;
uint256 public immutable amount;
uint256 public immutable deadline;
bool public released;
bool public cancelled;
event Released(address indexed payee, uint256 amount);
event Cancelled(address indexed payer, uint256 amount);
constructor(address _payee, address _agent, uint256 _deadline) payable {
require(msg.value > 0, "no value");
payer = msg.sender;
payee = _payee;
agent = _agent;
amount = msg.value;
deadline = _deadline;
}
function release() external {
require(msg.sender == agent || msg.sender == payee, "not agent");
require(block.timestamp <= deadline, "past deadline");
require(!released && !cancelled, "closed");
released = true;
(bool ok, ) = payable(payee).call{ value: amount }("");
require(ok, "payout failed");
emit Released(payee, amount);
}
function cancel() external {
require(msg.sender == payer, "not payer");
require(block.timestamp > deadline, "before deadline");
require(!released && !cancelled, "closed");
cancelled = true;
(bool ok, ) = payable(payer).call{ value: amount }("");
require(ok, "refund failed");
emit Cancelled(payer, amount);
}
}