Address-Bound Receipt Finalizer

address-bound-receipt-finalizer · receipt-attestation · 1174 B runtime · registry-info

scores

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