@@ -51,8 +51,9 @@ contract SigningCoordinator is Initializable, AccessControlDefaultAdminRulesUpgr
5151 uint256 [20 ] gap;
5252 }
5353
54- struct ServerAdmin {
55- bool active;
54+ struct Server {
55+ address [] serverAdmins;
56+ mapping (address serverAdmin = > bool active ) activeServerAdmins;
5657 mapping (uint256 chainId = > bytes conditions ) conditions;
5758 }
5859
@@ -68,8 +69,7 @@ contract SigningCoordinator is Initializable, AccessControlDefaultAdminRulesUpgr
6869 SigningCohortParticipant[] signers;
6970 uint256 [] chains;
7071 mapping (uint256 chainId = > bytes conditions ) conditions; // TODO: chainId -> condition itself or hash(condition)
71- address [] serverAdmins;
72- mapping (address serverAdmin = > ServerAdmin) serverAdminConditions;
72+ mapping (uint256 serverId = > Server) serverConditions;
7373 }
7474
7575 bytes32 public constant INITIATOR_ROLE = keccak256 ("INITIATOR_ROLE " );
@@ -257,31 +257,32 @@ contract SigningCoordinator is Initializable, AccessControlDefaultAdminRulesUpgr
257257 return id;
258258 }
259259
260- function setServerAdmin (uint32 cohortId , address [] memory serverAdmins ) external {
260+ function setServerAdmins (
261+ uint32 cohortId ,
262+ uint256 serverId ,
263+ address [] memory serverAdmins
264+ ) external {
261265 SigningCohort storage signingCohort = signingCohorts[cohortId];
262266 require (isCohortActive (signingCohort), "Cohort not active " );
263267 require (
264268 signingCohort.authority == msg .sender ,
265269 "Only the cohort authority can set server admin "
266270 );
267- for (uint256 i = 0 ; i < signingCohort.serverAdmins.length ; i++ ) {
268- address serverAdmin = signingCohort.serverAdmins[i];
269- signingCohort.serverAdminConditions[serverAdmin].active = false ;
271+ require (serverId > 0 , "Server id can't be zero " );
272+ Server storage server = signingCohort.serverConditions[serverId];
273+ for (uint256 i = 0 ; i < server.serverAdmins.length ; i++ ) {
274+ address serverAdmin = server.serverAdmins[i];
275+ server.activeServerAdmins[serverAdmin] = false ;
270276 }
271- signingCohort .serverAdmins = serverAdmins;
272- for (uint256 i = 0 ; i < signingCohort .serverAdmins.length ; i++ ) {
273- address serverAdmin = signingCohort .serverAdmins[i];
274- signingCohort.serverAdminConditions [serverAdmin].active = true ;
277+ server .serverAdmins = serverAdmins;
278+ for (uint256 i = 0 ; i < server .serverAdmins.length ; i++ ) {
279+ address serverAdmin = server .serverAdmins[i];
280+ server.activeServerAdmins [serverAdmin] = true ;
275281 }
276282 // TODO emit event
277283 }
278284
279- function setSigningCohortConditions (
280- uint32 cohortId ,
281- uint256 chainId ,
282- bytes calldata conditions
283- ) external {
284- SigningCohort storage signingCohort = signingCohorts[cohortId];
285+ function conditionsCheck (SigningCohort storage signingCohort , uint256 chainId ) internal view {
285286 require (isCohortActive (signingCohort), "Cohort not active " );
286287 // chainId must already be deployed for the cohort
287288 bool chainDeployed = false ;
@@ -292,40 +293,62 @@ contract SigningCoordinator is Initializable, AccessControlDefaultAdminRulesUpgr
292293 }
293294 }
294295 require (chainDeployed, "Not already deployed " );
295- ServerAdmin storage serverAdmin = signingCohort.serverAdminConditions[msg .sender ];
296+ }
297+
298+ function setSigningCohortConditions (
299+ uint32 cohortId ,
300+ uint256 chainId ,
301+ bytes calldata conditions
302+ ) external {
303+ SigningCohort storage signingCohort = signingCohorts[cohortId];
304+ conditionsCheck (signingCohort, chainId);
305+ require (
306+ signingCohort.authority == msg .sender ,
307+ "Only the cohort authority can set conditions "
308+ );
309+ signingCohort.conditions[chainId] = conditions;
310+ emit SigningCohortConditionsSet (cohortId, msg .sender , chainId, conditions);
311+ }
312+
313+ function setSigningCohortConditions (
314+ uint32 cohortId ,
315+ uint256 chainId ,
316+ bytes calldata conditions ,
317+ uint256 serverId
318+ ) external {
319+ SigningCohort storage signingCohort = signingCohorts[cohortId];
320+ conditionsCheck (signingCohort, chainId);
321+ require (serverId > 0 , "Server id can't be zero " );
322+ Server storage server = signingCohort.serverConditions[serverId];
296323
297324 require (
298- signingCohort.authority == msg .sender || serverAdmin.active ,
325+ signingCohort.authority == msg .sender || server.activeServerAdmins[ msg . sender ] ,
299326 "Only the cohort authority or a server admin can set conditions "
300327 );
301- if (serverAdmin.active) {
302- serverAdmin.conditions[chainId] = conditions;
303- } else {
304- signingCohort.conditions[chainId] = conditions;
305- }
306- emit SigningCohortConditionsSet (cohortId, msg .sender , chainId, conditions);
328+ server.conditions[chainId] = conditions;
329+ emit SigningCohortConditionsSet (cohortId, msg .sender , chainId, conditions); // TODO log serverId
307330 }
308331
309332 function getSigningCohortConditions (
310333 uint32 cohortId ,
311334 uint256 chainId
312335 ) external view returns (bytes [] memory ) {
313- return getSigningCohortConditions (cohortId, chainId, address ( 0 ) );
336+ return getSigningCohortConditions (cohortId, chainId, 0 );
314337 }
315338
316339 function getSigningCohortConditions (
317340 uint32 cohortId ,
318341 uint256 chainId ,
319- address serverAdmin
342+ uint256 serverId
320343 ) public view returns (bytes [] memory conditions ) {
321344 SigningCohort storage signingCohort = signingCohorts[cohortId];
322345 bytes memory coreConditions = signingCohort.conditions[chainId];
323- bytes memory serverAdminConditions = signingCohort
324- .serverAdminConditions[serverAdmin]
325- .conditions[chainId ];
326- if (serverAdminConditions .length > 0 ) {
346+ bytes memory serverConditions = signingCohort.serverConditions[serverId].conditions[
347+ chainId
348+ ];
349+ if (serverConditions .length > 0 ) {
327350 conditions = new bytes [](2 );
328- conditions[1 ] = serverAdminConditions ;
351+ conditions[1 ] = serverConditions ;
329352 } else {
330353 conditions = new bytes [](1 );
331354 }
0 commit comments