ТЗ: Жизненный цикл клейма и инвойсов рулетки
Метаданные
| Параметр | Значение |
|---|---|
| Дата создания | 2026-06-09 |
| Дата последнего изменения | 2026-06-09 |
| Статус апрува | ⏳ На рассмотрении |
| Дата апрува | — |
Доработка модуля рулетки (apps/backend/src/roulette/) и связанных сервисов клейма
(claimTokens) и оплат (web3-payments). Решаемые проблемы:
- Слишком короткий expiration клейм-подписи (15с). On-chain контракт
MagnetTokensClaim.claimTokensтребуетblock.timestamp <= expiration. 15 секунд часто не хватает на подтверждение в кошельке + майнинг → клейм ревертит как просроченный. - Неинформативный кулдаун. При повторном запросе подписи бэкенд бросает
захардкоженное
"Signature is already in use. Wait 15 seconds"— фронт не знает, сколько реально осталось ждать. - Защита от двойного клейма — нужно подтвердить и задокументировать, как именно гарантируется, что приз нельзя склеймить дважды.
- Висящие pending-инвойсы. Подпись на оплату инвойса колеса уходит в контракт с
invoiceExpiration = 0(бессрочно), просроченные/неоплаченные инвойсы остаются в статусеpendingнавсегда.
2.1. Пользовательские сценарии
- Клейм приза. Пользователь выигрывает приз → видит его в «Доступно для клейма» →
жмёт «Клейм» → бэкенд выдаёт подпись (живёт 60с) → фронт сразу шлёт
claimTokens. Подписи хватает на подтверждение в кошельке и майнинг. - Повторный запрос подписи. Если пользователь жмёт «Клейм» снова, пока активна предыдущая подпись — получает понятное сообщение «Подождите N сек.» с реальным остатком.
- Оплата спина колеса. Пользователь покупает спин → сначала проходит allowance
(approve ERC20), затем запрашивается подпись на оплату и сразу
pay(). Окно 60с покрывает только транзакциюpay(). - Очистка инвойсов. Просроченные неоплаченные инвойсы автоматически удаляются при подтягивании оплат.