-
Notifications
You must be signed in to change notification settings - Fork 109
/
Copy pathISlashingRegistryCoordinator.sol
619 lines (555 loc) · 26.4 KB
/
ISlashingRegistryCoordinator.sol
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
// SPDX-License-Identifier: BUSL-1.1
pragma solidity ^0.8.27;
import {IBLSApkRegistry} from "./IBLSApkRegistry.sol";
import {IStakeRegistry} from "./IStakeRegistry.sol";
import {IIndexRegistry} from "./IIndexRegistry.sol";
import {BN254} from "../libraries/BN254.sol";
import {IAllocationManager} from
"eigenlayer-contracts/src/contracts/interfaces/IAllocationManager.sol";
import {IBLSApkRegistry} from "./IBLSApkRegistry.sol";
import {IStakeRegistry, IStakeRegistryTypes} from "./IStakeRegistry.sol";
import {IIndexRegistry} from "./IIndexRegistry.sol";
import {BN254} from "../libraries/BN254.sol";
import {IAVSRegistrar} from "eigenlayer-contracts/src/contracts/interfaces/IAVSRegistrar.sol";
interface ISlashingRegistryCoordinatorErrors {
/// @notice Thrown when array lengths in input parameters don't match.
error InputLengthMismatch();
/// @notice Thrown when an invalid registration type is provided.
error InvalidRegistrationType();
/// @notice Thrown when non-allocation manager calls restricted function.
error OnlyAllocationManager();
/// @notice Thrown when non-ejector calls restricted function.
error OnlyEjector();
/// @notice Thrown when operating on a non-existent quorum.
error QuorumDoesNotExist();
/// @notice Thrown when registering/deregistering with empty bitmap.
error BitmapEmpty();
/// @notice Thrown when registering for already registered quorums.
error AlreadyRegisteredForQuorums();
/// @notice Thrown when registering before ejection cooldown expires.
error CannotReregisterYet();
/// @notice Thrown when unregistered operator attempts restricted operation.
error NotRegistered();
/// @notice Thrown when operator attempts self-churn.
error CannotChurnSelf();
/// @notice Thrown when operator count doesn't match quorum requirements.
error QuorumOperatorCountMismatch();
/// @notice Thrown when operator has insufficient stake for churn.
error InsufficientStakeForChurn();
/// @notice Thrown when attempting to kick operator above stake threshold.
error CannotKickOperatorAboveThreshold();
/// @notice Thrown when updating to zero bitmap.
error BitmapCannotBeZero();
/// @notice Thrown when deregistering from unregistered quorum.
error NotRegisteredForQuorum();
/// @notice Thrown when churn approver salt is already used.
error ChurnApproverSaltUsed();
/// @notice Thrown when operators or quorums list is not sorted ascending.
error NotSorted();
/// @notice Thrown when maximum quorum count is reached.
error MaxQuorumsReached();
/// @notice Thrown when operator set operations are attempted while not enabled.
error OperatorSetsNotEnabled();
}
interface ISlashingRegistryCoordinatorTypes {
/// @notice Core data structure for tracking operator information.
/// @dev Links an operator's unique identifier with their current registration status.
/// @param operatorId Unique identifier for the operator, typically derived from their BLS public key.
/// @param status Current registration state of the operator in the system.
struct OperatorInfo {
bytes32 operatorId;
OperatorStatus status;
}
/// @notice Records historical changes to an operator's quorum registrations.
/// @dev Used for querying an operator's quorum memberships at specific block numbers.
/// @param updateBlockNumber Block number when this update occurred (inclusive).
/// @param nextUpdateBlockNumber Block number when the next update occurred (exclusive), or 0 if this is the latest update.
/// @param quorumBitmap Bitmap where each bit represents registration in a specific quorum (1 = registered, 0 = not registered).
struct QuorumBitmapUpdate {
uint32 updateBlockNumber;
uint32 nextUpdateBlockNumber;
uint192 quorumBitmap;
}
/// @notice Configuration parameters for operator management within a quorum.
/// @dev All BIPs (Basis Points) values are in relation to BIPS_DENOMINATOR (10000).
/// @param maxOperatorCount Maximum number of operators allowed in the quorum.
/// @param kickBIPsOfOperatorStake Required stake ratio (in BIPs) between new and existing operator for churn.
/// Example: 10500 means new operator needs 105% of existing operator's stake.
/// @param kickBIPsOfTotalStake Minimum stake ratio (in BIPs) of total quorum stake an operator must maintain.
/// Example: 100 means operator needs 1% of total quorum stake to avoid being churned.
struct OperatorSetParam {
uint32 maxOperatorCount;
uint16 kickBIPsOfOperatorStake;
uint16 kickBIPsOfTotalStake;
}
/// @notice Parameters for removing an operator during churn.
/// @dev Used in registerOperatorWithChurn to specify which operator to replace.
/// @param quorumNumber The quorum from which to remove the operator.
/// @param operator Address of the operator to be removed.
struct OperatorKickParam {
uint8 quorumNumber;
address operator;
}
/// @notice Represents the registration state of an operator.
/// @dev Used to track an operator's lifecycle in the system.
/// @custom:enum NEVER_REGISTERED The operator has never registered with the system.
/// @custom:enum REGISTERED The operator is currently registered and active.
/// @custom:enum DEREGISTERED The operator was previously registered but has since deregistered.
enum OperatorStatus {
NEVER_REGISTERED,
REGISTERED,
DEREGISTERED
}
/**
* @notice Enum representing the type of operator registration.
* @custom:enum NORMAL Represents a normal operator registration.
* @custom:enum CHURN Represents an operator registration during a churn event.
*/
enum RegistrationType {
NORMAL,
CHURN
}
/**
* @notice Data structure for storing the results of a registerOperator call.
* @dev Contains arrays storing per-quorum information about operator counts and stakes.
* @param numOperatorsPerQuorum For each quorum the operator registered for, stores the number of operators registered.
* @param operatorStakes For each quorum the operator registered for, stores the stake of the operator in the quorum.
* @param totalStakes For each quorum the operator registered for, stores the total stake of the quorum.
*/
struct RegisterResults {
uint32[] numOperatorsPerQuorum;
uint96[] operatorStakes;
uint96[] totalStakes;
}
}
interface ISlashingRegistryCoordinatorEvents is ISlashingRegistryCoordinatorTypes {
/**
* @notice Emitted when an operator registers for service in one or more quorums.
* @dev Emitted in _registerOperator() and _registerOperatorToOperatorSet().
* @param operator The address of the registered operator.
* @param operatorId The unique identifier of the operator (BLS public key hash).
*/
event OperatorRegistered(address indexed operator, bytes32 indexed operatorId);
/**
* @notice Emitted when an operator deregisters from service in one or more quorums.
* @dev Emitted in _deregisterOperator().
* @param operator The address of the deregistered operator.
* @param operatorId The unique identifier of the operator (BLS public key hash).
*/
event OperatorDeregistered(address indexed operator, bytes32 indexed operatorId);
/**
* @notice Emitted when a quorum's operator set parameters are updated.
* @dev Emitted in _setOperatorSetParams().
* @param quorumNumber The identifier of the quorum being updated.
* @param operatorSetParams The new operator set parameters for the quorum.
*/
event OperatorSetParamsUpdated(uint8 indexed quorumNumber, OperatorSetParam operatorSetParams);
/**
* @notice Emitted when the churn approver address is updated.
* @dev Emitted in _setChurnApprover().
* @param prevChurnApprover The previous churn approver address.
* @param newChurnApprover The new churn approver address.
*/
event ChurnApproverUpdated(address prevChurnApprover, address newChurnApprover);
/**
* @notice Emitted when the ejector address is updated.
* @dev Emitted in _setEjector().
* @param prevEjector The previous ejector address.
* @param newEjector The new ejector address.
*/
event EjectorUpdated(address prevEjector, address newEjector);
/**
* @notice Emitted when all operators in a quorum are updated simultaneously.
* @dev Emitted in updateOperatorsForQuorum().
* @param quorumNumber The identifier of the quorum being updated.
* @param blocknumber The block number at which the quorum update occurred.
*/
event QuorumBlockNumberUpdated(uint8 indexed quorumNumber, uint256 blocknumber);
/**
* @notice Emitted when an operator's socket is updated.
* @dev Emitted in updateSocket().
* @param operatorId The unique identifier of the operator (BLS public key hash).
* @param socket The new socket address for the operator (typically an IP address).
*/
event OperatorSocketUpdate(bytes32 indexed operatorId, string socket);
}
interface ISlashingRegistryCoordinator is
IAVSRegistrar,
ISlashingRegistryCoordinatorErrors,
ISlashingRegistryCoordinatorEvents
{
/// IMMUTABLES & CONSTANTS
/**
* @notice EIP-712 typehash for operator churn approval signatures.
* @return The typehash constant.
*/
function OPERATOR_CHURN_APPROVAL_TYPEHASH() external view returns (bytes32);
/**
* @notice EIP-712 typehash for pubkey registration signatures.
* @return The typehash constant.
*/
function PUBKEY_REGISTRATION_TYPEHASH() external view returns (bytes32);
/**
* @notice Reference to the BLSApkRegistry contract.
* @return The BLSApkRegistry contract interface.
*/
function blsApkRegistry() external view returns (IBLSApkRegistry);
/**
* @notice Reference to the StakeRegistry contract.
* @return The StakeRegistry contract interface.
*/
function stakeRegistry() external view returns (IStakeRegistry);
/**
* @notice Reference to the IndexRegistry contract.
* @return The IndexRegistry contract interface.
*/
function indexRegistry() external view returns (IIndexRegistry);
/**
* @notice Reference to the AllocationManager contract.
* @return The AllocationManager contract interface.
* @dev This is only relevant for Slashing AVSs
*/
function allocationManager() external view returns (IAllocationManager);
/// STORAGE
/**
* @notice The total number of quorums that have been created.
* @return The count of quorums.
*/
function quorumCount() external view returns (uint8);
/**
* @notice Checks if a churn approver salt has been used.
* @param salt The salt to check.
* @return True if the salt has been used, false otherwise.
*/
function isChurnApproverSaltUsed(
bytes32 salt
) external view returns (bool);
/**
* @notice Gets the last block number when all operators in a quorum were updated.
* @param quorumNumber The quorum identifier.
* @return The block number of the last update.
*/
function quorumUpdateBlockNumber(
uint8 quorumNumber
) external view returns (uint256);
/**
* @notice Gets the registry contract address at a specific index.
* @param index The index in the registries array.
* @return The registry contract address.
*/
function registries(
uint256 index
) external view returns (address);
/**
* @notice The address authorized to approve operator churn operations.
* @return The churn approver address.
*/
function churnApprover() external view returns (address);
/**
* @notice The address authorized to forcibly eject operators.
* @return The ejector address.
*/
function ejector() external view returns (address);
/**
* @notice Gets the timestamp of an operator's last ejection.
* @param operator The operator address.
* @return The timestamp of the last ejection.
*/
function lastEjectionTimestamp(
address operator
) external view returns (uint256);
/**
* @notice The cooldown period after ejection before an operator can re-register.
* @return The cooldown duration in seconds.
*/
function ejectionCooldown() external view returns (uint256);
/**
* @notice Checks if a quorum is an M2 quorum.
* @param quorumNumber The quorum identifier.
* @return True if the quorum is M2, false otherwise.
*/
function isM2Quorum(
uint8 quorumNumber
) external view returns (bool);
/**
* @notice Whether operator sets mode is enabled.
* @return True if operator sets mode is enabled, false otherwise.
*/
function operatorSetsEnabled() external view returns (bool);
/// ACTIONS
/**
* @notice Registers an operator through the allocation manager for operator set quorums.
* @param operator The operator address to register.
* @param operatorSetIds The operator set IDs to register for (corresponds to quorum numbers).
* @param data Additional registration data containing the operator's socket and BLS public key parameters.
* @dev Can only be called by the allocation manager.
* @dev Will revert if operator sets are not enabled or if registering for M2 quorums.
* @dev This function implements the Slashing registration pathway specified by the IAVSRegistrar interface.
*/
function registerOperator(
address operator,
uint32[] memory operatorSetIds,
bytes memory data
) external;
/**
* @notice Deregisters an operator through the allocation manager from operator set quorums.
* @param operator The operator address to deregister.
* @param operatorSetIds The operator set IDs to deregister from (corresponds to quorum numbers).
* @dev Can only be called by the allocation manager.
* @dev Will revert if operator sets are not enabled or if deregistering from M2 quorums.
* @dev This function implements the Slashing deregistration pathway specified by the IAVSRegistrar interface.
*/
function deregisterOperator(address operator, uint32[] memory operatorSetIds) external;
/**
* @notice Updates stake weights for specified operators. If any operator is found to be below
* the minimum stake for their registered quorums, they are deregistered from those quorums.
* @param operators The operators whose stakes should be updated.
* @dev Stakes are queried from the Eigenlayer core DelegationManager contract.
*/
function updateOperators(
address[] memory operators
) external;
/**
* @notice For each quorum in `quorumNumbers`, updates the StakeRegistry's view of ALL its registered operators' stakes.
* Each quorum's `quorumUpdateBlockNumber` is also updated, which tracks the most recent block number when ALL registered
* operators were updated.
* @dev stakes are queried from the Eigenlayer core DelegationManager contract
* @param operatorsPerQuorum for each quorum in `quorumNumbers`, this has a corresponding list of operators to update.
* @dev Each list of operator addresses MUST be sorted in ascending order
* @dev Each list of operator addresses MUST represent the entire list of registered operators for the corresponding quorum
* @param quorumNumbers is an ordered byte array containing the quorum numbers being updated
* @dev invariant: Each list of `operatorsPerQuorum` MUST be a sorted version of `IndexRegistry.getOperatorListAtBlockNumber`
* for the corresponding quorum.
* @dev note on race condition: if an operator registers/deregisters for any quorum in `quorumNumbers` after a txn to
* this method is broadcast (but before it is executed), the method will fail
*/
function updateOperatorsForQuorum(
address[][] memory operatorsPerQuorum,
bytes calldata quorumNumbers
) external;
/**
* @notice Updates the socket of the msg.sender given they are a registered operator.
* @param socket The new socket address for the operator (typically an IP address).
* @dev Will revert if msg.sender is not a registered operator.
*/
function updateSocket(
string memory socket
) external;
/**
* @notice Forcibly removes an operator from specified quorums and sets their ejection timestamp.
* @param operator The operator address to eject.
* @param quorumNumbers The quorum numbers to eject the operator from.
* @dev Can only be called by the ejector address.
* @dev The operator cannot re-register until ejectionCooldown period has passed.
*/
function ejectOperator(address operator, bytes memory quorumNumbers) external;
/**
* @notice Creates a new quorum that tracks total delegated stake for operators.
* @param operatorSetParams Configures the quorum's max operator count and churn parameters.
* @param minimumStake Sets the minimum stake required for an operator to register or remain registered.
* @param strategyParams A list of strategies and multipliers used by the StakeRegistry to calculate
* an operator's stake weight for the quorum.
* @dev For m2 AVS this function has the same behavior as createQuorum before.
* @dev For migrated AVS that enable operator sets this will create a quorum that measures total delegated stake for operator set.
*/
function createTotalDelegatedStakeQuorum(
OperatorSetParam memory operatorSetParams,
uint96 minimumStake,
IStakeRegistryTypes.StrategyParams[] memory strategyParams
) external;
/**
* @notice Creates a new quorum that tracks slashable stake for operators.
* @param operatorSetParams Configures the quorum's max operator count and churn parameters.
* @param minimumStake Sets the minimum stake required for an operator to register or remain registered.
* @param strategyParams A list of strategies and multipliers used by the StakeRegistry to calculate
* an operator's stake weight for the quorum.
* @param lookAheadPeriod The number of blocks to look ahead when calculating slashable stake.
* @dev Can only be called when operator sets are enabled.
*/
function createSlashableStakeQuorum(
OperatorSetParam memory operatorSetParams,
uint96 minimumStake,
IStakeRegistryTypes.StrategyParams[] memory strategyParams,
uint32 lookAheadPeriod
) external;
/**
* @notice Updates the configuration parameters for an existing operator set quorum.
* @param quorumNumber The identifier of the quorum to update.
* @param operatorSetParams The new operator set parameters to apply.
* @dev Can only be called by the contract owner.
*/
function setOperatorSetParams(
uint8 quorumNumber,
OperatorSetParam memory operatorSetParams
) external;
/**
* @notice Updates the address authorized to approve operator churn operations.
* @param _churnApprover The new churn approver address.
* @dev Can only be called by the contract owner.
* @dev The churn approver is responsible for signing off on operator replacements in full quorums.
*/
function setChurnApprover(
address _churnApprover
) external;
/**
* @notice Updates the address authorized to forcibly eject operators.
* @param _ejector The new ejector address.
* @dev Can only be called by the contract owner.
* @dev The ejector can force-remove operators from quorums regardless of their stake.
*/
function setEjector(
address _ejector
) external;
/**
* @notice Updates the duration operators must wait after ejection before re-registering.
* @param _ejectionCooldown The new cooldown duration in seconds.
* @dev Can only be called by the contract owner.
*/
function setEjectionCooldown(
uint256 _ejectionCooldown
) external;
/**
* @notice Updates the account identifier for this AVS (used for UAM integration in EigenLayer)
* @param _accountIdentifier The new account identifier address
* @dev Can only be called by the contract owner
* @dev NOTE: Updating this value will break existing OperatorSets and UAM integration. This value should only be set once.
*/
function setAccountIdentifier(
address _accountIdentifier
) external;
/// VIEW
/**
* @notice Returns the operator set parameters for a given quorum.
* @param quorumNumber The identifier of the quorum to query.
* @return The OperatorSetParam struct containing max operator count and churn thresholds.
*/
function getOperatorSetParams(
uint8 quorumNumber
) external view returns (OperatorSetParam memory);
/**
* @notice Returns the complete operator information for a given address.
* @param operator The operator address to query.
* @return An OperatorInfo struct containing the operator's ID and registration status.
*/
function getOperator(
address operator
) external view returns (OperatorInfo memory);
/**
* @notice Returns the unique identifier for a given operator address.
* @param operator The operator address to query.
* @return The operator's ID (derived from their BLS public key hash).
*/
function getOperatorId(
address operator
) external view returns (bytes32);
/**
* @notice Returns the operator address associated with a given operator ID.
* @param operatorId The unique identifier to look up.
* @return The operator's address.
* @dev Returns address(0) if the ID is not registered.
*/
function getOperatorFromId(
bytes32 operatorId
) external view returns (address);
/**
* @notice Returns the current registration status for a given operator.
* @param operator The operator address to query.
* @return The operator's status (NEVER_REGISTERED, REGISTERED, or DEREGISTERED).
*/
function getOperatorStatus(
address operator
) external view returns (OperatorStatus);
/**
* @notice Returns the indices needed to look up quorum bitmaps for operators at a specific block.
* @param blockNumber The historical block number to query.
* @param operatorIds Array of operator IDs to get indices for.
* @return Array of indices corresponding to each operator ID.
* @dev Reverts if any operator had not yet registered at the specified block.
* @dev This function is designed to find proper inputs for getQuorumBitmapAtBlockNumberByIndex.
*/
function getQuorumBitmapIndicesAtBlockNumber(
uint32 blockNumber,
bytes32[] memory operatorIds
) external view returns (uint32[] memory);
/**
* @notice Returns the quorum bitmap for an operator at a specific historical block.
* @param operatorId The operator's unique identifier.
* @param blockNumber The historical block number to query.
* @param index The index in the operator's bitmap history (from getQuorumBitmapIndicesAtBlockNumber).
* @return The quorum bitmap showing which quorums the operator was registered for.
* @dev Reverts if the index is incorrect for the specified block number.
*/
function getQuorumBitmapAtBlockNumberByIndex(
bytes32 operatorId,
uint32 blockNumber,
uint256 index
) external view returns (uint192);
/**
* @notice Returns a specific update from an operator's quorum bitmap history.
* @param operatorId The operator's unique identifier.
* @param index The index in the bitmap history to query.
* @return The QuorumBitmapUpdate struct at that index.
*/
function getQuorumBitmapUpdateByIndex(
bytes32 operatorId,
uint256 index
) external view returns (QuorumBitmapUpdate memory);
/**
* @notice Returns the current quorum bitmap for an operator.
* @param operatorId The operator's unique identifier.
* @return A bitmap where each bit represents registration in a specific quorum.
* @dev Returns 0 if the operator is not registered for any quorums.
*/
function getCurrentQuorumBitmap(
bytes32 operatorId
) external view returns (uint192);
/**
* @notice Returns the number of updates in an operator's bitmap history.
* @param operatorId The operator's unique identifier.
* @return The length of the bitmap history array.
*/
function getQuorumBitmapHistoryLength(
bytes32 operatorId
) external view returns (uint256);
/**
* @notice Returns the number of registry contracts managed by this coordinator.
* @return The count of registry contracts (typically 3: stake, BLS, and index).
*/
function numRegistries() external view returns (uint256);
/**
* @notice Calculates the digest hash that must be signed by the churn approver.
* @param registeringOperator The address of the operator attempting to register.
* @param registeringOperatorId The unique ID of the registering operator.
* @param operatorKickParams Parameters specifying which operators to replace in full quorums.
* @param salt Random value to ensure signature uniqueness.
* @param expiry Timestamp after which the signature becomes invalid.
* @return The EIP-712 typed data hash to be signed.
*/
function calculateOperatorChurnApprovalDigestHash(
address registeringOperator,
bytes32 registeringOperatorId,
OperatorKickParam[] memory operatorKickParams,
bytes32 salt,
uint256 expiry
) external view returns (bytes32);
/**
* @notice Returns the message hash that an operator must sign to register their BLS public key.
* @param operator The address of the operator registering their key.
* @return A point on the G1 curve representing the message hash.
*/
function pubkeyRegistrationMessageHash(
address operator
) external view returns (BN254.G1Point memory);
/**
* @notice Returns the address of the contract owner.
* @return The owner's address.
* @dev The owner can update contract configuration and create new quorums.
*/
function owner() external view returns (address);
/**
* @notice Returns the account identifier for this AVS (used for UAM integration in EigenLayer)
* @dev NOTE: Updating this value will break existing OperatorSets and UAM integration. This value should only be set once.
* @return The account identifier address
*/
function accountIdentifier() external view returns (address);
}