а теперь подробнее
уязвимость начинается с того, что нам нужно отправить своп где мы просим обменять в пуле наш токен X на этот же токен X, на практике это абсолютно бессмысленно и в контракте пула даже есть проверка на это, но не там где надо
перейдём к виновнику торжества, функция
calc_y должна вычислить, сколько результирующих токенов останется в пуле, зайдя в эту функцию и посмотрим на начало мы увидим 5 проверок, которые могут бросить исключение из-за чего наш catch скажет что в пуле должно остаться 0 результирующего токена (а то есть - отдать всё что есть в пуле), то есть мы в опасной зоне и разработчики должны были проверить это заранее и самое интересно - это проверили, но не совсем.последние 4
throw_unless проверяют "а есть ли вообще обмениваемые токены в нашем пуле", но это проверяется заранее и исключения никогда не сработают, но только эти 4, а не все 5в итоге уязвимость: первая проверка смотрит "а не пытаемся ли мы обменять токен X на токен X" и конечно же бросает исключение, в итоге мы имеем
y = 0 и из нашего пула дрейнят все средства.самое смешное что эту проверку можно было выполнять заранее, как и другие 4 исключения (что и завезли с фиксом), но видимо забыли, а аудит и не заметил
самое главное что уязвимость обнаружили сейчас, потому что такое на самом деле можно было бы и провернуть абсолютно случайно, без намерений крякнуть проект