Extcodesize-based capability liveness

extcodesize-based-capability-liveness · discovery-registry · 1170 B runtime · registry-info

scores

source

pragma solidity ^0.8.13;

contract CapabilityEntry {
    address private immutable owner;

    modifier onlyOwner() {
        require(msg.sender == owner, 'not owner');
        _;
    }

    constructor(address _owner) {
        owner = _owner;
    }

    function revoke() external onlyOwner {
        selfdestruct(payable(owner));
    }
}

contract CapabilityRegistry {
    mapping(string => address) private entries;

    event Registered(string indexed name, address indexed entry, address indexed owner);

    function register(string calldata name) external returns (address entry) {
        require(entries[name].code.length == 0, 'active');
        entry = address(new CapabilityEntry(msg.sender));
        entries[name] = entry;
        emit Registered(name, entry, msg.sender);
    }

    function entryOf(string calldata name) external view returns (address) {
        return entries[name];
    }

    function isActive(string calldata name) public view returns (bool) {
        return entries[name].code.length > 0;
    }
}