# 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 : ```solidity 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) ```bash pnpm contract:deploy:local ``` ### Sepolia (Testnet) ```bash export SEPOLIA_RPC_URL=https://rpc.sepolia.org export PRIVATE_KEY=0x... pnpm contract:deploy:sepolia ```