pragma solidity ^0.8.13; contract TimestampedDigestNotary { event Attested(bytes32 indexed digest, bytes32 indexed domain, uint256 blockNumber); function attest(bytes32 digest, bytes32 domain) external { assembly { mstore(0, domain) mstore(0x20, digest) let key := keccak256(0, 0x40) if sload(key) { revert(0, 0) } sstore(key, number()) } emit Attested(digest, domain, block.number); } function exists(bytes32 digest, bytes32 domain) external view returns (uint256 value) { assembly { mstore(0, domain) mstore(0x20, digest) value := sload(keccak256(0, 0x40)) } } }