The uncomfortable truth is: You might have to get used to the fact that the funds are lost. In this article, we will explore if there is a way to recover. However it is more likely than not, that there is no way to recover.
Context
With the advent of more Ethereum Layer 2 solutions (e.g. Optimism, Arbitrum) and sidechains (e.g. Gnosis Chain, Polygon), assets and dapps are scattered across different networks. That brings up the question: How do Ethereum accounts behave across different networks?
There is a difference between private key based accounts (“externally owned accounts”, EOAs) and smart contract accounts such as the Safe.
EOAs can be used across networks without issues.
Safes cannot be used that easily across networks.
Safes are deployed only to 1 specific network. This means if you created a Safe address on e.g. Ethereum mainnet, it does not mean that there is a Safe on the same address on e.g. Gnosis Chain. That is unless yourself or someone else has deployed a Safe to this address, it will not exist.
Most bridges between networks assume the same addresses on each network by default which leads to most of the confusion. Bridges usually “bridge” under the assumption that it is between 2 EOA addresses.
In some cases, it is possible to create a Safe on a different network with the same address and owner structure. In other cases it is not possible. We will now explore this further.
Determine Safe setup during creation
As a first, we need to figure out how and with which settings the Safe was created. This is referring to the actually existing Safe. Particularly, we need to know the ProxyFactory
address and the used masterCopy
(called singleton
starting v1.3.0).
For this, please open the Safe web interface and navigate to the creation transaction.
That’s the creation for this Safe on Ethereum mainnet. You can copy Factory and Mastercopy address here.
Alternatively, find the Safe creation transaction on Etherscan or a block explorer on your respective network. The to
address is the used factory. The mastercopy can be seen after clicking “decode input data”. Here is an example transaction.
In our example, the following addresses have been found:
factory: 0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B
mastercopy: 0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F
For some cases below we also need the method that was called on the proxy factory. This info can be found in the undecoded input data field on Etherscan.
In this case it is createProxy
.
Case 1: Safe version 1.3.0
This section only applies for:
Factory=0xa6B71E26C5e0845f74c812102Ca7114b6a896AB2
("old"* one) or0xC22834581EbC8527d974F8a1c97E1bEA4EF910BC
("new" one)L1
mastercopy/singleton=0xd9Db270c1B5E3Bd161E8c8503c55cEABeE709552
("old" one) or0x69f4D1788e39c87893C980c06EdF4b7f686e2938
("new" one)L2
mastercopy/singleton=0x3E5c63644E683549055b9Be8653de26E0B4CD36E
("old" one) or0xfb1bffC9d739B8D520DaF37dF666da4C687191EA
("new" one)
*during the 1.3.0 lifecycle the Safe team changed the Singleton Factory contract to overcome the compatibility of the "old" one on some networks, so the addresses might differ. Depending on whether the factory and mastercopy is "old" or "new", please use the respective factory for deployment.
If any of the above differs, please skip to the next section.
Don’t get too excited yet, but you might be in luck and your funds can be recovered. As of 1.3.0 of the Safe contracts, it is easier recreate Safes at the same addresses on different networks. It is important to note that they will have the same configuration (owners, threshold) that the Safe was created with. So if you rotated owners after the "original" Safe creation, the recreated Safe will have the "old" owners.
Another thing to keep in mind is that on some networks (e.g. zkSync Era) this strategy won't work.
Here's a guide detailing how to create a Safe with the same address on a different network - https://share.zight.com/z8uBKZYr. If you need further guidance, please reach out on our dedicated Safe Discord.
In some cases Safe deployment transactions can be relayed or batched with another transaction, so the contract being called is not always the proxy factory. Before replaying the transaction make sure you're calling a GnosisSafeProxy and the contract is verified. Otherwise the transaction will fail.
A Safe recreated on a sidechain or L2 network using an L1 factory (which would be the case when you're copying an Ethereum Safe), will be usable in the Safe UI but the indexing will be very slow, because L1 and L2 Safes use different singleton contracts. So the best strategy after deploying a copied Safe would be to transfer funds to an L2 Safe deployed normally, using the Safe{Wallet} UI. If the copied L2 Safe doesn't work in the UI for some reason, please use our command line interface.
Case 2: Custom 1.1.1 Safe on Binance Smart Chain (BSC).
This section only applies when
Your original Safe is on BSC.
mastercopy=0x2bb001433cf04c1f7d71e3c40fed66b2b563065e
If any of the above differs, please skip to the next section.
You created your Safe via an interface hosted by Binance, not Safe. Since it is hosted by Binance, we cannot provide any support since we haven’t verified any code changes that might have been made. Please reach out to Binance about potentially recovering your funds.
Case 3: Funds sent on Gnosis Chain to 1.0.0 or 1.1.1 Safe created with createProxy
This section only applies when
Your original Safe is on Mainnet.
Factory=0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B
(Proxy Factory 1.1.1)The factory method `createProxy` was called.
mastercopy=0xb6029ea3b2c51d09a50b53ca8012feeb05bda35a
(Mastercopy 1.0.0) ormastercopy=0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F
(Mastercopy 1.1.1)Someone sent funds to the address of your Safe on Gnosis Chain.
If any of the above differs, please skip to the next section.
The Safe 1.1.1 used for a while a factory setup where Safe addresses would not depend on the actual Safe setup but rather just on the number of Safes previously deployed via this factory. This has since been changed. However, we might be able to help you, please reach out to our dedicated Safe Discord,
Case 4: Funds sent to 1.0.0 or 1.1.1 Safe created with createProxyWithNonce
This section only applies when
Factory=0x76E2cFc1F5Fa8F6a5b3fC4c8F4788F0116861F9B
(Proxy Factory 1.1.1)The factory method
createProxyWithNonce
was called.mastercopy=0xb6029ea3b2c51d09a50b53ca8012feeb05bda35a
(Mastercopy 1.0.0) ormastercopy=0x34CfAC646f301356fAa8B21e94227e3583Fe3F5F
(Mastercopy 1.1.1)
If any of the above differs, please skip to the next section.
Your funds might be recoverable. However it takes technical knowledge with Ethereum, Solidity and web3 to do so. There are many rotating parts here and each case differs. Hence you need someone that knows what they are doing.
We currently don’t have a step by step guide for this due to other priorities, however the following outlines what you have to do to give this a try:
First, we need to make sure that the proxy factory exists on the network where the funds have accidentally been sent to. Make sure that factory and mastercopy exist on this network on the same addresses as the ones mentioned above. You can use our deployment replayer to create them.
The factory needs to have 100% the exact same bytecode on both networks. Please verify that. It is possible that some sidechains or L2 do not support specific opcodes which lead to a different generated bytecode. If the bytecode differs, asset recovery won’t be possible, unfortunately. If you don’t know how to compare the bytecode, you are probably not the right person for this task. Please get in touch with someone that has the required knowledge. In case recovery is theoretically possible, you do not want to mess up here.
Now you need to make the exact same call to the proxy factory in order to create a Safe with the same address. The executing account/address does not matter, however all input data needs to be 100% the same. If this succeeds, you now have created yourself a Safe on the same address on the other network and you can recover your funds by triggering a Safe transaction. The Safe will have the same configuration as the original Safe at the time of creation.
Please note: If your Safe uses a version prior to 1.3.0, transactions can be replayed cross-chain. Cross-chain replay protection was only introduced in 1.3.0. Again, if you don’t know what this means, please consider getting help from someone experienced with the technicalities as your funds might still be at risk even if you succeeded until this point.
Again, this description is very brief and quite technical. We are currently unable to provide hands-on support for this scenario. If you are in the process of trying this, feel free to reach out please reach out to our dedicated Safe Discord, with specific questions on what you are trying to achieve and where you are struggling.
Other cases:
This article currently does not cover any other cases. In case none of the above applies to you, please reach out to our dedicated Safe Discord, so we can investigate your case and potentially expand this article.
We sincerely hope that you are able to recover your funds.