{
  "contractName": "IImplementationAuthority",
  "abi": [
    {
      "inputs": [],
      "name": "getImplementation",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/proxy/TokenProxy.sol\":\"IImplementationAuthority\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"project:/contracts/proxy/TokenProxy.sol\":{\"keccak256\":\"0x0cdc6335a6daae1e9d6b75fca4563b94b1235501d198f32823145cffe1379ea5\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://38cf9f998b054b314d75283b4e491f4b59c74cd5de7365fc2d270dcc765ee7b3\",\"dweb:/ipfs/QmQMgshRmsGCYLynGXXZ1CqLAEKs3eaVcRZrg5bbEFFjnp\"]}},\"version\":1}",
  "bytecode": "0x",
  "deployedBytecode": "0x",
  "immutableReferences": {},
  "generatedSources": [],
  "deployedGeneratedSources": [],
  "sourceMap": "",
  "deployedSourceMap": "",
  "source": "// SPDX-License-Identifier: GPL-3.0\n/**\n *     NOTICE\n *\n *     The T-REX software is licensed under a proprietary license or the GPL v.3.\n *     If you choose to receive it under the GPL v.3 license, the following applies:\n *     T-REX is a suite of smart contracts developed by Tokeny to manage and transfer financial assets on the ethereum blockchain\n *\n *     Copyright (C) 2021, Tokeny sàrl.\n *\n *     This program is free software: you can redistribute it and/or modify\n *     it under the terms of the GNU General Public License as published by\n *     the Free Software Foundation, either version 3 of the License, or\n *     (at your option) any later version.\n *\n *     This program is distributed in the hope that it will be useful,\n *     but WITHOUT ANY WARRANTY; without even the implied warranty of\n *     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n *     GNU General Public License for more details.\n *\n *     You should have received a copy of the GNU General Public License\n *     along with this program.  If not, see <https://www.gnu.org/licenses/>.\n */\n\npragma solidity ^0.8.0;\n\ninterface IImplementationAuthority {\n    function getImplementation() external view returns (address);\n}\n\ncontract TokenProxy {\n    address public implementationAuthority;\n\n    constructor(\n        address _implementationAuthority,\n        address _identityRegistry,\n        address _compliance,\n        string memory _name,\n        string memory _symbol,\n        uint8 _decimals,\n        address _onchainID\n    ) {\n        implementationAuthority = _implementationAuthority;\n\n        address logic = IImplementationAuthority(implementationAuthority).getImplementation();\n\n        // solhint-disable-next-line avoid-low-level-calls\n        (bool success, ) =\n            logic.delegatecall(\n                abi.encodeWithSignature(\n                    'init(address,address,string,string,uint8,address)',\n                    _identityRegistry,\n                    _compliance,\n                    _name,\n                    _symbol,\n                    _decimals,\n                    _onchainID\n                )\n            );\n        require(success, 'Initialization failed.');\n    }\n\n    fallback() external payable {\n        address logic = IImplementationAuthority(implementationAuthority).getImplementation();\n\n        assembly {\n            // solium-disable-line\n            calldatacopy(0x0, 0x0, calldatasize())\n            let success := delegatecall(sub(gas(), 10000), logic, 0x0, calldatasize(), 0, 0)\n            let retSz := returndatasize()\n            returndatacopy(0, 0, retSz)\n            switch success\n                case 0 {\n                    revert(0, retSz)\n                }\n                default {\n                    return(0, retSz)\n                }\n        }\n    }\n}\n",
  "sourcePath": "/home/webxpert/workspace/shipfinex/latest-repos/tokenx_smartcontract/contracts/proxy/TokenProxy.sol",
  "ast": {
    "absolutePath": "project:/contracts/proxy/TokenProxy.sol",
    "exportedSymbols": {
      "IImplementationAuthority": [
        6201
      ],
      "TokenProxy": [
        6268
      ]
    },
    "id": 6269,
    "license": "GPL-3.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 6195,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "1093:23:33"
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "IImplementationAuthority",
        "contractDependencies": [],
        "contractKind": "interface",
        "fullyImplemented": false,
        "id": 6201,
        "linearizedBaseContracts": [
          6201
        ],
        "name": "IImplementationAuthority",
        "nameLocation": "1128:24:33",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "functionSelector": "aaf10f42",
            "id": 6200,
            "implemented": false,
            "kind": "function",
            "modifiers": [],
            "name": "getImplementation",
            "nameLocation": "1168:17:33",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6196,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1185:2:33"
            },
            "returnParameters": {
              "id": 6199,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6198,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 6200,
                  "src": "1211:7:33",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6197,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1211:7:33",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1210:9:33"
            },
            "scope": 6201,
            "src": "1159:61:33",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 6269,
        "src": "1118:104:33",
        "usedErrors": []
      },
      {
        "abstract": false,
        "baseContracts": [],
        "canonicalName": "TokenProxy",
        "contractDependencies": [],
        "contractKind": "contract",
        "fullyImplemented": true,
        "id": 6268,
        "linearizedBaseContracts": [
          6268
        ],
        "name": "TokenProxy",
        "nameLocation": "1233:10:33",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "constant": false,
            "functionSelector": "2307f882",
            "id": 6203,
            "mutability": "mutable",
            "name": "implementationAuthority",
            "nameLocation": "1265:23:33",
            "nodeType": "VariableDeclaration",
            "scope": 6268,
            "src": "1250:38:33",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 6202,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1250:7:33",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "body": {
              "id": 6253,
              "nodeType": "Block",
              "src": "1532:671:33",
              "statements": [
                {
                  "expression": {
                    "id": 6222,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 6220,
                      "name": "implementationAuthority",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6203,
                      "src": "1542:23:33",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 6221,
                      "name": "_implementationAuthority",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6205,
                      "src": "1568:24:33",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1542:50:33",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 6223,
                  "nodeType": "ExpressionStatement",
                  "src": "1542:50:33"
                },
                {
                  "assignments": [
                    6225
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6225,
                      "mutability": "mutable",
                      "name": "logic",
                      "nameLocation": "1611:5:33",
                      "nodeType": "VariableDeclaration",
                      "scope": 6253,
                      "src": "1603:13:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 6224,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "1603:7:33",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 6231,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "arguments": [
                          {
                            "id": 6227,
                            "name": "implementationAuthority",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6203,
                            "src": "1644:23:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 6226,
                          "name": "IImplementationAuthority",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6201,
                          "src": "1619:24:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IImplementationAuthority_$6201_$",
                            "typeString": "type(contract IImplementationAuthority)"
                          }
                        },
                        "id": 6228,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1619:49:33",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IImplementationAuthority_$6201",
                          "typeString": "contract IImplementationAuthority"
                        }
                      },
                      "id": 6229,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "1669:17:33",
                      "memberName": "getImplementation",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 6200,
                      "src": "1619:67:33",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                        "typeString": "function () view external returns (address)"
                      }
                    },
                    "id": 6230,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1619:69:33",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1603:85:33"
                },
                {
                  "assignments": [
                    6233,
                    null
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6233,
                      "mutability": "mutable",
                      "name": "success",
                      "nameLocation": "1764:7:33",
                      "nodeType": "VariableDeclaration",
                      "scope": 6253,
                      "src": "1759:12:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_bool",
                        "typeString": "bool"
                      },
                      "typeName": {
                        "id": 6232,
                        "name": "bool",
                        "nodeType": "ElementaryTypeName",
                        "src": "1759:4:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      "visibility": "internal"
                    },
                    null
                  ],
                  "id": 6247,
                  "initialValue": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "hexValue": "696e697428616464726573732c616464726573732c737472696e672c737472696e672c75696e74382c6164647265737329",
                            "id": 6238,
                            "isConstant": false,
                            "isLValue": false,
                            "isPure": true,
                            "kind": "string",
                            "lValueRequested": false,
                            "nodeType": "Literal",
                            "src": "1870:51:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_stringliteral_f91b619c3c8d8df92d41549a809cd2e4f7fab7a8f3547d66a1f707ce3409a212",
                              "typeString": "literal_string \"init(address,address,string,string,uint8,address)\""
                            },
                            "value": "init(address,address,string,string,uint8,address)"
                          },
                          {
                            "id": 6239,
                            "name": "_identityRegistry",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6207,
                            "src": "1943:17:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "id": 6240,
                            "name": "_compliance",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6209,
                            "src": "1982:11:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          },
                          {
                            "id": 6241,
                            "name": "_name",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6211,
                            "src": "2015:5:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          {
                            "id": 6242,
                            "name": "_symbol",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6213,
                            "src": "2042:7:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            }
                          },
                          {
                            "id": 6243,
                            "name": "_decimals",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6215,
                            "src": "2071:9:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            }
                          },
                          {
                            "id": 6244,
                            "name": "_onchainID",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6217,
                            "src": "2102:10:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_stringliteral_f91b619c3c8d8df92d41549a809cd2e4f7fab7a8f3547d66a1f707ce3409a212",
                              "typeString": "literal_string \"init(address,address,string,string,uint8,address)\""
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            },
                            {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            },
                            {
                              "typeIdentifier": "t_string_memory_ptr",
                              "typeString": "string memory"
                            },
                            {
                              "typeIdentifier": "t_uint8",
                              "typeString": "uint8"
                            },
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "expression": {
                            "id": 6236,
                            "name": "abi",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 4294967295,
                            "src": "1825:3:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_magic_abi",
                              "typeString": "abi"
                            }
                          },
                          "id": 6237,
                          "isConstant": false,
                          "isLValue": false,
                          "isPure": true,
                          "lValueRequested": false,
                          "memberLocation": "1829:19:33",
                          "memberName": "encodeWithSignature",
                          "nodeType": "MemberAccess",
                          "src": "1825:23:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_function_abiencodewithsignature_pure$_t_string_memory_ptr_$returns$_t_bytes_memory_ptr_$",
                            "typeString": "function (string memory) pure returns (bytes memory)"
                          }
                        },
                        "id": 6245,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "functionCall",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "1825:305:33",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bytes_memory_ptr",
                          "typeString": "bytes memory"
                        }
                      ],
                      "expression": {
                        "id": 6234,
                        "name": "logic",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6225,
                        "src": "1789:5:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "id": 6235,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "1795:12:33",
                      "memberName": "delegatecall",
                      "nodeType": "MemberAccess",
                      "src": "1789:18:33",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_baredelegatecall_nonpayable$_t_bytes_memory_ptr_$returns$_t_bool_$_t_bytes_memory_ptr_$",
                        "typeString": "function (bytes memory) returns (bool,bytes memory)"
                      }
                    },
                    "id": 6246,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1789:355:33",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$_t_bool_$_t_bytes_memory_ptr_$",
                      "typeString": "tuple(bool,bytes memory)"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "1758:386:33"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "id": 6249,
                        "name": "success",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6233,
                        "src": "2162:7:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        }
                      },
                      {
                        "hexValue": "496e697469616c697a6174696f6e206661696c65642e",
                        "id": 6250,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": true,
                        "kind": "string",
                        "lValueRequested": false,
                        "nodeType": "Literal",
                        "src": "2171:24:33",
                        "typeDescriptions": {
                          "typeIdentifier": "t_stringliteral_84817bd958e2e6d9a7351828ba5fd352a3aaf3cf97a67f6d55271e39a5b3e2ad",
                          "typeString": "literal_string \"Initialization failed.\""
                        },
                        "value": "Initialization failed."
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_bool",
                          "typeString": "bool"
                        },
                        {
                          "typeIdentifier": "t_stringliteral_84817bd958e2e6d9a7351828ba5fd352a3aaf3cf97a67f6d55271e39a5b3e2ad",
                          "typeString": "literal_string \"Initialization failed.\""
                        }
                      ],
                      "id": 6248,
                      "name": "require",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [
                        4294967278,
                        4294967278
                      ],
                      "referencedDeclaration": 4294967278,
                      "src": "2154:7:33",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$",
                        "typeString": "function (bool,string memory) pure"
                      }
                    },
                    "id": 6251,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2154:42:33",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6252,
                  "nodeType": "ExpressionStatement",
                  "src": "2154:42:33"
                }
              ]
            },
            "id": 6254,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6218,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6205,
                  "mutability": "mutable",
                  "name": "_implementationAuthority",
                  "nameLocation": "1324:24:33",
                  "nodeType": "VariableDeclaration",
                  "scope": 6254,
                  "src": "1316:32:33",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6204,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1316:7:33",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6207,
                  "mutability": "mutable",
                  "name": "_identityRegistry",
                  "nameLocation": "1366:17:33",
                  "nodeType": "VariableDeclaration",
                  "scope": 6254,
                  "src": "1358:25:33",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6206,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1358:7:33",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6209,
                  "mutability": "mutable",
                  "name": "_compliance",
                  "nameLocation": "1401:11:33",
                  "nodeType": "VariableDeclaration",
                  "scope": 6254,
                  "src": "1393:19:33",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6208,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1393:7:33",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6211,
                  "mutability": "mutable",
                  "name": "_name",
                  "nameLocation": "1436:5:33",
                  "nodeType": "VariableDeclaration",
                  "scope": 6254,
                  "src": "1422:19:33",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 6210,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1422:6:33",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6213,
                  "mutability": "mutable",
                  "name": "_symbol",
                  "nameLocation": "1465:7:33",
                  "nodeType": "VariableDeclaration",
                  "scope": 6254,
                  "src": "1451:21:33",
                  "stateVariable": false,
                  "storageLocation": "memory",
                  "typeDescriptions": {
                    "typeIdentifier": "t_string_memory_ptr",
                    "typeString": "string"
                  },
                  "typeName": {
                    "id": 6212,
                    "name": "string",
                    "nodeType": "ElementaryTypeName",
                    "src": "1451:6:33",
                    "typeDescriptions": {
                      "typeIdentifier": "t_string_storage_ptr",
                      "typeString": "string"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6215,
                  "mutability": "mutable",
                  "name": "_decimals",
                  "nameLocation": "1488:9:33",
                  "nodeType": "VariableDeclaration",
                  "scope": 6254,
                  "src": "1482:15:33",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_uint8",
                    "typeString": "uint8"
                  },
                  "typeName": {
                    "id": 6214,
                    "name": "uint8",
                    "nodeType": "ElementaryTypeName",
                    "src": "1482:5:33",
                    "typeDescriptions": {
                      "typeIdentifier": "t_uint8",
                      "typeString": "uint8"
                    }
                  },
                  "visibility": "internal"
                },
                {
                  "constant": false,
                  "id": 6217,
                  "mutability": "mutable",
                  "name": "_onchainID",
                  "nameLocation": "1515:10:33",
                  "nodeType": "VariableDeclaration",
                  "scope": 6254,
                  "src": "1507:18:33",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6216,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1507:7:33",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1306:225:33"
            },
            "returnParameters": {
              "id": 6219,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1532:0:33"
            },
            "scope": 6268,
            "src": "1295:908:33",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 6266,
              "nodeType": "Block",
              "src": "2237:581:33",
              "statements": [
                {
                  "assignments": [
                    6258
                  ],
                  "declarations": [
                    {
                      "constant": false,
                      "id": 6258,
                      "mutability": "mutable",
                      "name": "logic",
                      "nameLocation": "2255:5:33",
                      "nodeType": "VariableDeclaration",
                      "scope": 6266,
                      "src": "2247:13:33",
                      "stateVariable": false,
                      "storageLocation": "default",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      },
                      "typeName": {
                        "id": 6257,
                        "name": "address",
                        "nodeType": "ElementaryTypeName",
                        "src": "2247:7:33",
                        "stateMutability": "nonpayable",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      },
                      "visibility": "internal"
                    }
                  ],
                  "id": 6264,
                  "initialValue": {
                    "arguments": [],
                    "expression": {
                      "argumentTypes": [],
                      "expression": {
                        "arguments": [
                          {
                            "id": 6260,
                            "name": "implementationAuthority",
                            "nodeType": "Identifier",
                            "overloadedDeclarations": [],
                            "referencedDeclaration": 6203,
                            "src": "2288:23:33",
                            "typeDescriptions": {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          }
                        ],
                        "expression": {
                          "argumentTypes": [
                            {
                              "typeIdentifier": "t_address",
                              "typeString": "address"
                            }
                          ],
                          "id": 6259,
                          "name": "IImplementationAuthority",
                          "nodeType": "Identifier",
                          "overloadedDeclarations": [],
                          "referencedDeclaration": 6201,
                          "src": "2263:24:33",
                          "typeDescriptions": {
                            "typeIdentifier": "t_type$_t_contract$_IImplementationAuthority_$6201_$",
                            "typeString": "type(contract IImplementationAuthority)"
                          }
                        },
                        "id": 6261,
                        "isConstant": false,
                        "isLValue": false,
                        "isPure": false,
                        "kind": "typeConversion",
                        "lValueRequested": false,
                        "nameLocations": [],
                        "names": [],
                        "nodeType": "FunctionCall",
                        "src": "2263:49:33",
                        "tryCall": false,
                        "typeDescriptions": {
                          "typeIdentifier": "t_contract$_IImplementationAuthority_$6201",
                          "typeString": "contract IImplementationAuthority"
                        }
                      },
                      "id": 6262,
                      "isConstant": false,
                      "isLValue": false,
                      "isPure": false,
                      "lValueRequested": false,
                      "memberLocation": "2313:17:33",
                      "memberName": "getImplementation",
                      "nodeType": "MemberAccess",
                      "referencedDeclaration": 6200,
                      "src": "2263:67:33",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_external_view$__$returns$_t_address_$",
                        "typeString": "function () view external returns (address)"
                      }
                    },
                    "id": 6263,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "2263:69:33",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "nodeType": "VariableDeclarationStatement",
                  "src": "2247:85:33"
                },
                {
                  "AST": {
                    "nodeType": "YulBlock",
                    "src": "2352:460:33",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2414:3:33",
                              "type": "",
                              "value": "0x0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2419:3:33",
                              "type": "",
                              "value": "0x0"
                            },
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "calldatasize",
                                "nodeType": "YulIdentifier",
                                "src": "2424:12:33"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "2424:14:33"
                            }
                          ],
                          "functionName": {
                            "name": "calldatacopy",
                            "nodeType": "YulIdentifier",
                            "src": "2401:12:33"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "2401:38:33"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "2401:38:33"
                      },
                      {
                        "nodeType": "YulVariableDeclaration",
                        "src": "2452:80:33",
                        "value": {
                          "arguments": [
                            {
                              "arguments": [
                                {
                                  "arguments": [],
                                  "functionName": {
                                    "name": "gas",
                                    "nodeType": "YulIdentifier",
                                    "src": "2484:3:33"
                                  },
                                  "nodeType": "YulFunctionCall",
                                  "src": "2484:5:33"
                                },
                                {
                                  "kind": "number",
                                  "nodeType": "YulLiteral",
                                  "src": "2491:5:33",
                                  "type": "",
                                  "value": "10000"
                                }
                              ],
                              "functionName": {
                                "name": "sub",
                                "nodeType": "YulIdentifier",
                                "src": "2480:3:33"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "2480:17:33"
                            },
                            {
                              "name": "logic",
                              "nodeType": "YulIdentifier",
                              "src": "2499:5:33"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2506:3:33",
                              "type": "",
                              "value": "0x0"
                            },
                            {
                              "arguments": [],
                              "functionName": {
                                "name": "calldatasize",
                                "nodeType": "YulIdentifier",
                                "src": "2511:12:33"
                              },
                              "nodeType": "YulFunctionCall",
                              "src": "2511:14:33"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2527:1:33",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2530:1:33",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "delegatecall",
                            "nodeType": "YulIdentifier",
                            "src": "2467:12:33"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "2467:65:33"
                        },
                        "variables": [
                          {
                            "name": "success",
                            "nodeType": "YulTypedName",
                            "src": "2456:7:33",
                            "type": ""
                          }
                        ]
                      },
                      {
                        "nodeType": "YulVariableDeclaration",
                        "src": "2545:29:33",
                        "value": {
                          "arguments": [],
                          "functionName": {
                            "name": "returndatasize",
                            "nodeType": "YulIdentifier",
                            "src": "2558:14:33"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "2558:16:33"
                        },
                        "variables": [
                          {
                            "name": "retSz",
                            "nodeType": "YulTypedName",
                            "src": "2549:5:33",
                            "type": ""
                          }
                        ]
                      },
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2602:1:33",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2605:1:33",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "name": "retSz",
                              "nodeType": "YulIdentifier",
                              "src": "2608:5:33"
                            }
                          ],
                          "functionName": {
                            "name": "returndatacopy",
                            "nodeType": "YulIdentifier",
                            "src": "2587:14:33"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "2587:27:33"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "2587:27:33"
                      },
                      {
                        "cases": [
                          {
                            "body": {
                              "nodeType": "YulBlock",
                              "src": "2665:56:33",
                              "statements": [
                                {
                                  "expression": {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "2694:1:33",
                                        "type": "",
                                        "value": "0"
                                      },
                                      {
                                        "name": "retSz",
                                        "nodeType": "YulIdentifier",
                                        "src": "2697:5:33"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "revert",
                                      "nodeType": "YulIdentifier",
                                      "src": "2687:6:33"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "2687:16:33"
                                  },
                                  "nodeType": "YulExpressionStatement",
                                  "src": "2687:16:33"
                                }
                              ]
                            },
                            "nodeType": "YulCase",
                            "src": "2658:63:33",
                            "value": {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "2663:1:33",
                              "type": "",
                              "value": "0"
                            }
                          },
                          {
                            "body": {
                              "nodeType": "YulBlock",
                              "src": "2746:56:33",
                              "statements": [
                                {
                                  "expression": {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "2775:1:33",
                                        "type": "",
                                        "value": "0"
                                      },
                                      {
                                        "name": "retSz",
                                        "nodeType": "YulIdentifier",
                                        "src": "2778:5:33"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "return",
                                      "nodeType": "YulIdentifier",
                                      "src": "2768:6:33"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "2768:16:33"
                                  },
                                  "nodeType": "YulExpressionStatement",
                                  "src": "2768:16:33"
                                }
                              ]
                            },
                            "nodeType": "YulCase",
                            "src": "2738:64:33",
                            "value": "default"
                          }
                        ],
                        "expression": {
                          "name": "success",
                          "nodeType": "YulIdentifier",
                          "src": "2634:7:33"
                        },
                        "nodeType": "YulSwitch",
                        "src": "2627:175:33"
                      }
                    ]
                  },
                  "evmVersion": "london",
                  "externalReferences": [
                    {
                      "declaration": 6258,
                      "isOffset": false,
                      "isSlot": false,
                      "src": "2499:5:33",
                      "valueSize": 1
                    }
                  ],
                  "id": 6265,
                  "nodeType": "InlineAssembly",
                  "src": "2343:469:33"
                }
              ]
            },
            "id": 6267,
            "implemented": true,
            "kind": "fallback",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6255,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2217:2:33"
            },
            "returnParameters": {
              "id": 6256,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "2237:0:33"
            },
            "scope": 6268,
            "src": "2209:609:33",
            "stateMutability": "payable",
            "virtual": false,
            "visibility": "external"
          }
        ],
        "scope": 6269,
        "src": "1224:1596:33",
        "usedErrors": []
      }
    ],
    "src": "1093:1728:33"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.17+commit.8df45f5f.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.8",
  "updatedAt": "2022-12-08T12:51:01.364Z",
  "devdoc": {
    "kind": "dev",
    "methods": {},
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}