@@ -17,6 +17,7 @@ contract AVSDirectory is
17
17
ReentrancyGuardUpgradeable
18
18
{
19
19
using EnumerableSet for EnumerableSet.Bytes32Set;
20
+ using EnumerableSet for EnumerableSet.AddressSet;
20
21
21
22
/// @dev Index for flag that pauses operator register/deregister to avs when set.
22
23
uint8 internal constant PAUSED_OPERATOR_REGISTER_DEREGISTER_TO_AVS = 0 ;
@@ -354,10 +355,7 @@ contract AVSDirectory is
354
355
);
355
356
356
357
// Assert that the AVS is not an operator set AVS.
357
- require (
358
- ! isOperatorSetAVS[msg .sender ],
359
- "AVSDirectory.deregisterOperatorFromAVS: AVS is an operator set AVS "
360
- );
358
+ require (! isOperatorSetAVS[msg .sender ], "AVSDirectory.deregisterOperatorFromAVS: AVS is an operator set AVS " );
361
359
362
360
// Set the operator as deregistered
363
361
avsOperatorStatus[msg .sender ][operator] = OperatorAVSRegistrationStatus.UNREGISTERED;
@@ -387,14 +385,14 @@ contract AVSDirectory is
387
385
"AVSDirectory._registerOperatorToOperatorSets: invalid operator set "
388
386
);
389
387
388
+ bytes32 encodedOperatorSet = _encodeOperatorSet (operatorSet);
389
+
390
390
require (
391
- ! isMember ( operator, operatorSet ),
391
+ _operatorSetsMemberOf[ operator]. add (encodedOperatorSet ),
392
392
"AVSDirectory._registerOperatorToOperatorSets: operator already registered to operator set "
393
393
);
394
394
395
- ++ operatorSetMemberCount[avs][operatorSetIds[i]];
396
-
397
- _operatorSetsMemberOf[operator].add (_encodeOperatorSet (operatorSet));
395
+ _operatorSetMembers[encodedOperatorSet].add (operator);
398
396
399
397
emit OperatorAddedToOperatorSet (operator, operatorSet);
400
398
}
@@ -412,14 +410,14 @@ contract AVSDirectory is
412
410
for (uint256 i = 0 ; i < operatorSetIds.length ; ++ i) {
413
411
OperatorSet memory operatorSet = OperatorSet (avs, operatorSetIds[i]);
414
412
413
+ bytes32 encodedOperatorSet = _encodeOperatorSet (operatorSet);
414
+
415
415
require (
416
- isMember ( operator, operatorSet ),
416
+ _operatorSetsMemberOf[ operator]. remove (encodedOperatorSet ),
417
417
"AVSDirectory._deregisterOperatorFromOperatorSet: operator not registered for operator set "
418
418
);
419
419
420
- -- operatorSetMemberCount[avs][operatorSetIds[i]];
421
-
422
- _operatorSetsMemberOf[operator].remove (_encodeOperatorSet (operatorSet));
420
+ _operatorSetMembers[encodedOperatorSet].remove (operator);
423
421
424
422
emit OperatorRemovedFromOperatorSet (operator, operatorSet);
425
423
}
@@ -431,22 +429,35 @@ contract AVSDirectory is
431
429
*
432
430
*/
433
431
434
- /// @notice Returns operator sets an operator is registered to in the order they were registered.
435
- /// @param operator The operator address to query.
436
- /// @param index The index of the enumerated list of operator sets.
437
- function operatorSetsMemberOf (address operator , uint256 index ) public view returns (OperatorSet memory ) {
432
+ /**
433
+ * @notice Returns operatorSet an operator is registered to in the order they were registered.
434
+ * @param operator The operator address to query.
435
+ * @param index The index of the enumerated list of operator sets.
436
+ */
437
+ function operatorSetsMemberOfAtIndex (address operator , uint256 index ) external view returns (OperatorSet memory ) {
438
438
return _decodeOperatorSet (_operatorSetsMemberOf[operator].at (index));
439
439
}
440
440
441
- /// @notice Returns an array of operator sets an operator is registered to.
442
- /// @param operator The operator address to query.
443
- /// @param start The starting index of the array to query.
444
- /// @param length The amount of items of the array to return.
445
- function operatorSetsMemberOf (
441
+ /**
442
+ * @notice Returns the operator registered to an operatorSet in the order that it was registered.
443
+ * @param operatorSet The operatorSet to query.
444
+ * @param index The index of the enumerated list of operators.
445
+ */
446
+ function operatorSetMemberAtIndex (OperatorSet memory operatorSet , uint256 index ) external view returns (address ) {
447
+ return _operatorSetMembers[_encodeOperatorSet (operatorSet)].at (index);
448
+ }
449
+
450
+ /**
451
+ * @notice Returns an array of operator sets an operator is registered to.
452
+ * @param operator The operator address to query.
453
+ * @param start The starting index of the array to query.
454
+ * @param length The amount of items of the array to return.
455
+ */
456
+ function getOperatorSetsOfOperator (
446
457
address operator ,
447
458
uint256 start ,
448
459
uint256 length
449
- ) public view returns (OperatorSet[] memory operatorSets ) {
460
+ ) external view returns (OperatorSet[] memory operatorSets ) {
450
461
uint256 maxLength = _operatorSetsMemberOf[operator].length () - start;
451
462
if (length > maxLength) length = maxLength;
452
463
operatorSets = new OperatorSet [](length);
@@ -455,15 +466,47 @@ contract AVSDirectory is
455
466
}
456
467
}
457
468
458
- /// @notice Returns the total number of operator sets an operator is registered to.
459
- /// @param operator The operator address to query.
460
- function inTotalOperatorSets (address operator ) public view returns (uint256 ) {
469
+ /**
470
+ * @notice Returns an array of operators registered to the operatorSet.
471
+ * @param operatorSet The operatorSet to query.
472
+ * @param start The starting index of the array to query.
473
+ * @param length The amount of items of the array to return.
474
+ */
475
+ function getOperatorsInOperatorSet (
476
+ OperatorSet memory operatorSet ,
477
+ uint256 start ,
478
+ uint256 length
479
+ ) external view returns (address [] memory operators ) {
480
+ bytes32 encodedOperatorSet = _encodeOperatorSet (operatorSet);
481
+ uint256 maxLength = _operatorSetMembers[encodedOperatorSet].length () - start;
482
+ if (length > maxLength) length = maxLength;
483
+ operators = new address [](length);
484
+ for (uint256 i; i < length; ++ i) {
485
+ operators[i] = _operatorSetMembers[encodedOperatorSet].at (start + i);
486
+ }
487
+ }
488
+
489
+ /**
490
+ * @notice Returns the number of operators registered to an operatorSet.
491
+ * @param operatorSet The operatorSet to get the member count for
492
+ */
493
+ function getNumOperatorsInOperatorSet (OperatorSet memory operatorSet ) external view returns (uint256 ) {
494
+ return _operatorSetMembers[_encodeOperatorSet (operatorSet)].length ();
495
+ }
496
+
497
+ /**
498
+ * @notice Returns the total number of operator sets an operator is registered to.
499
+ * @param operator The operator address to query.
500
+ */
501
+ function inTotalOperatorSets (address operator ) external view returns (uint256 ) {
461
502
return _operatorSetsMemberOf[operator].length ();
462
503
}
463
504
464
- /// @notice Returns whether or not an operator is registered to an operator set.
465
- /// @param operator The operator address to query.
466
- /// @param operatorSet The `OperatorSet` to query.
505
+ /**
506
+ * @notice Returns whether or not an operator is registered to an operator set.
507
+ * @param operator The operator address to query.
508
+ * @param operatorSet The `OperatorSet` to query.
509
+ */
467
510
function isMember (address operator , OperatorSet memory operatorSet ) public view returns (bool ) {
468
511
return _operatorSetsMemberOf[operator].contains (_encodeOperatorSet (operatorSet));
469
512
}
0 commit comments