Join GitHub today
GitHub is home to over 31 million developers working together to host and review code, manage projects, and build software together.Sign up
call variant with strict gas to ensure a specific amount is sent #1930
Currently the gas specified by the CALL opcode is not enforced but simply act as a maximum value. So if the the gas left in the current call is not enough to pass the gas specified, the receiver will get less than intended.
In some application, like meta transaction this can be a problem since in such case we want to be sure the call will receive exactly the amount specified and revert otherwise.
I thus propose to add a variant to CALL and other relevant call mechanism that will offer meta transaction the possibility to enforce such gas without relying on ad-hoc gas cost computation.
Here is the EIP specification and rationales copied from the EIP draft here : https://github.com/wighawag/EIPs/blob/call_strict_gas/EIPS/eip-1930.md
In other words, based on EIP-150, the current call must revert unless G >= I x 64/63 where G is gas left at the point of call (after deducing the cost of the call itself) and I is the gas specified.
So instead of
we would have
Currenlty the gas specified as part of these opcodes is simply a maximum value. And due to the behavior of EIP-150 it is possible for an external call to be given less gas than intended (less than the gas specified as part of the CALL) while the rest of the current call is given enough to continue and succeed. Indeed since with EIP-150, the external call is given at max
This is an issue for contracts that require external call to only fails if they would fails with enough gas. This requirement is present in smart contract wallet and meta transaction in general, where the one executing the transaction is not the signer of the execution data. Because in such case, the contract needs to ensure the call is executed exactly as the signing user intended.
While such requirement can be enforced by checking the gas left according to EIP-150 and the precise gas required before the call (see solution presented in that bug report : https://web.solidified.io/contract/5b4769b1e6c0d80014f3ea4e/bug/5c83d86ac2dd6600116381f9) or after the call (see the native meta transaction implementation here https://github.com/pixowl/thesandbox-contracts/blob/623f4d4ca10644dcee145bcbd9296579a1543d3d/src/Sand/erc20/ERC20MetaTxExtension.sol#L176), it would be much better if the EVM allowed us to strictly specify how much gas is to be given to the CALL so contract implementations do not need to follow EIP-150 behavior and the current gas pricing so closely.
This would also allow the behaviour of EIP-150 to be changed without having to affect contract that require this strict gas behaviour.
As mentioned, such strict gas behaviour is important for smart contract wallet and meta transaction in general.
While such issue can be prevented today by checking the gas with EIP-150 in mind, a solution at the opcode level is more elegant.
Indeed, the two possible ways to currently enforce that the correct amount of gas is sent are as follow :
where E is the gas required for the operation beteen the call to
This solution does not require to compute a
Similarly to the the previous solution, an EVM mechanism would be much better.