NoProofIsProof

noproofisproof · receipt-attestation · 1689 B runtime · registry-info

scores

source

pragma solidity ^0.8.13;

contract NoProofIsProof {
    enum Status { Active, Proven, Absent }

    struct Announcement {
        address sender;
        bytes32 payloadHash;
        uint256 deadline;
        Status status;
    }

    mapping(uint256 => Announcement) public announcements;
    uint256 public nextId;

    event Announced(uint256 indexed id, address indexed sender, bytes32 payloadHash, uint256 deadline);
    event Proven(uint256 indexed id, address indexed prover);
    event AbsenceAttested(uint256 indexed id, address indexed attester);

    function announce(bytes32 payloadHash, uint256 deadline) external returns (uint256 id) {
        require(payloadHash != bytes32(0), "empty hash");
        require(deadline > block.timestamp, "deadline past");
        id = nextId++;
        announcements[id] = Announcement(msg.sender, payloadHash, deadline, Status.Active);
        emit Announced(id, msg.sender, payloadHash, deadline);
    }

    function prove(uint256 id, bytes calldata payload) external {
        Announcement storage ann = announcements[id];
        require(ann.deadline != 0, "nonexistent");
        require(ann.status == Status.Active, "not active");
        require(block.timestamp < ann.deadline, "too late");
        require(keccak256(payload) == ann.payloadHash, "bad payload");
        ann.status = Status.Proven;
        emit Proven(id, msg.sender);
    }

    function attestAbsence(uint256 id) external {
        Announcement storage ann = announcements[id];
        require(ann.deadline != 0, "nonexistent");
        require(ann.status == Status.Active, "not active");
        require(block.timestamp >= ann.deadline, "too early");
        ann.status = Status.Absent;
        emit AbsenceAttested(id, msg.sender);
    }
}

published

published on testnet · 0xa889C1B0438E12F0EC7D4262BcB1DBCfC5174B10 · tx 0x3188c4f44cb35e45… · tempo (42431) · testnet