21.09.2026 несколько кошельков провело мини-операцию с вызовом публичной функции намайнил токенов из воздуха - без флеш-лоана, без мам, без пап, просто на дисциплине
The Internet Token(INT) имеет контракт под название LiquidityUnifier у которого есть роль минтера - то есть он минтит токены и сливает их + функция swapV3(token, pool) публичная. То есть, хакер может "подсунуть" свой неверифицированный контракт под видом пула, а в проверке token0()/token1() хакерский контракт просто заявляет, что он официальный и спокойно проходит верифу. Дальше swapV3 дергает swap() у нашего зараженого контракта, который в свою очередь ре ентрит колбэк uniswapV3SwapCallback, а в колбэке контракт‑жертва послушно минтит ровно столько INT, сколько ей в этом колбэке назвали. Почему так? — Да потому что так устроен своп в Uniswap V3: пул сам сообщает, сколько ему причитается, а контракт просто верит на слово.
Ещё есть проблемка, на функции, которая используется висит проверка: «общий supply не должен вырасти за вызов», но наш выпускник MIT просто берет и обходит её через ещё одну публичную функцию — Convertor, который 1:1 гоняет INT в вспомогательный токен и обратно. Внутри вызова сминтил INT → тут же конвертнул его в тот токен (INT сгорел, supply как будто в норме, проверка пройдена), а как только swapV3 завершилась — спокойно конвертнул обратно.
Жалко что в пуле INT/WETH было всего 5.85 WETH, на этом все потери проекта закончились, но как кейс пойдет.
blocksec EOA contract
The Internet Token(INT) имеет контракт под название LiquidityUnifier у которого есть роль минтера - то есть он минтит токены и сливает их + функция swapV3(token, pool) публичная. То есть, хакер может "подсунуть" свой неверифицированный контракт под видом пула, а в проверке token0()/token1() хакерский контракт просто заявляет, что он официальный и спокойно проходит верифу. Дальше swapV3 дергает swap() у нашего зараженого контракта, который в свою очередь ре ентрит колбэк uniswapV3SwapCallback, а в колбэке контракт‑жертва послушно минтит ровно столько INT, сколько ей в этом колбэке назвали. Почему так? — Да потому что так устроен своп в Uniswap V3: пул сам сообщает, сколько ему причитается, а контракт просто верит на слово.
Ещё есть проблемка, на функции, которая используется висит проверка: «общий supply не должен вырасти за вызов», но наш выпускник MIT просто берет и обходит её через ещё одну публичную функцию — Convertor, который 1:1 гоняет INT в вспомогательный токен и обратно. Внутри вызова сминтил INT → тут же конвертнул его в тот токен (INT сгорел, supply как будто в норме, проверка пройдена), а как только swapV3 завершилась — спокойно конвертнул обратно.
Жалко что в пуле INT/WETH было всего 5.85 WETH, на этом все потери проекта закончились, но как кейс пойдет.
blocksec EOA contract