Как извлечь знаковые дельты валют из BalanceDelta Uniswap v4

BalanceDelta упаковывает два знаковых 128-битных значения в одно 256-битное слово. Беззнаковое декодирование может превратить долг в одну единицу в огромный кредит.

Расширьте знак каждой половины отдельно

Верхние 128 бит соответствуют amount0, нижние — amount1. Декодируйте обе половины в дополнительном коде int128. В примере верхняя половина состоит из единичных битов и означает минус один.

amount0 = -1
amount1 = 5
packed = (uint128_bits(-1) << 128) | 5

Если расширить знак лишь верхней половины, отрицательный amount1 всё равно станет большим положительным числом. Добавьте тесты с отрицательной нижней частью, отрицательной верхней и нулём. Сверьте результат с amount0 и amount1 библиотеки.

Сохраните порядок валют и сторону учёта

Свяжите суммы с currency0 и currency1 того же PoolKey и укажите, чью дельту возвращает выбранный метод. Дельта отражает учёт; при взаимозачёте нескольких действий она не обязана совпадать с двумя прямыми переводами токенов. github.com BalanceDelta.sol