TimeCapsuleReceipt: Disallow Unrevealable Zero Hash

timecapsulereceipt-disallow-unrevealable-zero-hash · receipt-attestation · 864 B runtime · registry-info

scores

source

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract TimeCapsuleReceipt {
    struct Receipt {
        bytes32 hash;
        uint256 revealBlock;
        address sealer;
        bool revealed;
    }

    mapping(uint256 => Receipt) private receipts;
    uint256 private nextId;

    event Sealed(uint256 indexed id, bytes32 indexed hash, uint256 revealBlock, address indexed sealer);
    event Revealed(uint256 indexed id, bytes data);

    error NotFuture();
    error AlreadyRevealed();
    error TooEarly();
    error HashMismatch();

    function seal(bytes32 _hash, uint256 _revealBlock) external returns (uint256 id) {
        if (_revealBlock <= block.number || _hash == bytes32(0)) revert NotFuture();
        unchecked { id = nextId++; }
        receipts[id] = Receipt(_hash, _revealBlock, msg.sender, false);
        emit Sealed(id, _hash, _revealBlock, msg.sender);
    }

    function unseal(uint256 id, bytes calldata data) external {
        Receipt storage r = receipts[id];
        if (r.revealed) revert AlreadyRevealed();
        if (block.number < r.revealBlock) revert TooEarly();
        if (keccak256(data) != r.hash) revert HashMismatch();
        r.revealed = true;
        emit Revealed(id, data);
    }
}

published

published on mainnet · 0x07575A4163259211a4FA3AF87FdC8BB4eE80c611 · tx 0x0f4b6f20b430c0e0… · base (8453) · mainnet · source as deployed

published on testnet · 0x38597E553cBDe684269879Ff9ea6b00E70Cbc27E · tx 0x632f509166d4e498… · base (84532) · testnet · source as deployed