SIP-26: Max Gas on token fallback
Author | |
---|---|
Discussions-To | https://discord.gg/3uJ5rAy |
Status | Implemented |
Created | 2019-10-29 |
Simple Summary
A bug was reported https://github.com/Synthetixio/synthetix/issues/243 which the position of emit would reduce the gas estimation of trading SNX via uniswap down from 900K to 100K
Motivation
Solidity passes 63/64 of gas in subcalls and it is burning all this on a failed subcall.
Specification
Move the emitTransfer to before the callTokenFallbackIfNeeded.
In ExternStateToken.sol
:
// Emit a standard ERC20 transfer event
emitTransfer(from, to, value);
// If the recipient is a contract, we need to call tokenFallback on it so they can do ERC223 // actions when receiving our tokens. Unlike the standard, however, we don't revert if the // recipient contract doesn't implement tokenFallback. callTokenFallbackIfNeeded(from, to, value, data);
Limit the gas to sub calls to either 200K or the amount of gas thats left if it is less than 200K
In TokenFallbackCaller.sol
:
uint gasLimit = gasleft() < MAX_GAS_SUB_CALL ? gasleft() : MAX_GAS_SUB_CALL;
recipient.call.gas(gasLimit)(abi.encodeWithSignature("tokenFallback(address,uint256,bytes)", sender, amount, data));
Implementation
https://github.com/Synthetixio/synthetix/blob/v2.12.2/contracts/ExternStateToken.sol#L134 https://github.com/Synthetixio/synthetix/blob/v2.12.2/contracts/TokenFallbackCaller.sol#L52
Copyright
Copyright and related rights waived via CC0.