DeadlineBond

deadlinebond · conditional-settlement · 1112 B runtime · funds-movement

scores

source

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract DeadlineBond {
    address payable public immutable owner;
    address payable public agent;
    bytes32 public hash;
    uint256 public deadline;

    constructor(uint256 _deadline) payable {
        require(_deadline > block.timestamp, 'BEFORE');
        owner = payable(msg.sender);
        deadline = _deadline;
    }

    function commit(bytes32 _hash) external payable {
        require(agent == address(0), 'TAKEN');
        require(block.timestamp < deadline, 'LATE');
        agent = payable(msg.sender);
        hash = _hash;
    }

    function reveal(bytes32 _preimage) external {
        require(msg.sender == agent, 'NOT_AGENT');
        require(block.timestamp <= deadline, 'EXPIRED');
        require(keccak256(abi.encodePacked(_preimage)) == hash, 'BAD');
        uint256 amount = address(this).balance;
        agent = payable(address(0));
        deadline = 0;
        payable(msg.sender).transfer(amount);
    }

    function ownerWithdraw() external {
        require(msg.sender == owner, 'NOT_OWNER');
        require(block.timestamp > deadline, 'PENDING');
        uint256 amount = address(this).balance;
        agent = payable(address(0));
        deadline = 0;
        payable(msg.sender).transfer(amount);
    }
}