Исход каждого апгрейда: roll = HMAC-SHA256(serverSeed, clientSeed:nonce) → 0–100. Апгрейд удачен, если roll < шанс. Хеш серверного сида публикуется до раунда, поэтому сервер не может подбирать исход под ставку.
clientSeed хранится у вас (localStorage, ключ upg_client_seed_v1) и отправляется с каждым апгрейдом. Параметры каждого раунда (хеш сида, clientSeed, nonce, roll) сервер возвращает в ответе /api/upgrade и сохраняет в истории.