{
  "contractName": "CloneFactory",
  "abi": [],
  "metadata": "{\"compiler\":{\"version\":\"0.5.17+commit.d19bba13\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"methods\":{}},\"userdoc\":{\"methods\":{}}},\"settings\":{\"compilationTarget\":{\"/home/runner/work/tbtc/tbtc/solidity/contracts/proxy/CloneFactory.sol\":\"CloneFactory\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"/home/runner/work/tbtc/tbtc/solidity/contracts/proxy/CloneFactory.sol\":{\"keccak256\":\"0xdd6c92a00393f04b98d8749fe5e4235cfc2967d1486698a1b37db3dc6848f2f6\",\"urls\":[\"bzz-raw://ec57ffe219b198a4e494f950958e19455849e68a37d94545ddfdebb136ac17e4\",\"dweb:/ipfs/QmTcYbxJFdzdp75pcoTu83XdK1acK8rtWZNZEZz2E9HauH\"]}},\"version\":1}",
  "bytecode": "0x6080604052348015600f57600080fd5b50603e80601d6000396000f3fe6080604052600080fdfea265627a7a72315820ec7b789e20ebe90f9005477914cc880235d8c0aa12af9661fcec4dad8ecea67a64736f6c63430005110032",
  "deployedBytecode": "0x6080604052600080fdfea265627a7a72315820ec7b789e20ebe90f9005477914cc880235d8c0aa12af9661fcec4dad8ecea67a64736f6c63430005110032",
  "sourceMap": "1432:1431:14:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;1432:1431:14;;;;;;;",
  "deployedSourceMap": "1432:1431:14:-;;;;;",
  "source": "pragma solidity 0.5.17;\n\n/*\nThe MIT License (MIT)\n\nCopyright (c) 2018 Murray Software, LLC.\n\nPermission is hereby granted, free of charge, to any person obtaining\na copy of this software and associated documentation files (the\n\"Software\"), to deal in the Software without restriction, including\nwithout limitation the rights to use, copy, modify, merge, publish,\ndistribute, sublicense, and/or sell copies of the Software, and to\npermit persons to whom the Software is furnished to do so, subject to\nthe following conditions:\n\nThe above copyright notice and this permission notice shall be included\nin all copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\nOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\nMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.\nIN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY\nCLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,\nTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE\nSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n*/\n//solhint-disable max-line-length\n\n// Implementation of [EIP-1167] based on [clone-factory]\n// source code.\n//\n// EIP 1167: https://eips.ethereum.org/EIPS/eip-1167\n// clone-factory: https://github.com/optionality/clone-factory\n// Modified to use ^0.5.10; instead of ^0.4.23 solidity version\n/* solium-disable */\n\ncontract CloneFactory {\n    function createClone(address target) internal returns (address result) {\n        bytes20 targetBytes = bytes20(target);\n        assembly {\n            let clone := mload(0x40)\n            mstore(\n                clone,\n                0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000\n            )\n            mstore(add(clone, 0x14), targetBytes)\n            mstore(\n                add(clone, 0x28),\n                0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000\n            )\n            result := create(0, clone, 0x37)\n        }\n    }\n\n    function isClone(address target, address query)\n        internal\n        view\n        returns (bool result)\n    {\n        bytes20 targetBytes = bytes20(target);\n        assembly {\n            let clone := mload(0x40)\n            mstore(\n                clone,\n                0x363d3d373d3d3d363d7300000000000000000000000000000000000000000000\n            )\n            mstore(add(clone, 0xa), targetBytes)\n            mstore(\n                add(clone, 0x1e),\n                0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000\n            )\n\n            let other := add(clone, 0x40)\n            extcodecopy(query, other, 0, 0x2d)\n            result := and(\n                eq(mload(clone), mload(other)),\n                eq(mload(add(clone, 0xd)), mload(add(other, 0xd)))\n            )\n        }\n    }\n}\n",
  "sourcePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/proxy/CloneFactory.sol",
  "ast": {
    "absolutePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/proxy/CloneFactory.sol",
    "exportedSymbols": {
      "CloneFactory": [
        5763
      ]
    },
    "id": 5764,
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 5730,
        "literals": [
          "solidity",
          "0.5",
          ".17"
        ],
        "nodeType": "PragmaDirective",
        "src": "0:23:14"
      },
      {
        "baseContracts": [],
        "contractDependencies": [],
        "contractKind": "contract",
        "documentation": null,
        "fullyImplemented": true,
        "id": 5763,
        "linearizedBaseContracts": [
          5763
        ],
        "name": "CloneFactory",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "body": {
              "id": 5744,
              "nodeType": "Block",
              "src": "1531:506:14",
              "statements": [
                {
                  "assignments": [
                    5738
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5738,
                      "name": "targetBytes",
                      "nodeType": "VariableDeclaration",
                      "scope": 5744,
                      "src": "1541:19:14",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes20",
                        "typeString": "bytes20"
                      },
                      "typeName": {
                        "id": 5737,
                        "name": "bytes20",
                        "nodeType": "ElementaryTypeName",
                        "src": "1541:7:14",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes20",
                          "typeString": "bytes20"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5742,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5740,
                        "name": "target",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5732,
                        "src": "1571:6:14",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5739,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "1563:7:14",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_bytes20_$",
                        "typeString": "type(bytes20)"
                      },
                      "typeName": "bytes20"
                    },
                    "id": 5741,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1563:15:14",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes20",
                      "typeString": "bytes20"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1541:37:14"
                },
                {
                  "externalReferences": [
                    {
                      "result": {
                        "declaration": 5735,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1989:6:14",
                        "valueSize": 1
                      }
                    },
                    {
                      "targetBytes": {
                        "declaration": 5738,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "1813:11:14",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 5743,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let clone := mload(0x40)\n    mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\n    mstore(add(clone, 0x14), targetBytes)\n    mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n    result := create(0, clone, 0x37)\n}",
                  "src": "1588:443:14"
                }
              ]
            },
            "documentation": null,
            "id": 5745,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "createClone",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5733,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5732,
                  "name": "target",
                  "nodeType": "VariableDeclaration",
                  "scope": 5745,
                  "src": "1481:14:14",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5731,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1481:7:14",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1480:16:14"
            },
            "returnParameters": {
              "id": 5736,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5735,
                  "name": "result",
                  "nodeType": "VariableDeclaration",
                  "scope": 5745,
                  "src": "1515:14:14",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5734,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1515:7:14",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "1514:16:14"
            },
            "scope": 5763,
            "src": "1460:577:14",
            "stateMutability": "nonpayable",
            "superFunction": null,
            "visibility": "internal"
          },
          {
            "body": {
              "id": 5761,
              "nodeType": "Block",
              "src": "2155:706:14",
              "statements": [
                {
                  "assignments": [
                    5755
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 5755,
                      "name": "targetBytes",
                      "nodeType": "VariableDeclaration",
                      "scope": 5761,
                      "src": "2165:19:14",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bytes20",
                        "typeString": "bytes20"
                      },
                      "typeName": {
                        "id": 5754,
                        "name": "bytes20",
                        "nodeType": "ElementaryTypeName",
                        "src": "2165:7:14",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes20",
                          "typeString": "bytes20"
                        }
                      },
                      "value": null,
                      "visibility": "internal"
                    }
                  ],
                  "id": 5759,
                  "initialValue": {
                    "argumentTypes": null,
                    "arguments": [
                      {
                        "argumentTypes": null,
                        "id": 5757,
                        "name": "target",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 5747,
                        "src": "2195:6:14",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 5756,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": true,
                      "lValueRequested": false,
                      "nodeType": "ElementaryTypeNameExpression",
                      "src": "2187:7:14",
                      "typeDescriptions": {
                        "typeIdentifier": "t_type$_t_bytes20_$",
                        "typeString": "type(bytes20)"
                      },
                      "typeName": "bytes20"
                    },
                    "id": 5758,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "typeConversion",
                    "lValueRequested": false,
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2187:15:14",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bytes20",
                      "typeString": "bytes20"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2165:37:14"
                },
                {
                  "externalReferences": [
                    {
                      "targetBytes": {
                        "declaration": 5755,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2436:11:14",
                        "valueSize": 1
                      }
                    },
                    {
                      "query": {
                        "declaration": 5749,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2667:5:14",
                        "valueSize": 1
                      }
                    },
                    {
                      "result": {
                        "declaration": 5752,
                        "isOffset": false,
                        "isSlot": false,
                        "src": "2702:6:14",
                        "valueSize": 1
                      }
                    }
                  ],
                  "id": 5760,
                  "nodeType": "InlineAssembly",
                  "operations": "{\n    let clone := mload(0x40)\n    mstore(clone, 0x363d3d373d3d3d363d7300000000000000000000000000000000000000000000)\n    mstore(add(clone, 0xa), targetBytes)\n    mstore(add(clone, 0x1e), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n    let other := add(clone, 0x40)\n    extcodecopy(query, other, 0, 0x2d)\n    result := and(eq(mload(clone), mload(other)), eq(mload(add(clone, 0xd)), mload(add(other, 0xd))))\n}",
                  "src": "2212:643:14"
                }
              ]
            },
            "documentation": null,
            "id": 5762,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "isClone",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 5750,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5747,
                  "name": "target",
                  "nodeType": "VariableDeclaration",
                  "scope": 5762,
                  "src": "2060:14:14",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5746,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2060:7:14",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 5749,
                  "name": "query",
                  "nodeType": "VariableDeclaration",
                  "scope": 5762,
                  "src": "2076:13:14",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 5748,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "2076:7:14",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2059:31:14"
            },
            "returnParameters": {
              "id": 5753,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 5752,
                  "name": "result",
                  "nodeType": "VariableDeclaration",
                  "scope": 5762,
                  "src": "2138:11:14",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_bool",
                    "typeString": "bool"
                  },
                  "typeName": {
                    "id": 5751,
                    "name": "bool",
                    "nodeType": "ElementaryTypeName",
                    "src": "2138:4:14",
                    "typeDescriptions": {
                      "typeIdentifier": "t_bool",
                      "typeString": "bool"
                    }
                  },
                  "value": null,
                  "visibility": "internal"
                }
              ],
              "src": "2137:13:14"
            },
            "scope": 5763,
            "src": "2043:818:14",
            "stateMutability": "view",
            "superFunction": null,
            "visibility": "internal"
          }
        ],
        "scope": 5764,
        "src": "1432:1431:14"
      }
    ],
    "src": "0:2864:14"
  },
  "legacyAST": {
    "attributes": {
      "absolutePath": "/home/runner/work/tbtc/tbtc/solidity/contracts/proxy/CloneFactory.sol",
      "exportedSymbols": {
        "CloneFactory": [
          5763
        ]
      }
    },
    "children": [
      {
        "attributes": {
          "literals": [
            "solidity",
            "0.5",
            ".17"
          ]
        },
        "id": 5730,
        "name": "PragmaDirective",
        "src": "0:23:14"
      },
      {
        "attributes": {
          "baseContracts": [
            null
          ],
          "contractDependencies": [
            null
          ],
          "contractKind": "contract",
          "documentation": null,
          "fullyImplemented": true,
          "linearizedBaseContracts": [
            5763
          ],
          "name": "CloneFactory",
          "scope": 5764
        },
        "children": [
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "createClone",
              "scope": 5763,
              "stateMutability": "nonpayable",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "target",
                      "scope": 5745,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 5731,
                        "name": "ElementaryTypeName",
                        "src": "1481:7:14"
                      }
                    ],
                    "id": 5732,
                    "name": "VariableDeclaration",
                    "src": "1481:14:14"
                  }
                ],
                "id": 5733,
                "name": "ParameterList",
                "src": "1480:16:14"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "result",
                      "scope": 5745,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 5734,
                        "name": "ElementaryTypeName",
                        "src": "1515:7:14"
                      }
                    ],
                    "id": 5735,
                    "name": "VariableDeclaration",
                    "src": "1515:14:14"
                  }
                ],
                "id": 5736,
                "name": "ParameterList",
                "src": "1514:16:14"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "assignments": [
                        5738
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "targetBytes",
                          "scope": 5744,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "bytes20",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "bytes20",
                              "type": "bytes20"
                            },
                            "id": 5737,
                            "name": "ElementaryTypeName",
                            "src": "1541:7:14"
                          }
                        ],
                        "id": 5738,
                        "name": "VariableDeclaration",
                        "src": "1541:19:14"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "bytes20",
                          "type_conversion": true
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "type": "type(bytes20)",
                              "value": "bytes20"
                            },
                            "id": 5739,
                            "name": "ElementaryTypeNameExpression",
                            "src": "1563:7:14"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 5732,
                              "type": "address",
                              "value": "target"
                            },
                            "id": 5740,
                            "name": "Identifier",
                            "src": "1571:6:14"
                          }
                        ],
                        "id": 5741,
                        "name": "FunctionCall",
                        "src": "1563:15:14"
                      }
                    ],
                    "id": 5742,
                    "name": "VariableDeclarationStatement",
                    "src": "1541:37:14"
                  },
                  {
                    "attributes": {
                      "externalReferences": [
                        {
                          "result": {
                            "declaration": 5735,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1989:6:14",
                            "valueSize": 1
                          }
                        },
                        {
                          "targetBytes": {
                            "declaration": 5738,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "1813:11:14",
                            "valueSize": 1
                          }
                        }
                      ],
                      "operations": "{\n    let clone := mload(0x40)\n    mstore(clone, 0x3d602d80600a3d3981f3363d3d373d3d3d363d73000000000000000000000000)\n    mstore(add(clone, 0x14), targetBytes)\n    mstore(add(clone, 0x28), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n    result := create(0, clone, 0x37)\n}"
                    },
                    "children": [],
                    "id": 5743,
                    "name": "InlineAssembly",
                    "src": "1588:443:14"
                  }
                ],
                "id": 5744,
                "name": "Block",
                "src": "1531:506:14"
              }
            ],
            "id": 5745,
            "name": "FunctionDefinition",
            "src": "1460:577:14"
          },
          {
            "attributes": {
              "documentation": null,
              "implemented": true,
              "isConstructor": false,
              "kind": "function",
              "modifiers": [
                null
              ],
              "name": "isClone",
              "scope": 5763,
              "stateMutability": "view",
              "superFunction": null,
              "visibility": "internal"
            },
            "children": [
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "target",
                      "scope": 5762,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 5746,
                        "name": "ElementaryTypeName",
                        "src": "2060:7:14"
                      }
                    ],
                    "id": 5747,
                    "name": "VariableDeclaration",
                    "src": "2060:14:14"
                  },
                  {
                    "attributes": {
                      "constant": false,
                      "name": "query",
                      "scope": 5762,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "address",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "address",
                          "stateMutability": "nonpayable",
                          "type": "address"
                        },
                        "id": 5748,
                        "name": "ElementaryTypeName",
                        "src": "2076:7:14"
                      }
                    ],
                    "id": 5749,
                    "name": "VariableDeclaration",
                    "src": "2076:13:14"
                  }
                ],
                "id": 5750,
                "name": "ParameterList",
                "src": "2059:31:14"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "constant": false,
                      "name": "result",
                      "scope": 5762,
                      "stateVariable": false,
                      "storageLocation": "default",
                      "type": "bool",
                      "value": null,
                      "visibility": "internal"
                    },
                    "children": [
                      {
                        "attributes": {
                          "name": "bool",
                          "type": "bool"
                        },
                        "id": 5751,
                        "name": "ElementaryTypeName",
                        "src": "2138:4:14"
                      }
                    ],
                    "id": 5752,
                    "name": "VariableDeclaration",
                    "src": "2138:11:14"
                  }
                ],
                "id": 5753,
                "name": "ParameterList",
                "src": "2137:13:14"
              },
              {
                "children": [
                  {
                    "attributes": {
                      "assignments": [
                        5755
                      ]
                    },
                    "children": [
                      {
                        "attributes": {
                          "constant": false,
                          "name": "targetBytes",
                          "scope": 5761,
                          "stateVariable": false,
                          "storageLocation": "default",
                          "type": "bytes20",
                          "value": null,
                          "visibility": "internal"
                        },
                        "children": [
                          {
                            "attributes": {
                              "name": "bytes20",
                              "type": "bytes20"
                            },
                            "id": 5754,
                            "name": "ElementaryTypeName",
                            "src": "2165:7:14"
                          }
                        ],
                        "id": 5755,
                        "name": "VariableDeclaration",
                        "src": "2165:19:14"
                      },
                      {
                        "attributes": {
                          "argumentTypes": null,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": false,
                          "isStructConstructorCall": false,
                          "lValueRequested": false,
                          "names": [
                            null
                          ],
                          "type": "bytes20",
                          "type_conversion": true
                        },
                        "children": [
                          {
                            "attributes": {
                              "argumentTypes": [
                                {
                                  "typeIdentifier": "t_address",
                                  "typeString": "address"
                                }
                              ],
                              "isConstant": false,
                              "isLValue": false,
                              "isPure": true,
                              "lValueRequested": false,
                              "type": "type(bytes20)",
                              "value": "bytes20"
                            },
                            "id": 5756,
                            "name": "ElementaryTypeNameExpression",
                            "src": "2187:7:14"
                          },
                          {
                            "attributes": {
                              "argumentTypes": null,
                              "overloadedDeclarations": [
                                null
                              ],
                              "referencedDeclaration": 5747,
                              "type": "address",
                              "value": "target"
                            },
                            "id": 5757,
                            "name": "Identifier",
                            "src": "2195:6:14"
                          }
                        ],
                        "id": 5758,
                        "name": "FunctionCall",
                        "src": "2187:15:14"
                      }
                    ],
                    "id": 5759,
                    "name": "VariableDeclarationStatement",
                    "src": "2165:37:14"
                  },
                  {
                    "attributes": {
                      "externalReferences": [
                        {
                          "targetBytes": {
                            "declaration": 5755,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2436:11:14",
                            "valueSize": 1
                          }
                        },
                        {
                          "query": {
                            "declaration": 5749,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2667:5:14",
                            "valueSize": 1
                          }
                        },
                        {
                          "result": {
                            "declaration": 5752,
                            "isOffset": false,
                            "isSlot": false,
                            "src": "2702:6:14",
                            "valueSize": 1
                          }
                        }
                      ],
                      "operations": "{\n    let clone := mload(0x40)\n    mstore(clone, 0x363d3d373d3d3d363d7300000000000000000000000000000000000000000000)\n    mstore(add(clone, 0xa), targetBytes)\n    mstore(add(clone, 0x1e), 0x5af43d82803e903d91602b57fd5bf30000000000000000000000000000000000)\n    let other := add(clone, 0x40)\n    extcodecopy(query, other, 0, 0x2d)\n    result := and(eq(mload(clone), mload(other)), eq(mload(add(clone, 0xd)), mload(add(other, 0xd))))\n}"
                    },
                    "children": [],
                    "id": 5760,
                    "name": "InlineAssembly",
                    "src": "2212:643:14"
                  }
                ],
                "id": 5761,
                "name": "Block",
                "src": "2155:706:14"
              }
            ],
            "id": 5762,
            "name": "FunctionDefinition",
            "src": "2043:818:14"
          }
        ],
        "id": 5763,
        "name": "ContractDefinition",
        "src": "1432:1431:14"
      }
    ],
    "id": 5764,
    "name": "SourceUnit",
    "src": "0:2864:14"
  },
  "compiler": {
    "name": "solc",
    "version": "0.5.17+commit.d19bba13.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.3.4",
  "updatedAt": "2021-11-23T11:52:09.278Z",
  "devdoc": {
    "methods": {}
  },
  "userdoc": {
    "methods": {}
  }
}