@@ -876,7 +876,6 @@ contract FilecoinWarmStorageService is
876876                revert  Errors.InvalidChallengeEpoch (dataSetId, minWindow, maxWindow, challengeEpoch);
877877            }
878878            provingDeadlines[dataSetId] =  firstDeadline;
879-             provenThisPeriod[dataSetId] =  false ;
880879
881880            // Initialize the activation epoch when proving first starts 
882881            // This marks when the data set became active for proving 
@@ -926,15 +925,6 @@ contract FilecoinWarmStorageService is
926925            emit  FaultRecord (dataSetId, faultPeriods, provingDeadlines[dataSetId]);
927926        }
928927
929-         // Record the status of the current/previous proving period that's ending 
930-         if  (provingDeadlines[dataSetId] !=  NO_PROVING_DEADLINE &&  provenThisPeriod[dataSetId]) {
931-             // Determine the period ID that just completed 
932-             uint256  completedPeriodId =  getProvingPeriodForEpoch (dataSetId, provingDeadlines[dataSetId] -  1 );
933- 
934-             // Record whether this period was proven 
935-             provenPeriods[dataSetId][completedPeriodId >>  8 ] |=  1  <<  (completedPeriodId &  255 );
936-         }
937- 
938928        provingDeadlines[dataSetId] =  nextDeadline;
939929        provenThisPeriod[dataSetId] =  false ;
940930
@@ -1179,8 +1169,10 @@ contract FilecoinWarmStorageService is
11791169     * @return The period ID this epoch belongs to, or type(uint256).max if before activation 
11801170     */ 
11811171    function getProvingPeriodForEpoch  (uint256  dataSetId , uint256  epoch ) public  view  returns  (uint256 ) {
1182-         uint256  activationEpoch =  provingActivationEpoch[dataSetId];
1172+         return  _provingPeriodForEpoch (provingActivationEpoch[dataSetId], epoch);
1173+     }
11831174
1175+     function _provingPeriodForEpoch  (uint256  activationEpoch , uint256  epoch ) internal  view  returns  (uint256 ) {
11841176        // If proving wasn't activated or epoch is before activation 
11851177        if  (activationEpoch ==  0  ||  epoch <  activationEpoch) {
11861178            return  type (uint256 ).max; // Invalid period 
@@ -1484,78 +1476,71 @@ contract FilecoinWarmStorageService is
14841476            });
14851477        }
14861478
1487-         // Count proven epochs and find the last proven epoch  
1488-         (uint256  provenEpochCount , uint256  lastProvenEpoch ) = 
1479+         // Count proven epochs up to toEpoch, possibly stopping earlier if unresolved  
1480+         (uint256  provenEpochCount , uint256  settleUpTo ) = 
14891481            _findProvenEpochs (dataSetId, fromEpoch, toEpoch, activationEpoch);
14901482
14911483        // If no epochs are proven, we can't settle anything 
14921484        if  (provenEpochCount ==  0 ) {
14931485            return  ValidationResult ({
14941486                modifiedAmount: 0 ,
1495-                 settleUpto: fromEpoch ,
1487+                 settleUpto: settleUpTo ,
14961488                note: "No proven epochs in the requested range " 
14971489            });
14981490        }
14991491
15001492        // Calculate the modified amount based on proven epochs 
15011493        uint256  modifiedAmount =  (proposedAmount *  provenEpochCount) /  totalEpochsRequested;
15021494
1503-         return  ValidationResult ({
1504-             modifiedAmount: modifiedAmount,
1505-             settleUpto: lastProvenEpoch, // Settle up to the last proven epoch 
1506-             note: "" 
1507-         });
1495+         return  ValidationResult ({modifiedAmount: modifiedAmount, settleUpto: settleUpTo, note: "" });
15081496    }
15091497
15101498    function _findProvenEpochs  (uint256  dataSetId , uint256  fromEpoch , uint256  toEpoch , uint256  activationEpoch )
15111499        internal 
15121500        view 
1513-         returns  (uint256  provenEpochCount , uint256  settledUpTo )
1501+         returns  (uint256  provenEpochCount , uint256  settleUpTo )
15141502    {
15151503        require (toEpoch >=  activationEpoch &&  toEpoch <=  block .number , Errors.InvalidEpochRange (fromEpoch, toEpoch));
1516-         uint256  currentPeriod =  getProvingPeriodForEpoch (dataSetId, block .number );
1517- 
15181504        if  (fromEpoch <  activationEpoch -  1 ) {
15191505            fromEpoch =  activationEpoch -  1 ;
15201506        }
15211507
1522-         uint256  startingPeriod =  getProvingPeriodForEpoch (dataSetId , fromEpoch +  1 );
1508+         uint256  startingPeriod =  _provingPeriodForEpoch (activationEpoch , fromEpoch +  1 );
15231509
1524-         // handle first period separately 
1510+         // handle first period separately; it may be partially settled already  
15251511        uint256  startingPeriodDeadline =  _calcPeriodDeadline (activationEpoch, startingPeriod);
15261512
15271513        if  (toEpoch <  startingPeriodDeadline) {
1528-             if  (_isPeriodProven (dataSetId, startingPeriod, currentPeriod )) {
1514+             if  (_isPeriodProven (dataSetId, startingPeriod)) {
15291515                provenEpochCount =  toEpoch -  fromEpoch;
1530-                 settledUpTo =  toEpoch;
1516+                 settleUpTo =  toEpoch;
1517+             } else  {
1518+                 settleUpTo =  fromEpoch;
15311519            }
15321520        } else  {
1533-             if  (_isPeriodProven (dataSetId, startingPeriod, currentPeriod )) {
1521+             if  (_isPeriodProven (dataSetId, startingPeriod)) {
15341522                provenEpochCount +=  (startingPeriodDeadline -  fromEpoch);
15351523            }
15361524
1537-             uint256  endingPeriod =  getProvingPeriodForEpoch (dataSetId , toEpoch);
1525+             uint256  endingPeriod =  _provingPeriodForEpoch (activationEpoch , toEpoch);
15381526            // loop through the proving periods between startingPeriod and endingPeriod 
15391527            for  (uint256  period =  startingPeriod +  1 ; period <  endingPeriod; period++ ) {
1540-                 if  (_isPeriodProven (dataSetId, period, currentPeriod )) {
1528+                 if  (_isPeriodProven (dataSetId, period)) {
15411529                    provenEpochCount +=  maxProvingPeriod;
15421530                }
15431531            }
1544-             settledUpTo  =  _calcPeriodDeadline (activationEpoch, endingPeriod -  1 );
1532+             settleUpTo  =  _calcPeriodDeadline (activationEpoch, endingPeriod -  1 );
15451533
15461534            // handle the last period separately 
1547-             if  (_isPeriodProven (dataSetId, endingPeriod, currentPeriod )) {
1548-                 provenEpochCount +=  (toEpoch -  settledUpTo );
1549-                 settledUpTo  =  toEpoch;
1535+             if  (_isPeriodProven (dataSetId, endingPeriod)) {
1536+                 provenEpochCount +=  (toEpoch -  settleUpTo );
1537+                 settleUpTo  =  toEpoch;
15501538            }
15511539        }
1552-         return  (provenEpochCount, settledUpTo );
1540+         return  (provenEpochCount, settleUpTo );
15531541    }
15541542
1555-     function _isPeriodProven  (uint256  dataSetId , uint256  periodId , uint256  currentPeriod ) private  view  returns  (bool ) {
1556-         if  (periodId ==  currentPeriod) {
1557-             return  provenThisPeriod[dataSetId];
1558-         }
1543+     function _isPeriodProven  (uint256  dataSetId , uint256  periodId ) private  view  returns  (bool ) {
15591544        uint256  isProven =  provenPeriods[dataSetId][periodId >>  8 ] &  (1  <<  (periodId &  255 ));
15601545        return  isProven !=  0 ;
15611546    }
0 commit comments