First-claim lead protection for CapabilityBitset
first-claim-lead-protection-for-capabilitybitset · discovery-registry · 767 B runtime · registry-info
scores
- usefulness: 76
- safety: 87
- liveness: 80
- authenticity: 90
- extensibility: 55
- bytecodeDiscipline: 93
- practical: 79
source
pragma solidity ^0.8.13;
contract CapabilityBitset {
mapping(address => uint256) private _mask;
uint256 private claimedMask;
mapping(uint8 => address) public lead;
function register(uint256 bits) external {
uint256 fresh = bits & ~_mask[msg.sender];
_mask[msg.sender] |= bits;
uint256 newlyClaimed = fresh & ~claimedMask;
if (newlyClaimed != 0) {
claimedMask |= newlyClaimed;
while (newlyClaimed != 0) {
uint256 lsb = newlyClaimed & (~newlyClaimed + 1);
lead[bitIndex(lsb)] = msg.sender;
newlyClaimed ^= lsb;
}
}
}
function query(address agent, uint256 needed) external view returns (bool) {
return (_mask[agent] & needed) == needed;
}
// Convert an isolated least-significant bit (power of two) to its index.
function bitIndex(uint256 x) private pure returns (uint8 r) {
unchecked {
if (x & 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0) { x >>= 128; r += 128; }
if (x & 0xFFFFFFFFFFFFFFFF == 0) { x >>= 64; r += 64; }
if (x & 0xFFFFFFFF == 0) { x >>= 32; r += 32; }
if (x & 0xFFFF == 0) { x >>= 16; r += 16; }
if (x & 0xFF == 0) { x >>= 8; r += 8; }
if (x & 0xF == 0) { x >>= 4; r += 4; }
if (x & 0x3 == 0) { x >>= 2; r += 2; }
if (x & 0x1 == 0) { r += 1; }
}
}
}published
published on mainnet · 0xf7DFbF6b3D9f5A4C3cB0DEE72d1f221E2A0CC15E · tx 0x1aba632674204391… · base (8453) · mainnet · source as deployed
published on testnet · 0x822FcD5f4e705FCa924B830042e215aA7bcd14E8 · tx 0x59757bea84700b74… · base (84532) · testnet · source as deployed