// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; import "forge-std/Test.sol"; import {Main} from "../src/Main.sol"; import {Unaboomer} from "../src/Unaboomer.sol"; import {Mailbomb} from "../src/Mailbomb.sol"; contract UnaboomerTest is Test { Main public main; Unaboomer public boomr; Mailbomb public bomb; function setUp() public { main = new Main(); boomr = new Unaboomer(); bomb = new Mailbomb(); boomr.setMainContract(address(main)); bomb.setMainContract(address(main)); main.setUnaboomerContract(address(boomr)); main.setMailbombContract(address(bomb)); } function testBasicMechanics() public { address t1 = address(1); address t2 = address(2); // mint 20 boomers - should have 20 BOOMR and 40 BOMB hoax(t1); main.radicalizeBoomers{value: .2 ether}(20); assertEq(boomr.totalSupply(), 20); assertEq(boomr.balanceOf(t1), 20); assertEq(bomb.bombsAssembled(), 40); assertEq(bomb.balanceOf(t1, 1), 40); // mint 20 more bombs - should have 60 BOMB hoax(t1); main.assembleBombs{value: .2 ether}(20); assertEq(bomb.bombsAssembled(), 60); assertEq(bomb.balanceOf(t1, 1), 60); // mint 20 more boomers as other address - supplies should line up hoax(t2); main.radicalizeBoomers{value: .2 ether}(20); assertEq(boomr.totalSupply(), 40); assertEq(boomr.balanceOf(t2), 20); assertEq(bomb.bombsAssembled(), 100); assertEq(bomb.balanceOf(t2, 1), 40); // sending bombs should change supplies and update kill count hoax(t1); main.sendBombs(40); assertEq(bomb.balanceOf(t1, 1), 20); assertEq(boomr.totalKillCount() > 0, true); console.log(boomr.totalKillCount()); } function testSendingBombs() public { hoax(address(1)); main.radicalizeBoomers{value: .5 ether}(50); hoax(address(2)); main.radicalizeBoomers{value: .1 ether}(10); hoax(address(3)); main.radicalizeBoomers{value: .03 ether}(3); hoax(address(4)); main.radicalizeBoomers{value: .15 ether}(15); hoax(address(4)); main.sendBombs(10); hoax(address(3)); main.sendBombs(6); hoax(address(2)); main.sendBombs(10); hoax(address(1)); main.sendBombs(20); uint256 ptr = main.leaderboardPointer(); address leader = main.leaderboard(ptr); uint256 killcount = main.killCount(leader); } function testSendingBombsAgain() public { hoax(address(1)); main.radicalizeBoomers{value: 10 ether}(1000); hoax(address(1)); main.sendBombs(10); } function testKilling() public { address t = address(1); startHoax(t); main.assembleBombs{value: .1 ether}(10); vm.expectRevert(bytes("not enough supply")); main.sendBombs(10); main.radicalizeBoomers{value: .1 ether}(10); main.sendBombs(10); assertEq(bomb.balanceOf(t, 1), 20); } function testFailDirectFunctions() public { address t = address(1); startHoax(t); boomr.radicalize(t, 10); boomr.die(1); bomb.create(t, 10); bomb.explode(t, 10); } function testURILogic() public { address t = address(1); boomr.setAliveURI('ipfs://alive/'); boomr.setDeadURI('ipfs://dead/'); startHoax(t); main.radicalizeBoomers{value: .01 ether}(1); assertEq(boomr.tokenURI(0), 'ipfs://alive/0.json'); main.sendBombs(1); assertEq(boomr.tokenURI(0), 'ipfs://dead/0.json'); } }