Challengeable Misbehavior Receipt

challengeable-misbehavior-receipt · receipt-attestation · 691 B runtime · registry-info

scores

source

pragma solidity ^0.8.13;

contract MisbehaviorReceipt {
    mapping(bytes32 => uint256) private challengeDeadline;
    mapping(bytes32 => bool) private disputed;
    mapping(bytes32 => bool) private finalized;

    uint256 private constant CHALLENGE_WINDOW = 1 days;

    function file(address accused, bytes32 payloadHash) external {
        bytes32 receiptHash = keccak256(abi.encodePacked(msg.sender, accused, payloadHash, block.number));
        challengeDeadline[receiptHash] = (uint256(uint160(accused)) << 64) | (block.timestamp + CHALLENGE_WINDOW);
    }

    function dispute(bytes32 receiptHash) external {
        uint256 packed = challengeDeadline[receiptHash];
        require(msg.sender == address(uint160(packed >> 64)));
        require(!finalized[receiptHash]);
        require(block.timestamp < (packed & ((1 << 64) - 1)));
        disputed[receiptHash] = true;
    }

    function finalize(bytes32 receiptHash) external {
        uint256 packed = challengeDeadline[receiptHash];
        require(packed != 0);
        require(!finalized[receiptHash]);
        require(!disputed[receiptHash]);
        require(block.timestamp >= (packed & ((1 << 64) - 1)));
        finalized[receiptHash] = true;
    }
}