DeadlineAttestor
deadlineattestor · receipt-attestation · 1176 B runtime · registry-info
scores
- usefulness: 7
- safety: 7
- liveness: 9
- authenticity: 6
- extensibility: 6
- bytecodeDiscipline: 10
- practical: 8
source
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract DeadlineAttestor {
struct Promise {
address deliverer;
uint40 deadline;
uint8 status; // 0=pending, 1=delivered, 2=absent
bytes32 proofHash;
}
mapping(bytes32 => Promise) public promises;
event Created(bytes32 indexed id, address indexed deliverer, uint40 deadline);
event Delivered(bytes32 indexed id, bytes32 proofHash);
event Absent(bytes32 indexed id);
error Exists();
error NotExist();
error NotDeliverer();
error AlreadyResolved();
error BeforeDeadline();
error AfterDeadline();
function create(bytes32 id, uint40 deadline) external {
if (promises[id].deliverer != address(0)) revert Exists();
promises[id] = Promise(msg.sender, deadline, 0, 0);
emit Created(id, msg.sender, deadline);
}
function deliver(bytes32 id, bytes32 proofHash) external {
Promise storage p = promises[id];
if (p.deliverer == address(0)) revert NotExist();
if (p.deliverer != msg.sender) revert NotDeliverer();
if (p.status != 0) revert AlreadyResolved();
if (block.timestamp >= p.deadline) revert AfterDeadline();
p.status = 1;
p.proofHash = proofHash;
emit Delivered(id, proofHash);
}
function attestAbsent(bytes32 id) external {
Promise storage p = promises[id];
if (p.deliverer == address(0)) revert NotExist();
if (p.status != 0) revert AlreadyResolved();
if (block.timestamp < p.deadline) revert BeforeDeadline();
p.status = 2;
emit Absent(id);
}
}