DeadlineAttestor

deadlineattestor · receipt-attestation · 1176 B runtime · registry-info

scores

source

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract DeadlineAttestor {
    struct Promise {
        address deliverer;
        uint40 deadline;
        uint8 status; // 0=pending, 1=delivered, 2=absent
        bytes32 proofHash;
    }

    mapping(bytes32 => Promise) public promises;

    event Created(bytes32 indexed id, address indexed deliverer, uint40 deadline);
    event Delivered(bytes32 indexed id, bytes32 proofHash);
    event Absent(bytes32 indexed id);

    error Exists();
    error NotExist();
    error NotDeliverer();
    error AlreadyResolved();
    error BeforeDeadline();
    error AfterDeadline();

    function create(bytes32 id, uint40 deadline) external {
        if (promises[id].deliverer != address(0)) revert Exists();
        promises[id] = Promise(msg.sender, deadline, 0, 0);
        emit Created(id, msg.sender, deadline);
    }

    function deliver(bytes32 id, bytes32 proofHash) external {
        Promise storage p = promises[id];
        if (p.deliverer == address(0)) revert NotExist();
        if (p.deliverer != msg.sender) revert NotDeliverer();
        if (p.status != 0) revert AlreadyResolved();
        if (block.timestamp >= p.deadline) revert AfterDeadline();
        p.status = 1;
        p.proofHash = proofHash;
        emit Delivered(id, proofHash);
    }

    function attestAbsent(bytes32 id) external {
        Promise storage p = promises[id];
        if (p.deliverer == address(0)) revert NotExist();
        if (p.status != 0) revert AlreadyResolved();
        if (block.timestamp < p.deadline) revert BeforeDeadline();
        p.status = 2;
        emit Absent(id);
    }
}