Getting a execution reverted: ERC20: transfer amount exceeds balance error

Expert

I'm trying to withdraw funds from the Aave pool using the WETHGateway (on Polygon), however I'm getting a execution reverted: ERC20: transfer amount exceeds balance error.

Here is my contract:

contract openDEFI {
  address private GATEWAY = 0xbEadf48d62aCC944a06EEaE0A9054A90E5A7dc97;
  address private LENDINGPOOL = 0x8dFf5E27EA6b7AC08EbFdf9eB090F32ee9a30fcf;
  address private WETH = 0x0d500B1d8E8eF31E21C99d1Db9A6444d3ADf1270;
  
  function deposit() public payable {
    IWETHGateway(GATEWAY).depositETH{value: msg.value}(LENDINGPOOL, msg.sender, 0);
  }

  function withdraw(uint256 amount) public payable {
    IAToken aWETH = IAToken(ILendingPool(LENDINGPOOL).getReserveData(address(WETH)).aTokenAddress);
    aWETH.approve(GATEWAY, amount);
    IWETHGateway(GATEWAY).withdrawETH(LENDINGPOOL, amount, msg.sender);
  }
}

Answers 2

I think its because atokens are held by msg.sender and you are trying to initiate withdraw from the contract.. You will need to transfer aTokens from sender to the contract.

The error message "execution reverted: ERC20: transfer amount exceeds balance" suggests that the account trying to withdraw the funds does not have sufficient balance in the Aave pool to complete the withdrawal.

There are a few things that you should check to troubleshoot this issue:

Verify that the account calling the withdraw function has enough balance in the Aave pool to cover the amount being withdrawn. You can check the balance of an account for a specific token using the getUserAccountData function of the LendingPool contract.

Make sure that the approve function call is executed before the withdrawETH function call, this allow to gateway contract to transfer the tokens.

Also check that you are passing the correct address for the WETH token, and that this token is supported by the LendingPool contract.

Verify that the LendingPool and Gateway contracts are deployed and active on the correct network and that you are interacting with the correct contract addresses

Check that the gas limit and gas price for the transaction are set high enough to complete the withdrawal.

If the error persists, you can try using a higher version of the contract and see if that resolves the issue.

It's worth mentioning that the above answer is based on the code you've provided, it's always a good idea to double check the documentation and the specific implementation of the platform you are working with.