{
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_admin",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": false,
          "internalType": "address",
          "name": "previousAdmin",
          "type": "address"
        },
        {
          "indexed": false,
          "internalType": "address",
          "name": "newAdmin",
          "type": "address"
        }
      ],
      "name": "AdminChanged",
      "type": "event"
    },
    {
      "anonymous": false,
      "inputs": [
        {
          "indexed": true,
          "internalType": "address",
          "name": "implementation",
          "type": "address"
        }
      ],
      "name": "Upgraded",
      "type": "event"
    },
    {
      "stateMutability": "payable",
      "type": "fallback"
    },
    {
      "inputs": [],
      "name": "admin",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_admin",
          "type": "address"
        }
      ],
      "name": "changeAdmin",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "implementation",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_implementation",
          "type": "address"
        }
      ],
      "name": "upgradeTo",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_implementation",
          "type": "address"
        },
        {
          "internalType": "bytes",
          "name": "_data",
          "type": "bytes"
        }
      ],
      "name": "upgradeToAndCall",
      "outputs": [
        {
          "internalType": "bytes",
          "name": "",
          "type": "bytes"
        }
      ],
      "stateMutability": "payable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "address": "0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F",
  "args": [
    "0x189aBAAaa82DfC015A588A7dbaD6F13b1D3485Bc"
  ],
  "bytecode": "[encoded data, 4658 characters]",
  "deployedBytecode": "[encoded data, 4112 characters]",
  "devdoc": {
    "version": 1,
    "kind": "dev",
    "methods": {
      "admin()": {
        "returns": {
          "_0": "Owner address."
        }
      },
      "changeAdmin(address)": {
        "params": {
          "_admin": "New owner of the proxy contract."
        }
      },
      "constructor": {
        "params": {
          "_admin": "Address of the initial contract admin. Admin as the ability to access the               transparent proxy interface."
        }
      },
      "implementation()": {
        "returns": {
          "_0": "Implementation address."
        }
      },
      "upgradeTo(address)": {
        "params": {
          "_implementation": "Address of the implementation contract."
        }
      },
      "upgradeToAndCall(address,bytes)": {
        "params": {
          "_data": "Calldata to delegatecall the new implementation with.",
          "_implementation": "Address of the implementation contract."
        }
      }
    },
    "events": {
      "AdminChanged(address,address)": {
        "params": {
          "newAdmin": "The new owner of the contract",
          "previousAdmin": "The previous owner of the contract"
        }
      },
      "Upgraded(address)": {
        "params": {
          "implementation": "The address of the implementation contract"
        }
      }
    },
    "title": "Proxy"
  },
  "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"previousAdmin\",\"type\":\"address\",\"indexed\":false},{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\",\"indexed\":false}],\"type\":\"event\",\"name\":\"AdminChanged\",\"anonymous\":false},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\",\"indexed\":true}],\"type\":\"event\",\"name\":\"Upgraded\",\"anonymous\":false},{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"admin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_admin\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"changeAdmin\"},{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"implementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}]},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\",\"name\":\"upgradeTo\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"stateMutability\":\"payable\",\"type\":\"function\",\"name\":\"upgradeToAndCall\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}]},{\"inputs\":[],\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"admin()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"changeAdmin(address)\":{\"params\":{\"_admin\":\"New owner of the proxy contract.\"}},\"constructor\":{\"params\":{\"_admin\":\"Address of the initial contract admin. Admin as the ability to access the               transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"Address of the implementation contract.\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"Calldata to delegatecall the new implementation with.\",\"_implementation\":\"Address of the implementation contract.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"admin()\":{\"notice\":\"Gets the owner of the proxy contract.\"},\"changeAdmin(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"constructor\":{\"notice\":\"Sets the initial admin during contract deployment. Admin address is stored at the         EIP-1967 admin storage slot so that accidental storage collision with the         implementation is not possible.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at the given address will execute         when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. Useful to ensure         atomic execution of initialization-based upgrades.\"}},\"version\":1}},\"settings\":{\"remappings\":[\":.ignored_clones-with-immutable-args/=node_modules/.ignored_clones-with-immutable-args/src/\",\":.ignored_forge-std/=node_modules/.ignored_forge-std/src/\",\":@cwia/=lib/clones-with-immutable-args/src/\",\":@openzeppelin/contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/contracts/\",\":@openzeppelin/contracts/=lib/openzeppelin-contracts/contracts/\",\":@rari-capital/solmate/=lib/solmate/\",\":clones-with-immutable-args/=lib/clones-with-immutable-args/src/\",\":ds-test/=lib/forge-std/lib/ds-test/src/\",\":forge-std/=lib/forge-std/src/\",\":openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/\",\":openzeppelin-contracts/=lib/openzeppelin-contracts/\",\":solmate/=lib/solmate/src/\"],\"optimizer\":{\"enabled\":true,\"runs\":999999},\"metadata\":{\"bytecodeHash\":\"none\"},\"compilationTarget\":{\"src/universal/Proxy.sol\":\"Proxy\"},\"libraries\":{}},\"sources\":{\"src/universal/Proxy.sol\":{\"keccak256\":\"0x783aed9ff90b38a9898be5fb18699b3b249f012bc2c33f6537e1ab9f6444478f\",\"urls\":[\"bzz-raw://b119b1b68874f4d92a89cc05a4f0d25da73a959747a81e26739739a52895b844\",\"dweb:/ipfs/QmbKZqMd6CsM7annE7bCXcCi72syJAX3qtuFNPEGMCp13W\"],\"license\":\"MIT\"}},\"version\":1}",
  "numDeployments": 4,
  "receipt": {
    "transactionHash": "0x5c4860af998f0dca2420d76b161bd5f0e051b1f78c2bce5a42fbfb3a755350a6",
    "transactionIndex": "0x6",
    "blockHash": "0xa6d331f0f1bd46d1aa2c3575c353e2b981d69bb858e6c58c4d24d75115986a68",
    "blockNumber": "0x3e1f50",
    "from": "0x18394B52d3Cb931dfA76F63251919D051953413d",
    "to": null,
    "cumulativeGasUsed": "0x4992f0",
    "gasUsed": "0x7feb8",
    "contractAddress": "0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F",
    "logs": [
      {
        "address": "0x90E9c4f8a994a250F6aEfd61CAFb4F2e895D458F",
        "topics": [
          "0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"
        ],
        "data": "0x0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000189abaaaa82dfc015a588a7dbad6f13b1d3485bc",
        "blockHash": "0xa6d331f0f1bd46d1aa2c3575c353e2b981d69bb858e6c58c4d24d75115986a68",
        "blockNumber": "0x3e1f50",
        "transactionHash": "0x5c4860af998f0dca2420d76b161bd5f0e051b1f78c2bce5a42fbfb3a755350a6",
        "transactionIndex": "0x6",
        "logIndex": "0x6",
        "removed": false
      }
    ],
    "status": "0x1",
    "logsBloom": "0x00000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000100000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "type": "0x2",
    "effectiveGasPrice": "0xbec78df7"
  },
  "solcInputHash": "0x0000000000000000000000000000000000000000000000000000000000000000",
  "storageLayout": {
    "storage": [],
    "types": {}
  },
  "transactionHash": "0x5c4860af998f0dca2420d76b161bd5f0e051b1f78c2bce5a42fbfb3a755350a6",
  "userdoc": {
    "version": 1,
    "kind": "user",
    "methods": {
      "admin()": {
        "notice": "Gets the owner of the proxy contract."
      },
      "changeAdmin(address)": {
        "notice": "Changes the owner of the proxy contract. Only callable by the owner."
      },
      "constructor": {
        "notice": "Sets the initial admin during contract deployment. Admin address is stored at the         EIP-1967 admin storage slot so that accidental storage collision with the         implementation is not possible."
      },
      "upgradeTo(address)": {
        "notice": "Set the implementation contract address. The code at the given address will execute         when this contract is called."
      },
      "upgradeToAndCall(address,bytes)": {
        "notice": "Set the implementation and call a function in a single transaction. Useful to ensure         atomic execution of initialization-based upgrades."
      }
    },
    "events": {
      "AdminChanged(address,address)": {
        "notice": "An event that is emitted each time the owner is upgraded. This event is part of the         EIP-1967 specification."
      },
      "Upgraded(address)": {
        "notice": "An event that is emitted each time the implementation is changed. This event is part         of the EIP-1967 specification."
      }
    },
    "notice": "Proxy is a transparent proxy that passes through the call if the caller is the owner or         if the caller is address(0), meaning that the call originated from an off-chain         simulation."
  }
}