@@ -5,6 +5,8 @@ import "src/contracts/cloud/ComputeRegistry.sol";
55import "src/test/utils/EigenLayerUnitTestSetup.sol " ;
66import "src/test/mocks/MockAVSRegistrar.sol " ;
77import "src/test/mocks/ReleaseManagerMock.sol " ;
8+ import "src/test/mocks/KeyRegistrarMock.sol " ;
9+ import "src/test/mocks/CrossChainRegistryMock.sol " ;
810
911contract ComputeRegistryUnitTests is EigenLayerUnitTestSetup , IComputeRegistryErrors , IComputeRegistryEvents {
1012 using StdStyle for * ;
@@ -19,6 +21,8 @@ contract ComputeRegistryUnitTests is EigenLayerUnitTestSetup, IComputeRegistryEr
1921 // Contracts
2022 ComputeRegistry computeRegistry;
2123 ReleaseManagerMock releaseManagerMock;
24+ KeyRegistrarMock keyRegistrarMock;
25+ CrossChainRegistryMock crossChainRegistryMock;
2226
2327 // Test variables
2428 address defaultAVS;
@@ -31,6 +35,8 @@ contract ComputeRegistryUnitTests is EigenLayerUnitTestSetup, IComputeRegistryEr
3135
3236 // Setup mock contracts
3337 releaseManagerMock = new ReleaseManagerMock ();
38+ keyRegistrarMock = new KeyRegistrarMock ();
39+ crossChainRegistryMock = new CrossChainRegistryMock ();
3440
3541 // Setup default test accounts
3642 defaultSignerPrivateKey = 0x1234 ;
@@ -41,6 +47,8 @@ contract ComputeRegistryUnitTests is EigenLayerUnitTestSetup, IComputeRegistryEr
4147 computeRegistry = new ComputeRegistry (
4248 IReleaseManager (address (releaseManagerMock)),
4349 IAllocationManager (address (allocationManagerMock)),
50+ IKeyRegistrar (address (keyRegistrarMock)),
51+ ICrossChainRegistry (address (crossChainRegistryMock)),
4452 IPermissionController (address (permissionController)),
4553 TOS_HASH,
4654 VERSION
@@ -52,6 +60,8 @@ contract ComputeRegistryUnitTests is EigenLayerUnitTestSetup, IComputeRegistryEr
5260 // Configure mocks
5361 allocationManagerMock.setIsOperatorSet (defaultOperatorSet, true );
5462 releaseManagerMock.setHasRelease (defaultOperatorSet, true );
63+ keyRegistrarMock.setOperatorSetCurveType (defaultOperatorSet, IKeyRegistrarTypes.CurveType.ECDSA);
64+ crossChainRegistryMock.setHasActiveGenerationReservation (defaultOperatorSet, true );
5565
5666 // Setup permissions for default signer to call registerForCompute and deregisterFromCompute
5767 vm.startPrank (defaultAVS);
@@ -82,6 +92,8 @@ contract ComputeRegistryUnitTests_Initialization is ComputeRegistryUnitTests {
8292 function test_initialization () public view {
8393 assertEq (address (computeRegistry.RELEASE_MANAGER ()), address (releaseManagerMock));
8494 assertEq (address (computeRegistry.ALLOCATION_MANAGER ()), address (allocationManagerMock));
95+ assertEq (address (computeRegistry.KEY_REGISTRAR ()), address (keyRegistrarMock));
96+ assertEq (address (computeRegistry.CROSS_CHAIN_REGISTRY ()), address (crossChainRegistryMock));
8597 assertEq (address (computeRegistry.permissionController ()), address (permissionController));
8698 assertEq (computeRegistry.TOS_HASH (), TOS_HASH);
8799 assertEq (computeRegistry.MAX_EXPIRY (), MAX_EXPIRY);
@@ -164,6 +176,9 @@ contract ComputeRegistryUnitTests_RegisterForCompute is ComputeRegistryUnitTests
164176 OperatorSet memory operatorSet = OperatorSet (defaultAVS, 1 );
165177 allocationManagerMock.setIsOperatorSet (operatorSet, true );
166178 releaseManagerMock.setHasRelease (operatorSet, false );
179+ // Set curve type and generation reservation so we get to the release check
180+ keyRegistrarMock.setOperatorSetCurveType (operatorSet, IKeyRegistrarTypes.CurveType.ECDSA);
181+ crossChainRegistryMock.setHasActiveGenerationReservation (operatorSet, true );
167182
168183 bytes memory signature = _generateTOSSignature (operatorSet, defaultSigner, defaultSignerPrivateKey);
169184
@@ -189,6 +204,60 @@ contract ComputeRegistryUnitTests_RegisterForCompute is ComputeRegistryUnitTests
189204 vm.expectRevert (ISignatureUtilsMixinErrors.InvalidSignature.selector );
190205 computeRegistry.registerForCompute (defaultOperatorSet, signature);
191206 }
207+
208+ function test_registerForCompute_revert_curveTypeNotSet () public {
209+ OperatorSet memory operatorSet = OperatorSet (defaultAVS, 2 );
210+ allocationManagerMock.setIsOperatorSet (operatorSet, true );
211+ // Curve type defaults to NONE in the mock
212+ crossChainRegistryMock.setHasActiveGenerationReservation (operatorSet, true );
213+ releaseManagerMock.setHasRelease (operatorSet, true );
214+
215+ bytes memory signature = _generateTOSSignature (operatorSet, defaultSigner, defaultSignerPrivateKey);
216+
217+ vm.prank (defaultSigner);
218+ vm.expectRevert (CurveTypeNotSet.selector );
219+ computeRegistry.registerForCompute (operatorSet, signature);
220+ }
221+
222+ function test_registerForCompute_revert_noActiveGenerationReservation () public {
223+ OperatorSet memory operatorSet = OperatorSet (defaultAVS, 3 );
224+ allocationManagerMock.setIsOperatorSet (operatorSet, true );
225+ keyRegistrarMock.setOperatorSetCurveType (operatorSet, IKeyRegistrarTypes.CurveType.BN254);
226+ // Generation reservation defaults to false in the mock
227+ releaseManagerMock.setHasRelease (operatorSet, true );
228+
229+ bytes memory signature = _generateTOSSignature (operatorSet, defaultSigner, defaultSignerPrivateKey);
230+
231+ vm.prank (defaultSigner);
232+ vm.expectRevert (NoActiveGenerationReservation.selector );
233+ computeRegistry.registerForCompute (operatorSet, signature);
234+ }
235+
236+ function test_registerForCompute_withDifferentCurveTypes () public {
237+ // Test with ECDSA curve type
238+ OperatorSet memory ecdsaOperatorSet = OperatorSet (defaultAVS, 4 );
239+ allocationManagerMock.setIsOperatorSet (ecdsaOperatorSet, true );
240+ keyRegistrarMock.setOperatorSetCurveType (ecdsaOperatorSet, IKeyRegistrarTypes.CurveType.ECDSA);
241+ crossChainRegistryMock.setHasActiveGenerationReservation (ecdsaOperatorSet, true );
242+ releaseManagerMock.setHasRelease (ecdsaOperatorSet, true );
243+
244+ bytes memory signature1 = _generateTOSSignature (ecdsaOperatorSet, defaultSigner, defaultSignerPrivateKey);
245+ vm.prank (defaultSigner);
246+ computeRegistry.registerForCompute (ecdsaOperatorSet, signature1);
247+ assertTrue (computeRegistry.isOperatorSetRegistered (ecdsaOperatorSet.key ()));
248+
249+ // Test with BN254 curve type
250+ OperatorSet memory bn254OperatorSet = OperatorSet (defaultAVS, 5 );
251+ allocationManagerMock.setIsOperatorSet (bn254OperatorSet, true );
252+ keyRegistrarMock.setOperatorSetCurveType (bn254OperatorSet, IKeyRegistrarTypes.CurveType.BN254);
253+ crossChainRegistryMock.setHasActiveGenerationReservation (bn254OperatorSet, true );
254+ releaseManagerMock.setHasRelease (bn254OperatorSet, true );
255+
256+ bytes memory signature2 = _generateTOSSignature (bn254OperatorSet, defaultSigner, defaultSignerPrivateKey);
257+ vm.prank (defaultSigner);
258+ computeRegistry.registerForCompute (bn254OperatorSet, signature2);
259+ assertTrue (computeRegistry.isOperatorSetRegistered (bn254OperatorSet.key ()));
260+ }
192261}
193262
194263contract ComputeRegistryUnitTests_DeregisterFromCompute is ComputeRegistryUnitTests {
0 commit comments