Skip to content

Commit fcdd0cf

Browse files
committed
fix: removed an optimistic assumption of at least 1 honest bot forcing a DK back to Resolving
And fixed an array element removal.
1 parent 4b5aff4 commit fcdd0cf

File tree

4 files changed

+24
-22
lines changed

4 files changed

+24
-22
lines changed

contracts/src/arbitration/IDisputeKit.sol

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ interface IDisputeKit {
3535
uint256 _nbVotes
3636
) external;
3737

38+
/** @dev Passes the phase.
39+
*/
40+
function passPhase() external;
41+
3842
/** @dev Draws the juror from the sortition tree. The drawn address is picked up by Kleros Core.
3943
* Note: Access restricted to Kleros Core only.
4044
* @param _coreDisputeID The ID of the dispute in Kleros Core, not in the Dispute Kit.

contracts/src/arbitration/KlerosCore.sol

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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

contracts/src/arbitration/dispute-kits/DisputeKitClassic.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,8 @@ contract DisputeKitClassic is BaseDisputeKit, IEvidence {
186186

187187
/** @dev Passes the phase.
188188
*/
189-
function passPhase() external {
190-
if (core.phase() == KlerosCore.Phase.staking) {
189+
function passPhase() external override {
190+
if (core.phase() == KlerosCore.Phase.staking || core.isFreezingPhaseFinished()) {
191191
require(phase != Phase.resolving, "Already in Resolving phase");
192192
phase = Phase.resolving; // Safety net.
193193
} else if (core.phase() == KlerosCore.Phase.freezing) {

contracts/src/arbitration/dispute-kits/DisputeKitSybilResistant.sol

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -204,8 +204,8 @@ contract DisputeKitSybilResistant is BaseDisputeKit, IEvidence {
204204

205205
/** @dev Passes the phase.
206206
*/
207-
function passPhase() external {
208-
if (core.phase() == KlerosCore.Phase.staking) {
207+
function passPhase() external override {
208+
if (core.phase() == KlerosCore.Phase.staking || core.isFreezingPhaseFinished()) {
209209
require(phase != Phase.resolving, "Already in Resolving phase");
210210
phase = Phase.resolving; // Safety net.
211211
} else if (core.phase() == KlerosCore.Phase.freezing) {

0 commit comments

Comments
 (0)