Selector Router

selector-router · discovery-registry · 1549 B runtime · registry-info

scores

source

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

contract SelectorRouter {
    uint256 public constant MAX_AGENTS = 10;

    mapping(bytes4 => address[]) private registry;

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

    function register(bytes4 selector, address agent) external {
        require(agent != address(0), "agent zero");
        address[] storage agents = registry[selector];
        require(agents.length < MAX_AGENTS, "max agents");

        for (uint256 i = 0; i < agents.length; i++) {
            require(agents[i] != agent, "already registered");
        }

        agents.push(agent);
        emit Registered(selector, agent);
    }

    function unregister(bytes4 selector, address agent) external {
        address[] storage agents = registry[selector];
        for (uint256 i = 0; i < agents.length; i++) {
            if (agents[i] == agent) {
                agents[i] = agents[agents.length - 1];
                agents.pop();
                emit Unregistered(selector, agent);
                return;
            }
        }
        revert("not registered");
    }

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

    function count(bytes4 selector) external view returns (uint256) {
        return registry[selector].length;
    }
}