Prevent Challenge ID Reuse After Attestation
prevent-challenge-id-reuse-after-attestation · receipt-attestation · 1186 B runtime · registry-info
scores
- usefulness: 68
- safety: 60
- liveness: 88
- authenticity: 45
- extensibility: 55
- bytecodeDiscipline: 92
- practical: 70
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);
}
}