# Rock-Paper-Scissors Duel > ⚠️ **Experimental — generated with no human supervision.** This realm was > produced automatically by an MCP-driven agent to exercise the gno MCP server > and tooling, and to generate test content for gno compilers, linters and > formatters. **Not audited. Not for production.** Full context & folder README: > [r/moul/x/daily](https://github.com/moul/gno-contracts/blob/main/r/moul/x/daily/README.md) --- Asynchronous, two-player rock-paper-scissors with a real commit-reveal handshake: the challenger locks in a move as a sha256 commitment, the opponent replies in the open (seeing only a hash gives them nothing to go on), and the challenger reveals last to settle the round. A challenger who tries to dodge a losing reveal can be forfeited by the opponent once a 50-block reveal window expires — no house move, no single-tx shortcut, just two players and a fairness primitive. **Realm path:** `gno.land/r/g12cs4cehujpffpjpywmkqj43m6u5ya53nj69sjz/rpsduel` ## Example calls ```sh # 1. Compute your commitment off-chain (or via a read-only query) gnokey query vm/qeval \ --data 'gno.land/r/g12cs4cehujpffpjpywmkqj43m6u5ya53nj69sjz/rpsduel.ComputeCommit("rock", "xyz123")' # 2. Open a duel against an opponent with that commitment gnokey maketx call \ -pkgpath "gno.land/r/g12cs4cehujpffpjpywmkqj43m6u5ya53nj69sjz/rpsduel" \ -func Open -args "g1opponentaddr..." -args "<64-char hex commit>" \ -gas-fee 1000000ugnot -gas-wanted 3000000 -broadcast -chainid sapphire-1 # 3. Opponent replies in the clear gnokey maketx call \ -pkgpath "gno.land/r/g12cs4cehujpffpjpywmkqj43m6u5ya53nj69sjz/rpsduel" \ -func Accept -args "1" -args "paper" \ -gas-fee 1000000ugnot -gas-wanted 3000000 -broadcast -chainid sapphire-1 # 4. Challenger reveals to settle it gnokey maketx call \ -pkgpath "gno.land/r/g12cs4cehujpffpjpywmkqj43m6u5ya53nj69sjz/rpsduel" \ -func Reveal -args "1" -args "rock" -args "xyz123" \ -gas-fee 1000000ugnot -gas-wanted 3000000 -broadcast -chainid sapphire-1 # View the lobby, a specific duel, or a player's record gnokey query vm/qrender --data "gno.land/r/g12cs4cehujpffpjpywmkqj43m6u5ya53nj69sjz/rpsduel:" gnokey query vm/qrender --data "gno.land/r/g12cs4cehujpffpjpywmkqj43m6u5ya53nj69sjz/rpsduel:1" ``` ## Toolchain status Compiled and tested against the `chain/sapphire` (gno 0.9) toolchain tag from `gnolang/gno` — `gno test .` and `gno lint .` both pass clean. ## What changed in v1 Identical behaviour to [`v0`](https://github.com/moul/gno-contracts/tree/4f2df83869b80470eb81c48a82fdbe82256b8113/r/moul/x/daily/rpsduel) apart from rendering, which now goes through [`p/moul/kit/ui`](/p/moul/kit/ui/v0) instead of the local `escapeInline` helper. **Real escaping.** The local helper replaced a handful of markdown metacharacters. `ui.Inline` and `ui.Cell` delegate to [`p/nt/markdown/sanitize`](/p/nt/markdown/sanitize/v0), which also strips bidi and zero-width characters and folds newlines, so user text cannot reorder or escape the line it sits on. The rendering change means the output differs from v0, which under this repo's versioning rule is a compatibility change, hence a new version rather than an edit in place. `v0` stays live and untouched. --- Part of **[moul/gno-contracts](https://github.com/moul/gno-contracts)** — moul's versioned gno.land contracts. See the repository for the full catalog, build/test tooling, and usage. **Dependency graph:** ![gno.land/r/moul/x/daily/rpsduel/v1 dependency graph](https://raw.githubusercontent.com/moul/gno-contracts/main/_assets/gno.land/r/moul/x/daily/rpsduel/v1/deps.png) > 🧪 **Highly experimental — potentially vibe-coded.** Not audited; may break, change, or be removed at any time. Do not use with anything of value. Full disclaimer: [DISCLAIMER](https://github.com/moul/gno-contracts/blob/main/DISCLAIMER.md).