Как извлечь знаковые дельты валют из 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