@@ -9,12 +9,17 @@ pub(crate) mod RolesComponent {
99 UpgradeGovernorRemoved ,
1010 };
1111 use core :: num :: traits :: Zero ;
12+ use starknet :: storage :: StorageMapReadAccess ;
1213 use starknet :: {ContractAddress , get_caller_address};
1314 use starkware_utils :: components :: roles :: errors :: AccessErrors ;
1415 use starkware_utils :: components :: roles :: interface as RolesInterface ;
1516
1617 #[storage]
17- pub struct Storage {}
18+ pub struct Storage {
19+ // LEGACY: This is the old storage for role members.
20+ // We need it to allow reclaim legacy roles.
21+ role_members : starknet :: storage :: Map <(RoleId , ContractAddress ), bool >,
22+ }
1823
1924 #[event]
2025 #[derive(Copy , Drop , PartialEq , starknet:: Event )]
@@ -255,8 +260,41 @@ pub(crate) mod RolesComponent {
255260 // TODO add another event? Currently there are two events when a role is removed but
256261 // only one if it was renounced.
257262 }
263+ fn has_legacy_role (
264+ self : @ ComponentState <TContractState >, account : ContractAddress , role : RoleId ,
265+ ) -> bool {
266+ self . role_members. read ((role , account ))
267+ }
268+ fn reclaim_legacy_roles (ref self : ComponentState <TContractState >) {
269+ let account = get_caller_address ();
270+ self . _reclaim_role (role : GOVERNANCE_ADMIN , : account );
271+ self . _reclaim_role (role : APP_GOVERNOR , : account );
272+ self . _reclaim_role (role : APP_ROLE_ADMIN , : account );
273+ self . _reclaim_role (role : OPERATOR , : account );
274+ self . _reclaim_role (role : TOKEN_ADMIN , : account );
275+ self . _reclaim_role (role : UPGRADE_GOVERNOR , : account );
276+ self . _reclaim_role (role : SECURITY_ADMIN , : account );
277+ self . _reclaim_role (role : SECURITY_AGENT , : account );
278+ }
258279 }
259280
281+ #[generate_trait]
282+ pub impl ClaimRoleImpl <
283+ TContractState ,
284+ + HasComponent <TContractState >,
285+ + Drop <TContractState >,
286+ impl Access : AccessControlComponent :: HasComponent <TContractState >,
287+ + SRC5Component :: HasComponent <TContractState >,
288+ > of ClaimRoleInternal <TContractState > {
289+ fn _reclaim_role (
290+ ref self : ComponentState <TContractState >, role : RoleId , account : ContractAddress ,
291+ ) {
292+ if self . has_legacy_role (account , role ) {
293+ let mut access_comp = get_dep_component_mut! (ref self , Access );
294+ access_comp . _grant_role (: role , : account );
295+ }
296+ }
297+ }
260298
261299 #[generate_trait]
262300 pub impl RolesInternalImpl <
0 commit comments