pragmasolidity^0.8.12;import"./IERC7406Interface.sol";contractERC7406{structRecord{addressowner;addressresolver;}// A map is used to record namespace existence
// 使用 map 来记录命名空间是否存在
mapping(byte32=>uint)namespaces;mapping(bytes32=>mapping(bytes32=>Record))records;eventNewOwner(bytes32indexednamespace,bytes32indexedkey,addressowner);eventTransfer(bytes32indexednamespace,bytes32indexedkey,addressowner);eventNewResolver(bytes32indexednamespace,bytes32indexedkey,addressresolver);eventNewNamespace(bytes32namespace)modifieronly_owner(bytes32namespace,bytes32key){if(records[namespace][key].owner!=msg.sender)throw;_}modifieronly_approver(){if(records[0][0].owner!=msg.sender)throw;_}functionERC7406(addressapprover){records[0][0].owner=approver;}functionowner(bytes32namespace,bytes32key)constantreturns(address){returnrecords[namespace][key].owner;}functioncreateNamespace(bytes32namespace)only_approver(){if(status==0)throw;NewNamespace(namespace);if(namespaces[namespace]!=0){return;}namespaces[namespace]=1;}functionresolver(bytes32namespace,bytes32key)constantreturns(address){if(namespaces[namespace]==0)throw;returnrecords[namespace][key].resolver;}functionsetOwner(bytes32namespace,bytes32key,addressowner)only_owner(namespace,key){Transfer(key,namespace,owner);records[namespace][key].owner=owner;}functionsetResolver(bytes32namespace,bytes32key,addressresolver)only_approver(){if(namespaces[namespace]==0){this.createNamespace(namespace,1);}NewResolver(key,namespace,resolver);records[namespace][key].resolver=resolver;}}