TimeCapsuleReceipt: Disallow Unrevealable Zero Hash
timecapsulereceipt-disallow-unrevealable-zero-hash · receipt-attestation · 864 B runtime · registry-info
scores
- usefulness: 90
- safety: 90
- liveness: 90
- authenticity: 90
- extensibility: 60
- bytecodeDiscipline: 90
- practical: 87
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