Skip to content

feat(arena): add asynchronous RPS challenges and ten-minute treasury forfeits - #99

Open
CH4rnel wants to merge 38 commits into
cyberia-temple:masterfrom
CH4rnel:feature/cyberia-arcade
Open

CH4rnel wants to merge 38 commits into
cyberia-temple:masterfrom
CH4rnel:feature/cyberia-arcade

Conversation

@CH4rnel

@CH4rnel CH4rnel commented Aug 6, 2026 •

Copy link
Copy Markdown
Collaborator

Cyberia Arena adds a Rock–Paper–Scissors wallet MVP with encrypted local move secrets, CYBER escrow, match discovery, invitations, settlement and payouts.

The revised RockPaperScissorsAsync contract keeps challenges open indefinitely. Accepting a challenge deposits the second stake but does not start the match. Both players confirm readiness; each confirmation is valid for ten minutes without a penalty for expiry. Either participant can cancel before the start and recover deposited stakes.

After mutual readiness, each commit/reveal phase lasts 600 seconds. Each inactive player's own stake accrues to the immutable Arena treasury; an active opponent gets their own stake back. If neither acts, both stakes accrue to the treasury. Normal wins and draws are unchanged, including settlement after both moves were revealed before expiry. Settlement performs no external transfers; player refunds and treasury penalties are claimed separately.

The wallet reads and displays the selected contract's rules, supports readiness and pre-start cancellation, and explains penalties in English, Russian and Simplified Chinese. New invitations carry a contract address. Original links retain the original deployed MVP; arbitrary signing targets from URLs are refused.

Deployment requires an explicit ARENA_TREASURY_ADDRESS and verifies the deployment manifest against bytecode, constructor, phase duration and treasury. The original Solidity contract and mainnet address remain unchanged. The asynchronous contract has not been deployed to mainnet by this PR.

Validation: SDK build/lint and 47 tests; 24 Arena/catalogue/localization frontend tests; targeted frontend ESLint and Laravel frontend build. Legacy rule detection was also checked against the live Cyberia RPC. The branch includes current master with wallet navigation and network-selection merge conflicts resolved.

Remaining: choose the treasury address, deploy and verify the new contract, configure its address, and run a full two-vault production UI match. Discovery remains limited to the latest 50 matches. A durable feed, background notifications, spectator bets, multiple stake assets, scheduled duels and the 12-card series remain future work.

CH4rnel and others added 26 commits August 6, 2026 16:04
Add a shared Arena screen for web, desktop, mobile and Telegram, with browser-side Cyberia signing and encrypted commit-reveal secrets. Expose only public deployment coordinates, add a safe production deploy command, and link the Telegram bot directly to the game.
Add a responsive Cyberia-native catalogue and RPS product page with about, play, updates and local prototype feedback surfaces. Localize the complete Arena experience in English, Russian and Simplified Chinese, keep the Arena rail item active, and simplify the wallet header.
Resolve the Telegram dispatcher overlap by keeping the maintainer's app.py unchanged. This preserves the upstream claim command and removes Arena command registration while retaining the wallet-native Arena interface.
Wrap the deployment status message according to the SDK Prettier configuration so the Arcade CI lint gate passes without changing deployment behavior.
@CH4rnel CH4rnel changed the title feat(game-sdk): initialize Cyberia Arcade SDK foundation feat(arena): add RPS wallet MVP and verified Cyberia deployment Sep 6, 2026
@cyberia-temple

cyberia-temple commented Sep 7, 2026 •

Copy link
Copy Markdown
Owner

300-second phases

Что будет, если 300 секунд ни один игрок не будет делать хода?

@CH4rnel

CH4rnel commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator Author

@cyberia-temple игроки вносят свой банк (ставки), одна фаза игры длится 300 секунд, если второй игрок бездействует первый забирает его банк, и так до тех пор пока не заберёт и звёзды.

@CH4rnel

CH4rnel commented Sep 8, 2026

Copy link
Copy Markdown
Collaborator Author

@cyberia-temple

300-second phases
Что будет, если 300 секунд ни один игрок не будет делать хода?

изображение

реализация механики сейчас полностью on-chain, без БД и сервера.
допустим игрок 1 создаёт матч и вносит ставку.
дальше, у игрока 2 есть 300 секунд, чтобы внести точно такую же ставку и присоединиться.

  • если не присоединился - игрок 1 может вернуть свою ставку.
    после join начинается фаза commit: у обоих по 300 секунд, чтобы записать хеш скрытого хода.
  • сделал commit только один - после срока он получает весь банк.
  • не сделал никто - оба получают свои ставки назад.

дальше, когда оба сделали commit, начинается reveal: ещё 300 секунд, чтобы открыть ход и секрет.

  • открылся только один - он получает весь банк.
  • не открылся никто - оба получают свои ставки назад.
    когда оба раскрылись, любой адрес вызывает resolve:
  • победитель получает 2 × stake;
  • ничья возвращает каждому его stake

если же игрок внёс ставку и в течение 300 секунд не сделал ход:

  • до присоединения второго игрока: его ставка остаётся в контракте, но после таймера её можно вернуть.
  • после join, если он не сделал commit, а соперник сделал: соперник забирает весь банк.
  • после commit, если он не раскрыл ход, а соперник раскрыл: соперник забирает весь банк.
  • если оба бездействуют в одной фазе: ставки возвращаются каждому.
    а вся киберсоль в том, что 300 секунд - не серверный таймер и не Laravel-задача. это дедлайн внутри смарт-контракта, лол, вычисляемый из времени блока. кто угодно может вызвать timeout-разрешение после истечения срока; контракт сам определит, кому вернуть или отдать CYBER.
    а если же менять механику то придётся передеплоить контракт.

@cyberia-temple

Copy link
Copy Markdown
Owner

Я не понимаю зачем ограничение в 300 секунд, на сервисе, где не бывает двух пользователей онлайн

@CH4rnel CH4rnel changed the title feat(arena): add RPS wallet MVP and verified Cyberia deployment feat(arena): add asynchronous RPS challenges and ten-minute treasury forfeits Sep 9, 2026
@CH4rnel

CH4rnel commented Sep 10, 2026 •

Copy link
Copy Markdown
Collaborator Author

Я не понимаю зачем ограничение в 300 секунд, на сервисе, где не бывает двух пользователей онлайн

@cyberia-temple пожалуй согласен, это нецелесообразное абстрактное усложнение которое было задуманно мною для реализации абстрактных механик, но практическая польза от этого сомнительная.
таймер как таковой убран.
но.
контракт транзакции должен знать состояние готовности игроков и матча, поэтому добавлена формальное подтверждение через WaitingForReady.
контракт не может "знать" ушёл куда то игрок, заснул, забыл ли открыть вкладку и тд - контракт не знает что игрок собирается делать зайдя в действующий матч, будет ли он действительно играть или "ушёл по делам".
даже в покере в различных румах и правилах ты не можешь вечно тянуть время, ты должен сделать ставку и ход
поэтому, принимая вызов на матч в Камень Ножницы Бумага у игрока есть формальные 10 минут на простое подтверждение confirmReady того, что он вообще собирается играть а не валяет дурака.
зашёл в матч - 10 минут на подтверждение через ставку в банк, сделал ставку - играешь.

технически убрать таймер можно. но тогда после начала матча исчезнувший игрок навсегда
заблокирует и свою ставку, ставку соперника, возможность завершить матч, возможность направить неактивную ставку в treasury.

в блокчейне нет фонового процесса, который сам завершает игру. нужен вызов транзакции, а
контракту нужен проверяемый критерий - игрок действовал вовремя или просрочил.

поэтому текущая схема разделена так:
ожидание соперника - бессрочное
подтверждение готовности - 10 минут
commit - 10 минут
reveal - 10 минут
после просрочки любой участник может вызвать timeout и завершить матч.

а эти 10 минут не требуют записи в БД и не являются длительностью всей игры. это только окно
бездействия после начала матча.

а если сделать все фазы бессрочными, придётся делать усложнения и другие механику - ручную отмену, арбитра, админский timeout, страховку или отдельный dispute-процесс. короче кучу новых ограничений и препятствий. иначе зависшие ставки невозможно будет безопасно разблокировать.

возражения считаю излишними, т.к на данный момент для сохранения реиграбельности и логичности происходящего без запуска и тестов ничего лучше придумать нельзя. для начала нужно тестировать действующие решения, дальше подкорректирую.

…rcade

# Conflicts:
#	.github/workflows/ci.yml
#	backend/laravel/resources/js/components/wallet/WalletPortfolio.vue
#	backend/laravel/resources/js/pages/Wallet.vue

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants