pragma solidity ^0.8.20;
import {Test, console} from "forge-std/Test.sol";
import {Game} from "../src/Game.sol";
contract GameTest is Test {
Game public game;
address public deployer;
address public player1;
address public player2;
address public player3;
address public maliciousActor;
uint256 public constant INITIAL_CLAIM_FEE = 0.1 ether;
uint256 public constant GRACE_PERIOD = 1 days;
uint256 public constant FEE_INCREASE_PERCENTAGE = 10;
uint256 public constant PLATFORM_FEE_PERCENTAGE = 5;
function setUp() public {
deployer = makeAddr("deployer");
player1 = makeAddr("player1");
player2 = makeAddr("player2");
player3 = makeAddr("player3");
maliciousActor = makeAddr("maliciousActor");
vm.deal(deployer, 10 ether);
vm.deal(player1, 10 ether);
vm.deal(player2, 10 ether);
vm.deal(player3, 10 ether);
vm.deal(maliciousActor, 10 ether);
vm.startPrank(deployer);
game = new Game(
INITIAL_CLAIM_FEE,
GRACE_PERIOD,
FEE_INCREASE_PERCENTAGE,
PLATFORM_FEE_PERCENTAGE
);
vm.stopPrank();
}
function testCanUpdateFeeParametersWhenGameOn() public {
vm.prank(player1);
game.claimThrone{value: INITIAL_CLAIM_FEE}();
vm.warp(GRACE_PERIOD / 2);
uint256 newClaimFee = game.claimFee();
uint256 newFeeIncreasePercentage = 100;
vm.startPrank(game.owner());
game.updateClaimFeeParameters(newClaimFee, newFeeIncreasePercentage);
vm.stopPrank();
vm.startPrank(player2);
game.claimThrone{value: newClaimFee}();
vm.stopPrank();
vm.startPrank(player3);
game.claimThrone{value: game.claimFee()}();
vm.stopPrank();
}
}
* Restrict `Game::updateClaimFeeParameters` such that it can only be called when a game is not active/before the start of a new game. Eg by adding `gameEndedOnly` modifier.
```diff
- function updateClaimFeeParameters(
- uint256 _newInitialClaimFee,
- uint256 _newFeeIncreasePercentage
- ) external onlyOwner isValidPercentage(_newFeeIncreasePercentage){...}
+ function updateClaimFeeParameters(
+ uint256 _newInitialClaimFee,
+ uint256 _newFeeIncreasePercentage
+ ) external onlyOwner isValidPercentage(_newFeeIncreasePercentage) gameEndedOnly{..}