- 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>
61 lines
1.9 KiB
Markdown
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
|
|
```
|