Как обработать переполнение времени в накопительной цене Uniswap v2
Эталонная пара v2 намеренно сокращает время до 32 бит. При обычном вычитании со знаком можно увидеть отрицательный интервал, хотя прошло три секунды.
Считайте интервал в разрядности пары
Прочитайте накопители и метки одной пары в двух наблюдениях. Возьмите разность времени по модулю 2^32. В примере счётчик проходит 4294967295 и ноль, прежде чем дойти до единицы.
previous uint32 timestamp = 4294967294
current uint32 timestamp = 1
elapsed modulo 2^32 = 3 seconds
Разность накопителей также учитывает беззнаковое переполнение. Разделите её на ненулевой интервал, декодируйте масштаб UQ112x112 и различайте направления price0 и обратной цены.
Уточните момент действительного обновления
При обновлении пара накапливает прежнее соотношение резервов; чтение на произвольном блоке может вернуть время последнего обновления. Для продолжения накопителя до момента наблюдения явно учтите секунды и ненулевые резервы. По одним усечённым меткам нельзя восстановить интервал с несколькими полными оборотами. github.com UniswapV2Pair.sol