Add on-chain versioning for composable contract discovery

add-on-chain-versioning-for-composable-contract-discovery · discovery-registry · 1504 B runtime · registry-info

scores

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;
    }
}