@@ -39,14 +39,17 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
3939 uint256 public immutable deadline;
4040 uint256 public immutable ticketPrice; // Fee per ticket in wei
4141 uint256 public platformFees; // Fees collected to subsidize gas costs for automated game closure and winner selection.
42+
4243
4344 // Prize pool accounting
4445 uint256 public prizePool; // Total prize (excludes trigger reward)
46+ uint256 public triggerRewardPool;
47+ uint256 public finalizerRewardPool;
4548
4649
4750 // VRF tracking
4851 uint256 private vrfRequestTimestamp; // Timestamp of last randomness request
49- uint256 public immutable _TIMEOUT ; // How long before VRF can be considered timed out
52+ uint256 public immutable i_vrfTimeOut ; // How long before VRF can be considered timed out
5053 uint256 public constant MAX_TICKETS_PER_TX = 100 ;
5154
5255 // Outcome variables
@@ -127,7 +130,7 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
127130 _CALLBACKGASLIMIT = _callbackGasLimit;
128131 _REQUESTCONFIRMATIONS = _requestConfirmations;
129132 _NUMWORDS = _numWords;
130- _TIMEOUT = _vrfRequestTimeoutSeconds;
133+ i_vrfTimeOut = _vrfRequestTimeoutSeconds;
131134 }
132135
133136 // --- Core functions ---
@@ -147,12 +150,12 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
147150 uint256 operationalCost = ticketCost / 100 ; // 1% fee for operations
148151 uint totalCost = ticketCost + operationalCost;
149152
150- bool success = i_paymentToken.safeTransferFrom (
153+ i_paymentToken.safeTransferFrom (
151154 msg .sender ,
152155 address (this ),
153156 totalCost
154157 );
155- require (success, " TRANSFER_FAILED: Check Balance " );
158+
156159 // Store unique players's address only once
157160 if (ticketCount[msg .sender ] == 0 ) {
158161 players.push (msg .sender );
@@ -197,19 +200,19 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
197200 uint256 totalBalance = i_paymentToken.balanceOf (address (this ));
198201 prizePool = totalBalance - platformFees; // Set the prize pool for claiming
199202
200- uint256 rewardAmount = platformFees / 2 ; // Use 50% for reward
201- platformFees -= rewardAmount;
203+ pendingRewards[msg .sender ] += platformFees;
204+ emit TriggerRewardScheduled (msg .sender , platformFees);
205+ platformFees = 0 ;
202206
203207 lotteryState = LotteryState.FINISHED;
204208 emit WinnerSelected (winner);
205209 return ;
206210 }
207211
208- // Compute rewards and prize pool
209- uint256 totalBalance = i_paymentToken.balanceOf (address (this ));
210- prizePool = totalBalance - platformFees;
211- uint256 rewardAmount = platformFees / 2 ; // use 50% for reward
212- platformFees -= rewardAmount;
212+ // Compute rewards
213+
214+ triggerRewardPool = platformFees / 2 ; // use 50% for reward
215+ finalizerRewardPool = platformFees - triggerRewardPool; // rest 50% for finalize reward, paid only after VRF
213216
214217
215218 lotteryState = LotteryState.CALCULATING;
@@ -236,10 +239,11 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
236239 vrfRequestTimestamp = block .timestamp ;
237240
238241 // Reward caller who triggered VRF
239- pendingRewards[msg .sender ] += rewardAmount;
240-
242+ pendingRewards[msg .sender ] += triggerRewardPool;
243+ emit TriggerRewardScheduled (msg .sender , triggerRewardPool);
244+ triggerRewardPool = 0 ;
241245
242- emit TriggerRewardScheduled ( msg . sender , rewardAmount);
246+
243247 emit WinnerRequested (s_requestId);
244248 }
245249
@@ -250,7 +254,7 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
250254
251255 pendingRewards[msg .sender ] = 0 ;
252256
253- bool success = i_paymentToken.safeTransfer (msg .sender , amt);
257+ i_paymentToken.safeTransfer (msg .sender , amt);
254258
255259 emit TriggerRewardWithdrawn (msg .sender , amt);
256260 }
@@ -329,10 +333,14 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
329333
330334 lotteryState = LotteryState.FINISHED;
331335
332- fulfillCallReward[msg .sender ] = platformFees;
333- platformFees = 0 ;
336+ uint256 totalBalance = i_paymentToken.balanceOf (address (this ));
337+ prizePool = totalBalance - platformFees;
338+
339+ fulfillCallReward[msg .sender ] = finalizerRewardPool;
340+ emit FulfillCallRewardScheduled (msg .sender , fulfillCallRewardPool);
341+ finalizerRewardPool = 0 ;
334342
335- emit FulfillCallRewardScheduled ( msg . sender , fulfillCallReward[ msg . sender ]);
343+
336344 emit WinnerSelected (winner);
337345 }
338346
@@ -343,16 +351,16 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
343351
344352 fulfillCallReward[msg .sender ] = 0 ;
345353
346- bool success = i_paymentToken.safeTransfer (msg .sender , amt);
354+ i_paymentToken.safeTransfer (msg .sender , amt);
347355
348356 emit FulfillCallRewardWithdrawn (msg .sender , amt);
349357 }
350358
351359 // Cancel if VRF response has timed out
352- function cancelIfTimedOut () external {
360+ function cancelIfTimedOut () external nonReentrant {
353361 require (lotteryState == LotteryState.CALCULATING, "BAD_STATE " );
354362 require (vrfRequestTimestamp != 0 , "NO_VRF_REQUEST " );
355- require (block .timestamp >= vrfRequestTimestamp + _TIMEOUT , "NOT_TIMED_OUT " );
363+ require (block .timestamp >= vrfRequestTimestamp + i_vrfTimeOut , "NOT_TIMED_OUT " );
356364
357365 uint256 cancelRewardAmount = platformFees;
358366 platformFees = 0 ;
@@ -362,7 +370,7 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
362370 vrfRequestTimestamp = 0 ;
363371
364372 emit LotteryCancelled ("VRF Timeout " );
365- emit CancelTimeoutRewardScheduled (msg .sender , uint256 cancelRewardAmount );
373+ emit CancelTimeoutRewardScheduled (msg .sender , cancelRewardAmount);
366374 }
367375
368376 // Allows caller to withdraw cancelTimeout function call reward
@@ -372,7 +380,7 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
372380
373381 cancelTimeoutReward[msg .sender ] = 0 ;
374382
375- bool success = i_paymentToken.safeTransfer (msg .sender , amt);
383+ i_paymentToken.safeTransfer (msg .sender , amt);
376384
377385 emit CancelTimeoutRewardWithdrawn (msg .sender , amt);
378386
@@ -387,7 +395,7 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
387395 uint256 prizeMoney = prizePool;
388396 prizeClaimed = true ;
389397 prizePool = 0 ;
390- bool success = i_paymentToken.safeTransfer (msg .sender , prizeMoney);
398+ i_paymentToken.safeTransfer (msg .sender , prizeMoney);
391399
392400 emit PrizeClaimed (msg .sender , prizeMoney);
393401 }
@@ -401,7 +409,7 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
401409 ticketCount[msg .sender ] = 0 ;
402410 uint256 refundAmount = ticketsBought * ticketPrice;
403411
404- bool success = i_paymentToken.safeTransfer (msg .sender ,refundAmount);
412+ i_paymentToken.safeTransfer (msg .sender ,refundAmount);
405413
406414 emit RefundClaimed (msg .sender , refundAmount);
407415 }
@@ -415,26 +423,26 @@ contract Lottery is VRFConsumerBaseV2Plus, ReentrancyGuard {
415423 }
416424
417425 /**
418- * @notice Returns whether the VRF request has timed out and how much time is left
419- * @return shouldCancel True if timeout has expired and cancelIfTimedOut() can be safely called.
426+ * @dev Returns whether the VRF request has timed out and how much time is left
427+ * @return shouldCancel True if timeout has expired and cancelIfTimedOut() can be safely called.
420428 * @return timeRemainingSeconds Remaining seconds untill timeout expires (0 if expired or not applicable)
421- */
422- function VRFRequestTimeOutStatus () external view returns (bool shouldCancel , uint256 seconds ) {
429+ */
430+ function VRFRequestTimeOutStatus () external view returns (bool shouldCancel , uint256 timeRemaining ) {
423431 // If contract is not waiting for a VRF fufillment, no timeout check required
424432
425433 if (lotteryState != LotteryState.CALCULATING || vrfRequestTimestamp == 0 ) {
426434 return (false , 0 ); // No timeout check required
427435 }
428436
429- uint256 timeOutAt = vrfRequestTimestamp+ _TIMEOUT ;
437+ uint256 timeOutAt = vrfRequestTimestamp+ i_vrfTimeOut ;
430438
431439 // If timeout passed, return 0 (no time left)
432440 if (block .timestamp >= timeOutAt){
433441 return (true , 0 );
434442 }
435443
436444 // Otherwise, return how many seconds are left
437- return timeOutAt - block .timestamp ;
445+ return ( false , timeOutAt - block .timestamp ) ;
438446 }
439447
440448 // --- View helpers ---
0 commit comments