pragma solidity >=0.8.0; // Author: Louis Holbrook 0826EDA1702D1E87C6E2875121D2E7BB88C2A746 // SPDX-License-Identifier: AGPL-3.0-or-later // File-version: 4 // Description: Keyed smart contract registry contract ContractRegistry { mapping (bytes32 => address) entries; // Implements ERC173 address public owner; // Implements Registry bytes32[] public identifier; // Implements ERC173 event OwnershipTransferred(address indexed _previousOwner, address indexed _newOwner); // Implements Registry event AddressKey(bytes32 indexed _key, address _address); constructor(bytes32[] memory _identifiers) { owner = msg.sender; for (uint i = 0; i < _identifiers.length; i++) { identifier.push(_identifiers[i]); } } // Assign address to identifier function set(bytes32 _identifier, address _address) public returns (bool) { require(msg.sender == owner); require(entries[_identifier] == address(0)); require(_address != address(0)); bool found = false; for (uint i = 0; i < identifier.length; i++) { if (identifier[i] == _identifier) { found = true; } } require(found); entries[_identifier] = _address; emit AddressKey(_identifier, _address); return true; } // Implements EIP 173 function transferOwnership(address _newOwner) public returns (bool) { address _oldOwner; require(msg.sender == owner, 'ERR_AXX'); _oldOwner = owner; owner = _newOwner; emit OwnershipTransferred(_oldOwner, _newOwner); return true; } // Implements Registry function addressOf(bytes32 _identifier) public view returns (address) { return entries[_identifier]; } // Implements Registry function identifierCount() public view returns(uint256) { return identifier.length; } // Implements ERC165 function supportsInterface(bytes4 _sum) public pure returns (bool) { if (_sum == 0xeffbf671) { // Registry return true; } if (_sum == 0x01ffc9a7) { // ERC165 return true; } if (_sum == 0x9493f8b2) { // ERC173 return true; } return false; } }