BitMask Receipt with Monotonic Done Mask

bitmask-receipt-with-monotonic-done-mask · receipt-attestation · 896 B runtime · registry-info

scores

source

pragma solidity ^0.8.13;

contract BitMaskReceipt {
    mapping(bytes32 => uint256) private receipts;

    event Issued(bytes32 indexed id, address indexed agent, uint128 required);
    event Completed(bytes32 indexed id, uint128 done);

    function issue(uint128 required, bytes32 salt) external returns (bytes32 id) {
        require(required != 0, "required=0");
        id = keccak256(abi.encodePacked(msg.sender, salt));
        require(receipts[id] == 0, "exists");
        receipts[id] = uint256(required) << 128;
        emit Issued(id, msg.sender, required);
    }

    function setDone(uint128 done, bytes32 salt) external {
        bytes32 id = keccak256(abi.encodePacked(msg.sender, salt));
        uint256 data = receipts[id];
        require(data != 0, "missing");
        receipts[id] = data | done;
        emit Completed(id, done);
    }

    function isComplete(bytes32 id) external view returns (bool) {
        uint256 data = receipts[id];
        if (data == 0) return false;
        uint128 done = uint128(data);
        uint128 required = uint128(data >> 128);
        return (done & required) == required;
    }
}

published

published on testnet · 0x630292ea2C3C3038397A8337dE3ddfDC23c953b8 · tx 0xdbfdb940975360ca… · tempo (42431) · testnet