From 07e00f106c4387c59bcb12a434cc9ab88f1ed274 Mon Sep 17 00:00:00 2001 From: Caffeine Date: Mon, 14 Sep 2026 02:32:32 +0300 Subject: [PATCH] =?UTF-8?q?fix(api):=20=D1=80=D0=B0=D0=B1=D0=BE=D1=87?= =?UTF-8?q?=D0=B8=D0=B9=20=D1=80=D0=B5=D1=86=D0=B5=D0=BF=D1=82=20=E2=80=94?= =?UTF-8?q?=20/api=20=D0=B2=20=D0=B1=D0=B0=D0=B7=D0=B5=20=D0=BE=D0=B1?= =?UTF-8?q?=D1=8F=D0=B7=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=BD=20=D0=B4=D0=BB?= =?UTF-8?q?=D1=8F=20POST?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Найдено исполнением рецепта из самого файла: `const BASE = 'https://testfront.binom.pw'` → `POST /wallet` возвращал 405 Method Not Allowed. GET-ручки терпят отсутствие префикса (`/state` == `/api/state`), а POST-ручки — нет. Внешний разработчик спотыкался на первой же строке примера. Что исправлено: - база в примере: `https://testfront.binom.pw/api` + предупреждение про /api - POST /wallet в примере: добавлены заголовок Content-Type и тело `{}` (без них 405) - WS-адрес в примере: явный `wss://` вместо `BASE.replace('https','wss')`, который после смены базы дал бы кривой `wss://testfront.binom.pw/api.replace…` - amountUnits в примере — строкой (поддержаны оба вида, число тоже работает) Проверено: рецепт, выдранный из файла регуляркой и запущенный как есть, отдаёт курс, `bet_open` и `bet_closed`. WS принимает подключение с чужого Origin (проверено тремя вариантами заголовка). --- API.md | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) diff --git a/API.md b/API.md index 1d444b6..e1949ad 100644 --- a/API.md +++ b/API.md @@ -4,10 +4,14 @@ и получать события в реальном времени. Источник — код шлюза (`smart-updown-token/relayer/src/gateway.ts`, `settle.ts`). -**База:** `https://testfront.binom.pw` -Пути нормализуются: `/api/state` и `/state` — одно и то же. +**База:** `https://testfront.binom.pw/api` CORS открыт (`Access-Control-Allow-Origin: *`) — можно дёргать прямо из браузера. +> ⚠️ **`/api` в базе обязателен.** GET-ручки (`/state`, `/price`, `/balance`, `/faucet`) +> отвечают и без префикса — `…/state` и `…/api/state` одно и то же. Но **POST-ручки +> (`/wallet`, `/bet`) без `/api` не работают**: `POST …/wallet` → `405 Method Not Allowed`. +> Держите `/api` в базе, и всё будет единообразно. + **Стенд тестовый** (`SMART_MODE=test`): фантики фейковые, SOL из фаусета, контракт наш. --- @@ -15,14 +19,15 @@ CORS открыт (`Access-Control-Allow-Origin: *`) — можно дёргат ## Короткий рецепт: «поставить и получить события» ```js -const BASE = 'https://testfront.binom.pw'; +const BASE = 'https://testfront.binom.pw/api'; // /api обязателен, см. выше +const H = { 'Content-Type': 'application/json' }; // 1. Кошелёк + деньги (только test-mode) -const { address } = await (await fetch(`${BASE}/wallet`, { method: 'POST' })).json(); +const { address } = await (await fetch(`${BASE}/wallet`, { method: 'POST', headers: H, body: '{}' })).json(); await fetch(`${BASE}/faucet/${address}`); // наливает 5 SOL + 10 000 фантиков // 2. Подписка на события -const ws = new WebSocket(`${BASE.replace('https', 'wss')}/api/ws`); +const ws = new WebSocket('wss://testfront.binom.pw/api/ws'); // только wss: страница по HTTPS ws.onmessage = (e) => { const m = JSON.parse(e.data); if (m.type === 'price') console.log('курс ', m.price); // "101.02" @@ -33,8 +38,8 @@ ws.onmessage = (e) => { // 3. Ставка. ВНИМАНИЕ: поле называется amountUnits, НЕ amount! await fetch(`${BASE}/bet`, { method: 'POST', - headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ address, side: 'UP', amountUnits: 500000000 }), // 500 фантиков + headers: H, + body: JSON.stringify({ address, side: 'UP', amountUnits: '500000000' }), // 500 фантиков }); // Закрывать не нужно — шлюз закроет сам по таймеру (см. «Авто-закрытие»). ```