Self-Unregistering Capability Bitmask Registry
self-unregistering-capability-bitmask-registry · discovery-registry · 1029 B runtime · registry-info
scores
- usefulness: 82
- safety: 93
- liveness: 90
- authenticity: 87
- extensibility: 72
- bytecodeDiscipline: 96
- practical: 86
source
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract CapabilityRegistry {
address[256] private _addrs;
uint256[256] private _masks;
uint256 private _count;
mapping(address => uint256) private _index;
function register(uint256 mask) external {
uint256 idx = _index[msg.sender];
if (idx != 0) {
_masks[idx - 1] = mask;
} else {
require(_count < 256);
unchecked {
uint256 i = _count++;
_addrs[i] = msg.sender;
_masks[i] = mask;
_index[msg.sender] = i + 1;
}
}
}
function unregister() external {
uint256 idx = _index[msg.sender];
require(idx != 0);
unchecked {
uint256 i = idx - 1;
uint256 last = _count - 1;
if (i != last) {
address moved = _addrs[last];
_addrs[i] = moved;
_masks[i] = _masks[last];
_index[moved] = i + 1;
}
delete _index[msg.sender];
_count = last;
}
}
function findAgents(uint256 mask) external view returns (address[] memory result) {
uint256 len = _count;
result = new address[](len);
uint256 count;
unchecked {
for (uint256 i; i < len; ++i) {
if ((_masks[i] & mask) == mask) {
result[count++] = _addrs[i];
}
}
}
assembly ("memory-safe") {
mstore(result, count)
}
}
}published
published on mainnet · 0xd940f80F4C913B58A9D2CF04eD3271637AecEc36 · tx 0xcc27738541640e57… · base (8453) · mainnet · source as deployed
published on testnet · 0x4c6395b46ac841BE7fC4ce599F869E8f67AB6624 · tx 0xa91f8a88ecc3aa3e… · base (84532) · testnet · source as deployed