{
  "contractName": "ImplementationAuthority",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_implementation",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousOwner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "OwnershipTransferred",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAddress",
          "type": "address"
        }
      ],
      "name": "UpdatedImplementation",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "implementation",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "owner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "renounceOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newOwner",
          "type": "address"
        }
      ],
      "name": "transferOwnership",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getImplementation",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newImplementation",
          "type": "address"
        }
      ],
      "name": "updateImplementation",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    }
  ],
  "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newAddress\",\"type\":\"address\"}],\"name\":\"UpdatedImplementation\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newImplementation\",\"type\":\"address\"}],\"name\":\"updateImplementation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"project:/contracts/proxy/ImplementationAuthority.sol\":\"ImplementationAuthority\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\"},\"optimizer\":{\"enabled\":true,\"runs\":10},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://40fb1b5102468f783961d0af743f91b9980cf66b50d1d12009f6bb1869cea4d2\",\"dweb:/ipfs/QmYqEbJML4jB1GHbzD4cUZDtJg5wVwNm3vDJq1GbyDus8y\"]},\"@openzeppelin/contracts/utils/Context.sol\":{\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://6df0ddf21ce9f58271bdfaa85cde98b200ef242a05a3f85c2bc10a8294800a92\",\"dweb:/ipfs/QmRK2Y5Yc6BK7tGKkgsgn3aJEQGi5aakeSPZvS65PV8Xp3\"]},\"project:/contracts/proxy/ImplementationAuthority.sol\":{\"keccak256\":\"0x500d85cf93f1ec4b8cf9a0da05a501f3c6ea1988dfc9c8f25dc32c7cd5f52015\",\"license\":\"GPL-3.0\",\"urls\":[\"bzz-raw://6c02e9505f252ddf72b25eeec22751cd05c4de275c430859f8a0e09a1f4095c0\",\"dweb:/ipfs/QmPw9MYor4FQRy4RJwkb3NCAAuo2EbCPiZrEnproiS1qMf\"]}},\"version\":1}",
  "bytecode": "0x608060405234801561001057600080fd5b5060405161041f38038061041f83398101604081905261002f916100df565b6100383361008f565b600180546001600160a01b0319166001600160a01b0383169081179091556040519081527f87c4e67a766ffddda27f441d63853a36ae64fbb07775a7c59d395e064b204eeb9060200160405180910390a15061010f565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000602082840312156100f157600080fd5b81516001600160a01b038116811461010857600080fd5b9392505050565b6103018061011e6000396000f3fe608060405234801561001057600080fd5b50600436106100625760003560e01c8063025b22bc146100675780635c60da1b1461007c578063715018a6146100a55780638da5cb5b146100ad578063aaf10f42146100b5578063f2fde38b146100c6575b600080fd5b61007a610075366004610287565b6100d9565b005b60015461008f906001600160a01b031681565b60405161009c91906102b7565b60405180910390f35b61007a610137565b61008f61014b565b6001546001600160a01b031661008f565b61007a6100d4366004610287565b61015a565b6100e16101d8565b600180546001600160a01b0319166001600160a01b0383161790556040517f87c4e67a766ffddda27f441d63853a36ae64fbb07775a7c59d395e064b204eeb9061012c9083906102b7565b60405180910390a150565b61013f6101d8565b6101496000610237565b565b6000546001600160a01b031690565b6101626101d8565b6001600160a01b0381166101cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6101d581610237565b50565b336101e161014b565b6001600160a01b0316146101495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101c3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561029957600080fd5b81356001600160a01b03811681146102b057600080fd5b9392505050565b6001600160a01b039190911681526020019056fea2646970667358221220bdac316a01d1be1d75d2282a6f153ff9765b95dbdccb72a5261b7f2cacaa49f464736f6c63430008110033",
  "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100625760003560e01c8063025b22bc146100675780635c60da1b1461007c578063715018a6146100a55780638da5cb5b146100ad578063aaf10f42146100b5578063f2fde38b146100c6575b600080fd5b61007a610075366004610287565b6100d9565b005b60015461008f906001600160a01b031681565b60405161009c91906102b7565b60405180910390f35b61007a610137565b61008f61014b565b6001546001600160a01b031661008f565b61007a6100d4366004610287565b61015a565b6100e16101d8565b600180546001600160a01b0319166001600160a01b0383161790556040517f87c4e67a766ffddda27f441d63853a36ae64fbb07775a7c59d395e064b204eeb9061012c9083906102b7565b60405180910390a150565b61013f6101d8565b6101496000610237565b565b6000546001600160a01b031690565b6101626101d8565b6001600160a01b0381166101cc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084015b60405180910390fd5b6101d581610237565b50565b336101e161014b565b6001600160a01b0316146101495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016101c3565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b60006020828403121561029957600080fd5b81356001600160a01b03811681146102b057600080fd5b9392505050565b6001600160a01b039190911681526020019056fea2646970667358221220bdac316a01d1be1d75d2282a6f153ff9765b95dbdccb72a5261b7f2cacaa49f464736f6c63430008110033",
  "immutableReferences": {},
  "generatedSources": [
    {
      "ast": {
        "nodeType": "YulBlock",
        "src": "0:514:54",
        "statements": [
          {
            "nodeType": "YulBlock",
            "src": "6:3:54",
            "statements": []
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "95:209:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "141:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "150:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "153:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "143:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "143:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "143:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "116:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "125:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "112:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "112:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "137:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "108:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "108:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "105:52:54"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "166:29:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "185:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "mload",
                      "nodeType": "YulIdentifier",
                      "src": "179:5:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "179:16:54"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "170:5:54",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "258:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "267:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "270:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "260:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "260:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "260:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "value",
                            "nodeType": "YulIdentifier",
                            "src": "217:5:54"
                          },
                          {
                            "arguments": [
                              {
                                "name": "value",
                                "nodeType": "YulIdentifier",
                                "src": "228:5:54"
                              },
                              {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "243:3:54",
                                        "type": "",
                                        "value": "160"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "248:1:54",
                                        "type": "",
                                        "value": "1"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "shl",
                                      "nodeType": "YulIdentifier",
                                      "src": "239:3:54"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "239:11:54"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "252:1:54",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "sub",
                                  "nodeType": "YulIdentifier",
                                  "src": "235:3:54"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "235:19:54"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "224:3:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "224:31:54"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "214:2:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "214:42:54"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "207:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "207:50:54"
                  },
                  "nodeType": "YulIf",
                  "src": "204:70:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "283:15:54",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "293:5:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "283:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_address_fromMemory",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "61:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "72:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "84:6:54",
                "type": ""
              }
            ],
            "src": "14:290:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "410:102:54",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "420:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "432:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "443:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "428:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "428:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "420:4:54"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "462:9:54"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value0",
                            "nodeType": "YulIdentifier",
                            "src": "477:6:54"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "493:3:54",
                                    "type": "",
                                    "value": "160"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "498:1:54",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "shl",
                                  "nodeType": "YulIdentifier",
                                  "src": "489:3:54"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "489:11:54"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "502:1:54",
                                "type": "",
                                "value": "1"
                              }
                            ],
                            "functionName": {
                              "name": "sub",
                              "nodeType": "YulIdentifier",
                              "src": "485:3:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "485:19:54"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "473:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "473:32:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "455:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "455:51:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "455:51:54"
                }
              ]
            },
            "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "379:9:54",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "390:6:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "401:4:54",
                "type": ""
              }
            ],
            "src": "309:203:54"
          }
        ]
      },
      "contents": "{\n    { }\n    function abi_decode_tuple_t_address_fromMemory(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        let value := mload(headStart)\n        if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n        value0 := value\n    }\n    function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n    }\n}",
      "id": 54,
      "language": "Yul",
      "name": "#utility.yul"
    }
  ],
  "deployedGeneratedSources": [
    {
      "ast": {
        "nodeType": "YulBlock",
        "src": "0:1278:54",
        "statements": [
          {
            "nodeType": "YulBlock",
            "src": "6:3:54",
            "statements": []
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "84:216:54",
              "statements": [
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "130:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "139:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "142:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "132:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "132:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "132:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "dataEnd",
                            "nodeType": "YulIdentifier",
                            "src": "105:7:54"
                          },
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "114:9:54"
                          }
                        ],
                        "functionName": {
                          "name": "sub",
                          "nodeType": "YulIdentifier",
                          "src": "101:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "101:23:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "126:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "slt",
                      "nodeType": "YulIdentifier",
                      "src": "97:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "97:32:54"
                  },
                  "nodeType": "YulIf",
                  "src": "94:52:54"
                },
                {
                  "nodeType": "YulVariableDeclaration",
                  "src": "155:36:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "181:9:54"
                      }
                    ],
                    "functionName": {
                      "name": "calldataload",
                      "nodeType": "YulIdentifier",
                      "src": "168:12:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "168:23:54"
                  },
                  "variables": [
                    {
                      "name": "value",
                      "nodeType": "YulTypedName",
                      "src": "159:5:54",
                      "type": ""
                    }
                  ]
                },
                {
                  "body": {
                    "nodeType": "YulBlock",
                    "src": "254:16:54",
                    "statements": [
                      {
                        "expression": {
                          "arguments": [
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "263:1:54",
                              "type": "",
                              "value": "0"
                            },
                            {
                              "kind": "number",
                              "nodeType": "YulLiteral",
                              "src": "266:1:54",
                              "type": "",
                              "value": "0"
                            }
                          ],
                          "functionName": {
                            "name": "revert",
                            "nodeType": "YulIdentifier",
                            "src": "256:6:54"
                          },
                          "nodeType": "YulFunctionCall",
                          "src": "256:12:54"
                        },
                        "nodeType": "YulExpressionStatement",
                        "src": "256:12:54"
                      }
                    ]
                  },
                  "condition": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "value",
                            "nodeType": "YulIdentifier",
                            "src": "213:5:54"
                          },
                          {
                            "arguments": [
                              {
                                "name": "value",
                                "nodeType": "YulIdentifier",
                                "src": "224:5:54"
                              },
                              {
                                "arguments": [
                                  {
                                    "arguments": [
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "239:3:54",
                                        "type": "",
                                        "value": "160"
                                      },
                                      {
                                        "kind": "number",
                                        "nodeType": "YulLiteral",
                                        "src": "244:1:54",
                                        "type": "",
                                        "value": "1"
                                      }
                                    ],
                                    "functionName": {
                                      "name": "shl",
                                      "nodeType": "YulIdentifier",
                                      "src": "235:3:54"
                                    },
                                    "nodeType": "YulFunctionCall",
                                    "src": "235:11:54"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "248:1:54",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "sub",
                                  "nodeType": "YulIdentifier",
                                  "src": "231:3:54"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "231:19:54"
                              }
                            ],
                            "functionName": {
                              "name": "and",
                              "nodeType": "YulIdentifier",
                              "src": "220:3:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "220:31:54"
                          }
                        ],
                        "functionName": {
                          "name": "eq",
                          "nodeType": "YulIdentifier",
                          "src": "210:2:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "210:42:54"
                      }
                    ],
                    "functionName": {
                      "name": "iszero",
                      "nodeType": "YulIdentifier",
                      "src": "203:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "203:50:54"
                  },
                  "nodeType": "YulIf",
                  "src": "200:70:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "279:15:54",
                  "value": {
                    "name": "value",
                    "nodeType": "YulIdentifier",
                    "src": "289:5:54"
                  },
                  "variableNames": [
                    {
                      "name": "value0",
                      "nodeType": "YulIdentifier",
                      "src": "279:6:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_decode_tuple_t_address",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "50:9:54",
                "type": ""
              },
              {
                "name": "dataEnd",
                "nodeType": "YulTypedName",
                "src": "61:7:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "73:6:54",
                "type": ""
              }
            ],
            "src": "14:286:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "406:102:54",
              "statements": [
                {
                  "nodeType": "YulAssignment",
                  "src": "416:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "428:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "439:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "424:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "424:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "416:4:54"
                    }
                  ]
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "458:9:54"
                      },
                      {
                        "arguments": [
                          {
                            "name": "value0",
                            "nodeType": "YulIdentifier",
                            "src": "473:6:54"
                          },
                          {
                            "arguments": [
                              {
                                "arguments": [
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "489:3:54",
                                    "type": "",
                                    "value": "160"
                                  },
                                  {
                                    "kind": "number",
                                    "nodeType": "YulLiteral",
                                    "src": "494:1:54",
                                    "type": "",
                                    "value": "1"
                                  }
                                ],
                                "functionName": {
                                  "name": "shl",
                                  "nodeType": "YulIdentifier",
                                  "src": "485:3:54"
                                },
                                "nodeType": "YulFunctionCall",
                                "src": "485:11:54"
                              },
                              {
                                "kind": "number",
                                "nodeType": "YulLiteral",
                                "src": "498:1:54",
                                "type": "",
                                "value": "1"
                              }
                            ],
                            "functionName": {
                              "name": "sub",
                              "nodeType": "YulIdentifier",
                              "src": "481:3:54"
                            },
                            "nodeType": "YulFunctionCall",
                            "src": "481:19:54"
                          }
                        ],
                        "functionName": {
                          "name": "and",
                          "nodeType": "YulIdentifier",
                          "src": "469:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "469:32:54"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "451:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "451:51:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "451:51:54"
                }
              ]
            },
            "name": "abi_encode_tuple_t_address__to_t_address__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "375:9:54",
                "type": ""
              },
              {
                "name": "value0",
                "nodeType": "YulTypedName",
                "src": "386:6:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "397:4:54",
                "type": ""
              }
            ],
            "src": "305:203:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "687:228:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "704:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "715:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "697:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "697:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "697:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "738:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "749:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "734:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "734:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "754:2:54",
                        "type": "",
                        "value": "38"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "727:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "727:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "727:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "777:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "788:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "773:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "773:18:54"
                      },
                      {
                        "hexValue": "4f776e61626c653a206e6577206f776e657220697320746865207a65726f2061",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "793:34:54",
                        "type": "",
                        "value": "Ownable: new owner is the zero a"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "766:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "766:62:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "766:62:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "848:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "859:2:54",
                            "type": "",
                            "value": "96"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "844:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "844:18:54"
                      },
                      {
                        "hexValue": "646472657373",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "864:8:54",
                        "type": "",
                        "value": "ddress"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "837:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "837:36:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "837:36:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "882:27:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "894:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "905:3:54",
                        "type": "",
                        "value": "128"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "890:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "890:19:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "882:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "664:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "678:4:54",
                "type": ""
              }
            ],
            "src": "513:402:54"
          },
          {
            "body": {
              "nodeType": "YulBlock",
              "src": "1094:182:54",
              "statements": [
                {
                  "expression": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "1111:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1122:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "1104:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1104:21:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "1104:21:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1145:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "1156:2:54",
                            "type": "",
                            "value": "32"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "1141:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1141:18:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1161:2:54",
                        "type": "",
                        "value": "32"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "1134:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1134:30:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "1134:30:54"
                },
                {
                  "expression": {
                    "arguments": [
                      {
                        "arguments": [
                          {
                            "name": "headStart",
                            "nodeType": "YulIdentifier",
                            "src": "1184:9:54"
                          },
                          {
                            "kind": "number",
                            "nodeType": "YulLiteral",
                            "src": "1195:2:54",
                            "type": "",
                            "value": "64"
                          }
                        ],
                        "functionName": {
                          "name": "add",
                          "nodeType": "YulIdentifier",
                          "src": "1180:3:54"
                        },
                        "nodeType": "YulFunctionCall",
                        "src": "1180:18:54"
                      },
                      {
                        "hexValue": "4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572",
                        "kind": "string",
                        "nodeType": "YulLiteral",
                        "src": "1200:34:54",
                        "type": "",
                        "value": "Ownable: caller is not the owner"
                      }
                    ],
                    "functionName": {
                      "name": "mstore",
                      "nodeType": "YulIdentifier",
                      "src": "1173:6:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1173:62:54"
                  },
                  "nodeType": "YulExpressionStatement",
                  "src": "1173:62:54"
                },
                {
                  "nodeType": "YulAssignment",
                  "src": "1244:26:54",
                  "value": {
                    "arguments": [
                      {
                        "name": "headStart",
                        "nodeType": "YulIdentifier",
                        "src": "1256:9:54"
                      },
                      {
                        "kind": "number",
                        "nodeType": "YulLiteral",
                        "src": "1267:2:54",
                        "type": "",
                        "value": "96"
                      }
                    ],
                    "functionName": {
                      "name": "add",
                      "nodeType": "YulIdentifier",
                      "src": "1252:3:54"
                    },
                    "nodeType": "YulFunctionCall",
                    "src": "1252:18:54"
                  },
                  "variableNames": [
                    {
                      "name": "tail",
                      "nodeType": "YulIdentifier",
                      "src": "1244:4:54"
                    }
                  ]
                }
              ]
            },
            "name": "abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed",
            "nodeType": "YulFunctionDefinition",
            "parameters": [
              {
                "name": "headStart",
                "nodeType": "YulTypedName",
                "src": "1071:9:54",
                "type": ""
              }
            ],
            "returnVariables": [
              {
                "name": "tail",
                "nodeType": "YulTypedName",
                "src": "1085:4:54",
                "type": ""
              }
            ],
            "src": "920:356:54"
          }
        ]
      },
      "contents": "{\n    { }\n    function abi_decode_tuple_t_address(headStart, dataEnd) -> value0\n    {\n        if slt(sub(dataEnd, headStart), 32) { revert(0, 0) }\n        let value := calldataload(headStart)\n        if iszero(eq(value, and(value, sub(shl(160, 1), 1)))) { revert(0, 0) }\n        value0 := value\n    }\n    function abi_encode_tuple_t_address__to_t_address__fromStack_reversed(headStart, value0) -> tail\n    {\n        tail := add(headStart, 32)\n        mstore(headStart, and(value0, sub(shl(160, 1), 1)))\n    }\n    function abi_encode_tuple_t_stringliteral_245f15ff17f551913a7a18385165551503906a406f905ac1c2437281a7cd0cfe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 38)\n        mstore(add(headStart, 64), \"Ownable: new owner is the zero a\")\n        mstore(add(headStart, 96), \"ddress\")\n        tail := add(headStart, 128)\n    }\n    function abi_encode_tuple_t_stringliteral_9924ebdf1add33d25d4ef888e16131f0a5687b0580a36c21b5c301a6c462effe__to_t_string_memory_ptr__fromStack_reversed(headStart) -> tail\n    {\n        mstore(headStart, 32)\n        mstore(add(headStart, 32), 32)\n        mstore(add(headStart, 64), \"Ownable: caller is not the owner\")\n        tail := add(headStart, 96)\n    }\n}",
      "id": 54,
      "language": "Yul",
      "name": "#utility.yul"
    }
  ],
  "sourceMap": "1173:575:32:-:0;;;1313:139;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;936:32:13;719:10:20;936:18:13;:32::i;:::-;1360:14:32;:32;;-1:-1:-1;;;;;;1360:32:32;-1:-1:-1;;;;;1360:32:32;;;;;;;;1407:38;;455:51:54;;;1407:38:32;;443:2:54;428:18;1407:38:32;;;;;;;1313:139;1173:575;;2433:187:13;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:13;;;-1:-1:-1;;;;;;2541:17:13;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:290:54:-;84:6;137:2;125:9;116:7;112:23;108:32;105:52;;;153:1;150;143:12;105:52;179:16;;-1:-1:-1;;;;;224:31:54;;214:42;;204:70;;270:1;267;260:12;204:70;293:5;14:290;-1:-1:-1;;;14:290:54:o;309:203::-;1173:575:32;;;;;;",
  "deployedSourceMap": "1173:575:32:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1563:183;;;;;;:::i;:::-;;:::i;:::-;;1277:29;;;;;-1:-1:-1;;;;;1277:29:32;;;;;;;;;;:::i;:::-;;;;;;;;1831:101:13;;;:::i;1201:85::-;;;:::i;1458:99:32:-;1536:14;;-1:-1:-1;;;;;1536:14:32;1458:99;;2081:198:13;;;;;;:::i;:::-;;:::i;1563:183:32:-;1094:13:13;:11;:13::i;:::-;1648:14:32::1;:35:::0;;-1:-1:-1;;;;;;1648:35:32::1;-1:-1:-1::0;;;;;1648:35:32;::::1;;::::0;;1698:41:::1;::::0;::::1;::::0;::::1;::::0;1648:35;;1698:41:::1;:::i;:::-;;;;;;;;1563:183:::0;:::o;1831:101:13:-;1094:13;:11;:13::i;:::-;1895:30:::1;1922:1;1895:18;:30::i;:::-;1831:101::o:0;1201:85::-;1247:7;1273:6;-1:-1:-1;;;;;1273:6:13;;1201:85::o;2081:198::-;1094:13;:11;:13::i;:::-;-1:-1:-1;;;;;2169:22:13;::::1;2161:73;;;::::0;-1:-1:-1;;;2161:73:13;;715:2:54;2161:73:13::1;::::0;::::1;697:21:54::0;754:2;734:18;;;727:30;793:34;773:18;;;766:62;-1:-1:-1;;;844:18:54;;;837:36;890:19;;2161:73:13::1;;;;;;;;;2244:28;2263:8;2244:18;:28::i;:::-;2081:198:::0;:::o;1359:130::-;719:10:20;1422:7:13;:5;:7::i;:::-;-1:-1:-1;;;;;1422:23:13;;1414:68;;;;-1:-1:-1;;;1414:68:13;;1122:2:54;1414:68:13;;;1104:21:54;;;1141:18;;;1134:30;1200:34;1180:18;;;1173:62;1252:18;;1414:68:13;920:356:54;2433:187:13;2506:16;2525:6;;-1:-1:-1;;;;;2541:17:13;;;-1:-1:-1;;;;;;2541:17:13;;;;;;2573:40;;2525:6;;;;;;;2573:40;;2506:16;2573:40;2496:124;2433:187;:::o;14:286:54:-;73:6;126:2;114:9;105:7;101:23;97:32;94:52;;;142:1;139;132:12;94:52;168:23;;-1:-1:-1;;;;;220:31:54;;210:42;;200:70;;266:1;263;256:12;200:70;289:5;14:286;-1:-1:-1;;;14:286:54:o;305:203::-;-1:-1:-1;;;;;469:32:54;;;;451:51;;439:2;424:18;;305:203::o",
  "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\nimport '@openzeppelin/contracts/access/Ownable.sol';\n\n\ncontract ImplementationAuthority is Ownable {\n    event UpdatedImplementation(address newAddress);\n\n    address public implementation;\n\n    constructor(address _implementation) {\n        implementation = _implementation;\n        emit UpdatedImplementation(_implementation);\n    }\n\n    function getImplementation() external view returns (address) {\n        return implementation;\n    }\n\n    function updateImplementation(address _newImplementation) public onlyOwner {\n        implementation = _newImplementation;\n        emit UpdatedImplementation(_newImplementation);\n    }\n}\n",
  "sourcePath": "/home/webxpert/workspace/shipfinex/latest-repos/tokenx_smartcontract/contracts/proxy/ImplementationAuthority.sol",
  "ast": {
    "absolutePath": "project:/contracts/proxy/ImplementationAuthority.sol",
    "exportedSymbols": {
      "Context": [
        3401
      ],
      "ImplementationAuthority": [
        6193
      ],
      "Ownable": [
        2505
      ]
    },
    "id": 6194,
    "license": "GPL-3.0",
    "nodeType": "SourceUnit",
    "nodes": [
      {
        "id": 6145,
        "literals": [
          "solidity",
          "^",
          "0.8",
          ".0"
        ],
        "nodeType": "PragmaDirective",
        "src": "1093:23:32"
      },
      {
        "absolutePath": "@openzeppelin/contracts/access/Ownable.sol",
        "file": "@openzeppelin/contracts/access/Ownable.sol",
        "id": 6146,
        "nameLocation": "-1:-1:-1",
        "nodeType": "ImportDirective",
        "scope": 6194,
        "sourceUnit": 2506,
        "src": "1118:52:32",
        "symbolAliases": [],
        "unitAlias": ""
      },
      {
        "abstract": false,
        "baseContracts": [
          {
            "baseName": {
              "id": 6147,
              "name": "Ownable",
              "nameLocations": [
                "1209:7:32"
              ],
              "nodeType": "IdentifierPath",
              "referencedDeclaration": 2505,
              "src": "1209:7:32"
            },
            "id": 6148,
            "nodeType": "InheritanceSpecifier",
            "src": "1209:7:32"
          }
        ],
        "canonicalName": "ImplementationAuthority",
        "contractDependencies": [],
        "contractKind": "contract",
        "fullyImplemented": true,
        "id": 6193,
        "linearizedBaseContracts": [
          6193,
          2505,
          3401
        ],
        "name": "ImplementationAuthority",
        "nameLocation": "1182:23:32",
        "nodeType": "ContractDefinition",
        "nodes": [
          {
            "anonymous": false,
            "eventSelector": "87c4e67a766ffddda27f441d63853a36ae64fbb07775a7c59d395e064b204eeb",
            "id": 6152,
            "name": "UpdatedImplementation",
            "nameLocation": "1229:21:32",
            "nodeType": "EventDefinition",
            "parameters": {
              "id": 6151,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6150,
                  "indexed": false,
                  "mutability": "mutable",
                  "name": "newAddress",
                  "nameLocation": "1259:10:32",
                  "nodeType": "VariableDeclaration",
                  "scope": 6152,
                  "src": "1251:18:32",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6149,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1251:7:32",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1250:20:32"
            },
            "src": "1223:48:32"
          },
          {
            "constant": false,
            "functionSelector": "5c60da1b",
            "id": 6154,
            "mutability": "mutable",
            "name": "implementation",
            "nameLocation": "1292:14:32",
            "nodeType": "VariableDeclaration",
            "scope": 6193,
            "src": "1277:29:32",
            "stateVariable": true,
            "storageLocation": "default",
            "typeDescriptions": {
              "typeIdentifier": "t_address",
              "typeString": "address"
            },
            "typeName": {
              "id": 6153,
              "name": "address",
              "nodeType": "ElementaryTypeName",
              "src": "1277:7:32",
              "stateMutability": "nonpayable",
              "typeDescriptions": {
                "typeIdentifier": "t_address",
                "typeString": "address"
              }
            },
            "visibility": "public"
          },
          {
            "body": {
              "id": 6167,
              "nodeType": "Block",
              "src": "1350:102:32",
              "statements": [
                {
                  "expression": {
                    "id": 6161,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 6159,
                      "name": "implementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6154,
                      "src": "1360:14:32",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 6160,
                      "name": "_implementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6156,
                      "src": "1377:15:32",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1360:32:32",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 6162,
                  "nodeType": "ExpressionStatement",
                  "src": "1360:32:32"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 6164,
                        "name": "_implementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6156,
                        "src": "1429:15:32",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 6163,
                      "name": "UpdatedImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6152,
                      "src": "1407:21:32",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 6165,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1407:38:32",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6166,
                  "nodeType": "EmitStatement",
                  "src": "1402:43:32"
                }
              ]
            },
            "id": 6168,
            "implemented": true,
            "kind": "constructor",
            "modifiers": [],
            "name": "",
            "nameLocation": "-1:-1:-1",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6157,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6156,
                  "mutability": "mutable",
                  "name": "_implementation",
                  "nameLocation": "1333:15:32",
                  "nodeType": "VariableDeclaration",
                  "scope": 6168,
                  "src": "1325:23:32",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6155,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1325:7:32",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1324:25:32"
            },
            "returnParameters": {
              "id": 6158,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1350:0:32"
            },
            "scope": 6193,
            "src": "1313:139:32",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          },
          {
            "body": {
              "id": 6175,
              "nodeType": "Block",
              "src": "1519:38:32",
              "statements": [
                {
                  "expression": {
                    "id": 6173,
                    "name": "implementation",
                    "nodeType": "Identifier",
                    "overloadedDeclarations": [],
                    "referencedDeclaration": 6154,
                    "src": "1536:14:32",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "functionReturnParameters": 6172,
                  "id": 6174,
                  "nodeType": "Return",
                  "src": "1529:21:32"
                }
              ]
            },
            "functionSelector": "aaf10f42",
            "id": 6176,
            "implemented": true,
            "kind": "function",
            "modifiers": [],
            "name": "getImplementation",
            "nameLocation": "1467:17:32",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6169,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1484:2:32"
            },
            "returnParameters": {
              "id": 6172,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6171,
                  "mutability": "mutable",
                  "name": "",
                  "nameLocation": "-1:-1:-1",
                  "nodeType": "VariableDeclaration",
                  "scope": 6176,
                  "src": "1510:7:32",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6170,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1510:7:32",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1509:9:32"
            },
            "scope": 6193,
            "src": "1458:99:32",
            "stateMutability": "view",
            "virtual": false,
            "visibility": "external"
          },
          {
            "body": {
              "id": 6191,
              "nodeType": "Block",
              "src": "1638:108:32",
              "statements": [
                {
                  "expression": {
                    "id": 6185,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "lValueRequested": false,
                    "leftHandSide": {
                      "id": 6183,
                      "name": "implementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6154,
                      "src": "1648:14:32",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "nodeType": "Assignment",
                    "operator": "=",
                    "rightHandSide": {
                      "id": 6184,
                      "name": "_newImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6178,
                      "src": "1665:18:32",
                      "typeDescriptions": {
                        "typeIdentifier": "t_address",
                        "typeString": "address"
                      }
                    },
                    "src": "1648:35:32",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "id": 6186,
                  "nodeType": "ExpressionStatement",
                  "src": "1648:35:32"
                },
                {
                  "eventCall": {
                    "arguments": [
                      {
                        "id": 6188,
                        "name": "_newImplementation",
                        "nodeType": "Identifier",
                        "overloadedDeclarations": [],
                        "referencedDeclaration": 6178,
                        "src": "1720:18:32",
                        "typeDescriptions": {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      }
                    ],
                    "expression": {
                      "argumentTypes": [
                        {
                          "typeIdentifier": "t_address",
                          "typeString": "address"
                        }
                      ],
                      "id": 6187,
                      "name": "UpdatedImplementation",
                      "nodeType": "Identifier",
                      "overloadedDeclarations": [],
                      "referencedDeclaration": 6152,
                      "src": "1698:21:32",
                      "typeDescriptions": {
                        "typeIdentifier": "t_function_event_nonpayable$_t_address_$returns$__$",
                        "typeString": "function (address)"
                      }
                    },
                    "id": 6189,
                    "isConstant": false,
                    "isLValue": false,
                    "isPure": false,
                    "kind": "functionCall",
                    "lValueRequested": false,
                    "nameLocations": [],
                    "names": [],
                    "nodeType": "FunctionCall",
                    "src": "1698:41:32",
                    "tryCall": false,
                    "typeDescriptions": {
                      "typeIdentifier": "t_tuple$__$",
                      "typeString": "tuple()"
                    }
                  },
                  "id": 6190,
                  "nodeType": "EmitStatement",
                  "src": "1693:46:32"
                }
              ]
            },
            "functionSelector": "025b22bc",
            "id": 6192,
            "implemented": true,
            "kind": "function",
            "modifiers": [
              {
                "id": 6181,
                "kind": "modifierInvocation",
                "modifierName": {
                  "id": 6180,
                  "name": "onlyOwner",
                  "nameLocations": [
                    "1628:9:32"
                  ],
                  "nodeType": "IdentifierPath",
                  "referencedDeclaration": 2424,
                  "src": "1628:9:32"
                },
                "nodeType": "ModifierInvocation",
                "src": "1628:9:32"
              }
            ],
            "name": "updateImplementation",
            "nameLocation": "1572:20:32",
            "nodeType": "FunctionDefinition",
            "parameters": {
              "id": 6179,
              "nodeType": "ParameterList",
              "parameters": [
                {
                  "constant": false,
                  "id": 6178,
                  "mutability": "mutable",
                  "name": "_newImplementation",
                  "nameLocation": "1601:18:32",
                  "nodeType": "VariableDeclaration",
                  "scope": 6192,
                  "src": "1593:26:32",
                  "stateVariable": false,
                  "storageLocation": "default",
                  "typeDescriptions": {
                    "typeIdentifier": "t_address",
                    "typeString": "address"
                  },
                  "typeName": {
                    "id": 6177,
                    "name": "address",
                    "nodeType": "ElementaryTypeName",
                    "src": "1593:7:32",
                    "stateMutability": "nonpayable",
                    "typeDescriptions": {
                      "typeIdentifier": "t_address",
                      "typeString": "address"
                    }
                  },
                  "visibility": "internal"
                }
              ],
              "src": "1592:28:32"
            },
            "returnParameters": {
              "id": 6182,
              "nodeType": "ParameterList",
              "parameters": [],
              "src": "1638:0:32"
            },
            "scope": 6193,
            "src": "1563:183:32",
            "stateMutability": "nonpayable",
            "virtual": false,
            "visibility": "public"
          }
        ],
        "scope": 6194,
        "src": "1173:575:32",
        "usedErrors": []
      }
    ],
    "src": "1093:656:32"
  },
  "compiler": {
    "name": "solc",
    "version": "0.8.17+commit.8df45f5f.Emscripten.clang"
  },
  "networks": {},
  "schemaVersion": "3.4.8",
  "updatedAt": "2022-12-08T12:51:01.363Z",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "owner()": {
        "details": "Returns the address of the current owner."
      },
      "renounceOwnership()": {
        "details": "Leaves the contract without owner. It will not be possible to call `onlyOwner` functions anymore. Can only be called by the current owner. NOTE: Renouncing ownership will leave the contract without an owner, thereby removing any functionality that is only available to the owner."
      },
      "transferOwnership(address)": {
        "details": "Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner."
      }
    },
    "version": 1
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  }
}