SL
Size: a a a
SL
SS
SL
SL
pl
MV
RP
S
RP
S
S
RP
:
S
A
AB
AB
21000 + calldataCost + executionCost + constBurnCost + n * perTokenBurnCost = 2 * (24000 * n + otherRefunds)
perTokenBurnCost = 6148
otherRefunds
как правило невозможно посчитать, поэтому их игнорируемconstBurnCost
зависит от функции которая вызывается для сжигания токенов. free
например стоит 14895, а freeFromUpTo
стоит 25171.executionCost
можно поставить gasStart - gasleft()
как в этом модификаторе, а можно что-нибудь еще круче навернуть. Например если вы знаете сколько газа будет потрачено до того, как посчитается gasStart
, то можно этот газ тоже сюда приплюсовать.calldataCost
по-честному считается как 16 * кол-во ненулевых байт в колдате + 4 * кол-во нулевых байт в колдате. Считать ончейн по-честному дорого, поэтому можно прикинуть какое-то среднее число для вашего случая. Для 1inch например мы берем msg.data.length * 5, потому что у нас дофига нулей в колдате. Еще надо помнить, что колдату транзакции можно получить только в первой функции в стеке, поэтому имеет смысл вешать этот модификатор только на самые внешние функции.21000 + msg.data.length * (16 + 4) / 2 + gasStart - gasleft() + 25171 + n * 6148 = 48000 * n
n = (21000 + gasStart - gasleft() + msg.data.length * 10 + 25171) / 41852