Skip to content

Commit cbe0467

Browse files
committed
test(wip): start on deregistration invariants
1 parent 80a5972 commit cbe0467

File tree

3 files changed

+99
-13
lines changed

3 files changed

+99
-13
lines changed

src/test/integration/IntegrationBase.t.sol

+58-11
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,18 @@ abstract contract IntegrationBase is IntegrationDeployer {
472472
assertFalse(prevIsMemberOfSet, err);
473473
assertTrue(curIsMemberOfSet, err);
474474
}
475+
476+
function assert_Snap_Became_Deregistered(
477+
User operator,
478+
OperatorSet memory operatorSet,
479+
string memory err
480+
) internal {
481+
bool curIsMemberOfSet = _getIsMemberOfSet(operator, operatorSet);
482+
bool prevIsMemberOfSet = _getPrevIsMemberOfSet(operator, operatorSet);
483+
484+
assertTrue(prevIsMemberOfSet, err);
485+
assertFalse(curIsMemberOfSet, err);
486+
}
475487

476488
function assert_Snap_Became_Slashable(
477489
User operator,
@@ -485,6 +497,18 @@ abstract contract IntegrationBase is IntegrationDeployer {
485497
assertTrue(curIsSlashable, err);
486498
}
487499

500+
function assert_Snap_Remains_Slashable(
501+
User operator,
502+
OperatorSet memory operatorSet,
503+
string memory err
504+
) internal {
505+
bool curIsSlashable = _getIsSlashable(operator, operatorSet);
506+
bool prevIsSlashable = _getPrevIsSlashable(operator, operatorSet);
507+
508+
assertTrue(prevIsSlashable, err);
509+
assertTrue(curIsSlashable, err);
510+
}
511+
488512
/// @dev Assert that we created a pending allocation with a POSITIVE pendingDiff
489513
function assert_Snap_Created_PendingIncrease(
490514
User operator,
@@ -583,9 +607,8 @@ abstract contract IntegrationBase is IntegrationDeployer {
583607
OperatorSet[] memory prevAllocatedSets = _getPrevAllocatedSets(operator);
584608

585609
assertEq(curAllocatedSets.length, prevAllocatedSets.length + 1, err);
586-
OperatorSet memory addedSet = curAllocatedSets[curAllocatedSets.length - 1];
587-
assertEq(addedSet.avs, operatorSet.avs, err);
588-
assertEq(addedSet.id, operatorSet.id, err);
610+
assertFalse(prevAllocatedSets.contains(operatorSet), err);
611+
assertTrue(curAllocatedSets.contains(operatorSet), err);
589612
}
590613

591614
function assert_Snap_Unchanged_AllocatedSets(
@@ -607,9 +630,8 @@ abstract contract IntegrationBase is IntegrationDeployer {
607630
OperatorSet[] memory prevAllocatedSets = _getPrevAllocatedSets(operator);
608631

609632
assertEq(curAllocatedSets.length + 1, prevAllocatedSets.length, err);
610-
OperatorSet memory removedSet = prevAllocatedSets[prevAllocatedSets.length - 1];
611-
assertEq(removedSet.avs, operatorSet.avs, err);
612-
assertEq(removedSet.id, operatorSet.id, err);
633+
assertTrue(prevAllocatedSets.contains(operatorSet), err);
634+
assertFalse(curAllocatedSets.contains(operatorSet), err);
613635
}
614636

615637
function assert_Snap_Added_RegisteredSet(
@@ -621,9 +643,21 @@ abstract contract IntegrationBase is IntegrationDeployer {
621643
OperatorSet[] memory prevRegisteredSets = _getPrevRegisteredSets(operator);
622644

623645
assertEq(curRegisteredSets.length, prevRegisteredSets.length + 1, err);
624-
OperatorSet memory addedSet = curRegisteredSets[curRegisteredSets.length - 1];
625-
assertEq(addedSet.avs, operatorSet.avs, err);
626-
assertEq(addedSet.id, operatorSet.id, err);
646+
assertFalse(prevRegisteredSets.contains(operatorSet), err);
647+
assertTrue(curRegisteredSets.contains(operatorSet), err);
648+
}
649+
650+
function assert_Snap_Removed_RegisteredSet(
651+
User operator,
652+
OperatorSet memory operatorSet,
653+
string memory err
654+
) internal {
655+
OperatorSet[] memory curRegisteredSets = _getRegisteredSets(operator);
656+
OperatorSet[] memory prevRegisteredSets = _getPrevRegisteredSets(operator);
657+
658+
assertEq(curRegisteredSets.length + 1, prevRegisteredSets.length, err);
659+
assertTrue(prevRegisteredSets.contains(operatorSet), err);
660+
assertFalse(curRegisteredSets.contains(operatorSet), err);
627661
}
628662

629663
function assert_Snap_Added_MemberOfSet(
@@ -635,8 +669,21 @@ abstract contract IntegrationBase is IntegrationDeployer {
635669
address[] memory prevOperators = _getPrevMembers(operatorSet);
636670

637671
assertEq(curOperators.length, prevOperators.length + 1, err);
638-
address memberAdded = curOperators[curOperators.length - 1];
639-
assertEq(memberAdded, address(operator), err);
672+
assertFalse(prevOperators.contains(address(operator)), err);
673+
assertTrue(curOperators.contains(address(operator)), err);
674+
}
675+
676+
function assert_Snap_Removed_MemberOfSet(
677+
User operator,
678+
OperatorSet memory operatorSet,
679+
string memory err
680+
) internal {
681+
address[] memory curOperators = _getMembers(operatorSet);
682+
address[] memory prevOperators = _getPrevMembers(operatorSet);
683+
684+
assertEq(curOperators.length + 1, prevOperators.length, err);
685+
assertTrue(prevOperators.contains(address(operator)), err);
686+
assertFalse(curOperators.contains(address(operator)), err);
640687
}
641688

642689
function assert_Snap_StakeBecameSlashable(

src/test/integration/IntegrationChecks.t.sol

+40-2
Original file line numberDiff line numberDiff line change
@@ -329,10 +329,12 @@ contract IntegrationCheckUtils is IntegrationBase {
329329
}
330330

331331
/*******************************************************************************
332-
ALLOCATION MANAGER CHECKS
332+
ALM - REGISTRATION
333333
*******************************************************************************/
334334

335-
/// @dev Basic invariants that should hold after EVERY call to `registerForOperatorSet`
335+
/// @dev Basic invariants that should hold after EVERY call to `registerForOperatorSets`
336+
/// NOTE: These are only slightly modified from check_Base_Deregistration_State
337+
/// If you add invariants here, consider adding them there (and vice-versa)
336338
function check_Base_Registration_State(
337339
User operator,
338340
OperatorSet memory operatorSet
@@ -447,6 +449,42 @@ contract IntegrationCheckUtils is IntegrationBase {
447449
_rollBackward_AllocationDelay(operator);
448450
}
449451

452+
/*******************************************************************************
453+
ALM - DEREGISTRATION
454+
*******************************************************************************/
455+
456+
/// @dev Basic invariants that should hold after EVERY call to `deregisterFromOperatorSets`
457+
/// NOTE: These are only slightly modified from check_Base_Registration_State
458+
/// If you add invariants here, consider adding them there (and vice-versa)
459+
function check_Base_Deregistration_State(
460+
User operator,
461+
OperatorSet memory operatorSet
462+
) internal {
463+
// Global invariant
464+
assert_MaxMagsEqualMaxMagsAtCurrentBlock(operator, allStrats, "max magnitudes should equal upperlookup at current block");
465+
466+
// Deregistration SHOULD remove the operator as a member of the set
467+
assert_Snap_Became_Deregistered(operator, operatorSet, "operator should have been registered before, and is now deregistered");
468+
assert_Snap_Removed_RegisteredSet(operator, operatorSet, "should have removed operator set from list of registered sets");
469+
assert_Snap_Removed_MemberOfSet(operator, operatorSet, "should have removed operator from list of set members");
470+
471+
// Deregistration should NOT change slashability, magnitude, allocations, or allocated sets
472+
assert_Snap_Remains_Slashable(operator, operatorSet, "operator should have been slashable already, and should still be slashable");
473+
assert_Snap_Unchanged_AllocatedSets(operator, "should not have updated allocated sets");
474+
assert_Snap_Unchanged_AllocatedStrats(operator, operatorSet, "should not have updated allocated strategies");
475+
assert_Snap_Unchanged_MaxMagnitude(operator, allStrats, "should not have updated max magnitudes in any way");
476+
assert_Snap_Unchanged_AllocatedStake(operator, operatorSet, allStrats, "should not have updated allocated stake in any way");
477+
assert_Snap_Unchanged_StrategyAllocations(operator, operatorSet, allStrats, "should not have updated any individual allocations");
478+
assert_Snap_Unchanged_EncumberedMagnitude(operator, allStrats, "should not have updated encumbered magnitude");
479+
assert_Snap_Unchanged_AllocatableMagnitude(operator, allStrats, "should not have updated allocatable magnitude");
480+
481+
// TODO - once the deallocation delay passes, check again?
482+
}
483+
484+
/*******************************************************************************
485+
ALM - ALLOCATION
486+
*******************************************************************************/
487+
450488
/// @dev NOTE - this is for basic ALLOCATION invariants, NOT DEALLOCATION
451489
function check_Base_Allocation_State(
452490
User operator,

src/test/integration/tests/SlashingWithdrawals.t.sol

+1
Original file line numberDiff line numberDiff line change
@@ -271,6 +271,7 @@ contract Integration_SlashingWithdrawals is IntegrationCheckUtils {
271271
) public rand(_random) {
272272
// 4. Deregister.
273273
operator.deregisterFromOperatorSet(operatorSet);
274+
check_Base_Deregistration_State(operator, operatorSet);
274275

275276
// 5. Slash operator
276277
IAllocationManagerTypes.SlashingParams memory slashingParams;

0 commit comments

Comments
 (0)