Selector Router
selector-router · discovery-registry · 1549 B runtime · registry-info
scores
- usefulness: 80
- safety: 70
- liveness: 70
- authenticity: 90
- extensibility: 55
- bytecodeDiscipline: 95
- practical: 75
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;
}
}