Для ЛЛ: Нужно внимательно смотреть на что нажимаешь при онлайн переводах, особенно в крипте. Курс обмена 3CRV -> USDT изменился до перевода, но пользователь всё равно продолжил перевод
Наткнулся на интересную новость на реддите, может быть кто нибудь шарит и распишет как именно это произошло, а пока краткий перевод-пересказ хронологии события и того что известно на 11 марта из нескольких источников (1, 2, 3):
1.Неизвестный криптоинвестор решил обменять около 2,031,707 LP токенов 3CRV на USDT через агрегатор KyberSwap
Это была его первая ошибка, так как LP токен 3CRV (который дают за пополнение пула 3pool Curve) можно вывести напрямую в любой из трёх стейблкойнов.
Упрощенный пример: я отнёс в банк слиток золота, а банк дал мне 100 бумажек с печатью банка, эти 100 бумажек теперь можно обменять на то что в банк принесли другие люди (например серебро, алмазы) по соответствующему курсу, таким образом в пределах банка комиссия будет минимальной, а курс максимально выгодным. Если бы он менял монеты внутри пула (через Curve), то получил бы около 1,952,682 USDT. Но есть внешние обменники где курс может любым, именно через такой обменник и прошел перевод героя этой истории
2.Он заходит в интерфейс KyberSwap, выбирает обмен 3CRV -> USDT и вводит количество обмениваемых токенов: 2,031,707 в этот момент показывается "предварительный расчёт" с нормальным курсом, но расчёт комиссии и точного курса начинается только после нажатия кнопки. После того как юзер согласился на обмен, расчёт комиссии не удаётся просчитать для всех "больших" обменников (как пишут KyberSwap - из-за высокой на тот момент волатильности)
Расчёт оказывается успешным только для 1 обменника UniswapV2 с адресом 0x7d36fbd3, интерфейс обновляется показывая расчитанный курс и комиссию, юзер видит всплывающее окно с суммой которую он получит (0,05 USDT) и повторно запускает перевод.
KyberSwap воспроизвели похожую ситуацию и записали видео того как это выглядело:
На этом историю можно закончить, но мне захотелось подробнее узнать как именно $2,080,468 превратились в 0,05. Для этого нужно понять как работает uniswap. В отличии от традиционных обменников где курс обмена сравнительно постоянен и не сильно меняется от обьёма (купите вы 1 доллар или 1000), в uniswap курс зависит от обьёмов купли\продажи и от того сколько какой позиции есть в данный момент в обменнике и считается по формуле:
x * y = k
где x - первая валюта, y - вторая валюта, а k - общая ликвидность пула. Самое важное что следует помнить: уравнение должно оставаться верным после каждого обмена.
Рассмотрим несколько обменов на примере uniswap обменника у которого есть 100 3CRV и 100 USDT, а общий пул ликвидности 100 * 100 = 10,000:
Пример1. Я хочу обменять 10 токенов 3CRV на USDT. Монетки поступают в обменнике и теперь он думает сколько USDT должно у него остаться чтобы уравнение оставалось верным:
Минусуем из того что есть сейчас: 100 - 90.9 = 9.1
Именно столько я получу за 10 3CRV, почти 1 к 1, выглядит не так плохо, рассмотрим ещё один пример:
Пример2. Предположим я хочу обменять ещё 80 3CRV на USDT:
В пуле должно остаться 52, значит я получу около 38 USDT за 80 3CRV
Теперь курс стал не таким выгодным, 2к1 не в мою пользу. Уже поняли как всё произошло в первоначальной новости?)
Если я отправлю в этот обменник 2,000,000 3CRV то курс уже будет 0.000026 USDT за 1 3CRV
Всё ради того чтобы уравнение оставалось верным:
И я получу почти все запасы USDT которые есть в нём есть, а это целых 52 USDT! Но полностью опустошить запасы USDT в обменнике не получится, нужная сумма будет стремиться к бесконечности.
Но это с нашим обменником у которого 10000 "ликвидности", как стало известно позже ликвидность обменника в посте равнялась только 2$ и этот обменник бездействовал последние 251 день, была ли это заранее подготовленная ловушка "на лоха"?
Сейчас в твиттере идут споры на тему того, кто в этом виноват и должны ли KyberSwap компенсировать потери невнимательного пользователя