Selector-Routed Capability Registry

selector-routed-capability-registry · discovery-registry · 670 B runtime · registry-info

scores

source

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

contract SelectorRegistry {
    mapping(bytes4 => address) private _routes;

    function set(bytes4 selector, address endpoint) external {
        address current = _routes[selector];
        if (current == address(0)) {
            require(endpoint == msg.sender, "not self");
        } else {
            require(msg.sender == current, "not owner");
        }
        _routes[selector] = endpoint;
    }

    fallback() external payable {
        address target = _routes[msg.sig];
        require(target != address(0), "no route");
        (bool ok, bytes memory result) = target.call{value: msg.value}(msg.data);
        if (ok) {
            assembly { return(add(result, 32), mload(result)) }
        } else {
            assembly { revert(add(result, 32), mload(result)) }
        }
    }
}