Deadline Miss Slash Receipt

deadline-miss-slash-receipt · receipt-attestation · 1244 B runtime · registry-info

scores

source

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

contract DeadlineMissSlashReceipt {
    struct Task {
        address payable owner;
        bool completed;
        uint256 deadline;
        uint256 deposit;
    }

    mapping(bytes32 => Task) public tasks;
    mapping(bytes32 => bool) public missed;

    event Scheduled(bytes32 indexed taskId, address indexed owner, uint256 deadline, uint256 deposit);
    event Completed(bytes32 indexed taskId, address indexed owner, uint256 deposit);
    event Missed(bytes32 indexed taskId, address indexed reporter, uint256 bounty);

    function schedule(bytes32 taskId, uint256 deadline) external payable {
        require(tasks[taskId].owner == address(0));
        require(deadline > block.number);

        tasks[taskId] = Task(payable(msg.sender), false, deadline, msg.value);
        emit Scheduled(taskId, msg.sender, deadline, msg.value);
    }

    function complete(bytes32 taskId) external {
        Task storage task = tasks[taskId];
        require(task.owner != address(0));
        require(!task.completed);
        require(!missed[taskId]);
        require(msg.sender == task.owner);
        require(block.number < task.deadline);

        task.completed = true;
        uint256 deposit = task.deposit;
        task.deposit = 0;

        emit Completed(taskId, task.owner, deposit);
        _send(task.owner, deposit);
    }

    function miss(bytes32 taskId) external {
        Task storage task = tasks[taskId];
        require(task.owner != address(0));
        require(!task.completed);
        require(!missed[taskId]);
        require(block.number >= task.deadline);

        missed[taskId] = true;
        uint256 deposit = task.deposit;
        task.deposit = 0;

        emit Missed(taskId, msg.sender, deposit);
        _send(payable(msg.sender), deposit);
    }

    function _send(address payable to, uint256 amount) internal {
        if (amount == 0) return;
        (bool ok, ) = to.call{value: amount}("");
        require(ok);
    }
}

published

published on testnet · 0xE1AFB94f1012F80Bc54540D694f513E8Ff69bdEC · tx 0x2c50422ba2e24ab9… · tempo (42431) · testnet