Skip to content

ERC1820Registry

ERC1820Registry

4 => bool)) internal erc165Cached;

Indicates a contract is the ‘implementer’ of ‘interfaceHash’ for ‘addr’. event InterfaceImplementerSet( address indexed addr, bytes32 indexed interfaceHash, address indexed impleme

getInterfaceImplementer(address _addr, bytes32 _interfaceHash) → address (external)

ntract which implements a specific interface for an address. Only the manager defined for that address can set it. (Each address is the manager for itself until it sets a new manager.)

setInterfaceImplementer(address _addr, bytes32 _interfaceHash, address _implementer) (external)

ementer) .canImplementInterfaceForAddress(_interfaceHash, addr) == ERC1820_ACCEPT_MAGIC, “Does not implement the interface” ); } interfaces[addr][_interfaceHash] = _implementer; emit InterfaceImplementerSet(addr, _interfaceHash, _implementer); }

Sets ‘_newManager’ as manager for ‘_addr’. The new manager will be able to call ‘setInterfaceImplementer’ for ‘_addr’.

setManager(address _addr, address _newManager) (external)

/ @return The keccak256 hash of an interface name. function interfaceHash(string calldata _interfaceName) external pure returns (bytes32) { return keccak256(abi.encodePacked(_interfaceName)); }

/* --- ERC165 Related Functions --- */
/* --- Developed in collabo

getManager(address _addr) → address (public)

pdate the cache. function updateERC165Cache(address _contract, bytes4 _interfaceId) external { interfaces[_contract][_interfaceId] = impleme

interfaceHash(string _interfaceName) → bytes32 (external)

If the result is not cached a direct lookup on the contract address is performed. // If the result is not cached or the cached value is out-of-date, the cache MUST be updated

updateERC165Cache(address _contract, bytes4 _interfaceId) (external)

ce(address _contract, bytes4 _interfaceId) public view returns (bool) { if (!erc165Cached[_contract][_interfaceId]) { return implementsERC165InterfaceNoCache(_contract, _interfaceId); }

implementsERC165Interface(address _contract, bytes4 _interfaceId) → bool (public)

; }

    (success, result) = noThrowCall(_contract, INVALID_ID);
    if (success == 0 || result != 0) {
        return false;
    }

    (success, result) = noTh

implementsERC165InterfaceNoCache(address _contract, bytes4 _interfaceId) → bool (public)

with 28 zeroes), false otherwise. function isERC165Interface(bytes32 _interfaceHash) internal pure returns (bool) { return _interfaceHash & 0x00000000FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF == 0; }

//

isERC165Interface(bytes32 _interfaceHash) → bool (internal)

ract, // To addr x, // Inputs are stored at location x 0x24, // Inputs are 36 (4 + 32) bytes long x, // Store output over input (saves space) 0x20 // Outputs are 32 bytes long

noThrowCall(address _contract, bytes4 _interfaceId) → uint256 success, uint256 result (internal)

InterfaceImplementerSet(address addr, bytes32 interfaceHash, address implementer)

_addr == address(0) ? msg.sender : _addr; if (isERC165Interface(_interfaceHa

ManagerChanged(address addr, address newManager)

ceHash) ? addr : address(0); }