Skip to content

Commit 099096d

Browse files
authored
claim legacy roles (#102)
1 parent a8bfc26 commit 099096d

File tree

2 files changed

+41
-1
lines changed

2 files changed

+41
-1
lines changed

packages/utils/src/components/roles/interface.cairo

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ pub trait IRoles<TContractState> {
6868
fn remove_security_admin(ref self: TContractState, account: ContractAddress);
6969
fn register_security_agent(ref self: TContractState, account: ContractAddress);
7070
fn remove_security_agent(ref self: TContractState, account: ContractAddress);
71+
fn has_legacy_role(self: @TContractState, account: ContractAddress, role: RoleId) -> bool;
72+
fn reclaim_legacy_roles(ref self: TContractState);
7173
}
7274

7375
#[starknet::interface]

packages/utils/src/components/roles/roles.cairo

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)