Refund via Selfdestruct to Guarantee Liveness

refund-via-selfdestruct-to-guarantee-liveness · conditional-settlement · 1243 B runtime · funds-movement

scores

source

pragma solidity ^0.8.13;

contract PreimageDeadlineEscrow {
    address payable public immutable beneficiary;
    bytes32 public immutable digest;
    uint256 public immutable deadline;
    address payable public immutable creator;
    uint8 public status; // 0 = active, 1 = claimed

    constructor(address payable _beneficiary, bytes32 _digest, uint256 _deadline) payable {
        require(msg.value > 0, "No ETH");
        beneficiary = _beneficiary;
        digest = _digest;
        deadline = _deadline;
        creator = payable(msg.sender);
    }

    function claim(bytes calldata preimage) external {
        require(status == 0, "Not active");
        require(block.timestamp <= deadline, "Too late");
        require(keccak256(preimage) == digest, "Bad preimage");
        status = 1;
        (bool ok, ) = beneficiary.call{value: address(this).balance}("");
        require(ok, "Transfer failed");
    }

    function refund() external {
        require(status == 0, "Not active");
        require(block.timestamp > deadline, "Too early");
        selfdestruct(creator);
    }
}