{
  "address": "0x791590936abB3531c9d54CD10CEC4B14415B0Ba7",
  "abi": [
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "constructor"
    },
    {
      "stateMutability": "payable",
      "type": "fallback"
    },
    {
      "inputs": [],
      "name": "getImplementation",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [],
      "name": "getOwner",
      "outputs": [
        {
          "internalType": "address",
          "name": "",
          "type": "address"
        }
      ],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes",
          "name": "_code",
          "type": "bytes"
        }
      ],
      "name": "setCode",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "address",
          "name": "_owner",
          "type": "address"
        }
      ],
      "name": "setOwner",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "inputs": [
        {
          "internalType": "bytes32",
          "name": "_key",
          "type": "bytes32"
        },
        {
          "internalType": "bytes32",
          "name": "_value",
          "type": "bytes32"
        }
      ],
      "name": "setStorage",
      "outputs": [],
      "stateMutability": "nonpayable",
      "type": "function"
    },
    {
      "stateMutability": "payable",
      "type": "receive"
    }
  ],
  "transactionHash": "0x7ae5dc6ea1589ba4e0188ae83ed14cff0192b6470999d18b11e8874ecb4b1476",
  "receipt": {
    "to": null,
    "from": "0x2d30335B0b807bBa1682C487BaAFD2Ad6da5D675",
    "contractAddress": "0x791590936abB3531c9d54CD10CEC4B14415B0Ba7",
    "transactionIndex": 28,
    "gasUsed": "608986",
    "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
    "blockHash": "0xcfd8a748c690d8d1cdd2f2e73e809c69b63b6d394fbc3244570d5665c69004e3",
    "transactionHash": "0x7ae5dc6ea1589ba4e0188ae83ed14cff0192b6470999d18b11e8874ecb4b1476",
    "logs": [],
    "blockNumber": 8364185,
    "cumulativeGasUsed": "5208129",
    "status": 1,
    "byzantium": true
  },
  "args": [
    "0x2d30335B0b807bBa1682C487BaAFD2Ad6da5D675"
  ],
  "numDeployments": 1,
  "solcInputHash": "46b1d8460586c4660b2379cf0ba282ef",
  "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"stateMutability\":\"payable\",\"type\":\"fallback\"},{\"inputs\":[],\"name\":\"getImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getOwner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_code\",\"type\":\"bytes\"}],\"name\":\"setCode\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_key\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"_value\",\"type\":\"bytes32\"}],\"name\":\"setStorage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}],\"devdoc\":{\"custom:legacy\":\"@title L1ChugSplashProxy\",\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"_owner\":\"Address of the initial contract owner.\"}},\"getImplementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"getOwner()\":{\"returns\":{\"_0\":\"Owner address.\"}},\"setCode(bytes)\":{\"params\":{\"_code\":\"New contract code to run inside this contract.\"}},\"setOwner(address)\":{\"params\":{\"_owner\":\"New owner of the proxy contract.\"}},\"setStorage(bytes32,bytes32)\":{\"params\":{\"_key\":\"Storage key to modify.\",\"_value\":\"New value for the storage key.\"}}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"getImplementation()\":{\"notice\":\"Queries the implementation address. Can only be called by the owner OR by making an         eth_call and setting the \\\"from\\\" address to address(0).\"},\"getOwner()\":{\"notice\":\"Queries the owner of the proxy contract. Can only be called by the owner OR by         making an eth_call and setting the \\\"from\\\" address to address(0).\"},\"setCode(bytes)\":{\"notice\":\"Sets the code that should be running behind this proxy.         Note: This scheme is a bit different from the standard proxy scheme where one would         typically deploy the code separately and then set the implementation address. We're         doing it this way because it gives us a lot more freedom on the client side. Can         only be triggered by the contract owner.\"},\"setOwner(address)\":{\"notice\":\"Changes the owner of the proxy contract. Only callable by the owner.\"},\"setStorage(bytes32,bytes32)\":{\"notice\":\"Modifies some storage slot within the proxy contract. Gives us a lot of power to         perform upgrades in a more transparent way. Only callable by the owner.\"}},\"notice\":\"Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added         functions `setCode` and `setStorage` for changing the code or storage of the contract.         Note for future developers: do NOT make anything in this contract 'public' unless you         know what you're doing. Anything public can potentially have a function signature that         conflicts with a signature attached to the implementation contract. Public functions         SHOULD always have the `proxyCallIfNotOwner` modifier unless there's some *really* good         reason not to have that modifier. And there almost certainly is not a good reason to not         have that modifier. Beware!\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/legacy/L1ChugSplashProxy.sol\":\"L1ChugSplashProxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"none\"},\"optimizer\":{\"enabled\":true,\"runs\":999999},\"remappings\":[\":@openzeppelin/=node_modules/@openzeppelin/\",\":@openzeppelin/contracts-upgradeable/=node_modules/@openzeppelin/contracts-upgradeable/\",\":@openzeppelin/contracts/=node_modules/@openzeppelin/contracts/\",\":@rari-capital/=node_modules/@rari-capital/\",\":@rari-capital/solmate/=node_modules/@rari-capital/solmate/\",\":ds-test/=node_modules/ds-test/src/\",\":forge-std/=node_modules/forge-std/src/\"]},\"sources\":{\"contracts/legacy/L1ChugSplashProxy.sol\":{\"keccak256\":\"0x6ae7bf6ea9ac0e3511ee4cb15d946589da0dd35098ff762c0b2903d064f24875\",\"license\":\"MIT\",\"urls\":[\"bzz-raw://02028d86c1d38563021d5ead5282271ccdf1c03a24f2eaee056ae2157f0554ee\",\"dweb:/ipfs/QmW9urkBBRTmZ8FjL5Y5zWbdnRhPDruxCCLnpr2CTkozKM\"]}},\"version\":1}",
  "bytecode": "[encoded data, 5258 characters]",
  "deployedBytecode": "[encoded data, 4946 characters]",
  "devdoc": {
    "version": 1,
    "kind": "dev",
    "methods": {
      "constructor": {
        "params": {
          "_owner": "Address of the initial contract owner."
        }
      },
      "getImplementation()": {
        "returns": {
          "_0": "Implementation address."
        }
      },
      "getOwner()": {
        "returns": {
          "_0": "Owner address."
        }
      },
      "setCode(bytes)": {
        "params": {
          "_code": "New contract code to run inside this contract."
        }
      },
      "setOwner(address)": {
        "params": {
          "_owner": "New owner of the proxy contract."
        }
      },
      "setStorage(bytes32,bytes32)": {
        "params": {
          "_key": "Storage key to modify.",
          "_value": "New value for the storage key."
        }
      }
    }
  },
  "userdoc": {
    "version": 1,
    "kind": "user",
    "methods": {
      "getImplementation()": {
        "notice": "Queries the implementation address. Can only be called by the owner OR by making an         eth_call and setting the \"from\" address to address(0)."
      },
      "getOwner()": {
        "notice": "Queries the owner of the proxy contract. Can only be called by the owner OR by         making an eth_call and setting the \"from\" address to address(0)."
      },
      "setCode(bytes)": {
        "notice": "Sets the code that should be running behind this proxy.         Note: This scheme is a bit different from the standard proxy scheme where one would         typically deploy the code separately and then set the implementation address. We're         doing it this way because it gives us a lot more freedom on the client side. Can         only be triggered by the contract owner."
      },
      "setOwner(address)": {
        "notice": "Changes the owner of the proxy contract. Only callable by the owner."
      },
      "setStorage(bytes32,bytes32)": {
        "notice": "Modifies some storage slot within the proxy contract. Gives us a lot of power to         perform upgrades in a more transparent way. Only callable by the owner."
      }
    },
    "notice": "Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added         functions `setCode` and `setStorage` for changing the code or storage of the contract.         Note for future developers: do NOT make anything in this contract 'public' unless you         know what you're doing. Anything public can potentially have a function signature that         conflicts with a signature attached to the implementation contract. Public functions         SHOULD always have the `proxyCallIfNotOwner` modifier unless there's some *really* good         reason not to have that modifier. And there almost certainly is not a good reason to not         have that modifier. Beware!"
  }
}