Завдання
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, бот стане потрібен рідше, перевірка ж залишиться.
Помилки і що винесли




