@@ -380,6 +380,169 @@ Generated by [AVA](https://avajs.dev).
380380 }␊
381381 `
382382
383+ ## access control roles default admin rules (default opts)
384+
385+ > Snapshot 1
386+
387+ `// SPDX-License-Identifier: MIT␊
388+ // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊
389+ ␊
390+ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊
391+ ␊
392+ #[starknet::contract]␊
393+ mod MyContract {␊
394+ use openzeppelin::access::accesscontrol::extensions::{␊
395+ AccessControlDefaultAdminRulesComponent,␊
396+ DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊
397+ };␊
398+ use openzeppelin::interfaces::upgrades::IUpgradeable;␊
399+ use openzeppelin::introspection::src5::SRC5Component;␊
400+ use openzeppelin::upgrades::UpgradeableComponent;␊
401+ use starknet::{ClassHash, ContractAddress};␊
402+ use super::UPGRADER_ROLE;␊
403+ ␊
404+ const INITIAL_DELAY: u64 = 86400; // 1 day␊
405+ ␊
406+ component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊
407+ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊
408+ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
409+ ␊
410+ // External␊
411+ #[abi(embed_v0)]␊
412+ impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl<ContractState>;␊
413+ ␊
414+ // Internal␊
415+ impl AccessControlDefaultAdminRulesInternalImpl = AccessControlDefaultAdminRulesComponent::InternalImpl<ContractState>;␊
416+ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
417+ ␊
418+ #[storage]␊
419+ struct Storage {␊
420+ #[substorage(v0)]␊
421+ accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊
422+ #[substorage(v0)]␊
423+ src5: SRC5Component::Storage,␊
424+ #[substorage(v0)]␊
425+ upgradeable: UpgradeableComponent::Storage,␊
426+ }␊
427+ ␊
428+ #[event]␊
429+ #[derive(Drop, starknet::Event)]␊
430+ enum Event {␊
431+ #[flat]␊
432+ AccessControlDefaultAdminRulesEvent: AccessControlDefaultAdminRulesComponent::Event,␊
433+ #[flat]␊
434+ SRC5Event: SRC5Component::Event,␊
435+ #[flat]␊
436+ UpgradeableEvent: UpgradeableComponent::Event,␊
437+ }␊
438+ ␊
439+ #[constructor]␊
440+ fn constructor(␊
441+ ref self: ContractState,␊
442+ initial_default_admin: ContractAddress,␊
443+ upgrader: ContractAddress,␊
444+ ) {␊
445+ self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊
446+ ␊
447+ self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊
448+ }␊
449+ ␊
450+ //␊
451+ // Upgradeable␊
452+ //␊
453+ ␊
454+ #[abi(embed_v0)]␊
455+ impl UpgradeableImpl of IUpgradeable<ContractState> {␊
456+ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
457+ self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊
458+ self.upgradeable.upgrade(new_class_hash);␊
459+ }␊
460+ }␊
461+ }␊
462+ `
463+
464+ ## access control roles default admin rules (custom opts)
465+
466+ > Snapshot 1
467+
468+ `// SPDX-License-Identifier: MIT␊
469+ // Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊
470+ ␊
471+ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊
472+ ␊
473+ #[starknet::contract]␊
474+ mod MyContract {␊
475+ use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊
476+ use openzeppelin::interfaces::upgrades::IUpgradeable;␊
477+ use openzeppelin::introspection::src5::SRC5Component;␊
478+ use openzeppelin::upgrades::UpgradeableComponent;␊
479+ use starknet::{ClassHash, ContractAddress};␊
480+ use super::UPGRADER_ROLE;␊
481+ ␊
482+ const INITIAL_DELAY: u64 = 172800; // 2 days␊
483+ ␊
484+ component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊
485+ component!(path: SRC5Component, storage: src5, event: SRC5Event);␊
486+ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
487+ ␊
488+ // External␊
489+ #[abi(embed_v0)]␊
490+ impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl<ContractState>;␊
491+ ␊
492+ // Internal␊
493+ impl AccessControlDefaultAdminRulesInternalImpl = AccessControlDefaultAdminRulesComponent::InternalImpl<ContractState>;␊
494+ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
495+ ␊
496+ #[storage]␊
497+ struct Storage {␊
498+ #[substorage(v0)]␊
499+ accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊
500+ #[substorage(v0)]␊
501+ src5: SRC5Component::Storage,␊
502+ #[substorage(v0)]␊
503+ upgradeable: UpgradeableComponent::Storage,␊
504+ }␊
505+ ␊
506+ #[event]␊
507+ #[derive(Drop, starknet::Event)]␊
508+ enum Event {␊
509+ #[flat]␊
510+ AccessControlDefaultAdminRulesEvent: AccessControlDefaultAdminRulesComponent::Event,␊
511+ #[flat]␊
512+ SRC5Event: SRC5Component::Event,␊
513+ #[flat]␊
514+ UpgradeableEvent: UpgradeableComponent::Event,␊
515+ }␊
516+ ␊
517+ #[constructor]␊
518+ fn constructor(␊
519+ ref self: ContractState,␊
520+ initial_default_admin: ContractAddress,␊
521+ upgrader: ContractAddress,␊
522+ ) {␊
523+ self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊
524+ ␊
525+ self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊
526+ }␊
527+ ␊
528+ impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊
529+ const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊
530+ }␊
531+ ␊
532+ //␊
533+ // Upgradeable␊
534+ //␊
535+ ␊
536+ #[abi(embed_v0)]␊
537+ impl UpgradeableImpl of IUpgradeable<ContractState> {␊
538+ fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
539+ self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊
540+ self.upgradeable.upgrade(new_class_hash);␊
541+ }␊
542+ }␊
543+ }␊
544+ `
545+
383546## pausable with access control disabled
384547
385548> Snapshot 1
0 commit comments