Как разобрать CurrencyNotSettled в конце unlock Uniswap v4
Обмен v4 может выполниться внутри unlock callback, хотя вся транзакция позднее откатится. До завершения unlock менеджер требует погашения открытых дельт валют.
Восстановите дельты по аккаунту и валюте
Проследите все действия менеджера в обратном вызове. Отрицательная дельта вызывающей стороны означает долг менеджеру, положительная — доступный кредит. Учитывайте обе валюты вместо одной суммарной оценки роутера.
after swap: caller delta A = -100; caller delta B = +97
before unlock returns: both currency deltas must be zero
В примере нужно покрыть долг в 100 единицах A и использовать кредит 97 единиц B через предусмотренные операции расчёта или получения. Сам перевод ERC-20 ещё не обязательно обновляет учёт менеджера: проверьте порядок sync и settle.
Включите все вложенные операции
Несколько обменов и hooks могут взаимно погашать дельты в одном unlock. Изучите оставшиеся записи по аккаунту и валюте, учитывая различия нативной валюты и ERC-20. При откате unlock ни один из этих обменов не фиксируется. github.com PoolManager.sol