Commit 9aa8049c authored by smartcontracts's avatar smartcontracts Committed by GitHub

feat(ctp): deploy NFT bridge to Kovan (#2791)

Adds deployment artifacts for our Kovan deployment of the NFT bridge and
all related proxy contracts. Also includes an update to
contracts-bedrock to properly export contract sources.
Co-authored-by: default avatarmergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
parent f23bae0b
---
'@eth-optimism/contracts-periphery': patch
---
Deploy NFT bridge contracts
---
'@eth-optimism/contracts-bedrock': patch
---
Have contracts-bedrock properly include contract sources in npm package
import { ethers } from 'ethers' import { ethers } from 'ethers'
import { HardhatUserConfig, task, subtask } from 'hardhat/config' import { HardhatUserConfig, task, subtask } from 'hardhat/config'
import { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } from 'hardhat/builtin-tasks/task-names' import { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } from 'hardhat/builtin-tasks/task-names'
// Hardhat plugins
import '@nomiclabs/hardhat-waffle' import '@nomiclabs/hardhat-waffle'
import '@typechain/hardhat' import '@typechain/hardhat'
import 'solidity-coverage' import 'solidity-coverage'
...@@ -8,6 +10,7 @@ import 'hardhat-deploy' ...@@ -8,6 +10,7 @@ import 'hardhat-deploy'
import '@foundry-rs/hardhat-forge' import '@foundry-rs/hardhat-forge'
import '@eth-optimism/hardhat-deploy-config' import '@eth-optimism/hardhat-deploy-config'
// Hardhat tasks
import './tasks/deposits' import './tasks/deposits'
subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction( subtask(TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS).setAction(
......
...@@ -10,7 +10,8 @@ ...@@ -10,7 +10,8 @@
"dist/**/*.d.ts", "dist/**/*.d.ts",
"dist/types/*.ts", "dist/types/*.ts",
"artifacts/src/**/*.json", "artifacts/src/**/*.json",
"deployments/**/*.json" "deployments/**/*.json",
"contracts/**/*.sol"
], ],
"scripts": { "scripts": {
"build:forge": "forge build", "build:forge": "forge build",
...@@ -33,26 +34,25 @@ ...@@ -33,26 +34,25 @@
"@eth-optimism/core-utils": "^0.8.7", "@eth-optimism/core-utils": "^0.8.7",
"@openzeppelin/contracts": "^4.5.0", "@openzeppelin/contracts": "^4.5.0",
"@openzeppelin/contracts-upgradeable": "^4.5.2", "@openzeppelin/contracts-upgradeable": "^4.5.2",
"ethers": "^5.6.8",
"hardhat": "^2.9.6",
"@rari-capital/solmate": "https://github.com/rari-capital/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc", "@rari-capital/solmate": "https://github.com/rari-capital/solmate.git#8f9b23f8838670afda0fd8983f2c41e8037ae6bc",
"ds-test": "https://github.com/dapphub/ds-test.git#9310e879db8ba3ea6d5c6489a579118fd264a3f5", "ds-test": "https://github.com/dapphub/ds-test.git#9310e879db8ba3ea6d5c6489a579118fd264a3f5",
"ethers": "^5.6.8",
"forge-std": "https://github.com/foundry-rs/forge-std.git#564510058ab3db01577b772c275e081e678373f2", "forge-std": "https://github.com/foundry-rs/forge-std.git#564510058ab3db01577b772c275e081e678373f2",
"hardhat": "^2.9.6",
"merkle-patricia-tree": "^4.2.4", "merkle-patricia-tree": "^4.2.4",
"rlp": "^2.2.7" "rlp": "^2.2.7"
}, },
"devDependencies": { "devDependencies": {
"@foundry-rs/hardhat-forge": "^0.1.7",
"command-exists": "1.2.9",
"@eth-optimism/hardhat-deploy-config": "^0.2.0", "@eth-optimism/hardhat-deploy-config": "^0.2.0",
"@foundry-rs/hardhat-forge": "^0.1.7",
"@nomiclabs/hardhat-ethers": "^2.0.0", "@nomiclabs/hardhat-ethers": "^2.0.0",
"@nomiclabs/hardhat-etherscan": "^2.1.3",
"@nomiclabs/hardhat-waffle": "^2.0.0", "@nomiclabs/hardhat-waffle": "^2.0.0",
"@typechain/ethers-v5": "^7.0.1", "@typechain/ethers-v5": "^7.0.1",
"@typechain/hardhat": "^2.3.0", "@typechain/hardhat": "^2.3.0",
"@typescript-eslint/eslint-plugin": "^5.26.0", "@typescript-eslint/eslint-plugin": "^5.26.0",
"@typescript-eslint/parser": "^4.29.1", "@typescript-eslint/parser": "^4.29.1",
"chai": "^4.2.0", "chai": "^4.2.0",
"command-exists": "1.2.9",
"dotenv": "^16.0.0", "dotenv": "^16.0.0",
"ethereum-waffle": "^3.0.0", "ethereum-waffle": "^3.0.0",
"ethers": "^5.6.8", "ethers": "^5.6.8",
......
ignores: [ ignores: [
"@eth-optimism/contracts-bedrock",
"@openzeppelin/contracts", "@openzeppelin/contracts",
"@openzeppelin/contracts-upgradeable", "@openzeppelin/contracts-upgradeable",
"@rari-capital/solmate", "@rari-capital/solmate",
......
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import { ProxyAdmin } from "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol";
import { Proxy } from "@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol";
/**
* Just exists so we can compile external contracts.
*/
contract ExternalContractCompiler {
}
...@@ -38,7 +38,7 @@ contract OptimismMintableERC721Factory is OwnableUpgradeable { ...@@ -38,7 +38,7 @@ contract OptimismMintableERC721Factory is OwnableUpgradeable {
* @param _bridge Address of the ERC721 bridge on this network. * @param _bridge Address of the ERC721 bridge on this network.
*/ */
constructor(address _bridge) { constructor(address _bridge) {
intialize(_bridge); initialize(_bridge);
} }
/** /**
...@@ -46,7 +46,7 @@ contract OptimismMintableERC721Factory is OwnableUpgradeable { ...@@ -46,7 +46,7 @@ contract OptimismMintableERC721Factory is OwnableUpgradeable {
* *
* @param _bridge Address of the ERC721 bridge on this network. * @param _bridge Address of the ERC721 bridge on this network.
*/ */
function intialize(address _bridge) public reinitializer(VERSION) { function initialize(address _bridge) public reinitializer(VERSION) {
bridge = _bridge; bridge = _bridge;
// Initialize upgradable OZ contracts // Initialize upgradable OZ contracts
......
...@@ -4,7 +4,10 @@ import { DeployFunction } from 'hardhat-deploy/dist/types' ...@@ -4,7 +4,10 @@ import { DeployFunction } from 'hardhat-deploy/dist/types'
const deployFn: DeployFunction = async (hre) => { const deployFn: DeployFunction = async (hre) => {
const { deployer } = await hre.getNamedAccounts() const { deployer } = await hre.getNamedAccounts()
const { deploy } = await hre.deployments.deterministic('ProxyAdmin', { const { deploy } = await hre.deployments.deterministic(
'PeripheryProxyAdmin',
{
contract: 'ProxyAdmin',
salt: hre.ethers.utils.solidityKeccak256( salt: hre.ethers.utils.solidityKeccak256(
['string'], ['string'],
['PeripheryProxyAdmin'] ['PeripheryProxyAdmin']
...@@ -12,7 +15,8 @@ const deployFn: DeployFunction = async (hre) => { ...@@ -12,7 +15,8 @@ const deployFn: DeployFunction = async (hre) => {
from: deployer, from: deployer,
args: [hre.deployConfig.ddd], args: [hre.deployConfig.ddd],
log: true, log: true,
}) }
)
await deploy() await deploy()
} }
......
...@@ -4,7 +4,10 @@ import { DeployFunction } from 'hardhat-deploy/dist/types' ...@@ -4,7 +4,10 @@ import { DeployFunction } from 'hardhat-deploy/dist/types'
const deployFn: DeployFunction = async (hre) => { const deployFn: DeployFunction = async (hre) => {
const { deployer } = await hre.getNamedAccounts() const { deployer } = await hre.getNamedAccounts()
const { deploy } = await hre.deployments.deterministic('Proxy', { const { deploy } = await hre.deployments.deterministic(
'L1ERC721BridgeProxy',
{
contract: 'Proxy',
salt: hre.ethers.utils.solidityKeccak256( salt: hre.ethers.utils.solidityKeccak256(
['string'], ['string'],
['L1ERC721BridgeProxy'] ['L1ERC721BridgeProxy']
...@@ -12,7 +15,8 @@ const deployFn: DeployFunction = async (hre) => { ...@@ -12,7 +15,8 @@ const deployFn: DeployFunction = async (hre) => {
from: deployer, from: deployer,
args: [hre.deployConfig.ddd], args: [hre.deployConfig.ddd],
log: true, log: true,
}) }
)
await deploy() await deploy()
} }
......
...@@ -4,7 +4,10 @@ import { DeployFunction } from 'hardhat-deploy/dist/types' ...@@ -4,7 +4,10 @@ import { DeployFunction } from 'hardhat-deploy/dist/types'
const deployFn: DeployFunction = async (hre) => { const deployFn: DeployFunction = async (hre) => {
const { deployer } = await hre.getNamedAccounts() const { deployer } = await hre.getNamedAccounts()
const { deploy } = await hre.deployments.deterministic('Proxy', { const { deploy } = await hre.deployments.deterministic(
'L2ERC721BridgeProxy',
{
contract: 'Proxy',
salt: hre.ethers.utils.solidityKeccak256( salt: hre.ethers.utils.solidityKeccak256(
['string'], ['string'],
['L2ERC721BridgeProxy'] ['L2ERC721BridgeProxy']
...@@ -12,7 +15,8 @@ const deployFn: DeployFunction = async (hre) => { ...@@ -12,7 +15,8 @@ const deployFn: DeployFunction = async (hre) => {
from: deployer, from: deployer,
args: [hre.deployConfig.ddd], args: [hre.deployConfig.ddd],
log: true, log: true,
}) }
)
await deploy() await deploy()
} }
......
...@@ -4,7 +4,10 @@ import { DeployFunction } from 'hardhat-deploy/dist/types' ...@@ -4,7 +4,10 @@ import { DeployFunction } from 'hardhat-deploy/dist/types'
const deployFn: DeployFunction = async (hre) => { const deployFn: DeployFunction = async (hre) => {
const { deployer } = await hre.getNamedAccounts() const { deployer } = await hre.getNamedAccounts()
const { deploy } = await hre.deployments.deterministic('Proxy', { const { deploy } = await hre.deployments.deterministic(
'OptimismMintableERC721FactoryProxy',
{
contract: 'Proxy',
salt: hre.ethers.utils.solidityKeccak256( salt: hre.ethers.utils.solidityKeccak256(
['string'], ['string'],
['OptimismMintableERC721FactoryProxy'] ['OptimismMintableERC721FactoryProxy']
...@@ -12,7 +15,8 @@ const deployFn: DeployFunction = async (hre) => { ...@@ -12,7 +15,8 @@ const deployFn: DeployFunction = async (hre) => {
from: deployer, from: deployer,
args: [hre.deployConfig.ddd], args: [hre.deployConfig.ddd],
log: true, log: true,
}) }
)
await deploy() await deploy()
} }
......
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"address": "0x306476D52B5872628B4CD204E9ffFBEfd5ED42B0",
"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"
}
],
"transactionHash": "0x8525db2ec51afbdfb69020761c677776c0d9cbdd6629285c12bcec1aa4a8f1f5",
"receipt": {
"to": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
"from": "0xc37f6a6c4AB335E20d10F034B90386E2fb70bbF5",
"contractAddress": null,
"transactionIndex": 4,
"gasUsed": "502333",
"logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000",
"blockHash": "0x1813a0038fc8d92e0a5054e4be482919e73d6268ff260b59335470ebf5ef198d",
"transactionHash": "0x8525db2ec51afbdfb69020761c677776c0d9cbdd6629285c12bcec1aa4a8f1f5",
"logs": [
{
"transactionIndex": 4,
"blockNumber": 32196103,
"transactionHash": "0x8525db2ec51afbdfb69020761c677776c0d9cbdd6629285c12bcec1aa4a8f1f5",
"address": "0x306476D52B5872628B4CD204E9ffFBEfd5ED42B0",
"topics": [
"0x7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f"
],
"data": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000009c6373de60c2d3297b18a8f964618ac46e011b58",
"logIndex": 1,
"blockHash": "0x1813a0038fc8d92e0a5054e4be482919e73d6268ff260b59335470ebf5ef198d"
}
],
"blockNumber": 32196103,
"cumulativeGasUsed": "625043",
"status": 1,
"byzantium": true
},
"args": [
"0x9C6373dE60c2D3297b18A8f964618ac46E011B58"
],
"numDeployments": 1,
"solcInputHash": "9bf33bb642648b258386a9c465b5d346",
"metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"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\"}],\"devdoc\":{\"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\"}}},\"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 owner. The owner has the ability to access the transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"The address of the implementation contract\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"The calldata to delegatecall the new implementation with\",\"_implementation\":\"The address of the implementation contract\"}}},\"title\":\"Proxy\",\"version\":1},\"userdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"An event that is emitted each time the owner is upgraded. This event is part of the EIP 1967 spec.\"},\"Upgraded(address)\":{\"notice\":\"An event that is emitted each time the implementation is changed. This event is part of the EIP 1967 spec.\"}},\"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\":\"set the initial owner during contract deployment. The owner is stored at the eip1967 owner storage slot so that storage collision with the implementation is not possible.\"},\"implementation()\":{\"notice\":\"Queries the implementation address.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at this address will execute when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. This is useful to ensure atomic `initialize()` based upgrades.\"}},\"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 offchain simulation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Proxy\\n * @notice Proxy is a transparent proxy that passes through the call\\n * if the caller is the owner or if the caller is `address(0)`,\\n * meaning that the call originated from an offchain simulation.\\n */\\ncontract Proxy {\\n /**\\n * @notice An event that is emitted each time the implementation is changed.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param implementation The address of the implementation contract\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @notice An event that is emitted each time the owner is upgraded.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param previousAdmin The previous owner of the contract\\n * @param newAdmin The new owner of the contract\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @notice The storage slot that holds the address of the implementation.\\n * bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n */\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @notice The storage slot that holds the address of the owner.\\n * bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n */\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @notice set the initial owner during contract deployment. The\\n * owner is stored at the eip1967 owner storage slot so that\\n * storage collision with the implementation is not possible.\\n *\\n * @param _admin Address of the initial contract owner. The owner has\\n * the ability to access the transparent proxy interface.\\n */\\n constructor(address _admin) {\\n _changeAdmin(_admin);\\n }\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /**\\n * @notice A modifier that reverts if not called by the owner\\n * or by `address(0)` to allow `eth_call` to interact\\n * with the proxy without needing to use low level storage\\n * inspection. It is assumed that nobody controls the private\\n * key for `address(0)`.\\n */\\n modifier proxyCallIfNotAdmin() {\\n if (msg.sender == _getAdmin() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /**\\n * @notice Set the implementation contract address. The code at this\\n * address will execute when this contract is called.\\n *\\n * @param _implementation The address of the implementation contract\\n */\\n function upgradeTo(address _implementation) external proxyCallIfNotAdmin {\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * @notice Set the implementation and call a function in a single\\n * transaction. This is useful to ensure atomic `initialize()`\\n * based upgrades.\\n *\\n * @param _implementation The address of the implementation contract\\n * @param _data The calldata to delegatecall the new\\n * implementation with\\n */\\n function upgradeToAndCall(address _implementation, bytes calldata _data)\\n external\\n payable\\n proxyCallIfNotAdmin\\n returns (bytes memory)\\n {\\n _setImplementation(_implementation);\\n (bool success, bytes memory returndata) = _implementation.delegatecall(_data);\\n require(success);\\n return returndata;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract. Only callable by the owner.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function changeAdmin(address _admin) external proxyCallIfNotAdmin {\\n _changeAdmin(_admin);\\n }\\n\\n /**\\n * @notice Gets the owner of the proxy contract.\\n *\\n * @return Owner address.\\n */\\n function admin() external proxyCallIfNotAdmin returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return Implementation address.\\n */\\n function implementation() external proxyCallIfNotAdmin returns (address) {\\n return _getImplementation();\\n }\\n\\n /**\\n * @notice Sets the implementation address.\\n *\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n emit Upgraded(_implementation);\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function _changeAdmin(address _admin) internal {\\n address previous = _getAdmin();\\n assembly {\\n sstore(OWNER_KEY, _admin)\\n }\\n emit AdminChanged(previous, _admin);\\n }\\n\\n /**\\n * @notice Queries the owner of the proxy contract.\\n *\\n * @return owner address.\\n */\\n function _getAdmin() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * @notice Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"Proxy: implementation not initialized\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2a6719fd9a11adf0efba0243e5c68d56b255296b84cc82bd39326c902e055077\",\"license\":\"MIT\"}},\"version\":1}",
"bytecode": "0x608060405234801561001057600080fd5b506040516108ac3803806108ac83398101604081905261002f916100b2565b6100388161003e565b506100e2565b600061005660008051602061088c8339815191525490565b60008051602061088c833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b61079b806100f16000396000f3fe60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146100ad5780638f283970146100e7578063f851a440146101075761005a565b80633659cfe6146100645780634f1ef28614610084575b61006261011c565b005b34801561007057600080fd5b5061006261007f366004610644565b610212565b61009761009236600461065f565b610284565b6040516100a491906106e2565b60405180910390f35b3480156100b957600080fd5b506100c2610384565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a4565b3480156100f357600080fd5b50610062610102366004610644565b61041b565b34801561011357600080fd5b506100c2610482565b60006101467f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166101ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b3660008037600080366000845af43d6000803e8061020c573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061026b575033155b1561027c576102798161050e565b50565b61027961011c565b60606102ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102e5575033155b15610375576102f38461050e565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161031d929190610755565b600060405180830381855af49150503d8060008114610358576040519150601f19603f3d011682016040523d82523d6000602084013e61035d565b606091505b50915091508161036c57600080fd5b915061037d9050565b61037d61011c565b9392505050565b60006103ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103e5575033155b1561041057507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b61041861011c565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610474575033155b1561027c5761027981610576565b60006104ac7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104e3575033155b1561041057507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006105a07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063f57600080fd5b919050565b60006020828403121561065657600080fd5b61037d8261061b565b60008060006040848603121561067457600080fd5b61067d8461061b565b9250602084013567ffffffffffffffff8082111561069a57600080fd5b818601915086601f8301126106ae57600080fd5b8135818111156106bd57600080fd5b8760208285010111156106cf57600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b8181101561070f578581018301518582016040015282016106f3565b81811115610721576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea264697066735822122002cf23bcc281eec5c701686c2374a3972d766187632ccdd7ca1fe3d13cb4866264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
"deployedBytecode": "0x60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146100ad5780638f283970146100e7578063f851a440146101075761005a565b80633659cfe6146100645780634f1ef28614610084575b61006261011c565b005b34801561007057600080fd5b5061006261007f366004610644565b610212565b61009761009236600461065f565b610284565b6040516100a491906106e2565b60405180910390f35b3480156100b957600080fd5b506100c2610384565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a4565b3480156100f357600080fd5b50610062610102366004610644565b61041b565b34801561011357600080fd5b506100c2610482565b60006101467f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166101ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b3660008037600080366000845af43d6000803e8061020c573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061026b575033155b1561027c576102798161050e565b50565b61027961011c565b60606102ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102e5575033155b15610375576102f38461050e565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161031d929190610755565b600060405180830381855af49150503d8060008114610358576040519150601f19603f3d011682016040523d82523d6000602084013e61035d565b606091505b50915091508161036c57600080fd5b915061037d9050565b61037d61011c565b9392505050565b60006103ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103e5575033155b1561041057507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b61041861011c565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610474575033155b1561027c5761027981610576565b60006104ac7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104e3575033155b1561041057507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006105a07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063f57600080fd5b919050565b60006020828403121561065657600080fd5b61037d8261061b565b60008060006040848603121561067457600080fd5b61067d8461061b565b9250602084013567ffffffffffffffff8082111561069a57600080fd5b818601915086601f8301126106ae57600080fd5b8135818111156106bd57600080fd5b8760208285010111156106cf57600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b8181101561070f578581018301518582016040015282016106f3565b81811115610721576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea264697066735822122002cf23bcc281eec5c701686c2374a3972d766187632ccdd7ca1fe3d13cb4866264736f6c63430008090033",
"devdoc": {
"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"
}
}
},
"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 owner. The owner has the ability to access the transparent proxy interface."
}
},
"implementation()": {
"returns": {
"_0": "Implementation address."
}
},
"upgradeTo(address)": {
"params": {
"_implementation": "The address of the implementation contract"
}
},
"upgradeToAndCall(address,bytes)": {
"params": {
"_data": "The calldata to delegatecall the new implementation with",
"_implementation": "The address of the implementation contract"
}
}
},
"title": "Proxy",
"version": 1
},
"userdoc": {
"events": {
"AdminChanged(address,address)": {
"notice": "An event that is emitted each time the owner is upgraded. This event is part of the EIP 1967 spec."
},
"Upgraded(address)": {
"notice": "An event that is emitted each time the implementation is changed. This event is part of the EIP 1967 spec."
}
},
"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": "set the initial owner during contract deployment. The owner is stored at the eip1967 owner storage slot so that storage collision with the implementation is not possible."
},
"implementation()": {
"notice": "Queries the implementation address."
},
"upgradeTo(address)": {
"notice": "Set the implementation contract address. The code at this address will execute when this contract is called."
},
"upgradeToAndCall(address,bytes)": {
"notice": "Set the implementation and call a function in a single transaction. This is useful to ensure atomic `initialize()` based upgrades."
}
},
"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 offchain simulation.",
"version": 1
},
"storageLayout": {
"storage": [],
"types": null
}
}
\ No newline at end of file
{
"address": "0xb882dF3A3F4c680b82751Bf4F07542039de4e809",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnerUpdated",
"type": "event"
},
{
"inputs": [],
"name": "addressManager",
"outputs": [
{
"internalType": "contract Lib_AddressManager",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
},
{
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "changeProxyAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
}
],
"name": "getProxyAdmin",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
}
],
"name": "getProxyImplementation",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "implementationName",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "isUpgrading",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "proxyType",
"outputs": [
{
"internalType": "enum ProxyAdmin.ProxyType",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_name",
"type": "string"
},
{
"internalType": "address",
"name": "_address",
"type": "address"
}
],
"name": "setAddress",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_address",
"type": "address"
}
],
"name": "setAddressManager",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_address",
"type": "address"
},
{
"internalType": "string",
"name": "_name",
"type": "string"
}
],
"name": "setImplementationName",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "setOwner",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_address",
"type": "address"
},
{
"internalType": "enum ProxyAdmin.ProxyType",
"name": "_type",
"type": "uint8"
}
],
"name": "setProxyType",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_upgrading",
"type": "bool"
}
],
"name": "setUpgrading",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
},
{
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "upgrade",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
},
{
"internalType": "address",
"name": "implementation",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "upgradeAndCall",
"outputs": [],
"stateMutability": "payable",
"type": "function"
}
],
"transactionHash": "0xc2aa9ee5790c864017a8f36e49fb64d034d7f09f57caedc9c815eea29e0d39b5",
"receipt": {
"to": "0x4e59b44847b379578588920cA78FbF26c0B4956C",
"from": "0xc37f6a6c4AB335E20d10F034B90386E2fb70bbF5",
"contractAddress": null,
"transactionIndex": 0,
"gasUsed": "1653900",
"logsBloom": "0x00000000000000000001000000000000000000000000000000000000000000000000100000000000000000000000080000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000000000000000000000000080000020000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000020000000000000000000020000000000000000000000000000000000000000000000",
"blockHash": "0xd377db2c0cdcff93a6e32643632fcab1e2179c7f23f037cb2f3b3619f4055a61",
"transactionHash": "0xc2aa9ee5790c864017a8f36e49fb64d034d7f09f57caedc9c815eea29e0d39b5",
"logs": [
{
"transactionIndex": 0,
"blockNumber": 32196096,
"transactionHash": "0xc2aa9ee5790c864017a8f36e49fb64d034d7f09f57caedc9c815eea29e0d39b5",
"address": "0xb882dF3A3F4c680b82751Bf4F07542039de4e809",
"topics": [
"0x8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76",
"0x0000000000000000000000000000000000000000000000000000000000000000",
"0x0000000000000000000000009c6373de60c2d3297b18a8f964618ac46e011b58"
],
"data": "0x",
"logIndex": 0,
"blockHash": "0xd377db2c0cdcff93a6e32643632fcab1e2179c7f23f037cb2f3b3619f4055a61"
}
],
"blockNumber": 32196096,
"cumulativeGasUsed": "1653900",
"status": 1,
"byzantium": true
},
"args": [
"0x9C6373dE60c2D3297b18A8f964618ac46E011B58"
],
"numDeployments": 1,
"solcInputHash": "9bf33bb642648b258386a9c465b5d346",
"metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"getProxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"getProxyImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"implementationName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isUpgrading\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proxyType\",\"outputs\":[{\"internalType\":\"enum ProxyAdmin.ProxyType\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddressManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setImplementationName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"enum ProxyAdmin.ProxyType\",\"name\":\"_type\",\"type\":\"uint8\"}],\"name\":\"setProxyType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_upgrading\",\"type\":\"bool\"}],\"name\":\"setUpgrading\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"upgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This is an auxiliary contract meant to be assigned as the admin of a Proxy, based on the OpenZeppelin implementation. It has backwards compatibility logic to work with the various types of proxies that have been deployed by Optimism.\",\"kind\":\"dev\",\"methods\":{\"changeProxyAdmin(address,address)\":{\"details\":\"Changes the admin of `proxy` to `newAdmin`. This contract must be the current admin of `proxy`.\",\"params\":{\"newAdmin\":\"The address of the admin to update to.\",\"proxy\":\"The proxy that will have its admin updated.\"}},\"getProxyAdmin(address)\":{\"details\":\"Returns the current admin of `proxy`. This contract must be the admin of `proxy`.\",\"params\":{\"proxy\":\"The Proxy to return the admin of.\"},\"returns\":{\"_0\":\"The address of the admin.\"}},\"getProxyImplementation(address)\":{\"details\":\"Returns the current implementation of `proxy`. This contract must be the admin of `proxy`.\",\"params\":{\"proxy\":\"The Proxy to return the implementation of.\"},\"returns\":{\"_0\":\"The address of the implementation.\"}},\"isUpgrading()\":{\"custom:legacy\":\"@notice Legacy function used by the old Chugsplash proxy to determine if an upgrade is happening.\",\"returns\":{\"_0\":\"Whether or not there is an upgrade going on\"}},\"setAddress(string,address)\":{\"custom:legacy\":\"@notice Set an address in the address manager. This is required because only the owner of the AddressManager can set the addresses in it.\",\"params\":{\"_address\":\"The address to set in the address manager.\",\"_name\":\"The name of the address to set in the address manager.\"}},\"setAddressManager(address)\":{\"params\":{\"_address\":\"The address of the address manager.\"}},\"setImplementationName(address,string)\":{\"params\":{\"_address\":\"The address to be named.\",\"_name\":\"The name of the address.\"}},\"setProxyType(address,uint8)\":{\"params\":{\"_type\":\"The type of the proxy.\"}},\"setUpgrading(bool)\":{\"custom:legacy\":\"@notice Set the upgrading status for the Chugsplash proxy type.\",\"params\":{\"_upgrading\":\"Whether or not the system is upgrading.\"}},\"upgrade(address,address)\":{\"details\":\"Upgrades `proxy` to `implementation`. This contract must be the admin of `proxy`.\",\"params\":{\"implementation\":\"The address of the implementation.\",\"proxy\":\"The address of the proxy.\"}},\"upgradeAndCall(address,address,bytes)\":{\"details\":\"Upgrades `proxy` to `implementation` and calls a function on the new implementation. This contract must be the admin of `proxy`.\",\"params\":{\"data\":\"The calldata to pass to the implementation.\",\"implementation\":\"The implementation to upgrade the proxy to.\",\"proxy\":\"The proxy to call.\"}}},\"stateVariables\":{\"addressManager\":{\"custom:legacy\":\"@notice The address of the address manager, this is required to manage the Lib_ResolvedDelegateProxy type.\"},\"implementationName\":{\"custom:legacy\":\"@notice A reverse mapping of addresses to names held in the AddressManager. This must be manually kept up to date with changes in the AddressManager for this contract to be able to work as an admin for the Lib_ResolvedDelegateProxy type.\"},\"proxyType\":{\"custom:legacy\":\"@notice A mapping of proxy types, used for backwards compatibility.\"},\"upgrading\":{\"custom:legacy\":\"@notice A legacy upgrading indicator used by the old Chugsplash Proxy.\"}},\"title\":\"ProxyAdmin\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Set the owner of the ProxyAdmin via constructor argument.\"},\"setAddressManager(address)\":{\"notice\":\"Set the address of the address manager. This is required to manage the legacy `Lib_ResolvedDelegateProxy`.\"},\"setImplementationName(address,string)\":{\"notice\":\"Set the proxy type in the mapping. This needs to be kept up to date by the owner of the contract.\"},\"setProxyType(address,uint8)\":{\"notice\":\"@param _address The address of the proxy.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol\":\"ProxyAdmin\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@eth-optimism/contracts-bedrock/contracts/legacy/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2572b6e2282bcda28bd5fcb71c33bd40ace74b2786ea42e0604ecbb46aefff1f\",\"license\":\"MIT\"},\"@eth-optimism/contracts-bedrock/contracts/legacy/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Proxy\\n * @notice Proxy is a transparent proxy that passes through the call\\n * if the caller is the owner or if the caller is `address(0)`,\\n * meaning that the call originated from an offchain simulation.\\n */\\ncontract Proxy {\\n /**\\n * @notice An event that is emitted each time the implementation is changed.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param implementation The address of the implementation contract\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @notice An event that is emitted each time the owner is upgraded.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param previousAdmin The previous owner of the contract\\n * @param newAdmin The new owner of the contract\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @notice The storage slot that holds the address of the implementation.\\n * bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n */\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @notice The storage slot that holds the address of the owner.\\n * bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n */\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @notice set the initial owner during contract deployment. The\\n * owner is stored at the eip1967 owner storage slot so that\\n * storage collision with the implementation is not possible.\\n *\\n * @param _admin Address of the initial contract owner. The owner has\\n * the ability to access the transparent proxy interface.\\n */\\n constructor(address _admin) {\\n _changeAdmin(_admin);\\n }\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /**\\n * @notice A modifier that reverts if not called by the owner\\n * or by `address(0)` to allow `eth_call` to interact\\n * with the proxy without needing to use low level storage\\n * inspection. It is assumed that nobody controls the private\\n * key for `address(0)`.\\n */\\n modifier proxyCallIfNotAdmin() {\\n if (msg.sender == _getAdmin() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /**\\n * @notice Set the implementation contract address. The code at this\\n * address will execute when this contract is called.\\n *\\n * @param _implementation The address of the implementation contract\\n */\\n function upgradeTo(address _implementation) external proxyCallIfNotAdmin {\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * @notice Set the implementation and call a function in a single\\n * transaction. This is useful to ensure atomic `initialize()`\\n * based upgrades.\\n *\\n * @param _implementation The address of the implementation contract\\n * @param _data The calldata to delegatecall the new\\n * implementation with\\n */\\n function upgradeToAndCall(address _implementation, bytes calldata _data)\\n external\\n payable\\n proxyCallIfNotAdmin\\n returns (bytes memory)\\n {\\n _setImplementation(_implementation);\\n (bool success, bytes memory returndata) = _implementation.delegatecall(_data);\\n require(success);\\n return returndata;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract. Only callable by the owner.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function changeAdmin(address _admin) external proxyCallIfNotAdmin {\\n _changeAdmin(_admin);\\n }\\n\\n /**\\n * @notice Gets the owner of the proxy contract.\\n *\\n * @return Owner address.\\n */\\n function admin() external proxyCallIfNotAdmin returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return Implementation address.\\n */\\n function implementation() external proxyCallIfNotAdmin returns (address) {\\n return _getImplementation();\\n }\\n\\n /**\\n * @notice Sets the implementation address.\\n *\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n emit Upgraded(_implementation);\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function _changeAdmin(address _admin) internal {\\n address previous = _getAdmin();\\n assembly {\\n sstore(OWNER_KEY, _admin)\\n }\\n emit AdminChanged(previous, _admin);\\n }\\n\\n /**\\n * @notice Queries the owner of the proxy contract.\\n *\\n * @return owner address.\\n */\\n function _getAdmin() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * @notice Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"Proxy: implementation not initialized\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2a6719fd9a11adf0efba0243e5c68d56b255296b84cc82bd39326c902e055077\",\"license\":\"MIT\"},\"@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { Proxy } from \\\"./Proxy.sol\\\";\\nimport { Owned } from \\\"@rari-capital/solmate/src/auth/Owned.sol\\\";\\nimport { Lib_AddressManager } from \\\"../legacy/Lib_AddressManager.sol\\\";\\nimport { L1ChugSplashProxy } from \\\"../legacy/L1ChugSplashProxy.sol\\\";\\n\\n/**\\n * @title ProxyAdmin\\n * @dev This is an auxiliary contract meant to be assigned as the admin of a Proxy, based on\\n * the OpenZeppelin implementation. It has backwards compatibility logic to work with the\\n * various types of proxies that have been deployed by Optimism.\\n */\\ncontract ProxyAdmin is Owned {\\n /**\\n * @notice The proxy types that the ProxyAdmin can manage.\\n *\\n * @custom:value OpenZeppelin Represents the OpenZeppelin style transparent proxy\\n * interface, this is the standard.\\n * @custom:value Chugsplash Represents the Chugsplash proxy interface,\\n * this is legacy.\\n * @custom:value ResolvedDelegate Represents the ResolvedDelegate proxy\\n * interface, this is legacy.\\n */\\n enum ProxyType {\\n OpenZeppelin,\\n Chugsplash,\\n ResolvedDelegate\\n }\\n\\n /**\\n * @custom:legacy\\n * @notice A mapping of proxy types, used for backwards compatibility.\\n */\\n mapping(address => ProxyType) public proxyType;\\n\\n /**\\n * @custom:legacy\\n * @notice A reverse mapping of addresses to names held in the AddressManager. This must be\\n * manually kept up to date with changes in the AddressManager for this contract\\n * to be able to work as an admin for the Lib_ResolvedDelegateProxy type.\\n */\\n mapping(address => string) public implementationName;\\n\\n /**\\n * @custom:legacy\\n * @notice The address of the address manager, this is required to manage the\\n * Lib_ResolvedDelegateProxy type.\\n */\\n Lib_AddressManager public addressManager;\\n\\n /**\\n * @custom:legacy\\n * @notice A legacy upgrading indicator used by the old Chugsplash Proxy.\\n */\\n bool internal upgrading = false;\\n\\n /**\\n * @notice Set the owner of the ProxyAdmin via constructor argument.\\n */\\n constructor(address owner) Owned(owner) {}\\n\\n /**\\n * @notice\\n *\\n * @param _address The address of the proxy.\\n * @param _type The type of the proxy.\\n */\\n function setProxyType(address _address, ProxyType _type) external onlyOwner {\\n proxyType[_address] = _type;\\n }\\n\\n /**\\n * @notice Set the proxy type in the mapping. This needs to be kept up to date by the owner of\\n * the contract.\\n *\\n * @param _address The address to be named.\\n * @param _name The name of the address.\\n */\\n function setImplementationName(address _address, string memory _name) external onlyOwner {\\n implementationName[_address] = _name;\\n }\\n\\n /**\\n * @notice Set the address of the address manager. This is required to manage the legacy\\n * `Lib_ResolvedDelegateProxy`.\\n *\\n * @param _address The address of the address manager.\\n */\\n function setAddressManager(address _address) external onlyOwner {\\n addressManager = Lib_AddressManager(_address);\\n }\\n\\n /**\\n * @custom:legacy\\n * @notice Set an address in the address manager. This is required because only the owner of\\n * the AddressManager can set the addresses in it.\\n *\\n * @param _name The name of the address to set in the address manager.\\n * @param _address The address to set in the address manager.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n addressManager.setAddress(_name, _address);\\n }\\n\\n /**\\n * @custom:legacy\\n * @notice Legacy function used by the old Chugsplash proxy to determine if an upgrade is\\n * happening.\\n *\\n * @return Whether or not there is an upgrade going on\\n */\\n function isUpgrading() external view returns (bool) {\\n return upgrading;\\n }\\n\\n /**\\n * @custom:legacy\\n * @notice Set the upgrading status for the Chugsplash proxy type.\\n *\\n * @param _upgrading Whether or not the system is upgrading.\\n */\\n function setUpgrading(bool _upgrading) external onlyOwner {\\n upgrading = _upgrading;\\n }\\n\\n /**\\n * @dev Returns the current implementation of `proxy`.\\n * This contract must be the admin of `proxy`.\\n *\\n * @param proxy The Proxy to return the implementation of.\\n * @return The address of the implementation.\\n */\\n function getProxyImplementation(Proxy proxy) external view returns (address) {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n // We need to manually run the static call since the getter cannot be flagged as view\\n address target;\\n bytes memory data;\\n if (proxyType == ProxyType.OpenZeppelin) {\\n target = address(proxy);\\n data = abi.encodeWithSelector(Proxy.implementation.selector);\\n } else if (proxyType == ProxyType.Chugsplash) {\\n target = address(proxy);\\n data = abi.encodeWithSelector(L1ChugSplashProxy.getImplementation.selector);\\n } else if (proxyType == ProxyType.ResolvedDelegate) {\\n target = address(addressManager);\\n data = abi.encodeWithSelector(\\n Lib_AddressManager.getAddress.selector,\\n implementationName[address(proxy)]\\n );\\n } else {\\n revert(\\\"ProxyAdmin: unknown proxy type\\\");\\n }\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n require(success);\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * @dev Returns the current admin of `proxy`.\\n * This contract must be the admin of `proxy`.\\n *\\n * @param proxy The Proxy to return the admin of.\\n * @return The address of the admin.\\n */\\n function getProxyAdmin(Proxy proxy) external view returns (address) {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n // We need to manually run the static call since the getter cannot be flagged as view\\n address target;\\n bytes memory data;\\n if (proxyType == ProxyType.OpenZeppelin) {\\n target = address(proxy);\\n data = abi.encodeWithSelector(Proxy.admin.selector);\\n } else if (proxyType == ProxyType.Chugsplash) {\\n target = address(proxy);\\n data = abi.encodeWithSelector(L1ChugSplashProxy.getOwner.selector);\\n } else if (proxyType == ProxyType.ResolvedDelegate) {\\n target = address(addressManager);\\n data = abi.encodeWithSignature(\\\"owner()\\\");\\n } else {\\n revert(\\\"ProxyAdmin: unknown proxy type\\\");\\n }\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n require(success);\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * @dev Changes the admin of `proxy` to `newAdmin`. This contract must be the current admin\\n * of `proxy`.\\n *\\n * @param proxy The proxy that will have its admin updated.\\n * @param newAdmin The address of the admin to update to.\\n */\\n function changeProxyAdmin(Proxy proxy, address newAdmin) external onlyOwner {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n if (proxyType == ProxyType.OpenZeppelin) {\\n proxy.changeAdmin(newAdmin);\\n } else if (proxyType == ProxyType.Chugsplash) {\\n L1ChugSplashProxy(payable(proxy)).setOwner(newAdmin);\\n } else if (proxyType == ProxyType.ResolvedDelegate) {\\n Lib_AddressManager(addressManager).transferOwnership(newAdmin);\\n }\\n }\\n\\n /**\\n * @dev Upgrades `proxy` to `implementation`. This contract must be the admin of `proxy`.\\n *\\n * @param proxy The address of the proxy.\\n * @param implementation The address of the implementation.\\n */\\n function upgrade(Proxy proxy, address implementation) public onlyOwner {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n if (proxyType == ProxyType.OpenZeppelin) {\\n proxy.upgradeTo(implementation);\\n } else if (proxyType == ProxyType.Chugsplash) {\\n L1ChugSplashProxy(payable(proxy)).setStorage(\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,\\n bytes32(uint256(uint160(implementation)))\\n );\\n } else if (proxyType == ProxyType.ResolvedDelegate) {\\n string memory name = implementationName[address(proxy)];\\n Lib_AddressManager(addressManager).setAddress(name, implementation);\\n }\\n }\\n\\n /**\\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\\n * This contract must be the admin of `proxy`.\\n *\\n * @param proxy The proxy to call.\\n * @param implementation The implementation to upgrade the proxy to.\\n * @param data The calldata to pass to the implementation.\\n */\\n function upgradeAndCall(\\n Proxy proxy,\\n address implementation,\\n bytes memory data\\n ) external payable onlyOwner {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n if (proxyType == ProxyType.OpenZeppelin) {\\n proxy.upgradeToAndCall{ value: msg.value }(implementation, data);\\n } else {\\n upgrade(proxy, implementation);\\n (bool success, ) = address(proxy).call{ value: msg.value }(data);\\n require(success);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xeae8f76ab92a48720d32a388c0564781cd93ee112e995b187b2bd984c37f9ec1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x24e0364e503a9bbde94c715d26573a76f14cd2a202d45f96f52134ab806b67b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@rari-capital/solmate/src/auth/Owned.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\n/// @notice Simple single owner authorization mixin.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)\\nabstract contract Owned {\\n /*//////////////////////////////////////////////////////////////\\n EVENTS\\n //////////////////////////////////////////////////////////////*/\\n\\n event OwnerUpdated(address indexed user, address indexed newOwner);\\n\\n /*//////////////////////////////////////////////////////////////\\n OWNERSHIP STORAGE\\n //////////////////////////////////////////////////////////////*/\\n\\n address public owner;\\n\\n modifier onlyOwner() virtual {\\n require(msg.sender == owner, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n /*//////////////////////////////////////////////////////////////\\n CONSTRUCTOR\\n //////////////////////////////////////////////////////////////*/\\n\\n constructor(address _owner) {\\n owner = _owner;\\n\\n emit OwnerUpdated(address(0), _owner);\\n }\\n\\n /*//////////////////////////////////////////////////////////////\\n OWNERSHIP LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function setOwner(address newOwner) public virtual onlyOwner {\\n owner = newOwner;\\n\\n emit OwnerUpdated(msg.sender, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x7e91c80b0dd1a14a19cb9e661b99924043adab6d9d893bbfcf3a6a3dc23a6743\",\"license\":\"AGPL-3.0-only\"}},\"version\":1}",
"bytecode": "0x60806040526003805460ff60a01b1916905534801561001d57600080fd5b50604051611d63380380611d6383398101604081905261003c9161008b565b600080546001600160a01b0319166001600160a01b03831690811782556040518392907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350506100bb565b60006020828403121561009d57600080fd5b81516001600160a01b03811681146100b457600080fd5b9392505050565b611c99806100ca6000396000f3fe6080604052600436106100f35760003560e01c8063860f7cda1161008a57806399a88ec41161005957806399a88ec4146102db5780639b2ea4bd146102fb578063b79472621461031b578063f3b7dead1461035657600080fd5b8063860f7cda1461025b5780638d52d4a01461027b5780638da5cb5b1461029b5780639623609d146102c857600080fd5b8063238181ae116100c6578063238181ae146101a45780633ab76e9f146101d15780636bd9f516146101fe5780637eff275e1461023b57600080fd5b80630652b57a146100f857806307c8f7b01461011a57806313af40351461013a578063204e1c7a1461015a575b600080fd5b34801561010457600080fd5b50610118610113366004611638565b610376565b005b34801561012657600080fd5b5061011861013536600461165c565b610443565b34801561014657600080fd5b50610118610155366004611638565b61050e565b34801561016657600080fd5b5061017a610175366004611638565b6105ff565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004611638565b610915565b60405161019b91906116f4565b3480156101dd57600080fd5b5060035461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020a57600080fd5b5061022e610219366004611638565b60016020526000908152604090205460ff1681565b60405161019b9190611736565b34801561024757600080fd5b50610118610256366004611777565b6109af565b34801561026757600080fd5b506101186102763660046118d2565b610bf3565b34801561028757600080fd5b50610118610296366004611922565b610caa565b3480156102a757600080fd5b5060005461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101186102d6366004611954565b610d97565b3480156102e757600080fd5b506101186102f6366004611777565b610fb4565b34801561030757600080fd5b506101186103163660046119ca565b6112b8565b34801561032757600080fd5b5060035474010000000000000000000000000000000000000000900460ff16604051901515815260200161019b565b34801561036257600080fd5b5061017a610371366004611638565b6113c7565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461058f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168160608183600281111561063e5761063e611707565b14156106a45750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5c60da1b00000000000000000000000000000000000000000000000000000000179052839061087f565b60018360028111156106b8576106b8611707565b141561071e5750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167faaf10f4200000000000000000000000000000000000000000000000000000000179052839061087f565b600283600281111561073257610732611707565b141561081d5760035473ffffffffffffffffffffffffffffffffffffffff8681166000908152600260205260409081902090519190921693507fbf40fac1000000000000000000000000000000000000000000000000000000009161079991602401611a65565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061087f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064016103f3565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516108a79190611b44565b600060405180830381855afa9150503d80600081146108e2576040519150601f19603f3d011682016040523d82523d6000602084013e6108e7565b606091505b5091509150816108f657600080fd5b8080602001905181019061090a9190611b60565b979650505050505050565b6002602052600090815260409020805461092e90611a11565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90611a11565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610a6c57610a6c611707565b1415610af9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b158015610adc57600080fd5b505af1158015610af0573d6000803e3d6000fd5b50505050505050565b6001816002811115610b0d57610b0d611707565b1415610b67576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af403590602401610ac2565b6002816002811115610b7b57610b7b611707565b1415610bee576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b90602401600060405180830381600087803b158015610adc57600080fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602090815260409091208251610bee9284019061157a565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911690836002811115610d8e57610d8e611707565b02179055505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff1690816002811115610e5457610e54611707565b1415610f2a576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610eb09087908790600401611b7d565b6000604051808303818588803b158015610ec957600080fd5b505af1158015610edd573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f249190810190611bb4565b50610fae565b610f348484610fb4565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610f5c9190611b44565b60006040518083038185875af1925050503d8060008114610f99576040519150601f19603f3d011682016040523d82523d6000602084013e610f9e565b606091505b5050905080610fac57600080fd5b505b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561107157611071611707565b14156110cb576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401610ac2565b60018160028111156110df576110df611707565b141561115f576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda90604401610ac2565b600281600281111561117357611173611707565b1415610bee5773ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080546111a990611a11565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590611a11565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd935061128092508591508790600401611c2b565b600060405180830381600087803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd906113919085908590600401611c2b565b600060405180830381600087803b1580156113ab57600080fd5b505af11580156113bf573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168160608183600281111561140657611406611707565b141561146c5750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff851a44000000000000000000000000000000000000000000000000000000000179052839061087f565b600183600281111561148057611480611707565b14156114e65750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f893d20e800000000000000000000000000000000000000000000000000000000179052839061087f565b60028360028111156114fa576114fa611707565b141561081d5750506003546040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8da5cb5b0000000000000000000000000000000000000000000000000000000017905273ffffffffffffffffffffffffffffffffffffffff9091169061087f565b82805461158690611a11565b90600052602060002090601f0160209004810192826115a857600085556115ee565b82601f106115c157805160ff19168380011785556115ee565b828001600101855582156115ee579182015b828111156115ee5782518255916020019190600101906115d3565b506115fa9291506115fe565b5090565b5b808211156115fa57600081556001016115ff565b73ffffffffffffffffffffffffffffffffffffffff8116811461163557600080fd5b50565b60006020828403121561164a57600080fd5b813561165581611613565b9392505050565b60006020828403121561166e57600080fd5b8135801515811461165557600080fd5b60005b83811015611699578181015183820152602001611681565b83811115610fae5750506000910152565b600081518084526116c281602086016020860161167e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061165560208301846116aa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310611771577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561178a57600080fd5b823561179581611613565b915060208301356117a581611613565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611826576118266117b0565b604052919050565b600067ffffffffffffffff821115611848576118486117b0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006118876118828461182e565b6117df565b905082815283838301111561189b57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126118c357600080fd5b61165583833560208501611874565b600080604083850312156118e557600080fd5b82356118f081611613565b9150602083013567ffffffffffffffff81111561190c57600080fd5b611918858286016118b2565b9150509250929050565b6000806040838503121561193557600080fd5b823561194081611613565b91506020830135600381106117a557600080fd5b60008060006060848603121561196957600080fd5b833561197481611613565b9250602084013561198481611613565b9150604084013567ffffffffffffffff8111156119a057600080fd5b8401601f810186136119b157600080fd5b6119c086823560208401611874565b9150509250925092565b600080604083850312156119dd57600080fd5b823567ffffffffffffffff8111156119f457600080fd5b611a00858286016118b2565b92505060208301356117a581611613565b600181811c90821680611a2557607f821691505b60208210811415611a5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208083526000845481600182811c915080831680611a8757607f831692505b858310811415611abe577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015611adb5760018114611b0a57611b35565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861682528782019650611b35565b60008b81526020902060005b86811015611b2f57815484820152908501908901611b16565b83019750505b50949998505050505050505050565b60008251611b5681846020870161167e565b9190910192915050565b600060208284031215611b7257600080fd5b815161165581611613565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000611bac60408301846116aa565b949350505050565b600060208284031215611bc657600080fd5b815167ffffffffffffffff811115611bdd57600080fd5b8201601f81018413611bee57600080fd5b8051611bfc6118828261182e565b818152856020838501011115611c1157600080fd5b611c2282602083016020860161167e565b95945050505050565b604081526000611c3e60408301856116aa565b905073ffffffffffffffffffffffffffffffffffffffff83166020830152939250505056fea2646970667358221220de0df1c1387eaa7baaaf13702966168d299cb9acba3a7f279def6637fe6e54ca64736f6c63430008090033",
"deployedBytecode": "0x6080604052600436106100f35760003560e01c8063860f7cda1161008a57806399a88ec41161005957806399a88ec4146102db5780639b2ea4bd146102fb578063b79472621461031b578063f3b7dead1461035657600080fd5b8063860f7cda1461025b5780638d52d4a01461027b5780638da5cb5b1461029b5780639623609d146102c857600080fd5b8063238181ae116100c6578063238181ae146101a45780633ab76e9f146101d15780636bd9f516146101fe5780637eff275e1461023b57600080fd5b80630652b57a146100f857806307c8f7b01461011a57806313af40351461013a578063204e1c7a1461015a575b600080fd5b34801561010457600080fd5b50610118610113366004611638565b610376565b005b34801561012657600080fd5b5061011861013536600461165c565b610443565b34801561014657600080fd5b50610118610155366004611638565b61050e565b34801561016657600080fd5b5061017a610175366004611638565b6105ff565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004611638565b610915565b60405161019b91906116f4565b3480156101dd57600080fd5b5060035461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020a57600080fd5b5061022e610219366004611638565b60016020526000908152604090205460ff1681565b60405161019b9190611736565b34801561024757600080fd5b50610118610256366004611777565b6109af565b34801561026757600080fd5b506101186102763660046118d2565b610bf3565b34801561028757600080fd5b50610118610296366004611922565b610caa565b3480156102a757600080fd5b5060005461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101186102d6366004611954565b610d97565b3480156102e757600080fd5b506101186102f6366004611777565b610fb4565b34801561030757600080fd5b506101186103163660046119ca565b6112b8565b34801561032757600080fd5b5060035474010000000000000000000000000000000000000000900460ff16604051901515815260200161019b565b34801561036257600080fd5b5061017a610371366004611638565b6113c7565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461058f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168160608183600281111561063e5761063e611707565b14156106a45750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5c60da1b00000000000000000000000000000000000000000000000000000000179052839061087f565b60018360028111156106b8576106b8611707565b141561071e5750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167faaf10f4200000000000000000000000000000000000000000000000000000000179052839061087f565b600283600281111561073257610732611707565b141561081d5760035473ffffffffffffffffffffffffffffffffffffffff8681166000908152600260205260409081902090519190921693507fbf40fac1000000000000000000000000000000000000000000000000000000009161079991602401611a65565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061087f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064016103f3565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516108a79190611b44565b600060405180830381855afa9150503d80600081146108e2576040519150601f19603f3d011682016040523d82523d6000602084013e6108e7565b606091505b5091509150816108f657600080fd5b8080602001905181019061090a9190611b60565b979650505050505050565b6002602052600090815260409020805461092e90611a11565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90611a11565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610a6c57610a6c611707565b1415610af9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b158015610adc57600080fd5b505af1158015610af0573d6000803e3d6000fd5b50505050505050565b6001816002811115610b0d57610b0d611707565b1415610b67576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af403590602401610ac2565b6002816002811115610b7b57610b7b611707565b1415610bee576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b90602401600060405180830381600087803b158015610adc57600080fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602090815260409091208251610bee9284019061157a565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911690836002811115610d8e57610d8e611707565b02179055505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff1690816002811115610e5457610e54611707565b1415610f2a576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610eb09087908790600401611b7d565b6000604051808303818588803b158015610ec957600080fd5b505af1158015610edd573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f249190810190611bb4565b50610fae565b610f348484610fb4565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610f5c9190611b44565b60006040518083038185875af1925050503d8060008114610f99576040519150601f19603f3d011682016040523d82523d6000602084013e610f9e565b606091505b5050905080610fac57600080fd5b505b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561107157611071611707565b14156110cb576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401610ac2565b60018160028111156110df576110df611707565b141561115f576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda90604401610ac2565b600281600281111561117357611173611707565b1415610bee5773ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080546111a990611a11565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590611a11565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd935061128092508591508790600401611c2b565b600060405180830381600087803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd906113919085908590600401611c2b565b600060405180830381600087803b1580156113ab57600080fd5b505af11580156113bf573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168160608183600281111561140657611406611707565b141561146c5750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff851a44000000000000000000000000000000000000000000000000000000000179052839061087f565b600183600281111561148057611480611707565b14156114e65750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f893d20e800000000000000000000000000000000000000000000000000000000179052839061087f565b60028360028111156114fa576114fa611707565b141561081d5750506003546040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8da5cb5b0000000000000000000000000000000000000000000000000000000017905273ffffffffffffffffffffffffffffffffffffffff9091169061087f565b82805461158690611a11565b90600052602060002090601f0160209004810192826115a857600085556115ee565b82601f106115c157805160ff19168380011785556115ee565b828001600101855582156115ee579182015b828111156115ee5782518255916020019190600101906115d3565b506115fa9291506115fe565b5090565b5b808211156115fa57600081556001016115ff565b73ffffffffffffffffffffffffffffffffffffffff8116811461163557600080fd5b50565b60006020828403121561164a57600080fd5b813561165581611613565b9392505050565b60006020828403121561166e57600080fd5b8135801515811461165557600080fd5b60005b83811015611699578181015183820152602001611681565b83811115610fae5750506000910152565b600081518084526116c281602086016020860161167e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061165560208301846116aa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310611771577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561178a57600080fd5b823561179581611613565b915060208301356117a581611613565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611826576118266117b0565b604052919050565b600067ffffffffffffffff821115611848576118486117b0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006118876118828461182e565b6117df565b905082815283838301111561189b57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126118c357600080fd5b61165583833560208501611874565b600080604083850312156118e557600080fd5b82356118f081611613565b9150602083013567ffffffffffffffff81111561190c57600080fd5b611918858286016118b2565b9150509250929050565b6000806040838503121561193557600080fd5b823561194081611613565b91506020830135600381106117a557600080fd5b60008060006060848603121561196957600080fd5b833561197481611613565b9250602084013561198481611613565b9150604084013567ffffffffffffffff8111156119a057600080fd5b8401601f810186136119b157600080fd5b6119c086823560208401611874565b9150509250925092565b600080604083850312156119dd57600080fd5b823567ffffffffffffffff8111156119f457600080fd5b611a00858286016118b2565b92505060208301356117a581611613565b600181811c90821680611a2557607f821691505b60208210811415611a5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208083526000845481600182811c915080831680611a8757607f831692505b858310811415611abe577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015611adb5760018114611b0a57611b35565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861682528782019650611b35565b60008b81526020902060005b86811015611b2f57815484820152908501908901611b16565b83019750505b50949998505050505050505050565b60008251611b5681846020870161167e565b9190910192915050565b600060208284031215611b7257600080fd5b815161165581611613565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000611bac60408301846116aa565b949350505050565b600060208284031215611bc657600080fd5b815167ffffffffffffffff811115611bdd57600080fd5b8201601f81018413611bee57600080fd5b8051611bfc6118828261182e565b818152856020838501011115611c1157600080fd5b611c2282602083016020860161167e565b95945050505050565b604081526000611c3e60408301856116aa565b905073ffffffffffffffffffffffffffffffffffffffff83166020830152939250505056fea2646970667358221220de0df1c1387eaa7baaaf13702966168d299cb9acba3a7f279def6637fe6e54ca64736f6c63430008090033",
"devdoc": {
"details": "This is an auxiliary contract meant to be assigned as the admin of a Proxy, based on the OpenZeppelin implementation. It has backwards compatibility logic to work with the various types of proxies that have been deployed by Optimism.",
"kind": "dev",
"methods": {
"changeProxyAdmin(address,address)": {
"details": "Changes the admin of `proxy` to `newAdmin`. This contract must be the current admin of `proxy`.",
"params": {
"newAdmin": "The address of the admin to update to.",
"proxy": "The proxy that will have its admin updated."
}
},
"getProxyAdmin(address)": {
"details": "Returns the current admin of `proxy`. This contract must be the admin of `proxy`.",
"params": {
"proxy": "The Proxy to return the admin of."
},
"returns": {
"_0": "The address of the admin."
}
},
"getProxyImplementation(address)": {
"details": "Returns the current implementation of `proxy`. This contract must be the admin of `proxy`.",
"params": {
"proxy": "The Proxy to return the implementation of."
},
"returns": {
"_0": "The address of the implementation."
}
},
"isUpgrading()": {
"custom:legacy": "@notice Legacy function used by the old Chugsplash proxy to determine if an upgrade is happening.",
"returns": {
"_0": "Whether or not there is an upgrade going on"
}
},
"setAddress(string,address)": {
"custom:legacy": "@notice Set an address in the address manager. This is required because only the owner of the AddressManager can set the addresses in it.",
"params": {
"_address": "The address to set in the address manager.",
"_name": "The name of the address to set in the address manager."
}
},
"setAddressManager(address)": {
"params": {
"_address": "The address of the address manager."
}
},
"setImplementationName(address,string)": {
"params": {
"_address": "The address to be named.",
"_name": "The name of the address."
}
},
"setProxyType(address,uint8)": {
"params": {
"_type": "The type of the proxy."
}
},
"setUpgrading(bool)": {
"custom:legacy": "@notice Set the upgrading status for the Chugsplash proxy type.",
"params": {
"_upgrading": "Whether or not the system is upgrading."
}
},
"upgrade(address,address)": {
"details": "Upgrades `proxy` to `implementation`. This contract must be the admin of `proxy`.",
"params": {
"implementation": "The address of the implementation.",
"proxy": "The address of the proxy."
}
},
"upgradeAndCall(address,address,bytes)": {
"details": "Upgrades `proxy` to `implementation` and calls a function on the new implementation. This contract must be the admin of `proxy`.",
"params": {
"data": "The calldata to pass to the implementation.",
"implementation": "The implementation to upgrade the proxy to.",
"proxy": "The proxy to call."
}
}
},
"stateVariables": {
"addressManager": {
"custom:legacy": "@notice The address of the address manager, this is required to manage the Lib_ResolvedDelegateProxy type."
},
"implementationName": {
"custom:legacy": "@notice A reverse mapping of addresses to names held in the AddressManager. This must be manually kept up to date with changes in the AddressManager for this contract to be able to work as an admin for the Lib_ResolvedDelegateProxy type."
},
"proxyType": {
"custom:legacy": "@notice A mapping of proxy types, used for backwards compatibility."
},
"upgrading": {
"custom:legacy": "@notice A legacy upgrading indicator used by the old Chugsplash Proxy."
}
},
"title": "ProxyAdmin",
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {
"constructor": {
"notice": "Set the owner of the ProxyAdmin via constructor argument."
},
"setAddressManager(address)": {
"notice": "Set the address of the address manager. This is required to manage the legacy `Lib_ResolvedDelegateProxy`."
},
"setImplementationName(address,string)": {
"notice": "Set the proxy type in the mapping. This needs to be kept up to date by the owner of the contract."
},
"setProxyType(address,uint8)": {
"notice": "@param _address The address of the proxy."
}
},
"version": 1
},
"storageLayout": {
"storage": [
{
"astId": 4446,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "owner",
"offset": 0,
"slot": "0",
"type": "t_address"
},
{
"astId": 624,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "proxyType",
"offset": 0,
"slot": "1",
"type": "t_mapping(t_address,t_enum(ProxyType)618)"
},
{
"astId": 629,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "implementationName",
"offset": 0,
"slot": "2",
"type": "t_mapping(t_address,t_string_storage)"
},
{
"astId": 633,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "addressManager",
"offset": 0,
"slot": "3",
"type": "t_contract(Lib_AddressManager)376"
},
{
"astId": 637,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "upgrading",
"offset": 20,
"slot": "3",
"type": "t_bool"
}
],
"types": {
"t_address": {
"encoding": "inplace",
"label": "address",
"numberOfBytes": "20"
},
"t_bool": {
"encoding": "inplace",
"label": "bool",
"numberOfBytes": "1"
},
"t_contract(Lib_AddressManager)376": {
"encoding": "inplace",
"label": "contract Lib_AddressManager",
"numberOfBytes": "20"
},
"t_enum(ProxyType)618": {
"encoding": "inplace",
"label": "enum ProxyAdmin.ProxyType",
"numberOfBytes": "1"
},
"t_mapping(t_address,t_enum(ProxyType)618)": {
"encoding": "mapping",
"key": "t_address",
"label": "mapping(address => enum ProxyAdmin.ProxyType)",
"numberOfBytes": "32",
"value": "t_enum(ProxyType)618"
},
"t_mapping(t_address,t_string_storage)": {
"encoding": "mapping",
"key": "t_address",
"label": "mapping(address => string)",
"numberOfBytes": "32",
"value": "t_string_storage"
},
"t_string_storage": {
"encoding": "bytes",
"label": "string",
"numberOfBytes": "32"
}
}
}
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"address": "0x67997A4F970aD1c91B911C4d7A6598aF2cFb1F56",
"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"
}
],
"args": [
"0x9C6373dE60c2D3297b18A8f964618ac46E011B58"
],
"numDeployments": 1,
"solcInputHash": "9bf33bb642648b258386a9c465b5d346",
"metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"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\"}],\"devdoc\":{\"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\"}}},\"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 owner. The owner has the ability to access the transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"The address of the implementation contract\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"The calldata to delegatecall the new implementation with\",\"_implementation\":\"The address of the implementation contract\"}}},\"title\":\"Proxy\",\"version\":1},\"userdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"An event that is emitted each time the owner is upgraded. This event is part of the EIP 1967 spec.\"},\"Upgraded(address)\":{\"notice\":\"An event that is emitted each time the implementation is changed. This event is part of the EIP 1967 spec.\"}},\"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\":\"set the initial owner during contract deployment. The owner is stored at the eip1967 owner storage slot so that storage collision with the implementation is not possible.\"},\"implementation()\":{\"notice\":\"Queries the implementation address.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at this address will execute when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. This is useful to ensure atomic `initialize()` based upgrades.\"}},\"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 offchain simulation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Proxy\\n * @notice Proxy is a transparent proxy that passes through the call\\n * if the caller is the owner or if the caller is `address(0)`,\\n * meaning that the call originated from an offchain simulation.\\n */\\ncontract Proxy {\\n /**\\n * @notice An event that is emitted each time the implementation is changed.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param implementation The address of the implementation contract\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @notice An event that is emitted each time the owner is upgraded.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param previousAdmin The previous owner of the contract\\n * @param newAdmin The new owner of the contract\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @notice The storage slot that holds the address of the implementation.\\n * bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n */\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @notice The storage slot that holds the address of the owner.\\n * bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n */\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @notice set the initial owner during contract deployment. The\\n * owner is stored at the eip1967 owner storage slot so that\\n * storage collision with the implementation is not possible.\\n *\\n * @param _admin Address of the initial contract owner. The owner has\\n * the ability to access the transparent proxy interface.\\n */\\n constructor(address _admin) {\\n _changeAdmin(_admin);\\n }\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /**\\n * @notice A modifier that reverts if not called by the owner\\n * or by `address(0)` to allow `eth_call` to interact\\n * with the proxy without needing to use low level storage\\n * inspection. It is assumed that nobody controls the private\\n * key for `address(0)`.\\n */\\n modifier proxyCallIfNotAdmin() {\\n if (msg.sender == _getAdmin() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /**\\n * @notice Set the implementation contract address. The code at this\\n * address will execute when this contract is called.\\n *\\n * @param _implementation The address of the implementation contract\\n */\\n function upgradeTo(address _implementation) external proxyCallIfNotAdmin {\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * @notice Set the implementation and call a function in a single\\n * transaction. This is useful to ensure atomic `initialize()`\\n * based upgrades.\\n *\\n * @param _implementation The address of the implementation contract\\n * @param _data The calldata to delegatecall the new\\n * implementation with\\n */\\n function upgradeToAndCall(address _implementation, bytes calldata _data)\\n external\\n payable\\n proxyCallIfNotAdmin\\n returns (bytes memory)\\n {\\n _setImplementation(_implementation);\\n (bool success, bytes memory returndata) = _implementation.delegatecall(_data);\\n require(success);\\n return returndata;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract. Only callable by the owner.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function changeAdmin(address _admin) external proxyCallIfNotAdmin {\\n _changeAdmin(_admin);\\n }\\n\\n /**\\n * @notice Gets the owner of the proxy contract.\\n *\\n * @return Owner address.\\n */\\n function admin() external proxyCallIfNotAdmin returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return Implementation address.\\n */\\n function implementation() external proxyCallIfNotAdmin returns (address) {\\n return _getImplementation();\\n }\\n\\n /**\\n * @notice Sets the implementation address.\\n *\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n emit Upgraded(_implementation);\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function _changeAdmin(address _admin) internal {\\n address previous = _getAdmin();\\n assembly {\\n sstore(OWNER_KEY, _admin)\\n }\\n emit AdminChanged(previous, _admin);\\n }\\n\\n /**\\n * @notice Queries the owner of the proxy contract.\\n *\\n * @return owner address.\\n */\\n function _getAdmin() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * @notice Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"Proxy: implementation not initialized\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2a6719fd9a11adf0efba0243e5c68d56b255296b84cc82bd39326c902e055077\",\"license\":\"MIT\"}},\"version\":1}",
"bytecode": "0x608060405234801561001057600080fd5b506040516108ac3803806108ac83398101604081905261002f916100b2565b6100388161003e565b506100e2565b600061005660008051602061088c8339815191525490565b60008051602061088c833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b61079b806100f16000396000f3fe60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146100ad5780638f283970146100e7578063f851a440146101075761005a565b80633659cfe6146100645780634f1ef28614610084575b61006261011c565b005b34801561007057600080fd5b5061006261007f366004610644565b610212565b61009761009236600461065f565b610284565b6040516100a491906106e2565b60405180910390f35b3480156100b957600080fd5b506100c2610384565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a4565b3480156100f357600080fd5b50610062610102366004610644565b61041b565b34801561011357600080fd5b506100c2610482565b60006101467f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166101ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b3660008037600080366000845af43d6000803e8061020c573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061026b575033155b1561027c576102798161050e565b50565b61027961011c565b60606102ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102e5575033155b15610375576102f38461050e565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161031d929190610755565b600060405180830381855af49150503d8060008114610358576040519150601f19603f3d011682016040523d82523d6000602084013e61035d565b606091505b50915091508161036c57600080fd5b915061037d9050565b61037d61011c565b9392505050565b60006103ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103e5575033155b1561041057507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b61041861011c565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610474575033155b1561027c5761027981610576565b60006104ac7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104e3575033155b1561041057507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006105a07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063f57600080fd5b919050565b60006020828403121561065657600080fd5b61037d8261061b565b60008060006040848603121561067457600080fd5b61067d8461061b565b9250602084013567ffffffffffffffff8082111561069a57600080fd5b818601915086601f8301126106ae57600080fd5b8135818111156106bd57600080fd5b8760208285010111156106cf57600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b8181101561070f578581018301518582016040015282016106f3565b81811115610721576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea264697066735822122002cf23bcc281eec5c701686c2374a3972d766187632ccdd7ca1fe3d13cb4866264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
"deployedBytecode": "0x60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146100ad5780638f283970146100e7578063f851a440146101075761005a565b80633659cfe6146100645780634f1ef28614610084575b61006261011c565b005b34801561007057600080fd5b5061006261007f366004610644565b610212565b61009761009236600461065f565b610284565b6040516100a491906106e2565b60405180910390f35b3480156100b957600080fd5b506100c2610384565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a4565b3480156100f357600080fd5b50610062610102366004610644565b61041b565b34801561011357600080fd5b506100c2610482565b60006101467f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166101ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b3660008037600080366000845af43d6000803e8061020c573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061026b575033155b1561027c576102798161050e565b50565b61027961011c565b60606102ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102e5575033155b15610375576102f38461050e565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161031d929190610755565b600060405180830381855af49150503d8060008114610358576040519150601f19603f3d011682016040523d82523d6000602084013e61035d565b606091505b50915091508161036c57600080fd5b915061037d9050565b61037d61011c565b9392505050565b60006103ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103e5575033155b1561041057507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b61041861011c565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610474575033155b1561027c5761027981610576565b60006104ac7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104e3575033155b1561041057507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006105a07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063f57600080fd5b919050565b60006020828403121561065657600080fd5b61037d8261061b565b60008060006040848603121561067457600080fd5b61067d8461061b565b9250602084013567ffffffffffffffff8082111561069a57600080fd5b818601915086601f8301126106ae57600080fd5b8135818111156106bd57600080fd5b8760208285010111156106cf57600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b8181101561070f578581018301518582016040015282016106f3565b81811115610721576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea264697066735822122002cf23bcc281eec5c701686c2374a3972d766187632ccdd7ca1fe3d13cb4866264736f6c63430008090033",
"devdoc": {
"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"
}
}
},
"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 owner. The owner has the ability to access the transparent proxy interface."
}
},
"implementation()": {
"returns": {
"_0": "Implementation address."
}
},
"upgradeTo(address)": {
"params": {
"_implementation": "The address of the implementation contract"
}
},
"upgradeToAndCall(address,bytes)": {
"params": {
"_data": "The calldata to delegatecall the new implementation with",
"_implementation": "The address of the implementation contract"
}
}
},
"title": "Proxy",
"version": 1
},
"userdoc": {
"events": {
"AdminChanged(address,address)": {
"notice": "An event that is emitted each time the owner is upgraded. This event is part of the EIP 1967 spec."
},
"Upgraded(address)": {
"notice": "An event that is emitted each time the implementation is changed. This event is part of the EIP 1967 spec."
}
},
"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": "set the initial owner during contract deployment. The owner is stored at the eip1967 owner storage slot so that storage collision with the implementation is not possible."
},
"implementation()": {
"notice": "Queries the implementation address."
},
"upgradeTo(address)": {
"notice": "Set the implementation contract address. The code at this address will execute when this contract is called."
},
"upgradeToAndCall(address,bytes)": {
"notice": "Set the implementation and call a function in a single transaction. This is useful to ensure atomic `initialize()` based upgrades."
}
},
"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 offchain simulation.",
"version": 1
},
"storageLayout": {
"storage": [],
"types": null
}
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"address": "0x10a561600Dd996DFFc540F3e860e1f20247Ce7f4",
"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"
}
],
"args": [
"0x9C6373dE60c2D3297b18A8f964618ac46E011B58"
],
"numDeployments": 1,
"solcInputHash": "9bf33bb642648b258386a9c465b5d346",
"metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"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\"}],\"devdoc\":{\"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\"}}},\"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 owner. The owner has the ability to access the transparent proxy interface.\"}},\"implementation()\":{\"returns\":{\"_0\":\"Implementation address.\"}},\"upgradeTo(address)\":{\"params\":{\"_implementation\":\"The address of the implementation contract\"}},\"upgradeToAndCall(address,bytes)\":{\"params\":{\"_data\":\"The calldata to delegatecall the new implementation with\",\"_implementation\":\"The address of the implementation contract\"}}},\"title\":\"Proxy\",\"version\":1},\"userdoc\":{\"events\":{\"AdminChanged(address,address)\":{\"notice\":\"An event that is emitted each time the owner is upgraded. This event is part of the EIP 1967 spec.\"},\"Upgraded(address)\":{\"notice\":\"An event that is emitted each time the implementation is changed. This event is part of the EIP 1967 spec.\"}},\"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\":\"set the initial owner during contract deployment. The owner is stored at the eip1967 owner storage slot so that storage collision with the implementation is not possible.\"},\"implementation()\":{\"notice\":\"Queries the implementation address.\"},\"upgradeTo(address)\":{\"notice\":\"Set the implementation contract address. The code at this address will execute when this contract is called.\"},\"upgradeToAndCall(address,bytes)\":{\"notice\":\"Set the implementation and call a function in a single transaction. This is useful to ensure atomic `initialize()` based upgrades.\"}},\"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 offchain simulation.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol\":\"Proxy\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Proxy\\n * @notice Proxy is a transparent proxy that passes through the call\\n * if the caller is the owner or if the caller is `address(0)`,\\n * meaning that the call originated from an offchain simulation.\\n */\\ncontract Proxy {\\n /**\\n * @notice An event that is emitted each time the implementation is changed.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param implementation The address of the implementation contract\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @notice An event that is emitted each time the owner is upgraded.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param previousAdmin The previous owner of the contract\\n * @param newAdmin The new owner of the contract\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @notice The storage slot that holds the address of the implementation.\\n * bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n */\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @notice The storage slot that holds the address of the owner.\\n * bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n */\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @notice set the initial owner during contract deployment. The\\n * owner is stored at the eip1967 owner storage slot so that\\n * storage collision with the implementation is not possible.\\n *\\n * @param _admin Address of the initial contract owner. The owner has\\n * the ability to access the transparent proxy interface.\\n */\\n constructor(address _admin) {\\n _changeAdmin(_admin);\\n }\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /**\\n * @notice A modifier that reverts if not called by the owner\\n * or by `address(0)` to allow `eth_call` to interact\\n * with the proxy without needing to use low level storage\\n * inspection. It is assumed that nobody controls the private\\n * key for `address(0)`.\\n */\\n modifier proxyCallIfNotAdmin() {\\n if (msg.sender == _getAdmin() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /**\\n * @notice Set the implementation contract address. The code at this\\n * address will execute when this contract is called.\\n *\\n * @param _implementation The address of the implementation contract\\n */\\n function upgradeTo(address _implementation) external proxyCallIfNotAdmin {\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * @notice Set the implementation and call a function in a single\\n * transaction. This is useful to ensure atomic `initialize()`\\n * based upgrades.\\n *\\n * @param _implementation The address of the implementation contract\\n * @param _data The calldata to delegatecall the new\\n * implementation with\\n */\\n function upgradeToAndCall(address _implementation, bytes calldata _data)\\n external\\n payable\\n proxyCallIfNotAdmin\\n returns (bytes memory)\\n {\\n _setImplementation(_implementation);\\n (bool success, bytes memory returndata) = _implementation.delegatecall(_data);\\n require(success);\\n return returndata;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract. Only callable by the owner.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function changeAdmin(address _admin) external proxyCallIfNotAdmin {\\n _changeAdmin(_admin);\\n }\\n\\n /**\\n * @notice Gets the owner of the proxy contract.\\n *\\n * @return Owner address.\\n */\\n function admin() external proxyCallIfNotAdmin returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return Implementation address.\\n */\\n function implementation() external proxyCallIfNotAdmin returns (address) {\\n return _getImplementation();\\n }\\n\\n /**\\n * @notice Sets the implementation address.\\n *\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n emit Upgraded(_implementation);\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function _changeAdmin(address _admin) internal {\\n address previous = _getAdmin();\\n assembly {\\n sstore(OWNER_KEY, _admin)\\n }\\n emit AdminChanged(previous, _admin);\\n }\\n\\n /**\\n * @notice Queries the owner of the proxy contract.\\n *\\n * @return owner address.\\n */\\n function _getAdmin() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * @notice Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"Proxy: implementation not initialized\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2a6719fd9a11adf0efba0243e5c68d56b255296b84cc82bd39326c902e055077\",\"license\":\"MIT\"}},\"version\":1}",
"bytecode": "0x608060405234801561001057600080fd5b506040516108ac3803806108ac83398101604081905261002f916100b2565b6100388161003e565b506100e2565b600061005660008051602061088c8339815191525490565b60008051602061088c833981519152839055604080516001600160a01b038084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b6000602082840312156100c457600080fd5b81516001600160a01b03811681146100db57600080fd5b9392505050565b61079b806100f16000396000f3fe60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146100ad5780638f283970146100e7578063f851a440146101075761005a565b80633659cfe6146100645780634f1ef28614610084575b61006261011c565b005b34801561007057600080fd5b5061006261007f366004610644565b610212565b61009761009236600461065f565b610284565b6040516100a491906106e2565b60405180910390f35b3480156100b957600080fd5b506100c2610384565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a4565b3480156100f357600080fd5b50610062610102366004610644565b61041b565b34801561011357600080fd5b506100c2610482565b60006101467f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166101ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b3660008037600080366000845af43d6000803e8061020c573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061026b575033155b1561027c576102798161050e565b50565b61027961011c565b60606102ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102e5575033155b15610375576102f38461050e565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161031d929190610755565b600060405180830381855af49150503d8060008114610358576040519150601f19603f3d011682016040523d82523d6000602084013e61035d565b606091505b50915091508161036c57600080fd5b915061037d9050565b61037d61011c565b9392505050565b60006103ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103e5575033155b1561041057507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b61041861011c565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610474575033155b1561027c5761027981610576565b60006104ac7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104e3575033155b1561041057507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006105a07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063f57600080fd5b919050565b60006020828403121561065657600080fd5b61037d8261061b565b60008060006040848603121561067457600080fd5b61067d8461061b565b9250602084013567ffffffffffffffff8082111561069a57600080fd5b818601915086601f8301126106ae57600080fd5b8135818111156106bd57600080fd5b8760208285010111156106cf57600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b8181101561070f578581018301518582016040015282016106f3565b81811115610721576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea264697066735822122002cf23bcc281eec5c701686c2374a3972d766187632ccdd7ca1fe3d13cb4866264736f6c63430008090033b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103",
"deployedBytecode": "0x60806040526004361061005a5760003560e01c80635c60da1b116100435780635c60da1b146100ad5780638f283970146100e7578063f851a440146101075761005a565b80633659cfe6146100645780634f1ef28614610084575b61006261011c565b005b34801561007057600080fd5b5061006261007f366004610644565b610212565b61009761009236600461065f565b610284565b6040516100a491906106e2565b60405180910390f35b3480156100b957600080fd5b506100c2610384565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016100a4565b3480156100f357600080fd5b50610062610102366004610644565b61041b565b34801561011357600080fd5b506100c2610482565b60006101467f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b905073ffffffffffffffffffffffffffffffffffffffff81166101ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f50726f78793a20696d706c656d656e746174696f6e206e6f7420696e6974696160448201527f6c697a6564000000000000000000000000000000000000000000000000000000606482015260840160405180910390fd5b3660008037600080366000845af43d6000803e8061020c573d6000fd5b503d6000f35b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061026b575033155b1561027c576102798161050e565b50565b61027961011c565b60606102ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806102e5575033155b15610375576102f38461050e565b6000808573ffffffffffffffffffffffffffffffffffffffff16858560405161031d929190610755565b600060405180830381855af49150503d8060008114610358576040519150601f19603f3d011682016040523d82523d6000602084013e61035d565b606091505b50915091508161036c57600080fd5b915061037d9050565b61037d61011c565b9392505050565b60006103ae7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806103e5575033155b1561041057507f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc5490565b61041861011c565b90565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035473ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610474575033155b1561027c5761027981610576565b60006104ac7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806104e3575033155b1561041057507fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc81905560405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b90600090a250565b60006105a07fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035490565b7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61038390556040805173ffffffffffffffffffffffffffffffffffffffff8084168252851660208201529192507f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f910160405180910390a15050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461063f57600080fd5b919050565b60006020828403121561065657600080fd5b61037d8261061b565b60008060006040848603121561067457600080fd5b61067d8461061b565b9250602084013567ffffffffffffffff8082111561069a57600080fd5b818601915086601f8301126106ae57600080fd5b8135818111156106bd57600080fd5b8760208285010111156106cf57600080fd5b6020830194508093505050509250925092565b600060208083528351808285015260005b8181101561070f578581018301518582016040015282016106f3565b81811115610721576000604083870101525b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016929092016040019392505050565b818382376000910190815291905056fea264697066735822122002cf23bcc281eec5c701686c2374a3972d766187632ccdd7ca1fe3d13cb4866264736f6c63430008090033",
"devdoc": {
"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"
}
}
},
"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 owner. The owner has the ability to access the transparent proxy interface."
}
},
"implementation()": {
"returns": {
"_0": "Implementation address."
}
},
"upgradeTo(address)": {
"params": {
"_implementation": "The address of the implementation contract"
}
},
"upgradeToAndCall(address,bytes)": {
"params": {
"_data": "The calldata to delegatecall the new implementation with",
"_implementation": "The address of the implementation contract"
}
}
},
"title": "Proxy",
"version": 1
},
"userdoc": {
"events": {
"AdminChanged(address,address)": {
"notice": "An event that is emitted each time the owner is upgraded. This event is part of the EIP 1967 spec."
},
"Upgraded(address)": {
"notice": "An event that is emitted each time the implementation is changed. This event is part of the EIP 1967 spec."
}
},
"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": "set the initial owner during contract deployment. The owner is stored at the eip1967 owner storage slot so that storage collision with the implementation is not possible."
},
"implementation()": {
"notice": "Queries the implementation address."
},
"upgradeTo(address)": {
"notice": "Set the implementation contract address. The code at this address will execute when this contract is called."
},
"upgradeToAndCall(address,bytes)": {
"notice": "Set the implementation and call a function in a single transaction. This is useful to ensure atomic `initialize()` based upgrades."
}
},
"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 offchain simulation.",
"version": 1
},
"storageLayout": {
"storage": [],
"types": null
}
}
\ No newline at end of file
{
"address": "0xb882dF3A3F4c680b82751Bf4F07542039de4e809",
"abi": [
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "user",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "OwnerUpdated",
"type": "event"
},
{
"inputs": [],
"name": "addressManager",
"outputs": [
{
"internalType": "contract Lib_AddressManager",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
},
{
"internalType": "address",
"name": "newAdmin",
"type": "address"
}
],
"name": "changeProxyAdmin",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
}
],
"name": "getProxyAdmin",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
}
],
"name": "getProxyImplementation",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "implementationName",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "isUpgrading",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "proxyType",
"outputs": [
{
"internalType": "enum ProxyAdmin.ProxyType",
"name": "",
"type": "uint8"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "_name",
"type": "string"
},
{
"internalType": "address",
"name": "_address",
"type": "address"
}
],
"name": "setAddress",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_address",
"type": "address"
}
],
"name": "setAddressManager",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_address",
"type": "address"
},
{
"internalType": "string",
"name": "_name",
"type": "string"
}
],
"name": "setImplementationName",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "setOwner",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "_address",
"type": "address"
},
{
"internalType": "enum ProxyAdmin.ProxyType",
"name": "_type",
"type": "uint8"
}
],
"name": "setProxyType",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bool",
"name": "_upgrading",
"type": "bool"
}
],
"name": "setUpgrading",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
},
{
"internalType": "address",
"name": "implementation",
"type": "address"
}
],
"name": "upgrade",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "contract Proxy",
"name": "proxy",
"type": "address"
},
{
"internalType": "address",
"name": "implementation",
"type": "address"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "upgradeAndCall",
"outputs": [],
"stateMutability": "payable",
"type": "function"
}
],
"args": [
"0x9C6373dE60c2D3297b18A8f964618ac46E011B58"
],
"numDeployments": 1,
"solcInputHash": "9bf33bb642648b258386a9c465b5d346",
"metadata": "{\"compiler\":{\"version\":\"0.8.9+commit.e5eed63a\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnerUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"addressManager\",\"outputs\":[{\"internalType\":\"contract Lib_AddressManager\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"newAdmin\",\"type\":\"address\"}],\"name\":\"changeProxyAdmin\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"getProxyAdmin\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"}],\"name\":\"getProxyImplementation\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"implementationName\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isUpgrading\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"name\":\"proxyType\",\"outputs\":[{\"internalType\":\"enum ProxyAdmin.ProxyType\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddress\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"}],\"name\":\"setAddressManager\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"}],\"name\":\"setImplementationName\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_address\",\"type\":\"address\"},{\"internalType\":\"enum ProxyAdmin.ProxyType\",\"name\":\"_type\",\"type\":\"uint8\"}],\"name\":\"setProxyType\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_upgrading\",\"type\":\"bool\"}],\"name\":\"setUpgrading\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"}],\"name\":\"upgrade\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"contract Proxy\",\"name\":\"proxy\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"implementation\",\"type\":\"address\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"upgradeAndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}],\"devdoc\":{\"details\":\"This is an auxiliary contract meant to be assigned as the admin of a Proxy, based on the OpenZeppelin implementation. It has backwards compatibility logic to work with the various types of proxies that have been deployed by Optimism.\",\"kind\":\"dev\",\"methods\":{\"changeProxyAdmin(address,address)\":{\"details\":\"Changes the admin of `proxy` to `newAdmin`. This contract must be the current admin of `proxy`.\",\"params\":{\"newAdmin\":\"The address of the admin to update to.\",\"proxy\":\"The proxy that will have its admin updated.\"}},\"getProxyAdmin(address)\":{\"details\":\"Returns the current admin of `proxy`. This contract must be the admin of `proxy`.\",\"params\":{\"proxy\":\"The Proxy to return the admin of.\"},\"returns\":{\"_0\":\"The address of the admin.\"}},\"getProxyImplementation(address)\":{\"details\":\"Returns the current implementation of `proxy`. This contract must be the admin of `proxy`.\",\"params\":{\"proxy\":\"The Proxy to return the implementation of.\"},\"returns\":{\"_0\":\"The address of the implementation.\"}},\"isUpgrading()\":{\"custom:legacy\":\"@notice Legacy function used by the old Chugsplash proxy to determine if an upgrade is happening.\",\"returns\":{\"_0\":\"Whether or not there is an upgrade going on\"}},\"setAddress(string,address)\":{\"custom:legacy\":\"@notice Set an address in the address manager. This is required because only the owner of the AddressManager can set the addresses in it.\",\"params\":{\"_address\":\"The address to set in the address manager.\",\"_name\":\"The name of the address to set in the address manager.\"}},\"setAddressManager(address)\":{\"params\":{\"_address\":\"The address of the address manager.\"}},\"setImplementationName(address,string)\":{\"params\":{\"_address\":\"The address to be named.\",\"_name\":\"The name of the address.\"}},\"setProxyType(address,uint8)\":{\"params\":{\"_type\":\"The type of the proxy.\"}},\"setUpgrading(bool)\":{\"custom:legacy\":\"@notice Set the upgrading status for the Chugsplash proxy type.\",\"params\":{\"_upgrading\":\"Whether or not the system is upgrading.\"}},\"upgrade(address,address)\":{\"details\":\"Upgrades `proxy` to `implementation`. This contract must be the admin of `proxy`.\",\"params\":{\"implementation\":\"The address of the implementation.\",\"proxy\":\"The address of the proxy.\"}},\"upgradeAndCall(address,address,bytes)\":{\"details\":\"Upgrades `proxy` to `implementation` and calls a function on the new implementation. This contract must be the admin of `proxy`.\",\"params\":{\"data\":\"The calldata to pass to the implementation.\",\"implementation\":\"The implementation to upgrade the proxy to.\",\"proxy\":\"The proxy to call.\"}}},\"stateVariables\":{\"addressManager\":{\"custom:legacy\":\"@notice The address of the address manager, this is required to manage the Lib_ResolvedDelegateProxy type.\"},\"implementationName\":{\"custom:legacy\":\"@notice A reverse mapping of addresses to names held in the AddressManager. This must be manually kept up to date with changes in the AddressManager for this contract to be able to work as an admin for the Lib_ResolvedDelegateProxy type.\"},\"proxyType\":{\"custom:legacy\":\"@notice A mapping of proxy types, used for backwards compatibility.\"},\"upgrading\":{\"custom:legacy\":\"@notice A legacy upgrading indicator used by the old Chugsplash Proxy.\"}},\"title\":\"ProxyAdmin\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"constructor\":{\"notice\":\"Set the owner of the ProxyAdmin via constructor argument.\"},\"setAddressManager(address)\":{\"notice\":\"Set the address of the address manager. This is required to manage the legacy `Lib_ResolvedDelegateProxy`.\"},\"setImplementationName(address,string)\":{\"notice\":\"Set the proxy type in the mapping. This needs to be kept up to date by the owner of the contract.\"},\"setProxyType(address,uint8)\":{\"notice\":\"@param _address The address of the proxy.\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol\":\"ProxyAdmin\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":10000},\"remappings\":[]},\"sources\":{\"@eth-optimism/contracts-bedrock/contracts/legacy/L1ChugSplashProxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title iL1ChugSplashDeployer\\n */\\ninterface iL1ChugSplashDeployer {\\n function isUpgrading() external view returns (bool);\\n}\\n\\n/**\\n * @title L1ChugSplashProxy\\n * @dev Basic ChugSplash proxy contract for L1. Very close to being a normal proxy but has added\\n * functions `setCode` and `setStorage` for changing the code or storage of the contract. Nifty!\\n *\\n * Note for future developers: do NOT make anything in this contract 'public' unless you know what\\n * you're doing. Anything public can potentially have a function signature that conflicts with a\\n * signature attached to the implementation contract. Public functions SHOULD always have the\\n * 'proxyCallIfNotOwner' modifier unless there's some *really* good reason not to have that\\n * modifier. And there almost certainly is not a good reason to not have that modifier. Beware!\\n */\\ncontract L1ChugSplashProxy {\\n /*************\\n * Constants *\\n *************/\\n\\n // \\\"Magic\\\" prefix. When prepended to some arbitrary bytecode and used to create a contract, the\\n // appended bytecode will be deployed as given.\\n bytes13 internal constant DEPLOY_CODE_PREFIX = 0x600D380380600D6000396000f3;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n // bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /***************\\n * Constructor *\\n ***************/\\n\\n /**\\n * @param _owner Address of the initial contract owner.\\n */\\n constructor(address _owner) {\\n _setOwner(_owner);\\n }\\n\\n /**********************\\n * Function Modifiers *\\n **********************/\\n\\n /**\\n * Blocks a function from being called when the parent signals that the system should be paused\\n * via an isUpgrading function.\\n */\\n modifier onlyWhenNotPaused() {\\n address owner = _getOwner();\\n\\n // We do a low-level call because there's no guarantee that the owner actually *is* an\\n // L1ChugSplashDeployer contract and Solidity will throw errors if we do a normal call and\\n // it turns out that it isn't the right type of contract.\\n (bool success, bytes memory returndata) = owner.staticcall(\\n abi.encodeWithSelector(iL1ChugSplashDeployer.isUpgrading.selector)\\n );\\n\\n // If the call was unsuccessful then we assume that there's no \\\"isUpgrading\\\" method and we\\n // can just continue as normal. We also expect that the return value is exactly 32 bytes\\n // long. If this isn't the case then we can safely ignore the result.\\n if (success && returndata.length == 32) {\\n // Although the expected value is a *boolean*, it's safer to decode as a uint256 in the\\n // case that the isUpgrading function returned something other than 0 or 1. But we only\\n // really care about the case where this value is 0 (= false).\\n uint256 ret = abi.decode(returndata, (uint256));\\n require(ret == 0, \\\"L1ChugSplashProxy: system is currently being upgraded\\\");\\n }\\n\\n _;\\n }\\n\\n /**\\n * Makes a proxy call instead of triggering the given function when the caller is either the\\n * owner or the zero address. Caller can only ever be the zero address if this function is\\n * being called off-chain via eth_call, which is totally fine and can be convenient for\\n * client-side tooling. Avoids situations where the proxy and implementation share a sighash\\n * and the proxy function ends up being called instead of the implementation one.\\n *\\n * Note: msg.sender == address(0) can ONLY be triggered off-chain via eth_call. If there's a\\n * way for someone to send a transaction with msg.sender == address(0) in any real context then\\n * we have much bigger problems. Primary reason to include this additional allowed sender is\\n * because the owner address can be changed dynamically and we do not want clients to have to\\n * keep track of the current owner in order to make an eth_call that doesn't trigger the\\n * proxied contract.\\n */\\n // slither-disable-next-line incorrect-modifier\\n modifier proxyCallIfNotOwner() {\\n if (msg.sender == _getOwner() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /*********************\\n * Fallback Function *\\n *********************/\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Sets the code that should be running behind this proxy. Note that this scheme is a bit\\n * different from the standard proxy scheme where one would typically deploy the code\\n * separately and then set the implementation address. We're doing it this way because it gives\\n * us a lot more freedom on the client side. Can only be triggered by the contract owner.\\n * @param _code New contract code to run inside this contract.\\n */\\n // slither-disable-next-line external-function\\n function setCode(bytes memory _code) public proxyCallIfNotOwner {\\n // Get the code hash of the current implementation.\\n address implementation = _getImplementation();\\n\\n // If the code hash matches the new implementation then we return early.\\n if (keccak256(_code) == _getAccountCodeHash(implementation)) {\\n return;\\n }\\n\\n // Create the deploycode by appending the magic prefix.\\n bytes memory deploycode = abi.encodePacked(DEPLOY_CODE_PREFIX, _code);\\n\\n // Deploy the code and set the new implementation address.\\n address newImplementation;\\n assembly {\\n newImplementation := create(0x0, add(deploycode, 0x20), mload(deploycode))\\n }\\n\\n // Check that the code was actually deployed correctly. I'm not sure if you can ever\\n // actually fail this check. Should only happen if the contract creation from above runs\\n // out of gas but this parent execution thread does NOT run out of gas. Seems like we\\n // should be doing this check anyway though.\\n require(\\n _getAccountCodeHash(newImplementation) == keccak256(_code),\\n \\\"L1ChugSplashProxy: code was not correctly deployed.\\\"\\n );\\n\\n _setImplementation(newImplementation);\\n }\\n\\n /**\\n * Modifies some storage slot within the proxy contract. Gives us a lot of power to perform\\n * upgrades in a more transparent way. Only callable by the owner.\\n * @param _key Storage key to modify.\\n * @param _value New value for the storage key.\\n */\\n // slither-disable-next-line external-function\\n function setStorage(bytes32 _key, bytes32 _value) public proxyCallIfNotOwner {\\n assembly {\\n sstore(_key, _value)\\n }\\n }\\n\\n /**\\n * Changes the owner of the proxy contract. Only callable by the owner.\\n * @param _owner New owner of the proxy contract.\\n */\\n // slither-disable-next-line external-function\\n function setOwner(address _owner) public proxyCallIfNotOwner {\\n _setOwner(_owner);\\n }\\n\\n /**\\n * Queries the owner of the proxy contract. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Owner address.\\n */\\n // slither-disable-next-line external-function\\n function getOwner() public proxyCallIfNotOwner returns (address) {\\n return _getOwner();\\n }\\n\\n /**\\n * Queries the implementation address. Can only be called by the owner OR by making an\\n * eth_call and setting the \\\"from\\\" address to address(0).\\n * @return Implementation address.\\n */\\n // slither-disable-next-line external-function\\n function getImplementation() public proxyCallIfNotOwner returns (address) {\\n return _getImplementation();\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Sets the implementation address.\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n }\\n\\n /**\\n * Queries the implementation address.\\n * @return Implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * Changes the owner of the proxy contract.\\n * @param _owner New owner of the proxy contract.\\n */\\n function _setOwner(address _owner) internal {\\n assembly {\\n sstore(OWNER_KEY, _owner)\\n }\\n }\\n\\n /**\\n * Queries the owner of the proxy contract.\\n * @return Owner address.\\n */\\n function _getOwner() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * Gets the code hash for a given account.\\n * @param _account Address of the account to get a code hash for.\\n * @return Code hash for the account.\\n */\\n function _getAccountCodeHash(address _account) internal view returns (bytes32) {\\n bytes32 codeHash;\\n assembly {\\n codeHash := extcodehash(_account)\\n }\\n return codeHash;\\n }\\n\\n /**\\n * Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal onlyWhenNotPaused {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"L1ChugSplashProxy: implementation is not set yet\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2572b6e2282bcda28bd5fcb71c33bd40ace74b2786ea42e0604ecbb46aefff1f\",\"license\":\"MIT\"},\"@eth-optimism/contracts-bedrock/contracts/legacy/Lib_AddressManager.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/* External Imports */\\nimport { Ownable } from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\n\\n/**\\n * @title Lib_AddressManager\\n */\\ncontract Lib_AddressManager is Ownable {\\n /**********\\n * Events *\\n **********/\\n\\n event AddressSet(string indexed _name, address _newAddress, address _oldAddress);\\n\\n /*************\\n * Variables *\\n *************/\\n\\n mapping(bytes32 => address) private addresses;\\n\\n /********************\\n * Public Functions *\\n ********************/\\n\\n /**\\n * Changes the address associated with a particular name.\\n * @param _name String name to associate an address with.\\n * @param _address Address to associate with the name.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n bytes32 nameHash = _getNameHash(_name);\\n address oldAddress = addresses[nameHash];\\n addresses[nameHash] = _address;\\n\\n emit AddressSet(_name, _address, oldAddress);\\n }\\n\\n /**\\n * Retrieves the address associated with a given name.\\n * @param _name Name to retrieve an address for.\\n * @return Address associated with the given name.\\n */\\n function getAddress(string memory _name) external view returns (address) {\\n return addresses[_getNameHash(_name)];\\n }\\n\\n /**********************\\n * Internal Functions *\\n **********************/\\n\\n /**\\n * Computes the hash of a name.\\n * @param _name Name to compute a hash for.\\n * @return Hash of the given name.\\n */\\n function _getNameHash(string memory _name) internal pure returns (bytes32) {\\n return keccak256(abi.encodePacked(_name));\\n }\\n}\\n\",\"keccak256\":\"0xcde9b29429d512c549f7c1b8a033f161fa71c18cda08b241748663854196ae14\",\"license\":\"MIT\"},\"@eth-optimism/contracts-bedrock/contracts/universal/Proxy.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\n/**\\n * @title Proxy\\n * @notice Proxy is a transparent proxy that passes through the call\\n * if the caller is the owner or if the caller is `address(0)`,\\n * meaning that the call originated from an offchain simulation.\\n */\\ncontract Proxy {\\n /**\\n * @notice An event that is emitted each time the implementation is changed.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param implementation The address of the implementation contract\\n */\\n event Upgraded(address indexed implementation);\\n\\n /**\\n * @notice An event that is emitted each time the owner is upgraded.\\n * This event is part of the EIP 1967 spec.\\n *\\n * @param previousAdmin The previous owner of the contract\\n * @param newAdmin The new owner of the contract\\n */\\n event AdminChanged(address previousAdmin, address newAdmin);\\n\\n /**\\n * @notice The storage slot that holds the address of the implementation.\\n * bytes32(uint256(keccak256('eip1967.proxy.implementation')) - 1)\\n */\\n bytes32 internal constant IMPLEMENTATION_KEY =\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc;\\n\\n /**\\n * @notice The storage slot that holds the address of the owner.\\n * bytes32(uint256(keccak256('eip1967.proxy.admin')) - 1)\\n */\\n bytes32 internal constant OWNER_KEY =\\n 0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103;\\n\\n /**\\n * @notice set the initial owner during contract deployment. The\\n * owner is stored at the eip1967 owner storage slot so that\\n * storage collision with the implementation is not possible.\\n *\\n * @param _admin Address of the initial contract owner. The owner has\\n * the ability to access the transparent proxy interface.\\n */\\n constructor(address _admin) {\\n _changeAdmin(_admin);\\n }\\n\\n // slither-disable-next-line locked-ether\\n fallback() external payable {\\n // Proxy call by default.\\n _doProxyCall();\\n }\\n\\n /**\\n * @notice A modifier that reverts if not called by the owner\\n * or by `address(0)` to allow `eth_call` to interact\\n * with the proxy without needing to use low level storage\\n * inspection. It is assumed that nobody controls the private\\n * key for `address(0)`.\\n */\\n modifier proxyCallIfNotAdmin() {\\n if (msg.sender == _getAdmin() || msg.sender == address(0)) {\\n _;\\n } else {\\n // This WILL halt the call frame on completion.\\n _doProxyCall();\\n }\\n }\\n\\n /**\\n * @notice Set the implementation contract address. The code at this\\n * address will execute when this contract is called.\\n *\\n * @param _implementation The address of the implementation contract\\n */\\n function upgradeTo(address _implementation) external proxyCallIfNotAdmin {\\n _setImplementation(_implementation);\\n }\\n\\n /**\\n * @notice Set the implementation and call a function in a single\\n * transaction. This is useful to ensure atomic `initialize()`\\n * based upgrades.\\n *\\n * @param _implementation The address of the implementation contract\\n * @param _data The calldata to delegatecall the new\\n * implementation with\\n */\\n function upgradeToAndCall(address _implementation, bytes calldata _data)\\n external\\n payable\\n proxyCallIfNotAdmin\\n returns (bytes memory)\\n {\\n _setImplementation(_implementation);\\n (bool success, bytes memory returndata) = _implementation.delegatecall(_data);\\n require(success);\\n return returndata;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract. Only callable by the owner.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function changeAdmin(address _admin) external proxyCallIfNotAdmin {\\n _changeAdmin(_admin);\\n }\\n\\n /**\\n * @notice Gets the owner of the proxy contract.\\n *\\n * @return Owner address.\\n */\\n function admin() external proxyCallIfNotAdmin returns (address) {\\n return _getAdmin();\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return Implementation address.\\n */\\n function implementation() external proxyCallIfNotAdmin returns (address) {\\n return _getImplementation();\\n }\\n\\n /**\\n * @notice Sets the implementation address.\\n *\\n * @param _implementation New implementation address.\\n */\\n function _setImplementation(address _implementation) internal {\\n assembly {\\n sstore(IMPLEMENTATION_KEY, _implementation)\\n }\\n emit Upgraded(_implementation);\\n }\\n\\n /**\\n * @notice Queries the implementation address.\\n *\\n * @return implementation address.\\n */\\n function _getImplementation() internal view returns (address) {\\n address implementation;\\n assembly {\\n implementation := sload(IMPLEMENTATION_KEY)\\n }\\n return implementation;\\n }\\n\\n /**\\n * @notice Changes the owner of the proxy contract.\\n *\\n * @param _admin New owner of the proxy contract.\\n */\\n function _changeAdmin(address _admin) internal {\\n address previous = _getAdmin();\\n assembly {\\n sstore(OWNER_KEY, _admin)\\n }\\n emit AdminChanged(previous, _admin);\\n }\\n\\n /**\\n * @notice Queries the owner of the proxy contract.\\n *\\n * @return owner address.\\n */\\n function _getAdmin() internal view returns (address) {\\n address owner;\\n assembly {\\n owner := sload(OWNER_KEY)\\n }\\n return owner;\\n }\\n\\n /**\\n * @notice Performs the proxy call via a delegatecall.\\n */\\n function _doProxyCall() internal {\\n address implementation = _getImplementation();\\n\\n require(implementation != address(0), \\\"Proxy: implementation not initialized\\\");\\n\\n assembly {\\n // Copy calldata into memory at 0x0....calldatasize.\\n calldatacopy(0x0, 0x0, calldatasize())\\n\\n // Perform the delegatecall, make sure to pass all available gas.\\n let success := delegatecall(gas(), implementation, 0x0, calldatasize(), 0x0, 0x0)\\n\\n // Copy returndata into memory at 0x0....returndatasize. Note that this *will*\\n // overwrite the calldata that we just copied into memory but that doesn't really\\n // matter because we'll be returning in a second anyway.\\n returndatacopy(0x0, 0x0, returndatasize())\\n\\n // Success == 0 means a revert. We'll revert too and pass the data up.\\n if iszero(success) {\\n revert(0x0, returndatasize())\\n }\\n\\n // Otherwise we'll just return and pass the data up.\\n return(0x0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2a6719fd9a11adf0efba0243e5c68d56b255296b84cc82bd39326c902e055077\",\"license\":\"MIT\"},\"@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.9;\\n\\nimport { Proxy } from \\\"./Proxy.sol\\\";\\nimport { Owned } from \\\"@rari-capital/solmate/src/auth/Owned.sol\\\";\\nimport { Lib_AddressManager } from \\\"../legacy/Lib_AddressManager.sol\\\";\\nimport { L1ChugSplashProxy } from \\\"../legacy/L1ChugSplashProxy.sol\\\";\\n\\n/**\\n * @title ProxyAdmin\\n * @dev This is an auxiliary contract meant to be assigned as the admin of a Proxy, based on\\n * the OpenZeppelin implementation. It has backwards compatibility logic to work with the\\n * various types of proxies that have been deployed by Optimism.\\n */\\ncontract ProxyAdmin is Owned {\\n /**\\n * @notice The proxy types that the ProxyAdmin can manage.\\n *\\n * @custom:value OpenZeppelin Represents the OpenZeppelin style transparent proxy\\n * interface, this is the standard.\\n * @custom:value Chugsplash Represents the Chugsplash proxy interface,\\n * this is legacy.\\n * @custom:value ResolvedDelegate Represents the ResolvedDelegate proxy\\n * interface, this is legacy.\\n */\\n enum ProxyType {\\n OpenZeppelin,\\n Chugsplash,\\n ResolvedDelegate\\n }\\n\\n /**\\n * @custom:legacy\\n * @notice A mapping of proxy types, used for backwards compatibility.\\n */\\n mapping(address => ProxyType) public proxyType;\\n\\n /**\\n * @custom:legacy\\n * @notice A reverse mapping of addresses to names held in the AddressManager. This must be\\n * manually kept up to date with changes in the AddressManager for this contract\\n * to be able to work as an admin for the Lib_ResolvedDelegateProxy type.\\n */\\n mapping(address => string) public implementationName;\\n\\n /**\\n * @custom:legacy\\n * @notice The address of the address manager, this is required to manage the\\n * Lib_ResolvedDelegateProxy type.\\n */\\n Lib_AddressManager public addressManager;\\n\\n /**\\n * @custom:legacy\\n * @notice A legacy upgrading indicator used by the old Chugsplash Proxy.\\n */\\n bool internal upgrading = false;\\n\\n /**\\n * @notice Set the owner of the ProxyAdmin via constructor argument.\\n */\\n constructor(address owner) Owned(owner) {}\\n\\n /**\\n * @notice\\n *\\n * @param _address The address of the proxy.\\n * @param _type The type of the proxy.\\n */\\n function setProxyType(address _address, ProxyType _type) external onlyOwner {\\n proxyType[_address] = _type;\\n }\\n\\n /**\\n * @notice Set the proxy type in the mapping. This needs to be kept up to date by the owner of\\n * the contract.\\n *\\n * @param _address The address to be named.\\n * @param _name The name of the address.\\n */\\n function setImplementationName(address _address, string memory _name) external onlyOwner {\\n implementationName[_address] = _name;\\n }\\n\\n /**\\n * @notice Set the address of the address manager. This is required to manage the legacy\\n * `Lib_ResolvedDelegateProxy`.\\n *\\n * @param _address The address of the address manager.\\n */\\n function setAddressManager(address _address) external onlyOwner {\\n addressManager = Lib_AddressManager(_address);\\n }\\n\\n /**\\n * @custom:legacy\\n * @notice Set an address in the address manager. This is required because only the owner of\\n * the AddressManager can set the addresses in it.\\n *\\n * @param _name The name of the address to set in the address manager.\\n * @param _address The address to set in the address manager.\\n */\\n function setAddress(string memory _name, address _address) external onlyOwner {\\n addressManager.setAddress(_name, _address);\\n }\\n\\n /**\\n * @custom:legacy\\n * @notice Legacy function used by the old Chugsplash proxy to determine if an upgrade is\\n * happening.\\n *\\n * @return Whether or not there is an upgrade going on\\n */\\n function isUpgrading() external view returns (bool) {\\n return upgrading;\\n }\\n\\n /**\\n * @custom:legacy\\n * @notice Set the upgrading status for the Chugsplash proxy type.\\n *\\n * @param _upgrading Whether or not the system is upgrading.\\n */\\n function setUpgrading(bool _upgrading) external onlyOwner {\\n upgrading = _upgrading;\\n }\\n\\n /**\\n * @dev Returns the current implementation of `proxy`.\\n * This contract must be the admin of `proxy`.\\n *\\n * @param proxy The Proxy to return the implementation of.\\n * @return The address of the implementation.\\n */\\n function getProxyImplementation(Proxy proxy) external view returns (address) {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n // We need to manually run the static call since the getter cannot be flagged as view\\n address target;\\n bytes memory data;\\n if (proxyType == ProxyType.OpenZeppelin) {\\n target = address(proxy);\\n data = abi.encodeWithSelector(Proxy.implementation.selector);\\n } else if (proxyType == ProxyType.Chugsplash) {\\n target = address(proxy);\\n data = abi.encodeWithSelector(L1ChugSplashProxy.getImplementation.selector);\\n } else if (proxyType == ProxyType.ResolvedDelegate) {\\n target = address(addressManager);\\n data = abi.encodeWithSelector(\\n Lib_AddressManager.getAddress.selector,\\n implementationName[address(proxy)]\\n );\\n } else {\\n revert(\\\"ProxyAdmin: unknown proxy type\\\");\\n }\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n require(success);\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * @dev Returns the current admin of `proxy`.\\n * This contract must be the admin of `proxy`.\\n *\\n * @param proxy The Proxy to return the admin of.\\n * @return The address of the admin.\\n */\\n function getProxyAdmin(Proxy proxy) external view returns (address) {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n // We need to manually run the static call since the getter cannot be flagged as view\\n address target;\\n bytes memory data;\\n if (proxyType == ProxyType.OpenZeppelin) {\\n target = address(proxy);\\n data = abi.encodeWithSelector(Proxy.admin.selector);\\n } else if (proxyType == ProxyType.Chugsplash) {\\n target = address(proxy);\\n data = abi.encodeWithSelector(L1ChugSplashProxy.getOwner.selector);\\n } else if (proxyType == ProxyType.ResolvedDelegate) {\\n target = address(addressManager);\\n data = abi.encodeWithSignature(\\\"owner()\\\");\\n } else {\\n revert(\\\"ProxyAdmin: unknown proxy type\\\");\\n }\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n require(success);\\n return abi.decode(returndata, (address));\\n }\\n\\n /**\\n * @dev Changes the admin of `proxy` to `newAdmin`. This contract must be the current admin\\n * of `proxy`.\\n *\\n * @param proxy The proxy that will have its admin updated.\\n * @param newAdmin The address of the admin to update to.\\n */\\n function changeProxyAdmin(Proxy proxy, address newAdmin) external onlyOwner {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n if (proxyType == ProxyType.OpenZeppelin) {\\n proxy.changeAdmin(newAdmin);\\n } else if (proxyType == ProxyType.Chugsplash) {\\n L1ChugSplashProxy(payable(proxy)).setOwner(newAdmin);\\n } else if (proxyType == ProxyType.ResolvedDelegate) {\\n Lib_AddressManager(addressManager).transferOwnership(newAdmin);\\n }\\n }\\n\\n /**\\n * @dev Upgrades `proxy` to `implementation`. This contract must be the admin of `proxy`.\\n *\\n * @param proxy The address of the proxy.\\n * @param implementation The address of the implementation.\\n */\\n function upgrade(Proxy proxy, address implementation) public onlyOwner {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n if (proxyType == ProxyType.OpenZeppelin) {\\n proxy.upgradeTo(implementation);\\n } else if (proxyType == ProxyType.Chugsplash) {\\n L1ChugSplashProxy(payable(proxy)).setStorage(\\n 0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc,\\n bytes32(uint256(uint160(implementation)))\\n );\\n } else if (proxyType == ProxyType.ResolvedDelegate) {\\n string memory name = implementationName[address(proxy)];\\n Lib_AddressManager(addressManager).setAddress(name, implementation);\\n }\\n }\\n\\n /**\\n * @dev Upgrades `proxy` to `implementation` and calls a function on the new implementation.\\n * This contract must be the admin of `proxy`.\\n *\\n * @param proxy The proxy to call.\\n * @param implementation The implementation to upgrade the proxy to.\\n * @param data The calldata to pass to the implementation.\\n */\\n function upgradeAndCall(\\n Proxy proxy,\\n address implementation,\\n bytes memory data\\n ) external payable onlyOwner {\\n ProxyType proxyType = proxyType[address(proxy)];\\n\\n if (proxyType == ProxyType.OpenZeppelin) {\\n proxy.upgradeToAndCall{ value: msg.value }(implementation, data);\\n } else {\\n upgrade(proxy, implementation);\\n (bool success, ) = address(proxy).call{ value: msg.value }(data);\\n require(success);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xeae8f76ab92a48720d32a388c0564781cd93ee112e995b187b2bd984c37f9ec1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n _;\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x24e0364e503a9bbde94c715d26573a76f14cd2a202d45f96f52134ab806b67b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@rari-capital/solmate/src/auth/Owned.sol\":{\"content\":\"// SPDX-License-Identifier: AGPL-3.0-only\\npragma solidity >=0.8.0;\\n\\n/// @notice Simple single owner authorization mixin.\\n/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/auth/Owned.sol)\\nabstract contract Owned {\\n /*//////////////////////////////////////////////////////////////\\n EVENTS\\n //////////////////////////////////////////////////////////////*/\\n\\n event OwnerUpdated(address indexed user, address indexed newOwner);\\n\\n /*//////////////////////////////////////////////////////////////\\n OWNERSHIP STORAGE\\n //////////////////////////////////////////////////////////////*/\\n\\n address public owner;\\n\\n modifier onlyOwner() virtual {\\n require(msg.sender == owner, \\\"UNAUTHORIZED\\\");\\n\\n _;\\n }\\n\\n /*//////////////////////////////////////////////////////////////\\n CONSTRUCTOR\\n //////////////////////////////////////////////////////////////*/\\n\\n constructor(address _owner) {\\n owner = _owner;\\n\\n emit OwnerUpdated(address(0), _owner);\\n }\\n\\n /*//////////////////////////////////////////////////////////////\\n OWNERSHIP LOGIC\\n //////////////////////////////////////////////////////////////*/\\n\\n function setOwner(address newOwner) public virtual onlyOwner {\\n owner = newOwner;\\n\\n emit OwnerUpdated(msg.sender, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0x7e91c80b0dd1a14a19cb9e661b99924043adab6d9d893bbfcf3a6a3dc23a6743\",\"license\":\"AGPL-3.0-only\"}},\"version\":1}",
"bytecode": "0x60806040526003805460ff60a01b1916905534801561001d57600080fd5b50604051611d63380380611d6383398101604081905261003c9161008b565b600080546001600160a01b0319166001600160a01b03831690811782556040518392907f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d76908290a350506100bb565b60006020828403121561009d57600080fd5b81516001600160a01b03811681146100b457600080fd5b9392505050565b611c99806100ca6000396000f3fe6080604052600436106100f35760003560e01c8063860f7cda1161008a57806399a88ec41161005957806399a88ec4146102db5780639b2ea4bd146102fb578063b79472621461031b578063f3b7dead1461035657600080fd5b8063860f7cda1461025b5780638d52d4a01461027b5780638da5cb5b1461029b5780639623609d146102c857600080fd5b8063238181ae116100c6578063238181ae146101a45780633ab76e9f146101d15780636bd9f516146101fe5780637eff275e1461023b57600080fd5b80630652b57a146100f857806307c8f7b01461011a57806313af40351461013a578063204e1c7a1461015a575b600080fd5b34801561010457600080fd5b50610118610113366004611638565b610376565b005b34801561012657600080fd5b5061011861013536600461165c565b610443565b34801561014657600080fd5b50610118610155366004611638565b61050e565b34801561016657600080fd5b5061017a610175366004611638565b6105ff565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004611638565b610915565b60405161019b91906116f4565b3480156101dd57600080fd5b5060035461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020a57600080fd5b5061022e610219366004611638565b60016020526000908152604090205460ff1681565b60405161019b9190611736565b34801561024757600080fd5b50610118610256366004611777565b6109af565b34801561026757600080fd5b506101186102763660046118d2565b610bf3565b34801561028757600080fd5b50610118610296366004611922565b610caa565b3480156102a757600080fd5b5060005461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101186102d6366004611954565b610d97565b3480156102e757600080fd5b506101186102f6366004611777565b610fb4565b34801561030757600080fd5b506101186103163660046119ca565b6112b8565b34801561032757600080fd5b5060035474010000000000000000000000000000000000000000900460ff16604051901515815260200161019b565b34801561036257600080fd5b5061017a610371366004611638565b6113c7565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461058f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168160608183600281111561063e5761063e611707565b14156106a45750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5c60da1b00000000000000000000000000000000000000000000000000000000179052839061087f565b60018360028111156106b8576106b8611707565b141561071e5750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167faaf10f4200000000000000000000000000000000000000000000000000000000179052839061087f565b600283600281111561073257610732611707565b141561081d5760035473ffffffffffffffffffffffffffffffffffffffff8681166000908152600260205260409081902090519190921693507fbf40fac1000000000000000000000000000000000000000000000000000000009161079991602401611a65565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061087f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064016103f3565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516108a79190611b44565b600060405180830381855afa9150503d80600081146108e2576040519150601f19603f3d011682016040523d82523d6000602084013e6108e7565b606091505b5091509150816108f657600080fd5b8080602001905181019061090a9190611b60565b979650505050505050565b6002602052600090815260409020805461092e90611a11565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90611a11565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610a6c57610a6c611707565b1415610af9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b158015610adc57600080fd5b505af1158015610af0573d6000803e3d6000fd5b50505050505050565b6001816002811115610b0d57610b0d611707565b1415610b67576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af403590602401610ac2565b6002816002811115610b7b57610b7b611707565b1415610bee576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b90602401600060405180830381600087803b158015610adc57600080fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602090815260409091208251610bee9284019061157a565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911690836002811115610d8e57610d8e611707565b02179055505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff1690816002811115610e5457610e54611707565b1415610f2a576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610eb09087908790600401611b7d565b6000604051808303818588803b158015610ec957600080fd5b505af1158015610edd573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f249190810190611bb4565b50610fae565b610f348484610fb4565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610f5c9190611b44565b60006040518083038185875af1925050503d8060008114610f99576040519150601f19603f3d011682016040523d82523d6000602084013e610f9e565b606091505b5050905080610fac57600080fd5b505b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561107157611071611707565b14156110cb576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401610ac2565b60018160028111156110df576110df611707565b141561115f576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda90604401610ac2565b600281600281111561117357611173611707565b1415610bee5773ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080546111a990611a11565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590611a11565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd935061128092508591508790600401611c2b565b600060405180830381600087803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd906113919085908590600401611c2b565b600060405180830381600087803b1580156113ab57600080fd5b505af11580156113bf573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168160608183600281111561140657611406611707565b141561146c5750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff851a44000000000000000000000000000000000000000000000000000000000179052839061087f565b600183600281111561148057611480611707565b14156114e65750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f893d20e800000000000000000000000000000000000000000000000000000000179052839061087f565b60028360028111156114fa576114fa611707565b141561081d5750506003546040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8da5cb5b0000000000000000000000000000000000000000000000000000000017905273ffffffffffffffffffffffffffffffffffffffff9091169061087f565b82805461158690611a11565b90600052602060002090601f0160209004810192826115a857600085556115ee565b82601f106115c157805160ff19168380011785556115ee565b828001600101855582156115ee579182015b828111156115ee5782518255916020019190600101906115d3565b506115fa9291506115fe565b5090565b5b808211156115fa57600081556001016115ff565b73ffffffffffffffffffffffffffffffffffffffff8116811461163557600080fd5b50565b60006020828403121561164a57600080fd5b813561165581611613565b9392505050565b60006020828403121561166e57600080fd5b8135801515811461165557600080fd5b60005b83811015611699578181015183820152602001611681565b83811115610fae5750506000910152565b600081518084526116c281602086016020860161167e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061165560208301846116aa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310611771577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561178a57600080fd5b823561179581611613565b915060208301356117a581611613565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611826576118266117b0565b604052919050565b600067ffffffffffffffff821115611848576118486117b0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006118876118828461182e565b6117df565b905082815283838301111561189b57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126118c357600080fd5b61165583833560208501611874565b600080604083850312156118e557600080fd5b82356118f081611613565b9150602083013567ffffffffffffffff81111561190c57600080fd5b611918858286016118b2565b9150509250929050565b6000806040838503121561193557600080fd5b823561194081611613565b91506020830135600381106117a557600080fd5b60008060006060848603121561196957600080fd5b833561197481611613565b9250602084013561198481611613565b9150604084013567ffffffffffffffff8111156119a057600080fd5b8401601f810186136119b157600080fd5b6119c086823560208401611874565b9150509250925092565b600080604083850312156119dd57600080fd5b823567ffffffffffffffff8111156119f457600080fd5b611a00858286016118b2565b92505060208301356117a581611613565b600181811c90821680611a2557607f821691505b60208210811415611a5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208083526000845481600182811c915080831680611a8757607f831692505b858310811415611abe577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015611adb5760018114611b0a57611b35565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861682528782019650611b35565b60008b81526020902060005b86811015611b2f57815484820152908501908901611b16565b83019750505b50949998505050505050505050565b60008251611b5681846020870161167e565b9190910192915050565b600060208284031215611b7257600080fd5b815161165581611613565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000611bac60408301846116aa565b949350505050565b600060208284031215611bc657600080fd5b815167ffffffffffffffff811115611bdd57600080fd5b8201601f81018413611bee57600080fd5b8051611bfc6118828261182e565b818152856020838501011115611c1157600080fd5b611c2282602083016020860161167e565b95945050505050565b604081526000611c3e60408301856116aa565b905073ffffffffffffffffffffffffffffffffffffffff83166020830152939250505056fea2646970667358221220de0df1c1387eaa7baaaf13702966168d299cb9acba3a7f279def6637fe6e54ca64736f6c63430008090033",
"deployedBytecode": "0x6080604052600436106100f35760003560e01c8063860f7cda1161008a57806399a88ec41161005957806399a88ec4146102db5780639b2ea4bd146102fb578063b79472621461031b578063f3b7dead1461035657600080fd5b8063860f7cda1461025b5780638d52d4a01461027b5780638da5cb5b1461029b5780639623609d146102c857600080fd5b8063238181ae116100c6578063238181ae146101a45780633ab76e9f146101d15780636bd9f516146101fe5780637eff275e1461023b57600080fd5b80630652b57a146100f857806307c8f7b01461011a57806313af40351461013a578063204e1c7a1461015a575b600080fd5b34801561010457600080fd5b50610118610113366004611638565b610376565b005b34801561012657600080fd5b5061011861013536600461165c565b610443565b34801561014657600080fd5b50610118610155366004611638565b61050e565b34801561016657600080fd5b5061017a610175366004611638565b6105ff565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b3480156101b057600080fd5b506101c46101bf366004611638565b610915565b60405161019b91906116f4565b3480156101dd57600080fd5b5060035461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561020a57600080fd5b5061022e610219366004611638565b60016020526000908152604090205460ff1681565b60405161019b9190611736565b34801561024757600080fd5b50610118610256366004611777565b6109af565b34801561026757600080fd5b506101186102763660046118d2565b610bf3565b34801561028757600080fd5b50610118610296366004611922565b610caa565b3480156102a757600080fd5b5060005461017a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101186102d6366004611954565b610d97565b3480156102e757600080fd5b506101186102f6366004611777565b610fb4565b34801561030757600080fd5b506101186103163660046119ca565b6112b8565b34801561032757600080fd5b5060035474010000000000000000000000000000000000000000900460ff16604051901515815260200161019b565b34801561036257600080fd5b5061017a610371366004611638565b6113c7565b60005473ffffffffffffffffffffffffffffffffffffffff1633146103fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600380547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff1633146104c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003805491151574010000000000000000000000000000000000000000027fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff909216919091179055565b60005473ffffffffffffffffffffffffffffffffffffffff16331461058f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8292fce18fa69edf4db7b94ea2e58241df0ae57f97e0a6c9b29067028bf92d769190a350565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168160608183600281111561063e5761063e611707565b14156106a45750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f5c60da1b00000000000000000000000000000000000000000000000000000000179052839061087f565b60018360028111156106b8576106b8611707565b141561071e5750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167faaf10f4200000000000000000000000000000000000000000000000000000000179052839061087f565b600283600281111561073257610732611707565b141561081d5760035473ffffffffffffffffffffffffffffffffffffffff8681166000908152600260205260409081902090519190921693507fbf40fac1000000000000000000000000000000000000000000000000000000009161079991602401611a65565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152905061087f565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f50726f787941646d696e3a20756e6b6e6f776e2070726f78792074797065000060448201526064016103f3565b6000808373ffffffffffffffffffffffffffffffffffffffff16836040516108a79190611b44565b600060405180830381855afa9150503d80600081146108e2576040519150601f19603f3d011682016040523d82523d6000602084013e6108e7565b606091505b5091509150816108f657600080fd5b8080602001905181019061090a9190611b60565b979650505050505050565b6002602052600090815260409020805461092e90611a11565b80601f016020809104026020016040519081016040528092919081815260200182805461095a90611a11565b80156109a75780601f1061097c576101008083540402835291602001916109a7565b820191906000526020600020905b81548152906001019060200180831161098a57829003601f168201915b505050505081565b60005473ffffffffffffffffffffffffffffffffffffffff163314610a30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff1690816002811115610a6c57610a6c611707565b1415610af9576040517f8f28397000000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690638f283970906024015b600060405180830381600087803b158015610adc57600080fd5b505af1158015610af0573d6000803e3d6000fd5b50505050505050565b6001816002811115610b0d57610b0d611707565b1415610b67576040517f13af403500000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301528416906313af403590602401610ac2565b6002816002811115610b7b57610b7b611707565b1415610bee576003546040517ff2fde38b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301529091169063f2fde38b90602401600060405180830381600087803b158015610adc57600080fd5b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526002602090815260409091208251610bee9284019061157a565b60005473ffffffffffffffffffffffffffffffffffffffff163314610d2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff82166000908152600160208190526040909120805483927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0090911690836002811115610d8e57610d8e611707565b02179055505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff831660009081526001602052604081205460ff1690816002811115610e5457610e54611707565b1415610f2a576040517f4f1ef28600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff851690634f1ef286903490610eb09087908790600401611b7d565b6000604051808303818588803b158015610ec957600080fd5b505af1158015610edd573d6000803e3d6000fd5b50505050506040513d6000823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201604052610f249190810190611bb4565b50610fae565b610f348484610fb4565b60008473ffffffffffffffffffffffffffffffffffffffff163484604051610f5c9190611b44565b60006040518083038185875af1925050503d8060008114610f99576040519150601f19603f3d011682016040523d82523d6000602084013e610f9e565b606091505b5050905080610fac57600080fd5b505b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b73ffffffffffffffffffffffffffffffffffffffff821660009081526001602052604081205460ff169081600281111561107157611071611707565b14156110cb576040517f3659cfe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8381166004830152841690633659cfe690602401610ac2565b60018160028111156110df576110df611707565b141561115f576040517f9b0b0fda0000000000000000000000000000000000000000000000000000000081527f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc600482015273ffffffffffffffffffffffffffffffffffffffff8381166024830152841690639b0b0fda90604401610ac2565b600281600281111561117357611173611707565b1415610bee5773ffffffffffffffffffffffffffffffffffffffff8316600090815260026020526040812080546111a990611a11565b80601f01602080910402602001604051908101604052809291908181526020018280546111d590611a11565b80156112225780601f106111f757610100808354040283529160200191611222565b820191906000526020600020905b81548152906001019060200180831161120557829003601f168201915b50506003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815294955073ffffffffffffffffffffffffffffffffffffffff1693639b2ea4bd935061128092508591508790600401611c2b565b600060405180830381600087803b15801561129a57600080fd5b505af11580156112ae573d6000803e3d6000fd5b5050505050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611339576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f554e415554484f52495a4544000000000000000000000000000000000000000060448201526064016103f3565b6003546040517f9b2ea4bd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff90911690639b2ea4bd906113919085908590600401611c2b565b600060405180830381600087803b1580156113ab57600080fd5b505af11580156113bf573d6000803e3d6000fd5b505050505050565b73ffffffffffffffffffffffffffffffffffffffff811660009081526001602052604081205460ff168160608183600281111561140657611406611707565b141561146c5750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167ff851a44000000000000000000000000000000000000000000000000000000000179052839061087f565b600183600281111561148057611480611707565b14156114e65750506040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f893d20e800000000000000000000000000000000000000000000000000000000179052839061087f565b60028360028111156114fa576114fa611707565b141561081d5750506003546040805160048152602481019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8da5cb5b0000000000000000000000000000000000000000000000000000000017905273ffffffffffffffffffffffffffffffffffffffff9091169061087f565b82805461158690611a11565b90600052602060002090601f0160209004810192826115a857600085556115ee565b82601f106115c157805160ff19168380011785556115ee565b828001600101855582156115ee579182015b828111156115ee5782518255916020019190600101906115d3565b506115fa9291506115fe565b5090565b5b808211156115fa57600081556001016115ff565b73ffffffffffffffffffffffffffffffffffffffff8116811461163557600080fd5b50565b60006020828403121561164a57600080fd5b813561165581611613565b9392505050565b60006020828403121561166e57600080fd5b8135801515811461165557600080fd5b60005b83811015611699578181015183820152602001611681565b83811115610fae5750506000910152565b600081518084526116c281602086016020860161167e565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b60208152600061165560208301846116aa565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b6020810160038310611771577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b91905290565b6000806040838503121561178a57600080fd5b823561179581611613565b915060208301356117a581611613565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715611826576118266117b0565b604052919050565b600067ffffffffffffffff821115611848576118486117b0565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b60006118876118828461182e565b6117df565b905082815283838301111561189b57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126118c357600080fd5b61165583833560208501611874565b600080604083850312156118e557600080fd5b82356118f081611613565b9150602083013567ffffffffffffffff81111561190c57600080fd5b611918858286016118b2565b9150509250929050565b6000806040838503121561193557600080fd5b823561194081611613565b91506020830135600381106117a557600080fd5b60008060006060848603121561196957600080fd5b833561197481611613565b9250602084013561198481611613565b9150604084013567ffffffffffffffff8111156119a057600080fd5b8401601f810186136119b157600080fd5b6119c086823560208401611874565b9150509250925092565b600080604083850312156119dd57600080fd5b823567ffffffffffffffff8111156119f457600080fd5b611a00858286016118b2565b92505060208301356117a581611613565b600181811c90821680611a2557607f821691505b60208210811415611a5f577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b600060208083526000845481600182811c915080831680611a8757607f831692505b858310811415611abe577f4e487b710000000000000000000000000000000000000000000000000000000085526022600452602485fd5b878601838152602001818015611adb5760018114611b0a57611b35565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861682528782019650611b35565b60008b81526020902060005b86811015611b2f57815484820152908501908901611b16565b83019750505b50949998505050505050505050565b60008251611b5681846020870161167e565b9190910192915050565b600060208284031215611b7257600080fd5b815161165581611613565b73ffffffffffffffffffffffffffffffffffffffff83168152604060208201526000611bac60408301846116aa565b949350505050565b600060208284031215611bc657600080fd5b815167ffffffffffffffff811115611bdd57600080fd5b8201601f81018413611bee57600080fd5b8051611bfc6118828261182e565b818152856020838501011115611c1157600080fd5b611c2282602083016020860161167e565b95945050505050565b604081526000611c3e60408301856116aa565b905073ffffffffffffffffffffffffffffffffffffffff83166020830152939250505056fea2646970667358221220de0df1c1387eaa7baaaf13702966168d299cb9acba3a7f279def6637fe6e54ca64736f6c63430008090033",
"devdoc": {
"details": "This is an auxiliary contract meant to be assigned as the admin of a Proxy, based on the OpenZeppelin implementation. It has backwards compatibility logic to work with the various types of proxies that have been deployed by Optimism.",
"kind": "dev",
"methods": {
"changeProxyAdmin(address,address)": {
"details": "Changes the admin of `proxy` to `newAdmin`. This contract must be the current admin of `proxy`.",
"params": {
"newAdmin": "The address of the admin to update to.",
"proxy": "The proxy that will have its admin updated."
}
},
"getProxyAdmin(address)": {
"details": "Returns the current admin of `proxy`. This contract must be the admin of `proxy`.",
"params": {
"proxy": "The Proxy to return the admin of."
},
"returns": {
"_0": "The address of the admin."
}
},
"getProxyImplementation(address)": {
"details": "Returns the current implementation of `proxy`. This contract must be the admin of `proxy`.",
"params": {
"proxy": "The Proxy to return the implementation of."
},
"returns": {
"_0": "The address of the implementation."
}
},
"isUpgrading()": {
"custom:legacy": "@notice Legacy function used by the old Chugsplash proxy to determine if an upgrade is happening.",
"returns": {
"_0": "Whether or not there is an upgrade going on"
}
},
"setAddress(string,address)": {
"custom:legacy": "@notice Set an address in the address manager. This is required because only the owner of the AddressManager can set the addresses in it.",
"params": {
"_address": "The address to set in the address manager.",
"_name": "The name of the address to set in the address manager."
}
},
"setAddressManager(address)": {
"params": {
"_address": "The address of the address manager."
}
},
"setImplementationName(address,string)": {
"params": {
"_address": "The address to be named.",
"_name": "The name of the address."
}
},
"setProxyType(address,uint8)": {
"params": {
"_type": "The type of the proxy."
}
},
"setUpgrading(bool)": {
"custom:legacy": "@notice Set the upgrading status for the Chugsplash proxy type.",
"params": {
"_upgrading": "Whether or not the system is upgrading."
}
},
"upgrade(address,address)": {
"details": "Upgrades `proxy` to `implementation`. This contract must be the admin of `proxy`.",
"params": {
"implementation": "The address of the implementation.",
"proxy": "The address of the proxy."
}
},
"upgradeAndCall(address,address,bytes)": {
"details": "Upgrades `proxy` to `implementation` and calls a function on the new implementation. This contract must be the admin of `proxy`.",
"params": {
"data": "The calldata to pass to the implementation.",
"implementation": "The implementation to upgrade the proxy to.",
"proxy": "The proxy to call."
}
}
},
"stateVariables": {
"addressManager": {
"custom:legacy": "@notice The address of the address manager, this is required to manage the Lib_ResolvedDelegateProxy type."
},
"implementationName": {
"custom:legacy": "@notice A reverse mapping of addresses to names held in the AddressManager. This must be manually kept up to date with changes in the AddressManager for this contract to be able to work as an admin for the Lib_ResolvedDelegateProxy type."
},
"proxyType": {
"custom:legacy": "@notice A mapping of proxy types, used for backwards compatibility."
},
"upgrading": {
"custom:legacy": "@notice A legacy upgrading indicator used by the old Chugsplash Proxy."
}
},
"title": "ProxyAdmin",
"version": 1
},
"userdoc": {
"kind": "user",
"methods": {
"constructor": {
"notice": "Set the owner of the ProxyAdmin via constructor argument."
},
"setAddressManager(address)": {
"notice": "Set the address of the address manager. This is required to manage the legacy `Lib_ResolvedDelegateProxy`."
},
"setImplementationName(address,string)": {
"notice": "Set the proxy type in the mapping. This needs to be kept up to date by the owner of the contract."
},
"setProxyType(address,uint8)": {
"notice": "@param _address The address of the proxy."
}
},
"version": 1
},
"storageLayout": {
"storage": [
{
"astId": 4446,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "owner",
"offset": 0,
"slot": "0",
"type": "t_address"
},
{
"astId": 624,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "proxyType",
"offset": 0,
"slot": "1",
"type": "t_mapping(t_address,t_enum(ProxyType)618)"
},
{
"astId": 629,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "implementationName",
"offset": 0,
"slot": "2",
"type": "t_mapping(t_address,t_string_storage)"
},
{
"astId": 633,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "addressManager",
"offset": 0,
"slot": "3",
"type": "t_contract(Lib_AddressManager)376"
},
{
"astId": 637,
"contract": "@eth-optimism/contracts-bedrock/contracts/universal/ProxyAdmin.sol:ProxyAdmin",
"label": "upgrading",
"offset": 20,
"slot": "3",
"type": "t_bool"
}
],
"types": {
"t_address": {
"encoding": "inplace",
"label": "address",
"numberOfBytes": "20"
},
"t_bool": {
"encoding": "inplace",
"label": "bool",
"numberOfBytes": "1"
},
"t_contract(Lib_AddressManager)376": {
"encoding": "inplace",
"label": "contract Lib_AddressManager",
"numberOfBytes": "20"
},
"t_enum(ProxyType)618": {
"encoding": "inplace",
"label": "enum ProxyAdmin.ProxyType",
"numberOfBytes": "1"
},
"t_mapping(t_address,t_enum(ProxyType)618)": {
"encoding": "mapping",
"key": "t_address",
"label": "mapping(address => enum ProxyAdmin.ProxyType)",
"numberOfBytes": "32",
"value": "t_enum(ProxyType)618"
},
"t_mapping(t_address,t_string_storage)": {
"encoding": "mapping",
"key": "t_address",
"label": "mapping(address => string)",
"numberOfBytes": "32",
"value": "t_string_storage"
},
"t_string_storage": {
"encoding": "bytes",
"label": "string",
"numberOfBytes": "32"
}
}
}
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -80,13 +80,6 @@ const config: HardhatUserConfig = { ...@@ -80,13 +80,6 @@ const config: HardhatUserConfig = {
deployConfig: './config/deploy', deployConfig: './config/deploy',
}, },
deployConfigSpec: configSpec, deployConfigSpec: configSpec,
external: {
contracts: [
{
artifacts: '../contracts-bedrock/artifacts',
},
],
},
mocha: { mocha: {
timeout: 50000, timeout: 50000,
}, },
......
...@@ -55,6 +55,7 @@ ...@@ -55,6 +55,7 @@
"devDependencies": { "devDependencies": {
"@defi-wonderland/smock": "^2.0.7", "@defi-wonderland/smock": "^2.0.7",
"@eth-optimism/contracts": "^0.5.28", "@eth-optimism/contracts": "^0.5.28",
"@eth-optimism/contracts-bedrock": "^0.2.0",
"@eth-optimism/core-utils": "^0.8.7", "@eth-optimism/core-utils": "^0.8.7",
"@eth-optimism/hardhat-deploy-config": "^0.2.0", "@eth-optimism/hardhat-deploy-config": "^0.2.0",
"@ethersproject/hardware-wallets": "^5.6.1", "@ethersproject/hardware-wallets": "^5.6.1",
......
...@@ -2582,19 +2582,6 @@ ...@@ -2582,19 +2582,6 @@
resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-ethers/-/hardhat-ethers-2.0.2.tgz#c472abcba0c5185aaa4ad4070146e95213c68511"
integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg== integrity sha512-6quxWe8wwS4X5v3Au8q1jOvXYEPkS1Fh+cME5u6AwNdnI4uERvPlVjlgRWzpnb+Rrt1l/cEqiNRH9GlsBMSDQg==
"@nomiclabs/hardhat-etherscan@^2.1.3":
version "2.1.8"
resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-2.1.8.tgz#e206275e96962cd15e5ba9148b44388bc922d8c2"
integrity sha512-0+rj0SsZotVOcTLyDOxnOc3Gulo8upo0rsw/h+gBPcmtj91YqYJNhdARHoBxOhhE8z+5IUQPx+Dii04lXT14PA==
dependencies:
"@ethersproject/abi" "^5.1.2"
"@ethersproject/address" "^5.0.2"
cbor "^5.0.2"
debug "^4.1.1"
fs-extra "^7.0.1"
node-fetch "^2.6.0"
semver "^6.3.0"
"@nomiclabs/hardhat-etherscan@^3.0.1": "@nomiclabs/hardhat-etherscan@^3.0.1":
version "3.0.4" version "3.0.4"
resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.0.4.tgz#b12e3e226a5b73c4a66d0e6943f948bd093b2711" resolved "https://registry.yarnpkg.com/@nomiclabs/hardhat-etherscan/-/hardhat-etherscan-3.0.4.tgz#b12e3e226a5b73c4a66d0e6943f948bd093b2711"
...@@ -12866,7 +12853,7 @@ node-environment-flags@1.0.6: ...@@ -12866,7 +12853,7 @@ node-environment-flags@1.0.6:
object.getownpropertydescriptors "^2.0.3" object.getownpropertydescriptors "^2.0.3"
semver "^5.7.0" semver "^5.7.0"
node-fetch@^2.6.0, node-fetch@^2.6.1, node-fetch@^2.6.7: node-fetch@^2.6.1, node-fetch@^2.6.7:
version "2.6.7" version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment