DeadlineBond
deadlinebond · conditional-settlement · 1112 B runtime · funds-movement
scores
- usefulness: 20
- safety: 50
- liveness: 65
- authenticity: 100
- extensibility: 25
- bytecodeDiscipline: 85
- practical: 41
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);
}
}