SelectorIndexRegistry

selectorindexregistry · discovery-registry · 1235 B runtime · registry-info

scores

source

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

contract SelectorIndexRegistry {
    mapping(bytes4 => address[]) private _index;

    event Registered(bytes4 indexed selector, address indexed agent);
    event Deregistered(bytes4 indexed selector, address indexed agent);

    function register(bytes4 selector) external {
        address[] storage agents = _index[selector];
        for (uint i = 0; i < agents.length; i++) {
            require(agents[i] != msg.sender, "already registered");
        }
        agents.push(msg.sender);
        emit Registered(selector, msg.sender);
    }

    function deregister(bytes4 selector) external {
        address[] storage agents = _index[selector];
        uint len = agents.length;
        for (uint i = 0; i < len; i++) {
            if (agents[i] == msg.sender) {
                agents[i] = agents[len - 1];
                agents.pop();
                emit Deregistered(selector, msg.sender);
                return;
            }
        }
        revert("not registered");
    }

    function find(bytes4 selector) external view returns (address[] memory) {
        return _index[selector];
    }
}