The battle() function emits an incorrect winner value in some cases.
function testBattleEmitsIncorrectWinner(uint256 blockNumber) public twoSkilledRappers {
uint256 initialDefenderBalance = cred.balanceOf(user);
vm.startPrank(user);
oneShot.approve(address(rapBattle), 0);
cred.approve(address(rapBattle), 3);
rapBattle.goOnStageOrBattle(0, 3);
vm.stopPrank();
vm.startPrank(challenger);
oneShot.approve(address(rapBattle), 1);
cred.approve(address(rapBattle), 3);
vm.stopPrank();
vm.assume(blockNumber < type(uint256).max / 12);
vm.roll(blockNumber);
vm.warp(blockNumber * 12);
uint256 loop = 0;
uint256 defenderRapperSkill = rapBattle.getRapperSkill(0);
uint256 challengerRapperSkill = rapBattle.getRapperSkill(1);
uint256 totalBattleSkill = defenderRapperSkill + challengerRapperSkill;
address eventWinner;
do {
loop++;
vm.roll(block.number + 1);
vm.warp(block.timestamp + 12);
vm.prevrandao(keccak256(abi.encodePacked(block.number)));
uint256 random = uint256(keccak256(abi.encodePacked(block.timestamp, block.prevrandao, challenger))) % totalBattleSkill;
if (random == defenderRapperSkill) {
vm.prank(challenger);
vm.recordLogs();
rapBattle.goOnStageOrBattle(0, 3);
Vm.Log[] memory entries = vm.getRecordedLogs();
eventWinner = address(uint160(uint256(entries[0].topics[2])));
break;
}
} while (loop < 1000);
console.log("loops", loop);
uint256 finalDefenderBalance = cred.balanceOf(user);
assertEq(finalDefenderBalance, initialDefenderBalance + 3);
assertEq(eventWinner, challenger);
}
Eventually, the event will emit an incorrect winner address, which can negatively affect dapps.