Last active
May 25, 2020 16:02
-
-
Save marceljay/69b870f22e52116a56f0ed67721c217e to your computer and use it in GitHub Desktop.
Working on a custom resolver
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
pragma solidity >=0.4.24; | |
interface ENS { | |
// Logged when the owner of a node assigns a new owner to a subnode. | |
event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); | |
// Logged when the owner of a node transfers ownership to a new account. | |
event Transfer(bytes32 indexed node, address owner); | |
// Logged when the resolver for a node changes. | |
event NewResolver(bytes32 indexed node, address resolver); | |
// Logged when the TTL of a node changes | |
event NewTTL(bytes32 indexed node, uint64 ttl); | |
// Logged when an operator is added or removed. | |
event ApprovalForAll(address indexed owner, address indexed operator, bool approved); | |
function setRecord(bytes32 node, address owner, address resolver, uint64 ttl) external; | |
function setSubnodeRecord(bytes32 node, bytes32 label, address owner, address resolver, uint64 ttl) external; | |
function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external returns(bytes32); | |
function setResolver(bytes32 node, address resolver) external; | |
function setOwner(bytes32 node, address owner) external; | |
function setTTL(bytes32 node, uint64 ttl) external; | |
function setApprovalForAll(address operator, bool approved) external; | |
function owner(bytes32 node) external view returns (address); | |
function resolver(bytes32 node) external view returns (address); | |
function ttl(bytes32 node) external view returns (uint64); | |
function recordExists(bytes32 node) external view returns (bool); | |
function isApprovedForAll(address owner, address operator) external view returns (bool); | |
} | |
pragma solidity ^0.5.0; | |
contract ResolverBase { | |
bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7; | |
function supportsInterface(bytes4 interfaceID) public pure returns(bool) { | |
return interfaceID == INTERFACE_META_ID; | |
} | |
function isAuthorised(bytes32 node) internal view returns(bool); | |
modifier authorised(bytes32 node) { | |
require(isAuthorised(node)); | |
_; | |
} | |
} | |
contract TextResolver is ResolverBase { | |
bytes4 constant private TEXT_INTERFACE_ID = 0x59d1d43c; | |
event TextChanged(bytes32 indexed node, string indexed indexedKey, string key); | |
mapping(bytes32=>mapping(string=>string)) texts; | |
function setText(bytes32 node, string calldata key, string calldata value) external authorised(node) { | |
texts[node][key] = value; | |
emit TextChanged(node, key, key); | |
} | |
function text(bytes32 node, string calldata key) external view returns (string memory) { | |
return texts[node][key]; | |
} | |
function supportsInterface(bytes4 interfaceID) public pure returns(bool) { | |
return interfaceID == TEXT_INTERFACE_ID || super.supportsInterface(interfaceID); | |
} | |
} | |
pragma solidity ^0.5.0; | |
pragma experimental ABIEncoderV2; | |
contract PublicResolver is TextResolver { | |
ENS ens; | |
mapping(bytes32=>mapping(address=>mapping(address=>bool))) public authorisations; | |
event AuthorisationChanged(bytes32 indexed node, address indexed owner, address indexed target, bool isAuthorised); | |
constructor(ENS _ens) public { | |
ens = _ens; | |
} | |
function setAuthorisation(bytes32 node, address target, bool isAuthorised) external { | |
authorisations[node][msg.sender][target] = isAuthorised; | |
emit AuthorisationChanged(node, msg.sender, target, isAuthorised); | |
} | |
function isAuthorised(bytes32 node) internal view returns(bool) { | |
address owner = ens.owner(node); | |
return owner == msg.sender || authorisations[node][owner][msg.sender]; | |
} | |
function multicall(bytes[] calldata data) external returns(bytes[] memory results) { | |
results = new bytes[](data.length); | |
for(uint i = 0; i < data.length; i++) { | |
(bool success, bytes memory result) = address(this).delegatecall(data[i]); | |
require(success); | |
results[i] = result; | |
} | |
return results; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment