diff --git a/README.md b/README.md index 26ba7f6d..3ad2b57b 100644 --- a/README.md +++ b/README.md @@ -98,6 +98,10 @@ THIS IF YOU DON'T KNOW WHAT YOU ARE DOING. ALL YOUR FUNDS COULD BE LOST** - `change_master_copy
`: Updates the master copy to be `address`. It's used to update the Safe. **WARNING: DON'T USE THIS IF YOU DON'T KNOW WHAT YOU ARE DOING. ALL YOUR FUNDS COULD BE LOST** - `update`: Updates the Safe to the latest version (if you are on a known network like `Goerli` or `Mainnet`). +- `update_to_l2 `: Updates a v1.1.1/v1.3.0/v1.4.1 non L2 Safe to a L2 Safe supported by Safe Wallet UI. +The migration contract address needs to be provided. +It can be found [here](https://github.com/safe-global/safe-contracts/blob/main/contracts/libraries/SafeToL2Migration.sol). +Nonce for the Safe must be 0 and supported versions are v1.1.1, v1.3.0 and v1.4.1. **WARNING: DON'T USE THIS IF YOU DON'T KNOW WHAT YOU ARE DOING. ALL YOUR FUNDS COULD BE LOST** Operations on `tx-service` mode, requires a Safe Transaction Service working on the network diff --git a/safe_cli/contracts/__init__.py b/safe_cli/contracts/__init__.py new file mode 100644 index 00000000..f47511b6 --- /dev/null +++ b/safe_cli/contracts/__init__.py @@ -0,0 +1,2 @@ +# flake8: noqa F401 +from .safe_to_l2_migration import safe_to_l2_migration diff --git a/safe_cli/contracts/safe_to_l2_migration.py b/safe_cli/contracts/safe_to_l2_migration.py new file mode 100644 index 00000000..7ab4e424 --- /dev/null +++ b/safe_cli/contracts/safe_to_l2_migration.py @@ -0,0 +1,165 @@ +safe_to_l2_migration = { + "_format": "hh-sol-artifact-1", + "contractName": "SafeToL2Migration", + "sourceName": "contracts/libraries/SafeToL2Migration.sol", + "abi": [ + {"inputs": [], "stateMutability": "nonpayable", "type": "constructor"}, + { + "anonymous": False, + "inputs": [ + { + "indexed": False, + "internalType": "address", + "name": "singleton", + "type": "address", + } + ], + "name": "ChangedMasterCopy", + "type": "event", + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": False, + "internalType": "address", + "name": "to", + "type": "address", + }, + { + "indexed": False, + "internalType": "uint256", + "name": "value", + "type": "uint256", + }, + { + "indexed": False, + "internalType": "bytes", + "name": "data", + "type": "bytes", + }, + { + "indexed": False, + "internalType": "enum Enum.Operation", + "name": "operation", + "type": "uint8", + }, + { + "indexed": False, + "internalType": "uint256", + "name": "safeTxGas", + "type": "uint256", + }, + { + "indexed": False, + "internalType": "uint256", + "name": "baseGas", + "type": "uint256", + }, + { + "indexed": False, + "internalType": "uint256", + "name": "gasPrice", + "type": "uint256", + }, + { + "indexed": False, + "internalType": "address", + "name": "gasToken", + "type": "address", + }, + { + "indexed": False, + "internalType": "address payable", + "name": "refundReceiver", + "type": "address", + }, + { + "indexed": False, + "internalType": "bytes", + "name": "signatures", + "type": "bytes", + }, + { + "indexed": False, + "internalType": "bytes", + "name": "additionalInfo", + "type": "bytes", + }, + ], + "name": "SafeMultiSigTransaction", + "type": "event", + }, + { + "anonymous": False, + "inputs": [ + { + "indexed": True, + "internalType": "address", + "name": "initiator", + "type": "address", + }, + { + "indexed": False, + "internalType": "address[]", + "name": "owners", + "type": "address[]", + }, + { + "indexed": False, + "internalType": "uint256", + "name": "threshold", + "type": "uint256", + }, + { + "indexed": False, + "internalType": "address", + "name": "initializer", + "type": "address", + }, + { + "indexed": False, + "internalType": "address", + "name": "fallbackHandler", + "type": "address", + }, + ], + "name": "SafeSetup", + "type": "event", + }, + { + "inputs": [], + "name": "MIGRATION_SINGLETON", + "outputs": [{"internalType": "address", "name": "", "type": "address"}], + "stateMutability": "view", + "type": "function", + }, + { + "inputs": [ + {"internalType": "address", "name": "l2Singleton", "type": "address"}, + { + "internalType": "address", + "name": "fallbackHandler", + "type": "address", + }, + ], + "name": "migrateFromV111", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function", + }, + { + "inputs": [ + {"internalType": "address", "name": "l2Singleton", "type": "address"} + ], + "name": "migrateToL2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function", + }, + ], + "bytecode": "0x60a060405234801561001057600080fd5b503073ffffffffffffffffffffffffffffffffffffffff1660808173ffffffffffffffffffffffffffffffffffffffff1660601b8152505060805160601c61166861007960003980610124528061014852806108415280610b70528061132552506116686000f3fe608060405234801561001057600080fd5b50600436106100415760003560e01c806372f7a95614610046578063d9a208121461007a578063ef2624ae146100de575b600080fd5b61004e610122565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100dc6004803603604081101561009057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610146565b005b610120600480360360208110156100f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b6e565b005b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156101eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806115646030913960400191505060405180910390fd5b600160055414610246576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806116116022913960400191505060405180910390fd5b61024f81611263565b6102a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806115946021913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b15801561030d57600080fd5b505afa158015610321573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561034b57600080fd5b810190808051604051939291908464010000000082111561036b57600080fd5b8382019150602082018581111561038157600080fd5b825186600182028301116401000000008211171561039e57600080fd5b8083526020830192505050908051906020019080838360005b838110156103d25780820151818401526020810190506103b7565b50505050905090810190601f1680156103ff5780820380516001836020036101000a031916815260200191505b506040525050506040516020018082805190602001908083835b6020831061043c5780518252602082019150602081019050602083039250610419565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405160200180807f312e312e310000000000000000000000000000000000000000000000000000008152506005019050604051602081830303815290604052805190602001208114610517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806115b5602b913960400191505060405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b15801561055f57600080fd5b505afa158015610573573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561059d57600080fd5b81019080805160405193929190846401000000008211156105bd57600080fd5b838201915060208201858111156105d357600080fd5b82518660018202830111640100000000821117156105f057600080fd5b8083526020830192505050908051906020019080838360005b83811015610624578082015181840152602081019050610609565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b506040525050506040516020018082805190602001908083835b6020831061068e578051825260208201915060208101905060208303925061066b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405160200180807f312e332e30000000000000000000000000000000000000000000000000000000815250600501905060405160208183030381529060405280519060200120811480610764575060405160200180807f312e342e3100000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012081145b6107b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806115b5602b913960400191505060405180910390fd5b60003090508073ffffffffffffffffffffffffffffffffffffffff1663f08a0323856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561082757600080fd5b505af115801561083b573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88273ffffffffffffffffffffffffffffffffffffffff1663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b1580156108dd57600080fd5b505afa1580156108f1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561091b57600080fd5b810190808051604051939291908464010000000082111561093b57600080fd5b8382019150602082018581111561095157600080fd5b825186602082028301116401000000008211171561096e57600080fd5b8083526020830192505050908051906020019060200280838360005b838110156109a557808201518184015260208101905061098a565b505050509050016040525050508373ffffffffffffffffffffffffffffffffffffffff1663e75235b86040518163ffffffff1660e01b815260040160206040518083038186803b1580156109f857600080fd5b505afa158015610a0c573d6000803e3d6000fd5b505050506040513d6020811015610a2257600080fd5b810190808051906020019092919050505060008860405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825286818151815260200191508051906020019060200280838360005b83811015610ab7578082015181840152602081019050610a9c565b505050509050019550505050505060405180910390a2600063d9a208128686604051602401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050610b668682611276565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610c13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806115646030913960400191505060405180910390fd5b600160055414610c6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806116116022913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610d13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806115416023913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610dba57600080fd5b8101908080516040519392919084640100000000821115610dda57600080fd5b83820191506020820185811115610df057600080fd5b8251866001820283011164010000000082111715610e0d57600080fd5b8083526020830192505050908051906020019080838360005b83811015610e41578082015181840152602081019050610e26565b50505050905090810190601f168015610e6e5780820380516001836020036101000a031916815260200191505b506040525050506040516020018082805190602001908083835b60208310610eab5780518252602082019150602081019050602083039250610e88565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060008273ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b158015610f3057600080fd5b505afa158015610f44573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610f6e57600080fd5b8101908080516040519392919084640100000000821115610f8e57600080fd5b83820191506020820185811115610fa457600080fd5b8251866001820283011164010000000082111715610fc157600080fd5b8083526020830192505050908051906020019080838360005b83811015610ff5578082015181840152602081019050610fda565b50505050905090810190601f1680156110225780820380516001836020036101000a031916815260200191505b506040525050506040516020018082805190602001908083835b6020831061105f578051825260208201915060208101905060208303925061103c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012090508082146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806115e06031913960400191505060405180910390fd5b60405160200180807f312e332e3000000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012081148061118d575060405160200180807f312e342e3100000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012081145b6111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806115b5602b913960400191505060405180910390fd5b600063ef2624ae84604051602401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905061125d8482611276565b50505050565b600080823b905060008111915050919050565b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008033600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed7f0000000000000000000000000000000000000000000000000000000000000000600084600160008060008060008a604051808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018060200189600181111561138857fe5b81526020018881526020018781526020018681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528c818151815260200191508051906020019080838360005b838110156114175780820151818401526020810190506113fc565b50505050905090810190601f1680156114445780820380516001836020036101000a031916815260200191505b50848103835260008152602001848103825285818151815260200191508051906020019080838360005b8381101561148957808201518184015260208101905061146e565b50505050905090810190601f1680156114b65780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a17f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b860008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150505056fe5361666520697320616c7265616479207573696e67207468652073696e676c65746f6e4d6967726174696f6e2073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6c66616c6c6261636b48616e646c6572206973206e6f74206120636f6e747261637450726f76696465642073696e676c65746f6e2076657273696f6e206973206e6f7420737570706f727465644c322073696e676c65746f6e206d757374206d617463682063757272656e742076657273696f6e2073696e676c65746f6e53616665206d7573742068617665206e6f7420657865637574656420616e79207478a2646970667358221220793e5d2c9663ada01e645b39ebf96ddeb228ee0a44a505e529d94a678735a92164736f6c63430007060033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106100415760003560e01c806372f7a95614610046578063d9a208121461007a578063ef2624ae146100de575b600080fd5b61004e610122565b604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b6100dc6004803603604081101561009057600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610146565b005b610120600480360360208110156100f457600080fd5b81019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610b6e565b005b7f000000000000000000000000000000000000000000000000000000000000000081565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff1614156101eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806115646030913960400191505060405180910390fd5b600160055414610246576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806116116022913960400191505060405180910390fd5b61024f81611263565b6102a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260218152602001806115946021913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b15801561030d57600080fd5b505afa158015610321573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561034b57600080fd5b810190808051604051939291908464010000000082111561036b57600080fd5b8382019150602082018581111561038157600080fd5b825186600182028301116401000000008211171561039e57600080fd5b8083526020830192505050908051906020019080838360005b838110156103d25780820151818401526020810190506103b7565b50505050905090810190601f1680156103ff5780820380516001836020036101000a031916815260200191505b506040525050506040516020018082805190602001908083835b6020831061043c5780518252602082019150602081019050602083039250610419565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405160200180807f312e312e310000000000000000000000000000000000000000000000000000008152506005019050604051602081830303815290604052805190602001208114610517576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806115b5602b913960400191505060405180910390fd5b60008373ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b15801561055f57600080fd5b505afa158015610573573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561059d57600080fd5b81019080805160405193929190846401000000008211156105bd57600080fd5b838201915060208201858111156105d357600080fd5b82518660018202830111640100000000821117156105f057600080fd5b8083526020830192505050908051906020019080838360005b83811015610624578082015181840152602081019050610609565b50505050905090810190601f1680156106515780820380516001836020036101000a031916815260200191505b506040525050506040516020018082805190602001908083835b6020831061068e578051825260208201915060208101905060208303925061066b565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060405160200180807f312e332e30000000000000000000000000000000000000000000000000000000815250600501905060405160208183030381529060405280519060200120811480610764575060405160200180807f312e342e3100000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012081145b6107b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806115b5602b913960400191505060405180910390fd5b60003090508073ffffffffffffffffffffffffffffffffffffffff1663f08a0323856040518263ffffffff1660e01b8152600401808273ffffffffffffffffffffffffffffffffffffffff168152602001915050600060405180830381600087803b15801561082757600080fd5b505af115801561083b573d6000803e3d6000fd5b505050507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f141df868a6331af528e38c83b7aa03edc19be66e37ae67f9285bf4f8e3c6a1a88273ffffffffffffffffffffffffffffffffffffffff1663a0e67e2b6040518163ffffffff1660e01b815260040160006040518083038186803b1580156108dd57600080fd5b505afa1580156108f1573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f82011682018060405250602081101561091b57600080fd5b810190808051604051939291908464010000000082111561093b57600080fd5b8382019150602082018581111561095157600080fd5b825186602082028301116401000000008211171561096e57600080fd5b8083526020830192505050908051906020019060200280838360005b838110156109a557808201518184015260208101905061098a565b505050509050016040525050508373ffffffffffffffffffffffffffffffffffffffff1663e75235b86040518163ffffffff1660e01b815260040160206040518083038186803b1580156109f857600080fd5b505afa158015610a0c573d6000803e3d6000fd5b505050506040513d6020811015610a2257600080fd5b810190808051906020019092919050505060008860405180806020018581526020018473ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828103825286818151815260200191508051906020019060200280838360005b83811015610ab7578082015181840152602081019050610a9c565b505050509050019550505050505060405180910390a2600063d9a208128686604051602401808373ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff168152602001925050506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050509050610b668682611276565b505050505050565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff163073ffffffffffffffffffffffffffffffffffffffff161415610c13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001806115646030913960400191505060405180910390fd5b600160055414610c6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001806116116022913960400191505060405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415610d13576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260238152602001806115416023913960400191505060405180910390fd5b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b158015610d7c57600080fd5b505afa158015610d90573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610dba57600080fd5b8101908080516040519392919084640100000000821115610dda57600080fd5b83820191506020820185811115610df057600080fd5b8251866001820283011164010000000082111715610e0d57600080fd5b8083526020830192505050908051906020019080838360005b83811015610e41578082015181840152602081019050610e26565b50505050905090810190601f168015610e6e5780820380516001836020036101000a031916815260200191505b506040525050506040516020018082805190602001908083835b60208310610eab5780518252602082019150602081019050602083039250610e88565b6001836020036101000a03801982511681845116808217855250505050505090500191505060405160208183030381529060405280519060200120905060008273ffffffffffffffffffffffffffffffffffffffff1663ffa1ad746040518163ffffffff1660e01b815260040160006040518083038186803b158015610f3057600080fd5b505afa158015610f44573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052506020811015610f6e57600080fd5b8101908080516040519392919084640100000000821115610f8e57600080fd5b83820191506020820185811115610fa457600080fd5b8251866001820283011164010000000082111715610fc157600080fd5b8083526020830192505050908051906020019080838360005b83811015610ff5578082015181840152602081019050610fda565b50505050905090810190601f1680156110225780820380516001836020036101000a031916815260200191505b506040525050506040516020018082805190602001908083835b6020831061105f578051825260208201915060208101905060208303925061103c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506040516020818303038152906040528051906020012090508082146110f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001806115e06031913960400191505060405180910390fd5b60405160200180807f312e332e3000000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012081148061118d575060405160200180807f312e342e3100000000000000000000000000000000000000000000000000000081525060050190506040516020818303038152906040528051906020012081145b6111e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001806115b5602b913960400191505060405180910390fd5b600063ef2624ae84604051602401808273ffffffffffffffffffffffffffffffffffffffff1681526020019150506040516020818303038152906040529060e01b6020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050905061125d8482611276565b50505050565b600080823b905060008111915050919050565b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060008033600454604051602001808481526020018373ffffffffffffffffffffffffffffffffffffffff168152602001828152602001935050505060405160208183030381529060405290507f66753cd2356569ee081232e3be8909b950e0a76c1f8460c3a5e3c2be32b11bed7f0000000000000000000000000000000000000000000000000000000000000000600084600160008060008060008a604051808b73ffffffffffffffffffffffffffffffffffffffff1681526020018a81526020018060200189600181111561138857fe5b81526020018881526020018781526020018681526020018573ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff168152602001806020018060200184810384528c818151815260200191508051906020019080838360005b838110156114175780820151818401526020810190506113fc565b50505050905090810190601f1680156114445780820380516001836020036101000a031916815260200191505b50848103835260008152602001848103825285818151815260200191508051906020019080838360005b8381101561148957808201518184015260208101905061146e565b50505050905090810190601f1680156114b65780820380516001836020036101000a031916815260200191505b509d505050505050505050505050505060405180910390a17f75e41bc35ff1bf14d81d1d2f649c0084a0f974f9289c803ec9898eeec4c8d0b860008054906101000a900473ffffffffffffffffffffffffffffffffffffffff16604051808273ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a150505056fe5361666520697320616c7265616479207573696e67207468652073696e676c65746f6e4d6967726174696f6e2073686f756c64206f6e6c792062652063616c6c6564207669612064656c656761746563616c6c66616c6c6261636b48616e646c6572206973206e6f74206120636f6e747261637450726f76696465642073696e676c65746f6e2076657273696f6e206973206e6f7420737570706f727465644c322073696e676c65746f6e206d757374206d617463682063757272656e742076657273696f6e2073696e676c65746f6e53616665206d7573742068617665206e6f7420657865637574656420616e79207478a2646970667358221220793e5d2c9663ada01e645b39ebf96ddeb228ee0a44a505e529d94a678735a92164736f6c63430007060033", + "linkReferences": {}, + "deployedLinkReferences": {}, +} diff --git a/safe_cli/operators/exceptions.py b/safe_cli/operators/exceptions.py index 083bb318..bd7a0a04 100644 --- a/safe_cli/operators/exceptions.py +++ b/safe_cli/operators/exceptions.py @@ -70,6 +70,14 @@ class InvalidMasterCopyException(SafeOperatorException): pass +class InvalidMigrationContractException(SafeOperatorException): + pass + + +class InvalidNonceException(SafeOperatorException): + pass + + class NotEnoughEtherToSend(SafeOperatorException): pass diff --git a/safe_cli/operators/safe_operator.py b/safe_cli/operators/safe_operator.py index 0153a225..81d50d58 100644 --- a/safe_cli/operators/safe_operator.py +++ b/safe_cli/operators/safe_operator.py @@ -26,12 +26,13 @@ from gnosis.eth.contracts import ( get_erc20_contract, get_erc721_contract, - get_safe_contract, get_safe_V1_1_1_contract, ) +from gnosis.eth.utils import get_empty_tx_params from gnosis.safe import InvalidInternalTx, Safe, SafeOperation, SafeTx from gnosis.safe.api import TransactionServiceApi from gnosis.safe.multi_send import MultiSend, MultiSendOperation, MultiSendTx +from gnosis.safe.safe_deployments import safe_deployments from safe_cli.ethereum_hd_wallet import get_account_from_words from safe_cli.operators.exceptions import ( @@ -43,6 +44,8 @@ InvalidFallbackHandlerException, InvalidGuardException, InvalidMasterCopyException, + InvalidMigrationContractException, + InvalidNonceException, NonExistingOwnerException, NotEnoughEtherToSend, NotEnoughSignatures, @@ -61,6 +64,8 @@ ) from safe_cli.utils import choose_option_question, get_erc_20_list, yes_or_no_question +from ..contracts import safe_to_l2_migration + @dataclasses.dataclass class SafeCliInfo: @@ -216,11 +221,8 @@ def is_version_updated(self) -> bool: if self._safe_cli_info.master_copy == self.last_safe_contract_address: return True else: # Check versions, maybe safe-cli addresses were not updated - safe_contract = get_safe_contract( - self.ethereum_client.w3, self.last_safe_contract_address - ) try: - safe_contract_version = safe_contract.functions.VERSION().call() + safe_contract_version = self.safe.retrieve_version() except BadFunctionCallOutput: # Safe master copy is not deployed or errored, maybe custom network return True # We cannot say you are not updated ¯\_(ツ)_/¯ return semantic_version.parse( @@ -545,6 +547,7 @@ def change_master_copy(self, new_master_copy: str) -> bool: def update_version(self) -> Optional[bool]: """ Update Safe Master Copy and Fallback handler to the last version + :return: """ if self.is_version_updated(): @@ -586,6 +589,63 @@ def update_version(self) -> Optional[bool]: ) self.safe_cli_info.version = self.safe.retrieve_version() + def update_version_to_l2( + self, migration_contract_address: ChecksumAddress + ) -> Optional[bool]: + """ + Update not L2 Safe to L2, so official UI supports it. Useful when replaying Safes deployed in + non L2 networks (like mainnet) in L2 networks. + Only v1.1.1, v1.3.0 and v1.4.1 versions are supported. Also, Safe nonce must be 0. + + :return: + """ + + if not self.ethereum_client.is_contract(migration_contract_address): + raise InvalidMigrationContractException( + f"Non L2 to L2 migration contract {migration_contract_address} is not deployed" + ) + + safe_version = self.safe.retrieve_version() + chain_id = self.ethereum_client.get_chain_id() + + if self.safe.retrieve_nonce() > 0: + raise InvalidNonceException("Nonce must be 0 for non L2 to L2 migration") + + l2_migration_contract = self.ethereum_client.w3.eth.contract( + NULL_ADDRESS, abi=safe_to_l2_migration["abi"] + ) + if safe_version == "1.1.1": + safe_l2_singleton = safe_deployments["1.3.0"]["GnosisSafeL2"][str(chain_id)] + fallback_handler = safe_deployments["1.3.0"][ + "CompatibilityFallbackHandler" + ][str(chain_id)] + data = HexBytes( + l2_migration_contract.functions.migrateFromV111( + safe_l2_singleton, fallback_handler + ).build_transaction(get_empty_tx_params())["data"] + ) + elif safe_version in ("1.3.0", "1.4.1"): + safe_l2_singleton = safe_deployments[safe_version]["GnosisSafeL2"][ + str(chain_id) + ] + fallback_handler = self.safe_cli_info.fallback_handler + data = HexBytes( + l2_migration_contract.functions.migrateToL2( + safe_l2_singleton + ).build_transaction(get_empty_tx_params())["data"] + ) + else: + raise InvalidMasterCopyException( + "Current version is not supported to migrate to L2" + ) + + if self.prepare_and_execute_safe_transaction( + migration_contract_address, 0, data, operation=SafeOperation.DELEGATE_CALL + ): + self.safe_cli_info.master_copy = safe_l2_singleton + self.safe_cli_info.fallback_handler = fallback_handler + self.safe_cli_info.version = self.safe.retrieve_version() + def change_threshold(self, threshold: int): if threshold == self.safe_cli_info.threshold: print_formatted_text( diff --git a/safe_cli/prompt_parser.py b/safe_cli/prompt_parser.py index a16190a6..202d150f 100644 --- a/safe_cli/prompt_parser.py +++ b/safe_cli/prompt_parser.py @@ -18,6 +18,8 @@ HardwareWalletException, HashAlreadyApproved, InvalidMasterCopyException, + InvalidMigrationContractException, + InvalidNonceException, NonExistingOwnerException, NotEnoughEtherToSend, NotEnoughSignatures, @@ -102,6 +104,10 @@ def wrapper(*args, **kwargs): print_formatted_text( HTML(f"