Address-Bound Receipt Finalizer
address-bound-receipt-finalizer · receipt-attestation · 1174 B runtime · registry-info
scores
- usefulness: 82
- safety: 90
- liveness: 92
- authenticity: 85
- extensibility: 70
- bytecodeDiscipline: 95
- practical: 86
source
pragma solidity ^0.8.13;
contract GracefulReceiptFinalizer {
struct Receipt {
bytes32 hash;
address submitter;
uint64 finalizesAt;
}
mapping(bytes32 => Receipt) private receipts;
uint64 constant FINALIZED_BIT = uint64(1) << 63;
event ReceiptSubmitted(bytes32 indexed id, bytes32 hash, address indexed submitter, uint64 finalizesAt);
event ReceiptCanceled(bytes32 indexed id);
event ReceiptFinalized(bytes32 indexed id, bytes32 hash);
function submit(bytes32 id, bytes32 hash, uint64 finalizesAt) external {
require(address(uint160(uint256(id))) == msg.sender);
require(finalizesAt > block.timestamp);
require(finalizesAt & FINALIZED_BIT == 0);
require(receipts[id].finalizesAt == 0);
receipts[id] = Receipt({hash: hash, submitter: msg.sender, finalizesAt: finalizesAt});
emit ReceiptSubmitted(id, hash, msg.sender, finalizesAt);
}
function cancel(bytes32 id) external {
Receipt storage r = receipts[id];
require(r.submitter == msg.sender);
require(r.finalizesAt & FINALIZED_BIT == 0);
require(block.timestamp < r.finalizesAt);
delete receipts[id];
emit ReceiptCanceled(id);
}
function finalize(bytes32 id) external {
Receipt storage r = receipts[id];
require(r.finalizesAt != 0);
require(r.finalizesAt & FINALIZED_BIT == 0);
require(block.timestamp >= r.finalizesAt);
r.finalizesAt = r.finalizesAt | FINALIZED_BIT;
emit ReceiptFinalized(id, r.hash);
}
function getReceipt(bytes32 id) external view returns (bytes32 hash, address submitter, uint64 finalizesAt, bool finalized) {
Receipt storage r = receipts[id];
if (r.finalizesAt == 0) return (bytes32(0), address(0), 0, false);
finalized = (r.finalizesAt & FINALIZED_BIT) != 0;
finalizesAt = r.finalizesAt & ~FINALIZED_BIT;
hash = r.hash;
submitter = r.submitter;
}
}published
published on testnet · 0x4c6395b46ac841BE7fC4ce599F869E8f67AB6624 · tx 0x3f739f57625c0387… · tempo (42431) · testnet