From 78f776a954a080958129de4a9a183d5a4b82d073 Mon Sep 17 00:00:00 2001 From: Omid Bodaghi Date: Sat, 1 Feb 2025 11:11:56 -0800 Subject: [PATCH] Add testFulFillRandomWordsPicksAWinnerResetsAndSendMoney test --- script/Interactions.s.sol | 2 +- src/Raffle.sol | 8 ++++++++ test/unit/RaffleTest.s.sol | 37 +++++++++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 1 deletion(-) diff --git a/script/Interactions.s.sol b/script/Interactions.s.sol index 6138eaa..fe1c01b 100644 --- a/script/Interactions.s.sol +++ b/script/Interactions.s.sol @@ -50,7 +50,7 @@ contract FundSubscription is Script, CodeConstants { if (block.chainid == LOCAL_CHAIN_ID) { vm.startBroadcast(); - VRFCoordinatorV2_5Mock(vrfCoordinator).fundSubscription(subscriptionId, FUND_AMOUNT); + VRFCoordinatorV2_5Mock(vrfCoordinator).fundSubscription(subscriptionId, FUND_AMOUNT * 100); vm.stopBroadcast(); } else { vm.startBroadcast(); diff --git a/src/Raffle.sol b/src/Raffle.sol index f1c18ea..792cd86 100644 --- a/src/Raffle.sol +++ b/src/Raffle.sol @@ -149,4 +149,12 @@ contract Raffle is VRFConsumerBaseV2Plus { function getPlayer(uint256 index) external view returns (address) { return s_players[index]; } + + function getLastTimeStamp() external view returns (uint256) { + return s_lastTimeStamp; + } + + function getRecentWinner() external view returns (address) { + return s_recentWinner; + } } diff --git a/test/unit/RaffleTest.s.sol b/test/unit/RaffleTest.s.sol index a2ced90..d17b415 100644 --- a/test/unit/RaffleTest.s.sol +++ b/test/unit/RaffleTest.s.sol @@ -6,6 +6,7 @@ import {DeployRaffle} from "../../script/DeployRaffle.s.sol"; import {HelperConfig} from "../../script/HelperConfig.s.sol"; import {Raffle} from "../../src/Raffle.sol"; import {Vm} from "forge-std/Vm.sol"; +import {VRFCoordinatorV2_5Mock} from "@chainlink/contracts/src/v0.8/vrf/mocks/VRFCoordinatorV2_5Mock.sol"; contract RaffleTest is Test { Raffle public raffle; @@ -136,4 +137,40 @@ contract RaffleTest is Test { assert(uint256(requestId) > 0); assert(uint256(raffleState) == 1); } + + // FULFILL RANDOM WORDS + function testFulfillRandomWordsCanOnlyBeCalledAfterPerformUpkeep(uint256 randomRequestId) public raffleEntered { + vm.expectRevert(VRFCoordinatorV2_5Mock.InvalidRequest.selector); + VRFCoordinatorV2_5Mock(vrfCoordinator).fulfillRandomWords(randomRequestId, address(raffle)); + } + + function testFulFillRandomWordsPicksAWinnerResetsAndSendMoney() public raffleEntered { + uint256 additionalEntrants = 3; + uint256 startingIndex = 1; + address expectedWinner = address(1); + for (uint256 i = 1; i < startingIndex + additionalEntrants; i++) { + address newPlayer = address(uint160(i)); + hoax(newPlayer, 1 ether); + raffle.enterRaffle{value: entranceFee}(); + } + uint256 startingTimeStamp = raffle.getLastTimeStamp(); + uint256 winnerStartingBalance = expectedWinner.balance; + + vm.recordLogs(); + raffle.performUpkeep(""); + Vm.Log[] memory entries = vm.getRecordedLogs(); + bytes32 requestId = entries[1].topics[1]; + VRFCoordinatorV2_5Mock(vrfCoordinator).fulfillRandomWords(uint256(requestId), address(raffle)); + + address recentWinner = raffle.getRecentWinner(); + Raffle.RaffleState raffleState = raffle.getRaffleState(); + uint256 winnerBalance = recentWinner.balance; + uint256 endingTimeStamp = raffle.getLastTimeStamp(); + uint256 prize = entranceFee * (additionalEntrants + 1); + + assert(recentWinner == expectedWinner); + assert(uint256(raffleState) == 0); + assert(winnerBalance == winnerStartingBalance + prize); + assert(endingTimeStamp > startingTimeStamp); + } }