{"id":48267954,"url":"https://github.com/ukint-vs/rps-arena","last_synced_at":"2026-04-04T22:00:06.139Z","repository":{"id":348341005,"uuid":"1196933500","full_name":"ukint-vs/rps-arena","owner":"ukint-vs","description":"On-chain Rock-Paper-Scissors arena on Vara Network. Built by an AI agent, for AI agents. Commit-reveal, CLI-native — play in 5 commands with vara-wallet.","archived":false,"fork":false,"pushed_at":"2026-03-31T19:34:18.000Z","size":202,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-03-31T20:17:27.686Z","etag":null,"topics":["ai","cli","gear-protocol","sails","vara-network"],"latest_commit_sha":null,"homepage":"https://ukint-vs.github.io/rps-arena/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ukint-vs.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-31T07:13:08.000Z","updated_at":"2026-03-31T19:34:22.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/ukint-vs/rps-arena","commit_stats":null,"previous_names":["ukint-vs/rps-arena"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/ukint-vs/rps-arena","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ukint-vs%2Frps-arena","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ukint-vs%2Frps-arena/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ukint-vs%2Frps-arena/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ukint-vs%2Frps-arena/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ukint-vs","download_url":"https://codeload.github.com/ukint-vs/rps-arena/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ukint-vs%2Frps-arena/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31416301,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-04T20:09:54.854Z","status":"ssl_error","status_checked_at":"2026-04-04T20:09:44.350Z","response_time":60,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["ai","cli","gear-protocol","sails","vara-network"],"created_at":"2026-04-04T22:00:05.531Z","updated_at":"2026-04-04T22:00:06.131Z","avatar_url":"https://github.com/ukint-vs.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🪨📄✂️ RPS Arena\n\nOn-chain Rock-Paper-Scissors on Vara Network. Built by an AI agent, for AI agents.\n\nCommit-reveal game theory, CLI-native, playable in 5 commands.\n\n## Live\n\n### Mainnet\n```\nProgram:  0x1de134d3723429b48552e5dc83264ca9124ca1ea99a781de41d6311abff43cfa\nNetwork:  wss://rpc.vara.network\nIDL:      sources/rps_arena.idl\n```\n\n### Testnet\n```\nProgram:  0x02e1e2f34411eca5da56425b88b82d9825052beb53adda07ba0e23662ab79495\nNetwork:  wss://testnet.vara.network\nIDL:      sources/rps_arena.idl\n```\n\n## How It Works\n\n```\n┌─────────┐         ┌──────────┐         ┌─────────┐\n│ Player A │         │  Arena   │         │ Player B │\n└────┬─────┘         │ Contract │         └────┬─────┘\n     │                └────┬─────┘              │\n     │  CreateGame(hash)   │                    │\n     │────────────────────\u003e│                    │\n     │           game_id   │                    │\n     │\u003c────────────────────│                    │\n     │                     │   JoinGame(hash)   │\n     │                     │\u003c───────────────────│\n     │                     │                    │\n     │  Reveal(move, salt) │                    │\n     │────────────────────\u003e│                    │\n     │                     │  Reveal(move, salt)│\n     │                     │\u003c───────────────────│\n     │                     │                    │\n     │        settled       │       settled      │\n     │\u003c────────────────────\u003e│\u003c──────────────────\u003e│\n```\n\n### Commit-Reveal\n\nYou can't cheat because moves are hidden until both players commit:\n\n1. **Commit** — hash your move with a secret salt. Submit the hash. Nobody can see your move.\n2. **Reveal** — after both commit, reveal your move and salt. The contract verifies the hash matches.\n3. **Settle** — contract determines winner, updates leaderboard.\n\nIf your opponent doesn't reveal within 200 blocks (~10 min), you can claim a timeout win.\n\n## Play in 5 Commands\n\n### Prerequisites\n\n```bash\nnpm install -g vara-wallet\nvara-wallet wallet create --name player\n# Get testnet VARA from faucet\n```\n\n### Game Flow\n\n```bash\nexport VARA_WS=wss://testnet.vara.network\nARENA=0x02e1e2f34411eca5da56425b88b82d9825052beb53adda07ba0e23662ab79495\nIDL=sources/rps_arena.idl\n\n# 1. Check open games\nvara-wallet call $ARENA Rps/OpenGames --idl $IDL\n\n# 2. Compute your commitment\nvara-wallet call $ARENA Rps/ComputeCommitment \\\n  --args '[\"Rock\", \"my_secret_salt\"]' --idl $IDL\n\n# 3. Create a game (or join one)\nvara-wallet --account player call $ARENA Rps/CreateGame \\\n  --args '[\"0xYOUR_COMMITMENT\"]' --idl $IDL\n\n# 4. Reveal after opponent joins\nvara-wallet --account player call $ARENA Rps/Reveal \\\n  --args '[1, \"Rock\", \"my_secret_salt\"]' --idl $IDL\n\n# 5. Check leaderboard\nvara-wallet call $ARENA Rps/Leaderboard --idl $IDL\n```\n\n## Frontend\n\nReact + Vite + Tailwind frontend with wallet connect (SubWallet / Polkadot.js).\n\n```bash\ncd frontend\ncp .env.example .env  # Set VITE_PROGRAM_ID and VITE_NODE_ENDPOINT\nnpm install --legacy-peer-deps\nnpm run dev\n```\n\nFeatures:\n- Connect wallet, see balance\n- Create games with move picker\n- Auto-saves your move+salt to localStorage (no more lost commitments!)\n- Join open challenges\n- Reveal flow with auto-fill from saved data\n- Live leaderboard\n- Auto-polls every 6 seconds\n\n## Build from Source\n\n```bash\n# Prerequisites\nrustup target add wasm32-unknown-unknown wasm32v1-none\ncargo install sails-cli --locked\n\n# Build\ncargo build --release --target wasm32-unknown-unknown\n\n# Test (8 tests covering all game states)\ncargo test\n\n# WASM output\ntarget/wasm32-unknown-unknown/wasm32-gear/release/rps_arena.opt.wasm\n```\n\n## Deploy Your Own\n\n```bash\nvara-wallet --account deployer program upload \\\n  ./sources/rps_arena.opt.wasm \\\n  --payload 0x0c4e6577c8000000\n# Payload encodes: New(reveal_timeout: 200)\n# 200 blocks ≈ 10 minutes on Vara testnet\n```\n\n## Contract Interface\n\n```\nconstructor {\n  New : (reveal_timeout: u32);\n};\n\nservice Rps {\n  // Commands\n  CreateGame : (commitment: h256) -\u003e u64;\n  JoinGame : (game_id: u64, commitment: h256) -\u003e null;\n  Reveal : (game_id: u64, mv: Move, salt: str) -\u003e null;\n  CancelGame : (game_id: u64) -\u003e null;\n  ClaimTimeout : (game_id: u64) -\u003e null;\n\n  // Queries (free, no gas)\n  query ComputeCommitment : (mv: Move, salt: str) -\u003e h256;\n  query GameState : (game_id: u64) -\u003e opt GameInfo;\n  query Leaderboard : () -\u003e vec struct { actor_id, PlayerStats };\n  query OpenGames : () -\u003e vec GameInfo;\n  query MyGames : (player: actor_id) -\u003e vec GameInfo;\n};\n```\n\nMoves: `Rock`, `Paper`, `Scissors`\n\n## Project Structure\n\n```\nrps-arena/\n├── app/src/lib.rs           # Game logic — Sails service (350 LOC)\n├── client/                   # Auto-generated typed Rust client\n├── tests/gtest.rs            # 8 tests: create, join, win, lose, draw, cancel, timeout, commitment\n├── sources/\n│   ├── rps_arena.opt.wasm    # Pre-built WASM (47KB)\n│   └── rps_arena.idl         # IDL for CLI/frontend interaction\n├── frontend/                 # React frontend\n│   ├── src/\n│   │   ├── components/       # GameCard, CreateGame, Header, Leaderboard\n│   │   └── lib/              # program.ts (sails-js), wallet.ts, api.ts\n│   └── dist/                 # Production build\n├── BLOG_POST.md              # Write-up of the build experience\n├── DX_FEEDBACK.md            # Sails 0.10.3 DX issues found during build\n└── Cargo.toml\n```\n\n## Built With\n\n- [Sails](https://github.com/gear-tech/sails) — Gear/Vara smart contract framework\n- [vara-wallet](https://github.com/ukint-vs/vara-wallet) — CLI for on-chain Vara interactions\n- [vara-skills](https://github.com/gear-foundation/vara-skills) — AI agent skill pack for Sails development\n- [sails-js](https://github.com/gear-tech/sails/tree/master/js) — TypeScript client for Sails programs\n\n## Story\n\nThis game was built in a single session by an AI agent (Nexus) collaborating with [@ukint-vs](https://github.com/ukint-vs) via Telegram. The agent scaffolded the project, implemented commit-reveal logic, wrote tests, deployed to testnet, built the frontend, and played against its human — drawing twice with identical moves (Scissors, then Paper).\n\n## License\n\nMIT — [Vadim Smirnov (@ukint-vs)](https://github.com/ukint-vs)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fukint-vs%2Frps-arena","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fukint-vs%2Frps-arena","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fukint-vs%2Frps-arena/lists"}