The Open Dev Blog
737 subscribers
13 photos
1 video
49 links
Тон макаки.
Исследуем проекты на тоне так глубоко, как только можно.

Просим указывать нас как первоисточник.

Contact: @rends_east, @therealmaloleg or @bazrov
Download Telegram
Разработчики централизованных приложений (например, кликеров с последующим минтом токенов), работающих с блокчейном, всегда могут (и, по-моему, должны) снять с себя обязанность платить комиссию за админские действия, которые делаются для пользователя. Например, вывод средств или минт токенов, но при каком-то оффчейн условии.

Возникает вопрос - а как, например, сделать ончейн минт токенов при условии, что пользователь накликает 10к раз в оффчейн кликере?
Ответ прост. Пользователь сам может сообщать смарт-контрактам о выполненном условии, отправлять транзакции и выводить свои средства, исполняя при этом по сути админские функции.

Возникает второй вопрос - как помешать пользователю вывести все средства с контракта или сминтить себе весь саплай, если он исполняет обязанности админа и отправляет за него транзакции?
Для этого в Ton-е (и он в этом не одинок) существует механизм permit-а. Бэкенд приложения подписывает для пользователя сообщение, которое он отправляет в смарт-контракт (и выплачивает комиссию блокчейна). Пользователь не может изменить сообщение, поскольку оно подписано приватным ключом шифрования (грубо говоря, мнемоник фразой, как от вашего tonkeeper) на бэкенде. Нашей мнемоник фразы у пользователя нет, поэтому подписать другое сообщение за нас пользователь не может.

Это можно сравнить с банковскими чеками, которые использовались в 19-20 веках. Ваш друг брал свою чековую книжку и выписывал на ваше имя чек. Вы с этим чеком приходили в банк и получали деньги. Комиссией блокчейна в этой ситуации можно считать прогулку до банка).
В EVM блокчейнах по аналогии был даже придуман отдельный тип токена - ERC-2612. Что-то подобное хотел на досуге написать для Ton-а.
Бумажные чеки, конечно, было подделать очень легко. Permit-ы подделать с нынешними вычислительными мощностями фактически невозможно, поэтому можно быть спокойным.

Правда, в процессе внедрения подобного механизма в смарт-контракты можно накосячить примерно 350 раз. Но об этом расскажу из личного опыта как-нибудь в другой раз)
Нам стоит написать, если:

⚫️ Вам нужна разработка ончейн или частично ончейн решения для вашего продукта. Например, необычного токена с бэкендом, отвечающим за это.

⚫️ Вы хотите получить консультацию/аудит по проектировке или безопасности вашей архитектуры/готового решения.

⚫️ Вы админ канала/медиа и хотите получить комментарий, разбор по интересующей вас теме, связанной с глубоким пониманием работы блокчейна Ton или проектов на нём.

По всем этим вопросам можно написать контактам в био канала.
Please open Telegram to view this post
VIEW IN TELEGRAM
The Open Dev Blog pinned «Нам стоит написать, если: ⚫️ Вам нужна разработка ончейн или частично ончейн решения для вашего продукта. Например, необычного токена с бэкендом, отвечающим за это. ⚫️ Вы хотите получить консультацию/аудит по проектировке или безопасности вашей архитектуры/готового…»
Сегодня-завтра будет пост про недавно найденный баг у крупных проектов на Ton. В будущем вам будет интересна тема безопасности в нашем блокчейне?
Anonymous Poll
98%
Да
2%
Нет
Уязвимость в коллаборации EVAA и coffee swap

На позапрошлой неделе EVAA запустили у себя в приложении возможность свапа токенов на базе dex агрегатора coffee swap. По сути это просто другой интерфейс для swap.coffee, однако в рамках коллаборации за каждый свапнутый доллар пользователю начисляются EVAA XP и токены кофисвапа $CES (но не более чем какое-то количество на одного пользователя в сутки).

Сам по себе фарм XP и $CES на легитимных свапах большого смысла не имеет, поскольку на комиссии блокчейна\комиссии ston fi\dedust уходило скорее всего бы больше токенов при свапах, чем сколько можно было бы получить $CES (ну а с EVAA XP вообще сложно было бы просчитать экономическую целесообразность).

Однако присутствовала небольшая простая уловка, благодаря которой можно было бы спокойно получать по 10$ и 25к XP в день на адрес без больших затрат. Схема заключается в том что можно было спокойно создать собственные 2 токена, залить для обоих из них совершенно небольшую ликвидность к, например, тону, также затем залить ликвидность между двумя этими токенами. Таким образом, когда мы попытались бы обменять эти токены друг к другу, то бэкенд кофисвапа оценивал цены обоих токенов по той небольшой ликвидности, которую бы мы залили к тону, а вот саму возможность свапать токены друг на друга осуществлял бы пул ликвидности между двумя токенами, благодаря чему их цена бы по сути не менялась в долларовом эквиваленте.

Информация была передана команде EVAA (и также команде swap.coffee через них). Бага была исправлена уже почти неделю назад, спасибо им за оперативность🫡.
Сколько заработал Dedust на бустах пулов?

Немногие знают, но dedust берёт комиссию в 0.5% от буста своих пулов (от тех, которые идут не от TON Foundation). То есть все средства, которые можно нафармить предоставляя ликвидность в пулы изначально облагаются налогом в 0.5% и идут напрямую на кошелёк, контролируемый командой dedust.

Суммарно dedust заработал только на этих комиссиях приблизительно 91.000$ по нынешнему курсу токенов (на самом деле чуть меньше из-за того что часть этих токенов сами по себе малоликвидны). Это означает что суммарные бусты пулов от пользователей составляют около 18м$.

Основную часть составляют бусты в токенах Hydra (наверняка вы видели реварды в них во многих пулах ликвидности), а также из крупных SCALE (токен самого dedust), TOM (малоликвидный токен), JETTON (планово хотят раздать на бусты где-то 10% от всего саплая токена)

Также из интересного - dedust не разрешает пользователям бустить пулы при помощи TON, USDT. А токены, которыми можно это делать находятся в вайтлисте.
Упавшая транзакция (то есть failed) еще не означает, что изменения в память контракта не были внесены.

Мы все привыкли, что если контракт упал при исполнении, то нам возвращается или не возвращается bounce, и никакие изменения, касающиеся этого контракта, кроме баланса контракта и упавшего сообщения, в блокчейн не вносятся.

Это не так. В FunC есть великолепная функция commit(), которая позволяет сохранить состояние в блокчейне, даже если после вызова этой функции контракт упал. Это помогает в сложных структурах контрактов, когда, например, нужно вернуть деньги пользователю с контракта, который напрямую с пользователем не взаимодействует (и поэтому bounce не сработает).

А еще так можно скамить) Прикрываться упавшей транзакцией, делая вид, что, например, не получилось сменить админа токена. Не ведитесь на уверения, что "так быть не может" (на EVM блокчейнах так действительно не может быть).

Для примера написал простенький контракт. Вот так он работает - транзакция упала, но он все равно отправил аж 3 сообщения на другие адреса, и ни одно из них не bounce.
Как зайти в Storm Trade от имени любого пользователя?

Когда вы заходите на шторм трейд, для каждого пользователя должен отрисоваться интерфейс со всеми актуальными трейдами, ликвидностью в пулах, RP, ачивками и тд.

Так как у шторм трейда нет никакой авторизации помимо ton connect (обычного подключения кошелька), то абсолютно любой может посмотреть интерфейс и всю актуальную информацию (включая, например выставленные стоп лоссы, тейк профиты, цены ликвидаций позиций) абсолютно любого другого пользователя. Сделать это достаточно просто:

1. Подключаете свой кошелёк в браузере
2. Находите адрес кошелька пользователя, от имени кого вы хотели бы посмотреть интерфейс шторм трейда
3. Открываете Developer Tools (F12\command+option+I) и вписываете в консоли window.tonConnect.connector.account.address = ‘нужный вам адрес’

В целом это может быть полезно для снайпинга залива ликвидности - чтобы, например, подгадывать моменты, когда вот-вот должно ликвидировать очень крупную позицию и вся его margin пойдёт в vault для поставщиков ликвидности (ну или наоборот чтобы выводить ликвидность когда удачного трейдера вот-вот сработает take profit на большую позицию)

Адреса трейдеров можно смотреть по транзакциям на волты с опкодом 0xe0db7753:

TON Vault - https://tonviewer.com/EQDpJnZP89Jyxz3euDaXXFUhwCWtaOeRmiUJTi3jGYgF8fnj
USDT Vault - https://tonviewer.com/EQAz6ehNfL7_8NI7OVh1Qg46HsuC4kFpK-icfqK9J3Frd6CJ
NOT Vault - https://tonviewer.com/EQAG8_BzwlWkmqb9zImr9RJjjgZZCLMOQXP9PR0B1PYHvfSS

Либо также как вариант: в tonviewer можно смотреть на самых крупных держателей SLP токенов, чтобы увидеть кто сколько из китов заработал на предоставлении ликвидности

На самом деле тут большой простор для реализации снайпер бота, который будет подсказывать когда лучше заводить и выводить ликвидность - но необходимо полностью учитывать математику всех видов комиссий шторм трейда при самостоятельной индексации этих контрактов, либо же полагаться на api шторм трейда, что, конечно, не так надёжно, зато проще.
Хотите разбор работы нового стандарта - mintless жеттона?
Anonymous Poll
94%
Да
6%
Нет
Пост про новый стандарт в TON готовится, а пока завезли для вас разбор интересного способа скама, которым с нами поделился наш подписчик.

Суть проста - кнопка "отправьте нам весь ваш баланс, получите 500к, 1кк, 1ккк долларов, сколько захотите". И действительно - пользователь нажимает кнопку и видит эмуляцию транзакции как на скрине - он отправляет N ton, а получает несметные богатства.

На удивление это очень продвинутый способ скама, для которого нужно подкорректировать смарт-контракт jetton-wallet. Нужно внести два изменения: сделать так, чтобы любой юзер мог пользоваться любым кошельком жетона, и чтобы при отправке жетонов они не вычитались из баланса. (для всего этого нужно удалить 3 строчки в коде контракта jetton-wallet)
Пользователь отправляет деньги на адрес чужого(!) кошелька с жетонами с указанием отправить себе 500к токенов (сколько угодно, зависит лишь от жадности). Кошелек жетонов отрабатывает согласно новому коду - не проверяет, кто прислал транзакцию, и послушно "пересылает" 500к жетонов отправителю. Коды операции совпадают с пересылкой жетонов, и обозреватели блокчейна отображают это как обычный трансфер. Все это становится возможным, т.к мы ранее поменяли смарт-контракт, и он больше не проверяет, есть ли у него на балансе нужная сумма.

Но почему же tonkeeper определяет этот токен как USDT, и даже подписывает цену токена? Тут всё просто - при деплое кошелька жетонов мы указали jetton_master оригинального USDT, и поэтому обозреватели блокчейна определяют его как настоящий доллар.

Написал и опубликовал пример кода, с которого был сделан скриншот. Для того, чтобы им скамить, нужно вносить дополнительные правки, поэтому никому я этим жизнь не упрощаю.
!!! Осторожно, не пользуйтесь этим кодом, если не разбираетесь в его работе досконально, вы можете безвозвратно потерять свои деньги !!!

Это не единственный способ скамить таким образом, я лишь продемонстрировал самый простой вариант. Всегда проверяйте адрес сайта, на котором вы находитесь, и не доверяйте вслепую тому, что вам рисуется на экране.

@theOpenDevBlog
The Open Dev Blog
Упавшая транзакция (то есть failed) еще не означает, что изменения в память контракта не были внесены. Мы все привыкли, что если контракт упал при исполнении, то нам возвращается или не возвращается bounce, и никакие изменения, касающиеся этого контракта…
Как узнать, что смарт-контракт внёс какие-то изменения в блокчейн, даже если он упал при исполнении?

Всё просто - в tonviewer можно посмотреть так называемую action фазу. Если ее нет, или она "skipped", то контракт никаких изменений не вносил.
Например, как тут. (нужно нажать на кружочек с восклицательным знаком и посмотреть на информацию внизу 😬) Как видите, compute фаза есть, а справа от нее пусто.

А вот в случае с моим контрактом, несмотря на ошибки при исполнении кода, action фаза отображается. При этом можно заметить, что "total actions" указано как 3, то есть за каждое исходящее сообщение было совершено одно действие (action). Таким образом, смарт-контракт в свои данные никаких изменений не вносил, только отправил 3 сообщения.
Если "total actions" больше, чем число исходящих сообщений, то смарт-контракт внёс изменения в свои ончейн данные.

@theOpenDevBlog
Сколько Aqua Protocol заработал с минта Nomis Score NFT?

В июле этого года к окончанию фарминга в боте Aqua Protocol был приурочен минт Nomis Score - NFT, показывающий "рейтинг" вашего кошелька. Разумеется, это была рефералка - минт одной NFT стоил 1.1 TON, часть средств уходило создателям проекта, а часть - человеку, который привёл аудиторию, то есть на кошелёк julia-innovator.ton.

Экономика такая: для обычного юзера награда за реферала 0.1 TON, но для julia-innovator.ton наградой было 50% от общей прибыли протокола (примерно 0.5 TON).

Реализовано все это в духе нашего поста про подписи. Пользователь получает параметр signature, который передается в транзакции от его кошелька, и который не позволяет подделать данные в сообщении.

На удивление, Aqua заработал с этой активности всего 774 тона, приведя при этом 1586 пользователей. Эти данные только из смарт-контрактов Nomis, платили ли они дополнительно - неизвестно.
Сами же основатели Nomis заработали 21488 TON, судя по данным блокчейна. По нынешнему курсу это порядка 122к$.
Данные взяты из re::doubt.

Friendly remainder - ничего, разумеется, криминального в рефералке нет, но это нигде не афишировалось, и я очень удивился, когда это увидел.
С постом про стандарт я немного запоздал, т.к хотелось максимально подробно всё рассказать. Но чем больше углублялся, тем больше понимал, что адекватно это в пост не впихнёшь, поэтому напишем обзорную часть.

Недавний релиз мемкоина $DOGS снова подсветил проблему с архитектурой централизованного минта жетонов при аирдропах. Если число юзеров достаточно большое, то объективно никаких мощностей любого блокчейна просто физически не может хватить, если при минте жеттонов участвует один адрес - jetton-master.

Для решения такой проблемы недавно появился новый стандарт жетона на TON - mintless jetton (вот код). Как он работает: минт токенов больше не происходит через jetton-master, а он получается каждым участником аирдропа через его собственный jetton-wallet.

Реализовано это через механизм дерева Меркла (я советую прочитать это, если вы не знаете, что это такое). Механика работы следующая - каждый jetton-wallet хранит у себя переменную mercle_root, то есть хэш, находящийся на верхушке дерева. При получении аирдропа пользователь должен предъявить свой mercle_proof, то есть некоторое криптографическое доказательство, что пользователь в аирдропе участвует. При этом никакой централизованной системы не участвует, каждый jetton-wallet обладает всей полнотой информации, чтобы подтвердить право пользователя на аирдроп. Важно понимать - разумеется, вы ничего подобного при обычном получении аирдропа не увидите, поскольку логика работы, конечно же, будет и должна находиться под капотом приложения, которое отвечает за аирдроп.

Таким образом, при получении своих токенов с точки зрения блокчейна вы будете обращаться не к jetton-master-у, как обычно, а к своему jetton-wallet-у. Его код никак не подменить, несмотря на то, что он "типа ваш". Разумеется, обычный минт тоже присутствует, и ничего не ограничивает владельца токена в обход аирдропа сминтить себе дополнительные токены.

Надо признать, что этот стандарт является по настоящему новым словом в децентрализации. Несмотря на весь fud в сторону TON, в действительности такой пользовательской базы, какая есть у тех же $DOGS, нет больше нигде. И в условном эфире при похожей нагрузке на блокчейн комиссии за обычные транзакции бы подскочили до сотен долларов, как это было, например, во время халвинга биткоина.
Скоро будет пост о крутой найденной уязвимости в одном из протоколов на Тоне, а также о том, что не всегда стоит воспринимать факт проведённого аудита слишком серьёзно😐
Please open Telegram to view this post
VIEW IN TELEGRAM
Критическая уязвимость в Tradoor.io

Не все знают, но в TON-е существует прямой конкурент Storm trade, на котором можно также торговать perpetuals на различные криптовалюты.
И интересной отличительной чертой является возможность торговать опционами, причём очень короткими, начиная с 5-минутных.

Суть торговли опционами заключается в том, что они потенциально могут дать вам большее плечо, чем обычные perpetuals, а также твоя позиция не будет ликвидирована до конца истечения опциона. Однако есть минусы, заключающиеся в том, что, закрыв опцион по той же цене, что ты его и покупал, ты потеряешь все деньги, то есть цена актива должна изменится на стоимость опциона для того, чтобы хотя бы окупить траты.

Не буду вдаваться в подробности, как именно должна рассчитываться справедливая стоимость опционов различной длительности (вкратце, чем выше волатильность, тем дороже в моменте должен быть опцион), так в чём же заключается уязвимость?

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

Пример - на скриншоте я купил PUT опцион на 5 минут с плечом ~43,000х. Но открыть опцион, очевидно, можно было на любой срок и абсолютно любым плечом. Суть в том, что открыв CALL и PUT опцион с огромным плечом одновременно, пользователь мог получить буквально бесплатные деньги, поскольку для выхода позиции в огроменный плюс было достаточно абсолютно любого минимального изменения цены в любую сторону.

Это означает возможность вывода ВСЕЙ ликвидности из волта опционов, совершив всего две сделки за 20$!

Я сразу попробовал связаться с командой через их бота поддержки, написал им про существующую уязвимость, и хоть ответа я так и не получил - буквально спустя пару часов они отключили индексер, а на следующее утро уязвимость уже была исправлена, теперь при попытке покупки опциона по произвольной цене вам просто вернутся ваши USDT. Конечно жаль, что команда не захотела отвечать на мой репорт, но исправили очень оперативно, за что ребятам респект. Если у кого-то есть контакты фаундеров, скиньте в лс, а то сам я не нашёл ничего кроме их чата, где не хочется наводить fud.

А эти заработанные 90$ в сделке при помощи бага я уже слил обратно, тестируя их протокол дальше ☹️

@theOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
The Open Dev Blog
Критическая уязвимость в Tradoor.io Не все знают, но в TON-е существует прямой конкурент Storm trade, на котором можно также торговать perpetuals на различные криптовалюты. И интересной отличительной чертой является возможность торговать опционами, причём…
Про аудит: у них на лендинге можно найти проведённый в мае этого года аудит от tonbit.

И вроде бы всё прекрасно - проаудировали какие-то контракты, нашли какие-то уязвимости, команда их всех успешно исправила. Однако заметьте, насколько бы подробно вы не пытались прочитать и вникнуть в этот отчёт, у вас не получится этого сделать:
⚫️ На исходный год на гитхабе доступа нет.
⚫️ Из описания найденных уязвимостей имеются только краткие названия, которые мало о чём говорят.
⚫️По названиям файлов, которые были предоставлены для аудита даже не поймёшь, какой именно функционал проверялся.
⚫️ Проверялся ли сам бэкенд\индексер? Видимо нет.

Это не к тому, что tonbit плохо проводит аудиты, или tradoor специально кого-то обманывает. Очевидно, что за прошедшие 4 месяца они успели дописать много функционала, в том числе, возможно, и опционы, которые они вряд ли успели должным образом проверить.
Однако на первый взгляд кажется, что раз аудит есть, то всё должно быть супер. Всегда проводите dyor всего сами, в том числе и проверяйте публично доступные аудиты!

А если вам нужна консультация по вашим проектам в тоне, то можете писать нам 🙂

@theOpenDevBlog
Please open Telegram to view this post
VIEW IN TELEGRAM
В преддверии большого поста про шардинг важный совет ончейн проектам на TON-е.

С недавних пор шардинг в TON-е наконец то заработал! Это означает, что если на какой-то из шардов блокчейна (частей, на которые делится блокчейн) ложится нагрузка, которую он неспособен обработать, то ложится исключительно этот шард. Раньше, как все мы помним, ложился весь блокчейн.

Это означает, что теперь просто банально невыгодно находиться в одном шарде с, например, роутером ston.fi, поскольку их архитектура смарт-контрактов подразумевает, что каждый пользователь их платформы отправляет сообщение на этот адрес. Поэтому при больших нагрузках именно шард со ston.fi потенциально будет ложиться.

Крупным (и не только) проектам надо об этом задумываться и калькулировать адреса своих контрактов так, чтобы точно в один шард с потенциально высоконагруженными адресами не попадать. Это несложно - аккаунты распределяются по шардам в зависимости от первых бит адреса. На скрине это правый столбец - маска адреса в шарде. Эту информацию можно посмотреть тут.
Завтра выходят хомяки. Ваши ставки. Тон завтра...
Anonymous Poll
42%
Упадет
31%
Не упадёт
27%
С трудом не упадет
Опрос был плохо сформулирован. Блокчейн завтра....
Anonymous Poll
44%
Упадет
25%
Не упадет
31%
С трудом не упадет