@@ -438,7 +438,7 @@ contract KeyRegistrarUnitTests is EigenLayerUnitTestSetup {
438
438
function testDeregisterKey_RevertOperatorSetNotConfigured () public {
439
439
OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
440
440
441
- vm.prank (avs1 );
441
+ vm.prank (operator1 );
442
442
vm.expectRevert (IKeyRegistrarErrors.OperatorSetNotConfigured.selector );
443
443
keyRegistrar.deregisterKey (operator1, operatorSet);
444
444
}
@@ -540,7 +540,10 @@ contract KeyRegistrarUnitTests is EigenLayerUnitTestSetup {
540
540
bytes32 keyHash = keccak256 (ecdsaKey1);
541
541
assertTrue (keyRegistrar.isKeyGloballyRegistered (keyHash));
542
542
543
- vm.prank (avs1);
543
+ // Set operator as not slashable
544
+ allocationManagerMock.setIsOperatorSlashable (operator1, operatorSet1, false );
545
+
546
+ vm.prank (operator1);
544
547
keyRegistrar.deregisterKey (operator1, operatorSet1);
545
548
546
549
// Key should still be globally registered after deregistration
@@ -571,7 +574,10 @@ contract KeyRegistrarUnitTests is EigenLayerUnitTestSetup {
571
574
bytes32 keyHash = BN254.hashG1Point (bn254G1Key1);
572
575
assertTrue (keyRegistrar.isKeyGloballyRegistered (keyHash));
573
576
574
- vm.prank (avs1);
577
+ // Set operator as not slashable
578
+ allocationManagerMock.setIsOperatorSlashable (operator1, operatorSet1, false );
579
+
580
+ vm.prank (operator1);
575
581
keyRegistrar.deregisterKey (operator1, operatorSet1);
576
582
577
583
// Key should still be globally registered after deregistration
@@ -787,7 +793,10 @@ contract KeyRegistrarUnitTests is EigenLayerUnitTestSetup {
787
793
vm.prank (operator1);
788
794
keyRegistrar.registerKey (operator1, operatorSet, ecdsaKey1, signature);
789
795
790
- vm.prank (avs1);
796
+ // Set operator as not slashable
797
+ allocationManagerMock.setIsOperatorSlashable (operator1, operatorSet, false );
798
+
799
+ vm.prank (operator1);
791
800
vm.expectEmit (true , true , true , true );
792
801
emit KeyDeregistered (operatorSet, operator1, IKeyRegistrarTypes.CurveType.ECDSA);
793
802
keyRegistrar.deregisterKey (operator1, operatorSet);
@@ -806,7 +815,10 @@ contract KeyRegistrarUnitTests is EigenLayerUnitTestSetup {
806
815
vm.prank (operator1);
807
816
keyRegistrar.registerKey (operator1, operatorSet, bn254Key1, signature);
808
817
809
- vm.prank (avs1);
818
+ // Set operator as not slashable
819
+ allocationManagerMock.setIsOperatorSlashable (operator1, operatorSet, false );
820
+
821
+ vm.prank (operator1);
810
822
vm.expectEmit (true , true , true , true );
811
823
emit KeyDeregistered (operatorSet, operator1, IKeyRegistrarTypes.CurveType.BN254);
812
824
keyRegistrar.deregisterKey (operator1, operatorSet);
@@ -820,16 +832,61 @@ contract KeyRegistrarUnitTests is EigenLayerUnitTestSetup {
820
832
vm.prank (avs1);
821
833
keyRegistrar.configureOperatorSet (operatorSet, IKeyRegistrarTypes.CurveType.ECDSA);
822
834
823
- vm.prank (avs1 );
835
+ vm.prank (operator1 );
824
836
vm.expectRevert (abi.encodeWithSelector (IKeyRegistrarErrors.KeyNotFound.selector , operatorSet, operator1));
825
837
keyRegistrar.deregisterKey (operator1, operatorSet);
826
838
}
827
839
828
840
function testDeregisterKey_RevertUnauthorized () public {
829
841
OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
830
842
831
- vm.prank (operator1);
843
+ vm.prank (operator2); // operator2 is not authorized to call on behalf of operator1
832
844
vm.expectRevert (PermissionControllerMixin.InvalidPermissions.selector );
833
845
keyRegistrar.deregisterKey (operator1, operatorSet);
834
846
}
847
+
848
+ function testDeregisterKey_OperatorNotSlashable () public {
849
+ OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
850
+
851
+ vm.prank (avs1);
852
+ keyRegistrar.configureOperatorSet (operatorSet, IKeyRegistrarTypes.CurveType.ECDSA);
853
+
854
+ bytes memory signature = _generateECDSASignature (operator1, operatorSet, ecdsaAddress1, ecdsaPrivKey1);
855
+
856
+ vm.prank (operator1);
857
+ keyRegistrar.registerKey (operator1, operatorSet, ecdsaKey1, signature);
858
+
859
+ // Set operator as not slashable
860
+ allocationManagerMock.setIsOperatorSlashable (operator1, operatorSet, false );
861
+
862
+ // Operator should be able to deregister their key when not slashable
863
+ vm.prank (operator1);
864
+ vm.expectEmit (true , true , true , true );
865
+ emit KeyDeregistered (operatorSet, operator1, IKeyRegistrarTypes.CurveType.ECDSA);
866
+ keyRegistrar.deregisterKey (operator1, operatorSet);
867
+
868
+ assertFalse (keyRegistrar.isRegistered (operatorSet, operator1));
869
+ }
870
+
871
+ function testDeregisterKey_RevertOperatorStillSlashable () public {
872
+ OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
873
+
874
+ vm.prank (avs1);
875
+ keyRegistrar.configureOperatorSet (operatorSet, IKeyRegistrarTypes.CurveType.ECDSA);
876
+
877
+ bytes memory signature = _generateECDSASignature (operator1, operatorSet, ecdsaAddress1, ecdsaPrivKey1);
878
+
879
+ vm.prank (operator1);
880
+ keyRegistrar.registerKey (operator1, operatorSet, ecdsaKey1, signature);
881
+
882
+ // Set operator as slashable
883
+ allocationManagerMock.setIsOperatorSlashable (operator1, operatorSet, true );
884
+
885
+ // Operator should not be able to deregister their key when still slashable
886
+ vm.prank (operator1);
887
+ vm.expectRevert (abi.encodeWithSelector (IKeyRegistrarErrors.OperatorStillSlashable.selector , operatorSet, operator1));
888
+ keyRegistrar.deregisterKey (operator1, operatorSet);
889
+
890
+ assertTrue (keyRegistrar.isRegistered (operatorSet, operator1));
891
+ }
835
892
}
0 commit comments