@@ -323,11 +323,8 @@ contract DisputeManagerTest is SubgraphServiceSharedTest {
323
323
return (_disputeId1, _disputeId2);
324
324
}
325
325
326
- function _acceptDispute (bytes32 _disputeId , uint256 _tokensSlash , bool _acceptRelatedDispute ) internal {
326
+ function _acceptDispute (bytes32 _disputeId , uint256 _tokensSlash ) internal {
327
327
IDisputeManager.Dispute memory dispute = _getDispute (_disputeId);
328
- bool isDisputeInConflict = dispute.relatedDisputeId != bytes32 (0 );
329
- IDisputeManager.Dispute memory relatedDispute;
330
- if (isDisputeInConflict) relatedDispute = _getDispute (dispute.relatedDisputeId);
331
328
address fisherman = dispute.fisherman;
332
329
uint256 fishermanPreviousBalance = token.balanceOf (fisherman);
333
330
uint256 indexerTokensAvailable = staking.getProviderTokensAvailable (dispute.indexer, address (subgraphService));
@@ -343,33 +340,13 @@ contract DisputeManagerTest is SubgraphServiceSharedTest {
343
340
dispute.deposit + fishermanReward
344
341
);
345
342
346
- if (isDisputeInConflict) {
347
- if (_acceptRelatedDispute) {
348
- emit IDisputeManager.DisputeAccepted (
349
- dispute.relatedDisputeId,
350
- relatedDispute.indexer,
351
- relatedDispute.fisherman,
352
- relatedDispute.deposit
353
- );
354
- } else {
355
- emit IDisputeManager.DisputeRejected (
356
- dispute.relatedDisputeId,
357
- relatedDispute.indexer,
358
- relatedDispute.fisherman,
359
- relatedDispute.deposit
360
- );
361
- }
362
- }
363
-
364
343
// Accept the dispute
365
- disputeManager.acceptDispute (_disputeId, _tokensSlash, _acceptRelatedDispute );
344
+ disputeManager.acceptDispute (_disputeId, _tokensSlash);
366
345
367
346
// Check fisherman's got their reward and their deposit (if any) back
368
347
uint256 fishermanExpectedBalance = fishermanPreviousBalance +
369
348
fishermanReward +
370
- disputeDeposit +
371
- (isDisputeInConflict ? relatedDispute.deposit : 0 ) +
372
- ((isDisputeInConflict && _acceptRelatedDispute) ? fishermanReward : 0 );
349
+ disputeDeposit;
373
350
assertEq (
374
351
token.balanceOf (fisherman),
375
352
fishermanExpectedBalance,
@@ -378,11 +355,10 @@ contract DisputeManagerTest is SubgraphServiceSharedTest {
378
355
379
356
// Check indexer was slashed by the correct amount
380
357
uint256 expectedIndexerTokensAvailable;
381
- uint256 tokensToSlash = (isDisputeInConflict && _acceptRelatedDispute) ? _tokensSlash * 2 : _tokensSlash;
382
- if (tokensToSlash > indexerTokensAvailable) {
358
+ if (_tokensSlash > indexerTokensAvailable) {
383
359
expectedIndexerTokensAvailable = 0 ;
384
360
} else {
385
- expectedIndexerTokensAvailable = indexerTokensAvailable - tokensToSlash ;
361
+ expectedIndexerTokensAvailable = indexerTokensAvailable - _tokensSlash ;
386
362
}
387
363
assertEq (
388
364
staking.getProviderTokensAvailable (dispute.indexer, address (subgraphService)),
@@ -397,18 +373,137 @@ contract DisputeManagerTest is SubgraphServiceSharedTest {
397
373
uint8 (IDisputeManager.DisputeStatus.Accepted),
398
374
"Dispute status should be accepted "
399
375
);
376
+ }
400
377
401
- // If there's a related dispute, check it
402
- if (isDisputeInConflict) {
403
- relatedDispute = _getDispute (dispute.relatedDisputeId);
378
+ struct FishermanParams {
379
+ address fisherman;
380
+ uint256 previousBalance;
381
+ uint256 disputeDeposit;
382
+ uint256 relatedDisputeDeposit;
383
+ uint256 rewardPercentage;
384
+ uint256 rewardFirstDispute;
385
+ uint256 rewardRelatedDispute;
386
+ uint256 totalReward;
387
+ uint256 expectedBalance;
388
+ }
389
+
390
+ function _acceptDisputeConflict (bytes32 _disputeId , uint256 _tokensSlash , bool _acceptRelatedDispute , uint256 _tokensRelatedSlash ) internal {
391
+ IDisputeManager.Dispute memory dispute = _getDispute (_disputeId);
392
+ IDisputeManager.Dispute memory relatedDispute = _getDispute (dispute.relatedDisputeId);
393
+ uint256 indexerTokensAvailable = staking.getProviderTokensAvailable (dispute.indexer, address (subgraphService));
394
+ uint256 relatedIndexerTokensAvailable = staking.getProviderTokensAvailable (relatedDispute.indexer, address (subgraphService));
395
+
396
+ FishermanParams memory params;
397
+ params.fisherman = dispute.fisherman;
398
+ params.previousBalance = token.balanceOf (params.fisherman);
399
+ params.disputeDeposit = dispute.deposit;
400
+ params.relatedDisputeDeposit = relatedDispute.deposit;
401
+ params.rewardPercentage = disputeManager.fishermanRewardCut ();
402
+ params.rewardFirstDispute = _tokensSlash.mulPPM (params.rewardPercentage);
403
+ params.rewardRelatedDispute = (_acceptRelatedDispute) ? _tokensRelatedSlash.mulPPM (params.rewardPercentage) : 0 ;
404
+ params.totalReward = params.rewardFirstDispute + params.rewardRelatedDispute;
405
+
406
+ vm.expectEmit (address (disputeManager));
407
+ emit IDisputeManager.DisputeAccepted (
408
+ _disputeId,
409
+ dispute.indexer,
410
+ params.fisherman,
411
+ params.disputeDeposit + params.rewardFirstDispute
412
+ );
413
+
414
+ if (_acceptRelatedDispute) {
415
+ emit IDisputeManager.DisputeAccepted (
416
+ dispute.relatedDisputeId,
417
+ relatedDispute.indexer,
418
+ relatedDispute.fisherman,
419
+ relatedDispute.deposit + params.rewardRelatedDispute
420
+ );
421
+ } else {
422
+ emit IDisputeManager.DisputeDrawn (
423
+ dispute.relatedDisputeId,
424
+ relatedDispute.indexer,
425
+ relatedDispute.fisherman,
426
+ relatedDispute.deposit
427
+ );
428
+ }
429
+
430
+ // Accept the dispute
431
+ disputeManager.acceptDisputeConflict (_disputeId, _tokensSlash, _acceptRelatedDispute, _tokensRelatedSlash);
432
+
433
+ // Check fisherman's got their reward and their deposit back
434
+ params.expectedBalance = params.previousBalance +
435
+ params.totalReward +
436
+ params.disputeDeposit +
437
+ params.relatedDisputeDeposit;
438
+ assertEq (
439
+ token.balanceOf (params.fisherman),
440
+ params.expectedBalance,
441
+ "Fisherman should get their reward and deposit back "
442
+ );
443
+
444
+ // If both disputes are for the same indexer, check that the indexer was slashed by the correct amount
445
+ if (dispute.indexer == relatedDispute.indexer) {
446
+ uint256 tokensToSlash = (_acceptRelatedDispute) ? _tokensSlash + _tokensRelatedSlash : _tokensSlash;
447
+ uint256 expectedIndexerTokensAvailable;
448
+ if (tokensToSlash > indexerTokensAvailable) {
449
+ expectedIndexerTokensAvailable = 0 ;
450
+ } else {
451
+ expectedIndexerTokensAvailable = indexerTokensAvailable - tokensToSlash;
452
+ }
404
453
assertEq (
405
- uint8 (relatedDispute.status),
406
- _acceptRelatedDispute
407
- ? uint8 (IDisputeManager.DisputeStatus.Accepted)
408
- : uint8 (IDisputeManager.DisputeStatus.Drawn),
409
- "Related dispute status should be drawn "
454
+ staking.getProviderTokensAvailable (dispute.indexer, address (subgraphService)),
455
+ expectedIndexerTokensAvailable,
456
+ "Indexer should be slashed by the correct amount "
410
457
);
458
+ } else {
459
+ // Check indexer for first dispute was slashed by the correct amount
460
+ uint256 expectedIndexerTokensAvailable;
461
+ uint256 tokensToSlash = (_acceptRelatedDispute) ? _tokensSlash : _tokensSlash;
462
+ if (tokensToSlash > indexerTokensAvailable) {
463
+ expectedIndexerTokensAvailable = 0 ;
464
+ } else {
465
+ expectedIndexerTokensAvailable = indexerTokensAvailable - tokensToSlash;
466
+ }
467
+ assertEq (
468
+ staking.getProviderTokensAvailable (dispute.indexer, address (subgraphService)),
469
+ expectedIndexerTokensAvailable,
470
+ "Indexer should be slashed by the correct amount "
471
+ );
472
+
473
+ // Check indexer for related dispute was slashed by the correct amount if it was accepted
474
+ if (_acceptRelatedDispute) {
475
+ uint256 expectedRelatedIndexerTokensAvailable;
476
+ if (_tokensRelatedSlash > relatedIndexerTokensAvailable) {
477
+ expectedRelatedIndexerTokensAvailable = 0 ;
478
+ } else {
479
+ expectedRelatedIndexerTokensAvailable = relatedIndexerTokensAvailable - _tokensRelatedSlash;
480
+ }
481
+ assertEq (
482
+ staking.getProviderTokensAvailable (relatedDispute.indexer, address (subgraphService)),
483
+ expectedRelatedIndexerTokensAvailable,
484
+ "Indexer should be slashed by the correct amount "
485
+ );
486
+ }
411
487
}
488
+
489
+
490
+ // Check dispute status
491
+ dispute = _getDispute (_disputeId);
492
+ assertEq (
493
+ uint8 (dispute.status),
494
+ uint8 (IDisputeManager.DisputeStatus.Accepted),
495
+ "Dispute status should be accepted "
496
+ );
497
+
498
+ // If there's a related dispute, check it
499
+ relatedDispute = _getDispute (dispute.relatedDisputeId);
500
+ assertEq (
501
+ uint8 (relatedDispute.status),
502
+ _acceptRelatedDispute
503
+ ? uint8 (IDisputeManager.DisputeStatus.Accepted)
504
+ : uint8 (IDisputeManager.DisputeStatus.Drawn),
505
+ "Related dispute status should be drawn "
506
+ );
412
507
}
413
508
414
509
function _drawDispute (bytes32 _disputeId ) internal {
0 commit comments