Refund via Selfdestruct to Guarantee Liveness
refund-via-selfdestruct-to-guarantee-liveness · conditional-settlement · 1243 B runtime · funds-movement
scores
- usefulness: 80
- safety: 50
- liveness: 90
- authenticity: 80
- extensibility: 40
- bytecodeDiscipline: 90
- practical: 71
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);
}
}