Почему резерв Uniswap v2 расходится с балансом токена у пары

Пара хранит снимки резервов, а фактический баланс адреса пары ведёт контракт ERC-20. Прямой перевод может изменить баланс без обновления резерва.

Прочитайте резервы и балансы на одном блоке

Запросите у пары token0, token1 и getReserves. На той же высоте вызовите balanceOf для адреса пары у обоих токенов. В примере у token0 есть положительная разница в десять минимальных единиц.

getReserves().reserve0 = 1000
balanceOf(pair) token0 = 1010
excess                 =   10

Изучите переводы и события вокруг первого расхождения. В эталонной паре sync обновляет сохранённые резервы по балансам, а skim отправляет избыток получателю без предварительного увеличения резервов. По квитанциям восстановите фактическое действие.

Ведите отдельные ряды резерва и средств на адресе

Подмена истории резервов историей балансов превратит ещё не учтённое пожертвование в изменение резерва. Расхождение также возможно при ребейзе и нестандартном токене. До привязки разницы к обмену проверьте реализацию пары и учёт токена. github.com UniswapV2Pair.sol