{
  "address": "0xFd5851BdE5066Ac84AbA9137F00Ef89BC8777f00",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_ops",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "deployer",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "owner",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "proxy",
          "type": "address"
        }
      ],
      "name": "DeployProxy",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "oldImplementation",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "address",
          "name": "newImplementation",
          "type": "address"
        }
      ],
      "name": "SetImplementation",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        },
        {
          "indexed": true,
          "internalType": "bool",
          "name": "whitelisted",
          "type": "bool"
        }
      ],
      "name": "UpdateWhitelistedImplementation",
      "type": "event"
    },
    {
      "inputs": [],
      "name": "deploy",
      "outputs": [
        {
          "internalType": "address payable",
          "name": "proxy",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "owner",
          "type": "address"
        }
      ],
      "name": "deployFor",
      "outputs": [
        {
          "internalType": "address payable",
          "name": "proxy",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        }
      ],
      "name": "determineProxyAddress",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_account",
          "type": "address"
        }
      ],
      "name": "getProxyOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "implementation",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_implementation",
          "type": "address"
        }
      ],
      "name": "initialize",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "ops",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_proxy",
          "type": "address"
        }
      ],
      "name": "ownerOf",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_newImplementation",
          "type": "address"
        }
      ],
      "name": "setImplementation",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_implementation",
          "type": "address"
        },
        {
          "internalType": "bool",
          "name": "_whitelist",
          "type": "bool"
        }
      ],
      "name": "updateWhitelistedImplementations",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "name": "whitelistedImplementations",
      "outputs": [
        {
          "internalType": "bool",
          "name": "",
          "type": "bool"
        }
      ],
      "stateMutability": "view",
      "type": "function"
    }
  ],
  "transactionHash": "0x896fce45ed2378f323b25a8c040d2b7e9dd5f03a17d22a6e2b7280c5ceba8852",
  "receipt": {
    "to": null,
    "from": "0xF1108379d71ff2A785899F4C36010f841F1Fea04",
    "contractAddress": "0xFd5851BdE5066Ac84AbA9137F00Ef89BC8777f00",
    "transactionIndex": 1,
    "gasUsed": "2228363",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xca286c83c2e96fe59f3a76f165d2016ab27c4a6c7872edb5f6cfdecd427479d4",
    "transactionHash": "0x896fce45ed2378f323b25a8c040d2b7e9dd5f03a17d22a6e2b7280c5ceba8852",
    "logs": [],
    "blockNumber": 853668,
    "cumulativeGasUsed": "2275264",
    "status": 1,
    "byzantium": true
  },
  "args": ["0x2A6C106ae13B558BB9E2Ec64Bd2f1f7BEFF3A5E0"],
  "numDeployments": 1,
  "solcInputHash": "6b8e62dda7b180fb31163b9e8eb5473d",
  "metadata": "{\"compiler\":{\"version\":\"0.8.14+commit.80d49f37\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_ops\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"deployer\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"DeployProxy\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldImplementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newImplementation\",\"type\":\"address\"}],\"name\":\"SetImplementation\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"bool\",\"name\":\"whitelisted\",\"type\":\"bool\"}],\"name\":\"UpdateWhitelistedImplementation\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"deploy\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"deployFor\",\"outputs\":[{\"internalType\":\"address payable\",\"name\":\"proxy\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"determineProxyAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"getProxyOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ops\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_proxy\",\"type\":\"address\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newImplementation\",\"type\":\"address\"}],\"name\":\"setImplementation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"_whitelist\",\"type\":\"bool\"}],\"name\":\"updateWhitelistedImplementations\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"whitelistedImplementations\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"deploy()\":{\"returns\":{\"proxy\":\"Address of deployed proxy.\"}},\"deployFor(address)\":{\"params\":{\"owner\":\"Address to deploy the proxy for.\"},\"returns\":{\"proxy\":\"Address of deployed proxy.\"}},\"determineProxyAddress(address)\":{\"params\":{\"account\":\"Address to determine the proxy address for.\"}},\"getProxyOf(address)\":{\"returns\":{\"_0\":\"address Proxy address owned by account.\",\"_1\":\"bool Whether if proxy is deployed\"}},\"ownerOf(address)\":{\"returns\":{\"_0\":\"address Owner of deployed proxy.\"}}},\"stateVariables\":{\"_ownerOf\":{\"details\":\"track owner of proxy\"},\"_proxyOf\":{\"details\":\"track proxy of user\"},\"whitelistedImplementations\":{\"return\":\"bool Whether if implementation is whitelisted.\",\"returns\":{\"_0\":\"bool Whether if implementation is whitelisted.\"}}},\"version\":1},\"userdoc\":{\"events\":{\"DeployProxy(address,address,address)\":{\"notice\":\"Emitted when an OpsProxy is deployed.\"},\"SetImplementation(address,address)\":{\"notice\":\"Emitted when OpsProxy implementation to be deployed is changed.\"},\"UpdateWhitelistedImplementation(address,bool)\":{\"notice\":\"Emitted when OpsProxy implementation is added or removed from whitelist.\"}},\"kind\":\"user\",\"methods\":{\"deploy()\":{\"notice\":\"Deploys OpsProxy for the msg.sender.\"},\"deployFor(address)\":{\"notice\":\"Deploys OpsProxy for another address.\"},\"determineProxyAddress(address)\":{\"notice\":\"Determines the OpsProxy address when it is not deployed.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/opsProxy/OpsProxyFactory.sol\":\"OpsProxyFactory\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since a proxied contract can't have a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the\\n * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() initializer {}\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n    /**\\n     * @dev Indicates that the contract has been initialized.\\n     */\\n    bool private _initialized;\\n\\n    /**\\n     * @dev Indicates that the contract is in the process of being initialized.\\n     */\\n    bool private _initializing;\\n\\n    /**\\n     * @dev Modifier to protect an initializer function from being invoked twice.\\n     */\\n    modifier initializer() {\\n        // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n        // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the\\n        // contract may have been reentered.\\n        require(_initializing ? _isConstructor() : !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n        bool isTopLevelCall = !_initializing;\\n        if (isTopLevelCall) {\\n            _initializing = true;\\n            _initialized = true;\\n        }\\n\\n        _;\\n\\n        if (isTopLevelCall) {\\n            _initializing = false;\\n        }\\n    }\\n\\n    /**\\n     * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n     * {initializer} modifier, directly or indirectly.\\n     */\\n    modifier onlyInitializing() {\\n        require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n        _;\\n    }\\n\\n    function _isConstructor() private view returns (bool) {\\n        return !AddressUpgradeable.isContract(address(this));\\n    }\\n}\\n\",\"keccak256\":\"0x68861bcc80cacbd498efde75aab6c74a486cc48262660d326c8d7530d9752097\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n    /**\\n     * @dev Returns true if `account` is a contract.\\n     *\\n     * [IMPORTANT]\\n     * ====\\n     * It is unsafe to assume that an address for which this function returns\\n     * false is an externally-owned account (EOA) and not a contract.\\n     *\\n     * Among others, `isContract` will return false for the following\\n     * types of addresses:\\n     *\\n     *  - an externally-owned account\\n     *  - a contract in construction\\n     *  - an address where a contract will be created\\n     *  - an address where a contract lived, but was destroyed\\n     * ====\\n     */\\n    function isContract(address account) internal view returns (bool) {\\n        // This method relies on extcodesize, which returns 0 for contracts in\\n        // construction, since the code is only stored at the end of the\\n        // constructor execution.\\n\\n        uint256 size;\\n        assembly {\\n            size := extcodesize(account)\\n        }\\n        return size > 0;\\n    }\\n\\n    /**\\n     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n     * `recipient`, forwarding all available gas and reverting on errors.\\n     *\\n     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n     * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n     * imposed by `transfer`, making them unable to receive funds via\\n     * `transfer`. {sendValue} removes this limitation.\\n     *\\n     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n     *\\n     * IMPORTANT: because control is transferred to `recipient`, care must be\\n     * taken to not create reentrancy vulnerabilities. Consider using\\n     * {ReentrancyGuard} or the\\n     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n     */\\n    function sendValue(address payable recipient, uint256 amount) internal {\\n        require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n        (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n        require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n    }\\n\\n    /**\\n     * @dev Performs a Solidity function call using a low level `call`. A\\n     * plain `call` is an unsafe replacement for a function call: use this\\n     * function instead.\\n     *\\n     * If `target` reverts with a revert reason, it is bubbled up by this\\n     * function (like regular Solidity function calls).\\n     *\\n     * Returns the raw returned data. To convert to the expected return value,\\n     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n     *\\n     * Requirements:\\n     *\\n     * - `target` must be a contract.\\n     * - calling `target` with `data` must not revert.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n        return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n     * `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, 0, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but also transferring `value` wei to `target`.\\n     *\\n     * Requirements:\\n     *\\n     * - the calling contract must have an ETH balance of at least `value`.\\n     * - the called Solidity function must be `payable`.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value\\n    ) internal returns (bytes memory) {\\n        return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n     * with `errorMessage` as a fallback revert reason when `target` reverts.\\n     *\\n     * _Available since v3.1._\\n     */\\n    function functionCallWithValue(\\n        address target,\\n        bytes memory data,\\n        uint256 value,\\n        string memory errorMessage\\n    ) internal returns (bytes memory) {\\n        require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n        require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.call{value: value}(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n        return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n    }\\n\\n    /**\\n     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n     * but performing a static call.\\n     *\\n     * _Available since v3.3._\\n     */\\n    function functionStaticCall(\\n        address target,\\n        bytes memory data,\\n        string memory errorMessage\\n    ) internal view returns (bytes memory) {\\n        require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n        (bool success, bytes memory returndata) = target.staticcall(data);\\n        return verifyCallResult(success, returndata, errorMessage);\\n    }\\n\\n    /**\\n     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n     * revert reason using the provided one.\\n     *\\n     * _Available since v4.3._\\n     */\\n    function verifyCallResult(\\n        bool success,\\n        bytes memory returndata,\\n        string memory errorMessage\\n    ) internal pure returns (bytes memory) {\\n        if (success) {\\n            return returndata;\\n        } else {\\n            // Look for revert reason and bubble it up if present\\n            if (returndata.length > 0) {\\n                // The easiest way to bubble the revert reason is using memory via assembly\\n\\n                assembly {\\n                    let returndata_size := mload(returndata)\\n                    revert(add(32, returndata), returndata_size)\\n                }\\n            } else {\\n                revert(errorMessage);\\n            }\\n        }\\n    }\\n}\\n\",\"keccak256\":\"0x3f0f878c796dfc7feba6d3c4e3e526c14c7deae8b7bfc71088e3f38fab0d77b3\",\"license\":\"MIT\"},\"contracts/interfaces/IOpsProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.12;\\n\\ninterface IOpsProxyFactory {\\n    /**\\n     * @notice Emitted when an OpsProxy is deployed.\\n     *\\n     * @param deployer Address which initiated the deployment\\n     * @param owner The address which the proxy is for.\\n     * @param proxy Address of deployed proxy.\\n     */\\n    event DeployProxy(\\n        address indexed deployer,\\n        address indexed owner,\\n        address indexed proxy\\n    );\\n\\n    /**\\n     * @notice Emitted when OpsProxy implementation to be deployed is changed.\\n     *\\n     * @param oldImplementation Previous OpsProxy implementation.\\n     * @param newImplementation Current OpsProxy implementation.\\n     */\\n    event SetImplementation(\\n        address indexed oldImplementation,\\n        address indexed newImplementation\\n    );\\n\\n    /**\\n     * @notice Emitted when OpsProxy implementation is added or removed from whitelist.\\n     *\\n     * @param implementation OpsProxy implementation.\\n     * @param whitelisted Added or removed from whitelist.\\n     */\\n    event UpdateWhitelistedImplementation(\\n        address indexed implementation,\\n        bool indexed whitelisted\\n    );\\n\\n    /**\\n     * @notice Deploys OpsProxy for the msg.sender.\\n     *\\n     * @return proxy Address of deployed proxy.\\n     */\\n    function deploy() external returns (address payable proxy);\\n\\n    /**\\n     * @notice Deploys OpsProxy for another address.\\n     *\\n     * @param owner Address to deploy the proxy for.\\n     *\\n     * @return proxy Address of deployed proxy.\\n     */\\n    function deployFor(address owner) external returns (address payable proxy);\\n\\n    /**\\n     * @notice Sets the OpsProxy implementation that will be deployed by OpsProxyFactory.\\n     *\\n     * @param newImplementation New implementation to be set.\\n     */\\n    function setImplementation(address newImplementation) external;\\n\\n    /**\\n     * @notice Add or remove OpsProxy implementation from the whitelist.\\n     *\\n     * @param implementation OpsProxy implementation.\\n     * @param whitelist Added or removed from whitelist.\\n     */\\n    function updateWhitelistedImplementations(\\n        address implementation,\\n        bool whitelist\\n    ) external;\\n\\n    /**\\n     * @notice Determines the OpsProxy address when it is not deployed.\\n     *\\n     * @param account Address to determine the proxy address for.\\n     */\\n    function determineProxyAddress(address account)\\n        external\\n        view\\n        returns (address);\\n\\n    /**\\n     * @return address Proxy address owned by account.\\n     * @return bool Whether if proxy is deployed\\n     */\\n    function getProxyOf(address account) external view returns (address, bool);\\n\\n    /**\\n     * @return address Owner of deployed proxy.\\n     */\\n    function ownerOf(address proxy) external view returns (address);\\n\\n    /**\\n     * @return bool Whether if implementation is whitelisted.\\n     */\\n    function whitelistedImplementations(address implementation)\\n        external\\n        view\\n        returns (bool);\\n}\\n\",\"keccak256\":\"0xf4852a06be6f35a0671cf951f455fb9a58320c0908914c3ab9e62f9d27affe2b\",\"license\":\"MIT\"},\"contracts/opsProxy/OpsProxyFactory.sol\":{\"content\":\"// SPDX-License-Identifier: UNLICENSED\\npragma solidity ^0.8.12;\\n\\nimport {\\n    Initializable\\n} from \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\nimport {EIP173OpsProxy} from \\\"../vendor/proxy/EIP173/EIP173OpsProxy.sol\\\";\\nimport {Proxied} from \\\"../vendor/proxy/EIP173/Proxied.sol\\\";\\nimport {IOpsProxyFactory} from \\\"../interfaces/IOpsProxyFactory.sol\\\";\\n\\n// solhint-disable max-states-count\\ncontract OpsProxyFactory is Initializable, Proxied, IOpsProxyFactory {\\n    address public immutable ops;\\n    address public implementation;\\n    mapping(address => bool) public override whitelistedImplementations;\\n\\n    ///@dev track proxy of user\\n    mapping(address => address) internal _proxyOf;\\n\\n    ///@dev track owner of proxy\\n    mapping(address => address) internal _ownerOf;\\n\\n    modifier onlyOneProxy(address _account) {\\n        require(_proxyOf[_account] == address(0), \\\"OpsProxyFactory: One proxy\\\");\\n        _;\\n    }\\n\\n    modifier notProxy(address _account) {\\n        require(_ownerOf[_account] == address(0), \\\"OpsProxyFactory: No proxy\\\");\\n        _;\\n    }\\n\\n    constructor(address _ops) {\\n        ops = _ops;\\n    }\\n\\n    function initialize(address _implementation) external initializer {\\n        implementation = _implementation;\\n        whitelistedImplementations[_implementation] = true;\\n    }\\n\\n    ///@inheritdoc IOpsProxyFactory\\n    function deploy() external override returns (address payable proxy) {\\n        proxy = deployFor(msg.sender);\\n    }\\n\\n    function setImplementation(address _newImplementation)\\n        external\\n        onlyProxyAdmin\\n    {\\n        address oldImplementation = implementation;\\n        require(\\n            oldImplementation != _newImplementation &&\\n                whitelistedImplementations[_newImplementation],\\n            \\\"OpsProxyFactory: Invalid implementation\\\"\\n        );\\n\\n        implementation = _newImplementation;\\n\\n        emit SetImplementation(oldImplementation, _newImplementation);\\n    }\\n\\n    function updateWhitelistedImplementations(\\n        address _implementation,\\n        bool _whitelist\\n    ) external onlyProxyAdmin {\\n        whitelistedImplementations[_implementation] = _whitelist;\\n\\n        emit UpdateWhitelistedImplementation(_implementation, _whitelist);\\n    }\\n\\n    ///@inheritdoc IOpsProxyFactory\\n    function getProxyOf(address _account)\\n        external\\n        view\\n        override\\n        returns (address, bool)\\n    {\\n        address proxyAddress = _proxyOf[_account];\\n\\n        if (proxyAddress != address(0)) return (proxyAddress, true);\\n\\n        proxyAddress = determineProxyAddress(_account);\\n        return (proxyAddress, false);\\n    }\\n\\n    ///@inheritdoc IOpsProxyFactory\\n    function ownerOf(address _proxy) external view override returns (address) {\\n        return _ownerOf[_proxy];\\n    }\\n\\n    ///@inheritdoc IOpsProxyFactory\\n    function deployFor(address owner)\\n        public\\n        override\\n        onlyOneProxy(owner)\\n        notProxy(owner)\\n        returns (address payable proxy)\\n    {\\n        proxy = _deploy(bytes32(0), _getBytecode(owner));\\n\\n        _proxyOf[owner] = proxy;\\n        _ownerOf[proxy] = owner;\\n\\n        emit DeployProxy(msg.sender, owner, address(proxy));\\n    }\\n\\n    ///@inheritdoc IOpsProxyFactory\\n    function determineProxyAddress(address _account)\\n        public\\n        view\\n        override\\n        returns (address)\\n    {\\n        address proxyAddress = _proxyOf[_account];\\n        if (proxyAddress != address(0)) return proxyAddress;\\n\\n        bytes memory bytecode = _getBytecode(_account);\\n\\n        bytes32 codeHash = keccak256(\\n            abi.encodePacked(\\n                bytes1(0xff),\\n                address(this),\\n                bytes32(0),\\n                keccak256(bytecode)\\n            )\\n        );\\n\\n        return address(uint160(uint256(codeHash)));\\n    }\\n\\n    function _deploy(bytes32 _salt, bytes memory _bytecode)\\n        internal\\n        returns (address payable proxy)\\n    {\\n        assembly {\\n            let endowment := 0\\n            let bytecodeStart := add(_bytecode, 0x20)\\n            let bytecodeLength := mload(_bytecode)\\n            proxy := create2(endowment, bytecodeStart, bytecodeLength, _salt)\\n        }\\n    }\\n\\n    function _getBytecode(address _owner) internal view returns (bytes memory) {\\n        return\\n            abi.encodePacked(\\n                type(EIP173OpsProxy).creationCode,\\n                abi.encode(address(this), implementation, _owner, bytes(\\\"\\\"))\\n            );\\n    }\\n}\\n\",\"keccak256\":\"0xf6c033ab42deffa5ef5c5161fe53fd8b07add3f2bb1d958d5bd93f95934dd4a0\",\"license\":\"UNLICENSED\"},\"contracts/vendor/proxy/EIP173/EIP173OpsProxy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nimport \\\"./Proxy.sol\\\";\\nimport {IOpsProxyFactory} from \\\"../../../interfaces/IOpsProxyFactory.sol\\\";\\n\\ninterface ERC165 {\\n    function supportsInterface(bytes4 id) external view returns (bool);\\n}\\n\\n/**\\n * @notice Proxy implementing EIP173 for ownership management.\\n * @notice This is used for OpsProxy.\\n *\\n * @dev 1. custom receive can be set in implementation.\\n * @dev 2. transferProxyAdmin removed.\\n * @dev 3. implementation can only be set to those whitelisted on OpsProxyFactory.\\n */\\ncontract EIP173OpsProxy is Proxy {\\n    // ////////////////////////// STATES ///////////////////////////////////////////////////////////////////////\\n    IOpsProxyFactory public immutable opsProxyFactory;\\n\\n    // ////////////////////////// EVENTS ///////////////////////////////////////////////////////////////////////\\n\\n    event ProxyAdminTransferred(\\n        address indexed previousAdmin,\\n        address indexed newAdmin\\n    );\\n\\n    // /////////////////////// MODIFIERS //////////////////////////////////////////////////////////////////////\\n    modifier onlyWhitelistedImplementation(address _implementation) {\\n        require(\\n            opsProxyFactory.whitelistedImplementations(_implementation),\\n            \\\"Implementation not whitelisted\\\"\\n        );\\n        _;\\n    }\\n\\n    // /////////////////////// FALLBACKS //////////////////////////////////////////////////////////////////////\\n    receive() external payable override {\\n        _fallback();\\n    }\\n\\n    // /////////////////////// CONSTRUCTOR //////////////////////////////////////////////////////////////////////\\n\\n    constructor(\\n        address _opsProxyFactory,\\n        address implementationAddress,\\n        address adminAddress,\\n        bytes memory data\\n    ) payable {\\n        opsProxyFactory = IOpsProxyFactory(_opsProxyFactory);\\n        _setImplementation(implementationAddress, data);\\n        _setProxyAdmin(adminAddress);\\n    }\\n\\n    // ///////////////////// EXTERNAL ///////////////////////////////////////////////////////////////////////////\\n\\n    function proxyAdmin() external view returns (address) {\\n        return _proxyAdmin();\\n    }\\n\\n    function supportsInterface(bytes4 id) external view returns (bool) {\\n        if (id == 0x01ffc9a7 || id == 0x7f5828d0) {\\n            return true;\\n        }\\n        if (id == 0xFFFFFFFF) {\\n            return false;\\n        }\\n\\n        ERC165 implementation;\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            implementation := sload(\\n                0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc\\n            )\\n        }\\n\\n        // Technically this is not standard compliant as ERC-165 require 30,000 gas which that call cannot ensure\\n        // because it is itself inside `supportsInterface` that might only get 30,000 gas.\\n        // In practise this is unlikely to be an issue.\\n        try implementation.supportsInterface(id) returns (bool support) {\\n            return support;\\n        } catch {\\n            return false;\\n        }\\n    }\\n\\n    function upgradeTo(address newImplementation)\\n        external\\n        onlyProxyAdmin\\n        onlyWhitelistedImplementation(newImplementation)\\n    {\\n        _setImplementation(newImplementation, \\\"\\\");\\n    }\\n\\n    function upgradeToAndCall(address newImplementation, bytes calldata data)\\n        external\\n        payable\\n        onlyProxyAdmin\\n        onlyWhitelistedImplementation(newImplementation)\\n    {\\n        _setImplementation(newImplementation, data);\\n    }\\n\\n    // /////////////////////// MODIFIERS ////////////////////////////////////////////////////////////////////////\\n\\n    modifier onlyProxyAdmin() {\\n        require(msg.sender == _proxyAdmin(), \\\"NOT_AUTHORIZED\\\");\\n        _;\\n    }\\n\\n    // ///////////////////////// INTERNAL //////////////////////////////////////////////////////////////////////\\n\\n    function _proxyAdmin() 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 _setProxyAdmin(address newAdmin) internal {\\n        address previousAdmin = _proxyAdmin();\\n        // solhint-disable-next-line security/no-inline-assembly\\n        assembly {\\n            sstore(\\n                0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,\\n                newAdmin\\n            )\\n        }\\n        emit ProxyAdminTransferred(previousAdmin, newAdmin);\\n    }\\n}\\n\",\"keccak256\":\"0x1e31c6fcde4bc9000918f09bd3002cd347c8b65e2a1a9b69f63b9b9cf61643fe\",\"license\":\"GPL-3.0\"},\"contracts/vendor/proxy/EIP173/Proxied.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\n\\nabstract contract Proxied {\\n    /// @notice to be used by initialisation / postUpgrade function so that only the proxy's admin can execute them\\n    /// It also allows these functions to be called inside a contructor\\n    /// even if the contract is meant to be used without proxy\\n    modifier proxied() {\\n        address proxyAdminAddress = _proxyAdmin();\\n        // With hardhat-deploy proxies\\n        // the proxyAdminAddress is zero only for the implementation contract\\n        // if the implementation contract want to be used as a standalone/immutable contract\\n        // it simply has to execute the `proxied` function\\n        // This ensure the proxyAdminAddress is never zero post deployment\\n        // And allow you to keep the same code for both proxied contract and immutable contract\\n        if (proxyAdminAddress == address(0)) {\\n            // ensure can not be called twice when used outside of proxy : no admin\\n            // solhint-disable-next-line security/no-inline-assembly\\n            assembly {\\n                sstore(\\n                    0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103,\\n                    0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF\\n                )\\n            }\\n        } else {\\n            require(msg.sender == proxyAdminAddress);\\n        }\\n        _;\\n    }\\n\\n    modifier onlyProxyAdmin() {\\n        require(msg.sender == _proxyAdmin(), \\\"NOT_AUTHORIZED\\\");\\n        _;\\n    }\\n\\n    function _proxyAdmin() 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\",\"keccak256\":\"0x428ced1961d42c505a3e49d90498f92f4b0df8537e5ffa59f14ba375d99150a1\",\"license\":\"GPL-3.0\"},\"contracts/vendor/proxy/EIP173/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: GPL-3.0\\npragma solidity ^0.8.12;\\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    // prettier-ignore\\n    receive() external payable virtual {\\n        revert(\\\"ETHER_REJECTED\\\"); // explicit reject by default\\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\":\"0xb5e3e1c4cab8a5e3bd968f51c201a11e651f62b47aa78a4e3e0b7508be268d35\",\"license\":\"GPL-3.0\"}},\"version\":1}",
  "bytecode": "[encoded data, 20812 characters]",
  "deployedBytecode": "[encoded data, 20216 characters]",
  "devdoc": {
    "kind": "dev",
    "methods": {
      "deploy()": {
        "returns": {
          "proxy": "Address of deployed proxy."
        }
      },
      "deployFor(address)": {
        "params": {
          "owner": "Address to deploy the proxy for."
        },
        "returns": {
          "proxy": "Address of deployed proxy."
        }
      },
      "determineProxyAddress(address)": {
        "params": {
          "account": "Address to determine the proxy address for."
        }
      },
      "getProxyOf(address)": {
        "returns": {
          "_0": "address Proxy address owned by account.",
          "_1": "bool Whether if proxy is deployed"
        }
      },
      "ownerOf(address)": {
        "returns": {
          "_0": "address Owner of deployed proxy."
        }
      }
    },
    "stateVariables": {
      "_ownerOf": {
        "details": "track owner of proxy"
      },
      "_proxyOf": {
        "details": "track proxy of user"
      },
      "whitelistedImplementations": {
        "return": "bool Whether if implementation is whitelisted.",
        "returns": {
          "_0": "bool Whether if implementation is whitelisted."
        }
      }
    },
    "version": 1
  },
  "userdoc": {
    "events": {
      "DeployProxy(address,address,address)": {
        "notice": "Emitted when an OpsProxy is deployed."
      },
      "SetImplementation(address,address)": {
        "notice": "Emitted when OpsProxy implementation to be deployed is changed."
      },
      "UpdateWhitelistedImplementation(address,bool)": {
        "notice": "Emitted when OpsProxy implementation is added or removed from whitelist."
      }
    },
    "kind": "user",
    "methods": {
      "deploy()": {
        "notice": "Deploys OpsProxy for the msg.sender."
      },
      "deployFor(address)": {
        "notice": "Deploys OpsProxy for another address."
      },
      "determineProxyAddress(address)": {
        "notice": "Determines the OpsProxy address when it is not deployed."
      }
    },
    "version": 1
  },
  "storageLayout": {
    "storage": [
      {
        "astId": 6,
        "contract": "contracts/opsProxy/OpsProxyFactory.sol:OpsProxyFactory",
        "label": "_initialized",
        "offset": 0,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 9,
        "contract": "contracts/opsProxy/OpsProxyFactory.sol:OpsProxyFactory",
        "label": "_initializing",
        "offset": 1,
        "slot": "0",
        "type": "t_bool"
      },
      {
        "astId": 6380,
        "contract": "contracts/opsProxy/OpsProxyFactory.sol:OpsProxyFactory",
        "label": "implementation",
        "offset": 2,
        "slot": "0",
        "type": "t_address"
      },
      {
        "astId": 6385,
        "contract": "contracts/opsProxy/OpsProxyFactory.sol:OpsProxyFactory",
        "label": "whitelistedImplementations",
        "offset": 0,
        "slot": "1",
        "type": "t_mapping(t_address,t_bool)"
      },
      {
        "astId": 6390,
        "contract": "contracts/opsProxy/OpsProxyFactory.sol:OpsProxyFactory",
        "label": "_proxyOf",
        "offset": 0,
        "slot": "2",
        "type": "t_mapping(t_address,t_address)"
      },
      {
        "astId": 6395,
        "contract": "contracts/opsProxy/OpsProxyFactory.sol:OpsProxyFactory",
        "label": "_ownerOf",
        "offset": 0,
        "slot": "3",
        "type": "t_mapping(t_address,t_address)"
      }
    ],
    "types": {
      "t_address": {
        "encoding": "inplace",
        "label": "address",
        "numberOfBytes": "20"
      },
      "t_bool": {
        "encoding": "inplace",
        "label": "bool",
        "numberOfBytes": "1"
      },
      "t_mapping(t_address,t_address)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => address)",
        "numberOfBytes": "32",
        "value": "t_address"
      },
      "t_mapping(t_address,t_bool)": {
        "encoding": "mapping",
        "key": "t_address",
        "label": "mapping(address => bool)",
        "numberOfBytes": "32",
        "value": "t_bool"
      }
    }
  }
}
