{
  "address": "0x712d24690C388Ed58C1bBf357a13655e0c78B2B7",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "contract ENS",
          "name": "_ens",
          "type": "address"
        },
        {
          "internalType": "contract IBaseRegistrar",
          "name": "_registrar",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "approvedWrapper",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ens",
      "outputs": [
        {
          "internalType": "contract ENS",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "registrar",
      "outputs": [
        {
          "internalType": "contract IBaseRegistrar",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "parentNode",
          "type": "bytes32"
        },
        {
          "internalType": "string",
          "name": "label",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        },
        {
          "internalType": "address",
          "name": "resolver",
          "type": "address"
        },
        {
          "internalType": "uint64",
          "name": "ttl",
          "type": "uint64"
        },
        {
          "internalType": "uint32",
          "name": "fuses",
          "type": "uint32"
        },
        {
          "internalType": "uint64",
          "name": "expiry",
          "type": "uint64"
        }
      ],
      "name": "setSubnodeRecord",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "wrapper",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "approved",
          "type": "bool"
        }
      ],
      "name": "setWrapperApproval",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "string",
          "name": "label",
          "type": "string"
        },
        {
          "internalType": "address",
          "name": "wrappedOwner",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "fuses",
          "type": "uint32"
        },
        {
          "internalType": "uint64",
          "name": "expiry",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "resolver",
          "type": "address"
        }
      ],
      "name": "wrapETH2LD",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "name",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "wrappedOwner",
          "type": "address"
        },
        {
          "internalType": "uint32",
          "name": "fuses",
          "type": "uint32"
        },
        {
          "internalType": "uint64",
          "name": "expiry",
          "type": "uint64"
        },
        {
          "internalType": "address",
          "name": "approved",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "extraData",
          "type": "bytes"
        }
      ],
      "name": "wrapFromUpgrade",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "transactionHash": "0x925ec02ec26fd5b50e6edd32906c16144660d372310c2166bbf05351eb3b73ba",
  "receipt": {
    "to": null,
    "from": "0x0904Dac3347eA47d208F3Fd67402D039a3b99859",
    "contractAddress": "0x712d24690C388Ed58C1bBf357a13655e0c78B2B7",
    "transactionIndex": 60,
    "gasUsed": "970325",
    "logsBloom": "0x00000000000000000000000008000000000000000000000000800000000000000000040000000000000000000000000000000008000000000000000000000000002000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000001000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0x89b8421cad31ea3c6746b756fc04121d9ede9f062e3cdce14e81893d6e074e47",
    "transactionHash": "0x925ec02ec26fd5b50e6edd32906c16144660d372310c2166bbf05351eb3b73ba",
    "logs": [
      {
        "transactionIndex": 60,
        "blockNumber": 8649101,
        "transactionHash": "0x925ec02ec26fd5b50e6edd32906c16144660d372310c2166bbf05351eb3b73ba",
        "address": "0x712d24690C388Ed58C1bBf357a13655e0c78B2B7",
        "topics": [
          "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0",
          "0x0000000000000000000000000000000000000000000000000000000000000000",
          "0x0000000000000000000000000904dac3347ea47d208f3fd67402d039a3b99859"
        ],
        "data": "0x",
        "logIndex": 103,
        "blockHash": "0x89b8421cad31ea3c6746b756fc04121d9ede9f062e3cdce14e81893d6e074e47"
      }
    ],
    "blockNumber": 8649101,
    "cumulativeGasUsed": "7595089",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e",
    "0x57f1887a8BF19b14fC0dF6Fd9B2acc9Af147eA85"
  ],
  "numDeployments": 2,
  "solcInputHash": "0ba2159dea6e6f2226840e68f6c0a0ff",
  "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"contract ENS\",\"name\":\"_ens\",\"type\":\"address\"},{\"internalType\":\"contract IBaseRegistrar\",\"name\":\"_registrar\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"approvedWrapper\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ens\",\"outputs\":[{\"internalType\":\"contract ENS\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registrar\",\"outputs\":[{\"internalType\":\"contract IBaseRegistrar\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"parentNode\",\"type\":\"bytes32\"},{\"internalType\":\"string\",\"name\":\"label\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"resolver\",\"type\":\"address\"},{\"internalType\":\"uint64\",\"name\":\"ttl\",\"type\":\"uint64\"},{\"internalType\":\"uint32\",\"name\":\"fuses\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"expiry\",\"type\":\"uint64\"}],\"name\":\"setSubnodeRecord\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wrapper\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setWrapperApproval\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"label\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"wrappedOwner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"fuses\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"expiry\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"resolver\",\"type\":\"address\"}],\"name\":\"wrapETH2LD\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"wrappedOwner\",\"type\":\"address\"},{\"internalType\":\"uint32\",\"name\":\"fuses\",\"type\":\"uint32\"},{\"internalType\":\"uint64\",\"name\":\"expiry\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"wrapFromUpgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/wrapper/mocks/TestUnwrap.sol\":\"TestUnwrap\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1500},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n    address private _owner;\\n\\n    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n    /**\\n     * @dev Initializes the contract setting the deployer as the initial owner.\\n     */\\n    constructor() {\\n        _transferOwnership(_msgSender());\\n    }\\n\\n    /**\\n     * @dev Throws if called by any account other than the owner.\\n     */\\n    modifier onlyOwner() {\\n        _checkOwner();\\n        _;\\n    }\\n\\n    /**\\n     * @dev Returns the address of the current owner.\\n     */\\n    function owner() public view virtual returns (address) {\\n        return _owner;\\n    }\\n\\n    /**\\n     * @dev Throws if the sender is not the owner.\\n     */\\n    function _checkOwner() internal view virtual {\\n        require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n    }\\n\\n    /**\\n     * @dev Leaves the contract without owner. It will not be possible to call\\n     * `onlyOwner` functions anymore. Can only be called by the current owner.\\n     *\\n     * NOTE: Renouncing ownership will leave the contract without an owner,\\n     * thereby removing any functionality that is only available to the owner.\\n     */\\n    function renounceOwnership() public virtual onlyOwner {\\n        _transferOwnership(address(0));\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Can only be called by the current owner.\\n     */\\n    function transferOwnership(address newOwner) public virtual onlyOwner {\\n        require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n        _transferOwnership(newOwner);\\n    }\\n\\n    /**\\n     * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n     * Internal function without access restriction.\\n     */\\n    function _transferOwnership(address newOwner) internal virtual {\\n        address oldOwner = _owner;\\n        _owner = newOwner;\\n        emit OwnershipTransferred(oldOwner, newOwner);\\n    }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n    /**\\n     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n     */\\n    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n     */\\n    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n    /**\\n     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n     */\\n    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n    /**\\n     * @dev Returns the number of tokens in ``owner``'s account.\\n     */\\n    function balanceOf(address owner) external view returns (uint256 balance);\\n\\n    /**\\n     * @dev Returns the owner of the `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId,\\n        bytes calldata data\\n    ) external;\\n\\n    /**\\n     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n     * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must exist and be owned by `from`.\\n     * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function safeTransferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) external;\\n\\n    /**\\n     * @dev Transfers `tokenId` token from `from` to `to`.\\n     *\\n     * WARNING: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721\\n     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must\\n     * understand this adds an external call which potentially creates a reentrancy vulnerability.\\n     *\\n     * Requirements:\\n     *\\n     * - `from` cannot be the zero address.\\n     * - `to` cannot be the zero address.\\n     * - `tokenId` token must be owned by `from`.\\n     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n     *\\n     * Emits a {Transfer} event.\\n     */\\n    function transferFrom(\\n        address from,\\n        address to,\\n        uint256 tokenId\\n    ) external;\\n\\n    /**\\n     * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n     * The approval is cleared when the token is transferred.\\n     *\\n     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n     *\\n     * Requirements:\\n     *\\n     * - The caller must own the token or be an approved operator.\\n     * - `tokenId` must exist.\\n     *\\n     * Emits an {Approval} event.\\n     */\\n    function approve(address to, uint256 tokenId) external;\\n\\n    /**\\n     * @dev Approve or remove `operator` as an operator for the caller.\\n     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n     *\\n     * Requirements:\\n     *\\n     * - The `operator` cannot be the caller.\\n     *\\n     * Emits an {ApprovalForAll} event.\\n     */\\n    function setApprovalForAll(address operator, bool _approved) external;\\n\\n    /**\\n     * @dev Returns the account approved for `tokenId` token.\\n     *\\n     * Requirements:\\n     *\\n     * - `tokenId` must exist.\\n     */\\n    function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n    /**\\n     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n     *\\n     * See {setApprovalForAll}\\n     */\\n    function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xab28a56179c1db258c9bf5235b382698cb650debecb51b23d12be9e241374b68\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n    function _msgSender() internal view virtual returns (address) {\\n        return msg.sender;\\n    }\\n\\n    function _msgData() internal view virtual returns (bytes calldata) {\\n        return msg.data;\\n    }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n    /**\\n     * @dev Returns true if this contract implements the interface defined by\\n     * `interfaceId`. See the corresponding\\n     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n     * to learn more about how these ids are created.\\n     *\\n     * This function call must use less than 30 000 gas.\\n     */\\n    function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/ethregistrar/IBaseRegistrar.sol\":{\"content\":\"import \\\"../registry/ENS.sol\\\";\\nimport \\\"./IBaseRegistrar.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/IERC721.sol\\\";\\n\\ninterface IBaseRegistrar is IERC721 {\\n    event ControllerAdded(address indexed controller);\\n    event ControllerRemoved(address indexed controller);\\n    event NameMigrated(\\n        uint256 indexed id,\\n        address indexed owner,\\n        uint256 expires\\n    );\\n    event NameRegistered(\\n        uint256 indexed id,\\n        address indexed owner,\\n        uint256 expires\\n    );\\n    event NameRenewed(uint256 indexed id, uint256 expires);\\n\\n    // Authorises a controller, who can register and renew domains.\\n    function addController(address controller) external;\\n\\n    // Revoke controller permission for an address.\\n    function removeController(address controller) external;\\n\\n    // Set the resolver for the TLD this registrar manages.\\n    function setResolver(address resolver) external;\\n\\n    // Returns the expiration timestamp of the specified label hash.\\n    function nameExpires(uint256 id) external view returns (uint256);\\n\\n    // Returns true iff the specified name is available for registration.\\n    function available(uint256 id) external view returns (bool);\\n\\n    /**\\n     * @dev Register a name.\\n     */\\n    function register(\\n        uint256 id,\\n        address owner,\\n        uint256 duration\\n    ) external returns (uint256);\\n\\n    function renew(uint256 id, uint256 duration) external returns (uint256);\\n\\n    /**\\n     * @dev Reclaim ownership of a name in ENS, if you own it in the registrar.\\n     */\\n    function reclaim(uint256 id, address owner) external;\\n}\\n\",\"keccak256\":\"0x9ac51351ff72d73083aed62b7cdad4c07e9d1eb68401d7fd8457bdd828f2c6fe\"},\"contracts/registry/ENS.sol\":{\"content\":\"pragma solidity >=0.8.4;\\n\\ninterface ENS {\\n    // Logged when the owner of a node assigns a new owner to a subnode.\\n    event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\\n\\n    // Logged when the owner of a node transfers ownership to a new account.\\n    event Transfer(bytes32 indexed node, address owner);\\n\\n    // Logged when the resolver for a node changes.\\n    event NewResolver(bytes32 indexed node, address resolver);\\n\\n    // Logged when the TTL of a node changes\\n    event NewTTL(bytes32 indexed node, uint64 ttl);\\n\\n    // Logged when an operator is added or removed.\\n    event ApprovalForAll(\\n        address indexed owner,\\n        address indexed operator,\\n        bool approved\\n    );\\n\\n    function setRecord(\\n        bytes32 node,\\n        address owner,\\n        address resolver,\\n        uint64 ttl\\n    ) external;\\n\\n    function setSubnodeRecord(\\n        bytes32 node,\\n        bytes32 label,\\n        address owner,\\n        address resolver,\\n        uint64 ttl\\n    ) external;\\n\\n    function setSubnodeOwner(\\n        bytes32 node,\\n        bytes32 label,\\n        address owner\\n    ) external returns (bytes32);\\n\\n    function setResolver(bytes32 node, address resolver) external;\\n\\n    function setOwner(bytes32 node, address owner) external;\\n\\n    function setTTL(bytes32 node, uint64 ttl) external;\\n\\n    function setApprovalForAll(address operator, bool approved) external;\\n\\n    function owner(bytes32 node) external view returns (address);\\n\\n    function resolver(bytes32 node) external view returns (address);\\n\\n    function ttl(bytes32 node) external view returns (uint64);\\n\\n    function recordExists(bytes32 node) external view returns (bool);\\n\\n    function isApprovedForAll(\\n        address owner,\\n        address operator\\n    ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7cb1158c7d268b63de1468e28e2711b28d686e2628ddb22da2149cd93ddeafda\"},\"contracts/wrapper/BytesUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ~0.8.17;\\n\\nlibrary BytesUtils {\\n    /*\\n     * @dev Returns the keccak-256 hash of a byte range.\\n     * @param self The byte string to hash.\\n     * @param offset The position to start hashing at.\\n     * @param len The number of bytes to hash.\\n     * @return The hash of the byte range.\\n     */\\n    function keccak(\\n        bytes memory self,\\n        uint256 offset,\\n        uint256 len\\n    ) internal pure returns (bytes32 ret) {\\n        require(offset + len <= self.length);\\n        assembly {\\n            ret := keccak256(add(add(self, 32), offset), len)\\n        }\\n    }\\n\\n    /**\\n     * @dev Returns the ENS namehash of a DNS-encoded name.\\n     * @param self The DNS-encoded name to hash.\\n     * @param offset The offset at which to start hashing.\\n     * @return The namehash of the name.\\n     */\\n    function namehash(\\n        bytes memory self,\\n        uint256 offset\\n    ) internal pure returns (bytes32) {\\n        (bytes32 labelhash, uint256 newOffset) = readLabel(self, offset);\\n        if (labelhash == bytes32(0)) {\\n            require(offset == self.length - 1, \\\"namehash: Junk at end of name\\\");\\n            return bytes32(0);\\n        }\\n        return\\n            keccak256(abi.encodePacked(namehash(self, newOffset), labelhash));\\n    }\\n\\n    /**\\n     * @dev Returns the keccak-256 hash of a DNS-encoded label, and the offset to the start of the next label.\\n     * @param self The byte string to read a label from.\\n     * @param idx The index to read a label at.\\n     * @return labelhash The hash of the label at the specified index, or 0 if it is the last label.\\n     * @return newIdx The index of the start of the next label.\\n     */\\n    function readLabel(\\n        bytes memory self,\\n        uint256 idx\\n    ) internal pure returns (bytes32 labelhash, uint256 newIdx) {\\n        require(idx < self.length, \\\"readLabel: Index out of bounds\\\");\\n        uint256 len = uint256(uint8(self[idx]));\\n        if (len > 0) {\\n            labelhash = keccak(self, idx + 1, len);\\n        } else {\\n            labelhash = bytes32(0);\\n        }\\n        newIdx = idx + len + 1;\\n    }\\n}\\n\",\"keccak256\":\"0xf862cd86d749158a554e3cb517efa9097331ec0cf7225117f21e96fb50c67edb\",\"license\":\"MIT\"},\"contracts/wrapper/mocks/TestUnwrap.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\nimport \\\"../../registry/ENS.sol\\\";\\nimport \\\"../../ethregistrar/IBaseRegistrar.sol\\\";\\nimport {Ownable} from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport {BytesUtils} from \\\"../BytesUtils.sol\\\";\\n\\ncontract TestUnwrap is Ownable {\\n    using BytesUtils for bytes;\\n\\n    bytes32 private constant ETH_NODE =\\n        0x93cdeb708b7545dc668eb9280176169d1c33cfd8ed6f04690a0bcc88a93fc4ae;\\n\\n    ENS public immutable ens;\\n    IBaseRegistrar public immutable registrar;\\n    mapping(address => bool) public approvedWrapper;\\n\\n    constructor(ENS _ens, IBaseRegistrar _registrar) {\\n        ens = _ens;\\n        registrar = _registrar;\\n    }\\n\\n    function setWrapperApproval(\\n        address wrapper,\\n        bool approved\\n    ) public onlyOwner {\\n        approvedWrapper[wrapper] = approved;\\n    }\\n\\n    function wrapETH2LD(\\n        string calldata label,\\n        address wrappedOwner,\\n        uint32 fuses,\\n        uint64 expiry,\\n        address resolver\\n    ) public {\\n        _unwrapETH2LD(keccak256(bytes(label)), wrappedOwner, msg.sender);\\n    }\\n\\n    function setSubnodeRecord(\\n        bytes32 parentNode,\\n        string memory label,\\n        address newOwner,\\n        address resolver,\\n        uint64 ttl,\\n        uint32 fuses,\\n        uint64 expiry\\n    ) public {\\n        bytes32 node = _makeNode(parentNode, keccak256(bytes(label)));\\n        _unwrapSubnode(node, newOwner, msg.sender);\\n    }\\n\\n    function wrapFromUpgrade(\\n        bytes calldata name,\\n        address wrappedOwner,\\n        uint32 fuses,\\n        uint64 expiry,\\n        address approved,\\n        bytes calldata extraData\\n    ) public {\\n        (bytes32 labelhash, uint256 offset) = name.readLabel(0);\\n        bytes32 parentNode = name.namehash(offset);\\n        bytes32 node = _makeNode(parentNode, labelhash);\\n\\n        if (parentNode == ETH_NODE) {\\n            _unwrapETH2LD(labelhash, wrappedOwner, msg.sender);\\n        } else {\\n            _unwrapSubnode(node, wrappedOwner, msg.sender);\\n        }\\n    }\\n\\n    function _unwrapETH2LD(\\n        bytes32 labelhash,\\n        address wrappedOwner,\\n        address sender\\n    ) private {\\n        uint256 tokenId = uint256(labelhash);\\n        address registrant = registrar.ownerOf(tokenId);\\n\\n        require(\\n            approvedWrapper[sender] &&\\n                sender == registrant &&\\n                registrar.isApprovedForAll(registrant, address(this)),\\n            \\\"Unauthorised\\\"\\n        );\\n\\n        registrar.reclaim(tokenId, wrappedOwner);\\n        registrar.transferFrom(registrant, wrappedOwner, tokenId);\\n    }\\n\\n    function _unwrapSubnode(\\n        bytes32 node,\\n        address newOwner,\\n        address sender\\n    ) private {\\n        address owner = ens.owner(node);\\n\\n        require(\\n            approvedWrapper[sender] &&\\n                owner == sender &&\\n                ens.isApprovedForAll(owner, address(this)),\\n            \\\"Unauthorised\\\"\\n        );\\n\\n        ens.setOwner(node, newOwner);\\n    }\\n\\n    function _makeNode(\\n        bytes32 node,\\n        bytes32 labelhash\\n    ) private pure returns (bytes32) {\\n        return keccak256(abi.encodePacked(node, labelhash));\\n    }\\n}\\n\",\"keccak256\":\"0x738180fe6f0caae045c82df1d5a7088d07ebbf299c5c8b402a3cf04079980014\",\"license\":\"MIT\"}},\"version\":1}",
  "bytecode": "0x60c060405234801561001057600080fd5b5060405161117238038061117283398101604081905261002f916100b7565b6100383361004f565b6001600160a01b039182166080521660a0526100f1565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6001600160a01b03811681146100b457600080fd5b50565b600080604083850312156100ca57600080fd5b82516100d58161009f565b60208401519092506100e68161009f565b809150509250929050565b60805160a05161102c6101466000396000818160f0015281816108f1015281816109cc01528181610ac20152610b63015260008181610134015281816104b6015281816105910152610687015261102c6000f3fe608060405234801561001057600080fd5b50600436106100be5760003560e01c80638da5cb5b11610076578063c6d6d7c11161005b578063c6d6d7c114610182578063f2fde38b146101b5578063f9547a9e146101c857600080fd5b80638da5cb5b1461015e5780639198c2761461016f57600080fd5b80632b20e397116100a75780632b20e397146100eb5780633f15457f1461012f578063715018a61461015657600080fd5b80630cc17365146100c357806324c1af44146100d8575b600080fd5b6100d66100d1366004610c1f565b6101db565b005b6100d66100e6366004610c9a565b61020e565b6101127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6101127f000000000000000000000000000000000000000000000000000000000000000081565b6100d6610238565b6000546001600160a01b0316610112565b6100d661017d366004610df1565b61024c565b6101a5610190366004610eac565b60016020526000908152604090205460ff1681565b6040519015158152602001610126565b6100d66101c3366004610eac565b61033c565b6100d66101d6366004610ed0565b6103d1565b6101e36103fb565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6000610221888880519060200120610455565b905061022e818733610484565b5050505050505050565b6102406103fb565b61024a60006106df565b565b60008061029360008b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506107479050565b9150915060006102dc828c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506107fe9050565b905060006102ea8285610455565b90507f6c32148f748aba23997146d7fe89e962e3cc30271290fb96f5f4337756c03b5282016103235761031e848b336108bd565b61032e565b61032e818b33610484565b505050505050505050505050565b6103446103fb565b6001600160a01b0381166103c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103ce816106df565b50565b6103f386866040516103e4929190610f5a565b604051809103902085336108bd565b505050505050565b6000546001600160a01b0316331461024a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103bc565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b6040517f02571be3000000000000000000000000000000000000000000000000000000008152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906302571be390602401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190610f6a565b6001600160a01b03831660009081526001602052604090205490915060ff1680156105655750816001600160a01b0316816001600160a01b0316145b80156105fc575060405163e985e9c560e01b81526001600160a01b0382811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063e985e9c590604401602060405180830381865afa1580156105d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fc9190610f87565b6106485760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f7269736564000000000000000000000000000000000000000060448201526064016103bc565b6040517f5b0fc9c3000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b0384811660248301527f00000000000000000000000000000000000000000000000000000000000000001690635b0fc9c390604401600060405180830381600087803b1580156106cb57600080fd5b505af115801561022e573d6000803e3d6000fd5b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808351831061079a5760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e6473000060448201526064016103bc565b60008484815181106107ae576107ae610fa4565b016020015160f81c905080156107da576107d3856107cd866001610fd0565b83610bc8565b92506107df565b600092505b6107e98185610fd0565b6107f4906001610fd0565b9150509250929050565b600080600061080d8585610747565b90925090508161087f57600185516108259190610fe3565b84146108735760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d6500000060448201526064016103bc565b506000915061047e9050565b61088985826107fe565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905283906000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015610940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109649190610f6a565b6001600160a01b03841660009081526001602052604090205490915060ff1680156109a05750806001600160a01b0316836001600160a01b0316145b8015610a37575060405163e985e9c560e01b81526001600160a01b0382811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063e985e9c590604401602060405180830381865afa158015610a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a379190610f87565b610a835760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f7269736564000000000000000000000000000000000000000060448201526064016103bc565b6040517f28ed4f6c000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0385811660248301527f000000000000000000000000000000000000000000000000000000000000000016906328ed4f6c90604401600060405180830381600087803b158015610b0657600080fd5b505af1158015610b1a573d6000803e3d6000fd5b50506040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528781166024830152604482018690527f00000000000000000000000000000000000000000000000000000000000000001692506323b872dd9150606401600060405180830381600087803b158015610ba957600080fd5b505af1158015610bbd573d6000803e3d6000fd5b505050505050505050565b8251600090610bd78385610fd0565b1115610be257600080fd5b5091016020012090565b6001600160a01b03811681146103ce57600080fd5b8035610c0c81610bec565b919050565b80151581146103ce57600080fd5b60008060408385031215610c3257600080fd5b8235610c3d81610bec565b91506020830135610c4d81610c11565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b803567ffffffffffffffff81168114610c0c57600080fd5b803563ffffffff81168114610c0c57600080fd5b600080600080600080600060e0888a031215610cb557600080fd5b87359650602088013567ffffffffffffffff80821115610cd457600080fd5b818a0191508a601f830112610ce857600080fd5b813581811115610cfa57610cfa610c58565b604051601f8201601f19908116603f01168101908382118183101715610d2257610d22610c58565b816040528281528d6020848701011115610d3b57600080fd5b82602086016020830137600060208483010152809a505050505050610d6260408901610c01565b9450610d7060608901610c01565b9350610d7e60808901610c6e565b9250610d8c60a08901610c86565b9150610d9a60c08901610c6e565b905092959891949750929550565b60008083601f840112610dba57600080fd5b50813567ffffffffffffffff811115610dd257600080fd5b602083019150836020828501011115610dea57600080fd5b9250929050565b60008060008060008060008060c0898b031215610e0d57600080fd5b883567ffffffffffffffff80821115610e2557600080fd5b610e318c838d01610da8565b909a50985060208b01359150610e4682610bec565b819750610e5560408c01610c86565b9650610e6360608c01610c6e565b955060808b01359150610e7582610bec565b90935060a08a01359080821115610e8b57600080fd5b50610e988b828c01610da8565b999c989b5096995094979396929594505050565b600060208284031215610ebe57600080fd5b8135610ec981610bec565b9392505050565b60008060008060008060a08789031215610ee957600080fd5b863567ffffffffffffffff811115610f0057600080fd5b610f0c89828a01610da8565b9097509550506020870135610f2081610bec565b9350610f2e60408801610c86565b9250610f3c60608801610c6e565b91506080870135610f4c81610bec565b809150509295509295509295565b8183823760009101908152919050565b600060208284031215610f7c57600080fd5b8151610ec981610bec565b600060208284031215610f9957600080fd5b8151610ec981610c11565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561047e5761047e610fba565b8181038181111561047e5761047e610fba56fea2646970667358221220091760b08f6fd7b1a6510263275455e4c37e69dde602a74b3597f4163ac96cb564736f6c63430008110033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100be5760003560e01c80638da5cb5b11610076578063c6d6d7c11161005b578063c6d6d7c114610182578063f2fde38b146101b5578063f9547a9e146101c857600080fd5b80638da5cb5b1461015e5780639198c2761461016f57600080fd5b80632b20e397116100a75780632b20e397146100eb5780633f15457f1461012f578063715018a61461015657600080fd5b80630cc17365146100c357806324c1af44146100d8575b600080fd5b6100d66100d1366004610c1f565b6101db565b005b6100d66100e6366004610c9a565b61020e565b6101127f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020015b60405180910390f35b6101127f000000000000000000000000000000000000000000000000000000000000000081565b6100d6610238565b6000546001600160a01b0316610112565b6100d661017d366004610df1565b61024c565b6101a5610190366004610eac565b60016020526000908152604090205460ff1681565b6040519015158152602001610126565b6100d66101c3366004610eac565b61033c565b6100d66101d6366004610ed0565b6103d1565b6101e36103fb565b6001600160a01b03919091166000908152600160205260409020805460ff1916911515919091179055565b6000610221888880519060200120610455565b905061022e818733610484565b5050505050505050565b6102406103fb565b61024a60006106df565b565b60008061029360008b8b8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506107479050565b9150915060006102dc828c8c8080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506107fe9050565b905060006102ea8285610455565b90507f6c32148f748aba23997146d7fe89e962e3cc30271290fb96f5f4337756c03b5282016103235761031e848b336108bd565b61032e565b61032e818b33610484565b505050505050505050505050565b6103446103fb565b6001600160a01b0381166103c55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b6103ce816106df565b50565b6103f386866040516103e4929190610f5a565b604051809103902085336108bd565b505050505050565b6000546001600160a01b0316331461024a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016103bc565b604080516020808201859052818301849052825180830384018152606090920190925280519101205b92915050565b6040517f02571be3000000000000000000000000000000000000000000000000000000008152600481018490526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906302571be390602401602060405180830381865afa158015610505573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105299190610f6a565b6001600160a01b03831660009081526001602052604090205490915060ff1680156105655750816001600160a01b0316816001600160a01b0316145b80156105fc575060405163e985e9c560e01b81526001600160a01b0382811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063e985e9c590604401602060405180830381865afa1580156105d8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906105fc9190610f87565b6106485760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f7269736564000000000000000000000000000000000000000060448201526064016103bc565b6040517f5b0fc9c3000000000000000000000000000000000000000000000000000000008152600481018590526001600160a01b0384811660248301527f00000000000000000000000000000000000000000000000000000000000000001690635b0fc9c390604401600060405180830381600087803b1580156106cb57600080fd5b505af115801561022e573d6000803e3d6000fd5b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000808351831061079a5760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e6473000060448201526064016103bc565b60008484815181106107ae576107ae610fa4565b016020015160f81c905080156107da576107d3856107cd866001610fd0565b83610bc8565b92506107df565b600092505b6107e98185610fd0565b6107f4906001610fd0565b9150509250929050565b600080600061080d8585610747565b90925090508161087f57600185516108259190610fe3565b84146108735760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d6500000060448201526064016103bc565b506000915061047e9050565b61088985826107fe565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6040517f6352211e0000000000000000000000000000000000000000000000000000000081526004810184905283906000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690636352211e90602401602060405180830381865afa158015610940573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109649190610f6a565b6001600160a01b03841660009081526001602052604090205490915060ff1680156109a05750806001600160a01b0316836001600160a01b0316145b8015610a37575060405163e985e9c560e01b81526001600160a01b0382811660048301523060248301527f0000000000000000000000000000000000000000000000000000000000000000169063e985e9c590604401602060405180830381865afa158015610a13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a379190610f87565b610a835760405162461bcd60e51b815260206004820152600c60248201527f556e617574686f7269736564000000000000000000000000000000000000000060448201526064016103bc565b6040517f28ed4f6c000000000000000000000000000000000000000000000000000000008152600481018390526001600160a01b0385811660248301527f000000000000000000000000000000000000000000000000000000000000000016906328ed4f6c90604401600060405180830381600087803b158015610b0657600080fd5b505af1158015610b1a573d6000803e3d6000fd5b50506040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301528781166024830152604482018690527f00000000000000000000000000000000000000000000000000000000000000001692506323b872dd9150606401600060405180830381600087803b158015610ba957600080fd5b505af1158015610bbd573d6000803e3d6000fd5b505050505050505050565b8251600090610bd78385610fd0565b1115610be257600080fd5b5091016020012090565b6001600160a01b03811681146103ce57600080fd5b8035610c0c81610bec565b919050565b80151581146103ce57600080fd5b60008060408385031215610c3257600080fd5b8235610c3d81610bec565b91506020830135610c4d81610c11565b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b803567ffffffffffffffff81168114610c0c57600080fd5b803563ffffffff81168114610c0c57600080fd5b600080600080600080600060e0888a031215610cb557600080fd5b87359650602088013567ffffffffffffffff80821115610cd457600080fd5b818a0191508a601f830112610ce857600080fd5b813581811115610cfa57610cfa610c58565b604051601f8201601f19908116603f01168101908382118183101715610d2257610d22610c58565b816040528281528d6020848701011115610d3b57600080fd5b82602086016020830137600060208483010152809a505050505050610d6260408901610c01565b9450610d7060608901610c01565b9350610d7e60808901610c6e565b9250610d8c60a08901610c86565b9150610d9a60c08901610c6e565b905092959891949750929550565b60008083601f840112610dba57600080fd5b50813567ffffffffffffffff811115610dd257600080fd5b602083019150836020828501011115610dea57600080fd5b9250929050565b60008060008060008060008060c0898b031215610e0d57600080fd5b883567ffffffffffffffff80821115610e2557600080fd5b610e318c838d01610da8565b909a50985060208b01359150610e4682610bec565b819750610e5560408c01610c86565b9650610e6360608c01610c6e565b955060808b01359150610e7582610bec565b90935060a08a01359080821115610e8b57600080fd5b50610e988b828c01610da8565b999c989b5096995094979396929594505050565b600060208284031215610ebe57600080fd5b8135610ec981610bec565b9392505050565b60008060008060008060a08789031215610ee957600080fd5b863567ffffffffffffffff811115610f0057600080fd5b610f0c89828a01610da8565b9097509550506020870135610f2081610bec565b9350610f2e60408801610c86565b9250610f3c60608801610c6e565b91506080870135610f4c81610bec565b809150509295509295509295565b8183823760009101908152919050565b600060208284031215610f7c57600080fd5b8151610ec981610bec565b600060208284031215610f9957600080fd5b8151610ec981610c11565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b8082018082111561047e5761047e610fba565b8181038181111561047e5761047e610fba56fea2646970667358221220091760b08f6fd7b1a6510263275455e4c37e69dde602a74b3597f4163ac96cb564736f6c63430008110033",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 428,
        "contract": "contracts/wrapper/mocks/TestUnwrap.sol:TestUnwrap",
        "label": "_owner",
        "offset": 0,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 17807,
        "contract": "contracts/wrapper/mocks/TestUnwrap.sol:TestUnwrap",
        "label": "approvedWrapper",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_address,t_bool)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      }
    }
  }
}