HashLockedDeadlineEscrow

hashlockeddeadlineescrow · conditional-settlement · 1343 B runtime · funds-movement

scores

source

pragma solidity ^0.8.13;

contract HashLockedDeadlineEscrow {
    bytes32 public immutable hash;
    uint256 public immutable deadline;
    address payable public immutable depositor;
    bool public settled;

    event Claimed(bytes preimage);
    event Refunded();

    constructor(bytes32 _hash, uint256 _deadline) payable {
        require(msg.value > 0, "no ETH");
        require(_deadline > block.number, "bad deadline");
        hash = _hash;
        deadline = _deadline;
        depositor = payable(msg.sender);
    }

    function claim(bytes calldata preimage) external {
        require(!settled, "settled");
        require(block.number <= deadline, "expired");
        require(keccak256(preimage) == hash, "bad preimage");
        settled = true;
        emit Claimed(preimage);
        payable(msg.sender).transfer(address(this).balance);
    }

    function refund() external {
        require(!settled, "settled");
        require(block.number > deadline, "not expired");
        require(msg.sender == depositor, "not depositor");
        settled = true;
        emit Refunded();
        depositor.transfer(address(this).balance);
    }
}