@@ -154,6 +154,15 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa
154
154
_;
155
155
}
156
156
157
+ modifier onlyPendingDispute (bytes32 _disputeID ) {
158
+ require (isDisputeCreated (_disputeID), "Dispute does not exist " );
159
+ require (
160
+ disputes[_disputeID].status == IDisputeManager.DisputeStatus.Pending,
161
+ "Dispute must be pending "
162
+ );
163
+ _;
164
+ }
165
+
157
166
// -- Functions --
158
167
159
168
/**
@@ -290,7 +299,7 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa
290
299
* @param _disputeID True if dispute already exists
291
300
*/
292
301
function isDisputeCreated (bytes32 _disputeID ) public view override returns (bool ) {
293
- return disputes[_disputeID].fisherman != address ( 0 ) ;
302
+ return disputes[_disputeID].status != DisputeStatus.Null ;
294
303
}
295
304
296
305
/**
@@ -479,7 +488,8 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa
479
488
_fisherman,
480
489
_deposit,
481
490
0 , // no related dispute,
482
- DisputeType.QueryDispute
491
+ DisputeType.QueryDispute,
492
+ IDisputeManager.DisputeStatus.Pending
483
493
);
484
494
485
495
emit QueryDisputeCreated (
@@ -546,7 +556,8 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa
546
556
_fisherman,
547
557
_deposit,
548
558
0 ,
549
- DisputeType.IndexingDispute
559
+ DisputeType.IndexingDispute,
560
+ IDisputeManager.DisputeStatus.Pending
550
561
);
551
562
552
563
emit IndexingDisputeCreated (disputeID, alloc.indexer, _fisherman, _deposit, _allocationID);
@@ -562,8 +573,16 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa
562
573
* @notice Accept a dispute with ID `_disputeID`
563
574
* @param _disputeID ID of the dispute to be accepted
564
575
*/
565
- function acceptDispute (bytes32 _disputeID ) external override onlyArbitrator {
566
- Dispute memory dispute = _resolveDispute (_disputeID);
576
+ function acceptDispute (bytes32 _disputeID )
577
+ external
578
+ override
579
+ onlyArbitrator
580
+ onlyPendingDispute (_disputeID)
581
+ {
582
+ Dispute storage dispute = disputes[_disputeID];
583
+
584
+ // store the dispute status
585
+ dispute.status = IDisputeManager.DisputeStatus.Accepted;
567
586
568
587
// Slash
569
588
(, uint256 tokensToReward ) = _slashIndexer (
@@ -575,8 +594,9 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa
575
594
// Give the fisherman their deposit back
576
595
TokenUtils.pushTokens (graphToken (), dispute.fisherman, dispute.deposit);
577
596
578
- // Resolve the conflicting dispute if any
579
- _resolveDisputeInConflict (dispute);
597
+ if (_isDisputeInConflict (dispute)) {
598
+ rejectDispute (dispute.relatedDisputeID);
599
+ }
580
600
581
601
emit DisputeAccepted (
582
602
_disputeID,
@@ -591,8 +611,16 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa
591
611
* @notice Reject a dispute with ID `_disputeID`
592
612
* @param _disputeID ID of the dispute to be rejected
593
613
*/
594
- function rejectDispute (bytes32 _disputeID ) external override onlyArbitrator {
595
- Dispute memory dispute = _resolveDispute (_disputeID);
614
+ function rejectDispute (bytes32 _disputeID )
615
+ public
616
+ override
617
+ onlyArbitrator
618
+ onlyPendingDispute (_disputeID)
619
+ {
620
+ Dispute storage dispute = disputes[_disputeID];
621
+
622
+ // store dispute status
623
+ dispute.status = IDisputeManager.DisputeStatus.Rejected;
596
624
597
625
// Handle conflicting dispute if any
598
626
require (
@@ -611,52 +639,48 @@ contract DisputeManager is DisputeManagerV1Storage, GraphUpgradeable, IDisputeMa
611
639
* @notice Ignore a dispute with ID `_disputeID`
612
640
* @param _disputeID ID of the dispute to be disregarded
613
641
*/
614
- function drawDispute (bytes32 _disputeID ) external override onlyArbitrator {
615
- Dispute memory dispute = _resolveDispute (_disputeID);
642
+ function drawDispute (bytes32 _disputeID )
643
+ public
644
+ override
645
+ onlyArbitrator
646
+ onlyPendingDispute (_disputeID)
647
+ {
648
+ Dispute storage dispute = disputes[_disputeID];
616
649
617
650
// Return deposit to the fisherman
618
651
TokenUtils.pushTokens (graphToken (), dispute.fisherman, dispute.deposit);
619
652
620
- // Resolve the conflicting dispute if any
621
- _resolveDisputeInConflict (dispute);
622
-
623
- emit DisputeDrawn (_disputeID, dispute.indexer, dispute.fisherman, dispute.deposit);
624
- }
625
-
626
- /**
627
- * @dev Resolve a dispute by removing it from storage and returning a memory copy.
628
- * @param _disputeID ID of the dispute to resolve
629
- * @return Dispute
630
- */
631
- function _resolveDispute (bytes32 _disputeID ) private returns (Dispute memory ) {
632
- require (isDisputeCreated (_disputeID), "Dispute does not exist " );
653
+ // resolve related dispute if any
654
+ _drawDisputeInConflict (dispute);
633
655
634
- Dispute memory dispute = disputes[_disputeID];
656
+ // store dispute status
657
+ dispute.status = IDisputeManager.DisputeStatus.Drawn;
635
658
636
- // Resolve dispute
637
- delete disputes[_disputeID]; // Re-entrancy
638
-
639
- return dispute;
659
+ emit DisputeDrawn (_disputeID, dispute.indexer, dispute.fisherman, dispute.deposit);
640
660
}
641
661
642
662
/**
643
663
* @dev Returns whether the dispute is for a conflicting attestation or not.
644
664
* @param _dispute Dispute
645
665
* @return True conflicting attestation dispute
646
666
*/
647
- function _isDisputeInConflict (Dispute memory _dispute ) private pure returns (bool ) {
648
- return _dispute.relatedDisputeID != 0 ;
667
+ function _isDisputeInConflict (Dispute memory _dispute ) private view returns (bool ) {
668
+ bytes32 relatedID = _dispute.relatedDisputeID;
669
+ // this is so the check returns false when rejecting the related dispute.
670
+ return
671
+ relatedID != 0 && disputes[relatedID].status == IDisputeManager.DisputeStatus.Pending;
649
672
}
650
673
651
674
/**
652
675
* @dev Resolve the conflicting dispute if there is any for the one passed to this function.
653
676
* @param _dispute Dispute
654
677
* @return True if resolved
655
678
*/
656
- function _resolveDisputeInConflict (Dispute memory _dispute ) private returns (bool ) {
679
+ function _drawDisputeInConflict (Dispute memory _dispute ) private returns (bool ) {
657
680
if (_isDisputeInConflict (_dispute)) {
658
681
bytes32 relatedDisputeID = _dispute.relatedDisputeID;
659
- delete disputes[relatedDisputeID];
682
+ Dispute storage relatedDispute = disputes[relatedDisputeID];
683
+ relatedDispute.status = IDisputeManager.DisputeStatus.Drawn;
660
684
return true ;
661
685
}
662
686
return false ;
0 commit comments