So yeah you do have to use https://github.com/folia-app/eip-2929 implementation, but what to put in the access list ?

All addresses involved in the Tx + the Gnosis safe Singleton address (known at safe creation).

In my case:

  1. The address with which I am calling the SC method (owner)
  2. The Gnosis safe public address
  3. The Gnosis safe singleton address

As per the storageKeys I did put 0x0000000000000000000000000000000000000000000000000000000000000000 for 1. and 2. Not too sure why.

const tx = await contract.connect(signer).withdraw({
  gasLimit: 50_000,
  type: 1,
  accessList: [
      address: "0x0000_OWNER_ADDRESS",
      storageKeys: [
      address: "0x0000_SAFE_ADDRESS",
      storageKeys: [
      address: "0x0000_SAFE_SINGLETON_ADDRESS",
      storageKeys: [],

Note: Do not forget type: 1.

Uf. That was stressful.

Hope this helps !


I cannot withdraw from contract to gnosis safe because of Berlin upgrade EIP-2929.

In a nutshell it seems like contract to contract internal Tx cannot spend more that 2300 gas anymore.

Which is incompatible with Gnosis safe contracts: https://help.gnosis-safe.io/en/articles/5249851-why-can-t-i-transfer-eth-from-a-contract-into-a-safe

But as highlighted in article, there seem to be a way around this shortcoming using EIP-2930 access list.

I need help to implement a solution (ethers.js). I don’t know which addresses to “whitelist” and what are storage keys? Or even which node provider to use? Does Infura or Alchemix support EIP-2930? Etc.

Any help is much appreciated.

2 Answers 2


You can find an example with gnosis safe and ethers.js here: https://github.com/folia-app/eip-2929/blob/master/index.js

You need to include two items in the access list:

  1. Your Gnosis Safe proxy address with storage slot 0, where the address of the implementation contract is stored
  2. Gnosis Safe implementation contract address

(Sorry, not enough reputation to comment) Can someone please tell me the difference between the "safe address" and the "safe singleton address"?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.