152 lines
4.8 KiB
Solidity
152 lines
4.8 KiB
Solidity
// SPDX-License-Identifier: MIT
|
|
pragma solidity ^0.8.13;
|
|
|
|
import {Test, console} from "forge-std/Test.sol";
|
|
import {RaidGeld, Army, Player} from "../src/RaidGeld.sol";
|
|
|
|
contract raid_geldTest is Test {
|
|
RaidGeld public raid_geld;
|
|
address public player1;
|
|
address public player2;
|
|
address public owner;
|
|
|
|
function setUp() public {
|
|
owner = address(0x126);
|
|
player1 = address(0x123);
|
|
player2 = address(0x124);
|
|
vm.deal(owner, 10 ether);
|
|
vm.deal(player1, 10 ether);
|
|
vm.deal(player2, 10 ether);
|
|
vm.prank(owner);
|
|
raid_geld = new RaidGeld();
|
|
}
|
|
|
|
function registerPlayer() private {
|
|
raid_geld.register{value: raid_geld.BUY_IN_AMOUNT()}();
|
|
}
|
|
|
|
function test_00_no_fallback() public {
|
|
vm.expectRevert();
|
|
// Send Ether with some data to trigger fallback
|
|
address(raid_geld).call{value: 0.1 ether}("0x1234");
|
|
}
|
|
|
|
function test_01_no_receive() public {
|
|
vm.startPrank(player1);
|
|
vm.expectRevert();
|
|
payable(address(raid_geld)).transfer(0.1 ether);
|
|
}
|
|
|
|
function test_02_registration() public {
|
|
vm.startPrank(player1);
|
|
|
|
uint256 initialBalance = address(raid_geld).balance;
|
|
uint256 initialTotalMinted = raid_geld.total_minted();
|
|
|
|
// Send registration fee ETH to the contract
|
|
registerPlayer();
|
|
|
|
// Check that initialraid_geld.is received by the player
|
|
assertEq(raid_geld.balanceOf(player1), raid_geld.INITIAL_GELD());
|
|
|
|
// Verify the contract balance is updated
|
|
assertEq(address(raid_geld).balance, initialBalance + raid_geld.BUY_IN_AMOUNT());
|
|
|
|
// Verify player is set initially
|
|
Player memory player = raid_geld.getPlayer(player1);
|
|
assertEq(player.total_minted, raid_geld.INITIAL_GELD());
|
|
assertEq(player.created_at, block.timestamp);
|
|
assertEq(player.last_raided_at, 0);
|
|
|
|
Army memory army = raid_geld.getArmy(player1);
|
|
|
|
assertEq(army.moloch_denier.level, 0);
|
|
assertEq(army.apprentice.level, 0);
|
|
assertEq(army.annointed.level, 0);
|
|
assertEq(army.champion.level, 0);
|
|
|
|
// Verify that total_minted is updated
|
|
assertEq(raid_geld.total_minted(), initialTotalMinted + raid_geld.INITIAL_GELD());
|
|
}
|
|
|
|
function test_03_fundsCanBeWithdrawn() public {
|
|
uint256 initialBalance = owner.balance;
|
|
|
|
// Switch to Player 1 and register it
|
|
vm.startPrank(player1);
|
|
registerPlayer();
|
|
|
|
// Switch back to owner and withdraw funds
|
|
vm.startPrank(owner);
|
|
raid_geld.withdraw();
|
|
uint256 newBalance = owner.balance;
|
|
uint256 newContractBalance = address(raid_geld).balance;
|
|
|
|
// contract balance should be empty
|
|
assertEq(newContractBalance, 0);
|
|
// owner should have the extra funds
|
|
assertEq(newBalance, initialBalance + raid_geld.BUY_IN_AMOUNT());
|
|
}
|
|
|
|
function test_04_onlyOwnerCanWithdraw() public {
|
|
// Register player 1
|
|
vm.startPrank(player1);
|
|
registerPlayer();
|
|
|
|
// attempt to withdraw with player 1, it should fail
|
|
vm.expectRevert();
|
|
raid_geld.withdraw();
|
|
}
|
|
|
|
function test_05_raid() public {
|
|
// Let some time pass so we dont start at block timestamp 0
|
|
vm.warp(120);
|
|
|
|
// Register player 1
|
|
vm.startPrank(player1);
|
|
registerPlayer();
|
|
|
|
|
|
uint256 balance = raid_geld.balanceOf(player1);
|
|
uint256 total_minted = raid_geld.total_minted();
|
|
|
|
// Trigger raid funds minting
|
|
raid_geld.raid();
|
|
|
|
// New balance should be larger
|
|
uint256 newBalance = raid_geld.balanceOf(player1);
|
|
uint256 newTotalMinted = raid_geld.total_minted();
|
|
Player memory player = raid_geld.getPlayer(player1);
|
|
uint256 last_raided_at = player.last_raided_at;
|
|
|
|
assertLt(balance, newBalance);
|
|
assertLt(total_minted, newTotalMinted);
|
|
|
|
// Expect fail if we raid again, we need to wait a bit
|
|
vm.expectRevert();
|
|
raid_geld.raid();
|
|
|
|
// After wait time passes raid should work again
|
|
vm.warp(block.timestamp + raid_geld.RAID_WAIT());
|
|
raid_geld.raid();
|
|
|
|
// Balance should reflect that
|
|
uint256 newestBalance = raid_geld.balanceOf(player1);
|
|
uint256 newestTotalMinted = raid_geld.total_minted();
|
|
player = raid_geld.getPlayer(player1);
|
|
uint256 last_raided_at_2 = player.last_raided_at;
|
|
assertLt(newTotalMinted, newestTotalMinted);
|
|
assertLt(newBalance, newestBalance);
|
|
assertLt(last_raided_at, last_raided_at_2);
|
|
}
|
|
|
|
function test_06_is_registered() public {
|
|
bool is_registered = raid_geld.isRegistered(player1);
|
|
assertEq(is_registered, false);
|
|
vm.startPrank(player1);
|
|
registerPlayer();
|
|
is_registered = raid_geld.isRegistered(player1);
|
|
assertEq(is_registered, true);
|
|
}
|
|
}
|