safe-global / safe-eth-py

Safe-eth-py includes a set of libraries to work with Ethereum and relevant Ethereum projects
https://safe-eth-py.readthedocs.io/en/latest/quickstart.html
MIT License
169 stars 181 forks source link

Gas limit when using multicall #254

Open Uxio0 opened 2 years ago

Uxio0 commented 2 years ago

Describe the bug multicall sometimes exceeds eth_call gas limit and an out of gas error is raised.

To Reproduce Do eth_call consuming the maximum gas allowed by the node. Library raises an exception. Example trace from the transaction-service:

2022-05-16 10:23:21,794 [WARNING] [MainProcess] https://safe-transaction.mainnet.gnosis.io/api/v1/safes/{address}/collectibles/ - Exception: NodeConnectionException - Data received {}
Traceback (most recent call last):
  File "/usr/local/lib/python3.10/site-packages/gnosis/eth/multicall.py", line 227, in _try_aggregate
    result = self.contract.functions.tryAggregate(
  File "/usr/local/lib/python3.10/site-packages/web3/contract.py", line 957, in call
    return call_contract_function(
  File "/usr/local/lib/python3.10/site-packages/web3/contract.py", line 1501, in call_contract_function
    return_data = web3.eth.call(
  File "/usr/local/lib/python3.10/site-packages/web3/module.py", line 57, in caller
    result = w3.manager.request_blocking(method_str,
  File "/usr/local/lib/python3.10/site-packages/web3/manager.py", line 198, in request_blocking
    return self.formatted_response(response,
  File "/usr/local/lib/python3.10/site-packages/web3/manager.py", line 171, in formatted_response
    raise ValueError(response["error"])
ValueError: {'code': -32015, 'message': 'VM execution error.', 'data': 'Out of gas'}

Expected behavior Reverts to use batch call

007vasy commented 2 years ago

@Uxio0 has a look at github.com/banteg/multicall.py if you want to fix it

Uxio0 commented 2 years ago

Sorry @007vasy , what exactly do we have to take a look at?

007vasy commented 2 years ago

you can set the maximum gas and also multicall.py does a backtrack and tries to do the multicall with less amount of calls

Uxio0 commented 2 years ago

Yeah, I mean, our biggest problem here is how to do it without impacting performance. Fallbacking to use less amount of calls after a failure is something we want to prevent

007vasy commented 2 years ago

my best guess is that some contracts are faulty and the functions are tagged incorrectly (a view function which is not tagged as view) therefore the node think it needs gas, but it does not (but that's just a guess)

Uxio0 commented 2 years ago

Well, it's not just gas. For example, Erigon has an evm timeout of 5 seconds and gas does not matter too much. Gladly, in the new Erigon versions it can be configured