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

61 lines
1.9 KiB
Markdown

# 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
```