Explain solidity>data structures

Lifecycle Events

The contract already has staking, credits, deadlines, cleanup helpers, and game-ending logic. This pass makes the lifecycle observable.

Why Events Matter:
Frontends and indexers should not have to poll every storage variable to understand what happened. Emit an event at each important transition:
• The opponent accepts the game
• A player makes a move
• Player X cancels an unaccepted game
• A player claims a timeout forfeit

Keep Existing State:
Do not redesign the storage model. Keep playerX , playerO , board , credits , deadlines, and cleanup behavior intact.
This is an integration pass over the advanced contract, not a return to beginner setup.

Event Payloads:
Use indexed addresses for player-focused events so a UI can filter by wallet.
MoveMade should also include the board position.

Your task: Add the missing lifecycle events and emit them from the existing functions without changing the game rules.

Add lifecycle event coverage
0%
0 of 8 requirements passed.
Requirements:
Declares GameAccepted event
Declares MoveMade event
Declares GameCancelled event
Declares ForfeitClaimed event
acceptGame emits GameAccepted
makeMove emits MoveMade
cancelUnaccepted emits GameCancelled
claimForfeit emits ForfeitClaimed