Как сверить контрольную точку комиссий позиции ядра Uniswap v3
Позиция пула хранит контрольное значение роста комиссий и уже причитающиеся суммы. Collect может перевести ранее записанное без пересчёта всех новых комиссий с прошлого обновления.
Рассчитайте, что зафиксировало бы обновление
Для выбранного токена получите рост комиссий внутри диапазона на целевом блоке. Вычтите feeGrowthInsideLastX128 с правилами беззнакового переполнения реализации, умножьте разницу на ликвидность до изменения и разделите на 2^128.
liquidity = 100
feeGrowthInside change = 2^128 / 4
new tokens owed = floor(100 / 4) = 25
В примере к причитающемуся добавляется 25 минимальных единиц. Burn с нулевым количеством для существующей позиции с ликвидностью может обновить учёт без снятия ликвидности. Различайте этот шаг и последующий перевод collect.
Не называйте все причитающиеся суммы комиссиями
После удаления ликвидности к причитающемуся может добавиться основная сумма позиции. Для классификации перевода учитывайте вместе burn, обновление позиции и collect. У позиций под управлением NFT есть дополнительный слой учёта. github.com Position.sol