Роботи / Крипторобота на відкритий бриф

StopCheck: аудит перп-біржі dreamDEX і інструмент проти знайденої пастки зі стоп-лосом

Що було

Трейдер ставить стоп-лос «на всю позицію», докуповує, і застосунок далі пише «Entire». Коли ціна доходить до стопа, закривається тільки старий розмір, решта лишається без захисту. Оцінка збитку у вікні теж рахується на старий розмір, тому помітити пастку майже неможливо.

Що зробили

За день пройшли біржу від застосунку до контрактів: SDK, бот-кіт, документація. Кожну знахідку оформили як відтворюваний звіт з хешами транзакцій, а перед оформленням звірили з 447 чужими звітами, щоб не дублювати. Під головну знахідку зробили StopCheck: статична сторінка читає мережу і показує, скільки позиції реально прикрито стопом, а бот закриває непокритий залишок.

Що отримав клієнт

21 звіт, публічний репозиторій і живе демо з хешами: стоп закрив половину позиції о 19:34:35, бот другу половину о 19:34:38. Скан 463 акаунтів біржі знайшов 19 трейдерів з частково прикритою позицією, від 6 % до 99,6 %, і 129 зі стопами без позиції. Інфраструктура коштувала 0 $.

ЗамовникdreamDEX, перп-біржа на Somnia. Відкритий бриф на DoraHacks
Моя рольТестування біржі, 21 звіт з хешами транзакцій, код перевірки і бота, сторінка, ролик, тексти постів
СтатусІнструмент працює, звіти надіслано команді біржі, підсумки брифу ще попереду
Результат19 із 463 акаунтів біржі з частково прикритою позицією, від 6 % до 99,6 %, знайшов скан · Відкрити
Відхилено: покриття 99,6 % округлялося до «100 %» поруч із фразою «решта без стопа», і картка суперечила сама собі. Реконструкція, не скриншот
Відхилено: покриття 99,6 % округлялося до «100 %» поруч із фразою «решта без стопа», і картка суперечила сама собі. Реконструкція, не скриншот
Прийнято: часткове покриття не округлюється вгору. Цифра, список проблем і смуги по кожній позиції кажуть одне й те саме
Прийнято: часткове покриття не округлюється вгору. Цифра, список проблем і смуги по кожній позиції кажуть одне й те саме

Завдання

dreamDEX, перп-біржа в мережі Somnia, відкрила бриф на два треки: звіти про знайдені проблеми з оплатою за кожен прийнятий і MVP, корисний інструмент поверх біржі. Для нас це заробіток плюс кейс аудиту DeFi-продукту: таку послугу можна продавати іншим біржам.

Коли ми зайшли, у брифі вже було 447 чужих звітів, тобто очевидне давно знайшли. Треба було шукати те, що інші пропустили, і довести кожну знахідку хешем транзакції, а не описом.

Навіщо і яка ідея

Головна знахідка з живих тестів у застосунку: трейдер ставить TP/SL у режимі «Entire», тобто на всю позицію, потім докуповує, і застосунок далі пише «Entire». Коли ціна доходить до стопа, закривається тільки старий розмір, решта лишається без захисту. Оцінка збитку у вікні теж рахується на старий розмір, тому помітити це майже неможливо, поки не стане пізно.

Далі була розвилка: будувати MVP на своїй знахідці чи робити ще одного «стража», яких у брифі вже було п’ять. Прогнали рішення через раду з п’яти ІІ-радників і обрали свою знахідку. Так з’явився StopCheck: вставляєш адресу гаманця, нічого не підписуєш, сторінка читає мережу і показує, який відсоток позиції насправді прикритий стопом. Поруч бот, який закриває непокритий залишок, коли стоп спрацював або ціна дійшла до нього.

Друга рада пройшлася по всьому плану вже перед публікацією: пости пом’якшити, чужі позиції не показувати, зробити карточку результату для поширення і ролик на 50 секунд.

Хід роботи

Коли Що відбувалося
День 1, вдень Реєстрація, тікет на білий список, перші звіти через SDK і бот-кіт
День 1, вечір Розбір 447 чужих звітів: 8 наших тем в інших були раніше. Нові знахідки звірено перед оформленням
День 1, вечір Живі тести в застосунку: знайдено звіти 019, 020, 022
День 1, ніч Рада з 5 ІІ-радників: MVP будувати на своїй знахідці, а не робити шостого «стража»
День 1, ніч StopCheck: публічний репозиторій, сторінка, бот, живе демо з хешами, скан 463 акаунтів
День 1, ніч Друга рада по всьому плану: пости пом’якшити, чужі позиції не показувати, картка результату, ролик 50 с

Уся робота вклалася в одну добу.

Чим робили

Читання: SDK @somnia-chain/markets-sdk, позиції і розміри стопів беруться з мережі, індексатор лише підказує, де дивитися. Сторінка статична, на GitHub Pages, ключів не просить і нічого не підписує. Збірка через esbuild, TypeScript і viem.

Бот: прив’язаний ключ (функція «Link a bot» самої біржі) і perp-core з офіційного бот-кіта, закриття через placeOrderFor. Ставити стопи за власника протокол не дає, тому бот стежить сам. Спрацьований стоп відрізняє від скасованого за статусом в індексаторі.

Звіти: 21 штука за застосунком, SDK, бот-кітом, документацією і контрактами, кожен відтворюваний, з хешами транзакцій. Лежать в окремому репозиторії dreamdex-perps-feedback. Ролик на 50 секунд зібрано у ffmpeg зі справжніх скриншотів, знятих у headless Chrome.

Результат

Сторінка dmitriytopka.github.io/stopcheck: вставив адресу, отримав картку «стоп покриває 50 % позиції», список проблем і смуги покриття по кожній позиції, кнопки «скопіювати посилання» і «поділитися в X». Код відкритий: github.com/DmitriyTopka/stopcheck.

Живе демо в мережі, обидві транзакції в README: стоп закрив половину позиції о 19:34:35, бот закрив другу половину о 19:34:38. Без бота половина позиції лишилася б відкритою без стопа.

Скан 463 акаунтів біржі: 19 з частковим стоп-лосом, від 6 % до 99,6 %; 129 зі стопами без позиції; 6,19 STT чекають на claim у 30 акаунтів. Чужі адреси не публікуємо, це рішення ради.

Коштувало 0 $ на інфраструктуру: GitHub Pages і свій сервер. Газ тестової мережі: бот витратив близько 0,013 STT. Слабкі місця кажемо прямо: користувачів поки немає, бот потребує свого сервера, а якщо біржа виправить знахідку 019, бот стане потрібен рідше, перевірка ж залишиться.

Помилки і що винесли

Позиція 0,138 BTC замість 15 USDso.У тесті «15» пішло в поле відсотків, а підтвердження я натиснув, не прочитавши вікно. Закрито за хвилину, мінус 5,46 паперового USDso. Правило: вікно підтвердження читати окремо до кліку і звіряти «Order value».
99,6 % округлялося до «100 %».Поруч стояла фраза «решта без стопа», і картка суперечила сама собі. Виправлено: часткове покриття не округлюється вгору.
Звіти почали публікувати на 1-3 дні пізніше за інших.8 наших тем уже були в чужих звітах. Правило: у брифі з оплатою першому стартувати в день відкриття.

Інструменти

TypeScript@somnia-chain/markets-sdkviemdreamdex-bot-kitesbuildGitHub PagesChrome headlessffmpegClaude Code