@@ -365,6 +365,11 @@ contract KeyRegistrarUnitTests_registerKey_ECDSA is KeyRegistrarUnitTests {
365365
366366 address storedAddress = keyRegistrar.getECDSAAddress (operatorSet, operator1);
367367 assertEq (storedAddress, ecdsaAddress1);
368+
369+ // Verify getOperatorFromSigningKey returns the correct operator and registration status
370+ (address retrievedOperator , bool isReg ) = keyRegistrar.getOperatorFromSigningKey (operatorSet, ecdsaKey1);
371+ assertEq (retrievedOperator, operator1);
372+ assertTrue (isReg);
368373 }
369374}
370375
@@ -534,6 +539,11 @@ contract KeyRegistrarUnitTests_registerKey_BN254 is KeyRegistrarUnitTests {
534539 assertEq (storedG2.X[1 ], bn254G2Key2.X[1 ]);
535540 assertEq (storedG2.Y[0 ], bn254G2Key2.Y[0 ]);
536541 assertEq (storedG2.Y[1 ], bn254G2Key2.Y[1 ]);
542+
543+ // Verify getOperatorFromSigningKey returns the correct operator and registration status
544+ (address retrievedOperator , bool isReg ) = keyRegistrar.getOperatorFromSigningKey (operatorSet, encodedKey);
545+ assertEq (retrievedOperator, operator1);
546+ assertTrue (isReg);
537547 }
538548
539549 function test_registerBN254Key () public {
@@ -557,6 +567,11 @@ contract KeyRegistrarUnitTests_registerKey_BN254 is KeyRegistrarUnitTests {
557567 assertEq (storedG2.X[1 ], bn254G2Key1.X[1 ]);
558568 assertEq (storedG2.Y[0 ], bn254G2Key1.Y[0 ]);
559569 assertEq (storedG2.Y[1 ], bn254G2Key1.Y[1 ]);
570+
571+ // Verify getOperatorFromSigningKey returns the correct operator and registration status
572+ (address retrievedOperator , bool isReg ) = keyRegistrar.getOperatorFromSigningKey (operatorSet, bn254Key1);
573+ assertEq (retrievedOperator, operator1);
574+ assertTrue (isReg);
560575 }
561576}
562577
@@ -840,6 +855,154 @@ contract KeyRegistrarUnitTests_ViewFunctions is KeyRegistrarUnitTests {
840855 CurveType curveType = keyRegistrar.getOperatorSetCurveType (operatorSet);
841856 assertEq (uint8 (curveType), uint8 (CurveType.NONE));
842857 }
858+
859+ function test_getOperatorFromSigningKey_ECDSA () public {
860+ OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
861+
862+ vm.prank (avs1);
863+ keyRegistrar.configureOperatorSet (operatorSet, CurveType.ECDSA);
864+
865+ // Before registration, should return address(0) and false
866+ (address retrievedOperator , bool isReg ) = keyRegistrar.getOperatorFromSigningKey (operatorSet, ecdsaKey1);
867+ assertEq (retrievedOperator, address (0 ));
868+ assertFalse (isReg);
869+
870+ // Register key
871+ bytes memory signature = _generateECDSASignature (operator1, operatorSet, ecdsaAddress1, ecdsaPrivKey1);
872+ vm.prank (operator1);
873+ keyRegistrar.registerKey (operator1, operatorSet, ecdsaKey1, signature);
874+
875+ // After registration, should return the operator and true
876+ (retrievedOperator, isReg) = keyRegistrar.getOperatorFromSigningKey (operatorSet, ecdsaKey1);
877+ assertEq (retrievedOperator, operator1);
878+ assertTrue (isReg);
879+ }
880+
881+ function test_getOperatorFromSigningKey_BN254 () public {
882+ OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
883+
884+ vm.prank (avs1);
885+ keyRegistrar.configureOperatorSet (operatorSet, CurveType.BN254);
886+
887+ // Before registration, should return address(0) and false
888+ (address retrievedOperator , bool isReg ) = keyRegistrar.getOperatorFromSigningKey (operatorSet, bn254Key1);
889+ assertEq (retrievedOperator, address (0 ));
890+ assertFalse (isReg);
891+
892+ // Register key
893+ bytes memory signature = _generateBN254Signature (operator1, operatorSet, bn254Key1, bn254PrivKey1);
894+ vm.prank (operator1);
895+ keyRegistrar.registerKey (operator1, operatorSet, bn254Key1, signature);
896+
897+ // After registration, should return the operator and true
898+ // Only pass in the G1 key
899+ bytes memory g1Key = abi.encode (bn254G1Key1.X, bn254G1Key1.Y);
900+ (retrievedOperator, isReg) = keyRegistrar.getOperatorFromSigningKey (operatorSet, g1Key);
901+ assertEq (retrievedOperator, operator1);
902+ assertTrue (isReg);
903+ }
904+
905+ function test_getOperatorFromSigningKey_multipleOperators () public {
906+ OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
907+
908+ vm.prank (avs1);
909+ keyRegistrar.configureOperatorSet (operatorSet, CurveType.ECDSA);
910+
911+ // Register different keys for different operators
912+ bytes memory signature1 = _generateECDSASignature (operator1, operatorSet, ecdsaAddress1, ecdsaPrivKey1);
913+ vm.prank (operator1);
914+ keyRegistrar.registerKey (operator1, operatorSet, ecdsaKey1, signature1);
915+
916+ bytes memory signature2 = _generateECDSASignature (operator2, operatorSet, ecdsaAddress2, ecdsaPrivKey2);
917+ vm.prank (operator2);
918+ keyRegistrar.registerKey (operator2, operatorSet, ecdsaKey2, signature2);
919+
920+ // Verify each key returns the correct operator and registration status
921+ (address retrievedOperator1 , bool isReg1 ) = keyRegistrar.getOperatorFromSigningKey (operatorSet, ecdsaKey1);
922+ assertEq (retrievedOperator1, operator1);
923+ assertTrue (isReg1);
924+
925+ (address retrievedOperator2 , bool isReg2 ) = keyRegistrar.getOperatorFromSigningKey (operatorSet, ecdsaKey2);
926+ assertEq (retrievedOperator2, operator2);
927+ assertTrue (isReg2);
928+ }
929+
930+ function test_getOperatorFromSigningKey_sameKeyDifferentOperatorSets () public {
931+ OperatorSet memory operatorSet1 = _createOperatorSet (avs1, 0 );
932+ OperatorSet memory operatorSet2 = _createOperatorSet (avs1, 1 );
933+
934+ vm.startPrank (avs1);
935+ keyRegistrar.configureOperatorSet (operatorSet1, CurveType.ECDSA);
936+ keyRegistrar.configureOperatorSet (operatorSet2, CurveType.ECDSA);
937+ vm.stopPrank ();
938+
939+ // Register same operator with same key in first operator set
940+ bytes memory signature = _generateECDSASignature (operator1, operatorSet1, ecdsaAddress1, ecdsaPrivKey1);
941+ vm.prank (operator1);
942+ keyRegistrar.registerKey (operator1, operatorSet1, ecdsaKey1, signature);
943+
944+ // The same key should return the same operator for both operator sets
945+ // But registration status will differ - true for operatorSet1, false for operatorSet2
946+ (address retrievedOperator1 , bool isReg1 ) = keyRegistrar.getOperatorFromSigningKey (operatorSet1, ecdsaKey1);
947+ assertEq (retrievedOperator1, operator1);
948+ assertTrue (isReg1); // Registered in operatorSet1
949+
950+ (address retrievedOperator2 , bool isReg2 ) = keyRegistrar.getOperatorFromSigningKey (operatorSet2, ecdsaKey1);
951+ assertEq (retrievedOperator2, operator1);
952+ assertFalse (isReg2); // NOT registered in operatorSet2
953+ }
954+
955+ function test_getOperatorFromSigningKey_afterDeregistration () public {
956+ OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
957+
958+ vm.prank (avs1);
959+ keyRegistrar.configureOperatorSet (operatorSet, CurveType.ECDSA);
960+
961+ // Register key
962+ bytes memory signature = _generateECDSASignature (operator1, operatorSet, ecdsaAddress1, ecdsaPrivKey1);
963+ vm.prank (operator1);
964+ keyRegistrar.registerKey (operator1, operatorSet, ecdsaKey1, signature);
965+
966+ // Verify registration
967+ (address retrievedOperator , bool isReg ) = keyRegistrar.getOperatorFromSigningKey (operatorSet, ecdsaKey1);
968+ assertEq (retrievedOperator, operator1);
969+ assertTrue (isReg);
970+
971+ // Deregister
972+ allocationManagerMock.setIsOperatorSlashable (operator1, operatorSet, false );
973+ vm.prank (operator1);
974+ keyRegistrar.deregisterKey (operator1, operatorSet);
975+
976+ // After deregistration, the key should still map to the operator (global registry persists)
977+ // but the registration status should be false
978+ (retrievedOperator, isReg) = keyRegistrar.getOperatorFromSigningKey (operatorSet, ecdsaKey1);
979+ assertEq (retrievedOperator, operator1);
980+ assertFalse (isReg);
981+ }
982+
983+ function test_getOperatorFromSigningKey_nonExistentKey () public {
984+ OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
985+
986+ vm.prank (avs1);
987+ keyRegistrar.configureOperatorSet (operatorSet, CurveType.ECDSA);
988+
989+ // Query for a key that was never registered
990+ bytes memory nonExistentKey = abi.encodePacked (address (0xdeadbeef ));
991+ (address retrievedOperator , bool isReg ) = keyRegistrar.getOperatorFromSigningKey (operatorSet, nonExistentKey);
992+ assertEq (retrievedOperator, address (0 ));
993+ assertFalse (isReg);
994+ }
995+
996+ function test_getOperatorFromSigningKey_revertUnconfiguredOperatorSet () public {
997+ OperatorSet memory operatorSet = _createOperatorSet (avs1, DEFAULT_OPERATOR_SET_ID);
998+
999+ // Don't configure the operator set - it will have CurveType.NONE
1000+ bytes memory someKey = abi.encodePacked (address (0xdeadbeef ));
1001+
1002+ // This should revert because the operator set is not configured
1003+ vm.expectRevert ();
1004+ keyRegistrar.getOperatorFromSigningKey (operatorSet, someKey);
1005+ }
8431006}
8441007
8451008/**
0 commit comments