From 22bf74eb1f6233227004a1392ef410f458c7929a Mon Sep 17 00:00:00 2001 From: Caffeine Date: Thu, 10 Sep 2026 04:33:41 +0300 Subject: [PATCH] =?UTF-8?q?feat:=20=D0=BF=D1=83=D0=BB=D1=8C=D1=82=20=D0=BD?= =?UTF-8?q?=D0=B0=20HTTP-=D1=88=D0=BB=D1=8E=D0=B7=20=E2=80=94=20=D1=81?= =?UTF-8?q?=D1=82=D0=B0=D0=B2=D0=BA=D0=B8/=D0=B1=D0=B0=D0=BB=D0=B0=D0=BD?= =?UTF-8?q?=D1=81=20=D0=B1=D0=B5=D0=B7=20Phantom=20(gwBase,=20=D0=BF=D1=80?= =?UTF-8?q?=D0=B5=D1=81=D0=B5=D1=82=D1=8B=20=D0=BA=D0=BE=D1=88=D0=B5=D0=BB?= =?UTF-8?q?=D1=8C=D0=BA=D0=BE=D0=B2)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TASK-diag-connect.md | 39 ++++++ TASK-gateway-front.md | 34 +++++ index.html | 315 ++++++++++++++++++++---------------------- 3 files changed, 219 insertions(+), 169 deletions(-) create mode 100644 TASK-diag-connect.md create mode 100644 TASK-gateway-front.md diff --git a/TASK-diag-connect.md b/TASK-diag-connect.md new file mode 100644 index 0000000..27dbaa3 --- /dev/null +++ b/TASK-diag-connect.md @@ -0,0 +1,39 @@ +# TASK — Усилить диагностику при connect() к Phantom + +Репозиторий: `test-front`, файл `index.html`. + +## Задача +При клике «Подключить Phantom» (`connect()`, стока 103-108) Phantom бросает +generic «Unexpected error». Нужно вытащить **настоящую** ошибку, чтобы понять +причину (сеть/кластер/конфиг Phantom). + +## Что сделать (только `index.html`, `connect()` и `getProvider`) + +1. ОБЕРНУТЬ точку ошибки: вместо `log.err('connect: '+e.message)` логировать БОЛЬШЕ: + - `e.message` + - `JSON.stringify(e)` (если сериализуется) — обернуть в try + - `e.toString()` + - стек: `e.stack` если есть + Разделить в лог как несколько строк / один блок. + +2. В `getProvider`: вернуть не только `window.solana`, но и **версию Phantom** и + **доступные методы** (чтобы понять, что Phantom умеет): + - если `w.solana`: залогировать `typeof w.solana.connect`, `typeof w.solana.signTransaction`, + `typeof w.solana.isConnected`, `w.solana` перечислить ключи (только названия). + Это не сломает — просто диагностический вывод в лог при подключении. + +3. НЕ менять логику (не «чинить») — только ЛОГИРОВАТЬ детали, чтобы прислать + пользователю полную картину. Это диагностика. + +## Гейт +- JS-синтаксис валиден (`node --check` извлечённого script). +- Страница открывается. + +## НЕ делать +- Не менять ставку/балансы/swap. +- Не виполнять Phantom насильно. +- Не коммитить. + +## Результат +Пользователь обновит страницу, нажмёт «Подключить», в логе увидит ПОЛНУЮ ошибку +(не только «Unexpected error»), скопирует и пришлёт нам. Из неё станет ясна причина. \ No newline at end of file diff --git a/TASK-gateway-front.md b/TASK-gateway-front.md new file mode 100644 index 0000000..1ff2a12 --- /dev/null +++ b/TASK-gateway-front.md @@ -0,0 +1,34 @@ +# TASK — Перевести тестовый фронт (test-front) на HTTP-шлюз (ставки/баланс без Phantom) + +## Контекст +`test-front/index.html` — статичный пульт на `testfront.binom.pw` (осн.) / `game2.binom.pw`. +Сейчас он требует Phantom для баланса и ставки. Но поднят **HTTP-шлюз** (релейер, localnet): +- на `http://127.0.0.1:8895` (через прокси наружу будет виден как `GW_BASE`). +- Эндпоинты: + - `GET /state` → `{counter,minAmount,maxAmount,multiplierBps,expirySeconds,paused,admin,relayer,vaultBalanceHuman,minAmountHuman,maxAmountHuman}` + - `GET /balance/{address}` → `{sol,solLamports,tokenUnits,tokenHuman}` + - `POST /bet {side, amountUnits, address?}` → `{tx,id,bettor,entryPrice}` (без address — генерит и регистрирует кошелёк сам; но пульт будет передавать введённый/пресет-адрес) + - `POST /close {id}` → `{tx,id,exitPrice,status,statusName,bettor}` (statusName: payout_done/house_won/open) + +## Задача (только `test-front/index.html`) +Сделать пульт работающим БЕЗ Phantom — все операции через шлюз: + +1. **Добавить конфиг-поле «Шлюз (API)»** — базовый URL шлюза (default пустой → фронт сам выведет, если пусто). Назвать `gwBase`. +2. **Баланс**: введите адрес в поле → кнопка → `GET {gw}/balance/{address}` → показать фантики (`tokenHuman`) и SOL (`sol`). Убрать требование Phantom для балances. +3. **Ставка**: поля side (UP/DOWN), amountHuman; адрес (введённый или пресет). Кнопка → `POST {gw}/bet {side, amountUnits, address}` → показать `{id, bettor, entryPrice}` в лог. Ставить вверх/вниз. +4. **Закрыть**: кнопка (id из последней ставки или ввод) → `POST {gw}/close {id}` → показать `statusName` (выиграл/проиграл/открыт). +5. **Обновить state**: показывать min/max/expiry/vault с `/state`. +6. **CORS**: шлюз уже отдаёт `Access-Control-Allow-Origin: *` — fetch с любого домена пройдёт. Оставим. +7. **Пресет-кошельки**: захардкодь в поле адреса пару известных: admin (источник фантиков) — `Huha5S9ySxHC9u7RXmeQbt8GZh1VXGzfjVPGdsYV2tKK` — и/или зарегистрированный bettor из keystore (выведи его адрес при необходимости). Чтобы сразу было. + +## Ограничения +- НЕ менять шлюз (`smart-updown-token/relayer/gateway.ts`) — только фронт. +- НЕ коммитить. +- amountUnits в токен-единицах (×10^decimals=6). Пользователь вводит в фантиках (до 6 знаков) — умножить на 1e6 на фронте. + +## Гейт +- JS-синтаксис валиден. +- Страница открывается; при заполненном gwBase живо показывает state, делает bet/close. + +## Отчёт +Что сделал, как запускать, как пользоваться (какие поля/кнопки). Если шлюз недоступен с браузера — как проксировать наружу (совет, не реализация). \ No newline at end of file diff --git a/index.html b/index.html index c320496..26e4793 100644 --- a/index.html +++ b/index.html @@ -2,7 +2,7 @@ -Binary Rocket — техтест экономики (фантики) +Binary Rocket — техтест экономики через HTTP-шлюз (фантики, без Phantom) -

Binary Rocket :: tech test (фантики)

+

Binary Rocket :: техтест через HTTP-шлюз (фантики, без Phantom)

- Конфигурация + Конфигурация шлюза
- - - - - - + + если пусто — фронт выведет и использует свой адрес (location.origin)
- - — - - - + + + +
+
admin — источник фантиков; bettor-N — custodial-кошельки, зарегистрированные в keystore шлюза
- Валюта / балансы + Состояние / баланс +
+ + + + +
Фантики: — SOL: —
-
- -
- Пополнить / Вывести (swap pump.fun) -
- - -
-
- - -
-
- -
- Ставка (через контракт, валюта = фантики, исход = цена SOL) -
- - - - -
+
баланс показывается для адреса из поля «Адрес»
Состояние ещё не прочитано.
+
+ Ставка (POST /bet, без Phantom) +
+ + + + +
+
сумма ×1e6 → units (decimals=6); адрес берётся из поля «Адрес» (пустой адрес — шлюз сам сгенерит и зарегистрирует кошелёк)
+
лимиты ставок неизвестны (обновите state)
+
+ +
+ Закрытие (POST /close) +
+ + + id заполнится после ставки, либо введите вручную +
+
+
Лог
- - \ No newline at end of file +