Как обработать переполнение времени в накопительной цене 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