diff --git a/docs/ens_overview.rst b/docs/ens_overview.rst index f01a4e38c0..94c33a0198 100644 --- a/docs/ens_overview.rst +++ b/docs/ens_overview.rst @@ -1,7 +1,7 @@ .. _ens_overview: Ethereum Name Service -================================ +===================== The Ethereum Name Service is analogous to the Domain Name Service. It enables users and developers to use human-friendly names in place of error-prone @@ -19,12 +19,11 @@ Create an :class:`~ens.main.ENS` object (named ``ns`` below) in one of three way 2. Specify an instance or list of :ref:`providers` 3. From an existing :class:`web3.Web3` object -:: +.. code-block:: python # automatic detection from ens.auto import ns - # or, with a provider from web3 import IPCProvider from ens import ENS @@ -32,125 +31,111 @@ Create an :class:`~ens.main.ENS` object (named ``ns`` below) in one of three way provider = IPCProvider(...) ns = ENS(provider) - # or, with a w3 instance # Note: This inherits the w3 middlewares from the w3 instance and adds a stalecheck middleware to the middleware onion from ens import ENS - w3 = Web3(...) ns = ENS.fromWeb3(w3) +.... Usage ----- -Name info +Name Info ~~~~~~~~~ .. _ens_get_address: -Look up the address for an ENS name -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Get the Address for an ENS Name +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -:: +.. code-block:: python from ens.auto import ns - - - # look up the hex representation of the address for a name - eth_address = ns.address('jasoncarver.eth') - assert eth_address == '0x5B2063246F2191f18F2675ceDB8b28102e957458' - The ``ENS`` module has no opinion as to which TLD you can use, but will not infer a TLD if it is not provided with the name. +Get the ENS Name for an Address +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -Get name from address -^^^^^^^^^^^^^^^^^^^^^ - -:: +.. code-block:: python domain = ns.name('0x5B2063246F2191f18F2675ceDB8b28102e957458') - # name() also accepts the bytes version of the address - assert ns.name(b'[ c$o!\x91\xf1\x8f&u\xce\xdb\x8b(\x10.\x95tX') == domain - # confirm that the name resolves back to the address that you looked up: - assert ns.address(domain) == '0x5B2063246F2191f18F2675ceDB8b28102e957458' -Get owner of name -^^^^^^^^^^^^^^^^^ +.. note:: For accuracy, and as a recommendation from the ENS documentation on + `reverse resolution `_, + the ``ENS`` module now verifies that the forward resolution matches the address with every call to get the + ``name()`` for an address. This is the only sure way to know whether the reverse resolution is correct. Anyone can + claim any name, only forward resolution implies that the owner of the name gave their stamp of approval. -:: +Get the Owner of a Name +^^^^^^^^^^^^^^^^^^^^^^^ + +.. code-block:: python eth_address = ns.owner('exchange.eth') -Set up your name -~~~~~~~~~~~~~~~~ +.... -Point your name to your address -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Set Up Your Name and Address +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Do you want to set up your name so that :meth:`~ens.main.ENS.address` will show the -address it points to? +Link a Name to an Address +^^^^^^^^^^^^^^^^^^^^^^^^^ -:: +You can set up your name so that :meth:`~ens.main.ENS.address` will show the address it points to. In order to do so, +you must already be the owner of the domain (or its parent). - ns.setup_address('jasoncarver.eth', '0x5B2063246F2191f18F2675ceDB8b28102e957458') +.. code-block:: python -You must already be the owner of the domain (or its parent). + ns.setup_address('jasoncarver.eth', '0x5B2063246F2191f18F2675ceDB8b28102e957458') -In the common case where you want to point the name to the owning -address, you can skip the address +In the common case where you want to point the name to the owning address, you can skip the address. -:: +.. code-block:: python ns.setup_address('jasoncarver.eth') -You can claim arbitrarily deep subdomains. *Gas costs scale up with the -number of subdomains!* +You can claim arbitrarily deep subdomains. -:: +.. code-block:: python ns.setup_address('supreme.executive.power.derives.from.a.mandate.from.the.masses.jasoncarver.eth') -Wait for the transaction to be mined, then: - -:: + # wait for the transaction to be mined, then: + assert ( + ns.address('supreme.executive.power.derives.from.a.mandate.from.the.masses.jasoncarver.eth') + == '0x5B2063246F2191f18F2675ceDB8b28102e957458' + ) - assert ns.address('supreme.executive.power.derives.from.a.mandate.from.the.masses.jasoncarver.eth') == \ - '0x5B2063246F2191f18F2675ceDB8b28102e957458' +.. warning:: Gas costs scale up with the number of subdomains! -Allow people to find your name using your address -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +Link an Address to a Name +^^^^^^^^^^^^^^^^^^^^^^^^^ -Do you want to set up your address so that :meth:`~ens.main.ENS.name` will show the -name that points to it? +You can set up your address so that :meth:`~ens.main.ENS.name` will show the name that points to it. -This is like Caller ID. It enables you and others to take an account and -determine what name points to it. Sometimes this is referred to as -"reverse" resolution. +This is like Caller ID. It enables you and others to take an account and determine what name points to it. Sometimes +this is referred to as "reverse" resolution. The ENS Reverse Resolver is used for this functionality. -:: +.. code-block:: python ns.setup_name('jasoncarver.eth', '0x5B2063246F2191f18F2675ceDB8b28102e957458') -.. note:: Do not rely on reverse resolution for security. - - Anyone can claim any "caller ID". Only forward resolution implies that - the owner of the name gave their stamp of approval. - If you don't supply the address, :meth:`~ens.main.ENS.setup_name` will assume you want the address returned by :meth:`~ens.main.ENS.address`. -:: +.. code-block:: python ns.setup_name('jasoncarver.eth') @@ -159,26 +144,31 @@ call :meth:`~ens.main.ENS.setup_address` for you. Wait for the transaction to be mined, then: -:: +.. code-block:: python assert ns.name('0x5B2063246F2191f18F2675ceDB8b28102e957458') == 'jasoncarver.eth' +.... + +Text Records +~~~~~~~~~~~~ + Set Text Metadata for an ENS Record -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ As the owner of an ENS record, you can add text metadata. A list of supported fields can be found in the `ENS documentation `_. You'll need to setup the address first, and then the text can be set: -:: +.. code-block:: python ns.setup_address('jasoncarver.eth', 0x5B2063246F2191f18F2675ceDB8b28102e957458) ns.set_text('jasoncarver.eth', 'url', 'https://example.com') A transaction dictionary can be passed as the last argument if desired: -:: +.. code-block:: python transaction_dict = {'from': '0x123...'} ns.set_text('jasoncarver.eth', 'url', 'https://example.com', transaction_dict) @@ -188,11 +178,61 @@ a transaction dictionary is passed but does not have a ``from`` value, the default will be the ``owner``. Read Text Metadata for an ENS Record -^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Anyone can read the data from an ENS Record: -:: +.. code-block:: python url = ns.get_text('jasoncarver.eth', 'url') assert url == 'https://example.com' + +.... + +Working With Resolvers +~~~~~~~~~~~~~~~~~~~~~~ + +Get the Resolver for an ENS Record +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +You can get the resolver for an ENS name via the :meth:`~ens.main.ENS.resolver` method. + +.. code-block:: python + + >>> resolver = ns.resolver('jasoncarver.eth') + >>> resolver.address + '0x5FfC014343cd971B7eb70732021E26C35B744cc4' + +.... + +Wildcard Resolution Support +--------------------------- + +The ``ENS`` module supports Wildcard Resolution for resolvers that implement the ``ExtendedResolver`` interface +as described in `ENSIP-10 `_. +Resolvers that implement the extended resolver interface should return ``True`` when calling the +``supportsInterface()`` function with the extended resolver interface id ``0x9061b923`` and should resolve subdomains +to a unique address. + +A working example of a resolver that supports wildcard resolution is the resolver for the ``hatch.eth`` record on the +Ropsten testnet. + +.. code-block:: python + + # connect to the Ropsten testnet + >>> w3 = Web3(WebsocketProvider("wss://{ropsten_provider}")) + >>> ns = ENS.fromWeb3(w3) + + # get the resolver for `hatch.eth` + >>> resolver = ns.resolver('hatch.eth') + >>> resolver.address + '0x8fc4C380c5d539aE631daF3Ca9182b40FB21D1ae' + + # verify extended resolver interface support + >>> resolver.caller.supportsInterface('0x9061b923') + True + + >>> ns.address('random-subdomain.hatch.eth') + '0x49D4c4ff230688e4A357bc057e7E35e64d271939' + >>> ns.address('another-random-subdomain.hatch.eth') + '0xb35359B6450B0CbC9BE15A4eE6bcb8c5b0d9fC4A' diff --git a/ens/abis.py b/ens/abis.py index 5ce9474df2..9706a2d78c 100644 --- a/ens/abis.py +++ b/ens/abis.py @@ -1,1473 +1,1586 @@ # flake8: noqa ENS = [ - { - "constant": True, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "resolver", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "owner", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "label", - "type": "bytes32" - }, - { - "name": "owner", - "type": "address" - } - ], - "name": "setSubnodeOwner", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "ttl", - "type": "uint64" - } - ], - "name": "setTTL", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "ttl", - "outputs": [ - { - "name": "", - "type": "uint64" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { + { + "constant": True, + "inputs": [ + { + "name": "node", + "type": "bytes32" + } + ], "name": "resolver", - "type": "address" - } - ], - "name": "setResolver", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "owner", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": False, - "name": "owner", - "type": "address" - } - ], - "name": "Transfer", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": True, - "name": "label", - "type": "bytes32" - }, - { - "indexed": False, + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "node", + "type": "bytes32" + } + ], "name": "owner", - "type": "address" - } - ], - "name": "NewOwner", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": False, - "name": "resolver", - "type": "address" - } - ], - "name": "NewResolver", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": False, + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "label", + "type": "bytes32" + }, + { + "name": "owner", + "type": "address" + } + ], + "name": "setSubnodeOwner", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "ttl", + "type": "uint64" + } + ], + "name": "setTTL", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "node", + "type": "bytes32" + } + ], "name": "ttl", - "type": "uint64" - } - ], - "name": "NewTTL", - "type": "event" - } + "outputs": [ + { + "name": "", + "type": "uint64" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "resolver", + "type": "address" + } + ], + "name": "setResolver", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "owner", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": False, + "name": "owner", + "type": "address" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": True, + "name": "label", + "type": "bytes32" + }, + { + "indexed": False, + "name": "owner", + "type": "address" + } + ], + "name": "NewOwner", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": False, + "name": "resolver", + "type": "address" + } + ], + "name": "NewResolver", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": False, + "name": "ttl", + "type": "uint64" + } + ], + "name": "NewTTL", + "type": "event" + } ] AUCTION_REGISTRAR = [ - { - "constant": False, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - } - ], - "name": "releaseDeed", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - } - ], - "name": "getAllowedTime", - "outputs": [ - { - "name": "timestamp", - "type": "uint256" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "unhashedName", - "type": "string" - } - ], - "name": "invalidateName", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "hash", - "type": "bytes32" - }, - { - "name": "owner", - "type": "address" - }, - { - "name": "value", - "type": "uint256" - }, - { - "name": "salt", - "type": "bytes32" - } - ], - "name": "shaBid", - "outputs": [ - { - "name": "sealedBid", - "type": "bytes32" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "bidder", - "type": "address" - }, - { - "name": "seal", - "type": "bytes32" - } - ], - "name": "cancelBid", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - } - ], - "name": "entries", - "outputs": [ - { - "name": "", - "type": "uint8" - }, - { - "name": "", - "type": "address" - }, - { - "name": "", - "type": "uint256" - }, - { - "name": "", - "type": "uint256" - }, - { - "name": "", - "type": "uint256" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [], - "name": "ens", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - }, - { - "name": "_value", - "type": "uint256" - }, - { - "name": "_salt", - "type": "bytes32" - } - ], - "name": "unsealBid", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - } - ], - "name": "transferRegistrars", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "", - "type": "address" - }, - { - "name": "", - "type": "bytes32" - } - ], - "name": "sealedBids", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - } - ], - "name": "state", - "outputs": [ - { - "name": "", - "type": "uint8" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - }, - { - "name": "newOwner", - "type": "address" - } - ], - "name": "transfer", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - }, - { - "name": "_timestamp", - "type": "uint256" - } - ], - "name": "isAllowed", - "outputs": [ - { - "name": "allowed", - "type": "bool" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - } - ], - "name": "finalizeAuction", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [], - "name": "registryStarted", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [], - "name": "launchLength", - "outputs": [ - { - "name": "", - "type": "uint32" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "sealedBid", - "type": "bytes32" - } - ], - "name": "newBid", - "outputs": [], - "payable": True, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "labels", - "type": "bytes32[]" - } - ], - "name": "eraseNode", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "_hashes", - "type": "bytes32[]" - } - ], - "name": "startAuctions", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "hash", - "type": "bytes32" - }, - { - "name": "deed", - "type": "address" - }, - { - "name": "registrationDate", - "type": "uint256" - } - ], - "name": "acceptRegistrarTransfer", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "_hash", - "type": "bytes32" - } - ], - "name": "startAuction", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [], - "name": "rootNode", - "outputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "hashes", - "type": "bytes32[]" - }, - { - "name": "sealedBid", - "type": "bytes32" - } - ], - "name": "startAuctionsAndBid", - "outputs": [], - "payable": True, - "type": "function" - }, - { - "inputs": [ - { - "name": "_ens", - "type": "address" - }, - { - "name": "_rootNode", - "type": "bytes32" - }, - { - "name": "_startDate", - "type": "uint256" - } - ], - "payable": False, - "type": "constructor" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "hash", - "type": "bytes32" - }, - { - "indexed": False, - "name": "registrationDate", - "type": "uint256" - } - ], - "name": "AuctionStarted", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "hash", - "type": "bytes32" - }, - { - "indexed": True, - "name": "bidder", - "type": "address" - }, - { - "indexed": False, - "name": "deposit", - "type": "uint256" - } - ], - "name": "NewBid", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "hash", - "type": "bytes32" - }, - { - "indexed": True, - "name": "owner", - "type": "address" - }, - { - "indexed": False, - "name": "value", - "type": "uint256" - }, - { - "indexed": False, - "name": "status", - "type": "uint8" - } - ], - "name": "BidRevealed", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "hash", - "type": "bytes32" - }, - { - "indexed": True, - "name": "owner", - "type": "address" - }, - { - "indexed": False, - "name": "value", - "type": "uint256" - }, - { - "indexed": False, - "name": "registrationDate", - "type": "uint256" - } - ], - "name": "HashRegistered", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "hash", - "type": "bytes32" - }, - { - "indexed": False, - "name": "value", - "type": "uint256" - } - ], - "name": "HashReleased", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "hash", - "type": "bytes32" - }, - { - "indexed": True, - "name": "name", - "type": "string" - }, - { - "indexed": False, - "name": "value", - "type": "uint256" - }, - { - "indexed": False, - "name": "registrationDate", - "type": "uint256" - } - ], - "name": "HashInvalidated", - "type": "event" - } + { + "constant": False, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + } + ], + "name": "releaseDeed", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + } + ], + "name": "getAllowedTime", + "outputs": [ + { + "name": "timestamp", + "type": "uint256" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "unhashedName", + "type": "string" + } + ], + "name": "invalidateName", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "hash", + "type": "bytes32" + }, + { + "name": "owner", + "type": "address" + }, + { + "name": "value", + "type": "uint256" + }, + { + "name": "salt", + "type": "bytes32" + } + ], + "name": "shaBid", + "outputs": [ + { + "name": "sealedBid", + "type": "bytes32" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "bidder", + "type": "address" + }, + { + "name": "seal", + "type": "bytes32" + } + ], + "name": "cancelBid", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + } + ], + "name": "entries", + "outputs": [ + { + "name": "", + "type": "uint8" + }, + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "uint256" + }, + { + "name": "", + "type": "uint256" + }, + { + "name": "", + "type": "uint256" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [], + "name": "ens", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + }, + { + "name": "_value", + "type": "uint256" + }, + { + "name": "_salt", + "type": "bytes32" + } + ], + "name": "unsealBid", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + } + ], + "name": "transferRegistrars", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "", + "type": "address" + }, + { + "name": "", + "type": "bytes32" + } + ], + "name": "sealedBids", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + } + ], + "name": "state", + "outputs": [ + { + "name": "", + "type": "uint8" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + }, + { + "name": "newOwner", + "type": "address" + } + ], + "name": "transfer", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + }, + { + "name": "_timestamp", + "type": "uint256" + } + ], + "name": "isAllowed", + "outputs": [ + { + "name": "allowed", + "type": "bool" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + } + ], + "name": "finalizeAuction", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [], + "name": "registryStarted", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [], + "name": "launchLength", + "outputs": [ + { + "name": "", + "type": "uint32" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "sealedBid", + "type": "bytes32" + } + ], + "name": "newBid", + "outputs": [], + "payable": True, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "labels", + "type": "bytes32[]" + } + ], + "name": "eraseNode", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "_hashes", + "type": "bytes32[]" + } + ], + "name": "startAuctions", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "hash", + "type": "bytes32" + }, + { + "name": "deed", + "type": "address" + }, + { + "name": "registrationDate", + "type": "uint256" + } + ], + "name": "acceptRegistrarTransfer", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "_hash", + "type": "bytes32" + } + ], + "name": "startAuction", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [], + "name": "rootNode", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "hashes", + "type": "bytes32[]" + }, + { + "name": "sealedBid", + "type": "bytes32" + } + ], + "name": "startAuctionsAndBid", + "outputs": [], + "payable": True, + "type": "function" + }, + { + "inputs": [ + { + "name": "_ens", + "type": "address" + }, + { + "name": "_rootNode", + "type": "bytes32" + }, + { + "name": "_startDate", + "type": "uint256" + } + ], + "payable": False, + "type": "constructor" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "hash", + "type": "bytes32" + }, + { + "indexed": False, + "name": "registrationDate", + "type": "uint256" + } + ], + "name": "AuctionStarted", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "hash", + "type": "bytes32" + }, + { + "indexed": True, + "name": "bidder", + "type": "address" + }, + { + "indexed": False, + "name": "deposit", + "type": "uint256" + } + ], + "name": "NewBid", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "hash", + "type": "bytes32" + }, + { + "indexed": True, + "name": "owner", + "type": "address" + }, + { + "indexed": False, + "name": "value", + "type": "uint256" + }, + { + "indexed": False, + "name": "status", + "type": "uint8" + } + ], + "name": "BidRevealed", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "hash", + "type": "bytes32" + }, + { + "indexed": True, + "name": "owner", + "type": "address" + }, + { + "indexed": False, + "name": "value", + "type": "uint256" + }, + { + "indexed": False, + "name": "registrationDate", + "type": "uint256" + } + ], + "name": "HashRegistered", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "hash", + "type": "bytes32" + }, + { + "indexed": False, + "name": "value", + "type": "uint256" + } + ], + "name": "HashReleased", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "hash", + "type": "bytes32" + }, + { + "indexed": True, + "name": "name", + "type": "string" + }, + { + "indexed": False, + "name": "value", + "type": "uint256" + }, + { + "indexed": False, + "name": "registrationDate", + "type": "uint256" + } + ], + "name": "HashInvalidated", + "type": "event" + } ] DEED = [ - { - "constant": True, - "inputs": [], - "name": "creationDate", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [], - "name": "destroyDeed", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "newOwner", - "type": "address" - } - ], - "name": "setOwner", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [], - "name": "registrar", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [], - "name": "owner", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "refundRatio", - "type": "uint256" - } - ], - "name": "closeDeed", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "newRegistrar", - "type": "address" - } - ], - "name": "setRegistrar", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "newValue", - "type": "uint256" - } - ], - "name": "setBalance", - "outputs": [], - "payable": True, - "type": "function" - }, - { - "inputs": [], - "type": "constructor" - }, - { - "payable": True, - "type": "fallback" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": False, - "name": "newOwner", - "type": "address" - } - ], - "name": "OwnerChanged", - "type": "event" - }, - { - "anonymous": False, - "inputs": [], - "name": "DeedClosed", - "type": "event" - } + { + "constant": True, + "inputs": [], + "name": "creationDate", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [], + "name": "destroyDeed", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "newOwner", + "type": "address" + } + ], + "name": "setOwner", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [], + "name": "registrar", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [], + "name": "owner", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "refundRatio", + "type": "uint256" + } + ], + "name": "closeDeed", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "newRegistrar", + "type": "address" + } + ], + "name": "setRegistrar", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "newValue", + "type": "uint256" + } + ], + "name": "setBalance", + "outputs": [], + "payable": True, + "type": "function" + }, + { + "inputs": [], + "type": "constructor" + }, + { + "payable": True, + "type": "fallback" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": False, + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnerChanged", + "type": "event" + }, + { + "anonymous": False, + "inputs": [], + "name": "DeedClosed", + "type": "event" + } ] FIFS_REGISTRAR = [ - { - "constant": True, - "inputs": [], - "name": "ens", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "name": "expiryTimes", - "outputs": [ - { - "name": "", - "type": "uint256" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "subnode", - "type": "bytes32" - }, - { - "name": "owner", - "type": "address" - } - ], - "name": "register", - "outputs": [], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [], - "name": "rootNode", - "outputs": [ - { - "name": "", - "type": "bytes32" - } - ], - "payable": False, - "type": "function" - }, - { - "inputs": [ - { - "name": "ensAddr", - "type": "address" - }, - { - "name": "node", - "type": "bytes32" - } - ], - "type": "constructor" - } + { + "constant": True, + "inputs": [], + "name": "ens", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "name": "expiryTimes", + "outputs": [ + { + "name": "", + "type": "uint256" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "subnode", + "type": "bytes32" + }, + { + "name": "owner", + "type": "address" + } + ], + "name": "register", + "outputs": [], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [], + "name": "rootNode", + "outputs": [ + { + "name": "", + "type": "bytes32" + } + ], + "payable": False, + "type": "function" + }, + { + "inputs": [ + { + "name": "ensAddr", + "type": "address" + }, + { + "name": "node", + "type": "bytes32" + } + ], + "type": "constructor" + } ] RESOLVER = [ - { - "constant": True, - "inputs": [ - { - "name": "interfaceID", - "type": "bytes4" - } - ], - "name": "supportsInterface", - "outputs": [ - { - "name": "", - "type": "bool" - } - ], - "payable": False, - "stateMutability": "view", - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "key", - "type": "string" - }, - { - "name": "value", - "type": "string" - } - ], - "name": "setText", - "outputs": [], - "payable": False, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "contentTypes", - "type": "uint256" - } - ], - "name": "ABI", - "outputs": [ - { - "name": "contentType", - "type": "uint256" - }, - { - "name": "data", - "type": "bytes" - } - ], - "payable": False, - "stateMutability": "view", - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "x", - "type": "bytes32" - }, - { - "name": "y", - "type": "bytes32" - } - ], - "name": "setPubkey", - "outputs": [], - "payable": False, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "content", - "outputs": [ - { - "name": "ret", - "type": "bytes32" - } - ], - "payable": False, - "stateMutability": "view", - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "addr", - "outputs": [ - { - "name": "ret", - "type": "address" - } - ], - "payable": False, - "stateMutability": "view", - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "key", - "type": "string" - } - ], - "name": "text", - "outputs": [ - { - "name": "ret", - "type": "string" - } - ], - "payable": False, - "stateMutability": "view", - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "contentType", - "type": "uint256" - }, - { - "name": "data", - "type": "bytes" - } - ], - "name": "setABI", - "outputs": [], - "payable": False, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "name", - "outputs": [ - { - "name": "ret", - "type": "string" - } - ], - "payable": False, - "stateMutability": "view", - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "name", - "type": "string" - } - ], - "name": "setName", - "outputs": [], - "payable": False, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { - "name": "hash", - "type": "bytes32" - } - ], - "name": "setContent", - "outputs": [], - "payable": False, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "name": "pubkey", - "outputs": [ - { - "name": "x", - "type": "bytes32" - }, - { - "name": "y", - "type": "bytes32" - } - ], - "payable": False, - "stateMutability": "view", - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "node", - "type": "bytes32" - }, - { + { + "constant": True, + "inputs": [ + { + "name": "interfaceID", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "name": "", + "type": "bool" + } + ], + "payable": False, + "stateMutability": "view", + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "key", + "type": "string" + }, + { + "name": "value", + "type": "string" + } + ], + "name": "setText", + "outputs": [], + "payable": False, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "contentTypes", + "type": "uint256" + } + ], + "name": "ABI", + "outputs": [ + { + "name": "contentType", + "type": "uint256" + }, + { + "name": "data", + "type": "bytes" + } + ], + "payable": False, + "stateMutability": "view", + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "x", + "type": "bytes32" + }, + { + "name": "y", + "type": "bytes32" + } + ], + "name": "setPubkey", + "outputs": [], + "payable": False, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "node", + "type": "bytes32" + } + ], + "name": "content", + "outputs": [ + { + "name": "ret", + "type": "bytes32" + } + ], + "payable": False, + "stateMutability": "view", + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "node", + "type": "bytes32" + } + ], "name": "addr", - "type": "address" - } - ], - "name": "setAddr", - "outputs": [], - "payable": False, - "stateMutability": "nonpayable", - "type": "function" - }, - { - "inputs": [ - { - "name": "ensAddr", - "type": "address" - } - ], - "payable": False, - "stateMutability": "nonpayable", - "type": "constructor" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": False, - "name": "a", - "type": "address" - } - ], - "name": "AddrChanged", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": False, - "name": "hash", - "type": "bytes32" - } - ], - "name": "ContentChanged", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": False, + "outputs": [ + { + "name": "ret", + "type": "address" + } + ], + "payable": False, + "stateMutability": "view", + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "key", + "type": "string" + } + ], + "name": "text", + "outputs": [ + { + "name": "ret", + "type": "string" + } + ], + "payable": False, + "stateMutability": "view", + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "contentType", + "type": "uint256" + }, + { + "name": "data", + "type": "bytes" + } + ], + "name": "setABI", + "outputs": [], + "payable": False, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "node", + "type": "bytes32" + } + ], "name": "name", - "type": "string" - } - ], - "name": "NameChanged", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": True, - "name": "contentType", - "type": "uint256" - } - ], - "name": "ABIChanged", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": False, - "name": "x", - "type": "bytes32" - }, - { - "indexed": False, - "name": "y", - "type": "bytes32" - } - ], - "name": "PubkeyChanged", - "type": "event" - }, - { - "anonymous": False, - "inputs": [ - { - "indexed": True, - "name": "node", - "type": "bytes32" - }, - { - "indexed": True, - "name": "indexedKey", - "type": "string" - }, - { - "indexed": False, - "name": "key", - "type": "string" - } - ], - "name": "TextChanged", - "type": "event" - } + "outputs": [ + { + "name": "ret", + "type": "string" + } + ], + "payable": False, + "stateMutability": "view", + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "name", + "type": "string" + } + ], + "name": "setName", + "outputs": [], + "payable": False, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "hash", + "type": "bytes32" + } + ], + "name": "setContent", + "outputs": [], + "payable": False, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "node", + "type": "bytes32" + } + ], + "name": "pubkey", + "outputs": [ + { + "name": "x", + "type": "bytes32" + }, + { + "name": "y", + "type": "bytes32" + } + ], + "payable": False, + "stateMutability": "view", + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "node", + "type": "bytes32" + }, + { + "name": "addr", + "type": "address" + } + ], + "name": "setAddr", + "outputs": [], + "payable": False, + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "name": "ensAddr", + "type": "address" + } + ], + "payable": False, + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": False, + "name": "a", + "type": "address" + } + ], + "name": "AddrChanged", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": False, + "name": "hash", + "type": "bytes32" + } + ], + "name": "ContentChanged", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": False, + "name": "name", + "type": "string" + } + ], + "name": "NameChanged", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": True, + "name": "contentType", + "type": "uint256" + } + ], + "name": "ABIChanged", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": False, + "name": "x", + "type": "bytes32" + }, + { + "indexed": False, + "name": "y", + "type": "bytes32" + } + ], + "name": "PubkeyChanged", + "type": "event" + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "name": "node", + "type": "bytes32" + }, + { + "indexed": True, + "name": "indexedKey", + "type": "string" + }, + { + "indexed": False, + "name": "key", + "type": "string" + } + ], + "name": "TextChanged", + "type": "event" + } +] + +EXTENDED_RESOLVER = [ + { + "constant": False, + "inputs": [ + { + "internalType": "bytes", + "name": "name", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "resolve", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "internalType": "bytes", + "name": "response", + "type": "bytes" + }, + { + "internalType": "bytes", + "name": "extraData", + "type": "bytes" + } + ], + "name": "resolveWithProof", + "outputs": [ + { + "internalType": "bytes", + "name": "", + "type": "bytes" + } + ], + "stateMutability": "view", "type": "function" + } +] + RESOLVER + +REVERSE_RESOLVER = [ + { + 'constant': True, + 'inputs': [], + 'name': 'ens', + 'outputs': [ + { + 'name': '', + 'type': 'address'} + ], + 'payable': False, + 'stateMutability': 'view', + 'type': 'function' + }, + { + 'constant': True, + 'inputs': [ + { + 'name': '', + 'type': 'bytes32'} + ], + 'name': 'name', + 'outputs': [ + { + 'name': '', + 'type': 'string' + } + ], + 'payable': False, + 'stateMutability': 'view', + 'type': 'function' + }, + { + 'constant': False, + 'inputs': [ + { + 'name': 'node', + 'type': 'bytes32' + }, + { + 'name': '_name', 'type': 'string' + } + ], + 'name': 'setName', + 'outputs': [], + 'payable': False, + 'stateMutability': 'nonpayable', + 'type': 'function'}, + { + 'inputs': [ + { + 'name': 'ensAddr', + 'type': 'address' + } + ], + 'payable': False, + 'stateMutability': 'nonpayable', + 'type': 'constructor' + } ] REVERSE_REGISTRAR = [ - { - "constant": False, - "inputs": [ - { - "name": "owner", - "type": "address" - }, - { - "name": "resolver", - "type": "address" - } - ], - "name": "claimWithResolver", - "outputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "owner", - "type": "address" - } - ], - "name": "claim", - "outputs": [ - { - "name": "node", - "type": "bytes32" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [], - "name": "ens", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [], - "name": "defaultResolver", - "outputs": [ - { - "name": "", - "type": "address" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": True, - "inputs": [ - { - "name": "addr", - "type": "address" - } - ], - "name": "node", - "outputs": [ - { - "name": "ret", - "type": "bytes32" - } - ], - "payable": False, - "type": "function" - }, - { - "constant": False, - "inputs": [ - { - "name": "name", - "type": "string" - } - ], - "name": "setName", - "outputs": [ - { + { + "constant": False, + "inputs": [ + { + "name": "owner", + "type": "address" + }, + { + "name": "resolver", + "type": "address" + } + ], + "name": "claimWithResolver", + "outputs": [ + { + "name": "node", + "type": "bytes32" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "owner", + "type": "address" + } + ], + "name": "claim", + "outputs": [ + { + "name": "node", + "type": "bytes32" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [], + "name": "ens", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [], + "name": "defaultResolver", + "outputs": [ + { + "name": "", + "type": "address" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": True, + "inputs": [ + { + "name": "addr", + "type": "address" + } + ], "name": "node", - "type": "bytes32" - } - ], - "payable": False, - "type": "function" - }, - { - "inputs": [ - { - "name": "ensAddr", - "type": "address" - }, - { - "name": "resolverAddr", - "type": "address" - } - ], - "payable": False, - "type": "constructor" - } + "outputs": [ + { + "name": "ret", + "type": "bytes32" + } + ], + "payable": False, + "type": "function" + }, + { + "constant": False, + "inputs": [ + { + "name": "name", + "type": "string" + } + ], + "name": "setName", + "outputs": [ + { + "name": "node", + "type": "bytes32" + } + ], + "payable": False, + "type": "function" + }, + { + "inputs": [ + { + "name": "ensAddr", + "type": "address" + }, + { + "name": "resolverAddr", + "type": "address" + } + ], + "payable": False, + "type": "constructor" + } ] diff --git a/ens/constants.py b/ens/constants.py index 78455f4e30..eb8ce5b461 100644 --- a/ens/constants.py +++ b/ens/constants.py @@ -18,3 +18,9 @@ REVERSE_REGISTRAR_DOMAIN = 'addr.reverse' ENS_MAINNET_ADDR = ChecksumAddress(HexAddress(HexStr('0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e'))) + + +# --- interface ids --- # + +GET_TEXT_INTERFACE_ID = HexStr("0x59d1d43c") +EXTENDED_RESOLVER_INTERFACE_ID = HexStr('0x9061b923') # ENSIP-10 diff --git a/ens/contract_data.py b/ens/contract_data.py index 76e5a409da..236329b9bb 100644 --- a/ens/contract_data.py +++ b/ens/contract_data.py @@ -1,19 +1,33 @@ # flake8: noqa import json -registrar_abi = json.loads('[{"constant":false,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"releaseDeed","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"getAllowedTime","outputs":[{"name":"timestamp","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"unhashedName","type":"string"}],"name":"invalidateName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"hash","type":"bytes32"},{"name":"owner","type":"address"},{"name":"value","type":"uint256"},{"name":"salt","type":"bytes32"}],"name":"shaBid","outputs":[{"name":"sealedBid","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"bidder","type":"address"},{"name":"seal","type":"bytes32"}],"name":"cancelBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"entries","outputs":[{"name":"","type":"uint8"},{"name":"","type":"address"},{"name":"","type":"uint256"},{"name":"","type":"uint256"},{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_hash","type":"bytes32"},{"name":"_value","type":"uint256"},{"name":"_salt","type":"bytes32"}],"name":"unsealBid","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"transferRegistrars","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"","type":"address"},{"name":"","type":"bytes32"}],"name":"sealedBids","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"state","outputs":[{"name":"","type":"uint8"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_hash","type":"bytes32"},{"name":"newOwner","type":"address"}],"name":"transfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"_hash","type":"bytes32"},{"name":"_timestamp","type":"uint256"}],"name":"isAllowed","outputs":[{"name":"allowed","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"finalizeAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"registryStarted","outputs":[{"name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"launchLength","outputs":[{"name":"","type":"uint32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"sealedBid","type":"bytes32"}],"name":"newBid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"name":"labels","type":"bytes32[]"}],"name":"eraseNode","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_hashes","type":"bytes32[]"}],"name":"startAuctions","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"hash","type":"bytes32"},{"name":"deed","type":"address"},{"name":"registrationDate","type":"uint256"}],"name":"acceptRegistrarTransfer","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"_hash","type":"bytes32"}],"name":"startAuction","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"rootNode","outputs":[{"name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"hashes","type":"bytes32[]"},{"name":"sealedBid","type":"bytes32"}],"name":"startAuctionsAndBid","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"inputs":[{"name":"_ens","type":"address"},{"name":"_rootNode","type":"bytes32"},{"name":"_startDate","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":false,"name":"registrationDate","type":"uint256"}],"name":"AuctionStarted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":true,"name":"bidder","type":"address"},{"indexed":false,"name":"deposit","type":"uint256"}],"name":"NewBid","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"status","type":"uint8"}],"name":"BidRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":true,"name":"owner","type":"address"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"registrationDate","type":"uint256"}],"name":"HashRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":false,"name":"value","type":"uint256"}],"name":"HashReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"hash","type":"bytes32"},{"indexed":true,"name":"name","type":"string"},{"indexed":false,"name":"value","type":"uint256"},{"indexed":false,"name":"registrationDate","type":"uint256"}],"name":"HashInvalidated","type":"event"}]') -registrar_bytecode = "6060604052341561000f57600080fd5b60405160608061275783398101604052808051919060200180519190602001805160008054600160a060020a031916600160a060020a0387161781556001859055909250821190506100615742610063565b805b6004555050506126df806100786000396000f300606060405236156101175763ffffffff60e060020a6000350416630230a07c811461011c57806313c89a8f1461013457806315f733311461015c57806322ec1244146101ad5780632525f5c1146101d5578063267b6922146101f75780633f15457f1461025f57806347872b421461028e5780635ddae283146102aa5780635e431709146102c057806361d585da146102e257806379ce9fac1461031c578063935033371461033e578063983b94fb1461036b5780639c67f06f14610381578063ae1a0b0c14610394578063ce92dced146103c0578063de10f04b146103cb578063e27fe50f1461041a578063ea9e107a14610469578063ede8acdb1461048e578063faff50a8146104a4578063febefd61146104b7575b600080fd5b341561012757600080fd5b6101326004356104fd565b005b341561013f57600080fd5b61014a60043561072a565b60405190815260200160405180910390f35b341561016757600080fd5b61013260046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061074e95505050505050565b34156101b857600080fd5b61014a600435600160a060020a0360243516604435606435610a7a565b34156101e057600080fd5b610132600160a060020a0360043516602435610ac5565b341561020257600080fd5b61020d600435610c8c565b6040518086600581111561021d57fe5b60ff16815260200185600160a060020a0316600160a060020a031681526020018481526020018381526020018281526020019550505050505060405180910390f35b341561026a57600080fd5b610272610cd8565b604051600160a060020a03909116815260200160405180910390f35b341561029957600080fd5b610132600435602435604435610ce7565b34156102b557600080fd5b610132600435611254565b34156102cb57600080fd5b610272600160a060020a03600435166024356114b4565b34156102ed57600080fd5b6102f86004356114da565b6040518082600581111561030857fe5b60ff16815260200191505060405180910390f35b341561032757600080fd5b610132600435600160a060020a0360243516611550565b341561034957600080fd5b61035760043560243561169b565b604051901515815260200160405180910390f35b341561037657600080fd5b6101326004356116b1565b341561038c57600080fd5b61014a611919565b341561039f57600080fd5b6103a761191f565b60405163ffffffff909116815260200160405180910390f35b610132600435611926565b34156103d657600080fd5b6101326004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650611a1a95505050505050565b341561042557600080fd5b6101326004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650611a7595505050505050565b341561047457600080fd5b610132600435600160a060020a0360243516604435611aab565b341561049957600080fd5b610132600435611ab0565b34156104af57600080fd5b61014a611bfc565b61013260046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496505093359350611c0292505050565b60008082600261050c826114da565b600581111561051757fe5b1415806105a3575060008181526002602052604080822054600160a060020a031691638da5cb5b9151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561057257600080fd5b6102c65a03f1151561058357600080fd5b50505060405180519050600160a060020a031633600160a060020a031614155b156105ad57600080fd5b600084815260026020526040902080546001820154919450600160a060020a031692506301e13380014210801561065f575060008054600154600160a060020a03308116939216916302571be391906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561063957600080fd5b6102c65a03f1151561064a57600080fd5b50505060405180519050600160a060020a0316145b1561066957600080fd5b60006002840181905560038401558254600160a060020a031916835561068e84611c14565b81600160a060020a031663bbe427716103e860405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156106d657600080fd5b6102c65a03f115156106e757600080fd5b505050600283015484907f292b79b9246fa2c8e77d3fe195b251f9cb839d7d038e667c069ee7708c631e169060405190815260200160405180910390a250505050565b6004547001000000000000000000000000000000006249d400818404020401919050565b600080826040518082805190602001908083835b602083106107815780518252601f199092019160209182019101610762565b6001836020036101000a03801982511681845116179092525050509190910192506040915050519081900390206002806107ba836114da565b60058111156107c557fe5b146107cf57600080fd5b60066107da86611e12565b11156107e557600080fd5b846040518082805190602001908083835b602083106108155780518252601f1990920191602091820191016107f6565b6001836020036101000a03801982511681845116179092525050509190910192506040915050519081900390206000818152600260205260409020909450925061085e84611c14565b8254600160a060020a0316156109b5576108838360020154662386f26fc10000611ec3565b60028085018290558454600160a060020a03169163b0c80972919004600060405160e060020a63ffffffff8516028152600481019290925215156024820152604401600060405180830381600087803b15156108de57600080fd5b6102c65a03f115156108ef57600080fd5b50508354600160a060020a031690506313af40353360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b50508354600160a060020a0316905063bbe427716103e860405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b5050505b846040518082805190602001908083835b602083106109e55780518252601f1990920191602091820191016109c6565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902084600019167f1f9c649fe47e58bb60f4e52f0d90e4c47a526c9f90c5113df842c025970b66ad8560020154866001015460405191825260208201526040908101905180910390a3505060006002820181905560038201558054600160a060020a03191690555050565b600084848484604051938452600160a060020a03929092166c010000000000000000000000000260208401526034830152605482015260740160405180910390209050949350505050565b600160a060020a03808316600090815260036020908152604080832085845290915290205416801580610b61575062069780600160a060020a0382166305b344106000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610b3d57600080fd5b6102c65a03f11515610b4e57600080fd5b5050506040518051905001621275000142105b15610b6b57600080fd5b80600160a060020a03166313af40353360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610bb957600080fd5b6102c65a03f11515610bca57600080fd5b50505080600160a060020a031663bbe42771600560405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610c1457600080fd5b6102c65a03f11515610c2557600080fd5b505050600160a060020a03831660008181526003602090815260408083208684529091528082208054600160a060020a03191690558491600080516020612694833981519152916005905191825260ff1660208201526040908101905180910390a3505050565b60008181526002602052604081208190819081908190610cab876114da565b815460018301546002840154600390940154929a600160a060020a03909216995097509195509350915050565b600054600160a060020a031681565b600080600080600080610cfc89338a8a610a7a565b600160a060020a033381166000908152600360209081526040808320858452909152902054919750169450841515610d3357600080fd5b600160a060020a0333811660009081526003602090815260408083208a845282528083208054600160a060020a03191690558c835260029091528082209650610dd6928b9290891691633fa4f245919051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610db657600080fd5b6102c65a03f11515610dc757600080fd5b50505060405180519050611edb565b925084600160a060020a031663b0c8097284600160405160e060020a63ffffffff8516028152600481019290925215156024820152604401600060405180830381600087803b1515610e2757600080fd5b6102c65a03f11515610e3857600080fd5b505050610e44896114da565b91506002826005811115610e5457fe5b1415610ef25784600160a060020a031663bbe42771600560405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610ea157600080fd5b6102c65a03f11515610eb257600080fd5b5050600160a060020a03331690508960008051602061269483398151915285600160405191825260ff1660208201526040908101905180910390a3611249565b6004826005811115610f0057fe5b14610f0a57600080fd5b662386f26fc10000831080610f88575060018401546202a2ff1901600160a060020a0386166305b344106000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610f6b57600080fd5b6102c65a03f11515610f7c57600080fd5b50505060405180519050115b156110265784600160a060020a031663bbe427716103e360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610fd557600080fd5b6102c65a03f11515610fe657600080fd5b5050600160a060020a03331690508960008051602061269483398151915285600060405191825260ff1660208201526040908101905180910390a3611249565b8360030154831115611108578354600160a060020a0316156110a257508254600160a060020a03168063bbe427716103e360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b151561108d57600080fd5b6102c65a03f1151561109e57600080fd5b5050505b600384018054600280870191909155908490558454600160a060020a031916600160a060020a038781169190911786553316908a9060008051602061269483398151915290869060405191825260ff1660208201526040908101905180910390a3611249565b83600201548311156111b45760028401839055600160a060020a03851663bbe427716103e360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b151561116357600080fd5b6102c65a03f1151561117457600080fd5b5050600160a060020a03331690508960008051602061269483398151915285600360405191825260ff1660208201526040908101905180910390a3611249565b84600160a060020a031663bbe427716103e360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156111fc57600080fd5b6102c65a03f1151561120d57600080fd5b5050600160a060020a03331690508960008051602061269483398151915285600460405191825260ff1660208201526040908101905180910390a35b505050505050505050565b600080826002611263826114da565b600581111561126e57fe5b1415806112fa575060008181526002602052604080822054600160a060020a031691638da5cb5b9151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156112c957600080fd5b6102c65a03f115156112da57600080fd5b50505060405180519050600160a060020a031633600160a060020a031614155b1561130457600080fd5b60008054600154600160a060020a03909116916302571be391906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561135b57600080fd5b6102c65a03f1151561136c57600080fd5b50505060405180519050925030600160a060020a031683600160a060020a0316141561139757600080fd5b600084815260026020526040908190208054909350600160a060020a03169063faab9d399085905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b505082546001840154600160a060020a03808716935063ea9e107a92889291169060405160e060020a63ffffffff86160281526004810193909352600160a060020a0390911660248301526044820152606401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b50508254600160a060020a03191683555050600060018201819055600282018190556003909101555050565b6003602090815260009283526040808420909152908252902054600160a060020a031681565b60008181526002602052604081206114f2834261169b565b1515611501576005915061154a565b80600101544210156115315760018101546202a2ff1901421015611528576001915061154a565b6004915061154a565b60038101541515611545576000915061154a565b600291505b50919050565b600082600261155e826114da565b600581111561156957fe5b1415806115f5575060008181526002602052604080822054600160a060020a031691638da5cb5b9151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156115c457600080fd5b6102c65a03f115156115d557600080fd5b50505060405180519050600160a060020a031633600160a060020a031614155b156115ff57600080fd5b600160a060020a038316151561161457600080fd5b600084815260026020526040908190208054909350600160a060020a0316906313af40359085905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561167757600080fd5b6102c65a03f1151561168857600080fd5b5050506116958484611eec565b50505050565b60006116a68361072a565b821190505b92915050565b60008160026116bf826114da565b60058111156116ca57fe5b141580611756575060008181526002602052604080822054600160a060020a031691638da5cb5b9151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561172557600080fd5b6102c65a03f1151561173657600080fd5b50505060405180519050600160a060020a031633600160a060020a031614155b1561176057600080fd5b60008381526002602081905260409091209081015490925061178990662386f26fc10000611ec3565b600283018190558254600160a060020a03169063b0c8097290600160405160e060020a63ffffffff8516028152600481019290925215156024820152604401600060405180830381600087803b15156117e157600080fd5b6102c65a03f115156117f257600080fd5b5050825461186291508490600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561184257600080fd5b6102c65a03f1151561185357600080fd5b50505060405180519050611eec565b8154600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156118a957600080fd5b6102c65a03f115156118ba57600080fd5b50505060405180519050600160a060020a031683600019167f0f0c27adfd84b60b6f456b0e87cdccb1e5fb9603991588d87fa99f5b6b61e6708460020154856001015460405191825260208201526040908101905180910390a3505050565b60045481565b6249d40081565b600160a060020a0333811660009081526003602090815260408083208584529091528120549091168190111561195b57600080fd5b662386f26fc1000034101561196f57600080fd5b3433611979612187565b600160a060020a0390911681526020016040518091039082f080151561199e57600080fd5b33600160a060020a039081166000818152600360209081526040808320898452909152908190208054600160a060020a0319169385169390931790925591935090915083907fb556ff269c1b6714f432c36431e2041d28436a73b6c3f19c021827bbdc6bfc299034905190815260200160405180910390a35050565b80511515611a2757600080fd5b6002611a4b82600184510381518110611a3c57fe5b906020019060200201516114da565b6005811115611a5657fe5b1415611a6157600080fd5b611a72600182510382600154611fd6565b50565b60005b8151811015611aa757611a9f828281518110611a9057fe5b90602001906020020151611ab0565b600101611a78565b5050565b505050565b600080600454421080611aca5750600454630784ce000142115b80611b51575060008054600154600160a060020a03308116939216916302571be391906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515611b2a57600080fd5b6102c65a03f11515611b3b57600080fd5b50505060405180519050600160a060020a031614155b15611b5b57600080fd5b611b64836114da565b91506001826005811115611b7457fe5b1415611b7f57611aab565b6000826005811115611b8d57fe5b14611b9757600080fd5b50600082815260026020819052604080832042620697800160018201819055928101849055600381019390935584917f87e97e825a1d1fa0c54e1d36c7506c1dea8b1efd451fe68b000cf96f7cf40003915190815260200160405180910390a2505050565b60015481565b611c0b82611a75565b611aa781611926565b60008054600154600160a060020a033081169216906302571be390846040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515611c6d57600080fd5b6102c65a03f11515611c7e57600080fd5b50505060405180519050600160a060020a03161415611aa757600054600154600160a060020a03909116906306ab592390843060405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b1515611cfd57600080fd5b6102c65a03f11515611d0e57600080fd5b5050506001548260405191825260208201526040908101905190819003902060008054919250600160a060020a0390911690631896f70a90839060405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b1515611d8c57600080fd5b6102c65a03f11515611d9d57600080fd5b505060008054600160a060020a03169150635b0fc9c390839060405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b1515611dfa57600080fd5b6102c65a03f11515611e0b57600080fd5b5050505050565b600060018201818080838651019250600091505b82841015611eba5760ff845116905060808160ff161015611e4c57600184019350611eaf565b60e08160ff161015611e6357600284019350611eaf565b60f08160ff161015611e7a57600384019350611eaf565b60f88160ff161015611e9157600484019350611eaf565b60fc8160ff161015611ea857600584019350611eaf565b6006840193505b600190910190611e26565b50949350505050565b600081831115611ed45750816116ab565b50806116ab565b600081831015611ed45750816116ab565b60008054600154600160a060020a03308116939216916302571be391906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515611f4657600080fd5b6102c65a03f11515611f5757600080fd5b50505060405180519050600160a060020a03161415611aa757600054600154600160a060020a03909116906306ab592390848460405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b1515611dfa57600080fd5b600054600160a060020a03166306ab592382848681518110611ff457fe5b906020019060200201513060405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b151561204b57600080fd5b6102c65a03f1151561205c57600080fd5b5050508082848151811061206c57fe5b906020019060200201516040519182526020820152604090810190518091039020905060008311156120a6576120a6600184038383611fd6565b60008054600160a060020a031690631896f70a90839060405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b151561210057600080fd5b6102c65a03f1151561211157600080fd5b505060008054600160a060020a03169150635b0fc9c390839060405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b151561216e57600080fd5b6102c65a03f1151561217f57600080fd5b505050505050565b6040516104fc8061219883390190560060606040526040516020806104fc8339810160405280805160028054600160a060020a03928316600160a060020a03199182161790915560008054339093169290911691909117905550504260019081556005805460ff191690911790553460045561048c806100706000396000f300606060405236156100a15763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305b3441081146100a65780630b5ab3d5146100cb57806313af4035146100e05780632b20e397146100ff5780633fa4f2451461012e578063674f220f146101415780638da5cb5b14610154578063b0c8097214610167578063bbe4277114610182578063faab9d3914610198575b600080fd5b34156100b157600080fd5b6100b96101b7565b60405190815260200160405180910390f35b34156100d657600080fd5b6100de6101bd565b005b34156100eb57600080fd5b6100de600160a060020a0360043516610207565b341561010a57600080fd5b6101126102b0565b604051600160a060020a03909116815260200160405180910390f35b341561013957600080fd5b6100b96102bf565b341561014c57600080fd5b6101126102c5565b341561015f57600080fd5b6101126102d4565b341561017257600080fd5b6100de60043560243515156102e3565b341561018d57600080fd5b6100de60043561036c565b34156101a357600080fd5b6100de600160a060020a0360043516610416565b60015481565b60055460ff16156101cd57600080fd5b600254600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050156102055761deadff5b565b60005433600160a060020a0390811691161461022257600080fd5b600160a060020a038116151561023757600080fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169083161790557fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3681604051600160a060020a03909116815260200160405180910390a150565b600054600160a060020a031681565b60045481565b600354600160a060020a031681565b600254600160a060020a031681565b60005433600160a060020a039081169116146102fe57600080fd5b60055460ff16151561030f57600080fd5b81600454101561031e57600080fd5b6004829055600254600160a060020a039081169030163183900380156108fc0290604051600060405180830381858888f1935050505015801561035e5750805b1561036857600080fd5b5050565b60005433600160a060020a0390811691161461038757600080fd5b60055460ff16151561039857600080fd5b6005805460ff1916905561dead6103e8600160a060020a03301631838203020480156108fc0290604051600060405180830381858888f1935050505015156103df57600080fd5b7fbb2ce2f51803bba16bc85282b47deeea9a5c6223eabea1077be696b3f265cf1360405160405180910390a16104136101bd565b50565b60005433600160a060020a0390811691161461043157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555600a165627a7a7230582023849fab751378a237489f526a289ede7796b7f6b7dac5a973b8c3ca25f368a800297b6c4b278d165a6b33958f8ea5dfb00c8c9d4d0acf1985bef5d10786898bc3e7a165627a7a72305820e6807b87ab11a69864cefed52eef7f9c4635fd0e26312e944bbbcbff5cd26d920029" -registrar_bytecode_runtime = "606060405236156101175763ffffffff60e060020a6000350416630230a07c811461011c57806313c89a8f1461013457806315f733311461015c57806322ec1244146101ad5780632525f5c1146101d5578063267b6922146101f75780633f15457f1461025f57806347872b421461028e5780635ddae283146102aa5780635e431709146102c057806361d585da146102e257806379ce9fac1461031c578063935033371461033e578063983b94fb1461036b5780639c67f06f14610381578063ae1a0b0c14610394578063ce92dced146103c0578063de10f04b146103cb578063e27fe50f1461041a578063ea9e107a14610469578063ede8acdb1461048e578063faff50a8146104a4578063febefd61146104b7575b600080fd5b341561012757600080fd5b6101326004356104fd565b005b341561013f57600080fd5b61014a60043561072a565b60405190815260200160405180910390f35b341561016757600080fd5b61013260046024813581810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284375094965061074e95505050505050565b34156101b857600080fd5b61014a600435600160a060020a0360243516604435606435610a7a565b34156101e057600080fd5b610132600160a060020a0360043516602435610ac5565b341561020257600080fd5b61020d600435610c8c565b6040518086600581111561021d57fe5b60ff16815260200185600160a060020a0316600160a060020a031681526020018481526020018381526020018281526020019550505050505060405180910390f35b341561026a57600080fd5b610272610cd8565b604051600160a060020a03909116815260200160405180910390f35b341561029957600080fd5b610132600435602435604435610ce7565b34156102b557600080fd5b610132600435611254565b34156102cb57600080fd5b610272600160a060020a03600435166024356114b4565b34156102ed57600080fd5b6102f86004356114da565b6040518082600581111561030857fe5b60ff16815260200191505060405180910390f35b341561032757600080fd5b610132600435600160a060020a0360243516611550565b341561034957600080fd5b61035760043560243561169b565b604051901515815260200160405180910390f35b341561037657600080fd5b6101326004356116b1565b341561038c57600080fd5b61014a611919565b341561039f57600080fd5b6103a761191f565b60405163ffffffff909116815260200160405180910390f35b610132600435611926565b34156103d657600080fd5b6101326004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650611a1a95505050505050565b341561042557600080fd5b6101326004602481358181019083013580602081810201604051908101604052809392919081815260200183836020028082843750949650611a7595505050505050565b341561047457600080fd5b610132600435600160a060020a0360243516604435611aab565b341561049957600080fd5b610132600435611ab0565b34156104af57600080fd5b61014a611bfc565b61013260046024813581810190830135806020818102016040519081016040528093929190818152602001838360200280828437509496505093359350611c0292505050565b60008082600261050c826114da565b600581111561051757fe5b1415806105a3575060008181526002602052604080822054600160a060020a031691638da5cb5b9151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561057257600080fd5b6102c65a03f1151561058357600080fd5b50505060405180519050600160a060020a031633600160a060020a031614155b156105ad57600080fd5b600084815260026020526040902080546001820154919450600160a060020a031692506301e13380014210801561065f575060008054600154600160a060020a03308116939216916302571be391906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561063957600080fd5b6102c65a03f1151561064a57600080fd5b50505060405180519050600160a060020a0316145b1561066957600080fd5b60006002840181905560038401558254600160a060020a031916835561068e84611c14565b81600160a060020a031663bbe427716103e860405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156106d657600080fd5b6102c65a03f115156106e757600080fd5b505050600283015484907f292b79b9246fa2c8e77d3fe195b251f9cb839d7d038e667c069ee7708c631e169060405190815260200160405180910390a250505050565b6004547001000000000000000000000000000000006249d400818404020401919050565b600080826040518082805190602001908083835b602083106107815780518252601f199092019160209182019101610762565b6001836020036101000a03801982511681845116179092525050509190910192506040915050519081900390206002806107ba836114da565b60058111156107c557fe5b146107cf57600080fd5b60066107da86611e12565b11156107e557600080fd5b846040518082805190602001908083835b602083106108155780518252601f1990920191602091820191016107f6565b6001836020036101000a03801982511681845116179092525050509190910192506040915050519081900390206000818152600260205260409020909450925061085e84611c14565b8254600160a060020a0316156109b5576108838360020154662386f26fc10000611ec3565b60028085018290558454600160a060020a03169163b0c80972919004600060405160e060020a63ffffffff8516028152600481019290925215156024820152604401600060405180830381600087803b15156108de57600080fd5b6102c65a03f115156108ef57600080fd5b50508354600160a060020a031690506313af40353360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561094257600080fd5b6102c65a03f1151561095357600080fd5b50508354600160a060020a0316905063bbe427716103e860405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156109a057600080fd5b6102c65a03f115156109b157600080fd5b5050505b846040518082805190602001908083835b602083106109e55780518252601f1990920191602091820191016109c6565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051809103902084600019167f1f9c649fe47e58bb60f4e52f0d90e4c47a526c9f90c5113df842c025970b66ad8560020154866001015460405191825260208201526040908101905180910390a3505060006002820181905560038201558054600160a060020a03191690555050565b600084848484604051938452600160a060020a03929092166c010000000000000000000000000260208401526034830152605482015260740160405180910390209050949350505050565b600160a060020a03808316600090815260036020908152604080832085845290915290205416801580610b61575062069780600160a060020a0382166305b344106000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610b3d57600080fd5b6102c65a03f11515610b4e57600080fd5b5050506040518051905001621275000142105b15610b6b57600080fd5b80600160a060020a03166313af40353360405160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b1515610bb957600080fd5b6102c65a03f11515610bca57600080fd5b50505080600160a060020a031663bbe42771600560405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610c1457600080fd5b6102c65a03f11515610c2557600080fd5b505050600160a060020a03831660008181526003602090815260408083208684529091528082208054600160a060020a03191690558491600080516020612694833981519152916005905191825260ff1660208201526040908101905180910390a3505050565b60008181526002602052604081208190819081908190610cab876114da565b815460018301546002840154600390940154929a600160a060020a03909216995097509195509350915050565b600054600160a060020a031681565b600080600080600080610cfc89338a8a610a7a565b600160a060020a033381166000908152600360209081526040808320858452909152902054919750169450841515610d3357600080fd5b600160a060020a0333811660009081526003602090815260408083208a845282528083208054600160a060020a03191690558c835260029091528082209650610dd6928b9290891691633fa4f245919051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610db657600080fd5b6102c65a03f11515610dc757600080fd5b50505060405180519050611edb565b925084600160a060020a031663b0c8097284600160405160e060020a63ffffffff8516028152600481019290925215156024820152604401600060405180830381600087803b1515610e2757600080fd5b6102c65a03f11515610e3857600080fd5b505050610e44896114da565b91506002826005811115610e5457fe5b1415610ef25784600160a060020a031663bbe42771600560405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610ea157600080fd5b6102c65a03f11515610eb257600080fd5b5050600160a060020a03331690508960008051602061269483398151915285600160405191825260ff1660208201526040908101905180910390a3611249565b6004826005811115610f0057fe5b14610f0a57600080fd5b662386f26fc10000831080610f88575060018401546202a2ff1901600160a060020a0386166305b344106000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b1515610f6b57600080fd5b6102c65a03f11515610f7c57600080fd5b50505060405180519050115b156110265784600160a060020a031663bbe427716103e360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b1515610fd557600080fd5b6102c65a03f11515610fe657600080fd5b5050600160a060020a03331690508960008051602061269483398151915285600060405191825260ff1660208201526040908101905180910390a3611249565b8360030154831115611108578354600160a060020a0316156110a257508254600160a060020a03168063bbe427716103e360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b151561108d57600080fd5b6102c65a03f1151561109e57600080fd5b5050505b600384018054600280870191909155908490558454600160a060020a031916600160a060020a038781169190911786553316908a9060008051602061269483398151915290869060405191825260ff1660208201526040908101905180910390a3611249565b83600201548311156111b45760028401839055600160a060020a03851663bbe427716103e360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b151561116357600080fd5b6102c65a03f1151561117457600080fd5b5050600160a060020a03331690508960008051602061269483398151915285600360405191825260ff1660208201526040908101905180910390a3611249565b84600160a060020a031663bbe427716103e360405160e060020a63ffffffff84160281526004810191909152602401600060405180830381600087803b15156111fc57600080fd5b6102c65a03f1151561120d57600080fd5b5050600160a060020a03331690508960008051602061269483398151915285600460405191825260ff1660208201526040908101905180910390a35b505050505050505050565b600080826002611263826114da565b600581111561126e57fe5b1415806112fa575060008181526002602052604080822054600160a060020a031691638da5cb5b9151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156112c957600080fd5b6102c65a03f115156112da57600080fd5b50505060405180519050600160a060020a031633600160a060020a031614155b1561130457600080fd5b60008054600154600160a060020a03909116916302571be391906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561135b57600080fd5b6102c65a03f1151561136c57600080fd5b50505060405180519050925030600160a060020a031683600160a060020a0316141561139757600080fd5b600084815260026020526040908190208054909350600160a060020a03169063faab9d399085905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b15156113fa57600080fd5b6102c65a03f1151561140b57600080fd5b505082546001840154600160a060020a03808716935063ea9e107a92889291169060405160e060020a63ffffffff86160281526004810193909352600160a060020a0390911660248301526044820152606401600060405180830381600087803b151561147757600080fd5b6102c65a03f1151561148857600080fd5b50508254600160a060020a03191683555050600060018201819055600282018190556003909101555050565b6003602090815260009283526040808420909152908252902054600160a060020a031681565b60008181526002602052604081206114f2834261169b565b1515611501576005915061154a565b80600101544210156115315760018101546202a2ff1901421015611528576001915061154a565b6004915061154a565b60038101541515611545576000915061154a565b600291505b50919050565b600082600261155e826114da565b600581111561156957fe5b1415806115f5575060008181526002602052604080822054600160a060020a031691638da5cb5b9151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156115c457600080fd5b6102c65a03f115156115d557600080fd5b50505060405180519050600160a060020a031633600160a060020a031614155b156115ff57600080fd5b600160a060020a038316151561161457600080fd5b600084815260026020526040908190208054909350600160a060020a0316906313af40359085905160e060020a63ffffffff8416028152600160a060020a039091166004820152602401600060405180830381600087803b151561167757600080fd5b6102c65a03f1151561168857600080fd5b5050506116958484611eec565b50505050565b60006116a68361072a565b821190505b92915050565b60008160026116bf826114da565b60058111156116ca57fe5b141580611756575060008181526002602052604080822054600160a060020a031691638da5cb5b9151602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561172557600080fd5b6102c65a03f1151561173657600080fd5b50505060405180519050600160a060020a031633600160a060020a031614155b1561176057600080fd5b60008381526002602081905260409091209081015490925061178990662386f26fc10000611ec3565b600283018190558254600160a060020a03169063b0c8097290600160405160e060020a63ffffffff8516028152600481019290925215156024820152604401600060405180830381600087803b15156117e157600080fd5b6102c65a03f115156117f257600080fd5b5050825461186291508490600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b151561184257600080fd5b6102c65a03f1151561185357600080fd5b50505060405180519050611eec565b8154600160a060020a0316638da5cb5b6000604051602001526040518163ffffffff1660e060020a028152600401602060405180830381600087803b15156118a957600080fd5b6102c65a03f115156118ba57600080fd5b50505060405180519050600160a060020a031683600019167f0f0c27adfd84b60b6f456b0e87cdccb1e5fb9603991588d87fa99f5b6b61e6708460020154856001015460405191825260208201526040908101905180910390a3505050565b60045481565b6249d40081565b600160a060020a0333811660009081526003602090815260408083208584529091528120549091168190111561195b57600080fd5b662386f26fc1000034101561196f57600080fd5b3433611979612187565b600160a060020a0390911681526020016040518091039082f080151561199e57600080fd5b33600160a060020a039081166000818152600360209081526040808320898452909152908190208054600160a060020a0319169385169390931790925591935090915083907fb556ff269c1b6714f432c36431e2041d28436a73b6c3f19c021827bbdc6bfc299034905190815260200160405180910390a35050565b80511515611a2757600080fd5b6002611a4b82600184510381518110611a3c57fe5b906020019060200201516114da565b6005811115611a5657fe5b1415611a6157600080fd5b611a72600182510382600154611fd6565b50565b60005b8151811015611aa757611a9f828281518110611a9057fe5b90602001906020020151611ab0565b600101611a78565b5050565b505050565b600080600454421080611aca5750600454630784ce000142115b80611b51575060008054600154600160a060020a03308116939216916302571be391906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515611b2a57600080fd5b6102c65a03f11515611b3b57600080fd5b50505060405180519050600160a060020a031614155b15611b5b57600080fd5b611b64836114da565b91506001826005811115611b7457fe5b1415611b7f57611aab565b6000826005811115611b8d57fe5b14611b9757600080fd5b50600082815260026020819052604080832042620697800160018201819055928101849055600381019390935584917f87e97e825a1d1fa0c54e1d36c7506c1dea8b1efd451fe68b000cf96f7cf40003915190815260200160405180910390a2505050565b60015481565b611c0b82611a75565b611aa781611926565b60008054600154600160a060020a033081169216906302571be390846040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515611c6d57600080fd5b6102c65a03f11515611c7e57600080fd5b50505060405180519050600160a060020a03161415611aa757600054600154600160a060020a03909116906306ab592390843060405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b1515611cfd57600080fd5b6102c65a03f11515611d0e57600080fd5b5050506001548260405191825260208201526040908101905190819003902060008054919250600160a060020a0390911690631896f70a90839060405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b1515611d8c57600080fd5b6102c65a03f11515611d9d57600080fd5b505060008054600160a060020a03169150635b0fc9c390839060405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b1515611dfa57600080fd5b6102c65a03f11515611e0b57600080fd5b5050505050565b600060018201818080838651019250600091505b82841015611eba5760ff845116905060808160ff161015611e4c57600184019350611eaf565b60e08160ff161015611e6357600284019350611eaf565b60f08160ff161015611e7a57600384019350611eaf565b60f88160ff161015611e9157600484019350611eaf565b60fc8160ff161015611ea857600584019350611eaf565b6006840193505b600190910190611e26565b50949350505050565b600081831115611ed45750816116ab565b50806116ab565b600081831015611ed45750816116ab565b60008054600154600160a060020a03308116939216916302571be391906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515611f4657600080fd5b6102c65a03f11515611f5757600080fd5b50505060405180519050600160a060020a03161415611aa757600054600154600160a060020a03909116906306ab592390848460405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b1515611dfa57600080fd5b600054600160a060020a03166306ab592382848681518110611ff457fe5b906020019060200201513060405160e060020a63ffffffff861602815260048101939093526024830191909152600160a060020a03166044820152606401600060405180830381600087803b151561204b57600080fd5b6102c65a03f1151561205c57600080fd5b5050508082848151811061206c57fe5b906020019060200201516040519182526020820152604090810190518091039020905060008311156120a6576120a6600184038383611fd6565b60008054600160a060020a031690631896f70a90839060405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b151561210057600080fd5b6102c65a03f1151561211157600080fd5b505060008054600160a060020a03169150635b0fc9c390839060405160e060020a63ffffffff85160281526004810192909252600160a060020a03166024820152604401600060405180830381600087803b151561216e57600080fd5b6102c65a03f1151561217f57600080fd5b505050505050565b6040516104fc8061219883390190560060606040526040516020806104fc8339810160405280805160028054600160a060020a03928316600160a060020a03199182161790915560008054339093169290911691909117905550504260019081556005805460ff191690911790553460045561048c806100706000396000f300606060405236156100a15763ffffffff7c010000000000000000000000000000000000000000000000000000000060003504166305b3441081146100a65780630b5ab3d5146100cb57806313af4035146100e05780632b20e397146100ff5780633fa4f2451461012e578063674f220f146101415780638da5cb5b14610154578063b0c8097214610167578063bbe4277114610182578063faab9d3914610198575b600080fd5b34156100b157600080fd5b6100b96101b7565b60405190815260200160405180910390f35b34156100d657600080fd5b6100de6101bd565b005b34156100eb57600080fd5b6100de600160a060020a0360043516610207565b341561010a57600080fd5b6101126102b0565b604051600160a060020a03909116815260200160405180910390f35b341561013957600080fd5b6100b96102bf565b341561014c57600080fd5b6101126102c5565b341561015f57600080fd5b6101126102d4565b341561017257600080fd5b6100de60043560243515156102e3565b341561018d57600080fd5b6100de60043561036c565b34156101a357600080fd5b6100de600160a060020a0360043516610416565b60015481565b60055460ff16156101cd57600080fd5b600254600160a060020a039081169030163180156108fc0290604051600060405180830381858888f19350505050156102055761deadff5b565b60005433600160a060020a0390811691161461022257600080fd5b600160a060020a038116151561023757600080fd5b6002805460038054600160a060020a0380841673ffffffffffffffffffffffffffffffffffffffff19928316179092559091169083161790557fa2ea9883a321a3e97b8266c2b078bfeec6d50c711ed71f874a90d500ae2eaf3681604051600160a060020a03909116815260200160405180910390a150565b600054600160a060020a031681565b60045481565b600354600160a060020a031681565b600254600160a060020a031681565b60005433600160a060020a039081169116146102fe57600080fd5b60055460ff16151561030f57600080fd5b81600454101561031e57600080fd5b6004829055600254600160a060020a039081169030163183900380156108fc0290604051600060405180830381858888f1935050505015801561035e5750805b1561036857600080fd5b5050565b60005433600160a060020a0390811691161461038757600080fd5b60055460ff16151561039857600080fd5b6005805460ff1916905561dead6103e8600160a060020a03301631838203020480156108fc0290604051600060405180830381858888f1935050505015156103df57600080fd5b7fbb2ce2f51803bba16bc85282b47deeea9a5c6223eabea1077be696b3f265cf1360405160405180910390a16104136101bd565b50565b60005433600160a060020a0390811691161461043157600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555600a165627a7a7230582023849fab751378a237489f526a289ede7796b7f6b7dac5a973b8c3ca25f368a800297b6c4b278d165a6b33958f8ea5dfb00c8c9d4d0acf1985bef5d10786898bc3e7a165627a7a72305820e6807b87ab11a69864cefed52eef7f9c4635fd0e26312e944bbbcbff5cd26d920029" - -resolver_abi = json.loads('[{"constant":true,"inputs":[{"name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"key","type":"string"},{"name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"},{"name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"name":"contentType","type":"uint256"},{"name":"data","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"x","type":"bytes32"},{"name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"content","outputs":[{"name":"ret","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"addr","outputs":[{"name":"ret","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"},{"name":"key","type":"string"}],"name":"text","outputs":[{"name":"ret","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"contentType","type":"uint256"},{"name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"name","outputs":[{"name":"ret","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"hash","type":"bytes32"}],"name":"setContent","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"name":"x","type":"bytes32"},{"name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"addr","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"ensAddr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"hash","type":"bytes32"}],"name":"ContentChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":false,"name":"x","type":"bytes32"},{"indexed":false,"name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"name":"node","type":"bytes32"},{"indexed":true,"name":"indexedKey","type":"string"},{"indexed":false,"name":"key","type":"string"}],"name":"TextChanged","type":"event"}]') -resolver_bytecode = "6060604052341561000f57600080fd5b6040516020806111b08339810160405280805160008054600160a060020a03909216600160a060020a0319909216919091179055505061115c806100546000396000f300606060405236156100a95763ffffffff60e060020a60003504166301ffc9a781146100ae57806310f13a8c146100e25780632203ab561461017c57806329cd62ea146102135780632dff69411461022f5780633b3b57de1461025757806359d1d43c14610289578063623195b014610356578063691f3431146103b257806377372213146103c8578063c3d014d61461041e578063c869023314610437578063d5fa2b0014610465575b600080fd5b34156100b957600080fd5b6100ce600160e060020a031960043516610487565b604051901515815260200160405180910390f35b34156100ed57600080fd5b61017a600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506105f495505050505050565b005b341561018757600080fd5b610195600435602435610805565b60405182815260406020820181815290820183818151815260200191508051906020019080838360005b838110156101d75780820151838201526020016101bf565b50505050905090810190601f1680156102045780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561021e57600080fd5b61017a60043560243560443561092f565b341561023a57600080fd5b610245600435610a2e565b60405190815260200160405180910390f35b341561026257600080fd5b61026d600435610a44565b604051600160a060020a03909116815260200160405180910390f35b341561029457600080fd5b6102df600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610a5f95505050505050565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561031b578082015183820152602001610303565b50505050905090810190601f1680156103485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036157600080fd5b61017a600480359060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610b7e95505050505050565b34156103bd57600080fd5b6102df600435610c7a565b34156103d357600080fd5b61017a600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610d4095505050505050565b341561042957600080fd5b61017a600435602435610e8a565b341561044257600080fd5b61044d600435610f63565b60405191825260208201526040908101905180910390f35b341561047057600080fd5b61017a600435600160a060020a0360243516610f80565b6000600160e060020a031982167f3b3b57de0000000000000000000000000000000000000000000000000000000014806104ea5750600160e060020a031982167fd8389dc500000000000000000000000000000000000000000000000000000000145b8061051e5750600160e060020a031982167f691f343100000000000000000000000000000000000000000000000000000000145b806105525750600160e060020a031982167f2203ab5600000000000000000000000000000000000000000000000000000000145b806105865750600160e060020a031982167fc869023300000000000000000000000000000000000000000000000000000000145b806105ba5750600160e060020a031982167f59d1d43c00000000000000000000000000000000000000000000000000000000145b806105ee5750600160e060020a031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561064d57600080fd5b6102c65a03f1151561065e57600080fd5b50505060405180519050600160a060020a031614151561067d57600080fd5b6000848152600160205260409081902083916005909101908590518082805190602001908083835b602083106106c45780518252601f1990920191602091820191016106a5565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051610708929160200190611083565b50826040518082805190602001908083835b602083106107395780518252601f19909201916020918201910161071a565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051908190039020847fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508560405160208082528190810183818151815260200191508051906020019080838360005b838110156107c55780820151838201526020016107ad565b50505050905090810190601f1680156107f25780820380516001836020036101000a031916815260200191505b509250505060405180910390a350505050565b600061080f611101565b60008481526001602081905260409091209092505b838311610922578284161580159061085d5750600083815260068201602052604081205460026000196101006001841615020190911604115b15610917578060060160008481526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561090b5780601f106108e05761010080835404028352916020019161090b565b820191906000526020600020905b8154815290600101906020018083116108ee57829003601f168201915b50505050509150610927565b600290920291610824565b600092505b509250929050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561098857600080fd5b6102c65a03f1151561099957600080fd5b50505060405180519050600160a060020a03161415156109b857600080fd5b6040805190810160409081528482526020808301859052600087815260019091522060030181518155602082015160019091015550837f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46848460405191825260208201526040908101905180910390a250505050565b6000908152600160208190526040909120015490565b600090815260016020526040902054600160a060020a031690565b610a67611101565b60008381526001602052604090819020600501908390518082805190602001908083835b60208310610aaa5780518252601f199092019160209182019101610a8b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b715780601f10610b4657610100808354040283529160200191610b71565b820191906000526020600020905b815481529060010190602001808311610b5457829003601f168201915b5050505050905092915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610bd757600080fd5b6102c65a03f11515610be857600080fd5b50505060405180519050600160a060020a0316141515610c0757600080fd5b6000198301831615610c1857600080fd5b60008481526001602090815260408083208684526006019091529020828051610c45929160200190611083565b5082847faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe360405160405180910390a350505050565b610c82611101565b6001600083600019166000191681526020019081526020016000206002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d345780601f10610d0957610100808354040283529160200191610d34565b820191906000526020600020905b815481529060010190602001808311610d1757829003601f168201915b50505050509050919050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610d9957600080fd5b6102c65a03f11515610daa57600080fd5b50505060405180519050600160a060020a0316141515610dc957600080fd5b6000838152600160205260409020600201828051610deb929160200190611083565b50827fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f78360405160208082528190810183818151815260200191508051906020019080838360005b83811015610e4b578082015183820152602001610e33565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610ee357600080fd5b6102c65a03f11515610ef457600080fd5b50505060405180519050600160a060020a0316141515610f1357600080fd5b6000838152600160208190526040918290200183905583907f0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc9084905190815260200160405180910390a2505050565b600090815260016020526040902060038101546004909101549091565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610fd957600080fd5b6102c65a03f11515610fea57600080fd5b50505060405180519050600160a060020a031614151561100957600080fd5b60008381526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03851617905583907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd290849051600160a060020a03909116815260200160405180910390a2505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106110c457805160ff19168380011785556110f1565b828001600101855582156110f1579182015b828111156110f15782518255916020019190600101906110d6565b506110fd929150611113565b5090565b60206040519081016040526000815290565b61112d91905b808211156110fd5760008155600101611119565b905600a165627a7a723058206016a807d9d5f6060e9c0d1c808e52d4ca30a4cab0140adcc6587bfc13bedf100029" -resolver_bytecode_runtime = "606060405236156100a95763ffffffff60e060020a60003504166301ffc9a781146100ae57806310f13a8c146100e25780632203ab561461017c57806329cd62ea146102135780632dff69411461022f5780633b3b57de1461025757806359d1d43c14610289578063623195b014610356578063691f3431146103b257806377372213146103c8578063c3d014d61461041e578063c869023314610437578063d5fa2b0014610465575b600080fd5b34156100b957600080fd5b6100ce600160e060020a031960043516610487565b604051901515815260200160405180910390f35b34156100ed57600080fd5b61017a600480359060446024803590810190830135806020601f8201819004810201604051908101604052818152929190602084018383808284378201915050505050509190803590602001908201803590602001908080601f0160208091040260200160405190810160405281815292919060208401838380828437509496506105f495505050505050565b005b341561018757600080fd5b610195600435602435610805565b60405182815260406020820181815290820183818151815260200191508051906020019080838360005b838110156101d75780820151838201526020016101bf565b50505050905090810190601f1680156102045780820380516001836020036101000a031916815260200191505b50935050505060405180910390f35b341561021e57600080fd5b61017a60043560243560443561092f565b341561023a57600080fd5b610245600435610a2e565b60405190815260200160405180910390f35b341561026257600080fd5b61026d600435610a44565b604051600160a060020a03909116815260200160405180910390f35b341561029457600080fd5b6102df600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610a5f95505050505050565b60405160208082528190810183818151815260200191508051906020019080838360005b8381101561031b578082015183820152602001610303565b50505050905090810190601f1680156103485780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561036157600080fd5b61017a600480359060248035919060649060443590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610b7e95505050505050565b34156103bd57600080fd5b6102df600435610c7a565b34156103d357600080fd5b61017a600480359060446024803590810190830135806020601f82018190048102016040519081016040528181529291906020840183838082843750949650610d4095505050505050565b341561042957600080fd5b61017a600435602435610e8a565b341561044257600080fd5b61044d600435610f63565b60405191825260208201526040908101905180910390f35b341561047057600080fd5b61017a600435600160a060020a0360243516610f80565b6000600160e060020a031982167f3b3b57de0000000000000000000000000000000000000000000000000000000014806104ea5750600160e060020a031982167fd8389dc500000000000000000000000000000000000000000000000000000000145b8061051e5750600160e060020a031982167f691f343100000000000000000000000000000000000000000000000000000000145b806105525750600160e060020a031982167f2203ab5600000000000000000000000000000000000000000000000000000000145b806105865750600160e060020a031982167fc869023300000000000000000000000000000000000000000000000000000000145b806105ba5750600160e060020a031982167f59d1d43c00000000000000000000000000000000000000000000000000000000145b806105ee5750600160e060020a031982167f01ffc9a700000000000000000000000000000000000000000000000000000000145b92915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561064d57600080fd5b6102c65a03f1151561065e57600080fd5b50505060405180519050600160a060020a031614151561067d57600080fd5b6000848152600160205260409081902083916005909101908590518082805190602001908083835b602083106106c45780518252601f1990920191602091820191016106a5565b6001836020036101000a0380198251168184511680821785525050505050509050019150509081526020016040518091039020908051610708929160200190611083565b50826040518082805190602001908083835b602083106107395780518252601f19909201916020918201910161071a565b6001836020036101000a0380198251168184511617909252505050919091019250604091505051908190039020847fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a75508560405160208082528190810183818151815260200191508051906020019080838360005b838110156107c55780820151838201526020016107ad565b50505050905090810190601f1680156107f25780820380516001836020036101000a031916815260200191505b509250505060405180910390a350505050565b600061080f611101565b60008481526001602081905260409091209092505b838311610922578284161580159061085d5750600083815260068201602052604081205460026000196101006001841615020190911604115b15610917578060060160008481526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561090b5780601f106108e05761010080835404028352916020019161090b565b820191906000526020600020905b8154815290600101906020018083116108ee57829003601f168201915b50505050509150610927565b600290920291610824565b600092505b509250929050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b151561098857600080fd5b6102c65a03f1151561099957600080fd5b50505060405180519050600160a060020a03161415156109b857600080fd5b6040805190810160409081528482526020808301859052600087815260019091522060030181518155602082015160019091015550837f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e46848460405191825260208201526040908101905180910390a250505050565b6000908152600160208190526040909120015490565b600090815260016020526040902054600160a060020a031690565b610a67611101565b60008381526001602052604090819020600501908390518082805190602001908083835b60208310610aaa5780518252601f199092019160209182019101610a8b565b6001836020036101000a03801982511681845116808217855250505050505090500191505090815260200160405180910390208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610b715780601f10610b4657610100808354040283529160200191610b71565b820191906000526020600020905b815481529060010190602001808311610b5457829003601f168201915b5050505050905092915050565b600080548491600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610bd757600080fd5b6102c65a03f11515610be857600080fd5b50505060405180519050600160a060020a0316141515610c0757600080fd5b6000198301831615610c1857600080fd5b60008481526001602090815260408083208684526006019091529020828051610c45929160200190611083565b5082847faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe360405160405180910390a350505050565b610c82611101565b6001600083600019166000191681526020019081526020016000206002018054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d345780601f10610d0957610100808354040283529160200191610d34565b820191906000526020600020905b815481529060010190602001808311610d1757829003601f168201915b50505050509050919050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610d9957600080fd5b6102c65a03f11515610daa57600080fd5b50505060405180519050600160a060020a0316141515610dc957600080fd5b6000838152600160205260409020600201828051610deb929160200190611083565b50827fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f78360405160208082528190810183818151815260200191508051906020019080838360005b83811015610e4b578082015183820152602001610e33565b50505050905090810190601f168015610e785780820380516001836020036101000a031916815260200191505b509250505060405180910390a2505050565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610ee357600080fd5b6102c65a03f11515610ef457600080fd5b50505060405180519050600160a060020a0316141515610f1357600080fd5b6000838152600160208190526040918290200183905583907f0424b6fe0d9c3bdbece0e7879dc241bb0c22e900be8b6c168b4ee08bd9bf83bc9084905190815260200160405180910390a2505050565b600090815260016020526040902060038101546004909101549091565b600080548391600160a060020a033381169216906302571be39084906040516020015260405160e060020a63ffffffff84160281526004810191909152602401602060405180830381600087803b1515610fd957600080fd5b6102c65a03f11515610fea57600080fd5b50505060405180519050600160a060020a031614151561100957600080fd5b60008381526001602052604090819020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03851617905583907f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd290849051600160a060020a03909116815260200160405180910390a2505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106110c457805160ff19168380011785556110f1565b828001600101855582156110f1579182015b828111156110f15782518255916020019190600101906110d6565b506110fd929150611113565b5090565b60206040519081016040526000815290565b61112d91905b808211156110fd5760008155600101611119565b905600a165627a7a723058206016a807d9d5f6060e9c0d1c808e52d4ca30a4cab0140adcc6587bfc13bedf100029" +# ENS Default Registrar +registrar_abi = json.loads('[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"},{"internalType":"bytes32","name":"_baseNode","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"}],"name":"ControllerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"controller","type":"address"}],"name":"ControllerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameMigrated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameRegistered","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"expires","type":"uint256"}],"name":"NameRenewed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"constant":true,"inputs":[],"name":"GRACE_PERIOD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"addController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"available","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"baseNode","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"controllers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"ens","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"nameExpires","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"}],"name":"reclaim","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"register","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"registerOnly","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"controller","type":"address"}],"name":"removeController","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"}],"name":"renew","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"resolver","type":"address"}],"name":"setResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]') +registrar_bytecode = '60806040523480156200001157600080fd5b5060405160408062002e71833981018060405260408110156200003357600080fd5b8101908080519060200190929190805190602001909291905050506200008b6301ffc9a77c010000000000000000000000000000000000000000000000000000000002620001d6640100000000026401000000009004565b33600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3620001866380ac58cd7c010000000000000000000000000000000000000000000000000000000002620001d6640100000000026401000000009004565b81600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600381905550505062000294565b63ffffffff7c010000000000000000000000000000000000000000000000000000000002817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916141515156200022857600080fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b612bcd80620002a46000396000f3fe60806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a714610164578063081812fc146101d6578063095ea7b3146102515780630e297b45146102ac57806323b872dd1461032557806328ed4f6c146103a05780633f15457f146103fb57806342842e0e146104525780634e543b26146104cd5780636352211e1461051e57806370a0823114610599578063715018a6146105fe5780638da5cb5b146106155780638f32d59b1461066c57806396e494e81461069b578063a22cb465146106ee578063a7fc7a071461074b578063b88d4fde1461079c578063c1a287e2146108ae578063c475abff146108d9578063d6e4fa8614610932578063da8c229e14610981578063ddf7fcb0146109ea578063e985e9c514610a15578063f2fde38b14610a9e578063f6a74ed714610aef578063fca247ac14610b40575b600080fd5b34801561017057600080fd5b506101bc6004803603602081101561018757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610bb9565b604051808215151515815260200191505060405180910390f35b3480156101e257600080fd5b5061020f600480360360208110156101f957600080fd5b8101908080359060200190929190505050610f82565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025d57600080fd5b506102aa6004803603604081101561027457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fd3565b005b3480156102b857600080fd5b5061030f600480360360608110156102cf57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611118565b6040518082815260200191505060405180910390f35b34801561033157600080fd5b5061039e6004803603606081101561034857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611130565b005b3480156103ac57600080fd5b506103f9600480360360408110156103c357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611155565b005b34801561040757600080fd5b50610410611381565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561045e57600080fd5b506104cb6004803603606081101561047557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a7565b005b3480156104d957600080fd5b5061051c600480360360208110156104f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113c8565b005b34801561052a57600080fd5b506105576004803603602081101561054157600080fd5b81019080803590602001909291905050506114bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105a557600080fd5b506105e8600480360360208110156105bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114f0565b6040518082815260200191505060405180910390f35b34801561060a57600080fd5b50610613611574565b005b34801561062157600080fd5b5061062a611648565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561067857600080fd5b50610681611672565b604051808215151515815260200191505060405180910390f35b3480156106a757600080fd5b506106d4600480360360208110156106be57600080fd5b81019080803590602001909291905050506116ca565b604051808215151515815260200191505060405180910390f35b3480156106fa57600080fd5b506107496004803603604081101561071157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506116ee565b005b34801561075757600080fd5b5061079a6004803603602081101561076e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061182a565b005b3480156107a857600080fd5b506108ac600480360360808110156107bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561082657600080fd5b82018360208201111561083857600080fd5b8035906020019184600183028401116401000000008311171561085a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506118db565b005b3480156108ba57600080fd5b506108c3611903565b6040518082815260200191505060405180910390f35b3480156108e557600080fd5b5061091c600480360360408110156108fc57600080fd5b81019080803590602001909291908035906020019092919050505061190a565b6040518082815260200191505060405180910390f35b34801561093e57600080fd5b5061096b6004803603602081101561095557600080fd5b8101908080359060200190929190505050611b45565b6040518082815260200191505060405180910390f35b34801561098d57600080fd5b506109d0600480360360208110156109a457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b62565b604051808215151515815260200191505060405180910390f35b3480156109f657600080fd5b506109ff611b82565b6040518082815260200191505060405180910390f35b348015610a2157600080fd5b50610a8460048036036040811015610a3857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b88565b604051808215151515815260200191505060405180910390f35b348015610aaa57600080fd5b50610aed60048036036020811015610ac157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c1c565b005b348015610afb57600080fd5b50610b3e60048036036020811015610b1257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c3b565b005b348015610b4c57600080fd5b50610ba360048036036060811015610b6357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cec565b6040518082815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610efe575060405180807f736166655472616e7366657246726f6d28616464726573732c6164647265737381526020017f2c75696e743235362c6279746573290000000000000000000000000000000000815250602f019050604051809103902060405180807f736166655472616e7366657246726f6d28616464726573732c6164647265737381526020017f2c75696e743235362900000000000000000000000000000000000000000000008152506029019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f6973417070726f766564466f72416c6c28616464726573732c6164647265737381526020017f29000000000000000000000000000000000000000000000000000000000000008152506021019050604051809103902060405180807f736574417070726f76616c466f72416c6c28616464726573732c626f6f6c2900815250601f019050604051809103902060405180807f676574417070726f7665642875696e74323536290000000000000000000000008152506014019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902018181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f7b575060405180807f7265636c61696d2875696e743235362c61646472657373290000000000000000815250601801905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000610f8d82611d04565b1515610f9857600080fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fde826114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561101b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061105b575061105a8133611b88565b5b151561106657600080fd5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006111278484846000611d76565b90509392505050565b61113a33826120b2565b151561114557600080fd5b611150838383612147565b505050565b3073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36003546040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b1580156111fd57600080fd5b505afa158015611211573d6000803e3d6000fd5b505050506040513d602081101561122757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614151561125a57600080fd5b61126433836120b2565b151561126f57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab592360035484600102846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050602060405180830381600087803b15801561134157600080fd5b505af1158015611355573d6000803e3d6000fd5b505050506040513d602081101561136b57600080fd5b8101908080519060200190929190505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113c383838360206040519081016040528060008152506118db565b505050565b6113d0611672565b15156113db57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631896f70a600354836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156114a257600080fd5b505af11580156114b6573d6000803e3d6000fd5b5050505050565b60004260096000848152602001908152602001600020541115156114e057600080fd5b6114e9826123ac565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561152d57600080fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61157c611672565b151561158757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000426276a700600960008581526020019081526020016000205401109050919050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561172957600080fd5b80600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611832611672565b151561183d57600080fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f0a8bb31534c0ed46f380cb867bd5c803a189ced9a764e30b3a4991a9901d747460405160405180910390a250565b6118e6848484611130565b6118f28484848461242a565b15156118fd57600080fd5b50505050565b6276a70081565b60003073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36003546040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d60208110156119de57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515611a1157600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611a6957600080fd5b426276a70060096000868152602001908152602001600020540110151515611a9057600080fd5b6276a70082016276a7008360096000878152602001908152602001600020540101111515611abd57600080fd5b816009600085815260200190815260200160002060008282540192505081905550827f9b87a00e30f1ac65d898f070f8a3488fe60517182d0a2098e1b4b93a54aa9bd660096000868152602001908152602001600020546040518082815260200191505060405180910390a26009600084815260200190815260200160002054905092915050565b600060096000838152602001908152602001600020549050919050565b60046020528060005260406000206000915054906101000a900460ff1681565b60035481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c24611672565b1515611c2f57600080fd5b611c388161264d565b50565b611c43611672565b1515611c4e57600080fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f33d83959be2573f5453b12eb9d43b3499bc57d96bd2f067ba44803c859e8111360405160405180910390a250565b6000611cfb8484846001611d76565b90509392505050565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60003073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36003546040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b158015611e2057600080fd5b505afa158015611e34573d6000803e3d6000fd5b505050506040513d6020811015611e4a57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515611e7d57600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611ed557600080fd5b611ede856116ca565b1515611ee957600080fd5b6276a70042016276a70084420101111515611f0357600080fd5b8242016009600087815260200190815260200160002081905550611f2685611d04565b15611f3557611f3485612749565b5b611f3f848661275e565b811561205457600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab592360035487600102876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050602060405180830381600087803b15801561201757600080fd5b505af115801561202b573d6000803e3d6000fd5b505050506040513d602081101561204157600080fd5b8101908080519060200190929190505050505b8373ffffffffffffffffffffffffffffffffffffffff16857fb3d987963d01b2f68493b4bdb130988f157ea43070d4ad840fee0466ed9370d98542016040518082815260200191505060405180910390a38242019050949350505050565b6000806120be836114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061212d57508373ffffffffffffffffffffffffffffffffffffffff1661211584610f82565b73ffffffffffffffffffffffffffffffffffffffff16145b8061213e575061213d8185611b88565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612167826114bd565b73ffffffffffffffffffffffffffffffffffffffff1614151561218957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156121c557600080fd5b6121ce816128f7565b6122216001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129b790919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122b76001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129d990919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561242157600080fd5b80915050919050565b600061244b8473ffffffffffffffffffffffffffffffffffffffff166129fa565b151561245a5760019050612645565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612551578082015181840152602081019050612536565b50505050905090810190601f16801561257e5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156125a057600080fd5b505af11580156125b4573d6000803e3d6000fd5b505050506040513d60208110156125ca57600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561268957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61275b612755826114bd565b82612a0d565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561279a57600080fd5b6127a381611d04565b1515156127af57600080fd5b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506128546001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129d990919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156129b45760006006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008282111515156129c857600080fd5b600082840390508091505092915050565b60008082840190508381101515156129f057600080fd5b8091505092915050565b600080823b905060008111915050919050565b8173ffffffffffffffffffffffffffffffffffffffff16612a2d826114bd565b73ffffffffffffffffffffffffffffffffffffffff16141515612a4f57600080fd5b612a58816128f7565b612aab6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129b790919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505056fea165627a7a72305820af9388697026a32fc11fae5e11a7544e431f49880e9dccb1eb61220f2ec18abc0029' +registrar_bytecode_runtime = '60806040526004361061015f576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a714610164578063081812fc146101d6578063095ea7b3146102515780630e297b45146102ac57806323b872dd1461032557806328ed4f6c146103a05780633f15457f146103fb57806342842e0e146104525780634e543b26146104cd5780636352211e1461051e57806370a0823114610599578063715018a6146105fe5780638da5cb5b146106155780638f32d59b1461066c57806396e494e81461069b578063a22cb465146106ee578063a7fc7a071461074b578063b88d4fde1461079c578063c1a287e2146108ae578063c475abff146108d9578063d6e4fa8614610932578063da8c229e14610981578063ddf7fcb0146109ea578063e985e9c514610a15578063f2fde38b14610a9e578063f6a74ed714610aef578063fca247ac14610b40575b600080fd5b34801561017057600080fd5b506101bc6004803603602081101561018757600080fd5b8101908080357bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19169060200190929190505050610bb9565b604051808215151515815260200191505060405180910390f35b3480156101e257600080fd5b5061020f600480360360208110156101f957600080fd5b8101908080359060200190929190505050610f82565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561025d57600080fd5b506102aa6004803603604081101561027457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050610fd3565b005b3480156102b857600080fd5b5061030f600480360360608110156102cf57600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611118565b6040518082815260200191505060405180910390f35b34801561033157600080fd5b5061039e6004803603606081101561034857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611130565b005b3480156103ac57600080fd5b506103f9600480360360408110156103c357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611155565b005b34801561040757600080fd5b50610410611381565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561045e57600080fd5b506104cb6004803603606081101561047557600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291905050506113a7565b005b3480156104d957600080fd5b5061051c600480360360208110156104f057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506113c8565b005b34801561052a57600080fd5b506105576004803603602081101561054157600080fd5b81019080803590602001909291905050506114bd565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156105a557600080fd5b506105e8600480360360208110156105bc57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506114f0565b6040518082815260200191505060405180910390f35b34801561060a57600080fd5b50610613611574565b005b34801561062157600080fd5b5061062a611648565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561067857600080fd5b50610681611672565b604051808215151515815260200191505060405180910390f35b3480156106a757600080fd5b506106d4600480360360208110156106be57600080fd5b81019080803590602001909291905050506116ca565b604051808215151515815260200191505060405180910390f35b3480156106fa57600080fd5b506107496004803603604081101561071157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291908035151590602001909291905050506116ee565b005b34801561075757600080fd5b5061079a6004803603602081101561076e57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061182a565b005b3480156107a857600080fd5b506108ac600480360360808110156107bf57600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803590602001909291908035906020019064010000000081111561082657600080fd5b82018360208201111561083857600080fd5b8035906020019184600183028401116401000000008311171561085a57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505091929192905050506118db565b005b3480156108ba57600080fd5b506108c3611903565b6040518082815260200191505060405180910390f35b3480156108e557600080fd5b5061091c600480360360408110156108fc57600080fd5b81019080803590602001909291908035906020019092919050505061190a565b6040518082815260200191505060405180910390f35b34801561093e57600080fd5b5061096b6004803603602081101561095557600080fd5b8101908080359060200190929190505050611b45565b6040518082815260200191505060405180910390f35b34801561098d57600080fd5b506109d0600480360360208110156109a457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b62565b604051808215151515815260200191505060405180910390f35b3480156109f657600080fd5b506109ff611b82565b6040518082815260200191505060405180910390f35b348015610a2157600080fd5b50610a8460048036036040811015610a3857600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611b88565b604051808215151515815260200191505060405180910390f35b348015610aaa57600080fd5b50610aed60048036036020811015610ac157600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c1c565b005b348015610afb57600080fd5b50610b3e60048036036020811015610b1257600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050611c3b565b005b348015610b4c57600080fd5b50610ba360048036036060811015610b6357600080fd5b8101908080359060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919080359060200190929190505050611cec565b6040518082815260200191505060405180910390f35b600060405180807f737570706f727473496e74657266616365286279746573342900000000000000815250601901905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610efe575060405180807f736166655472616e7366657246726f6d28616464726573732c6164647265737381526020017f2c75696e743235362c6279746573290000000000000000000000000000000000815250602f019050604051809103902060405180807f736166655472616e7366657246726f6d28616464726573732c6164647265737381526020017f2c75696e743235362900000000000000000000000000000000000000000000008152506029019050604051809103902060405180807f7472616e7366657246726f6d28616464726573732c616464726573732c75696e81526020017f74323536290000000000000000000000000000000000000000000000000000008152506025019050604051809103902060405180807f6973417070726f766564466f72416c6c28616464726573732c6164647265737381526020017f29000000000000000000000000000000000000000000000000000000000000008152506021019050604051809103902060405180807f736574417070726f76616c466f72416c6c28616464726573732c626f6f6c2900815250601f019050604051809103902060405180807f676574417070726f7665642875696e74323536290000000000000000000000008152506014019050604051809103902060405180807f617070726f766528616464726573732c75696e743235362900000000000000008152506018019050604051809103902060405180807f6f776e65724f662875696e7432353629000000000000000000000000000000008152506010019050604051809103902060405180807f62616c616e63654f6628616464726573732900000000000000000000000000008152506012019050604051809103902018181818181818187bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610f7b575060405180807f7265636c61696d2875696e743235362c61646472657373290000000000000000815250601801905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6000610f8d82611d04565b1515610f9857600080fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610fde826114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415151561101b57600080fd5b8073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061105b575061105a8133611b88565b5b151561106657600080fd5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006111278484846000611d76565b90509392505050565b61113a33826120b2565b151561114557600080fd5b611150838383612147565b505050565b3073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36003546040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b1580156111fd57600080fd5b505afa158015611211573d6000803e3d6000fd5b505050506040513d602081101561122757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614151561125a57600080fd5b61126433836120b2565b151561126f57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab592360035484600102846040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050602060405180830381600087803b15801561134157600080fd5b505af1158015611355573d6000803e3d6000fd5b505050506040513d602081101561136b57600080fd5b8101908080519060200190929190505050505050565b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6113c383838360206040519081016040528060008152506118db565b505050565b6113d0611672565b15156113db57600080fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631896f70a600354836040518363ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b1580156114a257600080fd5b505af11580156114b6573d6000803e3d6000fd5b5050505050565b60004260096000848152602001908152602001600020541115156114e057600080fd5b6114e9826123ac565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561152d57600080fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61157c611672565b151561158757600080fd5b600073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614905090565b6000426276a700600960008581526020019081526020016000205401109050919050565b3373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561172957600080fd5b80600860003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051808215151515815260200191505060405180910390a35050565b611832611672565b151561183d57600080fd5b6001600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f0a8bb31534c0ed46f380cb867bd5c803a189ced9a764e30b3a4991a9901d747460405160405180910390a250565b6118e6848484611130565b6118f28484848461242a565b15156118fd57600080fd5b50505050565b6276a70081565b60003073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36003546040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b1580156119b457600080fd5b505afa1580156119c8573d6000803e3d6000fd5b505050506040513d60208110156119de57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515611a1157600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611a6957600080fd5b426276a70060096000868152602001908152602001600020540110151515611a9057600080fd5b6276a70082016276a7008360096000878152602001908152602001600020540101111515611abd57600080fd5b816009600085815260200190815260200160002060008282540192505081905550827f9b87a00e30f1ac65d898f070f8a3488fe60517182d0a2098e1b4b93a54aa9bd660096000868152602001908152602001600020546040518082815260200191505060405180910390a26009600084815260200190815260200160002054905092915050565b600060096000838152602001908152602001600020549050919050565b60046020528060005260406000206000915054906101000a900460ff1681565b60035481565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611c24611672565b1515611c2f57600080fd5b611c388161264d565b50565b611c43611672565b1515611c4e57600080fd5b6000600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508073ffffffffffffffffffffffffffffffffffffffff167f33d83959be2573f5453b12eb9d43b3499bc57d96bd2f067ba44803c859e8111360405160405180910390a250565b6000611cfb8484846001611d76565b90509392505050565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415915050919050565b60003073ffffffffffffffffffffffffffffffffffffffff16600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be36003546040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b158015611e2057600080fd5b505afa158015611e34573d6000803e3d6000fd5b505050506040513d6020811015611e4a57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515611e7d57600080fd5b600460003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161515611ed557600080fd5b611ede856116ca565b1515611ee957600080fd5b6276a70042016276a70084420101111515611f0357600080fd5b8242016009600087815260200190815260200160002081905550611f2685611d04565b15611f3557611f3485612749565b5b611f3f848661275e565b811561205457600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab592360035487600102876040518463ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808481526020018381526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050602060405180830381600087803b15801561201757600080fd5b505af115801561202b573d6000803e3d6000fd5b505050506040513d602081101561204157600080fd5b8101908080519060200190929190505050505b8373ffffffffffffffffffffffffffffffffffffffff16857fb3d987963d01b2f68493b4bdb130988f157ea43070d4ad840fee0466ed9370d98542016040518082815260200191505060405180910390a38242019050949350505050565b6000806120be836114bd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061212d57508373ffffffffffffffffffffffffffffffffffffffff1661211584610f82565b73ffffffffffffffffffffffffffffffffffffffff16145b8061213e575061213d8185611b88565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612167826114bd565b73ffffffffffffffffffffffffffffffffffffffff1614151561218957600080fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141515156121c557600080fd5b6121ce816128f7565b6122216001600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129b790919063ffffffff16565b600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506122b76001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129d990919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561242157600080fd5b80915050919050565b600061244b8473ffffffffffffffffffffffffffffffffffffffff166129fa565b151561245a5760019050612645565b60008473ffffffffffffffffffffffffffffffffffffffff1663150b7a02338887876040518563ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b83811015612551578082015181840152602081019050612536565b50505050905090810190601f16801561257e5780820380516001836020036101000a031916815260200191505b5095505050505050602060405180830381600087803b1580156125a057600080fd5b505af11580156125b4573d6000803e3d6000fd5b505050506040513d60208110156125ca57600080fd5b8101908080519060200190929190505050905063150b7a027c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150505b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415151561268957600080fd5b8073ffffffffffffffffffffffffffffffffffffffff16600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61275b612755826114bd565b82612a0d565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415151561279a57600080fd5b6127a381611d04565b1515156127af57600080fd5b816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506128546001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129d990919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff166006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415156129b45760006006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b50565b60008282111515156129c857600080fd5b600082840390508091505092915050565b60008082840190508381101515156129f057600080fd5b8091505092915050565b600080823b905060008111915050919050565b8173ffffffffffffffffffffffffffffffffffffffff16612a2d826114bd565b73ffffffffffffffffffffffffffffffffffffffff16141515612a4f57600080fd5b612a58816128f7565b612aab6001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546129b790919063ffffffff16565b600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555060006005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505056fea165627a7a72305820af9388697026a32fc11fae5e11a7544e431f49880e9dccb1eb61220f2ec18abc0029' +# ENS Public Resolver 2 +resolver_abi = json.loads('[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","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":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","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":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":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"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]') +resolver_bytecode = '60806040523480156200001157600080fd5b506040516020806200399f833981018060405262000033919081019062000091565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000105565b6000620000898251620000f1565b905092915050565b600060208284031215620000a457600080fd5b6000620000b4848285016200007b565b91505092915050565b6000620000ca82620000d1565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620000fe82620000bd565b9050919050565b61388a80620001156000396000f3fe608060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101385780630af179d71461017557806310f13a8c1461019e578063124a319c146101c75780632203ab561461020457806329cd62ea14610242578063304e6ade1461026b5780633b3b57de146102945780633e9ce794146102d15780634cbf6ba4146102fa57806359d1d43c14610337578063623195b014610374578063691f34311461039d57806377372213146103da5780638b95dd7114610403578063a8fa56821461042c578063ad5780af14610469578063bc1c58d114610492578063c8690233146104cf578063d5fa2b001461050d578063e59d895d14610536578063f1cb7e061461055f578063f86bc8791461059c575b600080fd5b34801561014457600080fd5b5061015f600480360361015a9190810190613148565b6105d9565b60405161016c91906132df565b60405180910390f35b34801561018157600080fd5b5061019c60048036036101979190810190612f00565b610656565b005b3480156101aa57600080fd5b506101c560048036036101c09190810190612fb0565b6108d5565b005b3480156101d357600080fd5b506101ee60048036036101e99190810190612e75565b610979565b6040516101fb91906132a9565b60405180910390f35b34801561021057600080fd5b5061022b60048036036102269190810190613039565b610ede565b60405161023992919061361e565b60405180910390f35b34801561024e57600080fd5b5061026960048036036102649190810190612dd7565b611033565b005b34801561027757600080fd5b50610292600480360361028d9190810190612f00565b6110c8565b005b3480156102a057600080fd5b506102bb60048036036102b69190810190612c98565b611141565b6040516102c891906132c4565b60405180910390f35b3480156102dd57600080fd5b506102f860048036036102f39190810190612d4c565b611178565b005b34801561030657600080fd5b50610321600480360361031c9190810190612d9b565b61125f565b60405161032e91906132df565b60405180910390f35b34801561034357600080fd5b5061035e60048036036103599190810190612f58565b6112c7565b60405161036b91906135fc565b60405180910390f35b34801561038057600080fd5b5061039b60048036036103969190810190613075565b6113a3565b005b3480156103a957600080fd5b506103c460048036036103bf9190810190612c98565b61143f565b6040516103d191906135fc565b60405180910390f35b3480156103e657600080fd5b5061040160048036036103fc9190810190612f58565b6114f4565b005b34801561040f57600080fd5b5061042a600480360361042591908101906130e1565b61156d565b005b34801561043857600080fd5b50610453600480360361044e9190810190612e26565b611647565b60405161046091906135da565b60405180910390f35b34801561047557600080fd5b50610490600480360361048b9190810190612c98565b61174c565b005b34801561049e57600080fd5b506104b960048036036104b49190810190612c98565b6117bf565b6040516104c691906135da565b60405180910390f35b3480156104db57600080fd5b506104f660048036036104f19190810190612c98565b611874565b604051610504929190613383565b60405180910390f35b34801561051957600080fd5b50610534600480360361052f9190810190612cc1565b6118ae565b005b34801561054257600080fd5b5061055d60048036036105589190810190612eb1565b6118dc565b005b34801561056b57600080fd5b5061058660048036036105819190810190613039565b6119d3565b60405161059391906135da565b60405180910390f35b3480156105a857600080fd5b506105c360048036036105be9190810190612cfd565b611a9a565b6040516105d091906132df565b60405180910390f35b60006359d1d43c7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f575061064e82611ad6565b5b9050919050565b8261066081611b53565b151561066b57600080fd5b6000809050600080905060608060006106826128bc565b6106da60008a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611cf890919063ffffffff16565b90505b6106e681611d22565b15156108625760008661ffff161415610791578060400151955061070981611d38565b9350836040516020018082805190602001908083835b602083101515610744578051825260208201915060208101905060208303925061071f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120915061078a81611d6f565b9250610854565b606061079c82611d38565b9050816040015161ffff168761ffff161415806107c957506107c78186611d9f90919063ffffffff16565b155b156108525761082b8b86898d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8b88602001510360008b5114611dc6565b81604001519650816020015195508094508480519060200120925061084f82611d6f565b93505b505b61085d816120fa565b6106dd565b506000835111156108ca576108c98984878b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088898e8e9050036000895114611dc6565b5b505050505050505050565b846108df81611b53565b15156108ea57600080fd5b828260096000898152602001908152602001600020878760405180838380828437808301925050509250505090815260200160405180910390209190610931929190612908565b507fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550868686888860405161096995949392919061350f565b60405180910390a1505050505050565b600080600660008581526020019081526020016000206000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610a405780915050610ed8565b6000610a4b85611141565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a8d57600092505050610ed8565b600060608273ffffffffffffffffffffffffffffffffffffffff166301ffc9a77c010000000000000000000000000000000000000000000000000000000002604051602401610adc91906135bf565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083101515610b8e5780518252602082019150602081019050602083039250610b69565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610bee576040519150601f19603f3d011682016040523d82523d6000602084013e610bf3565b606091505b5091509150811580610c06575060208151105b80610cae575060007f01000000000000000000000000000000000000000000000000000000000000000281601f815181101515610c3f57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610cc0576000945050505050610ed8565b8273ffffffffffffffffffffffffffffffffffffffff1686604051602401610ce891906135bf565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083101515610d9a5780518252602082019150602081019050602083039250610d75565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610dfa576040519150601f19603f3d011682016040523d82523d6000602084013e610dff565b606091505b508092508193505050811580610e16575060208151105b80610ebe575060007f01000000000000000000000000000000000000000000000000000000000000000281601f815181101515610e4f57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610ed0576000945050505050610ed8565b829450505050505b92915050565b60006060600080600086815260200190815260200160002090506000600190505b848111151561100f57600085821614158015610f4157506000826000838152602001908152602001600020805460018160011615610100020316600290049050115b156110005780826000838152602001908152602001600020808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fee5780601f10610fc357610100808354040283529160200191610fee565b820191906000526020600020905b815481529060010190602001808311610fd157829003601f168201915b5050505050905093509350505061102c565b6001819060020a029050610eff565b506000602060405190810160405280600081525081915092509250505b9250929050565b8261103d81611b53565b151561104857600080fd5b6040805190810160405280848152602001838152506008600086815260200190815260200160002060008201518160000155602082015181600101559050507f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e468484846040516110ba939291906133ac565b60405180910390a150505050565b826110d281611b53565b15156110dd57600080fd5b82826002600087815260200190815260200160002091906110ff929190612988565b507fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d75788484846040516111339392919061341a565b60405180910390a150505050565b6000606061115083603c6119d3565b9050600081511415611166576000915050611173565b61116f81612210565b9150505b919050565b80600b600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df83338484604051611252949392919061333e565b60405180910390a1505050565b60008060056000858152602001908152602001600020600060036000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060009054906101000a900461ffff1661ffff161415905092915050565b606060096000858152602001908152602001600020838360405180838380828437808301925050509250505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113955780601f1061136a57610100808354040283529160200191611395565b820191906000526020600020905b81548152906001019060200180831161137857829003601f168201915b505050505090509392505050565b836113ad81611b53565b15156113b857600080fd5b60008460018603161415156113cc57600080fd5b8282600080888152602001908152602001600020600087815260200190815260200160002091906113fe929190612988565b507faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe38585604051611430929190613558565b60405180910390a15050505050565b6060600760008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114e85780601f106114bd576101008083540402835291602001916114e8565b820191906000526020600020905b8154815290600101906020018083116114cb57829003601f168201915b50505050509050919050565b826114fe81611b53565b151561150957600080fd5b828260076000878152602001908152602001600020919061152b929190612908565b507fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f784848460405161155f939291906134dd565b60405180910390a150505050565b8261157781611b53565b151561158257600080fd5b7f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528484846040516115b593929190613581565b60405180910390a1603c831415611608577f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2846115f184612210565b6040516115ff929190613315565b60405180910390a15b816001600086815260200190815260200160002060008581526020019081526020016000209080519060200190611640929190612a08565b5050505050565b606060046000858152602001908152602001600020600060036000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060008361ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561173e5780601f106117135761010080835404028352916020019161173e565b820191906000526020600020905b81548152906001019060200180831161172157829003601f168201915b505050505090509392505050565b8061175681611b53565b151561176157600080fd5b60036000838152602001908152602001600020600081548092919060010191905055507fb757169b8492ca2f1c6619d9d76ce22803035c3b1d5f6930dffe7b127c1a1983826040516117b391906132fa565b60405180910390a15050565b6060600260008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118685780601f1061183d57610100808354040283529160200191611868565b820191906000526020600020905b81548152906001019060200180831161184b57829003601f168201915b50505050509050919050565b6000806008600084815260200190815260200160002060000154600860008581526020019081526020016000206001015491509150915091565b816118b881611b53565b15156118c357600080fd5b6118d783603c6118d285612235565b61156d565b505050565b826118e681611b53565b15156118f157600080fd5b81600660008681526020019081526020016000206000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa8484846040516119c5939291906133e3565b60405180910390a150505050565b60606001600084815260200190815260200160002060008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a8d5780601f10611a6257610100808354040283529160200191611a8d565b820191906000526020600020905b815481529060010190602001808311611a7057829003601f168201915b5050505050905092915050565b600b602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b600063c86902337c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b4c5750611b4b82612280565b5b9050919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611bcd91906132fa565b60206040518083038186803b158015611be557600080fd5b505afa158015611bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c1d9190810190612c6f565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611cf05750600b600084815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b915050919050565b611d006128bc565b828160000181905250818160c0018181525050611d1c816120fa565b92915050565b6000816000015151826020015110159050919050565b6060611d688260200151611d54846000015185602001516122fd565b846000015161235a9092919063ffffffff16565b9050919050565b6060611d988260a001518360a001518460c0015103846000015161235a9092919063ffffffff16565b9050919050565b600081518351148015611dbe5750611dbd83600084600087516123cf565b5b905092915050565b6000600360008981526020019081526020016000205490506000878051906020012090506060611e0186868961235a9092919063ffffffff16565b90508315611f79576000600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff168152602001908152602001600020805460018160011615610100020316600290049050141515611edf57600560008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff16809291906001900391906101000a81548161ffff021916908361ffff160217905550505b600460008b81526020019081526020016000206000848152602001908152602001600020600083815260200190815260200160002060008961ffff1661ffff1681526020019081526020016000206000611f399190612a88565b7f03528ed0c2a3ebc993b12ce3c16bb382f9c7d88ef7d8a1bf290eaf35955a12078a8a8a604051611f6c9392919061344c565b60405180910390a16120ee565b6000600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff168152602001908152602001600020805460018160011615610100020316600290049050141561204d57600560008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff160217905550505b80600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff16815260200190815260200160002090805190602001906120af929190612a08565b507f52a608b3303a48862d07a73d82fa221318c0027fbbcfb1b2329bface3f19ff2b8a8a8a846040516120e5949392919061348a565b60405180910390a15b50505050505050505050565b8060c00151816020018181525050806000015151816020015110151561211f5761220d565b6000612133826000015183602001516122fd565b82602001510190506121528183600001516123f390919063ffffffff16565b826040019061ffff16908161ffff16815250506002810190506121828183600001516123f390919063ffffffff16565b826060019061ffff16908161ffff16815250506002810190506121b281836000015161241b90919063ffffffff16565b826080019063ffffffff16908163ffffffff168152505060048101905060006121e88284600001516123f390919063ffffffff16565b61ffff169050600282019150818360a00181815250508082018360c001818152505050505b50565b60006014825114151561222257600080fd5b600c6101000a6020830151049050919050565b606060146040519080825280601f01601f19166020018201604052801561226b5781602001600182028038833980820191505090505b509050600c6101000a82026020820152919050565b600063691f34317c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122f657506122f582612445565b5b9050919050565b6000808290505b60011561234e5783518110151561231757fe5b600061232c82866124fa90919063ffffffff16565b60ff16905060018101820191506000811415612348575061234e565b50612304565b82810391505092915050565b606083518284011115151561236e57600080fd5b6060826040519080825280601f01601f1916602001820160405280156123a35781602001600182028038833980820191505090505b50905060008060208301915085602088010190506123c2828287612580565b8293505050509392505050565b60006123dc8484846125cb565b6123e78787856125cb565b14905095945050505050565b60008251600283011115151561240857600080fd5b61ffff8260028501015116905092915050565b60008251600483011115151561243057600080fd5b63ffffffff8260048501015116905092915050565b600060405180807f696e74657266616365496d706c656d656e74657228627974657333322c62797481526020017f6573342900000000000000000000000000000000000000000000000000000000815250602401905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124f357506124f2826125f0565b5b9050919050565b6000828281518110151561250a57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004905092915050565b5b6020811015156125a65781518352602083019250602082019150602081039050612581565b60006001826020036101000a0390508019835116818551168181178652505050505050565b60008351828401111515156125df57600080fd5b818360208601012090509392505050565b600063a8fa56827c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061266657506126658261266d565b5b9050919050565b600063bc1c58d17c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e357506126e2826126ea565b5b9050919050565b6000633b3b57de7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127bb575063f1cb7e067c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127cb57506127ca826127d2565b5b9050919050565b6000632203ab567c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061284857506128478261284f565b5b9050919050565b60006301ffc9a77c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60e0604051908101604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061294957803560ff1916838001178555612977565b82800160010185558215612977579182015b8281111561297657823582559160200191906001019061295b565b5b5090506129849190612ad0565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129c957803560ff19168380011785556129f7565b828001600101855582156129f7579182015b828111156129f65782358255916020019190600101906129db565b5b509050612a049190612ad0565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a4957805160ff1916838001178555612a77565b82800160010185558215612a77579182015b82811115612a76578251825591602001919060010190612a5b565b5b509050612a849190612ad0565b5090565b50805460018160011615610100020316600290046000825580601f10612aae5750612acd565b601f016020900490600052602060002090810190612acc9190612ad0565b5b50565b612af291905b80821115612aee576000816000905550600101612ad6565b5090565b90565b6000612b01823561375b565b905092915050565b6000612b15825161375b565b905092915050565b6000612b29823561376d565b905092915050565b6000612b3d8235613779565b905092915050565b6000612b518235613783565b905092915050565b60008083601f8401121515612b6d57600080fd5b8235905067ffffffffffffffff811115612b8657600080fd5b602083019150836001820283011115612b9e57600080fd5b9250929050565b600082601f8301121515612bb857600080fd5b8135612bcb612bc68261367b565b61364e565b91508082526020830160208301858383011115612be757600080fd5b612bf28382846137fd565b50505092915050565b60008083601f8401121515612c0f57600080fd5b8235905067ffffffffffffffff811115612c2857600080fd5b602083019150836001820283011115612c4057600080fd5b9250929050565b6000612c5382356137af565b905092915050565b6000612c6782356137bd565b905092915050565b600060208284031215612c8157600080fd5b6000612c8f84828501612b09565b91505092915050565b600060208284031215612caa57600080fd5b6000612cb884828501612b31565b91505092915050565b60008060408385031215612cd457600080fd5b6000612ce285828601612b31565b9250506020612cf385828601612af5565b9150509250929050565b600080600060608486031215612d1257600080fd5b6000612d2086828701612b31565b9350506020612d3186828701612af5565b9250506040612d4286828701612af5565b9150509250925092565b600080600060608486031215612d6157600080fd5b6000612d6f86828701612b31565b9350506020612d8086828701612af5565b9250506040612d9186828701612b1d565b9150509250925092565b60008060408385031215612dae57600080fd5b6000612dbc85828601612b31565b9250506020612dcd85828601612b31565b9150509250929050565b600080600060608486031215612dec57600080fd5b6000612dfa86828701612b31565b9350506020612e0b86828701612b31565b9250506040612e1c86828701612b31565b9150509250925092565b600080600060608486031215612e3b57600080fd5b6000612e4986828701612b31565b9350506020612e5a86828701612b31565b9250506040612e6b86828701612c47565b9150509250925092565b60008060408385031215612e8857600080fd5b6000612e9685828601612b31565b9250506020612ea785828601612b45565b9150509250929050565b600080600060608486031215612ec657600080fd5b6000612ed486828701612b31565b9350506020612ee586828701612b45565b9250506040612ef686828701612af5565b9150509250925092565b600080600060408486031215612f1557600080fd5b6000612f2386828701612b31565b935050602084013567ffffffffffffffff811115612f4057600080fd5b612f4c86828701612b59565b92509250509250925092565b600080600060408486031215612f6d57600080fd5b6000612f7b86828701612b31565b935050602084013567ffffffffffffffff811115612f9857600080fd5b612fa486828701612bfb565b92509250509250925092565b600080600080600060608688031215612fc857600080fd5b6000612fd688828901612b31565b955050602086013567ffffffffffffffff811115612ff357600080fd5b612fff88828901612bfb565b9450945050604086013567ffffffffffffffff81111561301e57600080fd5b61302a88828901612bfb565b92509250509295509295909350565b6000806040838503121561304c57600080fd5b600061305a85828601612b31565b925050602061306b85828601612c5b565b9150509250929050565b6000806000806060858703121561308b57600080fd5b600061309987828801612b31565b94505060206130aa87828801612c5b565b935050604085013567ffffffffffffffff8111156130c757600080fd5b6130d387828801612b59565b925092505092959194509250565b6000806000606084860312156130f657600080fd5b600061310486828701612b31565b935050602061311586828701612c5b565b925050604084013567ffffffffffffffff81111561313257600080fd5b61313e86828701612ba5565b9150509250925092565b60006020828403121561315a57600080fd5b600061316884828501612b45565b91505092915050565b61317a816137c7565b82525050565b613189816136cf565b82525050565b613198816136bd565b82525050565b6131a7816136e1565b82525050565b6131b6816136ed565b82525050565b6131c5816136f7565b82525050565b60008284526020840193506131e18385846137fd565b6131ea8361383f565b840190509392505050565b6000613200826136a7565b80845261321481602086016020860161380c565b61321d8161383f565b602085010191505092915050565b60008284526020840193506132418385846137fd565b61324a8361383f565b840190509392505050565b6000613260826136b2565b80845261327481602086016020860161380c565b61327d8161383f565b602085010191505092915050565b61329481613723565b82525050565b6132a381613751565b82525050565b60006020820190506132be600083018461318f565b92915050565b60006020820190506132d96000830184613180565b92915050565b60006020820190506132f4600083018461319e565b92915050565b600060208201905061330f60008301846131ad565b92915050565b600060408201905061332a60008301856131ad565b6133376020830184613171565b9392505050565b600060808201905061335360008301876131ad565b6133606020830186613171565b61336d604083018561318f565b61337a606083018461319e565b95945050505050565b600060408201905061339860008301856131ad565b6133a560208301846131ad565b9392505050565b60006060820190506133c160008301866131ad565b6133ce60208301856131ad565b6133db60408301846131ad565b949350505050565b60006060820190506133f860008301866131ad565b61340560208301856131bc565b613412604083018461318f565b949350505050565b600060408201905061342f60008301866131ad565b81810360208301526134428184866131cb565b9050949350505050565b600060608201905061346160008301866131ad565b818103602083015261347381856131f5565b9050613482604083018461328b565b949350505050565b600060808201905061349f60008301876131ad565b81810360208301526134b181866131f5565b90506134c0604083018561328b565b81810360608301526134d281846131f5565b905095945050505050565b60006040820190506134f260008301866131ad565b818103602083015261350581848661322b565b9050949350505050565b600060608201905061352460008301886131ad565b818103602083015261353781868861322b565b9050818103604083015261354c81848661322b565b90509695505050505050565b600060408201905061356d60008301856131ad565b61357a602083018461329a565b9392505050565b600060608201905061359660008301866131ad565b6135a3602083018561329a565b81810360408301526135b581846131f5565b9050949350505050565b60006020820190506135d460008301846131bc565b92915050565b600060208201905081810360008301526135f481846131f5565b905092915050565b600060208201905081810360008301526136168184613255565b905092915050565b6000604082019050613633600083018561329a565b818103602083015261364581846131f5565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561367157600080fd5b8060405250919050565b600067ffffffffffffffff82111561369257600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b60006136c882613731565b9050919050565b60006136da82613731565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061376682613731565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b6000819050919050565b60006137d2826137d9565b9050919050565b60006137e4826137eb565b9050919050565b60006137f682613731565b9050919050565b82818337600083830152505050565b60005b8381101561382a57808201518184015260208101905061380f565b83811115613839576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a72305820668668127482cd23a9f375761bf0b8d29fdbff7c261f4d2755ca9c73637d86bf6c6578706572696d656e74616cf50037' +resolver_bytecode_runtime = '608060405260043610610133576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806301ffc9a7146101385780630af179d71461017557806310f13a8c1461019e578063124a319c146101c75780632203ab561461020457806329cd62ea14610242578063304e6ade1461026b5780633b3b57de146102945780633e9ce794146102d15780634cbf6ba4146102fa57806359d1d43c14610337578063623195b014610374578063691f34311461039d57806377372213146103da5780638b95dd7114610403578063a8fa56821461042c578063ad5780af14610469578063bc1c58d114610492578063c8690233146104cf578063d5fa2b001461050d578063e59d895d14610536578063f1cb7e061461055f578063f86bc8791461059c575b600080fd5b34801561014457600080fd5b5061015f600480360361015a9190810190613148565b6105d9565b60405161016c91906132df565b60405180910390f35b34801561018157600080fd5b5061019c60048036036101979190810190612f00565b610656565b005b3480156101aa57600080fd5b506101c560048036036101c09190810190612fb0565b6108d5565b005b3480156101d357600080fd5b506101ee60048036036101e99190810190612e75565b610979565b6040516101fb91906132a9565b60405180910390f35b34801561021057600080fd5b5061022b60048036036102269190810190613039565b610ede565b60405161023992919061361e565b60405180910390f35b34801561024e57600080fd5b5061026960048036036102649190810190612dd7565b611033565b005b34801561027757600080fd5b50610292600480360361028d9190810190612f00565b6110c8565b005b3480156102a057600080fd5b506102bb60048036036102b69190810190612c98565b611141565b6040516102c891906132c4565b60405180910390f35b3480156102dd57600080fd5b506102f860048036036102f39190810190612d4c565b611178565b005b34801561030657600080fd5b50610321600480360361031c9190810190612d9b565b61125f565b60405161032e91906132df565b60405180910390f35b34801561034357600080fd5b5061035e60048036036103599190810190612f58565b6112c7565b60405161036b91906135fc565b60405180910390f35b34801561038057600080fd5b5061039b60048036036103969190810190613075565b6113a3565b005b3480156103a957600080fd5b506103c460048036036103bf9190810190612c98565b61143f565b6040516103d191906135fc565b60405180910390f35b3480156103e657600080fd5b5061040160048036036103fc9190810190612f58565b6114f4565b005b34801561040f57600080fd5b5061042a600480360361042591908101906130e1565b61156d565b005b34801561043857600080fd5b50610453600480360361044e9190810190612e26565b611647565b60405161046091906135da565b60405180910390f35b34801561047557600080fd5b50610490600480360361048b9190810190612c98565b61174c565b005b34801561049e57600080fd5b506104b960048036036104b49190810190612c98565b6117bf565b6040516104c691906135da565b60405180910390f35b3480156104db57600080fd5b506104f660048036036104f19190810190612c98565b611874565b604051610504929190613383565b60405180910390f35b34801561051957600080fd5b50610534600480360361052f9190810190612cc1565b6118ae565b005b34801561054257600080fd5b5061055d60048036036105589190810190612eb1565b6118dc565b005b34801561056b57600080fd5b5061058660048036036105819190810190613039565b6119d3565b60405161059391906135da565b60405180910390f35b3480156105a857600080fd5b506105c360048036036105be9190810190612cfd565b611a9a565b6040516105d091906132df565b60405180910390f35b60006359d1d43c7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064f575061064e82611ad6565b5b9050919050565b8261066081611b53565b151561066b57600080fd5b6000809050600080905060608060006106826128bc565b6106da60008a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611cf890919063ffffffff16565b90505b6106e681611d22565b15156108625760008661ffff161415610791578060400151955061070981611d38565b9350836040516020018082805190602001908083835b602083101515610744578051825260208201915060208101905060208303925061071f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120915061078a81611d6f565b9250610854565b606061079c82611d38565b9050816040015161ffff168761ffff161415806107c957506107c78186611d9f90919063ffffffff16565b155b156108525761082b8b86898d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8b88602001510360008b5114611dc6565b81604001519650816020015195508094508480519060200120925061084f82611d6f565b93505b505b61085d816120fa565b6106dd565b506000835111156108ca576108c98984878b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088898e8e9050036000895114611dc6565b5b505050505050505050565b846108df81611b53565b15156108ea57600080fd5b828260096000898152602001908152602001600020878760405180838380828437808301925050509250505090815260200160405180910390209190610931929190612908565b507fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a7550868686888860405161096995949392919061350f565b60405180910390a1505050505050565b600080600660008581526020019081526020016000206000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610a405780915050610ed8565b6000610a4b85611141565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610a8d57600092505050610ed8565b600060608273ffffffffffffffffffffffffffffffffffffffff166301ffc9a77c010000000000000000000000000000000000000000000000000000000002604051602401610adc91906135bf565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083101515610b8e5780518252602082019150602081019050602083039250610b69565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610bee576040519150601f19603f3d011682016040523d82523d6000602084013e610bf3565b606091505b5091509150811580610c06575060208151105b80610cae575060007f01000000000000000000000000000000000000000000000000000000000000000281601f815181101515610c3f57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610cc0576000945050505050610ed8565b8273ffffffffffffffffffffffffffffffffffffffff1686604051602401610ce891906135bf565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506040518082805190602001908083835b602083101515610d9a5780518252602082019150602081019050602083039250610d75565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855afa9150503d8060008114610dfa576040519150601f19603f3d011682016040523d82523d6000602084013e610dff565b606091505b508092508193505050811580610e16575060208151105b80610ebe575060007f01000000000000000000000000000000000000000000000000000000000000000281601f815181101515610e4f57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610ed0576000945050505050610ed8565b829450505050505b92915050565b60006060600080600086815260200190815260200160002090506000600190505b848111151561100f57600085821614158015610f4157506000826000838152602001908152602001600020805460018160011615610100020316600290049050115b156110005780826000838152602001908152602001600020808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610fee5780601f10610fc357610100808354040283529160200191610fee565b820191906000526020600020905b815481529060010190602001808311610fd157829003601f168201915b5050505050905093509350505061102c565b6001819060020a029050610eff565b506000602060405190810160405280600081525081915092509250505b9250929050565b8261103d81611b53565b151561104857600080fd5b6040805190810160405280848152602001838152506008600086815260200190815260200160002060008201518160000155602082015181600101559050507f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e468484846040516110ba939291906133ac565b60405180910390a150505050565b826110d281611b53565b15156110dd57600080fd5b82826002600087815260200190815260200160002091906110ff929190612988565b507fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d75788484846040516111339392919061341a565b60405180910390a150505050565b6000606061115083603c6119d3565b9050600081511415611166576000915050611173565b61116f81612210565b9150505b919050565b80600b600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df83338484604051611252949392919061333e565b60405180910390a1505050565b60008060056000858152602001908152602001600020600060036000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060009054906101000a900461ffff1661ffff161415905092915050565b606060096000858152602001908152602001600020838360405180838380828437808301925050509250505090815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156113955780601f1061136a57610100808354040283529160200191611395565b820191906000526020600020905b81548152906001019060200180831161137857829003601f168201915b505050505090509392505050565b836113ad81611b53565b15156113b857600080fd5b60008460018603161415156113cc57600080fd5b8282600080888152602001908152602001600020600087815260200190815260200160002091906113fe929190612988565b507faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe38585604051611430929190613558565b60405180910390a15050505050565b6060600760008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156114e85780601f106114bd576101008083540402835291602001916114e8565b820191906000526020600020905b8154815290600101906020018083116114cb57829003601f168201915b50505050509050919050565b826114fe81611b53565b151561150957600080fd5b828260076000878152602001908152602001600020919061152b929190612908565b507fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f784848460405161155f939291906134dd565b60405180910390a150505050565b8261157781611b53565b151561158257600080fd5b7f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528484846040516115b593929190613581565b60405180910390a1603c831415611608577f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd2846115f184612210565b6040516115ff929190613315565b60405180910390a15b816001600086815260200190815260200160002060008581526020019081526020016000209080519060200190611640929190612a08565b5050505050565b606060046000858152602001908152602001600020600060036000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060008361ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561173e5780601f106117135761010080835404028352916020019161173e565b820191906000526020600020905b81548152906001019060200180831161172157829003601f168201915b505050505090509392505050565b8061175681611b53565b151561176157600080fd5b60036000838152602001908152602001600020600081548092919060010191905055507fb757169b8492ca2f1c6619d9d76ce22803035c3b1d5f6930dffe7b127c1a1983826040516117b391906132fa565b60405180910390a15050565b6060600260008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156118685780601f1061183d57610100808354040283529160200191611868565b820191906000526020600020905b81548152906001019060200180831161184b57829003601f168201915b50505050509050919050565b6000806008600084815260200190815260200160002060000154600860008581526020019081526020016000206001015491509150915091565b816118b881611b53565b15156118c357600080fd5b6118d783603c6118d285612235565b61156d565b505050565b826118e681611b53565b15156118f157600080fd5b81600660008681526020019081526020016000206000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa8484846040516119c5939291906133e3565b60405180910390a150505050565b60606001600084815260200190815260200160002060008381526020019081526020016000208054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015611a8d5780601f10611a6257610100808354040283529160200191611a8d565b820191906000526020600020905b815481529060010190602001808311611a7057829003601f168201915b5050505050905092915050565b600b602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b600063c86902337c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b4c5750611b4b82612280565b5b9050919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3846040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401611bcd91906132fa565b60206040518083038186803b158015611be557600080fd5b505afa158015611bf9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611c1d9190810190612c6f565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611cf05750600b600084815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b915050919050565b611d006128bc565b828160000181905250818160c0018181525050611d1c816120fa565b92915050565b6000816000015151826020015110159050919050565b6060611d688260200151611d54846000015185602001516122fd565b846000015161235a9092919063ffffffff16565b9050919050565b6060611d988260a001518360a001518460c0015103846000015161235a9092919063ffffffff16565b9050919050565b600081518351148015611dbe5750611dbd83600084600087516123cf565b5b905092915050565b6000600360008981526020019081526020016000205490506000878051906020012090506060611e0186868961235a9092919063ffffffff16565b90508315611f79576000600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff168152602001908152602001600020805460018160011615610100020316600290049050141515611edf57600560008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff16809291906001900391906101000a81548161ffff021916908361ffff160217905550505b600460008b81526020019081526020016000206000848152602001908152602001600020600083815260200190815260200160002060008961ffff1661ffff1681526020019081526020016000206000611f399190612a88565b7f03528ed0c2a3ebc993b12ce3c16bb382f9c7d88ef7d8a1bf290eaf35955a12078a8a8a604051611f6c9392919061344c565b60405180910390a16120ee565b6000600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff168152602001908152602001600020805460018160011615610100020316600290049050141561204d57600560008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff160217905550505b80600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff16815260200190815260200160002090805190602001906120af929190612a08565b507f52a608b3303a48862d07a73d82fa221318c0027fbbcfb1b2329bface3f19ff2b8a8a8a846040516120e5949392919061348a565b60405180910390a15b50505050505050505050565b8060c00151816020018181525050806000015151816020015110151561211f5761220d565b6000612133826000015183602001516122fd565b82602001510190506121528183600001516123f390919063ffffffff16565b826040019061ffff16908161ffff16815250506002810190506121828183600001516123f390919063ffffffff16565b826060019061ffff16908161ffff16815250506002810190506121b281836000015161241b90919063ffffffff16565b826080019063ffffffff16908163ffffffff168152505060048101905060006121e88284600001516123f390919063ffffffff16565b61ffff169050600282019150818360a00181815250508082018360c001818152505050505b50565b60006014825114151561222257600080fd5b600c6101000a6020830151049050919050565b606060146040519080825280601f01601f19166020018201604052801561226b5781602001600182028038833980820191505090505b509050600c6101000a82026020820152919050565b600063691f34317c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122f657506122f582612445565b5b9050919050565b6000808290505b60011561234e5783518110151561231757fe5b600061232c82866124fa90919063ffffffff16565b60ff16905060018101820191506000811415612348575061234e565b50612304565b82810391505092915050565b606083518284011115151561236e57600080fd5b6060826040519080825280601f01601f1916602001820160405280156123a35781602001600182028038833980820191505090505b50905060008060208301915085602088010190506123c2828287612580565b8293505050509392505050565b60006123dc8484846125cb565b6123e78787856125cb565b14905095945050505050565b60008251600283011115151561240857600080fd5b61ffff8260028501015116905092915050565b60008251600483011115151561243057600080fd5b63ffffffff8260048501015116905092915050565b600060405180807f696e74657266616365496d706c656d656e74657228627974657333322c62797481526020017f6573342900000000000000000000000000000000000000000000000000000000815250602401905060405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124f357506124f2826125f0565b5b9050919050565b6000828281518110151561250a57fe5b9060200101517f010000000000000000000000000000000000000000000000000000000000000090047f0100000000000000000000000000000000000000000000000000000000000000027f01000000000000000000000000000000000000000000000000000000000000009004905092915050565b5b6020811015156125a65781518352602083019250602082019150602081039050612581565b60006001826020036101000a0390508019835116818551168181178652505050505050565b60008351828401111515156125df57600080fd5b818360208601012090509392505050565b600063a8fa56827c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061266657506126658261266d565b5b9050919050565b600063bc1c58d17c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806126e357506126e2826126ea565b5b9050919050565b6000633b3b57de7c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806127bb575063f1cb7e067c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806127cb57506127ca826127d2565b5b9050919050565b6000632203ab567c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061284857506128478261284f565b5b9050919050565b60006301ffc9a77c0100000000000000000000000000000000000000000000000000000000027bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60e0604051908101604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061294957803560ff1916838001178555612977565b82800160010185558215612977579182015b8281111561297657823582559160200191906001019061295b565b5b5090506129849190612ad0565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106129c957803560ff19168380011785556129f7565b828001600101855582156129f7579182015b828111156129f65782358255916020019190600101906129db565b5b509050612a049190612ad0565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f10612a4957805160ff1916838001178555612a77565b82800160010185558215612a77579182015b82811115612a76578251825591602001919060010190612a5b565b5b509050612a849190612ad0565b5090565b50805460018160011615610100020316600290046000825580601f10612aae5750612acd565b601f016020900490600052602060002090810190612acc9190612ad0565b5b50565b612af291905b80821115612aee576000816000905550600101612ad6565b5090565b90565b6000612b01823561375b565b905092915050565b6000612b15825161375b565b905092915050565b6000612b29823561376d565b905092915050565b6000612b3d8235613779565b905092915050565b6000612b518235613783565b905092915050565b60008083601f8401121515612b6d57600080fd5b8235905067ffffffffffffffff811115612b8657600080fd5b602083019150836001820283011115612b9e57600080fd5b9250929050565b600082601f8301121515612bb857600080fd5b8135612bcb612bc68261367b565b61364e565b91508082526020830160208301858383011115612be757600080fd5b612bf28382846137fd565b50505092915050565b60008083601f8401121515612c0f57600080fd5b8235905067ffffffffffffffff811115612c2857600080fd5b602083019150836001820283011115612c4057600080fd5b9250929050565b6000612c5382356137af565b905092915050565b6000612c6782356137bd565b905092915050565b600060208284031215612c8157600080fd5b6000612c8f84828501612b09565b91505092915050565b600060208284031215612caa57600080fd5b6000612cb884828501612b31565b91505092915050565b60008060408385031215612cd457600080fd5b6000612ce285828601612b31565b9250506020612cf385828601612af5565b9150509250929050565b600080600060608486031215612d1257600080fd5b6000612d2086828701612b31565b9350506020612d3186828701612af5565b9250506040612d4286828701612af5565b9150509250925092565b600080600060608486031215612d6157600080fd5b6000612d6f86828701612b31565b9350506020612d8086828701612af5565b9250506040612d9186828701612b1d565b9150509250925092565b60008060408385031215612dae57600080fd5b6000612dbc85828601612b31565b9250506020612dcd85828601612b31565b9150509250929050565b600080600060608486031215612dec57600080fd5b6000612dfa86828701612b31565b9350506020612e0b86828701612b31565b9250506040612e1c86828701612b31565b9150509250925092565b600080600060608486031215612e3b57600080fd5b6000612e4986828701612b31565b9350506020612e5a86828701612b31565b9250506040612e6b86828701612c47565b9150509250925092565b60008060408385031215612e8857600080fd5b6000612e9685828601612b31565b9250506020612ea785828601612b45565b9150509250929050565b600080600060608486031215612ec657600080fd5b6000612ed486828701612b31565b9350506020612ee586828701612b45565b9250506040612ef686828701612af5565b9150509250925092565b600080600060408486031215612f1557600080fd5b6000612f2386828701612b31565b935050602084013567ffffffffffffffff811115612f4057600080fd5b612f4c86828701612b59565b92509250509250925092565b600080600060408486031215612f6d57600080fd5b6000612f7b86828701612b31565b935050602084013567ffffffffffffffff811115612f9857600080fd5b612fa486828701612bfb565b92509250509250925092565b600080600080600060608688031215612fc857600080fd5b6000612fd688828901612b31565b955050602086013567ffffffffffffffff811115612ff357600080fd5b612fff88828901612bfb565b9450945050604086013567ffffffffffffffff81111561301e57600080fd5b61302a88828901612bfb565b92509250509295509295909350565b6000806040838503121561304c57600080fd5b600061305a85828601612b31565b925050602061306b85828601612c5b565b9150509250929050565b6000806000806060858703121561308b57600080fd5b600061309987828801612b31565b94505060206130aa87828801612c5b565b935050604085013567ffffffffffffffff8111156130c757600080fd5b6130d387828801612b59565b925092505092959194509250565b6000806000606084860312156130f657600080fd5b600061310486828701612b31565b935050602061311586828701612c5b565b925050604084013567ffffffffffffffff81111561313257600080fd5b61313e86828701612ba5565b9150509250925092565b60006020828403121561315a57600080fd5b600061316884828501612b45565b91505092915050565b61317a816137c7565b82525050565b613189816136cf565b82525050565b613198816136bd565b82525050565b6131a7816136e1565b82525050565b6131b6816136ed565b82525050565b6131c5816136f7565b82525050565b60008284526020840193506131e18385846137fd565b6131ea8361383f565b840190509392505050565b6000613200826136a7565b80845261321481602086016020860161380c565b61321d8161383f565b602085010191505092915050565b60008284526020840193506132418385846137fd565b61324a8361383f565b840190509392505050565b6000613260826136b2565b80845261327481602086016020860161380c565b61327d8161383f565b602085010191505092915050565b61329481613723565b82525050565b6132a381613751565b82525050565b60006020820190506132be600083018461318f565b92915050565b60006020820190506132d96000830184613180565b92915050565b60006020820190506132f4600083018461319e565b92915050565b600060208201905061330f60008301846131ad565b92915050565b600060408201905061332a60008301856131ad565b6133376020830184613171565b9392505050565b600060808201905061335360008301876131ad565b6133606020830186613171565b61336d604083018561318f565b61337a606083018461319e565b95945050505050565b600060408201905061339860008301856131ad565b6133a560208301846131ad565b9392505050565b60006060820190506133c160008301866131ad565b6133ce60208301856131ad565b6133db60408301846131ad565b949350505050565b60006060820190506133f860008301866131ad565b61340560208301856131bc565b613412604083018461318f565b949350505050565b600060408201905061342f60008301866131ad565b81810360208301526134428184866131cb565b9050949350505050565b600060608201905061346160008301866131ad565b818103602083015261347381856131f5565b9050613482604083018461328b565b949350505050565b600060808201905061349f60008301876131ad565b81810360208301526134b181866131f5565b90506134c0604083018561328b565b81810360608301526134d281846131f5565b905095945050505050565b60006040820190506134f260008301866131ad565b818103602083015261350581848661322b565b9050949350505050565b600060608201905061352460008301886131ad565b818103602083015261353781868861322b565b9050818103604083015261354c81848661322b565b90509695505050505050565b600060408201905061356d60008301856131ad565b61357a602083018461329a565b9392505050565b600060608201905061359660008301866131ad565b6135a3602083018561329a565b81810360408301526135b581846131f5565b9050949350505050565b60006020820190506135d460008301846131bc565b92915050565b600060208201905081810360008301526135f481846131f5565b905092915050565b600060208201905081810360008301526136168184613255565b905092915050565b6000604082019050613633600083018561329a565b818103602083015261364581846131f5565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561367157600080fd5b8060405250919050565b600067ffffffffffffffff82111561369257600080fd5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b60006136c882613731565b9050919050565b60006136da82613731565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061376682613731565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b6000819050919050565b60006137d2826137d9565b9050919050565b60006137e4826137eb565b9050919050565b60006137f682613731565b9050919050565b82818337600083830152505050565b60005b8381101561382a57808201518184015260208101905061380f565b83811115613839576000848401525b50505050565b6000601f19601f830116905091905056fea265627a7a72305820668668127482cd23a9f375761bf0b8d29fdbff7c261f4d2755ca9c73637d86bf6c6578706572696d656e74616cf50037' reverse_registrar_abi = json.loads('[{"constant":false,"inputs":[{"name":"owner","type":"address"},{"name":"resolver","type":"address"}],"name":"claimWithResolver","outputs":[{"name":"node","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"name":"owner","type":"address"}],"name":"claim","outputs":[{"name":"node","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[],"name":"ens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"defaultResolver","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"addr","type":"address"}],"name":"node","outputs":[{"name":"ret","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"name","type":"string"}],"name":"setName","outputs":[{"name":"node","type":"bytes32"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"ensAddr","type":"address"},{"name":"resolverAddr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]') reverse_registrar_bytecode = "6060604052341561000f57600080fd5b604051604080610d96833981016040528080519060200190919080519060200190919050506000826000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be37f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e26001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561017a57600080fd5b6102c65a03f1151561018b57600080fd5b50505060405180519050905060008173ffffffffffffffffffffffffffffffffffffffff16141515610277578073ffffffffffffffffffffffffffffffffffffffff16631e83409a336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561025a57600080fd5b6102c65a03f1151561026b57600080fd5b50505060405180519050505b505050610b0d806102896000396000f300606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630f5a54661461007d5780631e83409a146100f15780633f15457f14610146578063828eab0e1461019b578063bffbe61c146101f0578063c47f002714610245575b600080fd5b341561008857600080fd5b6100d3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102be565b60405180826000191660001916815260200191505060405180910390f35b34156100fc57600080fd5b610128600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061086e565b60405180826000191660001916815260200191505060405180910390f35b341561015157600080fd5b610159610882565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101a657600080fd5b6101ae6108a7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fb57600080fd5b610227600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108cd565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b6102a0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061092f565b60405180826000191660001916815260200191505060405180910390f35b60008060006102cc33610a80565b91507f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260010282604051808360001916600019168152602001826000191660001916815260200192505050604051809103902092506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3846000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156103c157600080fd5b6102c65a03f115156103d257600080fd5b50505060405180519050905060008473ffffffffffffffffffffffffffffffffffffffff16141580156104eb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178b8bf846000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156104a057600080fd5b6102c65a03f115156104b157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561071b573073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561063b576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab59237f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260010284306040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180846000191660001916815260200183600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b151561062357600080fd5b6102c65a03f1151561063457600080fd5b5050503090505b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631896f70a84866040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b151561070657600080fd5b6102c65a03f1151561071757600080fd5b5050505b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610863576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab59237f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260010284886040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180846000191660001916815260200183600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b151561084e57600080fd5b6102c65a03f1151561085f57600080fd5b5050505b829250505092915050565b600061087b8260006102be565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e26001026108fc83610a80565b60405180836000191660001916815260200182600019166000191681526020019250505060405180910390209050919050565b600061095d30600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166102be565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637737221382846040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610a185780820151818401526020810190506109fd565b50505050905090810190601f168015610a455780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1515610a6457600080fd5b6102c65a03f11515610a7557600080fd5b505050809050919050565b60007f303132333435363738396162636465660000000000000000000000000000000060285b60018103905081600f85161a815360108404935060018103905081600f85161a815360108404935080610aa6576028600020925050509190505600a165627a7a72305820a8513240f040cd9ded89ca4d0c5bda58536850e642e1d933ad64158ef4c820660029" reverse_registrar_bytecode_runtime = "606060405260043610610078576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630f5a54661461007d5780631e83409a146100f15780633f15457f14610146578063828eab0e1461019b578063bffbe61c146101f0578063c47f002714610245575b600080fd5b341561008857600080fd5b6100d3600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506102be565b60405180826000191660001916815260200191505060405180910390f35b34156100fc57600080fd5b610128600480803573ffffffffffffffffffffffffffffffffffffffff1690602001909190505061086e565b60405180826000191660001916815260200191505060405180910390f35b341561015157600080fd5b610159610882565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101a657600080fd5b6101ae6108a7565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156101fb57600080fd5b610227600480803573ffffffffffffffffffffffffffffffffffffffff169060200190919050506108cd565b60405180826000191660001916815260200191505060405180910390f35b341561025057600080fd5b6102a0600480803590602001908201803590602001908080601f0160208091040260200160405190810160405280939291908181526020018383808284378201915050505050509190505061092f565b60405180826000191660001916815260200191505060405180910390f35b60008060006102cc33610a80565b91507f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260010282604051808360001916600019168152602001826000191660001916815260200192505050604051809103902092506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3846000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156103c157600080fd5b6102c65a03f115156103d257600080fd5b50505060405180519050905060008473ffffffffffffffffffffffffffffffffffffffff16141580156104eb57506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630178b8bf846000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b15156104a057600080fd5b6102c65a03f115156104b157600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614155b1561071b573073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561063b576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab59237f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260010284306040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180846000191660001916815260200183600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b151561062357600080fd5b6102c65a03f1151561063457600080fd5b5050503090505b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16631896f70a84866040518363ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018083600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200192505050600060405180830381600087803b151561070657600080fd5b6102c65a03f1151561071757600080fd5b5050505b8473ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141515610863576000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166306ab59237f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e260010284886040518463ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180846000191660001916815260200183600019166000191681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019350505050600060405180830381600087803b151561084e57600080fd5b6102c65a03f1151561085f57600080fd5b5050505b829250505092915050565b600061087b8260006102be565b9050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e26001026108fc83610a80565b60405180836000191660001916815260200182600019166000191681526020019250505060405180910390209050919050565b600061095d30600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166102be565b9050600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637737221382846040518363ffffffff167c010000000000000000000000000000000000000000000000000000000002815260040180836000191660001916815260200180602001828103825283818151815260200191508051906020019080838360005b83811015610a185780820151818401526020810190506109fd565b50505050905090810190601f168015610a455780820380516001836020036101000a031916815260200191505b509350505050600060405180830381600087803b1515610a6457600080fd5b6102c65a03f11515610a7557600080fd5b505050809050919050565b60007f303132333435363738396162636465660000000000000000000000000000000060285b60018103905081600f85161a815360108404935060018103905081600f85161a815360108404935080610aa6576028600020925050509190505600a165627a7a72305820a8513240f040cd9ded89ca4d0c5bda58536850e642e1d933ad64158ef4c820660029" -reverse_resolver_abi = json.loads('[{"constant":true,"inputs":[],"name":"ens","outputs":[{"name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"name":"","type":"bytes32"}],"name":"name","outputs":[{"name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"name":"node","type":"bytes32"},{"name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"inputs":[{"name":"ensAddr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"}]') -reverse_resolver_bytecode = "6060604052341561000f57600080fd5b6040516020806106c9833981016040528080519060200190919050506000816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be37f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e26001026000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561013057600080fd5b6102c65a03f1151561014157600080fd5b50505060405180519050905060008173ffffffffffffffffffffffffffffffffffffffff1614151561022d578073ffffffffffffffffffffffffffffffffffffffff16631e83409a336000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b151561021057600080fd5b6102c65a03f1151561022157600080fd5b50505060405180519050505b505061048b8061023e6000396000f300606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f15457f1461005c578063691f3431146100b15780637737221314610151575b600080fd5b341561006757600080fd5b61006f6101bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100bc57600080fd5b6100d66004808035600019169060200190919050506101e0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101165780820151818401526020810190506100fb565b50505050905090810190601f1680156101435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015c57600080fd5b6101b960048080356000191690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610290565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b505050505081565b816000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561033157600080fd5b6102c65a03f1151561034257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561038557600080fd5b8160016000856000191660001916815260200190815260200160002090805190602001906103b49291906103ba565b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106103fb57805160ff1916838001178555610429565b82800160010185558215610429579182015b8281111561042857825182559160200191906001019061040d565b5b509050610436919061043a565b5090565b61045c91905b80821115610458576000816000905550600101610440565b5090565b905600a165627a7a72305820f4c4cb4d191f31a62c4de12f7aecf9b258ba17f3a6ee294191171f7d30c04ab00029" -reverse_resolver_bytecode_runtime = "606060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f15457f1461005c578063691f3431146100b15780637737221314610151575b600080fd5b341561006757600080fd5b61006f6101bb565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34156100bc57600080fd5b6100d66004808035600019169060200190919050506101e0565b6040518080602001828103825283818151815260200191508051906020019080838360005b838110156101165780820151818401526020810190506100fb565b50505050905090810190601f1680156101435780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b341561015c57600080fd5b6101b960048080356000191690602001909190803590602001908201803590602001908080601f01602080910402602001604051908101604052809392919081815260200183838082843782019150505050505091905050610290565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156102885780601f1061025d57610100808354040283529160200191610288565b820191906000526020600020905b81548152906001019060200180831161026b57829003601f168201915b505050505081565b816000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3826000604051602001526040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808260001916600019168152602001915050602060405180830381600087803b151561033157600080fd5b6102c65a03f1151561034257600080fd5b5050506040518051905073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561038557600080fd5b8160016000856000191660001916815260200190815260200160002090805190602001906103b49291906103ba565b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106103fb57805160ff1916838001178555610429565b82800160010185558215610429579182015b8281111561042857825182559160200191906001019061040d565b5b509050610436919061043a565b5090565b61045c91905b80821115610458576000816000905550600101610440565b5090565b905600a165627a7a72305820f4c4cb4d191f31a62c4de12f7aecf9b258ba17f3a6ee294191171f7d30c04ab00029" +# ENS Default Reverse Resolver +reverse_resolver_abi = json.loads('[{"inputs":[{"internalType":"contract ENS","name":"ensAddr","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"constant":true,"inputs":[],"name":"ens","outputs":[{"internalType":"contract ENS","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]') +reverse_resolver_bytecode = '608060405234801561001057600080fd5b5060405160208061079f8339810180604052602081101561003057600080fd5b8101908080519060200190929190505050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be37f91d1777781884d03a6757a803996e38de2a42967fb37eeaca72729271025a9e26001026040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561013457600080fd5b505afa158015610148573d6000803e3d6000fd5b505050506040513d602081101561015e57600080fd5b81019080805190602001909291905050509050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614151561027f578073ffffffffffffffffffffffffffffffffffffffff16631e83409a336040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801561024257600080fd5b505af1158015610256573d6000803e3d6000fd5b505050506040513d602081101561026c57600080fd5b8101908080519060200190929190505050505b505061050f806102906000396000f3fe608060405260043610610057576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680633f15457f1461005c578063691f3431146100b35780637737221314610167575b600080fd5b34801561006857600080fd5b50610071610239565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156100bf57600080fd5b506100ec600480360360208110156100d657600080fd5b810190808035906020019092919050505061025e565b6040518080602001828103825283818151815260200191508051906020019080838360005b8381101561012c578082015181840152602081019050610111565b50505050905090810190601f1680156101595780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b34801561017357600080fd5b506102376004803603604081101561018a57600080fd5b8101908080359060200190929190803590602001906401000000008111156101b157600080fd5b8201836020820111156101c357600080fd5b803590602001918460018302840111640100000000831117156101e557600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050919291929050505061030e565b005b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60016020528060005260406000206000915090508054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156103065780601f106102db57610100808354040283529160200191610306565b820191906000526020600020905b8154815290600101906020018083116102e957829003601f168201915b505050505081565b816000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3826040518263ffffffff167c01000000000000000000000000000000000000000000000000000000000281526004018082815260200191505060206040518083038186803b15801561039d57600080fd5b505afa1580156103b1573d6000803e3d6000fd5b505050506040513d60208110156103c757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561041157600080fd5b8160016000858152602001908152602001600020908051906020019061043892919061043e565b50505050565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061047f57805160ff19168380011785556104ad565b828001600101855582156104ad579182015b828111156104ac578251825591602001919060010190610491565b5b5090506104ba91906104be565b5090565b6104e091905b808211156104dc5760008160009055506001016104c4565b5090565b9056fea165627a7a72305820f326fd97e1fac0bcd89f007846301e41c2ad494c12d70b2b50dd61e62ffc906a0029' +reverse_resolver_bytecode_runtime = '608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a7146100515780633e9ce794146100815780639061b9231461009d578063f86bc879146100cd575b600080fd5b61006b6004803603810190610066919061051e565b6100fd565b6040516100789190610566565b60405180910390f35b61009b60048036038101906100969190610641565b61015e565b005b6100b760048036038101906100b291906106f9565b610245565b6040516100c49190610813565b60405180910390f35b6100e760048036038101906100e29190610835565b61042f565b6040516100f49190610566565b60405180910390f35b6000639061b92360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061015757506101568261046b565b5b9050919050565b806001600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df8333848460405161023894939291906108a6565b60405180910390a1505050565b60606040518060400160405280601781526020017f11657874656e6465642d7265736f6c766572036574680000000000000000000081525080519060200120858560405161029492919061092a565b60405180910390201480156102ad575060248383905010155b15610328577ff0a378cc2afe91730d0105e67d6bb037cc5b8b6bfec5b5962d9b637ff6497e5560001b83836004906024926102ea9392919061094d565b906102f591906109a0565b146102ff57600080fd5b61beef60405160200161031291906109ff565b6040516020818303038152906040529050610427565b60008585600081811061033e5761033d610a1a565b5b9050013560f81c60f81b60f81c60ff1690506040518060400160405280601781526020017f11657874656e6465642d7265736f6c766572036574680000000000000000000081525080519060200120868683600161039c9190610a82565b9080926103ab9392919061094d565b6040516103b9929190610ad8565b604051809103902014610401576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016103f890610b28565b60405180910390fd5b61dead60405160200161041491906109ff565b6040516020818303038152906040529150505b949350505050565b6001602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6104fb816104c6565b811461050657600080fd5b50565b600081359050610518816104f2565b92915050565b600060208284031215610534576105336104bc565b5b600061054284828501610509565b91505092915050565b60008115159050919050565b6105608161054b565b82525050565b600060208201905061057b6000830184610557565b92915050565b6000819050919050565b61059481610581565b811461059f57600080fd5b50565b6000813590506105b18161058b565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006105e2826105b7565b9050919050565b6105f2816105d7565b81146105fd57600080fd5b50565b60008135905061060f816105e9565b92915050565b61061e8161054b565b811461062957600080fd5b50565b60008135905061063b81610615565b92915050565b60008060006060848603121561065a576106596104bc565b5b6000610668868287016105a2565b935050602061067986828701610600565b925050604061068a8682870161062c565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126106b9576106b8610694565b5b8235905067ffffffffffffffff8111156106d6576106d5610699565b5b6020830191508360018202830111156106f2576106f161069e565b5b9250929050565b60008060008060408587031215610713576107126104bc565b5b600085013567ffffffffffffffff811115610731576107306104c1565b5b61073d878288016106a3565b9450945050602085013567ffffffffffffffff8111156107605761075f6104c1565b5b61076c878288016106a3565b925092505092959194509250565b600081519050919050565b600082825260208201905092915050565b60005b838110156107b4578082015181840152602081019050610799565b838111156107c3576000848401525b50505050565b6000601f19601f8301169050919050565b60006107e58261077a565b6107ef8185610785565b93506107ff818560208601610796565b610808816107c9565b840191505092915050565b6000602082019050818103600083015261082d81846107da565b905092915050565b60008060006060848603121561084e5761084d6104bc565b5b600061085c868287016105a2565b935050602061086d86828701610600565b925050604061087e86828701610600565b9150509250925092565b61089181610581565b82525050565b6108a0816105d7565b82525050565b60006080820190506108bb6000830187610888565b6108c86020830186610897565b6108d56040830185610897565b6108e26060830184610557565b95945050505050565b600081905092915050565b82818337600083830152505050565b600061091183856108eb565b935061091e8385846108f6565b82840190509392505050565b6000610937828486610905565b91508190509392505050565b600080fd5b600080fd5b6000808585111561096157610960610943565b5b8386111561097257610971610948565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006109ac8383610988565b826109b78135610581565b925060208210156109f7576109f27fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff83602003600802610993565b831692505b505092915050565b6000602082019050610a146000830184610897565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610a8d82610a49565b9150610a9883610a49565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610acd57610acc610a53565b5b828201905092915050565b6000610ae5828486610905565b91508190509392505050565b600082825260208201905092915050565b50565b6000610b12600083610af1565b9150610b1d82610b02565b600082019050919050565b60006020820190508181036000830152610b4181610b05565b905091905056fea264697066735822122053f3072486d953b17f72555d93bae38d3607f573e572c03ca3b10c082471640064736f6c634300080d0033' + +# ENSIP-10 - Extended Resolver for Wildcard Resolution +# compiled from `tests/test_contracts/ExtendedResolver.sol` +extended_resolver_abi = '[{"inputs": [{"internalType": "contract ENS","name": "_ens","type": "address"}],"stateMutability": "nonpayable","type": "constructor"},{"anonymous": false,"inputs": [{"indexed": false,"internalType": "bytes32","name": "node","type": "bytes32"},{"indexed": false,"internalType": "address","name": "owner","type": "address"},{"indexed": false,"internalType": "address","name": "target","type": "address"},{"indexed": false,"internalType": "bool","name": "isAuthorised","type": "bool"}],"name": "AuthorisationChanged","type": "event"},{"inputs": [{"internalType": "bytes32", "name": "", "type": "bytes32"},{"internalType": "address", "name": "", "type": "address"},{"internalType": "address", "name": "", "type": "address"}],"name": "authorisations","outputs": [{"internalType": "bool", "name": "", "type": "bool"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "bytes", "name": "dnsName", "type": "bytes"},{"internalType": "bytes", "name": "data", "type": "bytes"}],"name": "resolve","outputs": [{"internalType": "bytes", "name": "", "type": "bytes"}],"stateMutability": "view","type": "function"},{"inputs": [{"internalType": "bytes32", "name": "node", "type": "bytes32"},{"internalType": "address", "name": "target", "type": "address"},{"internalType": "bool", "name": "isAuthorised", "type": "bool"}],"name": "setAuthorisation","outputs": [],"stateMutability": "nonpayable","type": "function"},{"inputs": [{"internalType": "bytes4","name": "interfaceID","type": "bytes4"}],"name": "supportsInterface","outputs": [{"internalType": "bool", "name": "", "type": "bool"}],"stateMutability": "pure","type": "function"}]' +extended_resolver_bytecode = '608060405234801561001057600080fd5b50604051610dbb380380610dbb833981810160405281019061003291906100ed565b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505061011a565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006100a88261007d565b9050919050565b60006100ba8261009d565b9050919050565b6100ca816100af565b81146100d557600080fd5b50565b6000815190506100e7816100c1565b92915050565b60006020828403121561010357610102610078565b5b6000610111848285016100d8565b91505092915050565b610c92806101296000396000f3fe608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a7146100515780633e9ce794146100815780639061b9231461009d578063f86bc879146100cd575b600080fd5b61006b60048036038101906100669190610554565b6100fd565b604051610078919061059c565b60405180910390f35b61009b60048036038101906100969190610677565b61015e565b005b6100b760048036038101906100b2919061072f565b610245565b6040516100c49190610849565b60405180910390f35b6100e760048036038101906100e2919061086b565b610465565b6040516100f4919061059c565b60405180910390f35b6000639061b92360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806101575750610156826104a1565b5b9050919050565b806001600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df8333848460405161023894939291906108dc565b60405180910390a1505050565b60606040518060400160405280601781526020017f11657874656e6465642d7265736f6c7665720365746800000000000000000000815250805190602001208585604051610294929190610960565b60405180910390201480156102ad575060248383905010155b1561035e577ff0a378cc2afe91730d0105e67d6bb037cc5b8b6bfec5b5962d9b637ff6497e5560001b83836004906024926102ea93929190610983565b906102f591906109d6565b14610335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032c90610ab8565b60405180910390fd5b61beef6040516020016103489190610ad8565b604051602081830303815290604052905061045d565b60008585600081811061037457610373610af3565b5b9050013560f81c60f81b60f81c60ff1690506040518060400160405280601781526020017f11657874656e6465642d7265736f6c76657203657468000000000000000000008152508051906020012086868360016103d29190610b5b565b9080926103e193929190610983565b6040516103ef929190610bb1565b604051809103902014610437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042e90610c3c565b60405180910390fd5b61dead60405160200161044a9190610ad8565b6040516020818303038152906040529150505b949350505050565b6001602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610531816104fc565b811461053c57600080fd5b50565b60008135905061054e81610528565b92915050565b60006020828403121561056a576105696104f2565b5b60006105788482850161053f565b91505092915050565b60008115159050919050565b61059681610581565b82525050565b60006020820190506105b1600083018461058d565b92915050565b6000819050919050565b6105ca816105b7565b81146105d557600080fd5b50565b6000813590506105e7816105c1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610618826105ed565b9050919050565b6106288161060d565b811461063357600080fd5b50565b6000813590506106458161061f565b92915050565b61065481610581565b811461065f57600080fd5b50565b6000813590506106718161064b565b92915050565b6000806000606084860312156106905761068f6104f2565b5b600061069e868287016105d8565b93505060206106af86828701610636565b92505060406106c086828701610662565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126106ef576106ee6106ca565b5b8235905067ffffffffffffffff81111561070c5761070b6106cf565b5b602083019150836001820283011115610728576107276106d4565b5b9250929050565b60008060008060408587031215610749576107486104f2565b5b600085013567ffffffffffffffff811115610767576107666104f7565b5b610773878288016106d9565b9450945050602085013567ffffffffffffffff811115610796576107956104f7565b5b6107a2878288016106d9565b925092505092959194509250565b600081519050919050565b600082825260208201905092915050565b60005b838110156107ea5780820151818401526020810190506107cf565b838111156107f9576000848401525b50505050565b6000601f19601f8301169050919050565b600061081b826107b0565b61082581856107bb565b93506108358185602086016107cc565b61083e816107ff565b840191505092915050565b600060208201905081810360008301526108638184610810565b905092915050565b600080600060608486031215610884576108836104f2565b5b6000610892868287016105d8565b93505060206108a386828701610636565b92505060406108b486828701610636565b9150509250925092565b6108c7816105b7565b82525050565b6108d68161060d565b82525050565b60006080820190506108f160008301876108be565b6108fe60208301866108cd565b61090b60408301856108cd565b610918606083018461058d565b95945050505050565b600081905092915050565b82818337600083830152505050565b60006109478385610921565b935061095483858461092c565b82840190509392505050565b600061096d82848661093b565b91508190509392505050565b600080fd5b600080fd5b6000808585111561099757610996610979565b5b838611156109a8576109a761097e565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006109e283836109be565b826109ed81356105b7565b92506020821015610a2d57610a287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026109c9565b831692505b505092915050565b600082825260208201905092915050565b7f706172656e7420646f6d61696e206e6f742076616c696461746564206170707260008201527f6f7072696174656c790000000000000000000000000000000000000000000000602082015250565b6000610aa2602983610a35565b9150610aad82610a46565b604082019050919050565b60006020820190508181036000830152610ad181610a95565b9050919050565b6000602082019050610aed60008301846108cd565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610b6682610b22565b9150610b7183610b22565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610ba657610ba5610b2c565b5b828201905092915050565b6000610bbe82848661093b565b91508190509392505050565b7f737562646f6d61696e206e6f742076616c69646174656420617070726f70726960008201527f6174656c79000000000000000000000000000000000000000000000000000000602082015250565b6000610c26602583610a35565b9150610c3182610bca565b604082019050919050565b60006020820190508181036000830152610c5581610c19565b905091905056fea26469706673582212209fff87be19ed85e754d5e2791de6ed052e7e653185e1d47fa94515f851becd2f64736f6c634300080d0033' +extended_resolver_bytecode_runtime = '608060405234801561001057600080fd5b506004361061004c5760003560e01c806301ffc9a7146100515780633e9ce794146100815780639061b9231461009d578063f86bc879146100cd575b600080fd5b61006b60048036038101906100669190610554565b6100fd565b604051610078919061059c565b60405180910390f35b61009b60048036038101906100969190610677565b61015e565b005b6100b760048036038101906100b2919061072f565b610245565b6040516100c49190610849565b60405180910390f35b6100e760048036038101906100e2919061086b565b610465565b6040516100f4919061059c565b60405180910390f35b6000639061b92360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806101575750610156826104a1565b5b9050919050565b806001600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055507fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df8333848460405161023894939291906108dc565b60405180910390a1505050565b60606040518060400160405280601781526020017f11657874656e6465642d7265736f6c7665720365746800000000000000000000815250805190602001208585604051610294929190610960565b60405180910390201480156102ad575060248383905010155b1561035e577ff0a378cc2afe91730d0105e67d6bb037cc5b8b6bfec5b5962d9b637ff6497e5560001b83836004906024926102ea93929190610983565b906102f591906109d6565b14610335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161032c90610ab8565b60405180910390fd5b61beef6040516020016103489190610ad8565b604051602081830303815290604052905061045d565b60008585600081811061037457610373610af3565b5b9050013560f81c60f81b60f81c60ff1690506040518060400160405280601781526020017f11657874656e6465642d7265736f6c76657203657468000000000000000000008152508051906020012086868360016103d29190610b5b565b9080926103e193929190610983565b6040516103ef929190610bb1565b604051809103902014610437576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161042e90610c3c565b60405180910390fd5b61dead60405160200161044a9190610ad8565b6040516020818303038152906040529150505b949350505050565b6001602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610531816104fc565b811461053c57600080fd5b50565b60008135905061054e81610528565b92915050565b60006020828403121561056a576105696104f2565b5b60006105788482850161053f565b91505092915050565b60008115159050919050565b61059681610581565b82525050565b60006020820190506105b1600083018461058d565b92915050565b6000819050919050565b6105ca816105b7565b81146105d557600080fd5b50565b6000813590506105e7816105c1565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610618826105ed565b9050919050565b6106288161060d565b811461063357600080fd5b50565b6000813590506106458161061f565b92915050565b61065481610581565b811461065f57600080fd5b50565b6000813590506106718161064b565b92915050565b6000806000606084860312156106905761068f6104f2565b5b600061069e868287016105d8565b93505060206106af86828701610636565b92505060406106c086828701610662565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f8401126106ef576106ee6106ca565b5b8235905067ffffffffffffffff81111561070c5761070b6106cf565b5b602083019150836001820283011115610728576107276106d4565b5b9250929050565b60008060008060408587031215610749576107486104f2565b5b600085013567ffffffffffffffff811115610767576107666104f7565b5b610773878288016106d9565b9450945050602085013567ffffffffffffffff811115610796576107956104f7565b5b6107a2878288016106d9565b925092505092959194509250565b600081519050919050565b600082825260208201905092915050565b60005b838110156107ea5780820151818401526020810190506107cf565b838111156107f9576000848401525b50505050565b6000601f19601f8301169050919050565b600061081b826107b0565b61082581856107bb565b93506108358185602086016107cc565b61083e816107ff565b840191505092915050565b600060208201905081810360008301526108638184610810565b905092915050565b600080600060608486031215610884576108836104f2565b5b6000610892868287016105d8565b93505060206108a386828701610636565b92505060406108b486828701610636565b9150509250925092565b6108c7816105b7565b82525050565b6108d68161060d565b82525050565b60006080820190506108f160008301876108be565b6108fe60208301866108cd565b61090b60408301856108cd565b610918606083018461058d565b95945050505050565b600081905092915050565b82818337600083830152505050565b60006109478385610921565b935061095483858461092c565b82840190509392505050565b600061096d82848661093b565b91508190509392505050565b600080fd5b600080fd5b6000808585111561099757610996610979565b5b838611156109a8576109a761097e565b5b6001850283019150848603905094509492505050565b600082905092915050565b600082821b905092915050565b60006109e283836109be565b826109ed81356105b7565b92506020821015610a2d57610a287fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff836020036008026109c9565b831692505b505092915050565b600082825260208201905092915050565b7f706172656e7420646f6d61696e206e6f742076616c696461746564206170707260008201527f6f7072696174656c790000000000000000000000000000000000000000000000602082015250565b6000610aa2602983610a35565b9150610aad82610a46565b604082019050919050565b60006020820190508181036000830152610ad181610a95565b9050919050565b6000602082019050610aed60008301846108cd565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610b6682610b22565b9150610b7183610b22565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115610ba657610ba5610b2c565b5b828201905092915050565b6000610bbe82848661093b565b91508190509392505050565b7f737562646f6d61696e206e6f742076616c69646174656420617070726f70726960008201527f6174656c79000000000000000000000000000000000000000000000000000000602082015250565b6000610c26602583610a35565b9150610c3182610bca565b604082019050919050565b60006020820190508181036000830152610c5581610c19565b905091905056fea26469706673582212209fff87be19ed85e754d5e2791de6ed052e7e653185e1d47fa94515f851becd2f64736f6c634300080d0033' + +# Simple resolver with no support for interfaces like getText(), etc +# compiled from `tests/test_contracts/SimpleResolver.sol` +simple_resolver_abi = json.loads('[{"inputs":[{"internalType":"bytes32","name":"nodeID","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"}]') +simple_resolver_bytecode = '608060405234801561001057600080fd5b5061028c806100206000396000f3fe608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b5780633b3b57de1461006b575b600080fd5b61005560048036038101906100509190610134565b61009b565b604051610062919061017c565b60405180910390f35b610085600480360381019061008091906101cd565b6100cd565b604051610092919061023b565b60405180910390f35b6000633b3b57de60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000309050919050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610111816100dc565b811461011c57600080fd5b50565b60008135905061012e81610108565b92915050565b60006020828403121561014a576101496100d7565b5b60006101588482850161011f565b91505092915050565b60008115159050919050565b61017681610161565b82525050565b6000602082019050610191600083018461016d565b92915050565b6000819050919050565b6101aa81610197565b81146101b557600080fd5b50565b6000813590506101c7816101a1565b92915050565b6000602082840312156101e3576101e26100d7565b5b60006101f1848285016101b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610225826101fa565b9050919050565b6102358161021a565b82525050565b6000602082019050610250600083018461022c565b9291505056fea2646970667358221220e9d34e70193fa6e99d9be00bd7b1e4b63dc6fd9c84934a35350d8b2c4215974964736f6c634300080d0033' +simple_resolver_bytecode_runtime = '608060405234801561001057600080fd5b50600436106100365760003560e01c806301ffc9a71461003b5780633b3b57de1461006b575b600080fd5b61005560048036038101906100509190610134565b61009b565b604051610062919061017c565b60405180910390f35b610085600480360381019061008091906101cd565b6100cd565b604051610092919061023b565b60405180910390f35b6000633b3b57de60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000309050919050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b610111816100dc565b811461011c57600080fd5b50565b60008135905061012e81610108565b92915050565b60006020828403121561014a576101496100d7565b5b60006101588482850161011f565b91505092915050565b60008115159050919050565b61017681610161565b82525050565b6000602082019050610191600083018461016d565b92915050565b6000819050919050565b6101aa81610197565b81146101b557600080fd5b50565b6000813590506101c7816101a1565b92915050565b6000602082840312156101e3576101e26100d7565b5b60006101f1848285016101b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610225826101fa565b9050919050565b6102358161021a565b82525050565b6000602082019050610250600083018461022c565b9291505056fea2646970667358221220e9d34e70193fa6e99d9be00bd7b1e4b63dc6fd9c84934a35350d8b2c4215974964736f6c634300080d0033' diff --git a/ens/exceptions.py b/ens/exceptions.py index 4048c5d2f2..3e254cffde 100644 --- a/ens/exceptions.py +++ b/ens/exceptions.py @@ -40,6 +40,20 @@ class UnownedName(Exception): pass +class ResolverNotFound(Exception): + """ + Raised if no resolver was found for the name you are trying to resolve. + """ + pass + + +class UnsupportedFunction(Exception): + """ + Raised if a resolver does not support a particular method. + """ + pass + + class BidTooLow(ValueError): """ Raised if you bid less than the minimum amount diff --git a/ens/main.py b/ens/main.py index 465f640af6..6db478e57f 100644 --- a/ens/main.py +++ b/ens/main.py @@ -6,6 +6,7 @@ ) from typing import ( TYPE_CHECKING, + Any, Optional, Sequence, Tuple, @@ -17,8 +18,10 @@ Address, ChecksumAddress, HexAddress, + HexStr, ) from eth_utils import ( + is_address, is_binary_address, is_checksum_address, to_checksum_address, @@ -34,18 +37,25 @@ from ens.constants import ( EMPTY_ADDR_HEX, ENS_MAINNET_ADDR, + EXTENDED_RESOLVER_INTERFACE_ID, + GET_TEXT_INTERFACE_ID, REVERSE_REGISTRAR_DOMAIN, ) from ens.exceptions import ( AddressMismatch, + ResolverNotFound, UnauthorizedError, UnownedName, + UnsupportedFunction, ) from ens.utils import ( address_in, address_to_reverse_domain, default, + ens_encode_name, + get_abi_output_types, init_web3, + is_empty_name, is_none_or_zero_address, is_valid_name, label_to_hash, @@ -119,7 +129,8 @@ def __init__( ens_addr = addr if addr else ENS_MAINNET_ADDR self.ens = self.w3.eth.contract(abi=abis.ENS, address=ens_addr) - self._resolverContract = self.w3.eth.contract(abi=abis.RESOLVER) + self._resolver_contract = self.w3.eth.contract(abi=abis.RESOLVER) + self._reverse_resolver_contract = self.w3.eth.contract(abi=abis.REVERSE_RESOLVER) @classmethod def fromWeb3(cls, w3: 'Web3', addr: ChecksumAddress = None) -> 'ENS': @@ -141,7 +152,7 @@ def address(self, name: str) -> Optional[ChecksumAddress]: :param str name: an ENS name to look up :raises InvalidName: if `name` has invalid syntax """ - return cast(ChecksumAddress, self.resolve(name, 'addr')) + return cast(ChecksumAddress, self._resolve(name, 'addr')) def name(self, address: ChecksumAddress) -> Optional[str]: """ @@ -152,18 +163,40 @@ def name(self, address: ChecksumAddress) -> Optional[str]: :type address: hex-string """ reversed_domain = address_to_reverse_domain(address) - name = self.resolve(reversed_domain, get='name') + name = self._resolve(reversed_domain, fn_name='name') # To be absolutely certain of the name, via reverse resolution, the address must match in # the forward resolution return name if to_checksum_address(address) == self.address(name) else None + @staticmethod + def parent(name: str) -> str: + """ + Part of ENSIP-10. Returns the parent of a given ENS name, or the empty string if the ENS + name does not have a parent. + + e.g. + - parent('1.foo.bar.eth') = 'foo.bar.eth' + - parent('foo.bar.eth') = 'bar.eth' + - parent('foo.eth') = 'eth' + - parent('eth') is defined as the empty string '' + + :param name: an ENS name + :return: the parent for the provided ENS name + :rtype: str + """ + if not name: + return '' + + labels = name.split('.') + return '' if len(labels) == 1 else '.'.join(labels[1:]) + def setup_address( self, name: str, address: Union[Address, ChecksumAddress, HexAddress] = cast(ChecksumAddress, default), transact: Optional["TxParams"] = None - ) -> HexBytes: + ) -> Optional[HexBytes]: """ Set up the name to point to the supplied address. The sender of the transaction must own the name, or @@ -252,24 +285,14 @@ def setup_name( self.setup_address(name, address, transact=transact) return self._setup_reverse(name, address, transact=transact) - def resolve(self, name: str, get: str = 'addr') -> Optional[Union[ChecksumAddress, str]]: - normal_name = normalize_name(name) - resolver = self.resolver(normal_name) - if resolver: - lookup_function = getattr(resolver.functions, get) - namehash = normal_name_to_hash(normal_name) - address = lookup_function(namehash).call() - if is_none_or_zero_address(address): - return None - return address - else: - return None + def resolver(self, name: str) -> Optional['Contract']: + """ + Get the resolver for an ENS name. - def resolver(self, normal_name: str) -> Optional['Contract']: - resolver_addr = self.ens.caller.resolver(normal_name_to_hash(normal_name)) - if is_none_or_zero_address(resolver_addr): - return None - return self._resolverContract(address=resolver_addr) + :param str name: The ENS name + """ + normal_name = normalize_name(name) + return self._get_resolver(normal_name)[0] def reverser(self, target_address: ChecksumAddress) -> Optional['Contract']: reversed_domain = address_to_reverse_domain(target_address) @@ -295,25 +318,34 @@ def get_text(self, name: str, key: str) -> str: :param str name: ENS name to look up :param str key: ENS name's text record key - :return: ENS name's text record value + :return: ENS name's text record value :rtype: str - :raises UnownedName: if no one owns `name` + :raises UnsupportedFunction: If the resolver does not support the "0x59d1d43c" interface id + :raises ResolverNotFound: If no resolver is found for the provided name """ node = raw_name_to_hash(name) normal_name = normalize_name(name) r = self.resolver(normal_name) if r: - return r.caller.text(node, key) + if _resolver_supports_interface(r, GET_TEXT_INTERFACE_ID): + return r.caller.text(node, key) + else: + raise UnsupportedFunction( + f"Resolver for name {name} does not support `text` function." + ) else: - raise UnownedName("claim domain using setup_address() first") + raise ResolverNotFound( + f"No resolver found for name `{name}`. It is likely the name contains an " + "unsupported top level domain (tld)." + ) def set_text( self, name: str, key: str, value: str, - transact: "TxParams" = {} + transact: "TxParams" = None ) -> HexBytes: """ Set the value of a text record of an ENS name. @@ -321,12 +353,16 @@ def set_text( :param str name: ENS name :param str key: Name of the attribute to set :param str value: Value to set the attribute to - :param dict transact: the transaction configuration, like in + :param dict transact: The transaction configuration, like in :meth:`~web3.eth.Eth.send_transaction` :return: Transaction hash :rtype: HexBytes - :raises UnownedName: if no one owns `name` + :raises UnsupportedFunction: If the resolver does not support the "0x59d1d43c" interface id + :raises ResolverNotFound: If no resolver is found for the provided name """ + if not transact: + transact = {} + owner = self.owner(name) node = raw_name_to_hash(name) normal_name = normalize_name(name) @@ -335,16 +371,24 @@ def set_text( r = self.resolver(normal_name) if r: - return r.functions.setText(node, key, value).transact(transaction_dict) + if _resolver_supports_interface(r, GET_TEXT_INTERFACE_ID): + return r.functions.setText(node, key, value).transact(transaction_dict) + else: + raise UnsupportedFunction( + f"Resolver for name `{name}` does not support `text` function" + ) else: - raise UnownedName("claim domain using setup_address() first") + raise ResolverNotFound( + f"No resolver found for name `{name}`. It is likely the name contains an " + "unsupported top level domain (tld)." + ) def setup_owner( self, name: str, new_owner: ChecksumAddress = cast(ChecksumAddress, default), transact: Optional["TxParams"] = None - ) -> ChecksumAddress: + ) -> Optional[ChecksumAddress]: """ Set the owner of the supplied name to `new_owner`. @@ -388,6 +432,36 @@ def setup_owner( self._claim_ownership(new_owner, unowned, owned, super_owner, transact=transact) return new_owner + def _resolve(self, name: str, fn_name: str = 'addr') -> Optional[Union[ChecksumAddress, str]]: + normal_name = normalize_name(name) + + resolver, current_name = self._get_resolver(normal_name, fn_name) + if not resolver: + return None + + node = self.namehash(normal_name) + + if _resolver_supports_interface(resolver, EXTENDED_RESOLVER_INTERFACE_ID): + # update the resolver abi to the extended resolver abi + extended_resolver = self.w3.eth.contract(abi=abis.EXTENDED_RESOLVER)(resolver.address) + contract_func_with_args = (fn_name, [node]) + + calldata = extended_resolver.encodeABI(*contract_func_with_args) + contract_call_result = extended_resolver.caller.resolve( + ens_encode_name(normal_name), calldata + ) + result = self._decode_ensip10_resolve_data( + contract_call_result, extended_resolver, fn_name + ) + return to_checksum_address(result) if is_address(result) else result + elif normal_name == current_name: + lookup_function = getattr(resolver.functions, fn_name) + result = lookup_function(node).call() + if is_none_or_zero_address(result): + return None + return to_checksum_address(result) if is_address(result) else result + return None + def _assert_control(self, account: ChecksumAddress, name: str, parent_owned: Optional[str] = None) -> None: if not address_in(account, self.w3.eth.accounts): @@ -449,21 +523,63 @@ def _set_resolver( namehash, resolver_addr ).transact(transact) - return self._resolverContract(address=resolver_addr) + return self._resolver_contract(address=resolver_addr) + + def _get_resolver( + self, + normal_name: str, + fn_name: str = 'addr' + ) -> Tuple[Optional['Contract'], str]: + current_name = normal_name + + # look for a resolver, starting at the full name and taking the parent each time that no + # resolver is found + while True: + if is_empty_name(current_name): + # if no resolver found across all iterations, current_name will eventually be the + # empty string '' which returns here + return None, current_name + + resolver_addr = self.ens.caller.resolver(normal_name_to_hash(current_name)) + if not is_none_or_zero_address(resolver_addr): + # if resolver found, return it + return self._type_aware_resolver(resolver_addr, fn_name), current_name + + # set current_name to parent and try again + current_name = self.parent(current_name) + + def _decode_ensip10_resolve_data( + self, contract_call_result: bytes, extended_resolver: 'Contract', fn_name: str, + ) -> Any: + func = extended_resolver.get_function_by_name(fn_name) + output_types = get_abi_output_types(func.abi) + decoded = self.w3.codec.decode_abi(output_types, contract_call_result) + + # if decoding a single value, return that value - else, return the tuple + return decoded[0] if len(decoded) == 1 else decoded def _setup_reverse( self, name: str, address: ChecksumAddress, transact: Optional["TxParams"] = None ) -> HexBytes: + name = normalize_name(name) if name else '' if not transact: transact = {} transact = deepcopy(transact) - if name: - name = normalize_name(name) - else: - name = '' transact['from'] = address return self._reverse_registrar().functions.setName(name).transact(transact) + def _type_aware_resolver(self, address: ChecksumAddress, func: str) -> 'Contract': + return ( + self._reverse_resolver_contract(address=address) if func == 'name' else + self._resolver_contract(address=address) + ) + def _reverse_registrar(self) -> 'Contract': addr = self.ens.caller.owner(normal_name_to_hash(REVERSE_REGISTRAR_DOMAIN)) return self.w3.eth.contract(address=addr, abi=abis.REVERSE_REGISTRAR) + + +def _resolver_supports_interface(resolver: 'Contract', interface_id: HexStr) -> bool: + if not any('supportsInterface' in repr(func) for func in resolver.all_functions()): + return False + return resolver.caller.supportsInterface(interface_id) diff --git a/ens/utils.py b/ens/utils.py index 33fda9ee29..e56ef75d7c 100644 --- a/ens/utils.py +++ b/ens/utils.py @@ -1,8 +1,13 @@ -import datetime +from datetime import ( + datetime, + timezone, +) from typing import ( TYPE_CHECKING, Any, Collection, + Dict, + List, Optional, Sequence, Tuple, @@ -18,10 +23,15 @@ HexStr, ) from eth_utils import ( + ValidationError, is_same_address, remove_0x_prefix, + to_bytes, to_normalized_address, ) +from eth_utils.abi import ( + collapse_if_tuple, +) from hexbytes import ( HexBytes, ) @@ -48,6 +58,7 @@ BaseProvider, ) from web3.types import ( # noqa: F401 + ABIFunction, Middleware, ) @@ -102,11 +113,41 @@ def normalize_name(name: str) -> str: name = name.decode('utf-8') try: - return idna.uts46_remap(name, std3_rules=True) + return idna.uts46_remap(name, std3_rules=True, transitional=False) except idna.IDNAError as exc: raise InvalidName(f"{name} is an invalid name, because {exc}") from exc +def ens_encode_name(name: str) -> bytes: + """ + Encode a name according to DNS standards specified in section 3.1 of RFC1035 with the + following validations: + + - There is no limit on the total length of the encoded name and the limit on labels is the + ENS standard of 255. + + - Return a single 0-octet, b'\x00', if empty name. + """ + if is_empty_name(name): + return b'\x00' + + normalized_name = normalize_name(name) + + labels = normalized_name.split('.') + labels_as_bytes = [to_bytes(text=label) for label in labels] + + # raises if len(label) > 255: + for index, label in enumerate(labels): + if len(label) > 255: + raise ValidationError(f"Label at position {index} too long after encoding.") + + # concat label size in bytes to each label: + dns_prepped_labels = [to_bytes(len(label)) + label for label in labels_as_bytes] + + # return the joined prepped labels in order and append the zero byte at the end: + return b''.join(dns_prepped_labels) + b'\x00' + + def is_valid_name(name: str) -> bool: """ Validate whether the fully qualified name is valid, as defined in ENS `EIP-137 @@ -124,11 +165,8 @@ def is_valid_name(name: str) -> bool: return False -def to_utc_datetime(timestamp: float) -> Optional[datetime.datetime]: - if timestamp: - return datetime.datetime.fromtimestamp(timestamp, datetime.timezone.utc) - else: - return None +def to_utc_datetime(timestamp: float) -> Optional[datetime]: + return datetime.fromtimestamp(timestamp, timezone.utc) if timestamp else None def sha3_text(val: Union[str, bytes]) -> HexBytes: @@ -204,6 +242,10 @@ def is_none_or_zero_address(addr: Union[Address, ChecksumAddress, HexAddress]) - return not addr or addr == EMPTY_ADDR_HEX +def is_empty_name(name: str) -> bool: + return name in {None, '.', ''} + + def is_valid_ens_name(ens_name: str) -> bool: split_domain = ens_name.split('.') if len(split_domain) == 1: @@ -212,3 +254,11 @@ def is_valid_ens_name(ens_name: str) -> bool: if not is_valid_name(name): return False return True + + +# borrowed from similar method at `web3._utils.abi` due to circular dependency +def get_abi_output_types(abi: 'ABIFunction') -> List[str]: + return ( + [] if abi['type'] == 'fallback' + else [collapse_if_tuple(cast(Dict[str, Any], arg)) for arg in abi['outputs']] + ) diff --git a/newsfragments/2411.feature.rst b/newsfragments/2411.feature.rst new file mode 100644 index 0000000000..136b93dc27 --- /dev/null +++ b/newsfragments/2411.feature.rst @@ -0,0 +1 @@ +ENSIP-10 / wildcard resolution support for ENS module diff --git a/tests/ens/conftest.py b/tests/ens/conftest.py index a11c5ff7dd..c93c1021fc 100644 --- a/tests/ens/conftest.py +++ b/tests/ens/conftest.py @@ -8,6 +8,9 @@ from ens import ENS from ens.contract_data import ( + extended_resolver_abi, + extended_resolver_bytecode, + extended_resolver_bytecode_runtime, registrar_abi, registrar_bytecode, registrar_bytecode_runtime, @@ -20,6 +23,9 @@ reverse_resolver_abi, reverse_resolver_bytecode, reverse_resolver_bytecode_runtime, + simple_resolver_abi, + simple_resolver_bytecode, + simple_resolver_bytecode_runtime, ) from web3 import Web3 from web3.contract import ( @@ -77,6 +83,24 @@ def PublicResolverFactory(w3): ) +def SimpleResolver(w3): + return w3.eth.contract( + bytecode=simple_resolver_bytecode, + bytecode_runtime=simple_resolver_bytecode_runtime, + abi=simple_resolver_abi, + ContractFactoryClass=Contract, + ) + + +def ExtendedResolver(w3): + return w3.eth.contract( + bytecode=extended_resolver_bytecode, + bytecode_runtime=extended_resolver_bytecode_runtime, + abi=extended_resolver_abi, + ContractFactoryClass=Contract, + ) + + def ENSFactory(w3): return w3.eth.contract( bytecode="6060604052341561000f57600080fd5b60008080526020527fad3228b676f7d3cd4284a5443f17f1962b36e491b30a40b2405849e597ba5fb58054600160a060020a033316600160a060020a0319909116179055610501806100626000396000f300606060405236156100805763ffffffff7c01000000000000000000000000000000000000000000000000000000006000350416630178b8bf811461008557806302571be3146100b757806306ab5923146100cd57806314ab9038146100f457806316a25cbd146101175780631896f70a1461014a5780635b0fc9c31461016c575b600080fd5b341561009057600080fd5b61009b60043561018e565b604051600160a060020a03909116815260200160405180910390f35b34156100c257600080fd5b61009b6004356101ac565b34156100d857600080fd5b6100f2600435602435600160a060020a03604435166101c7565b005b34156100ff57600080fd5b6100f260043567ffffffffffffffff60243516610289565b341561012257600080fd5b61012d600435610355565b60405167ffffffffffffffff909116815260200160405180910390f35b341561015557600080fd5b6100f2600435600160a060020a036024351661038c565b341561017757600080fd5b6100f2600435600160a060020a0360243516610432565b600090815260208190526040902060010154600160a060020a031690565b600090815260208190526040902054600160a060020a031690565b600083815260208190526040812054849033600160a060020a039081169116146101f057600080fd5b8484604051918252602082015260409081019051908190039020915083857fce0457fe73731f824cc272376169235128c118b49d344817417c6d108d155e8285604051600160a060020a03909116815260200160405180910390a3506000908152602081905260409020805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03929092169190911790555050565b600082815260208190526040902054829033600160a060020a039081169116146102b257600080fd5b827f1d4f9bbfc9cab89d66e1a1562f2233ccbf1308cb4f63de2ead5787adddb8fa688360405167ffffffffffffffff909116815260200160405180910390a250600091825260208290526040909120600101805467ffffffffffffffff90921674010000000000000000000000000000000000000000027fffffffff0000000000000000ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60009081526020819052604090206001015474010000000000000000000000000000000000000000900467ffffffffffffffff1690565b600082815260208190526040902054829033600160a060020a039081169116146103b557600080fd5b827f335721b01866dc23fbee8b6b2c7b1e14d6f05c28cd35a2c934239f94095602a083604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120600101805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a03909216919091179055565b600082815260208190526040902054829033600160a060020a0390811691161461045b57600080fd5b827fd4735d920b0f87494915f556dd9b54c8f309026070caea5c737245152564d26683604051600160a060020a03909116815260200160405180910390a250600091825260208290526040909120805473ffffffffffffffffffffffffffffffffffffffff1916600160a060020a039092169190911790555600a165627a7a7230582050975b6c54a16d216b563f4c4960d6ebc5881eb1ec73c2ef1f87920a251159530029", # noqa: E501 @@ -86,7 +110,7 @@ def ENSFactory(w3): ) -def ETHRegistrarFactory(w3): +def ENSRegistryFactory(w3): return w3.eth.contract( bytecode=registrar_bytecode, bytecode_runtime=registrar_bytecode_runtime, @@ -140,12 +164,12 @@ def ens_setup(): public_resolver.address ).transact({'from': ens_key}) - # create .eth auction registrar + # create .eth registrar eth_registrar = deploy( w3, - ETHRegistrarFactory, + ENSRegistryFactory, ens_key, - args=[ens_contract.address, eth_namehash, 1], + args=[ens_contract.address, eth_namehash], ) # set '.eth' to resolve to the registrar @@ -194,12 +218,60 @@ def ens_setup(): ).transact({'from': ens_key}) # set owner of tester.eth to an account controlled by tests + second_account = w3.eth.accounts[2] + ens_contract.functions.setSubnodeOwner( eth_namehash, w3.keccak(text='tester'), - w3.eth.accounts[2] # note that this does not have to be the default, only in the list + second_account # note that this does not have to be the default, only in the list + ).transact({'from': ens_key}) + + # --- setup simple resolver example --- # + + # create simple resolver + simple_resolver = deploy(w3, SimpleResolver, ens_key, args=[ens_contract.address]) + + # set owner of simple-resolver.eth to an account controlled by tests + ens_contract.functions.setSubnodeOwner( + eth_namehash, + w3.keccak(text='simple-resolver'), + second_account + ).transact({'from': ens_key}) + + # ns.namehash('simple-resolver.eth') + simple_resolver_namehash = bytes32( + 0x65db4c1c4f4ab9e6917fa7896ce546b1fe03e9341e98187e3917afb60aa9835a + ) + + ens_contract.functions.setResolver( + simple_resolver_namehash, + simple_resolver.address + ).transact({'from': second_account}) + + # --- setup extended resolver example --- # + + # create extended resolver + extended_resolver = deploy(w3, ExtendedResolver, ens_key, args=[ens_contract.address]) + + # set owner of extended-resolver.eth to an account controlled by tests + ens_contract.functions.setSubnodeOwner( + eth_namehash, + w3.keccak(text='extended-resolver'), + second_account ).transact({'from': ens_key}) + # ns.namehash('extended-resolver.eth') + extended_resolver_namehash = bytes32( + 0xf0a378cc2afe91730d0105e67d6bb037cc5b8b6bfec5b5962d9b637ff6497e55 + ) + + ens_contract.functions.setResolver( + extended_resolver_namehash, + extended_resolver.address + ).transact({'from': second_account}) + + # --- finish setup --- # + # make the registrar the owner of the 'eth' name ens_contract.functions.setSubnodeOwner( b'\0' * 32, diff --git a/tests/ens/test_contracts/ExtendedResolver.sol b/tests/ens/test_contracts/ExtendedResolver.sol new file mode 100644 index 0000000000..5e8b7eedca --- /dev/null +++ b/tests/ens/test_contracts/ExtendedResolver.sol @@ -0,0 +1,127 @@ +/** + * The SimpleExtendedResolver is really only meant to test the validation of the parent ens domain + * `extended-resolver.eth` and, separately, the subdomains of this parent domain. We then "resolve" + * to arbitrary addresses 0x000000000000000000000000000000000000dEaD for subdomain validations and + * 0x000000000000000000000000000000000000bEEF for the parent domain validation so that we can be + * sure each case was validated via the appropriate logic via the `resolve()` function of the contract. + */ + + +pragma solidity >=0.4.24; + +interface ENS { + + // Logged when the owner of a node assigns a new owner to a subnode. + event NewOwner(bytes32 node, bytes32 label, address owner); + + // Logged when the owner of a node transfers ownership to a new account. + event Transfer(bytes32 node, address owner); + + // Logged when the resolver for a node changes. + event NewResolver(bytes32 node, address resolver); + + // Logged when the TTL of a node changes + event NewTTL(bytes32 node, uint64 ttl); + + + function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external; + function setResolver(bytes32 node, address resolver) external; + function setOwner(bytes32 node, address owner) external; + function setTTL(bytes32 node, uint64 ttl) 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); +} + +pragma solidity >= 0.7.0; + +abstract contract ResolverBase { + bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7; + + function supportsInterface(bytes4 interfaceID) virtual public pure returns(bool) { + return interfaceID == INTERFACE_META_ID; + } + + function isAuthorised(bytes32 node) internal virtual view returns(bool); + + modifier authorised(bytes32 node) { + require(isAuthorised(node)); + _; + } + + function bytesToAddress(bytes memory b) internal pure returns(address payable a) { + require(b.length == 20); + assembly { + a := div(mload(add(b, 32)), exp(256, 12)) + } + } + + function addressToBytes(address a) internal pure returns(bytes memory b) { + b = new bytes(20); + assembly { + mstore(add(b, 32), mul(a, exp(256, 12))) + } + } +} + +contract ExtendedResolver is ResolverBase { + ENS ens; + + bytes4 constant private EXTENDED_RESOLVER_INTERFACE_ID = 0x9061b923; + string constant extendedResolverParentDomain = "\x11extended-resolver\x03eth\x00"; + bytes32 constant extendedResolverNamehash = 0xf0a378cc2afe91730d0105e67d6bb037cc5b8b6bfec5b5962d9b637ff6497e55; + + /** + * A mapping of authorisations. An address that is authorised for a name + * may make any changes to the name that the owner could, but may not update + * the set of authorisations. + * (node, owner, caller) => isAuthorised + */ + mapping(bytes32=>mapping(address=>mapping(address=>bool))) public authorisations; + + event AuthorisationChanged(bytes32 node, address owner, address target, bool isAuthorised); + + constructor(ENS _ens) public { + ens = _ens; + } + + /** + * @dev Sets or clears an authorisation. + * Authorisations are specific to the caller. Any account can set an authorisation + * for any name, but the authorisation that is checked will be that of the + * current owner of a name. Thus, transferring a name effectively clears any + * existing authorisations, and new authorisations can be set in advance of + * an ownership transfer if desired. + * + * @param node The name to change the authorisation on. + * @param target The address that is to be authorised or deauthorised. + * @param isAuthorised True if the address should be authorised, or false if it should be deauthorised. + */ + 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) override internal view returns(bool) { + address owner = ens.owner(node); + return owner == msg.sender || authorisations[node][owner][msg.sender]; + } + + function supportsInterface(bytes4 interfaceID) override public pure returns(bool) { + return interfaceID == EXTENDED_RESOLVER_INTERFACE_ID || super.supportsInterface(interfaceID); + } + + // Simple resolve method solely used to test ENSIP-10 / Wildcard Resolution functionality + function resolve(bytes calldata dnsName, bytes calldata data) external view returns (bytes memory) { + // validate 'extended-resolver.eth' parent domain + if (keccak256(dnsName) == keccak256(bytes(extendedResolverParentDomain)) && data.length >= 36) { + require(bytes32(data[4:36]) == extendedResolverNamehash, "parent domain not validated appropriately"); + return abi.encode(address(0x000000000000000000000000000000000000bEEF)); + } else { + uint length = uint8(dnsName[0]); + // validate subdomains of 'extended-resolver.eth' parent domain + require(keccak256(dnsName[1 + length:]) == keccak256(bytes(extendedResolverParentDomain)), "subdomain not validated appropriately"); + return abi.encode(address(0x000000000000000000000000000000000000dEaD)); + } + } +} diff --git a/tests/ens/test_contracts/SimpleResolver.sol b/tests/ens/test_contracts/SimpleResolver.sol new file mode 100644 index 0000000000..30fce21479 --- /dev/null +++ b/tests/ens/test_contracts/SimpleResolver.sol @@ -0,0 +1,13 @@ +pragma solidity ^0.8.13; + +contract SimpleResolver { + // deployed on ropsten at address = 0xD4D522c96111679bF86220deFE75e0aA1df890b4 + + function supportsInterface(bytes4 interfaceID) public returns (bool) { + return interfaceID == 0x3b3b57de; + } + + function addr(bytes32 nodeID) public returns (address) { + return address(this); + } +} diff --git a/tests/ens/test_get_text.py b/tests/ens/test_get_text.py index 82da916a67..db2624efe9 100644 --- a/tests/ens/test_get_text.py +++ b/tests/ens/test_get_text.py @@ -5,7 +5,8 @@ ) from ens.exceptions import ( - UnownedName, + ResolverNotFound, + UnsupportedFunction, ) from web3 import Web3 @@ -17,28 +18,9 @@ ('description', 'a test'), ('notice', 'this contract is a test contract'), ),) -def test_set_text_unowned_name(ens, key, expected): - with pytest.raises(UnownedName): - ens.set_text('tester.eth', key, expected) - - -@pytest.mark.parametrize('key,expected', ( - ('avatar', 'tester.jpeg'), - ('email', 'user@example.com'), - ('url', 'http://example.com'), - ('description', 'a test'), - ('notice', 'this contract is a test contract'), -),) -def test_get_text(ens, key, expected): - address = ens.w3.eth.accounts[2] - ens.setup_address('tester.eth', address) - owner = ens.owner('tester.eth') - assert address == owner - ens.set_text('tester.eth', key, expected) - assert ens.get_text('tester.eth', key) == expected - - # teardown - ens.setup_address('tester.eth', None) +def test_set_text_resolver_not_found(ens, key, expected): + with pytest.raises(ResolverNotFound): + ens.set_text('tld', key, expected) def test_set_text_fails_with_bad_address(ens): @@ -57,10 +39,42 @@ def test_set_text_pass_in_transaction_dict(ens): 'tester.eth', 'avatar', 'example.jpeg', - transact={'gasPrice': Web3.toWei(100, 'gwei')} + transact={ + 'maxFeePerGas': Web3.toWei(100, 'gwei'), + 'maxPriorityFeePerGas': Web3.toWei(100, 'gwei'), + } ) assert ens.get_text('tester.eth', 'url') == 'http://example.com' assert ens.get_text('tester.eth', 'avatar') == 'example.jpeg' # teardown ens.setup_address('tester.eth', None) + + +@pytest.mark.parametrize('key,expected', ( + ('avatar', 'tester.jpeg'), + ('email', 'user@example.com'), + ('url', 'http://example.com'), + ('description', 'a test'), + ('notice', 'this contract is a test contract'), +),) +def test_get_text(ens, key, expected): + address = ens.w3.eth.accounts[2] + ens.setup_address('tester.eth', address) + owner = ens.owner('tester.eth') + assert address == owner + ens.set_text('tester.eth', key, expected) + assert ens.get_text('tester.eth', key) == expected + + # teardown + ens.setup_address('tester.eth', None) + + +def test_get_text_resolver_not_found(ens): + with pytest.raises(ResolverNotFound): + ens.get_text('tld', 'any_key') + + +def test_get_text_for_resolver_with_unsupported_function(ens): + with pytest.raises(UnsupportedFunction, match="does not support `text` function"): + ens.get_text('simple-resolver.eth', 'any_key') diff --git a/tests/ens/test_setup_address.py b/tests/ens/test_setup_address.py index 326161989b..4d1ab182fd 100644 --- a/tests/ens/test_setup_address.py +++ b/tests/ens/test_setup_address.py @@ -3,6 +3,9 @@ patch, ) +from eth_typing import ( + HexStr, +) from eth_utils import ( is_same_address, to_bytes, @@ -23,53 +26,45 @@ @pytest.mark.parametrize( - 'name, full_name, namehash_hex', + 'name, namehash_hex', [ ( - 'tester.eth', 'tester.eth', '0x2a7ac1c833d35677c2ff34a908951de142cc1653de6080ad4e38f4c9cc00aafe', ), ( - 'TESTER.eth', 'TESTER.eth', '0x2a7ac1c833d35677c2ff34a908951de142cc1653de6080ad4e38f4c9cc00aafe', ), # handles alternative dot separators ( - 'tester.eth', 'tester.eth', '0x2a7ac1c833d35677c2ff34a908951de142cc1653de6080ad4e38f4c9cc00aafe', ), ( - 'tester。eth', 'tester。eth', '0x2a7ac1c833d35677c2ff34a908951de142cc1653de6080ad4e38f4c9cc00aafe', ), ( - 'tester。eth', 'tester。eth', '0x2a7ac1c833d35677c2ff34a908951de142cc1653de6080ad4e38f4c9cc00aafe', ), # confirm that set-owner works ( - 'lots.of.subdomains.tester.eth', 'lots.of.subdomains.tester.eth', '0x0d62a759aa1f1c9680de8603a12a5eb175cd1bfa79426229868eba99f4dce692', ), ], ) -def test_set_address(ens, name, full_name, namehash_hex, TEST_ADDRESS): +def test_set_address(ens, name, namehash_hex, TEST_ADDRESS): assert ens.address(name) is None owner = ens.owner('tester.eth') ens.setup_address(name, TEST_ADDRESS) assert is_same_address(ens.address(name), TEST_ADDRESS) - namehash = Web3.toBytes(hexstr=namehash_hex) - normal_name = ens.nameprep(full_name) - assert is_same_address(ens.address(name), TEST_ADDRESS) - + namehash = Web3.toBytes(hexstr=HexStr(namehash_hex)) + normal_name = ens.nameprep(name) # check that the correct namehash is set: assert is_same_address(ens.resolver(normal_name).caller.addr(namehash), TEST_ADDRESS) diff --git a/tests/ens/test_setup_name.py b/tests/ens/test_setup_name.py index e81b73d9ae..f47f48c736 100644 --- a/tests/ens/test_setup_name.py +++ b/tests/ens/test_setup_name.py @@ -1,5 +1,9 @@ import pytest +from eth_typing import ( + HexStr, +) + from ens.main import ( AddressMismatch, UnauthorizedError, @@ -13,7 +17,7 @@ """ -@pytest.fixture() +@pytest.fixture def TEST_ADDRESS(address_conversion_func): return address_conversion_func("0x000000000000000000000000000000000000dEaD") @@ -63,7 +67,7 @@ def test_setup_name(ens, name, normalized_name, namehash_hex): assert ens.name(address) == normalized_name # check that the correct namehash is set: - node = Web3.toBytes(hexstr=namehash_hex) + node = Web3.toBytes(hexstr=HexStr(namehash_hex)) assert ens.resolver(normalized_name).caller.addr(node) == address # check that the correct owner is set: diff --git a/tests/ens/test_utils.py b/tests/ens/test_utils.py index 052670a533..f384cdb709 100644 --- a/tests/ens/test_utils.py +++ b/tests/ens/test_utils.py @@ -1,5 +1,12 @@ +import pytest + +from eth_utils import ( + ValidationError, + to_bytes, +) from ens.utils import ( + ens_encode_name, init_web3, ) @@ -8,3 +15,84 @@ def test_init_adds_middlewares(): w3 = init_web3() middlewares = map(str, w3.manager.middleware_onion) assert 'stalecheck_middleware' in next(middlewares) + + +@pytest.mark.parametrize( + 'name,expected', + ( + # test some allowed cases + ('tester.eth', b'\x06tester\x03eth\x00'), + ( + 'a.b.c.d.e.f.g.h.i.j.k.l.m.n.o.p', + b'\x01a\x01b\x01c\x01d\x01e\x01f\x01g\x01h\x01i\x01j\x01k\x01l\x01m\x01n\x01o\x01p\x00' + ), + ('1.2.3.4.5.6.7.8.9.10', b'\x011\x012\x013\x014\x015\x016\x017\x018\x019\x0210\x00'), + ('abc.123.def-456.eth', b'\x03abc\x03123\x07def-456\x03eth\x00'), + ('abc.123.def-456.eth', b'\x03abc\x03123\x07def-456\x03eth\x00'), + ('nhéééééé.eth', b'\x0enh\xc3\xa9\xc3\xa9\xc3\xa9\xc3\xa9\xc3\xa9\xc3\xa9\x03eth\x00'), + ('🌈rainbow.eth', b'\x0b\xf0\x9f\x8c\x88rainbow\x03eth\x00'), + ('🐔🐔.tk', b'\x08\xf0\x9f\x90\x94\xf0\x9f\x90\x94\x02tk\x00'), + + # test that label length may be less than 255 + (f"{'a' * 255}.b", b'\xff' + (b'a' * 255) + b'\x01b\x00'), + (f"a.{'b' * 255}", b'\x01a' + b'\xff' + (b'b' * 255) + b'\x00'), + (f"abc-123.{'b' * 255}", b'\x07abc-123' + b'\xff' + b'b' * 255 + b'\x00'), + ) +) +def test_ens_encode_name(name, expected): + assert ens_encode_name(name) == expected + + +@pytest.mark.parametrize( + 'name,expected', + ( + ( + f"{'a' * 63}.{'b' * 63}.{'c' * 63}.{'d' * 63}.{'e' * 63}.{'f' * 63}.{'g' * 63}", + b''.join([b'?' + to_bytes(text=label) * 63 for label in 'abcdefg']) + b'\x00' + ), + ( + f"{'a-1' * 21}.{'b-2' * 21}.{'c-3' * 21}.{'d-4' * 21}.{'e-5' * 21}.{'f-6' * 21}", + b''.join([ + b'?' + to_bytes(text=label) * 21 for label in [ + 'a-1', 'b-2', 'c-3', 'd-4', 'e-5', 'f-6', + ] + ]) + b'\x00' + ), + ) +) +def test_ens_encode_name_validating_total_encoded_name_size(name, expected): + # This test is important because dns validation technically limits the total encoded domain name + # size to 255. ENSIP-10 expects the name to be DNS encoded with one of the validation exceptions + # being that the total encoded size can be any length. + ens_encoded = ens_encode_name(name) + assert len(ens_encoded) > 255 + assert ens_encoded == expected + + +@pytest.mark.parametrize('empty_name', ('', '.')) +def test_ens_encode_name_returns_single_zero_byte_for_empty_name(empty_name): + assert ens_encode_name(empty_name) == b'\00' + + +@pytest.mark.parametrize( + 'name,invalid_label_index', + ( + ('a' * 256, 0), + (f"{'a' * 256}.b", 0), + (f"a.{'a-b1' * 64}x", 1), + (f"{'a' * 256}.{'1' * 255}.{'b' * 255}", 0), + (f"{'a' * 255}.{'1' * 256}.{'b' * 255}", 1), + (f"{'a' * 255}.{'1' * 255}.{'b' * 256}", 2), + ) +) +def test_ens_encode_name_raises_ValidationError_on_label_lengths_over_63(name, invalid_label_index): + with pytest.raises(ValidationError, match=f'Label at position {invalid_label_index} too long'): + ens_encode_name(name) + + +def test_ens_encode_name_normalizes_name_before_encoding(): + assert ens_encode_name('Öbb.at') == ens_encode_name('öbb.at') + assert ens_encode_name('nhÉéÉéÉé.eth') == ens_encode_name('nhéééééé.eth') + assert ens_encode_name('TESTER.eth') == ens_encode_name('tester.eth') + assert ens_encode_name('test\u200btest.com') == ens_encode_name('testtest.com') + assert ens_encode_name("O\u0308bb.at") == ens_encode_name("öbb.at") diff --git a/tests/ens/test_wildcard_resolution.py b/tests/ens/test_wildcard_resolution.py new file mode 100644 index 0000000000..bf1a658ffe --- /dev/null +++ b/tests/ens/test_wildcard_resolution.py @@ -0,0 +1,18 @@ +import pytest + + +@pytest.mark.parametrize('subdomain', ('sub1', 'sub2', 'rändöm', '🌈rainbow', 'faß')) +def test_wildcard_resolution_with_extended_resolver_for_subdomains(ens, subdomain): + # validate subdomains of `extended-resolver.eth` by asserting it returns the specified + # hard-coded address from `tests/test_contracts/ExtendedResolver.sol` which requires + # certain conditions to be met that are specific to subdomains only + resolved_child_address = ens.address(f'{subdomain}.extended-resolver.eth') + assert resolved_child_address == '0x000000000000000000000000000000000000dEaD' + + +def test_wildcard_resolution_with_extended_resolver_for_parent_ens_domain(ens): + # validate `extended-resolver.eth` by asserting it returns the specified hard-coded address from + # `tests/test_contracts/ExtendedResolver.sol` which requires a specific condition to be + # met for the parent domain `extended-resolver.eth` + resolved_parent_address = ens.address('extended-resolver.eth') + assert resolved_parent_address == '0x000000000000000000000000000000000000bEEF'