The Open Dev Blog
908 subscribers
13 photos
1 video
65 links
Security audits: @TheOpenDevTeam

Contact: @rends_east, @therealmaloleg or @bazrov
Download Telegram
🔥 Про перпы, Storm trade, тяжелые времена.

Наверняка многие уже в курсе нового супер-скандала, где Storm trade ОБМАНУЛ и ЗАСКАМИЛ пользователя, написав в интерфейсе, что он в профите на десятки сотен процентов, а затем просто "закрыл позицию" без объяснения причин. Разбираемся, что произошло.

Что вчера случилось — на всех крупных рынках (в первую очередь CEX), вероятно, просто кончились лимитные заявки на покупку тона, именно поэтому "цена" на TON падала до 0.5$. Нужно понимать, что сама по себе без объёмов торгов эта цена мало что значит, вряд ли по ней было много спотовых сделок, однако как факт — маленький промежуток времени на рынке вполне можно было наблюдать практически пустой стакан.

Это означает две вещи:
⚫️ по такой цене нельзя было продать TON на большую сумму
⚫️ по такой цене нельзя было купить TON на большую сумму

После того, как MM проснулись, цена быстро ушла обратно ближе к 2$, и на момент написания поста уже вполне себе хорошо торгуется по цене около 2.2$.

Storm trade устроен иначе, не как CEX, — там нет стакана, нет в традиционном понимании лимитных заявок на покупку/продажу, там есть так называемый оракул (PYTH). В крайне упрощенном виде — это сервис, присылающий актуальные цены в блокчейн. На Storm trade в любой момент можно открыть любую позицию на любом рынке с любым плечом (главное, чтобы open interest позволил). Очевидно, что при такой гибкости требуются механизмы защиты протокола.

Когда вы открываете позицию, вы посылаете на смарт-контракт сообщение для создания ордера на открытие данной позиции. Это означает, что между нажатием вами кнопки в интерфейсе и открытием самой позиции есть довольно большой (по меркам волатильного рынка) временной промежуток. Если цена, по которой вы открывали позицию, и цена на момент обработки ордера сильно отличаются — позиция просто не откроется. По сути это slippage, как на любом DEX. Если внимательно изучить интерфейс Storm trade, то можно заметить, что пока открытие позиции обрабатывается — самой позиции ещё нету, а есть лишь ордер на её открытие, что вполне нормально и логично.

Slippage на perp DEX существует для того, чтобы потенциальный злоумышленник не мог указать случайную цену, заведомо отличающуюся от нынешней, и таким образом не мог открывать заведомо плюсовые сделки, выводя ликвидность из протокола. Такой баг мы находили у другого perp DEX на TON — Tradoor, и своевременно их предупредили, после чего баг был закрыт.

Поэтому никакого скама не произошло — ордер провисел 15 минут в блокчейне, а затем закрылся, т.к цена в нём не прошла проверку по slippage на индексере. Обидно, больно, неприятно, хочется топать ножками — но это так.

Важно понимать — perp DEX бывают разные. Например, в то время как Storm trade просто не открывал некоторые позиции из-за невероятной волатильности, аналогичные позиции на Drift protocol просто невозможно было открыть by design — в их orderbook стакане попросту не было заявок, торги прекратились на цене порядка 1.6$.

@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
62🔥24💯22👍1410💩9🙏6🤡4👎3🤮31🕊1
🔥 Транзакции на новом маркете не зависают в блокчейне. На кошельке, с которого должна быть операция, недостаточно средств.

Во всех сообщениях фигурирует ошибка 37, это "Not enough Toncoin". Блокчейн тут не при чем.

@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
😁21👍533
🔥 DAMM на @bidask

Мы релизнули DAMM пулы. Факты:
⚫️ Это как обычные пулы ликвидности (CPMM), но не совсем.
⚫️ Они умеют в dynamic fees. Если выберете такую опцию, то при высокой волатильности физы будут повышаться, при низкой — понижаться.
⚫️ В DAMM пуле можно выбрать ценовые границы. Тогда пул будет работать как бин из CLMM — торговаться от одной цены до другой. Пример тут. Концентрация без концентрации 😐
⚫️ Комиссии не реинвестятся в позицию, а клеймятся отдельно. Удобно для мемтокенов.

Мемтокены. У нас можно максимально просто запустить свой. Факты:
⚫️ Можно выбрать стартовую цену, начальная ликва в тонах для этого не нужна.
⚫️ Можно откупить по стартовой цене токены. Полученный TON пойдёт в пул.
⚫️ Начальная ликвидность блочится навсегда, вы с нее можете только забирать собранные комиссии. Полный рагпул технически невозможен, все смогут продать токены как минимум по цене чуть ниже стартовой.
⚫️ Можно выбрать время старта торгов токена.

Один из авторов канала запустил мем самого себя. Важно: никто ничего не обещает, не рекомендует, чистый фан. НИКАКИХ ПЛАНОВ НЕТ.

UPD: в данный момент торговать в DAMM пулах можно только на @bidask.

@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
11🔥1612👍101🕊1
🔥 Подписываемся и собираем воедино всё, что сегодня случилось.

Пескарь спустя года решил вспомнить про функционал подписок на TON, снял деньги у 400 кошельков, огрёб хейта, после чего возместил всё из своего кармана.

Что такое подписка? Это адрес контракта, который добавляется в storage вашего кошелька. После этого с данного адреса можно совершать действия от вашего wallet контракта (например, отправлять TON за ежемесячную подписку). Это безопасная архитектура, ведь такие плагины списывают средства раз в какой-то промежуток времени.

Что за баг он обнаружил? При отказе от подписки можно было удалить контракт плагина из блокчейна, но не удалить сам адрес подписки из кошелька. Это означало, что если кто-либо заново задеплоит в блокчейн контракт вашей подписки на тот же адрес, то он снова сможет списать с вас деньги. Проверьте свои подписки, энтузиасты уже выкатили тулзу.

Что за баг он проэксплуатировал? Никакой. Бага не было, он просто снял TON за активные подписки, то есть сделал то, что эти подписки должны были делать последние 2 года (но не делали).

Чему нам надо научиться? Репортить баги. Не допускать их невозможно, это нормальная часть разработки, но для здоровой атмосферы в комьюнити нужно соблюдать этику. В своё время мы подали всем хороший пример, как заметили в одной из приваток.

Пескарь красавчик.
@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1711🎃84💯1🦄1
Ton Core поучаствовала в 3-х апдейтах, которые начинаются или заканчиваются на букву C. Это:
Anonymous Poll
35%
USDC
54%
FunC
64%
tgBTC
59%
Cocoon
26%
СBidaskС
4%
Предположу в комментариях
🔥 Выводим депозиты.

Недавно мы провели аудит смарт-контрактов проекта webdom. Среди найденных багов один был наивысшего приоритета — Critical. Что мы нашли?

Для многих из видов контрактов (аукционы, продажи доменов, etc) webdom предусмотрели возможность закрытия сделки не только с помощью internal, но и через external сообщение. То есть любой желающий может обратиться на контракт по external интерфейсу и уведомить его, что все условия сделки выполнены, пора ее исполнять. Это крайне полезно, например, для аукционов, когда время аукциона может выйти, но без внешнего вызова смарт-контракт сам не сможет реализовать окончание сделки.

Что такое external сообщение? Когда вы делаете свап на @bidask, ваш wallet контракт посылает internal сообщение от себя к пулу ликвидности. Но сам wallet контракт вызывается external сообщением, которое вы подписываете в кошельке. Любая цепочка транзакций в TON вызвана сообщением, которое приходит извне блокчейна — оно и называется external.

Следующий закономерный вопрос — почему злой Пескарь не может послать на мой wallet контракт 100 миллиардов external сообщений, чтобы сжечь на газ блокчейна мой 1 миллиард TON? Для этого предусмотрена защита — у каждого external вызова есть бесплатные 10000 газа (это 0.004 TON). Этот газ может быть потрачен без списания с аккаунта. Он тратится, например, на проверку подписи wallet контрактом. Если подпись верна, то контракт вызывает инструкцию acceptExternalMessage. Даже если злой Пескарь будет слать на ваш кошелек сообщения, то все они не будут приниматься контрактом, пока у злого Пескаря не появится ваш приватный ключ.

С webdom всё интереснее. Аукцион может завершить кто угодно. Это означает, что контракт всегда принимает external сообщение. В таком случае очень важно, чтобы любое external сообщение обрабатывалось корректно после того, как вызовется acceptExternalMessage. Иначе можно будет послать сообщение с ошибкой, контракт его примет, потратит свой газ, а аукцион не закроется — и продолжать так можно до бесконечности.

Именно в этом и заключалась ошибка webdom. В контрактах аукционов сначала external сообщение принималось, а затем из сообщения считывался queryId — 64 бита информации. Это означало, что можно было составить сообщение с недостаточным количеством бит, и контракт бы падал с ошибкой 9 (Cell underflow), тратя при этом газ. Это крайне критично для, например, аукционов в TON, где сумма за домен хранилась на контракте продажи, и могла быть потрачена полностью на газ. Итогом была бы потеря домена и суммы, которую за него заплатили.

Баг был крайне оперативно исправлен.

В ближайшую субботу (08.11) один из авторов канала будет разбирать работу контрактов webdom в онлайн формате (там есть интересные нюансы) — вы сможете узнать что-то новое, спросить интересующие вас вопросы. Анонс в @toncishub будет чуть позже, мы приложим его к посту.

@TheOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
4🔥3312👍8😁31