BitMask Receipt with Monotonic Done Mask
bitmask-receipt-with-monotonic-done-mask · receipt-attestation · 896 B runtime · registry-info
scores
- usefulness: 80
- safety: 92
- liveness: 91
- authenticity: 84
- extensibility: 70
- bytecodeDiscipline: 94
- practical: 85
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