rps-royale/docs/SMART_CONTRACT.md
Ubuntu 52565bf1a3 Phase 0: docs, CI/CD, Tailwind config, and Forgejo workflow
- Add Forgejo Actions deploy workflow
- Add documentation (ARCHITECTURE, DEPLOYMENT, SMART_CONTRACT, API_REFERENCE)
- Add Tailwind and PostCSS configs for web app
- Configure Git remote for Forgejo

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-24 02:19:01 +00:00

1.9 KiB

Smart Contract — RPSArena.sol

Pattern Commit-Reveal

Le contrat RPSArena.sol implémente un mécanisme anti-triche basé sur le commit-reveal :

  1. Commit : chaque joueur envoie keccak256(abi.encodePacked(choice, nonce))
  2. Reveal : après que les deux ont commité, chaque joueur dévoile son choice et nonce
  3. Vérification : le contrat recalcule le hash et le compare au commit
  4. Résultat : le gagnant est déterminé et le pot est distribué

Fonctions principales

createMatch(address _player2) payable

Crée un nouveau match en spécifiant l'adversaire. La mise est verrouillée dans le contrat.

commit(uint256 _matchId, bytes32 _commitHash)

Envoie le hash du choix. Le hash est calculé côté client avec :

keccak256(abi.encodePacked(uint256(choice), uint256(nonce)))

reveal(uint256 _matchId, Choice _choice, uint256 _nonce)

Dévoile le choix et le nonce. Le contrat vérifie que le hash correspond.

claimTimeout(uint256 _matchId)

Permet à un joueur de réclamer le pot si l'adversaire n'a pas commité ou révélé dans les délais (5 minutes).

Économie

  • Mise minimale : configurable (0.001 ETH en testnet)
  • Frais plateforme : 3% du pot total
  • Gain : 97% du pot au gagnant
  • Match nul : remboursement intégral des deux joueurs

Événements

  • MatchCreated(uint256 matchId, address p1, address p2, uint256 bet)
  • Committed(uint256 matchId, address player)
  • Revealed(uint256 matchId, address player, Choice choice)
  • MatchFinished(uint256 matchId, address winner, uint256 payout)
  • MatchDraw(uint256 matchId, uint256 refund)
  • MatchTimeout(uint256 matchId, address winner)

Déploiement

Local (Hardhat)

pnpm contract:deploy:local

Sepolia (Testnet)

export SEPOLIA_RPC_URL=https://rpc.sepolia.org
export PRIVATE_KEY=0x...
pnpm contract:deploy:sepolia