{
  "contractName": "TransparentProxy",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "implementationAddress",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        },
        {
          "internalType": "address",
          "name": "adminAddress",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "previousImplementation",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        }
      ],
      "name": "ProxyImplementationUpdated",
      "type": "event"
    },
    {
      "stateMutability": "payable",
      "type": "fallback"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "data",
          "type": "bytes"
        }
      ],
      "name": "changeImplementation",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "changeProxyAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "disableChangeProxyAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "proxyAdmin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "bytecode": "0x608060405234801561001057600080fd5b506040516107b13803806107b18339818101604052606081101561003357600080fd5b81516020830180516040519294929383019291908464010000000082111561005a57600080fd5b90830190602082018581111561006f57600080fd5b825164010000000081118282018810171561008957600080fd5b82525081516020918201929091019080838360005b838110156100b657818101518382015260200161009e565b50505050905090810190601f1680156100e35780820380516001836020036101000a031916815260200191505b506040526020015191506100f99050838361010a565b6101028161022d565b505050610251565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a3815115610228576000836001600160a01b0316836040518082805190602001908083835b602083106101ad5780518252601f19909201916020918201910161018e565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d806000811461020d576040519150601f19603f3d011682016040523d82523d6000602084013e610212565b606091505b5050905080610226573d806000803e806000fd5b505b505050565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610355565b610551806102606000396000f3fe6080604052600436106100435760003560e01c8063037998cc1461005a578063311241711461006f5780633e47158c146100fc5780639f712f2f1461012d57610052565b3661005257610050610160565b005b610050610160565b34801561006657600080fd5b506100506101ab565b34801561007b57600080fd5b506100506004803603604081101561009257600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100bd57600080fd5b8201836020820111156100cf57600080fd5b803590602001918460018302840111640100000000831117156100f157600080fd5b50909250905061021e565b34801561010857600080fd5b50610111610291565b604080516001600160a01b039092168252519081900360200190f35b34801561013957600080fd5b506100506004803603602081101561015057600080fd5b50356001600160a01b03166102ce565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101a1578183f35b8183fd5b50505050565b6101b3610398565b6001600160a01b0316336001600160a01b03161415610214577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61025561021c565b61021c610160565b565b610226610398565b6001600160a01b0316336001600160a01b031614156102845761027f8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bd92505050565b61028c565b61028c610160565b505050565b600061029b610398565b6001600160a01b0316336001600160a01b031614156102c3576102bc610398565b90506102cb565b6102cb610160565b90565b6102d6610398565b6001600160a01b0316336001600160a01b0316141561038d577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610254801561037e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6368616e676541646d696e20686173206265656e2064697361626c6564000000604482015290519081900360640190fd5b610387826104f7565b50610395565b610395610160565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511561028c576000836001600160a01b0316836040518082805190602001908083835b6020831061047e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610441565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146104de576040519150601f19603f3d011682016040523d82523d6000602084013e6104e3565b606091505b50509050806101a5573d806000803e806000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035556fea26469706673582212202965be314a001440e79ef4093053335521ebff3a98abfc05932030837779f8bf64736f6c63430007010033",
  "deployedBytecode": "0x6080604052600436106100435760003560e01c8063037998cc1461005a578063311241711461006f5780633e47158c146100fc5780639f712f2f1461012d57610052565b3661005257610050610160565b005b610050610160565b34801561006657600080fd5b506100506101ab565b34801561007b57600080fd5b506100506004803603604081101561009257600080fd5b6001600160a01b0382351691908101906040810160208201356401000000008111156100bd57600080fd5b8201836020820111156100cf57600080fd5b803590602001918460018302840111640100000000831117156100f157600080fd5b50909250905061021e565b34801561010857600080fd5b50610111610291565b604080516001600160a01b039092168252519081900360200190f35b34801561013957600080fd5b506100506004803603602081101561015057600080fd5b50356001600160a01b03166102ce565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5460003681823780813683855af491503d8082833e8280156101a1578183f35b8183fd5b50505050565b6101b3610398565b6001600160a01b0316336001600160a01b03161415610214577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61025561021c565b61021c610160565b565b610226610398565b6001600160a01b0316336001600160a01b031614156102845761027f8383838080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152506103bd92505050565b61028c565b61028c610160565b505050565b600061029b610398565b6001600160a01b0316336001600160a01b031614156102c3576102bc610398565b90506102cb565b6102cb610160565b90565b6102d6610398565b6001600160a01b0316336001600160a01b0316141561038d577fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d610254801561037e57604080517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6368616e676541646d696e20686173206265656e2064697361626c6564000000604482015290519081900360640190fd5b610387826104f7565b50610395565b610395610160565b50565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc8054908390556040516001600160a01b0380851691908316907f5570d70a002632a7b0b3c9304cc89efb62d8da9eca0dbd7752c83b737906829690600090a381511561028c576000836001600160a01b0316836040518082805190602001908083835b6020831061047e57805182527fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe09092019160209182019101610441565b6001836020036101000a038019825116818451168082178552505050505050905001915050600060405180830381855af49150503d80600081146104de576040519150601f19603f3d011682016040523d82523d6000602084013e6104e3565b606091505b50509050806101a5573d806000803e806000fd5b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035556fea26469706673582212202965be314a001440e79ef4093053335521ebff3a98abfc05932030837779f8bf64736f6c63430007010033",
  "linkReferences": {},
  "deployedLinkReferences": {},
  "metadata": "{\"compiler\":{\"version\":\"0.7.1+commit.f4a555be\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementationAddress\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"adminAddress\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"ProxyImplementationUpdated\",\"type\":\"event\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"changeImplementation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableChangeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"solc_0.7/proxy/TransparentProxy.sol\":\"TransparentProxy\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":2000},\"remappings\":[]},\"sources\":{\"solc_0.7/proxy/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\n// EIP-1967\\nabstract contract Proxy {\\n    // /////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////////\\n\\n    event ProxyImplementationUpdated(\\n        address indexed previousImplementation,\\n        address indexed newImplementation\\n    );\\n\\n    // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n    receive() external payable {\\n        _fallback();\\n    }\\n\\n    fallback() external payable {\\n        _fallback();\\n    }\\n\\n    // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n    function _fallback() internal {\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            let implementationAddress := sload(\\n                0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc\\n            )\\n            calldatacopy(0x0, 0x0, calldatasize())\\n            let success := delegatecall(\\n                gas(),\\n                implementationAddress,\\n                0x0,\\n                calldatasize(),\\n                0,\\n                0\\n            )\\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    function _setImplementation(address newImplementation, bytes memory data)\\n        internal\\n    {\\n        address previousImplementation;\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            previousImplementation := sload(\\n                0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc\\n            )\\n        }\\n\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            sstore(\\n                0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,\\n                newImplementation\\n            )\\n        }\\n\\n        emit ProxyImplementationUpdated(\\n            previousImplementation,\\n            newImplementation\\n        );\\n\\n        if (data.length > 0) {\\n            (bool success, ) = newImplementation.delegatecall(data);\\n            if (!success) {\\n                assembly {\\n                    // This assembly ensure the revert contains the exact string data\\n                    let returnDataSize := returndatasize()\\n                    returndatacopy(0, 0, returnDataSize)\\n                    revert(0, returnDataSize)\\n                }\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x2cfeb2d28a5732bd36fb1e9d91fa00c80dce6ec6f912fb82341630fb2cb9cdeb\",\"license\":\"MIT\"},\"solc_0.7/proxy/TransparentProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.7.0;\\n\\nimport \\\"./Proxy.sol\\\";\\n\\ncontract TransparentProxy is Proxy {\\n    // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n    constructor(\\n        address implementationAddress,\\n        bytes memory data,\\n        address adminAddress\\n    ) {\\n        _setImplementation(implementationAddress, data);\\n        _setAdmin(adminAddress);\\n    }\\n\\n    // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n    function changeImplementation(\\n        address newImplementation,\\n        bytes calldata data\\n    ) external ifAdmin {\\n        _setImplementation(newImplementation, data);\\n    }\\n\\n    function proxyAdmin() external ifAdmin returns (address) {\\n        return _admin();\\n    }\\n\\n    // Transfer of adminship on the other hand is only visible to the admin of the Proxy\\n    function changeProxyAdmin(address newAdmin) external ifAdmin {\\n        uint256 disabled;\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            disabled := sload(\\n                0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6102\\n            )\\n        }\\n        require(disabled == 0, \\\"changeAdmin has been disabled\\\");\\n\\n        _setAdmin(newAdmin);\\n    }\\n\\n    // to be used if EIP-173 needs to be implemented in the implementation contract so that change of admin can be constrained\\n    // in a way that OwnershipTransfered is trigger all the time\\n    function disableChangeProxyAdmin() external ifAdmin {\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            sstore(\\n                0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6102,\\n                0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\\n            )\\n        }\\n    }\\n\\n    // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n    modifier ifAdmin() {\\n        if (msg.sender == _admin()) {\\n            _;\\n        } else {\\n            _fallback();\\n        }\\n    }\\n\\n    // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n    function _admin() internal view returns (address adminAddress) {\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            adminAddress := sload(\\n                0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103\\n            )\\n        }\\n    }\\n\\n    function _setAdmin(address newAdmin) internal {\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            sstore(\\n                0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,\\n                newAdmin\\n            )\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x44e94e41860a2ffd33c4bd73306c7a0f38d989c52825f7641cd914495f48669e\",\"license\":\"MIT\"}},\"version\":1}",
  "contractFilepath": "solc_0.7/proxy/TransparentProxy.sol",
  "methodIdentifiers": {
    "changeImplementation(address,bytes)": "31124171",
    "changeProxyAdmin(address)": "9f712f2f",
    "disableChangeProxyAdmin()": "037998cc",
    "proxyAdmin()": "3e47158c"
  },
  "gasEstimates": {
    "creation": {
      "codeDepositCost": "272200",
      "executionCost": "infinite",
      "totalCost": "infinite"
    },
    "external": {
      "": "infinite",
      "changeImplementation(address,bytes)": "infinite",
      "changeProxyAdmin(address)": "infinite",
      "disableChangeProxyAdmin()": "infinite",
      "proxyAdmin()": "infinite"
    },
    "internal": {
      "_admin()": "815",
      "_setAdmin(address)": "20012"
    }
  },
  "storageLayout": {
    "storage": [],
    "types": null
  },
  "userdoc": {
    "kind": "user",
    "methods": {},
    "version": 1
  },
  "devdoc": {
    "kind": "dev",
    "methods": {},
    "version": 1
  }
}