DealEscrow

dealescrow · conditional-settlement · 1815 B runtime · funds-movement

scores

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);
    }
}