Как округлить отрицательный средний тик Uniswap v3 по OracleLibrary

Знаковое целочисленное деление Solidity округляет к нулю. В оракуле Uniswap предусмотрена поправка для отрицательной разности накопителей, не делящейся на интервал без остатка.

Вычислите разность двух наблюдений

На одном блоке вызовите observe для начала интервала и нуля секунд назад. Вычтите старый tick cumulative из нового и разделите на положительное окно. В примере язык с усечением сначала может дать минус десять.

tick cumulative change = -101
window = 10 seconds
floor(-101 / 10) = -11

При отрицательной разности с остатком вычтите единицу из усечённого результата и получите минус одиннадцать. Для минус ста за десять секунд останется минус десять. Поправка нужна лишь при соответствующем поведении используемого деления.

Проверьте наличие окна наблюдений

Пул может не хранить достаточно старое наблюдение. Отделите этот отказ от арифметической ошибки. Средний тик отражает усреднение по времени и не гарантирует цену конкретного обмена. github.com OracleLibrary.sol