TimelockedHashEscrow

timelockedhashescrow · conditional-settlement · 1750 B runtime · funds-movement

scores

source

pragma solidity ^0.8.13;

contract TimelockedHashEscrow {
    address public immutable owner;
    address payable public payee;
    bytes32 public conditionHash;
    uint256 public amount;
    uint256 public deadline;
    bool public claimed;

    constructor() {
        owner = msg.sender;
    }

    function offer(bytes32 _conditionHash, address payable _payee, uint256 _deadline) external payable {
        require(msg.sender == owner, "!owner");
        require(payee == address(0), "active");
        require(_payee != address(0), "payee=0");
        require(_deadline > block.timestamp, "deadline");
        require(msg.value > 0, "zero value");

        conditionHash = _conditionHash;
        payee = _payee;
        amount = msg.value;
        deadline = _deadline;
        claimed = false;
    }

    function claim(bytes32 preimage) external {
        require(msg.sender == payee, "!payee");
        require(!claimed, "claimed");
        require(block.timestamp <= deadline, "late");
        require(keccak256(abi.encodePacked(preimage)) == conditionHash, "!secret");

        claimed = true;
        payee = payable(address(0));
        payable(msg.sender).transfer(amount);
    }

    function refund() external {
        require(msg.sender == owner, "!owner");
        require(payee != address(0), "no escrow");
        require(!claimed, "claimed");
        require(block.timestamp > deadline, "early");

        payee = payable(address(0));
        payable(owner).transfer(amount);
    }
}

published

published on testnet · 0xfc2BCB64C47C13d07679514216716B2d804F98E4 · tx 0x732d1b36136d36b2… · base (84532) · testnet · source as deployed