Почему резерв Uniswap v2 расходится с балансом токена у пары
Пара хранит снимки резервов, а фактический баланс адреса пары ведёт контракт ERC-20. Прямой перевод может изменить баланс без обновления резерва.
Прочитайте резервы и балансы на одном блоке
Запросите у пары token0, token1 и getReserves. На той же высоте вызовите balanceOf для адреса пары у обоих токенов. В примере у token0 есть положительная разница в десять минимальных единиц.
getReserves().reserve0 = 1000
balanceOf(pair) token0 = 1010
excess = 10
Изучите переводы и события вокруг первого расхождения. В эталонной паре sync обновляет сохранённые резервы по балансам, а skim отправляет избыток получателю без предварительного увеличения резервов. По квитанциям восстановите фактическое действие.
Ведите отдельные ряды резерва и средств на адресе
Подмена истории резервов историей балансов превратит ещё не учтённое пожертвование в изменение резерва. Расхождение также возможно при ребейзе и нестандартном токене. До привязки разницы к обмену проверьте реализацию пары и учёт токена. github.com UniswapV2Pair.sol