feat(ui): третий исход в UI — возврат залога при ничьей
onBetClosed показывал бинарно: всё, что не payout_done, — «ПРОИГРАЛ (house_won)» красным. Ничья (деньги вернулись игроку) выглядела как проигрыш. Теперь три исхода + нейтральная заглушка: - payout_done → ВЫИГРАЛ (ok) - house_won → ПРОИГРАЛ (err) - refunded → ВОЗВРАТ (ничья, ставка возвращена) (info) - иное → РАССЧИТАНА (<statusName>) (info), не валится в проигрыш API.md: пример bet_closed со status 3 + описание refunded. Проверено: node --check инлайн-JS OK, образ smart/test-front:5, раздача наружу.
This commit is contained in:
@@ -128,8 +128,12 @@ await fetch(`${BASE}/bet`, {
|
|||||||
{"type":"bet_closed","id":"2","bettor":"8KbUFCHV…",
|
{"type":"bet_closed","id":"2","bettor":"8KbUFCHV…",
|
||||||
"exitPrice":10104000000,"status":1,"statusName":"payout_done"}
|
"exitPrice":10104000000,"status":1,"statusName":"payout_done"}
|
||||||
```
|
```
|
||||||
|
```json
|
||||||
|
{"type":"bet_closed","id":"3","bettor":"8KbUFCHV…",
|
||||||
|
"exitPrice":10105000000,"status":3,"statusName":"refunded"}
|
||||||
|
```
|
||||||
* `exitPrice` — цена выхода, тот же масштаб 1e8.
|
* `exitPrice` — цена выхода, тот же масштаб 1e8.
|
||||||
* `statusName`: `payout_done` (игрок выиграл) | `house_won` (выиграл дом) | `open` (ещё открыта).
|
* `statusName`: `payout_done` (игрок выиграл, выплата с множителем) | `house_won` (выиграл дом, ставка остаётся в ваулте) | `refunded` (ничья при `exitPrice == entryPrice`: залог возвращён игроку ровно суммой ставки, без множителя) | `open` (ещё открыта).
|
||||||
|
|
||||||
Исход считает контракт: `UP` выигрывает при `exitPrice > entryPrice`, `DOWN` — при `<`.
|
Исход считает контракт: `UP` выигрывает при `exitPrice > entryPrice`, `DOWN` — при `<`.
|
||||||
|
|
||||||
|
|||||||
+14
-4
@@ -271,11 +271,21 @@ function onBetOpen(m){
|
|||||||
/** Событие WS: ставка рассчитана — сервер закрыл её сам. */
|
/** Событие WS: ставка рассчитана — сервер закрыл её сам. */
|
||||||
function onBetClosed(m){
|
function onBetClosed(m){
|
||||||
setLiveBet('liveBetId', String(m.id));
|
setLiveBet('liveBetId', String(m.id));
|
||||||
const won = m.statusName === 'payout_done';
|
|
||||||
setLiveBet('liveBetState', won ? 'ВЫИГРАЛ (payout_done)' : 'ПРОИГРАЛ (house_won)');
|
|
||||||
setLiveBet('liveBetExit', String(m.exitPrice));
|
setLiveBet('liveBetExit', String(m.exitPrice));
|
||||||
const text = 'bet_closed: #'+m.id+', выход='+m.exitPrice+', '+(won?'ВЫИГРАЛ':'ПРОИГРАЛ');
|
const sn = m.statusName;
|
||||||
if(won) log.ok(text); else log.err(text);
|
if(sn === 'payout_done'){
|
||||||
|
setLiveBet('liveBetState', 'ВЫИГРАЛ (payout_done)');
|
||||||
|
log.ok('bet_closed: #'+m.id+', выход='+m.exitPrice+', ВЫИГРАЛ');
|
||||||
|
} else if(sn === 'house_won'){
|
||||||
|
setLiveBet('liveBetState', 'ПРОИГРАЛ (house_won)');
|
||||||
|
log.err('bet_closed: #'+m.id+', выход='+m.exitPrice+', ПРОИГРАЛ');
|
||||||
|
} else if(sn === 'refunded'){
|
||||||
|
setLiveBet('liveBetState', 'ВОЗВРАТ (ничья, ставка возвращена)');
|
||||||
|
log.info('bet_closed: #'+m.id+', выход='+m.exitPrice+', НИЧЬЯ — залог возвращён');
|
||||||
|
} else {
|
||||||
|
setLiveBet('liveBetState', 'РАССЧИТАНА ('+(sn||'?')+')');
|
||||||
|
log.info('bet_closed: #'+m.id+', выход='+m.exitPrice+', статус='+(sn||'?'));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function copyLog(){ const t=document.getElementById('log').innerText; navigator.clipboard?.writeText(t).then(()=>log.ok('лог скопирован')).catch(()=>{}); }
|
function copyLog(){ const t=document.getElementById('log').innerText; navigator.clipboard?.writeText(t).then(()=>log.ok('лог скопирован')).catch(()=>{}); }
|
||||||
|
|||||||
Reference in New Issue
Block a user