@@ -525,29 +525,27 @@ contract KlerosCore is IArbitrator {
525525 lastPhaseChange = block .timestamp ;
526526 emit NewPhase (phase);
527527 } else if (phase == Phase.freezing) {
528- if (block .timestamp - lastPhaseChange >= maxFreezingTime) {
529- // Enough time spent in Freezing already.
530- phase = Phase.staking;
531- lastPhaseChange = block .timestamp ;
532- emit NewPhase (phase);
533- } else {
534- // Check if all the DKs which needed the Freezing phase are ready for Staking phase.
535- for (uint256 i = 0 ; i < disputesKitIDsThatNeedFreezing.length ; i++ ) {
536- require (
537- disputeKitNodes[disputesKitIDsThatNeedFreezing[i]].disputeKit.isResolving (),
538- "A dispute kit has not passed to Resolving phase "
539- );
540-
541- if (disputeKitNodes[disputesKitIDsThatNeedFreezing[i]].disputeKit.disputesWithoutJurors () == 0 ) {
528+ bool freezingPhaseFinished = block .timestamp - lastPhaseChange >= maxFreezingTime;
529+ for (uint256 i = disputesKitIDsThatNeedFreezing.length - 1 ; i >= 0 ; -- i) {
530+ IDisputeKit disputeKit = disputeKitNodes[disputesKitIDsThatNeedFreezing[i]].disputeKit;
531+ if (freezingPhaseFinished && ! disputeKit.isResolving ()) {
532+ // Force the dispute kit to be ready for Staking phase.
533+ disputeKit.passPhase (); // Warning: don't call if already in Resolving phase, because it reverts.
534+ require (disputeKit.isResolving (), "A dispute kit has not passed to Resolving phase " );
535+ } else {
536+ // Check if the dispute kit is ready for Staking phase.
537+ require (disputeKit.isResolving (), "A dispute kit has not passed to Resolving phase " );
538+
539+ if (disputeKit.disputesWithoutJurors () == 0 ) {
542540 // The dispute kit had time to finish drawing jurors for all its disputes.
543541 disputeKitNodes[disputesKitIDsThatNeedFreezing[i]].needsFreezing = false ;
544- delete disputesKitIDsThatNeedFreezing[i] ;
542+ disputesKitIDsThatNeedFreezing. pop () ;
545543 }
546544 }
547- phase = Phase.staking;
548- lastPhaseChange = block .timestamp ;
549- emit NewPhase (phase);
550545 }
546+ phase = Phase.staking;
547+ lastPhaseChange = block .timestamp ;
548+ emit NewPhase (phase);
551549 }
552550 }
553551
0 commit comments