UNPKG

@etherspot/contracts

Version:

Etherspot Solidity contracts

777 lines 153 kB
{ "address": "0xE23c8f8aB1Cdd56D89F181c22Bf43e5b53871E08", "abi": [ { "inputs": [], "stateMutability": "nonpayable", "type": "constructor" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "address", "name": "addr", "type": "address" } ], "name": "AddrChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "uint256", "name": "coinType", "type": "uint256" }, { "indexed": false, "internalType": "bytes", "name": "newAddress", "type": "bytes" } ], "name": "AddressChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "address", "name": "guardian", "type": "address" } ], "name": "GuardianAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": false, "internalType": "address", "name": "guardian", "type": "address" } ], "name": "GuardianRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "initializer", "type": "address" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "string", "name": "name", "type": "string" } ], "name": "NameChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "address", "name": "owner", "type": "address" } ], "name": "NodeReleased", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "address", "name": "owner", "type": "address" } ], "name": "NodeSubmitted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "NodeVerified", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "x", "type": "bytes32" }, { "indexed": false, "internalType": "bytes32", "name": "y", "type": "bytes32" } ], "name": "PubkeyChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "registry", "type": "address" } ], "name": "RegistryChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "indexed": true, "internalType": "string", "name": "indexedKey", "type": "string" }, { "indexed": false, "internalType": "string", "name": "key", "type": "string" } ], "name": "TextChanged", "type": "event" }, { "inputs": [ { "internalType": "address", "name": "guardian", "type": "address" } ], "name": "addGuardian", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "addr", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "uint256", "name": "coinType", "type": "uint256" } ], "name": "addr", "outputs": [ { "internalType": "bytes", "name": "", "type": "bytes" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "chainId", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "gateway", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "address", "name": "account", "type": "address" }, { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "bytes32", "name": "label", "type": "bytes32" } ], "internalType": "struct ENSController.SubNodeRegistration", "name": "subNodeRegistration", "type": "tuple" } ], "name": "hashSubNodeRegistration", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "contract ENSRegistry", "name": "registry_", "type": "address" }, { "internalType": "address[]", "name": "guardians_", "type": "address[]" }, { "internalType": "address", "name": "gateway_", "type": "address" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "guardian", "type": "address" } ], "name": "isGuardian", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "isInitialized", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "name": "nodeOwners", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "pubkey", "outputs": [ { "internalType": "bytes32", "name": "x", "type": "bytes32" }, { "internalType": "bytes32", "name": "y", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "bytes32", "name": "label", "type": "bytes32" }, { "internalType": "bytes", "name": "guardianSignature", "type": "bytes" } ], "name": "registerSubNode", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "registry", "outputs": [ { "internalType": "contract ENSRegistry", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "releaseNode", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "guardian", "type": "address" } ], "name": "removeGuardian", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "uint256", "name": "coinType", "type": "uint256" }, { "internalType": "bytes", "name": "addr_", "type": "bytes" } ], "name": "setAddr", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "address", "name": "addr_", "type": "address" } ], "name": "setAddr", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "string", "name": "name", "type": "string" } ], "name": "setName", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "bytes32", "name": "x", "type": "bytes32" }, { "internalType": "bytes32", "name": "y", "type": "bytes32" } ], "name": "setPubkey", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "contract ENSRegistry", "name": "registry_", "type": "address" } ], "name": "setRegistry", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "string", "name": "key", "type": "string" }, { "internalType": "string", "name": "value", "type": "string" } ], "name": "setText", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "submitNode", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes4", "name": "interfaceID", "type": "bytes4" } ], "name": "supportsInterface", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "syncAddr", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" }, { "internalType": "string", "name": "key", "type": "string" } ], "name": "text", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "messageHash", "type": "bytes32" }, { "internalType": "bytes", "name": "signature", "type": "bytes" } ], "name": "verifyGuardianSignature", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "node", "type": "bytes32" } ], "name": "verifyNode", "outputs": [], "stateMutability": "nonpayable", "type": "function" } ], "transactionHash": "0x02cacf1613a94da34906793b31f35b45362ffaddce638a3e9df012fda175d1d4", "receipt": { "to": "0x4e59b44847b379578588920cA78FbF26c0B4956C", "from": "0x09FD4F6088f2025427AB1e89257A44747081Ed59", "contractAddress": null, "transactionIndex": 6, "gasUsed": "4146767", "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", "blockHash": "0x5dbe729672d931a05c3e1e2f1ce37ba979f5bd7ad1ba835e853c7d4ccda20433", "transactionHash": "0x02cacf1613a94da34906793b31f35b45362ffaddce638a3e9df012fda175d1d4", "logs": [], "blockNumber": 5756080, "cumulativeGasUsed": "4907179", "status": 1, "byzantium": true }, "args": [], "solcInputHash": "1bdf84d4bd28700579af1cc4796e2cae", "metadata": "{\"compiler\":{\"version\":\"0.6.12+commit.27d51765\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"AddrChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"coinType\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"newAddress\",\"type\":\"bytes\"}],\"name\":\"AddressChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"guardian\",\"type\":\"address\"}],\"name\":\"GuardianAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"guardian\",\"type\":\"address\"}],\"name\":\"GuardianRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"initializer\",\"type\":\"address\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"NameChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NodeReleased\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"NodeSubmitted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"NodeVerified\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"x\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"PubkeyChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"registry\",\"type\":\"address\"}],\"name\":\"RegistryChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"indexedKey\",\"type\":\"string\"},{\"indexed\":false,\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"TextChanged\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guardian\",\"type\":\"address\"}],\"name\":\"addGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"addr\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"coinType\",\"type\":\"uint256\"}],\"name\":\"addr\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"chainId\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"label\",\"type\":\"bytes32\"}],\"internalType\":\"struct ENSController.SubNodeRegistration\",\"name\":\"subNodeRegistration\",\"type\":\"tuple\"}],\"name\":\"hashSubNodeRegistration\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ENSRegistry\",\"name\":\"registry_\",\"type\":\"address\"},{\"internalType\":\"address[]\",\"name\":\"guardians_\",\"type\":\"address[]\"},{\"internalType\":\"address\",\"name\":\"gateway_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guardian\",\"type\":\"address\"}],\"name\":\"isGuardian\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isInitialized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"nodeOwners\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"pubkey\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"x\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"y\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"label\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"guardianSignature\",\"type\":\"bytes\"}],\"name\":\"registerSubNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"contract ENSRegistry\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"releaseNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"guardian\",\"type\":\"address\"}],\"name\":\"removeGuardian\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"coinType\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"addr_\",\"type\":\"bytes\"}],\"name\":\"setAddr\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"addr_\",\"type\":\"address\"}],\"name\":\"setAddr\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"}],\"name\":\"setName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"x\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"y\",\"type\":\"bytes32\"}],\"name\":\"setPubkey\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract ENSRegistry\",\"name\":\"registry_\",\"type\":\"address\"}],\"name\":\"setRegistry\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"}],\"name\":\"setText\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"submitNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceID\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"syncAddr\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"key\",\"type\":\"string\"}],\"name\":\"text\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"name\":\"verifyGuardianSignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"node\",\"type\":\"bytes32\"}],\"name\":\"verifyNode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"Stanis\\u0142aw G\\u0142ogowski <stan@pillarproject.io>\",\"details\":\"The process of adding root node consists of 3 steps: 1. `submitNode` - should be called from ENS node owner, 2. Change ENS node owner in ENS registry to ENS controller, 3. `verifyNode` - should be called from previous ENS node owner, To register sub node, `msg.sender` need to send valid signature from one of guardian key. Once registration is complete `msg.sender` becoming both node owner and `addr` record value. After registration sub node cannot be replaced.\",\"events\":{\"NodeReleased(bytes32,address)\":{\"details\":\"Emitted when new node is released\",\"params\":{\"node\":\"node name hash\",\"owner\":\"owner address\"}},\"NodeSubmitted(bytes32,address)\":{\"details\":\"Emitted when new node is submitted\",\"params\":{\"node\":\"node name hash\",\"owner\":\"owner address\"}},\"NodeVerified(bytes32)\":{\"details\":\"Emitted when the existing owner is verified\",\"params\":{\"node\":\"node name hash\"}},\"RegistryChanged(address)\":{\"details\":\"Emitted when ENS registry address is changed\",\"params\":{\"registry\":\"registry address\"}}},\"kind\":\"dev\",\"methods\":{\"addGuardian(address)\":{\"params\":{\"guardian\":\"guardian address\"}},\"constructor\":{\"details\":\"Public constructor\"},\"hashSubNodeRegistration((address,bytes32,bytes32))\":{\"params\":{\"subNodeRegistration\":\"struct\"},\"returns\":{\"_0\":\"hash\"}},\"initialize(address,address[],address)\":{\"params\":{\"gateway_\":\"gateway address\",\"registry_\":\"ENS registry address\"}},\"isGuardian(address)\":{\"params\":{\"guardian\":\"guardian address\"},\"returns\":{\"_0\":\"true when guardian exists\"}},\"isInitialized()\":{\"returns\":{\"_0\":\"true when contract is initialized\"}},\"registerSubNode(bytes32,bytes32,bytes)\":{\"params\":{\"guardianSignature\":\"guardian signature\",\"label\":\"label hash\",\"node\":\"node name hash\"}},\"releaseNode(bytes32)\":{\"details\":\"Should be called from the previous ENS node owner\",\"params\":{\"node\":\"node name hash\"}},\"removeGuardian(address)\":{\"params\":{\"guardian\":\"guardian address\"}},\"setRegistry(address)\":{\"params\":{\"registry_\":\"registry address\"}},\"submitNode(bytes32)\":{\"details\":\"Should be called from the current ENS node owner\",\"params\":{\"node\":\"node name hash\"}},\"syncAddr(bytes32)\":{\"params\":{\"node\":\"node name hash\"}},\"verifyGuardianSignature(bytes32,bytes)\":{\"params\":{\"messageHash\":\"message hash\",\"signature\":\"signature\"},\"returns\":{\"_0\":\"true on correct guardian signature\"}},\"verifyNode(bytes32)\":{\"details\":\"Should be called from the previous ENS node owner\",\"params\":{\"node\":\"node name hash\"}}},\"title\":\"ENS controller\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"addGuardian(address)\":{\"notice\":\"Adds a new guardian\"},\"hashSubNodeRegistration((address,bytes32,bytes32))\":{\"notice\":\"Hashes `SubNodeRegistration` message payload\"},\"initialize(address,address[],address)\":{\"notice\":\"Initializes `ENSController` contract\"},\"isGuardian(address)\":{\"notice\":\"Check if guardian exists\"},\"isInitialized()\":{\"notice\":\"Check if contract is initialized\"},\"registerSubNode(bytes32,bytes32,bytes)\":{\"notice\":\"Registers sub node\"},\"releaseNode(bytes32)\":{\"notice\":\"Releases node\"},\"removeGuardian(address)\":{\"notice\":\"Removes the existing guardian\"},\"setRegistry(address)\":{\"notice\":\"Sets registry\"},\"submitNode(bytes32)\":{\"notice\":\"Submits node\"},\"syncAddr(bytes32)\":{\"notice\":\"Sync address\"},\"verifyGuardianSignature(bytes32,bytes)\":{\"notice\":\"Verifies guardian signature\"},\"verifyNode(bytes32)\":{\"notice\":\"Verifies node\"}},\"notice\":\"ENS subnode registrar\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"src/ens/ENSController.sol\":\"ENSController\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"src/common/access/Guarded.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\n\\nimport \\\"../libs/ECDSALib.sol\\\";\\n\\n\\n/**\\n * @title Guarded\\n *\\n * @dev Contract module which provides a guardian-type control mechanism.\\n * It allows key accounts to have guardians and restricts specific methods to be accessible by guardians only.\\n *\\n * Each guardian account can remove other guardians\\n *\\n * Use `_initializeGuarded` to initialize the contract\\n *\\n * @author Stanis\\u0142aw G\\u0142ogowski <stan@pillarproject.io>\\n */\\ncontract Guarded {\\n using ECDSALib for bytes32;\\n\\n mapping(address => bool) private guardians;\\n\\n // events\\n\\n /**\\n * @dev Emitted when a new guardian is added\\n * @param sender sender address\\n * @param guardian guardian address\\n */\\n event GuardianAdded(\\n address sender,\\n address guardian\\n );\\n\\n /**\\n * @dev Emitted when the existing guardian is removed\\n * @param sender sender address\\n * @param guardian guardian address\\n */\\n event GuardianRemoved(\\n address sender,\\n address guardian\\n );\\n\\n // modifiers\\n\\n /**\\n * @dev Throws if tx.origin is not a guardian account\\n */\\n modifier onlyGuardian() {\\n require(\\n // solhint-disable-next-line avoid-tx-origin\\n guardians[tx.origin],\\n \\\"Guarded: tx.origin is not the guardian\\\"\\n );\\n\\n _;\\n }\\n\\n /**\\n * @dev Internal constructor\\n */\\n constructor() internal {}\\n\\n // external functions\\n\\n /**\\n * @notice Adds a new guardian\\n * @param guardian guardian address\\n */\\n function addGuardian(\\n address guardian\\n )\\n external\\n onlyGuardian\\n {\\n _addGuardian(guardian);\\n }\\n\\n /**\\n * @notice Removes the existing guardian\\n * @param guardian guardian address\\n */\\n function removeGuardian(\\n address guardian\\n )\\n external\\n onlyGuardian\\n {\\n require(\\n // solhint-disable-next-line avoid-tx-origin\\n tx.origin != guardian,\\n \\\"Guarded: cannot remove self\\\"\\n );\\n\\n require(\\n guardians[guardian],\\n \\\"Guarded: guardian doesn't exist\\\"\\n );\\n\\n guardians[guardian] = false;\\n\\n emit GuardianRemoved(\\n // solhint-disable-next-line avoid-tx-origin\\n tx.origin,\\n guardian\\n );\\n }\\n\\n // external functions (views)\\n\\n /**\\n * @notice Check if guardian exists\\n * @param guardian guardian address\\n * @return true when guardian exists\\n */\\n function isGuardian(\\n address guardian\\n )\\n external\\n view\\n returns (bool)\\n {\\n return guardians[guardian];\\n }\\n\\n /**\\n * @notice Verifies guardian signature\\n * @param messageHash message hash\\n * @param signature signature\\n * @return true on correct guardian signature\\n */\\n function verifyGuardianSignature(\\n bytes32 messageHash,\\n bytes calldata signature\\n )\\n external\\n view\\n returns (bool)\\n {\\n return _verifyGuardianSignature(\\n messageHash,\\n signature\\n );\\n }\\n\\n // internal functions\\n\\n /**\\n * @notice Initializes `Guarded` contract\\n * @dev If `guardians_` array is empty `tx.origin` is added as guardian account\\n * @param guardians_ array of guardians addresses\\n */\\n function _initializeGuarded(\\n address[] memory guardians_\\n )\\n internal\\n {\\n if (guardians_.length == 0) {\\n // solhint-disable-next-line avoid-tx-origin\\n _addGuardian(tx.origin);\\n } else {\\n uint guardiansLen = guardians_.length;\\n for (uint i = 0; i < guardiansLen; i++) {\\n _addGuardian(guardians_[i]);\\n }\\n }\\n }\\n\\n\\n // internal functions (views)\\n\\n function _verifyGuardianSignature(\\n bytes32 messageHash,\\n bytes memory signature\\n )\\n internal\\n view\\n returns (bool)\\n {\\n address guardian = messageHash.recoverAddress(signature);\\n\\n return guardians[guardian];\\n }\\n\\n // private functions\\n\\n function _addGuardian(\\n address guardian\\n )\\n private\\n {\\n require(\\n guardian != address(0),\\n \\\"Guarded: cannot add 0x0 guardian\\\"\\n );\\n\\n require(\\n !guardians[guardian],\\n \\\"Guarded: guardian already exists\\\"\\n );\\n\\n guardians[guardian] = true;\\n\\n emit GuardianAdded(\\n // solhint-disable-next-line avoid-tx-origin\\n tx.origin,\\n guardian\\n );\\n }\\n}\\n\",\"keccak256\":\"0x4a5f5670041362e87ea267d81c55fc3edc1a78e81f6f17524b13267f91f31458\",\"license\":\"MIT\"},\"src/common/libs/BytesLib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\n\\n/**\\n * @title Bytes library\\n *\\n * @author Stanis\\u0142aw G\\u0142ogowski <stan@pillarproject.io>\\n */\\nlibrary BytesLib {\\n /**\\n * @notice Converts bytes to address\\n * @param data data\\n * @return address\\n */\\n function toAddress(\\n bytes memory data\\n )\\n internal\\n pure\\n returns (address)\\n {\\n address result;\\n\\n require(\\n data.length == 20,\\n \\\"BytesLib: invalid data length\\\"\\n );\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n result := div(mload(add(data, 0x20)), 0x1000000000000000000000000)\\n }\\n\\n return result;\\n }\\n}\\n\",\"keccak256\":\"0x64c84964ea91bfb1f2d859eea6c57fe5b4a6f269951a4adf5f58d306c54c7f76\",\"license\":\"MIT\"},\"src/common/libs/ECDSALib.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\n\\n/**\\n * @title ECDSA library\\n *\\n * @dev Based on https://github.com/OpenZeppelin/openzeppelin-contracts/blob/v3.3.0/contracts/cryptography/ECDSA.sol#L26\\n */\\nlibrary ECDSALib {\\n function recoverAddress(\\n bytes32 messageHash,\\n bytes memory signature\\n )\\n internal\\n pure\\n returns (address)\\n {\\n address result = address(0);\\n\\n if (signature.length == 65) {\\n bytes32 r;\\n bytes32 s;\\n uint8 v;\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n r := mload(add(signature, 0x20))\\n s := mload(add(signature, 0x40))\\n v := byte(0, mload(add(signature, 0x60)))\\n }\\n\\n if (v < 27) {\\n v += 27;\\n }\\n\\n if (v == 27 || v == 28) {\\n result = ecrecover(messageHash, v, r, s);\\n }\\n }\\n\\n return result;\\n }\\n\\n function toEthereumSignedMessageHash(\\n bytes32 messageHash\\n )\\n internal\\n pure\\n returns (bytes32)\\n {\\n return keccak256(abi.encodePacked(\\n \\\"\\\\x19Ethereum Signed Message:\\\\n32\\\",\\n messageHash\\n ));\\n }\\n}\\n\",\"keccak256\":\"0x3b1460d688302eb595268c2af147ab532f29dbced66520e013f48d498eed3cec\",\"license\":\"MIT\"},\"src/common/lifecycle/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\n\\n/**\\n * @title Initializable\\n *\\n * @dev Contract module which provides access control mechanism, where\\n * there is the initializer account that can be granted exclusive access to\\n * specific functions.\\n *\\n * The initializer account will be tx.origin during contract deployment and will be removed on first use.\\n * Use `onlyInitializer` modifier on contract initialize process.\\n *\\n * @author Stanis\\u0142aw G\\u0142ogowski <stan@pillarproject.io>\\n */\\ncontract Initializable {\\n address private initializer;\\n\\n // events\\n\\n /**\\n * @dev Emitted after `onlyInitializer`\\n * @param initializer initializer address\\n */\\n event Initialized(\\n address initializer\\n );\\n\\n // modifiers\\n\\n /**\\n * @dev Throws if tx.origin is not the initializer\\n */\\n modifier onlyInitializer() {\\n require(\\n // solhint-disable-next-line avoid-tx-origin\\n tx.origin == initializer,\\n \\\"Initializable: tx.origin is not the initializer\\\"\\n );\\n\\n /// @dev removes initializer\\n initializer = address(0);\\n\\n _;\\n\\n emit Initialized(\\n // solhint-disable-next-line avoid-tx-origin\\n tx.origin\\n );\\n }\\n\\n /**\\n * @dev Internal constructor\\n */\\n constructor()\\n internal\\n {\\n // solhint-disable-next-line avoid-tx-origin\\n initializer = tx.origin;\\n }\\n\\n // external functions (views)\\n\\n /**\\n * @notice Check if contract is initialized\\n * @return true when contract is initialized\\n */\\n function isInitialized()\\n external\\n view\\n returns (bool)\\n {\\n return initializer == address(0);\\n }\\n}\\n\",\"keccak256\":\"0x3d47b2864dde5bde245917f7ac416a9e9715cdf1d226897e49838eb3186ee067\",\"license\":\"MIT\"},\"src/common/signature/SignatureValidator.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\n\\nimport \\\"../libs/ECDSALib.sol\\\";\\n\\n/**\\n * @title Signature validator\\n *\\n * @author Stanis\\u0142aw G\\u0142ogowski <stan@pillarproject.io>\\n */\\ncontract SignatureValidator {\\n using ECDSALib for bytes32;\\n\\n uint256 public chainId;\\n\\n /**\\n * @dev internal constructor\\n */\\n constructor() internal {\\n uint256 chainId_;\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n chainId_ := chainid()\\n }\\n\\n chainId = chainId_;\\n }\\n\\n // internal functions\\n\\n function _hashMessagePayload(\\n bytes32 messagePrefix,\\n bytes memory messagePayload\\n )\\n internal\\n view\\n returns (bytes32)\\n {\\n return keccak256(abi.encodePacked(\\n chainId,\\n address(this),\\n messagePrefix,\\n messagePayload\\n )).toEthereumSignedMessageHash();\\n }\\n}\\n\",\"keccak256\":\"0xc1168f7ccb74aea67089941dc5e4c1d1c4aa766afca47a90c0b017b8445b8acf\",\"license\":\"MIT\"},\"src/ens/ENSController.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.6.12;\\npragma experimental ABIEncoderV2;\\n\\nimport \\\"../common/access/Guarded.sol\\\";\\nimport \\\"../common/lifecycle/Initializable.sol\\\";\\nimport \\\"../common/signature/SignatureValidator.sol\\\";\\nimport \\\"../gateway/GatewayRecipient.sol\\\";\\nimport \\\"./resolvers/ENSAddressResolver.sol\\\";\\nimport \\\"./resolvers/ENSNameResolver.sol\\\";\\nimport \\\"./resolvers/ENSPubKeyResolver.sol\\\";\\nimport \\\"./resolvers/ENSTextResolver.sol\\\";\\nimport \\\"./ENSRegistry.sol\\\";\\n\\n\\n/**\\n * @title ENS controller\\n *\\n * @notice ENS subnode registrar\\n *\\n * @dev The process of adding root node consists of 3 steps:\\n * 1. `submitNode` - should be called from ENS node owner,\\n * 2. Change ENS node owner in ENS registry to ENS controller,\\n * 3. `verifyNode` - should be called from previous ENS node owner,\\n *\\n * To register sub node, `msg.sender` need to send valid signature from one of guardian key.\\n * Once registration is complete `msg.sender` becoming both node owner and `addr` record value.\\n *\\n * After registration sub node cannot be replaced.\\n *\\n * @author Stanis\\u0142aw G\\u0142ogowski <stan@pillarproject.io>\\n */\\ncontract ENSController is Guarded, Initializable, SignatureValidator, GatewayRecipient, ENSAddressResolver, ENSNameResolver, ENSPubKeyResolver, ENSTextResolver {\\n struct SubNodeRegistration {\\n address account;\\n bytes32 node;\\n bytes32 label;\\n }\\n\\n bytes4 private constant INTERFACE_META_ID = bytes4(keccak256(abi.encodePacked(\\\"supportsInterface(bytes4)\\\")));\\n\\n bytes32 private constant HASH_PREFIX_SUB_NODE_REGISTRATION = keccak256(\\n \\\"SubNodeRegistration(address account,bytes32 node,bytes32 label)\\\"\\n );\\n\\n ENSRegistry public registry;\\n\\n mapping(bytes32 => address) public nodeOwners;\\n\\n // events\\n\\n /**\\n * @dev Emitted when new node is submitted\\n * @param node node name hash\\n * @param owner owner address\\n */\\n event NodeSubmitted(\\n bytes32 node,\\n address owner\\n );\\n\\n /**\\n * @dev Emitted when the existing owner is verified\\n * @param node node name hash\\n */\\n event NodeVerified(\\n bytes32 node\\n );\\n\\n /**\\n * @dev Emitted when new node is released\\n * @param node node name hash\\n * @param owner owner address\\n */\\n event NodeReleased(\\n bytes32 node,\\n address owner\\n );\\n\\n /**\\n * @dev Emitted when ENS registry address is changed\\n * @param registry registry address\\n */\\n event RegistryChanged(\\n address registry\\n );\\n\\n /**\\n * @dev Public constructor\\n */\\n constructor() public Guarded() Initializable() SignatureValidator() {}\\n\\n // external functions\\n\\n /**\\n * @notice Initializes `ENSController` contract\\n * @param registry_ ENS registry address\\n * @param gateway_ gateway address\\n */\\n function initialize(\\n ENSRegistry registry_,\\n address[] calldata guardians_,\\n address gateway_\\n )\\n external\\n onlyInitializer\\n {\\n require(\\n address(registry_) != address(0),\\n \\\"ENSController: cannot set 0x0 registry\\\"\\n );\\n\\n registry = registry_;\\n\\n // Guarded\\n _initializeGuarded(guardians_);\\n\\n // GatewayRecipient\\n _initializeGatewayRecipient(gateway_);\\n }\\n\\n /**\\n * @notice Sets registry\\n * @param registry_ registry address\\n */\\n function setRegistry(\\n ENSRegistry registry_\\n )\\n external\\n onlyGuardian\\n {\\n require(\\n address(registry_) != address(0),\\n \\\"ENSController: cannot set 0x0 registry\\\"\\n );\\n\\n require(\\n registry_ != registry,\\n \\\"ENSController: registry already set\\\"\\n );\\n\\n registry = registry_;\\n\\n emit RegistryChanged(\\n address(registry)\\n );\\n }\\n\\n /**\\n * @notice Submits node\\n * @dev Should be called from the current ENS node owner\\n * @param node node name hash\\n */\\n function submitNode(\\n bytes32 node\\n )\\n external\\n {\\n address owner = _getContextAccount();\\n\\n require(\\n _addr(node) == address(0),\\n \\\"ENSController: node already exists\\\"\\n );\\n\\n require(\\n nodeOwners[node] == address(0),\\n \\\"ENSController: node already submitted\\\"\\n );\\n\\n require(\\n registry.owner(node) == owner,\\n \\\"ENSController: invalid ens node owner\\\"\\n );\\n\\n nodeOwners[node] = owner;\\n\\n emit NodeSubmitted(node, owner);\\n }\\n\\n /**\\n * @notice Verifies node\\n * @dev Should be called from the previous ENS node owner\\n * @param node node name hash\\n */\\n function verifyNode(\\n bytes32 node\\n )\\n external\\n {\\n address owner = _getContextAccount();\\n\\n require(\\n _addr(node) == address(0),\\n \\\"ENSController: node already exists\\\"\\n );\\n\\n require(\\n nodeOwners[node] == owner,\\n \\\"ENSController: invalid node owner\\\"\\n );\\n\\n require(\\n registry.owner(node) == address(this),\\n \\\"ENSController: invalid ens node owner\\\"\\n );\\n\\n _setAddr(node, address(this));\\n\\n registry.setResolver(node, address(this));\\n\\n emit NodeVerified(node);\\n }\\n\\n /**\\n * @notice Releases node\\n * @dev Should be called from the previous ENS node owner\\n * @param node node name hash\\n */\\n function releaseNode(\\n bytes32 node\\n )\\n external\\n {\\n address owner = _getContextAccount();\\n\\n require(\\n _addr(node) == address(this),\\n \\\"ENSController: node doesn't exist\\\"\\n );\\n\\n require(\\n nodeOwners[node] == owner,\\n \\\"ENSController: invalid node owner\\\"\\n );\\n\\n registry.setOwner(node, owner);\\n\\n delete nodeOwners[node];\\n\\n emit NodeReleased(node, owner);\\n }\\n\\n /**\\n * @notice Sync address\\n * @param node node name hash\\n */\\n function syncAddr(\\n bytes32 node\\n )\\n external\\n {\\n address account = _getContextAccount();\\n\\n require(\\n account == registry.owner(node),\\n \\\"ENSController: caller is not the node owner\\\"\\n );\\n\\n require(\\n registry.resolver(node) == address(this),\\n \\\"ENSController: invalid node resolver\\\"\\n );\\n\\n require(\\n _addr(node) == address(0),\\n \\\"ENSController: node already in sync\\\"\\n );\\n\\n _setAddr(node, account);\\n }\\n\\n /**\\n * @notice Registers sub node\\n * @param node node name hash\\n * @param label label hash\\n * @param guardianSignature guardian signature\\n */\\n function registerSubNode(\\n bytes32 node,\\n bytes32 label,\\n bytes calldata guardianSignature\\n )\\n external\\n {\\n address account = _getContextAccount();\\n\\n bytes32 messageHash = _hashSubNodeRegistration(\\n account,\\n node,\\n label\\n );\\n\\n require(\\n _verifyGuardianSignature(messageHash, guardianSignature),\\n \\\"ENSController: invalid guardian signature\\\"\\n );\\n\\n bytes32 subNode = keccak256(\\n abi.encodePacked(\\n node,\\n label\\n )\\n );\\n\\n require(\\n _addr(node) == address(this),\\n \\\"ENSController: invalid node\\\"\\n );\\n\\n require(\\n _addr(subNode) == address(0),\\n \\\"ENSController: label already taken\\\"\\n );\\n\\n registry.setSubnodeRecord(node, label, address(this), address(this), 0);\\n registry.setOwner(subNode, account);\\n\\n _setAddr(subNode, account);\\n }\\n\\n // external functions (pure)\\n function supportsInterface(\\n bytes4 interfaceID\\n )\\n external\\n pure\\n returns(bool)\\n {\\n return interfaceID == INTERFACE_META_ID ||\\n interfaceID == INTERFACE_ADDR_ID ||\\n interfaceID == INTERFACE_ADDRESS_ID ||\\n interfaceID == INTERFACE_NAME_ID ||\\n interfaceID == INTERFACE_PUB_KEY_ID ||\\n interfaceID == INTERFACE_TEXT_ID;\\n }\\n\\n // public functions (views)\\n\\n /**\\n * @notice Hashes `SubNodeRegistration` message payload\\n * @param subNodeRegistration struct\\n * @return hash\\n */\\n function hashSubNodeRegistration(\\n SubNodeRegistration memory subNodeRegistration\\n )\\n public\\n view\\n returns (bytes32)\\n {\\n return _hashSubNodeRegistration(\\n subNodeRegistration.account,\\n subNodeRegistration.node,\\n subNodeRegistration.label\\n );\\n }\\n\