{"id":"ce3547e64aa1b2653be58547eacb785a","_format":"hh-sol-build-info-1","solcVersion":"0.7.6","solcLongVersion":"0.7.6+commit.7338295f","input":{"language":"Solidity","sources":{"contracts/libraries/SafeMigration.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\nimport {SafeStorage} from \"../libraries/SafeStorage.sol\";\n\ninterface ISafe {\n    function setFallbackHandler(address handler) external;\n}\n\n/**\n * @title Migration Contract for Safe Upgrade\n * @notice This is a generic contract that facilitates Safe and SafeL2 proxy contracts to migrate their singleton address.\n *         The supported target Safe version is immutable and set in the constructor during the deployment of the contract.\n *         This contract also supports migration with fallback handler update.\n * @author @safe-global/safe-protocol\n * @dev IMPORTANT: The library is intended to be used with the Safe standard proxy that stores the singleton address\n *      at the storage slot 0. Use at your own risk with custom proxy implementations. The contract will allow invocations\n *      to the migration functions only via delegatecall.\n */\ncontract SafeMigration is SafeStorage {\n    /**\n     * @notice Address of this contract\n     */\n    address public immutable MIGRATION_SINGLETON;\n    /**\n     * @notice Address of the Safe Singleton implementation\n     */\n    address public immutable SAFE_SINGLETON;\n    /**\n     * @notice Address of the Safe Singleton (L2) implementation\n     */\n    address public immutable SAFE_L2_SINGLETON;\n    /**\n     * @notice Address of the Fallback Handler\n     */\n    address public immutable SAFE_FALLBACK_HANDLER;\n\n    /**\n     * @notice Event indicating a change of a singleton address. Named master copy here for legacy reasons.\n     * @param singleton New master copy address\n     */\n    event ChangedMasterCopy(address singleton);\n\n    /**\n     * @notice Modifier to make a function callable via delegatecall only.\n     * If the function is called via a regular call, it will revert.\n     */\n    modifier onlyDelegateCall() {\n        require(address(this) != MIGRATION_SINGLETON, \"Migration should only be called via delegatecall\");\n        _;\n    }\n\n    /**\n     * @notice Constructor\n     * @param safeSingleton Address of the Safe Singleton implementation\n     * @param safeL2Singleton Address of the SafeL2 Singleton implementation\n     * @param fallbackHandler Address of the fallback handler implementation\n     */\n    constructor(address safeSingleton, address safeL2Singleton, address fallbackHandler) {\n        MIGRATION_SINGLETON = address(this);\n\n        require(hasCode(safeSingleton), \"Safe Singleton is not deployed\");\n        require(hasCode(safeL2Singleton), \"Safe Singleton (L2) is not deployed\");\n        require(hasCode(fallbackHandler), \"fallback handler is not deployed\");\n\n        SAFE_SINGLETON = safeSingleton;\n        SAFE_L2_SINGLETON = safeL2Singleton;\n        SAFE_FALLBACK_HANDLER = fallbackHandler;\n    }\n\n    /**\n     * @notice Migrate the Safe contract to a new Safe Singleton implementation.\n     */\n    function migrateSingleton() public onlyDelegateCall {\n        singleton = SAFE_SINGLETON;\n        emit ChangedMasterCopy(SAFE_SINGLETON);\n    }\n\n    /**\n     * @notice Migrate to Safe Singleton and set the fallback handler. This function is intended to be used when migrating\n     *         a Safe to a version which also requires updating fallback handler.\n     */\n    function migrateWithFallbackHandler() external onlyDelegateCall {\n        migrateSingleton();\n        ISafe(address(this)).setFallbackHandler(SAFE_FALLBACK_HANDLER);\n    }\n\n    /**\n     * @notice Migrate the Safe contract to a new Safe Singleton (L2) implementation.\n     */\n    function migrateL2Singleton() public onlyDelegateCall {\n        singleton = SAFE_L2_SINGLETON;\n        emit ChangedMasterCopy(SAFE_L2_SINGLETON);\n    }\n\n    /**\n     * @notice Migrate to Safe Singleton (L2) and set the fallback handler. This function is intended to be used when migrating\n     *         a Safe to a version which also requires updating fallback handler.\n     */\n    function migrateL2WithFallbackHandler() external onlyDelegateCall {\n        migrateL2Singleton();\n        ISafe(address(this)).setFallbackHandler(SAFE_FALLBACK_HANDLER);\n    }\n\n    /**\n     * @notice Checks whether an account has code.\n     * @param account The address of the account to be checked.\n     * @return A boolean value indicating whether the address has code (true) or not (false).\n     * @dev This function relies on the `extcodesize` assembly opcode to determine whether an address has code.\n     * It does not reliably determine whether or not an address is a smart contract or an EOA.\n     */\n    function hasCode(address account) internal view returns (bool) {\n        uint256 size;\n        /* solhint-disable no-inline-assembly */\n        /// @solidity memory-safe-assembly\n        assembly {\n            size := extcodesize(account)\n        }\n        /* solhint-enable no-inline-assembly */\n\n        return size > 0;\n    }\n}\n"},"contracts/libraries/SafeStorage.sol":{"content":"// SPDX-License-Identifier: LGPL-3.0-only\npragma solidity >=0.7.0 <0.9.0;\n\n/**\n * @title SafeStorage - Storage layout of the Safe contracts to be used in libraries.\n * @dev Should be always the first base contract of a library that is used with a Safe.\n * @author Richard Meissner - @rmeissner\n */\ncontract SafeStorage {\n    // From /common/Singleton.sol\n    address internal singleton;\n    // From /common/ModuleManager.sol\n    mapping(address => address) internal modules;\n    // From /common/OwnerManager.sol\n    mapping(address => address) internal owners;\n    uint256 internal ownerCount;\n    uint256 internal threshold;\n\n    // From /Safe.sol\n    uint256 internal nonce;\n    bytes32 internal _deprecatedDomainSeparator;\n    mapping(bytes32 => uint256) internal signedMessages;\n    mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\n}\n"}},"settings":{"optimizer":{"enabled":false,"runs":200},"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata","devdoc","userdoc","storageLayout","evm.gasEstimates"],"":["ast"]}},"metadata":{"useLiteralContent":true}}},"output":{"sources":{"contracts/libraries/SafeMigration.sol":{"ast":{"absolutePath":"contracts/libraries/SafeMigration.sol","exportedSymbols":{"ISafe":[9],"SafeMigration":[183],"SafeStorage":[215]},"id":184,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":1,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:0"},{"absolutePath":"contracts/libraries/SafeStorage.sol","file":"../libraries/SafeStorage.sol","id":3,"nodeType":"ImportDirective","scope":184,"sourceUnit":216,"src":"75:57:0","symbolAliases":[{"foreign":{"id":2,"name":"SafeStorage","nodeType":"Identifier","overloadedDeclarations":[],"src":"83:11:0","typeDescriptions":{}}}],"unitAlias":""},{"abstract":false,"baseContracts":[],"contractDependencies":[],"contractKind":"interface","fullyImplemented":false,"id":9,"linearizedBaseContracts":[9],"name":"ISafe","nodeType":"ContractDefinition","nodes":[{"functionSelector":"f08a0323","id":8,"implemented":false,"kind":"function","modifiers":[],"name":"setFallbackHandler","nodeType":"FunctionDefinition","parameters":{"id":6,"nodeType":"ParameterList","parameters":[{"constant":false,"id":5,"mutability":"mutable","name":"handler","nodeType":"VariableDeclaration","scope":8,"src":"184:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":4,"name":"address","nodeType":"ElementaryTypeName","src":"184:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"183:17:0"},"returnParameters":{"id":7,"nodeType":"ParameterList","parameters":[],"src":"209:0:0"},"scope":9,"src":"156:54:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"}],"scope":184,"src":"134:78:0"},{"abstract":false,"baseContracts":[{"baseName":{"id":11,"name":"SafeStorage","nodeType":"UserDefinedTypeName","referencedDeclaration":215,"src":"956:11:0","typeDescriptions":{"typeIdentifier":"t_contract$_SafeStorage_$215","typeString":"contract SafeStorage"}},"id":12,"nodeType":"InheritanceSpecifier","src":"956:11:0"}],"contractDependencies":[215],"contractKind":"contract","documentation":{"id":10,"nodeType":"StructuredDocumentation","src":"214:715:0","text":" @title Migration Contract for Safe Upgrade\n @notice This is a generic contract that facilitates Safe and SafeL2 proxy contracts to migrate their singleton address.\n         The supported target Safe version is immutable and set in the constructor during the deployment of the contract.\n         This contract also supports migration with fallback handler update.\n @author @safe-global/safe-protocol\n @dev IMPORTANT: The library is intended to be used with the Safe standard proxy that stores the singleton address\n      at the storage slot 0. Use at your own risk with custom proxy implementations. The contract will allow invocations\n      to the migration functions only via delegatecall."},"fullyImplemented":true,"id":183,"linearizedBaseContracts":[183,215],"name":"SafeMigration","nodeType":"ContractDefinition","nodes":[{"constant":false,"documentation":{"id":13,"nodeType":"StructuredDocumentation","src":"974:51:0","text":" @notice Address of this contract"},"functionSelector":"72f7a956","id":15,"mutability":"immutable","name":"MIGRATION_SINGLETON","nodeType":"VariableDeclaration","scope":183,"src":"1030:44:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":14,"name":"address","nodeType":"ElementaryTypeName","src":"1030:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"documentation":{"id":16,"nodeType":"StructuredDocumentation","src":"1080:71:0","text":" @notice Address of the Safe Singleton implementation"},"functionSelector":"caa12add","id":18,"mutability":"immutable","name":"SAFE_SINGLETON","nodeType":"VariableDeclaration","scope":183,"src":"1156:39:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":17,"name":"address","nodeType":"ElementaryTypeName","src":"1156:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"documentation":{"id":19,"nodeType":"StructuredDocumentation","src":"1201:76:0","text":" @notice Address of the Safe Singleton (L2) implementation"},"functionSelector":"9bf47d6e","id":21,"mutability":"immutable","name":"SAFE_L2_SINGLETON","nodeType":"VariableDeclaration","scope":183,"src":"1282:42:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":20,"name":"address","nodeType":"ElementaryTypeName","src":"1282:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"constant":false,"documentation":{"id":22,"nodeType":"StructuredDocumentation","src":"1330:58:0","text":" @notice Address of the Fallback Handler"},"functionSelector":"0d7101f7","id":24,"mutability":"immutable","name":"SAFE_FALLBACK_HANDLER","nodeType":"VariableDeclaration","scope":183,"src":"1393:46:0","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":23,"name":"address","nodeType":"ElementaryTypeName","src":"1393:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"public"},{"anonymous":false,"documentation":{"id":25,"nodeType":"StructuredDocumentation","src":"1446:167:0","text":" @notice Event indicating a change of a singleton address. Named master copy here for legacy reasons.\n @param singleton New master copy address"},"id":29,"name":"ChangedMasterCopy","nodeType":"EventDefinition","parameters":{"id":28,"nodeType":"ParameterList","parameters":[{"constant":false,"id":27,"indexed":false,"mutability":"mutable","name":"singleton","nodeType":"VariableDeclaration","scope":29,"src":"1642:17:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":26,"name":"address","nodeType":"ElementaryTypeName","src":"1642:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"1641:19:0"},"src":"1618:43:0"},{"body":{"id":43,"nodeType":"Block","src":"1855:125:0","statements":[{"expression":{"arguments":[{"commonType":{"typeIdentifier":"t_address","typeString":"address"},"id":38,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"arguments":[{"id":35,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"1881:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_SafeMigration_$183","typeString":"contract SafeMigration"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SafeMigration_$183","typeString":"contract SafeMigration"}],"id":34,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"1873:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":33,"name":"address","nodeType":"ElementaryTypeName","src":"1873:7:0","typeDescriptions":{}}},"id":36,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1873:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"BinaryOperation","operator":"!=","rightExpression":{"id":37,"name":"MIGRATION_SINGLETON","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15,"src":"1890:19:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"1873:36:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"4d6967726174696f6e2073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6c","id":39,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"1911:50:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_15b78a1f3b6f5ce8c19eea2b0f8fa49566744e4d89b92aecbfade8f18a1e41e8","typeString":"literal_string \"Migration should only be called via delegatecall\""},"value":"Migration should only be called via delegatecall"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_15b78a1f3b6f5ce8c19eea2b0f8fa49566744e4d89b92aecbfade8f18a1e41e8","typeString":"literal_string \"Migration should only be called via delegatecall\""}],"id":32,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"1865:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":40,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"1865:97:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":41,"nodeType":"ExpressionStatement","src":"1865:97:0"},{"id":42,"nodeType":"PlaceholderStatement","src":"1972:1:0"}]},"documentation":{"id":30,"nodeType":"StructuredDocumentation","src":"1667:155:0","text":" @notice Modifier to make a function callable via delegatecall only.\n If the function is called via a regular call, it will revert."},"id":44,"name":"onlyDelegateCall","nodeType":"ModifierDefinition","parameters":{"id":31,"nodeType":"ParameterList","parameters":[],"src":"1852:2:0"},"src":"1827:153:0","virtual":false,"visibility":"internal"},{"body":{"id":94,"nodeType":"Block","src":"2341:424:0","statements":[{"expression":{"id":59,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":54,"name":"MIGRATION_SINGLETON","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":15,"src":"2351:19:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"arguments":[{"id":57,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"2381:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_SafeMigration_$183","typeString":"contract SafeMigration"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SafeMigration_$183","typeString":"contract SafeMigration"}],"id":56,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"2373:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":55,"name":"address","nodeType":"ElementaryTypeName","src":"2373:7:0","typeDescriptions":{}}},"id":58,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2373:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2351:35:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":60,"nodeType":"ExpressionStatement","src":"2351:35:0"},{"expression":{"arguments":[{"arguments":[{"id":63,"name":"safeSingleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":47,"src":"2413:13:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":62,"name":"hasCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":182,"src":"2405:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":64,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2405:22:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"536166652053696e676c65746f6e206973206e6f74206465706c6f796564","id":65,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2429:32:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_84ee59d9bf234c2cb66d69a964e961a87aec9510a8c27d39b9ecfe326eed7e59","typeString":"literal_string \"Safe Singleton is not deployed\""},"value":"Safe Singleton is not deployed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_84ee59d9bf234c2cb66d69a964e961a87aec9510a8c27d39b9ecfe326eed7e59","typeString":"literal_string \"Safe Singleton is not deployed\""}],"id":61,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2397:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":66,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2397:65:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":67,"nodeType":"ExpressionStatement","src":"2397:65:0"},{"expression":{"arguments":[{"arguments":[{"id":70,"name":"safeL2Singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49,"src":"2488:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":69,"name":"hasCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":182,"src":"2480:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":71,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2480:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"536166652053696e676c65746f6e20284c3229206973206e6f74206465706c6f796564","id":72,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2506:37:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_75f997a654aa76af6a944dffc0f255b9298b56b5accadff398c2fefbe7d955b6","typeString":"literal_string \"Safe Singleton (L2) is not deployed\""},"value":"Safe Singleton (L2) is not deployed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_75f997a654aa76af6a944dffc0f255b9298b56b5accadff398c2fefbe7d955b6","typeString":"literal_string \"Safe Singleton (L2) is not deployed\""}],"id":68,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2472:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":73,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2472:72:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":74,"nodeType":"ExpressionStatement","src":"2472:72:0"},{"expression":{"arguments":[{"arguments":[{"id":77,"name":"fallbackHandler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":51,"src":"2570:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":76,"name":"hasCode","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":182,"src":"2562:7:0","typeDescriptions":{"typeIdentifier":"t_function_internal_view$_t_address_$returns$_t_bool_$","typeString":"function (address) view returns (bool)"}},"id":78,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2562:24:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},{"hexValue":"66616c6c6261636b2068616e646c6572206973206e6f74206465706c6f796564","id":79,"isConstant":false,"isLValue":false,"isPure":true,"kind":"string","lValueRequested":false,"nodeType":"Literal","src":"2588:34:0","typeDescriptions":{"typeIdentifier":"t_stringliteral_6f0fe446fb242d0b587e8b9c3b2c5278d07e700afc37d42ab36ece4018a3c496","typeString":"literal_string \"fallback handler is not deployed\""},"value":"fallback handler is not deployed"}],"expression":{"argumentTypes":[{"typeIdentifier":"t_bool","typeString":"bool"},{"typeIdentifier":"t_stringliteral_6f0fe446fb242d0b587e8b9c3b2c5278d07e700afc37d42ab36ece4018a3c496","typeString":"literal_string \"fallback handler is not deployed\""}],"id":75,"name":"require","nodeType":"Identifier","overloadedDeclarations":[-18,-18],"referencedDeclaration":-18,"src":"2554:7:0","typeDescriptions":{"typeIdentifier":"t_function_require_pure$_t_bool_$_t_string_memory_ptr_$returns$__$","typeString":"function (bool,string memory) pure"}},"id":80,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2554:69:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":81,"nodeType":"ExpressionStatement","src":"2554:69:0"},{"expression":{"id":84,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":82,"name":"SAFE_SINGLETON","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18,"src":"2634:14:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":83,"name":"safeSingleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":47,"src":"2651:13:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2634:30:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":85,"nodeType":"ExpressionStatement","src":"2634:30:0"},{"expression":{"id":88,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":86,"name":"SAFE_L2_SINGLETON","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21,"src":"2674:17:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":87,"name":"safeL2Singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":49,"src":"2694:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2674:35:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":89,"nodeType":"ExpressionStatement","src":"2674:35:0"},{"expression":{"id":92,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":90,"name":"SAFE_FALLBACK_HANDLER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24,"src":"2719:21:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":91,"name":"fallbackHandler","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":51,"src":"2743:15:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2719:39:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":93,"nodeType":"ExpressionStatement","src":"2719:39:0"}]},"documentation":{"id":45,"nodeType":"StructuredDocumentation","src":"1986:265:0","text":" @notice Constructor\n @param safeSingleton Address of the Safe Singleton implementation\n @param safeL2Singleton Address of the SafeL2 Singleton implementation\n @param fallbackHandler Address of the fallback handler implementation"},"id":95,"implemented":true,"kind":"constructor","modifiers":[],"name":"","nodeType":"FunctionDefinition","parameters":{"id":52,"nodeType":"ParameterList","parameters":[{"constant":false,"id":47,"mutability":"mutable","name":"safeSingleton","nodeType":"VariableDeclaration","scope":95,"src":"2268:21:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":46,"name":"address","nodeType":"ElementaryTypeName","src":"2268:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":49,"mutability":"mutable","name":"safeL2Singleton","nodeType":"VariableDeclaration","scope":95,"src":"2291:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":48,"name":"address","nodeType":"ElementaryTypeName","src":"2291:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":51,"mutability":"mutable","name":"fallbackHandler","nodeType":"VariableDeclaration","scope":95,"src":"2316:23:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":50,"name":"address","nodeType":"ElementaryTypeName","src":"2316:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"2267:73:0"},"returnParameters":{"id":53,"nodeType":"ParameterList","parameters":[],"src":"2341:0:0"},"scope":183,"src":"2256:509:0","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":109,"nodeType":"Block","src":"2920:91:0","statements":[{"expression":{"id":103,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":101,"name":"singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":188,"src":"2930:9:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":102,"name":"SAFE_SINGLETON","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18,"src":"2942:14:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"2930:26:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":104,"nodeType":"ExpressionStatement","src":"2930:26:0"},{"eventCall":{"arguments":[{"id":106,"name":"SAFE_SINGLETON","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":18,"src":"2989:14:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":105,"name":"ChangedMasterCopy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29,"src":"2971:17:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":107,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"2971:33:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":108,"nodeType":"EmitStatement","src":"2966:38:0"}]},"documentation":{"id":96,"nodeType":"StructuredDocumentation","src":"2771:92:0","text":" @notice Migrate the Safe contract to a new Safe Singleton implementation."},"functionSelector":"f6682ab0","id":110,"implemented":true,"kind":"function","modifiers":[{"id":99,"modifierName":{"id":98,"name":"onlyDelegateCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":44,"src":"2903:16:0","typeDescriptions":{"typeIdentifier":"t_modifier$__$","typeString":"modifier ()"}},"nodeType":"ModifierInvocation","src":"2903:16:0"}],"name":"migrateSingleton","nodeType":"FunctionDefinition","parameters":{"id":97,"nodeType":"ParameterList","parameters":[],"src":"2893:2:0"},"returnParameters":{"id":100,"nodeType":"ParameterList","parameters":[],"src":"2920:0:0"},"scope":183,"src":"2868:143:0","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":129,"nodeType":"Block","src":"3302:107:0","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":116,"name":"migrateSingleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":110,"src":"3312:16:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":117,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3312:18:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":118,"nodeType":"ExpressionStatement","src":"3312:18:0"},{"expression":{"arguments":[{"id":126,"name":"SAFE_FALLBACK_HANDLER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24,"src":"3380:21:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[{"arguments":[{"id":122,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"3354:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_SafeMigration_$183","typeString":"contract SafeMigration"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SafeMigration_$183","typeString":"contract SafeMigration"}],"id":121,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"3346:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":120,"name":"address","nodeType":"ElementaryTypeName","src":"3346:7:0","typeDescriptions":{}}},"id":123,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3346:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":119,"name":"ISafe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9,"src":"3340:5:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISafe_$9_$","typeString":"type(contract ISafe)"}},"id":124,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3340:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISafe_$9","typeString":"contract ISafe"}},"id":125,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"setFallbackHandler","nodeType":"MemberAccess","referencedDeclaration":8,"src":"3340:39:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":127,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3340:62:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":128,"nodeType":"ExpressionStatement","src":"3340:62:0"}]},"documentation":{"id":111,"nodeType":"StructuredDocumentation","src":"3017:216:0","text":" @notice Migrate to Safe Singleton and set the fallback handler. This function is intended to be used when migrating\n         a Safe to a version which also requires updating fallback handler."},"functionSelector":"ed007fc6","id":130,"implemented":true,"kind":"function","modifiers":[{"id":114,"modifierName":{"id":113,"name":"onlyDelegateCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":44,"src":"3285:16:0","typeDescriptions":{"typeIdentifier":"t_modifier$__$","typeString":"modifier ()"}},"nodeType":"ModifierInvocation","src":"3285:16:0"}],"name":"migrateWithFallbackHandler","nodeType":"FunctionDefinition","parameters":{"id":112,"nodeType":"ParameterList","parameters":[],"src":"3273:2:0"},"returnParameters":{"id":115,"nodeType":"ParameterList","parameters":[],"src":"3302:0:0"},"scope":183,"src":"3238:171:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":144,"nodeType":"Block","src":"3571:97:0","statements":[{"expression":{"id":138,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftHandSide":{"id":136,"name":"singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":188,"src":"3581:9:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Assignment","operator":"=","rightHandSide":{"id":137,"name":"SAFE_L2_SINGLETON","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21,"src":"3593:17:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"src":"3581:29:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"id":139,"nodeType":"ExpressionStatement","src":"3581:29:0"},{"eventCall":{"arguments":[{"id":141,"name":"SAFE_L2_SINGLETON","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":21,"src":"3643:17:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":140,"name":"ChangedMasterCopy","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":29,"src":"3625:17:0","typeDescriptions":{"typeIdentifier":"t_function_event_nonpayable$_t_address_$returns$__$","typeString":"function (address)"}},"id":142,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3625:36:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":143,"nodeType":"EmitStatement","src":"3620:41:0"}]},"documentation":{"id":131,"nodeType":"StructuredDocumentation","src":"3415:97:0","text":" @notice Migrate the Safe contract to a new Safe Singleton (L2) implementation."},"functionSelector":"07f464a4","id":145,"implemented":true,"kind":"function","modifiers":[{"id":134,"modifierName":{"id":133,"name":"onlyDelegateCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":44,"src":"3554:16:0","typeDescriptions":{"typeIdentifier":"t_modifier$__$","typeString":"modifier ()"}},"nodeType":"ModifierInvocation","src":"3554:16:0"}],"name":"migrateL2Singleton","nodeType":"FunctionDefinition","parameters":{"id":132,"nodeType":"ParameterList","parameters":[],"src":"3544:2:0"},"returnParameters":{"id":135,"nodeType":"ParameterList","parameters":[],"src":"3571:0:0"},"scope":183,"src":"3517:151:0","stateMutability":"nonpayable","virtual":false,"visibility":"public"},{"body":{"id":164,"nodeType":"Block","src":"3966:109:0","statements":[{"expression":{"arguments":[],"expression":{"argumentTypes":[],"id":151,"name":"migrateL2Singleton","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":145,"src":"3976:18:0","typeDescriptions":{"typeIdentifier":"t_function_internal_nonpayable$__$returns$__$","typeString":"function ()"}},"id":152,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"3976:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":153,"nodeType":"ExpressionStatement","src":"3976:20:0"},{"expression":{"arguments":[{"id":161,"name":"SAFE_FALLBACK_HANDLER","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":24,"src":"4046:21:0","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"expression":{"arguments":[{"arguments":[{"id":157,"name":"this","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":-28,"src":"4020:4:0","typeDescriptions":{"typeIdentifier":"t_contract$_SafeMigration_$183","typeString":"contract SafeMigration"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_contract$_SafeMigration_$183","typeString":"contract SafeMigration"}],"id":156,"isConstant":false,"isLValue":false,"isPure":true,"lValueRequested":false,"nodeType":"ElementaryTypeNameExpression","src":"4012:7:0","typeDescriptions":{"typeIdentifier":"t_type$_t_address_$","typeString":"type(address)"},"typeName":{"id":155,"name":"address","nodeType":"ElementaryTypeName","src":"4012:7:0","typeDescriptions":{}}},"id":158,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4012:13:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}],"expression":{"argumentTypes":[{"typeIdentifier":"t_address","typeString":"address"}],"id":154,"name":"ISafe","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":9,"src":"4006:5:0","typeDescriptions":{"typeIdentifier":"t_type$_t_contract$_ISafe_$9_$","typeString":"type(contract ISafe)"}},"id":159,"isConstant":false,"isLValue":false,"isPure":false,"kind":"typeConversion","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4006:20:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_contract$_ISafe_$9","typeString":"contract ISafe"}},"id":160,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"memberName":"setFallbackHandler","nodeType":"MemberAccess","referencedDeclaration":8,"src":"4006:39:0","typeDescriptions":{"typeIdentifier":"t_function_external_nonpayable$_t_address_$returns$__$","typeString":"function (address) external"}},"id":162,"isConstant":false,"isLValue":false,"isPure":false,"kind":"functionCall","lValueRequested":false,"names":[],"nodeType":"FunctionCall","src":"4006:62:0","tryCall":false,"typeDescriptions":{"typeIdentifier":"t_tuple$__$","typeString":"tuple()"}},"id":163,"nodeType":"ExpressionStatement","src":"4006:62:0"}]},"documentation":{"id":146,"nodeType":"StructuredDocumentation","src":"3674:221:0","text":" @notice Migrate to Safe Singleton (L2) and set the fallback handler. This function is intended to be used when migrating\n         a Safe to a version which also requires updating fallback handler."},"functionSelector":"68cb3d94","id":165,"implemented":true,"kind":"function","modifiers":[{"id":149,"modifierName":{"id":148,"name":"onlyDelegateCall","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":44,"src":"3949:16:0","typeDescriptions":{"typeIdentifier":"t_modifier$__$","typeString":"modifier ()"}},"nodeType":"ModifierInvocation","src":"3949:16:0"}],"name":"migrateL2WithFallbackHandler","nodeType":"FunctionDefinition","parameters":{"id":147,"nodeType":"ParameterList","parameters":[],"src":"3937:2:0"},"returnParameters":{"id":150,"nodeType":"ParameterList","parameters":[],"src":"3966:0:0"},"scope":183,"src":"3900:175:0","stateMutability":"nonpayable","virtual":false,"visibility":"external"},{"body":{"id":181,"nodeType":"Block","src":"4576:265:0","statements":[{"assignments":[174],"declarations":[{"constant":false,"id":174,"mutability":"mutable","name":"size","nodeType":"VariableDeclaration","scope":181,"src":"4586:12:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":173,"name":"uint256","nodeType":"ElementaryTypeName","src":"4586:7:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"}],"id":175,"nodeType":"VariableDeclarationStatement","src":"4586:12:0"},{"AST":{"nodeType":"YulBlock","src":"4709:52:0","statements":[{"nodeType":"YulAssignment","src":"4723:28:0","value":{"arguments":[{"name":"account","nodeType":"YulIdentifier","src":"4743:7:0"}],"functionName":{"name":"extcodesize","nodeType":"YulIdentifier","src":"4731:11:0"},"nodeType":"YulFunctionCall","src":"4731:20:0"},"variableNames":[{"name":"size","nodeType":"YulIdentifier","src":"4723:4:0"}]}]},"evmVersion":"istanbul","externalReferences":[{"declaration":168,"isOffset":false,"isSlot":false,"src":"4743:7:0","valueSize":1},{"declaration":174,"isOffset":false,"isSlot":false,"src":"4723:4:0","valueSize":1}],"id":176,"nodeType":"InlineAssembly","src":"4700:61:0"},{"expression":{"commonType":{"typeIdentifier":"t_uint256","typeString":"uint256"},"id":179,"isConstant":false,"isLValue":false,"isPure":false,"lValueRequested":false,"leftExpression":{"id":177,"name":"size","nodeType":"Identifier","overloadedDeclarations":[],"referencedDeclaration":174,"src":"4826:4:0","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"nodeType":"BinaryOperation","operator":">","rightExpression":{"hexValue":"30","id":178,"isConstant":false,"isLValue":false,"isPure":true,"kind":"number","lValueRequested":false,"nodeType":"Literal","src":"4833:1:0","typeDescriptions":{"typeIdentifier":"t_rational_0_by_1","typeString":"int_const 0"},"value":"0"},"src":"4826:8:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"functionReturnParameters":172,"id":180,"nodeType":"Return","src":"4819:15:0"}]},"documentation":{"id":166,"nodeType":"StructuredDocumentation","src":"4081:427:0","text":" @notice Checks whether an account has code.\n @param account The address of the account to be checked.\n @return A boolean value indicating whether the address has code (true) or not (false).\n @dev This function relies on the `extcodesize` assembly opcode to determine whether an address has code.\n It does not reliably determine whether or not an address is a smart contract or an EOA."},"id":182,"implemented":true,"kind":"function","modifiers":[],"name":"hasCode","nodeType":"FunctionDefinition","parameters":{"id":169,"nodeType":"ParameterList","parameters":[{"constant":false,"id":168,"mutability":"mutable","name":"account","nodeType":"VariableDeclaration","scope":182,"src":"4530:15:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":167,"name":"address","nodeType":"ElementaryTypeName","src":"4530:7:0","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"}],"src":"4529:17:0"},"returnParameters":{"id":172,"nodeType":"ParameterList","parameters":[{"constant":false,"id":171,"mutability":"mutable","name":"","nodeType":"VariableDeclaration","scope":182,"src":"4570:4:0","stateVariable":false,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"},"typeName":{"id":170,"name":"bool","nodeType":"ElementaryTypeName","src":"4570:4:0","typeDescriptions":{"typeIdentifier":"t_bool","typeString":"bool"}},"visibility":"internal"}],"src":"4569:6:0"},"scope":183,"src":"4513:328:0","stateMutability":"view","virtual":false,"visibility":"internal"}],"scope":184,"src":"930:3913:0"}],"src":"42:4802:0"},"id":0},"contracts/libraries/SafeStorage.sol":{"ast":{"absolutePath":"contracts/libraries/SafeStorage.sol","exportedSymbols":{"SafeStorage":[215]},"id":216,"license":"LGPL-3.0-only","nodeType":"SourceUnit","nodes":[{"id":185,"literals":["solidity",">=","0.7",".0","<","0.9",".0"],"nodeType":"PragmaDirective","src":"42:31:1"},{"abstract":false,"baseContracts":[],"contractDependencies":[],"contractKind":"contract","documentation":{"id":186,"nodeType":"StructuredDocumentation","src":"75:222:1","text":" @title SafeStorage - Storage layout of the Safe contracts to be used in libraries.\n @dev Should be always the first base contract of a library that is used with a Safe.\n @author Richard Meissner - @rmeissner"},"fullyImplemented":true,"id":215,"linearizedBaseContracts":[215],"name":"SafeStorage","nodeType":"ContractDefinition","nodes":[{"constant":false,"id":188,"mutability":"mutable","name":"singleton","nodeType":"VariableDeclaration","scope":215,"src":"359:26:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"},"typeName":{"id":187,"name":"address","nodeType":"ElementaryTypeName","src":"359:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"visibility":"internal"},{"constant":false,"id":192,"mutability":"mutable","name":"modules","nodeType":"VariableDeclaration","scope":215,"src":"429:44:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"typeName":{"id":191,"keyType":{"id":189,"name":"address","nodeType":"ElementaryTypeName","src":"437:7:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"429:27:1","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"valueType":{"id":190,"name":"address","nodeType":"ElementaryTypeName","src":"448:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},"visibility":"internal"},{"constant":false,"id":196,"mutability":"mutable","name":"owners","nodeType":"VariableDeclaration","scope":215,"src":"516:43:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"typeName":{"id":195,"keyType":{"id":193,"name":"address","nodeType":"ElementaryTypeName","src":"524:7:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"516:27:1","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_address_$","typeString":"mapping(address => address)"},"valueType":{"id":194,"name":"address","nodeType":"ElementaryTypeName","src":"535:7:1","stateMutability":"nonpayable","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}}},"visibility":"internal"},{"constant":false,"id":198,"mutability":"mutable","name":"ownerCount","nodeType":"VariableDeclaration","scope":215,"src":"565:27:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":197,"name":"uint256","nodeType":"ElementaryTypeName","src":"565:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":200,"mutability":"mutable","name":"threshold","nodeType":"VariableDeclaration","scope":215,"src":"598:26:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":199,"name":"uint256","nodeType":"ElementaryTypeName","src":"598:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":202,"mutability":"mutable","name":"nonce","nodeType":"VariableDeclaration","scope":215,"src":"653:22:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"},"typeName":{"id":201,"name":"uint256","nodeType":"ElementaryTypeName","src":"653:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}},"visibility":"internal"},{"constant":false,"id":204,"mutability":"mutable","name":"_deprecatedDomainSeparator","nodeType":"VariableDeclaration","scope":215,"src":"681:43:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"},"typeName":{"id":203,"name":"bytes32","nodeType":"ElementaryTypeName","src":"681:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"visibility":"internal"},{"constant":false,"id":208,"mutability":"mutable","name":"signedMessages","nodeType":"VariableDeclaration","scope":215,"src":"730:51:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"typeName":{"id":207,"keyType":{"id":205,"name":"bytes32","nodeType":"ElementaryTypeName","src":"738:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"730:27:1","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"valueType":{"id":206,"name":"uint256","nodeType":"ElementaryTypeName","src":"749:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}},"visibility":"internal"},{"constant":false,"id":214,"mutability":"mutable","name":"approvedHashes","nodeType":"VariableDeclaration","scope":215,"src":"787:71:1","stateVariable":true,"storageLocation":"default","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_bytes32_$_t_uint256_$_$","typeString":"mapping(address => mapping(bytes32 => uint256))"},"typeName":{"id":213,"keyType":{"id":209,"name":"address","nodeType":"ElementaryTypeName","src":"795:7:1","typeDescriptions":{"typeIdentifier":"t_address","typeString":"address"}},"nodeType":"Mapping","src":"787:47:1","typeDescriptions":{"typeIdentifier":"t_mapping$_t_address_$_t_mapping$_t_bytes32_$_t_uint256_$_$","typeString":"mapping(address => mapping(bytes32 => uint256))"},"valueType":{"id":212,"keyType":{"id":210,"name":"bytes32","nodeType":"ElementaryTypeName","src":"814:7:1","typeDescriptions":{"typeIdentifier":"t_bytes32","typeString":"bytes32"}},"nodeType":"Mapping","src":"806:27:1","typeDescriptions":{"typeIdentifier":"t_mapping$_t_bytes32_$_t_uint256_$","typeString":"mapping(bytes32 => uint256)"},"valueType":{"id":211,"name":"uint256","nodeType":"ElementaryTypeName","src":"825:7:1","typeDescriptions":{"typeIdentifier":"t_uint256","typeString":"uint256"}}}},"visibility":"internal"}],"scope":216,"src":"298:563:1"}],"src":"42:820:1"},"id":1}},"contracts":{"contracts/libraries/SafeMigration.sol":{"ISafe":{"abi":[{"inputs":[{"internalType":"address","name":"handler","type":"address"}],"name":"setFallbackHandler","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"kind":"dev","methods":{},"version":1},"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"","opcodes":"","sourceMap":""},"gasEstimates":null,"methodIdentifiers":{"setFallbackHandler(address)":"f08a0323"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"handler\",\"type\":\"address\"}],\"name\":\"setFallbackHandler\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/SafeMigration.sol\":\"ISafe\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/libraries/SafeMigration.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport {SafeStorage} from \\\"../libraries/SafeStorage.sol\\\";\\n\\ninterface ISafe {\\n    function setFallbackHandler(address handler) external;\\n}\\n\\n/**\\n * @title Migration Contract for Safe Upgrade\\n * @notice This is a generic contract that facilitates Safe and SafeL2 proxy contracts to migrate their singleton address.\\n *         The supported target Safe version is immutable and set in the constructor during the deployment of the contract.\\n *         This contract also supports migration with fallback handler update.\\n * @author @safe-global/safe-protocol\\n * @dev IMPORTANT: The library is intended to be used with the Safe standard proxy that stores the singleton address\\n *      at the storage slot 0. Use at your own risk with custom proxy implementations. The contract will allow invocations\\n *      to the migration functions only via delegatecall.\\n */\\ncontract SafeMigration is SafeStorage {\\n    /**\\n     * @notice Address of this contract\\n     */\\n    address public immutable MIGRATION_SINGLETON;\\n    /**\\n     * @notice Address of the Safe Singleton implementation\\n     */\\n    address public immutable SAFE_SINGLETON;\\n    /**\\n     * @notice Address of the Safe Singleton (L2) implementation\\n     */\\n    address public immutable SAFE_L2_SINGLETON;\\n    /**\\n     * @notice Address of the Fallback Handler\\n     */\\n    address public immutable SAFE_FALLBACK_HANDLER;\\n\\n    /**\\n     * @notice Event indicating a change of a singleton address. Named master copy here for legacy reasons.\\n     * @param singleton New master copy address\\n     */\\n    event ChangedMasterCopy(address singleton);\\n\\n    /**\\n     * @notice Modifier to make a function callable via delegatecall only.\\n     * If the function is called via a regular call, it will revert.\\n     */\\n    modifier onlyDelegateCall() {\\n        require(address(this) != MIGRATION_SINGLETON, \\\"Migration should only be called via delegatecall\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @notice Constructor\\n     * @param safeSingleton Address of the Safe Singleton implementation\\n     * @param safeL2Singleton Address of the SafeL2 Singleton implementation\\n     * @param fallbackHandler Address of the fallback handler implementation\\n     */\\n    constructor(address safeSingleton, address safeL2Singleton, address fallbackHandler) {\\n        MIGRATION_SINGLETON = address(this);\\n\\n        require(hasCode(safeSingleton), \\\"Safe Singleton is not deployed\\\");\\n        require(hasCode(safeL2Singleton), \\\"Safe Singleton (L2) is not deployed\\\");\\n        require(hasCode(fallbackHandler), \\\"fallback handler is not deployed\\\");\\n\\n        SAFE_SINGLETON = safeSingleton;\\n        SAFE_L2_SINGLETON = safeL2Singleton;\\n        SAFE_FALLBACK_HANDLER = fallbackHandler;\\n    }\\n\\n    /**\\n     * @notice Migrate the Safe contract to a new Safe Singleton implementation.\\n     */\\n    function migrateSingleton() public onlyDelegateCall {\\n        singleton = SAFE_SINGLETON;\\n        emit ChangedMasterCopy(SAFE_SINGLETON);\\n    }\\n\\n    /**\\n     * @notice Migrate to Safe Singleton and set the fallback handler. This function is intended to be used when migrating\\n     *         a Safe to a version which also requires updating fallback handler.\\n     */\\n    function migrateWithFallbackHandler() external onlyDelegateCall {\\n        migrateSingleton();\\n        ISafe(address(this)).setFallbackHandler(SAFE_FALLBACK_HANDLER);\\n    }\\n\\n    /**\\n     * @notice Migrate the Safe contract to a new Safe Singleton (L2) implementation.\\n     */\\n    function migrateL2Singleton() public onlyDelegateCall {\\n        singleton = SAFE_L2_SINGLETON;\\n        emit ChangedMasterCopy(SAFE_L2_SINGLETON);\\n    }\\n\\n    /**\\n     * @notice Migrate to Safe Singleton (L2) and set the fallback handler. This function is intended to be used when migrating\\n     *         a Safe to a version which also requires updating fallback handler.\\n     */\\n    function migrateL2WithFallbackHandler() external onlyDelegateCall {\\n        migrateL2Singleton();\\n        ISafe(address(this)).setFallbackHandler(SAFE_FALLBACK_HANDLER);\\n    }\\n\\n    /**\\n     * @notice Checks whether an account has code.\\n     * @param account The address of the account to be checked.\\n     * @return A boolean value indicating whether the address has code (true) or not (false).\\n     * @dev This function relies on the `extcodesize` assembly opcode to determine whether an address has code.\\n     * It does not reliably determine whether or not an address is a smart contract or an EOA.\\n     */\\n    function hasCode(address account) internal view returns (bool) {\\n        uint256 size;\\n        /* solhint-disable no-inline-assembly */\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            size := extcodesize(account)\\n        }\\n        /* solhint-enable no-inline-assembly */\\n\\n        return size > 0;\\n    }\\n}\\n\",\"keccak256\":\"0x9daf0fb90b041f97f09c303def93520f2f24a260c9698d864af5250e7f577038\",\"license\":\"LGPL-3.0-only\"},\"contracts/libraries/SafeStorage.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n * @title SafeStorage - Storage layout of the Safe contracts to be used in libraries.\\n * @dev Should be always the first base contract of a library that is used with a Safe.\\n * @author Richard Meissner - @rmeissner\\n */\\ncontract SafeStorage {\\n    // From /common/Singleton.sol\\n    address internal singleton;\\n    // From /common/ModuleManager.sol\\n    mapping(address => address) internal modules;\\n    // From /common/OwnerManager.sol\\n    mapping(address => address) internal owners;\\n    uint256 internal ownerCount;\\n    uint256 internal threshold;\\n\\n    // From /Safe.sol\\n    uint256 internal nonce;\\n    bytes32 internal _deprecatedDomainSeparator;\\n    mapping(bytes32 => uint256) internal signedMessages;\\n    mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\\n}\\n\",\"keccak256\":\"0xae0c704f3e4ec6b1436bbbd10b153feaa665ac36e556ccc4f2155e4c02f5c46a\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[],"types":null},"userdoc":{"kind":"user","methods":{},"version":1}},"SafeMigration":{"abi":[{"inputs":[{"internalType":"address","name":"safeSingleton","type":"address"},{"internalType":"address","name":"safeL2Singleton","type":"address"},{"internalType":"address","name":"fallbackHandler","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"singleton","type":"address"}],"name":"ChangedMasterCopy","type":"event"},{"inputs":[],"name":"MIGRATION_SINGLETON","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAFE_FALLBACK_HANDLER","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAFE_L2_SINGLETON","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SAFE_SINGLETON","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"migrateL2Singleton","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrateL2WithFallbackHandler","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrateSingleton","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"migrateWithFallbackHandler","outputs":[],"stateMutability":"nonpayable","type":"function"}],"devdoc":{"author":"@safe-global/safe-protocol","details":"IMPORTANT: The library is intended to be used with the Safe standard proxy that stores the singleton address      at the storage slot 0. Use at your own risk with custom proxy implementations. The contract will allow invocations      to the migration functions only via delegatecall.","events":{"ChangedMasterCopy(address)":{"params":{"singleton":"New master copy address"}}},"kind":"dev","methods":{"constructor":{"params":{"fallbackHandler":"Address of the fallback handler implementation","safeL2Singleton":"Address of the SafeL2 Singleton implementation","safeSingleton":"Address of the Safe Singleton implementation"}}},"title":"Migration Contract for Safe Upgrade","version":1},"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"61010060405234801561001157600080fd5b50604051610b4f380380610b4f8339818101604052606081101561003457600080fd5b810190808051906020019092919080519060200190929190805190602001909291905050503073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505061009f836102a360201b60201c565b610111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252601e8152602001807f536166652053696e676c65746f6e206973206e6f74206465706c6f796564000081525060200191505060405180910390fd5b610120826102a360201b60201c565b610175576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401808060200182810382526023815260200180610b2c6023913960400191505060405180910390fd5b610184816102a360201b60201c565b6101f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260208152602001807f66616c6c6261636b2068616e646c6572206973206e6f74206465706c6f79656481525060200191505060405180910390fd5b8273ffffffffffffffffffffffffffffffffffffffff1660a08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508173ffffffffffffffffffffffffffffffffffffffff1660c08173ffffffffffffffffffffffffffffffffffffffff1660601b815250508073ffffffffffffffffffffffffffffffffffffffff1660e08173ffffffffffffffffffffffffffffffffffffffff1660601b815250505050506102b6565b600080823b905060008111915050919050565b60805160601c60a05160601c60c05160601c60e05160601c610803610329600039806102fb52806103e852806105a452508061022c52806102ad52806104935250806104b752806106d05280610751525080610187528061031f528061046f52806104db528061062b52506108036000f3fe608060405234801561001057600080fd5b50600436106100885760003560e01c80639bf47d6e1161005b5780639bf47d6e14610109578063caa12add1461013d578063ed007fc614610171578063f6682ab01461017b57610088565b806307f464a41461008d5780630d7101f71461009757806368cb3d94146100cb57806372f7a956146100d5575b600080fd5b610095610185565b005b61009f6102f9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100d361031d565b005b6100dd61046d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610111610491565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101456104b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101796104d9565b005b610183610629565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141561022a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061079e6030913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b87f0000000000000000000000000000000000000000000000000000000000000000604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156103c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061079e6030913960400191505060405180910390fd5b6103ca610185565b3073ffffffffffffffffffffffffffffffffffffffff1663f08a03237f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141561057e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061079e6030913960400191505060405180910390fd5b610586610629565b3073ffffffffffffffffffffffffffffffffffffffff1663f08a03237f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561060f57600080fd5b505af1158015610623573d6000803e3d6000fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156106ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061079e6030913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b87f0000000000000000000000000000000000000000000000000000000000000000604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a156fe4d6967726174696f6e2073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca2646970667358221220225c3ae21c323c66a6ac816f6d90cf900873611c034a6b26050d6022c9efdafd64736f6c63430007060033536166652053696e676c65746f6e20284c3229206973206e6f74206465706c6f796564","opcodes":"PUSH2 0x100 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x11 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x40 MLOAD PUSH2 0xB4F CODESIZE SUB DUP1 PUSH2 0xB4F DUP4 CODECOPY DUP2 DUP2 ADD PUSH1 0x40 MSTORE PUSH1 0x60 DUP2 LT ISZERO PUSH2 0x34 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST DUP2 ADD SWAP1 DUP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 DUP1 MLOAD SWAP1 PUSH1 0x20 ADD SWAP1 SWAP3 SWAP2 SWAP1 POP POP POP ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x80 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE POP POP PUSH2 0x9F DUP4 PUSH2 0x2A3 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x111 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x1E DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x536166652053696E676C65746F6E206973206E6F74206465706C6F7965640000 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x120 DUP3 PUSH2 0x2A3 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x175 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x23 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0xB2C PUSH1 0x23 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x184 DUP2 PUSH2 0x2A3 PUSH1 0x20 SHL PUSH1 0x20 SHR JUMP JUMPDEST PUSH2 0x1F6 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x20 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH32 0x66616C6C6261636B2068616E646C6572206973206E6F74206465706C6F796564 DUP2 MSTORE POP PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xA0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE POP POP DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xC0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE POP POP DUP1 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0xE0 DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH1 0x60 SHL DUP2 MSTORE POP POP POP POP POP PUSH2 0x2B6 JUMP JUMPDEST PUSH1 0x0 DUP1 DUP3 EXTCODESIZE SWAP1 POP PUSH1 0x0 DUP2 GT SWAP2 POP POP SWAP2 SWAP1 POP JUMP JUMPDEST PUSH1 0x80 MLOAD PUSH1 0x60 SHR PUSH1 0xA0 MLOAD PUSH1 0x60 SHR PUSH1 0xC0 MLOAD PUSH1 0x60 SHR PUSH1 0xE0 MLOAD PUSH1 0x60 SHR PUSH2 0x803 PUSH2 0x329 PUSH1 0x0 CODECOPY DUP1 PUSH2 0x2FB MSTORE DUP1 PUSH2 0x3E8 MSTORE DUP1 PUSH2 0x5A4 MSTORE POP DUP1 PUSH2 0x22C MSTORE DUP1 PUSH2 0x2AD MSTORE DUP1 PUSH2 0x493 MSTORE POP DUP1 PUSH2 0x4B7 MSTORE DUP1 PUSH2 0x6D0 MSTORE DUP1 PUSH2 0x751 MSTORE POP DUP1 PUSH2 0x187 MSTORE DUP1 PUSH2 0x31F MSTORE DUP1 PUSH2 0x46F MSTORE DUP1 PUSH2 0x4DB MSTORE DUP1 PUSH2 0x62B MSTORE POP PUSH2 0x803 PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9BF47D6E GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x9BF47D6E EQ PUSH2 0x109 JUMPI DUP1 PUSH4 0xCAA12ADD EQ PUSH2 0x13D JUMPI DUP1 PUSH4 0xED007FC6 EQ PUSH2 0x171 JUMPI DUP1 PUSH4 0xF6682AB0 EQ PUSH2 0x17B JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x7F464A4 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0xD7101F7 EQ PUSH2 0x97 JUMPI DUP1 PUSH4 0x68CB3D94 EQ PUSH2 0xCB JUMPI DUP1 PUSH4 0x72F7A956 EQ PUSH2 0xD5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x95 PUSH2 0x185 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x9F PUSH2 0x2F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD3 PUSH2 0x31D JUMP JUMPDEST STOP JUMPDEST PUSH2 0xDD PUSH2 0x46D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x111 PUSH2 0x491 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x145 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x179 PUSH2 0x4D9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x183 PUSH2 0x629 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x22A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x79E PUSH1 0x30 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0x0 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH32 0x75E41BC35FF1BF14D81D1D2F649C0084A0F974F9289C803EC9898EEEC4C8D0B8 PUSH32 0x0 PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x3C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x79E PUSH1 0x30 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3CA PUSH2 0x185 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF08A0323 PUSH32 0x0 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x453 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x467 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x57E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x79E PUSH1 0x30 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x586 PUSH2 0x629 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF08A0323 PUSH32 0x0 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x60F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x623 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x6CE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x79E PUSH1 0x30 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0x0 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH32 0x75E41BC35FF1BF14D81D1D2F649C0084A0F974F9289C803EC9898EEEC4C8D0B8 PUSH32 0x0 PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP INVALID 0x4D PUSH10 0x67726174696F6E207368 PUSH16 0x756C64206F6E6C792062652063616C6C PUSH6 0x642076696120 PUSH5 0x656C656761 PUSH21 0x6563616C6CA2646970667358221220225C3AE21C32 EXTCODECOPY PUSH7 0xA6AC816F6D90CF SWAP1 ADDMOD PUSH20 0x611C034A6B26050D6022C9EFDAFD64736F6C6343 STOP SMOD MOD STOP CALLER MSTORE8 PUSH2 0x6665 KECCAK256 MSTORE8 PUSH10 0x6E676C65746F6E20284C ORIGIN 0x29 KECCAK256 PUSH10 0x73206E6F74206465706C PUSH16 0x79656400000000000000000000000000 ","sourceMap":"930:3913:0:-:0;;;2256:509;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2381:4;2351:35;;;;;;;;;;;;2405:22;2413:13;2405:7;;;:22;;:::i;:::-;2397:65;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2480:24;2488:15;2480:7;;;:24;;:::i;:::-;2472:72;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2562:24;2570:15;2562:7;;;:24;;:::i;:::-;2554:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2651:13;2634:30;;;;;;;;;;;;2694:15;2674:35;;;;;;;;;;;;2743:15;2719:39;;;;;;;;;;;;2256:509;;;930:3913;;4513:328;4570:4;4586:12;4743:7;4731:20;4723:28;;4833:1;4826:4;:8;4819:15;;;4513:328;;;:::o;930:3913::-;;;;;;;;;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"generatedSources":[],"immutableReferences":{"15":[{"length":32,"start":391},{"length":32,"start":799},{"length":32,"start":1135},{"length":32,"start":1243},{"length":32,"start":1579}],"18":[{"length":32,"start":1207},{"length":32,"start":1744},{"length":32,"start":1873}],"21":[{"length":32,"start":556},{"length":32,"start":685},{"length":32,"start":1171}],"24":[{"length":32,"start":763},{"length":32,"start":1000},{"length":32,"start":1444}]},"linkReferences":{},"object":"608060405234801561001057600080fd5b50600436106100885760003560e01c80639bf47d6e1161005b5780639bf47d6e14610109578063caa12add1461013d578063ed007fc614610171578063f6682ab01461017b57610088565b806307f464a41461008d5780630d7101f71461009757806368cb3d94146100cb57806372f7a956146100d5575b600080fd5b610095610185565b005b61009f6102f9565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100d361031d565b005b6100dd61046d565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b610111610491565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101456104b5565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6101796104d9565b005b610183610629565b005b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141561022a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061079e6030913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b87f0000000000000000000000000000000000000000000000000000000000000000604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a1565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156103c2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061079e6030913960400191505060405180910390fd5b6103ca610185565b3073ffffffffffffffffffffffffffffffffffffffff1663f08a03237f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561045357600080fd5b505af1158015610467573d6000803e3d6000fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff16141561057e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061079e6030913960400191505060405180910390fd5b610586610629565b3073ffffffffffffffffffffffffffffffffffffffff1663f08a03237f00000000000000000000000000000000000000000000000000000000000000006040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561060f57600080fd5b505af1158015610623573d6000803e3d6000fd5b50505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156106ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252603081526020018061079e6030913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055507f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b87f0000000000000000000000000000000000000000000000000000000000000000604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a156fe4d6967726174696f6e2073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6ca2646970667358221220225c3ae21c323c66a6ac816f6d90cf900873611c034a6b26050d6022c9efdafd64736f6c63430007060033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH2 0x10 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x4 CALLDATASIZE LT PUSH2 0x88 JUMPI PUSH1 0x0 CALLDATALOAD PUSH1 0xE0 SHR DUP1 PUSH4 0x9BF47D6E GT PUSH2 0x5B JUMPI DUP1 PUSH4 0x9BF47D6E EQ PUSH2 0x109 JUMPI DUP1 PUSH4 0xCAA12ADD EQ PUSH2 0x13D JUMPI DUP1 PUSH4 0xED007FC6 EQ PUSH2 0x171 JUMPI DUP1 PUSH4 0xF6682AB0 EQ PUSH2 0x17B JUMPI PUSH2 0x88 JUMP JUMPDEST DUP1 PUSH4 0x7F464A4 EQ PUSH2 0x8D JUMPI DUP1 PUSH4 0xD7101F7 EQ PUSH2 0x97 JUMPI DUP1 PUSH4 0x68CB3D94 EQ PUSH2 0xCB JUMPI DUP1 PUSH4 0x72F7A956 EQ PUSH2 0xD5 JUMPI JUMPDEST PUSH1 0x0 DUP1 REVERT JUMPDEST PUSH2 0x95 PUSH2 0x185 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x9F PUSH2 0x2F9 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0xD3 PUSH2 0x31D JUMP JUMPDEST STOP JUMPDEST PUSH2 0xDD PUSH2 0x46D JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x111 PUSH2 0x491 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x145 PUSH2 0x4B5 JUMP JUMPDEST PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 RETURN JUMPDEST PUSH2 0x179 PUSH2 0x4D9 JUMP JUMPDEST STOP JUMPDEST PUSH2 0x183 PUSH2 0x629 JUMP JUMPDEST STOP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x22A JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x79E PUSH1 0x30 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0x0 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH32 0x75E41BC35FF1BF14D81D1D2F649C0084A0F974F9289C803EC9898EEEC4C8D0B8 PUSH32 0x0 PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x3C2 JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x79E PUSH1 0x30 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x3CA PUSH2 0x185 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF08A0323 PUSH32 0x0 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x453 JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x467 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 DUP2 JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x57E JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x79E PUSH1 0x30 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH2 0x586 PUSH2 0x629 JUMP JUMPDEST ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND PUSH4 0xF08A0323 PUSH32 0x0 PUSH1 0x40 MLOAD DUP3 PUSH4 0xFFFFFFFF AND PUSH1 0xE0 SHL DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x0 PUSH1 0x40 MLOAD DUP1 DUP4 SUB DUP2 PUSH1 0x0 DUP8 DUP1 EXTCODESIZE ISZERO DUP1 ISZERO PUSH2 0x60F JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP GAS CALL ISZERO DUP1 ISZERO PUSH2 0x623 JUMPI RETURNDATASIZE PUSH1 0x0 DUP1 RETURNDATACOPY RETURNDATASIZE PUSH1 0x0 REVERT JUMPDEST POP POP POP POP JUMP JUMPDEST PUSH32 0x0 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND ADDRESS PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND EQ ISZERO PUSH2 0x6CE JUMPI PUSH1 0x40 MLOAD PUSH32 0x8C379A000000000000000000000000000000000000000000000000000000000 DUP2 MSTORE PUSH1 0x4 ADD DUP1 DUP1 PUSH1 0x20 ADD DUP3 DUP2 SUB DUP3 MSTORE PUSH1 0x30 DUP2 MSTORE PUSH1 0x20 ADD DUP1 PUSH2 0x79E PUSH1 0x30 SWAP2 CODECOPY PUSH1 0x40 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 REVERT JUMPDEST PUSH32 0x0 PUSH1 0x0 DUP1 PUSH2 0x100 EXP DUP2 SLOAD DUP2 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF MUL NOT AND SWAP1 DUP4 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND MUL OR SWAP1 SSTORE POP PUSH32 0x75E41BC35FF1BF14D81D1D2F649C0084A0F974F9289C803EC9898EEEC4C8D0B8 PUSH32 0x0 PUSH1 0x40 MLOAD DUP1 DUP3 PUSH20 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF AND DUP2 MSTORE PUSH1 0x20 ADD SWAP2 POP POP PUSH1 0x40 MLOAD DUP1 SWAP2 SUB SWAP1 LOG1 JUMP INVALID 0x4D PUSH10 0x67726174696F6E207368 PUSH16 0x756C64206F6E6C792062652063616C6C PUSH6 0x642076696120 PUSH5 0x656C656761 PUSH21 0x6563616C6CA2646970667358221220225C3AE21C32 EXTCODECOPY PUSH7 0xA6AC816F6D90CF SWAP1 ADDMOD PUSH20 0x611C034A6B26050D6022C9EFDAFD64736F6C6343 STOP SMOD MOD STOP CALLER ","sourceMap":"930:3913:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3517:151;;;:::i;:::-;;1393:46;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3900:175;;;:::i;:::-;;1030:44;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1282:42;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;1156:39;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3238:171;;;:::i;:::-;;2868:143;;;:::i;:::-;;3517:151;1890:19;1873:36;;1881:4;1873:36;;;;1865:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3593:17:::1;3581:9;::::0;:29:::1;;;;;;;;;;;;;;;;;;3625:36;3643:17;3625:36;;;;;;;;;;;;;;;;;;;;3517:151::o:0;1393:46::-;;;:::o;3900:175::-;1890:19;1873:36;;1881:4;1873:36;;;;1865:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3976:20:::1;:18;:20::i;:::-;4020:4;4006:39;;;4046:21;4006:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3900:175::o:0;1030:44::-;;;:::o;1282:42::-;;;:::o;1156:39::-;;;:::o;3238:171::-;1890:19;1873:36;;1881:4;1873:36;;;;1865:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3312:18:::1;:16;:18::i;:::-;3354:4;3340:39;;;3380:21;3340:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;3238:171::o:0;2868:143::-;1890:19;1873:36;;1881:4;1873:36;;;;1865:97;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2942:14:::1;2930:9;::::0;:26:::1;;;;;;;;;;;;;;;;;;2971:33;2989:14;2971:33;;;;;;;;;;;;;;;;;;;;2868:143::o:0"},"gasEstimates":{"creation":{"codeDepositCost":"410200","executionCost":"infinite","totalCost":"infinite"},"external":{"MIGRATION_SINGLETON()":"infinite","SAFE_FALLBACK_HANDLER()":"infinite","SAFE_L2_SINGLETON()":"infinite","SAFE_SINGLETON()":"infinite","migrateL2Singleton()":"infinite","migrateL2WithFallbackHandler()":"infinite","migrateSingleton()":"infinite","migrateWithFallbackHandler()":"infinite"},"internal":{"hasCode(address)":"infinite"}},"methodIdentifiers":{"MIGRATION_SINGLETON()":"72f7a956","SAFE_FALLBACK_HANDLER()":"0d7101f7","SAFE_L2_SINGLETON()":"9bf47d6e","SAFE_SINGLETON()":"caa12add","migrateL2Singleton()":"07f464a4","migrateL2WithFallbackHandler()":"68cb3d94","migrateSingleton()":"f6682ab0","migrateWithFallbackHandler()":"ed007fc6"}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"safeSingleton\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"safeL2Singleton\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"fallbackHandler\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"singleton\",\"type\":\"address\"}],\"name\":\"ChangedMasterCopy\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MIGRATION_SINGLETON\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SAFE_FALLBACK_HANDLER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SAFE_L2_SINGLETON\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SAFE_SINGLETON\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrateL2Singleton\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrateL2WithFallbackHandler\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrateSingleton\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"migrateWithFallbackHandler\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"author\":\"@safe-global/safe-protocol\",\"details\":\"IMPORTANT: The library is intended to be used with the Safe standard proxy that stores the singleton address      at the storage slot 0. Use at your own risk with custom proxy implementations. The contract will allow invocations      to the migration functions only via delegatecall.\",\"events\":{\"ChangedMasterCopy(address)\":{\"params\":{\"singleton\":\"New master copy address\"}}},\"kind\":\"dev\",\"methods\":{\"constructor\":{\"params\":{\"fallbackHandler\":\"Address of the fallback handler implementation\",\"safeL2Singleton\":\"Address of the SafeL2 Singleton implementation\",\"safeSingleton\":\"Address of the Safe Singleton implementation\"}}},\"title\":\"Migration Contract for Safe Upgrade\",\"version\":1},\"userdoc\":{\"events\":{\"ChangedMasterCopy(address)\":{\"notice\":\"Event indicating a change of a singleton address. Named master copy here for legacy reasons.\"}},\"kind\":\"user\",\"methods\":{\"MIGRATION_SINGLETON()\":{\"notice\":\"Address of this contract\"},\"SAFE_FALLBACK_HANDLER()\":{\"notice\":\"Address of the Fallback Handler\"},\"SAFE_L2_SINGLETON()\":{\"notice\":\"Address of the Safe Singleton (L2) implementation\"},\"SAFE_SINGLETON()\":{\"notice\":\"Address of the Safe Singleton implementation\"},\"constructor\":{\"notice\":\"Constructor\"},\"migrateL2Singleton()\":{\"notice\":\"Migrate the Safe contract to a new Safe Singleton (L2) implementation.\"},\"migrateL2WithFallbackHandler()\":{\"notice\":\"Migrate to Safe Singleton (L2) and set the fallback handler. This function is intended to be used when migrating         a Safe to a version which also requires updating fallback handler.\"},\"migrateSingleton()\":{\"notice\":\"Migrate the Safe contract to a new Safe Singleton implementation.\"},\"migrateWithFallbackHandler()\":{\"notice\":\"Migrate to Safe Singleton and set the fallback handler. This function is intended to be used when migrating         a Safe to a version which also requires updating fallback handler.\"}},\"notice\":\"This is a generic contract that facilitates Safe and SafeL2 proxy contracts to migrate their singleton address.         The supported target Safe version is immutable and set in the constructor during the deployment of the contract.         This contract also supports migration with fallback handler update.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/SafeMigration.sol\":\"SafeMigration\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/libraries/SafeMigration.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\nimport {SafeStorage} from \\\"../libraries/SafeStorage.sol\\\";\\n\\ninterface ISafe {\\n    function setFallbackHandler(address handler) external;\\n}\\n\\n/**\\n * @title Migration Contract for Safe Upgrade\\n * @notice This is a generic contract that facilitates Safe and SafeL2 proxy contracts to migrate their singleton address.\\n *         The supported target Safe version is immutable and set in the constructor during the deployment of the contract.\\n *         This contract also supports migration with fallback handler update.\\n * @author @safe-global/safe-protocol\\n * @dev IMPORTANT: The library is intended to be used with the Safe standard proxy that stores the singleton address\\n *      at the storage slot 0. Use at your own risk with custom proxy implementations. The contract will allow invocations\\n *      to the migration functions only via delegatecall.\\n */\\ncontract SafeMigration is SafeStorage {\\n    /**\\n     * @notice Address of this contract\\n     */\\n    address public immutable MIGRATION_SINGLETON;\\n    /**\\n     * @notice Address of the Safe Singleton implementation\\n     */\\n    address public immutable SAFE_SINGLETON;\\n    /**\\n     * @notice Address of the Safe Singleton (L2) implementation\\n     */\\n    address public immutable SAFE_L2_SINGLETON;\\n    /**\\n     * @notice Address of the Fallback Handler\\n     */\\n    address public immutable SAFE_FALLBACK_HANDLER;\\n\\n    /**\\n     * @notice Event indicating a change of a singleton address. Named master copy here for legacy reasons.\\n     * @param singleton New master copy address\\n     */\\n    event ChangedMasterCopy(address singleton);\\n\\n    /**\\n     * @notice Modifier to make a function callable via delegatecall only.\\n     * If the function is called via a regular call, it will revert.\\n     */\\n    modifier onlyDelegateCall() {\\n        require(address(this) != MIGRATION_SINGLETON, \\\"Migration should only be called via delegatecall\\\");\\n        _;\\n    }\\n\\n    /**\\n     * @notice Constructor\\n     * @param safeSingleton Address of the Safe Singleton implementation\\n     * @param safeL2Singleton Address of the SafeL2 Singleton implementation\\n     * @param fallbackHandler Address of the fallback handler implementation\\n     */\\n    constructor(address safeSingleton, address safeL2Singleton, address fallbackHandler) {\\n        MIGRATION_SINGLETON = address(this);\\n\\n        require(hasCode(safeSingleton), \\\"Safe Singleton is not deployed\\\");\\n        require(hasCode(safeL2Singleton), \\\"Safe Singleton (L2) is not deployed\\\");\\n        require(hasCode(fallbackHandler), \\\"fallback handler is not deployed\\\");\\n\\n        SAFE_SINGLETON = safeSingleton;\\n        SAFE_L2_SINGLETON = safeL2Singleton;\\n        SAFE_FALLBACK_HANDLER = fallbackHandler;\\n    }\\n\\n    /**\\n     * @notice Migrate the Safe contract to a new Safe Singleton implementation.\\n     */\\n    function migrateSingleton() public onlyDelegateCall {\\n        singleton = SAFE_SINGLETON;\\n        emit ChangedMasterCopy(SAFE_SINGLETON);\\n    }\\n\\n    /**\\n     * @notice Migrate to Safe Singleton and set the fallback handler. This function is intended to be used when migrating\\n     *         a Safe to a version which also requires updating fallback handler.\\n     */\\n    function migrateWithFallbackHandler() external onlyDelegateCall {\\n        migrateSingleton();\\n        ISafe(address(this)).setFallbackHandler(SAFE_FALLBACK_HANDLER);\\n    }\\n\\n    /**\\n     * @notice Migrate the Safe contract to a new Safe Singleton (L2) implementation.\\n     */\\n    function migrateL2Singleton() public onlyDelegateCall {\\n        singleton = SAFE_L2_SINGLETON;\\n        emit ChangedMasterCopy(SAFE_L2_SINGLETON);\\n    }\\n\\n    /**\\n     * @notice Migrate to Safe Singleton (L2) and set the fallback handler. This function is intended to be used when migrating\\n     *         a Safe to a version which also requires updating fallback handler.\\n     */\\n    function migrateL2WithFallbackHandler() external onlyDelegateCall {\\n        migrateL2Singleton();\\n        ISafe(address(this)).setFallbackHandler(SAFE_FALLBACK_HANDLER);\\n    }\\n\\n    /**\\n     * @notice Checks whether an account has code.\\n     * @param account The address of the account to be checked.\\n     * @return A boolean value indicating whether the address has code (true) or not (false).\\n     * @dev This function relies on the `extcodesize` assembly opcode to determine whether an address has code.\\n     * It does not reliably determine whether or not an address is a smart contract or an EOA.\\n     */\\n    function hasCode(address account) internal view returns (bool) {\\n        uint256 size;\\n        /* solhint-disable no-inline-assembly */\\n        /// @solidity memory-safe-assembly\\n        assembly {\\n            size := extcodesize(account)\\n        }\\n        /* solhint-enable no-inline-assembly */\\n\\n        return size > 0;\\n    }\\n}\\n\",\"keccak256\":\"0x9daf0fb90b041f97f09c303def93520f2f24a260c9698d864af5250e7f577038\",\"license\":\"LGPL-3.0-only\"},\"contracts/libraries/SafeStorage.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n * @title SafeStorage - Storage layout of the Safe contracts to be used in libraries.\\n * @dev Should be always the first base contract of a library that is used with a Safe.\\n * @author Richard Meissner - @rmeissner\\n */\\ncontract SafeStorage {\\n    // From /common/Singleton.sol\\n    address internal singleton;\\n    // From /common/ModuleManager.sol\\n    mapping(address => address) internal modules;\\n    // From /common/OwnerManager.sol\\n    mapping(address => address) internal owners;\\n    uint256 internal ownerCount;\\n    uint256 internal threshold;\\n\\n    // From /Safe.sol\\n    uint256 internal nonce;\\n    bytes32 internal _deprecatedDomainSeparator;\\n    mapping(bytes32 => uint256) internal signedMessages;\\n    mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\\n}\\n\",\"keccak256\":\"0xae0c704f3e4ec6b1436bbbd10b153feaa665ac36e556ccc4f2155e4c02f5c46a\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":188,"contract":"contracts/libraries/SafeMigration.sol:SafeMigration","label":"singleton","offset":0,"slot":"0","type":"t_address"},{"astId":192,"contract":"contracts/libraries/SafeMigration.sol:SafeMigration","label":"modules","offset":0,"slot":"1","type":"t_mapping(t_address,t_address)"},{"astId":196,"contract":"contracts/libraries/SafeMigration.sol:SafeMigration","label":"owners","offset":0,"slot":"2","type":"t_mapping(t_address,t_address)"},{"astId":198,"contract":"contracts/libraries/SafeMigration.sol:SafeMigration","label":"ownerCount","offset":0,"slot":"3","type":"t_uint256"},{"astId":200,"contract":"contracts/libraries/SafeMigration.sol:SafeMigration","label":"threshold","offset":0,"slot":"4","type":"t_uint256"},{"astId":202,"contract":"contracts/libraries/SafeMigration.sol:SafeMigration","label":"nonce","offset":0,"slot":"5","type":"t_uint256"},{"astId":204,"contract":"contracts/libraries/SafeMigration.sol:SafeMigration","label":"_deprecatedDomainSeparator","offset":0,"slot":"6","type":"t_bytes32"},{"astId":208,"contract":"contracts/libraries/SafeMigration.sol:SafeMigration","label":"signedMessages","offset":0,"slot":"7","type":"t_mapping(t_bytes32,t_uint256)"},{"astId":214,"contract":"contracts/libraries/SafeMigration.sol:SafeMigration","label":"approvedHashes","offset":0,"slot":"8","type":"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_mapping(t_address,t_address)":{"encoding":"mapping","key":"t_address","label":"mapping(address => address)","numberOfBytes":"32","value":"t_address"},"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(bytes32 => uint256))","numberOfBytes":"32","value":"t_mapping(t_bytes32,t_uint256)"},"t_mapping(t_bytes32,t_uint256)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"events":{"ChangedMasterCopy(address)":{"notice":"Event indicating a change of a singleton address. Named master copy here for legacy reasons."}},"kind":"user","methods":{"MIGRATION_SINGLETON()":{"notice":"Address of this contract"},"SAFE_FALLBACK_HANDLER()":{"notice":"Address of the Fallback Handler"},"SAFE_L2_SINGLETON()":{"notice":"Address of the Safe Singleton (L2) implementation"},"SAFE_SINGLETON()":{"notice":"Address of the Safe Singleton implementation"},"constructor":{"notice":"Constructor"},"migrateL2Singleton()":{"notice":"Migrate the Safe contract to a new Safe Singleton (L2) implementation."},"migrateL2WithFallbackHandler()":{"notice":"Migrate to Safe Singleton (L2) and set the fallback handler. This function is intended to be used when migrating         a Safe to a version which also requires updating fallback handler."},"migrateSingleton()":{"notice":"Migrate the Safe contract to a new Safe Singleton implementation."},"migrateWithFallbackHandler()":{"notice":"Migrate to Safe Singleton and set the fallback handler. This function is intended to be used when migrating         a Safe to a version which also requires updating fallback handler."}},"notice":"This is a generic contract that facilitates Safe and SafeL2 proxy contracts to migrate their singleton address.         The supported target Safe version is immutable and set in the constructor during the deployment of the contract.         This contract also supports migration with fallback handler update.","version":1}}},"contracts/libraries/SafeStorage.sol":{"SafeStorage":{"abi":[],"devdoc":{"author":"Richard Meissner - @rmeissner","details":"Should be always the first base contract of a library that is used with a Safe.","kind":"dev","methods":{},"title":"SafeStorage - Storage layout of the Safe contracts to be used in libraries.","version":1},"evm":{"bytecode":{"generatedSources":[],"linkReferences":{},"object":"6080604052348015600f57600080fd5b50603f80601d6000396000f3fe6080604052600080fdfea26469706673582212209ec6de94c8c0bf27bb9fc3808dbfb950a38cc157640c5ec8ed4f5c0b2ae6aa1a64736f6c63430007060033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE CALLVALUE DUP1 ISZERO PUSH1 0xF JUMPI PUSH1 0x0 DUP1 REVERT JUMPDEST POP PUSH1 0x3F DUP1 PUSH1 0x1D PUSH1 0x0 CODECOPY PUSH1 0x0 RETURN INVALID PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP15 0xC6 0xDE SWAP5 0xC8 0xC0 0xBF 0x27 0xBB SWAP16 0xC3 DUP1 DUP14 0xBF 0xB9 POP LOG3 DUP13 0xC1 JUMPI PUSH5 0xC5EC8ED4F 0x5C SIGNEXTEND 0x2A 0xE6 0xAA BYTE PUSH5 0x736F6C6343 STOP SMOD MOD STOP CALLER ","sourceMap":"298:563:1:-:0;;;;;;;;;;;;;;;;;;;"},"deployedBytecode":{"generatedSources":[],"immutableReferences":{},"linkReferences":{},"object":"6080604052600080fdfea26469706673582212209ec6de94c8c0bf27bb9fc3808dbfb950a38cc157640c5ec8ed4f5c0b2ae6aa1a64736f6c63430007060033","opcodes":"PUSH1 0x80 PUSH1 0x40 MSTORE PUSH1 0x0 DUP1 REVERT INVALID LOG2 PUSH5 0x6970667358 0x22 SLT KECCAK256 SWAP15 0xC6 0xDE SWAP5 0xC8 0xC0 0xBF 0x27 0xBB SWAP16 0xC3 DUP1 DUP14 0xBF 0xB9 POP LOG3 DUP13 0xC1 JUMPI PUSH5 0xC5EC8ED4F 0x5C SIGNEXTEND 0x2A 0xE6 0xAA BYTE PUSH5 0x736F6C6343 STOP SMOD MOD STOP CALLER ","sourceMap":"298:563:1:-:0;;;;;"},"gasEstimates":{"creation":{"codeDepositCost":"12600","executionCost":"66","totalCost":"12666"}},"methodIdentifiers":{}},"metadata":"{\"compiler\":{\"version\":\"0.7.6+commit.7338295f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[],\"devdoc\":{\"author\":\"Richard Meissner - @rmeissner\",\"details\":\"Should be always the first base contract of a library that is used with a Safe.\",\"kind\":\"dev\",\"methods\":{},\"title\":\"SafeStorage - Storage layout of the Safe contracts to be used in libraries.\",\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/libraries/SafeStorage.sol\":\"SafeStorage\"},\"evmVersion\":\"istanbul\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":false,\"runs\":200},\"remappings\":[]},\"sources\":{\"contracts/libraries/SafeStorage.sol\":{\"content\":\"// SPDX-License-Identifier: LGPL-3.0-only\\npragma solidity >=0.7.0 <0.9.0;\\n\\n/**\\n * @title SafeStorage - Storage layout of the Safe contracts to be used in libraries.\\n * @dev Should be always the first base contract of a library that is used with a Safe.\\n * @author Richard Meissner - @rmeissner\\n */\\ncontract SafeStorage {\\n    // From /common/Singleton.sol\\n    address internal singleton;\\n    // From /common/ModuleManager.sol\\n    mapping(address => address) internal modules;\\n    // From /common/OwnerManager.sol\\n    mapping(address => address) internal owners;\\n    uint256 internal ownerCount;\\n    uint256 internal threshold;\\n\\n    // From /Safe.sol\\n    uint256 internal nonce;\\n    bytes32 internal _deprecatedDomainSeparator;\\n    mapping(bytes32 => uint256) internal signedMessages;\\n    mapping(address => mapping(bytes32 => uint256)) internal approvedHashes;\\n}\\n\",\"keccak256\":\"0xae0c704f3e4ec6b1436bbbd10b153feaa665ac36e556ccc4f2155e4c02f5c46a\",\"license\":\"LGPL-3.0-only\"}},\"version\":1}","storageLayout":{"storage":[{"astId":188,"contract":"contracts/libraries/SafeStorage.sol:SafeStorage","label":"singleton","offset":0,"slot":"0","type":"t_address"},{"astId":192,"contract":"contracts/libraries/SafeStorage.sol:SafeStorage","label":"modules","offset":0,"slot":"1","type":"t_mapping(t_address,t_address)"},{"astId":196,"contract":"contracts/libraries/SafeStorage.sol:SafeStorage","label":"owners","offset":0,"slot":"2","type":"t_mapping(t_address,t_address)"},{"astId":198,"contract":"contracts/libraries/SafeStorage.sol:SafeStorage","label":"ownerCount","offset":0,"slot":"3","type":"t_uint256"},{"astId":200,"contract":"contracts/libraries/SafeStorage.sol:SafeStorage","label":"threshold","offset":0,"slot":"4","type":"t_uint256"},{"astId":202,"contract":"contracts/libraries/SafeStorage.sol:SafeStorage","label":"nonce","offset":0,"slot":"5","type":"t_uint256"},{"astId":204,"contract":"contracts/libraries/SafeStorage.sol:SafeStorage","label":"_deprecatedDomainSeparator","offset":0,"slot":"6","type":"t_bytes32"},{"astId":208,"contract":"contracts/libraries/SafeStorage.sol:SafeStorage","label":"signedMessages","offset":0,"slot":"7","type":"t_mapping(t_bytes32,t_uint256)"},{"astId":214,"contract":"contracts/libraries/SafeStorage.sol:SafeStorage","label":"approvedHashes","offset":0,"slot":"8","type":"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))"}],"types":{"t_address":{"encoding":"inplace","label":"address","numberOfBytes":"20"},"t_bytes32":{"encoding":"inplace","label":"bytes32","numberOfBytes":"32"},"t_mapping(t_address,t_address)":{"encoding":"mapping","key":"t_address","label":"mapping(address => address)","numberOfBytes":"32","value":"t_address"},"t_mapping(t_address,t_mapping(t_bytes32,t_uint256))":{"encoding":"mapping","key":"t_address","label":"mapping(address => mapping(bytes32 => uint256))","numberOfBytes":"32","value":"t_mapping(t_bytes32,t_uint256)"},"t_mapping(t_bytes32,t_uint256)":{"encoding":"mapping","key":"t_bytes32","label":"mapping(bytes32 => uint256)","numberOfBytes":"32","value":"t_uint256"},"t_uint256":{"encoding":"inplace","label":"uint256","numberOfBytes":"32"}}},"userdoc":{"kind":"user","methods":{},"version":1}}}}}}