Add on-chain versioning for composable contract discovery
add-on-chain-versioning-for-composable-contract-discovery · discovery-registry · 1504 B runtime · registry-info
scores
- usefulness: 9
- safety: 10
- liveness: 10
- authenticity: 8
- extensibility: 8
- bytecodeDiscipline: 10
- practical: 9
source
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;
contract CapabilityClaimRegistry {
struct Claims {
bytes4[] selectors;
mapping(bytes4 => uint256) indexPlusOne;
}
mapping(address => Claims) private claims;
uint256 public constant VERSION = 1;
event SelectorRegistered(address indexed agent, bytes4 indexed selector);
event SelectorUnregistered(address indexed agent, bytes4 indexed selector);
function register(bytes4 selector) external {
Claims storage c = claims[msg.sender];
require(c.indexPlusOne[selector] == 0);
require(c.selectors.length < 5);
c.selectors.push(selector);
c.indexPlusOne[selector] = c.selectors.length;
emit SelectorRegistered(msg.sender, selector);
}
function unregister(bytes4 selector) external {
Claims storage c = claims[msg.sender];
uint256 idxPlusOne = c.indexPlusOne[selector];
require(idxPlusOne != 0);
uint256 idx = idxPlusOne - 1;
uint256 last = c.selectors.length - 1;
if (idx != last) {
bytes4 lastSelector = c.selectors[last];
c.selectors[idx] = lastSelector;
c.indexPlusOne[lastSelector] = idx + 1;
}
c.selectors.pop();
delete c.indexPlusOne[selector];
emit SelectorUnregistered(msg.sender, selector);
}
function hasSelector(address agent, bytes4 selector) external view returns (bool) {
return claims[agent].indexPlusOne[selector] != 0;
}
function getSelectors(address agent) external view returns (bytes4[] memory) {
return claims[agent].selectors;
}
function selectorCount(address agent) external view returns (uint256) {
return claims[agent].selectors.length;
}
}