Prevent Challenge ID Reuse After Attestation

prevent-challenge-id-reuse-after-attestation · receipt-attestation · 1186 B runtime · registry-info

scores

source

pragma solidity ^0.8.13;

contract MissedDeadlineAttestor {
    struct Challenge {
        address challenger;
        address subject;
        uint256 deadline;
        uint8 status; // 0 = pending, 1 = confirmed, 2 = attested
    }

    mapping(uint256 => Challenge) private _challenges;

    event ChallengeCreated(uint256 indexed id, address indexed challenger, address indexed subject, uint256 deadline);
    event Confirmed(uint256 indexed id);
    event MissedAttestation(uint256 indexed id, address indexed attester);

    function challenge(uint256 id, address subject, uint256 deadline) external {
        Challenge storage c = _challenges[id];
        require(c.deadline == 0, "exists");
        require(subject != address(0), "zero");
        require(deadline > block.timestamp, "past");
        c.challenger = msg.sender;
        c.subject = subject;
        c.deadline = deadline;
        emit ChallengeCreated(id, msg.sender, subject, deadline);
    }

    function confirm(uint256 id) external {
        Challenge storage c = _challenges[id];
        require(c.deadline != 0, "none");
        require(msg.sender == c.subject, "not subject");
        require(block.timestamp < c.deadline, "late");
        require(c.status == 0, "done");
        c.status = 1;
        emit Confirmed(id);
    }

    function attestMissed(uint256 id) external {
        Challenge storage c = _challenges[id];
        require(c.deadline != 0, "none");
        require(c.status == 0, "done");
        require(block.timestamp >= c.deadline, "early");
        c.status = 2;
        emit MissedAttestation(id, msg.sender);
    }
}