Skip to content
Merged
Show file tree
Hide file tree
Changes from 42 commits
Commits
Show all changes
43 commits
Select commit Hold shift + click to select a range
ba2e792
Add AccessControlDefaultAdminRulesComponent to set-access-control
immrsd Aug 19, 2025
80e8cd7
Add basic support for AccessControlDefaultAdminRulesComponent in UI
immrsd Aug 19, 2025
b2fd760
Merge master
immrsd Sep 25, 2025
efe47ba
Use IERC2981Admin impl for AccessControlDefaultAdminRules
immrsd Sep 25, 2025
95bc5af
Update set-acess-control to support AccessControlDefaultAdminRules
immrsd Oct 21, 2025
03372ce
Support AccessControlDAR in set-royalty-info
immrsd Oct 21, 2025
2a48369
Improve printing logic for trait constants to include comments
immrsd Oct 21, 2025
3d1acde
Support AccessControl changes in Vesting, Governor, and Multisig
immrsd Oct 21, 2025
ccdd7d9
Update cairo-alpha index file
immrsd Oct 21, 2025
954776b
Update access control type in common options
immrsd Oct 21, 2025
390913f
Update ERC20 tests
immrsd Oct 21, 2025
5dbb32c
Update ERC721 tests
immrsd Oct 21, 2025
77099e5
Update ERC1155 tests
immrsd Oct 21, 2025
f75e13e
Update Custom contract tests
immrsd Oct 21, 2025
de7e743
Update ERC20 test snapshots
immrsd Oct 21, 2025
d75ba22
Update ERC721 test snapshots
immrsd Oct 21, 2025
83b013d
Update ERC1155 test snapshots
immrsd Oct 21, 2025
0a9315f
Update Custom contract test snapshots
immrsd Oct 21, 2025
0ad8e18
Update Governor test snapshots
immrsd Oct 21, 2025
aace193
Update AccessControl UI component
immrsd Oct 21, 2025
bb19703
Support AccessControl changes in ERC20Controls
immrsd Oct 21, 2025
6e69d56
Support AccessControl changes in ERC721Controls
immrsd Oct 21, 2025
08e08e7
Support AccessControl changes in ERC1155Controls
immrsd Oct 21, 2025
2934779
Support AccessControl changes in CustomControls
immrsd Oct 21, 2025
b816aa3
Run formatter
immrsd Oct 21, 2025
f4aeb25
Merge master
immrsd Oct 21, 2025
af2cb09
Add changelog entry
immrsd Oct 21, 2025
356caa8
Make review fixes
immrsd Oct 21, 2025
0af0f4b
Make all AccessControl members function-based, declare its type expli…
immrsd Oct 24, 2025
24ee5c1
Introduce AccessControl subset
immrsd Oct 24, 2025
4c8a8bd
Support access control subset parsing in test project script
immrsd Oct 24, 2025
691d5a4
Add access control subset to ERC20, ERC721, ERC1155, and Custom contr…
immrsd Oct 24, 2025
34b7b18
Support access control subset options in contract generation logic
immrsd Oct 24, 2025
cd7a93d
Support access control subset in tests
immrsd Oct 24, 2025
8372646
Update Cairo-alpha CI test project workflow to support access control…
immrsd Oct 24, 2025
755ffef
Update links to Cairo-alpha docs in AccountControls.svelte
immrsd Oct 24, 2025
c2a0b68
Add descriptions for Cairo-alpha access control type properties
immrsd Oct 24, 2025
693a87e
Update Cairo-alpha access function description for AI assistant
immrsd Oct 24, 2025
bb07581
Lint and format files
immrsd Oct 24, 2025
54b266b
Merge master
immrsd Oct 24, 2025
7b4b042
Add changeset entry for changes in common package
immrsd Oct 24, 2025
d7f0a63
Fix Cairo-alpha test project workflow
immrsd Oct 24, 2025
c0da42b
Simplify update-scarb-project script to support parameters only in --…
immrsd Oct 27, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .changeset/sixty-turkeys-pay.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@openzeppelin/wizard-common': patch
---

Add AI descriptions for AccessControl in Cairo-alpha
26 changes: 21 additions & 5 deletions .github/workflows/compile-cairo-alpha-project.yml
Original file line number Diff line number Diff line change
Expand Up @@ -47,15 +47,31 @@ jobs:
set -e

declare -a all_kinds=("ERC20" "ERC721" "ERC1155" "Account" "Multisig" "Governor" "Vesting" "Custom")
declare -a all_royalty_info_options=("disabled" "enabled_default" "enabled_custom")
declare -a all_access_options=("disabled" "ownable" "roles" "roles-dar-default" "roles-dar-custom")
declare -a all_royalty_options=("disabled" "enabled-default" "enabled-custom")
for kind in "${all_kinds[@]}"; do
scarb clean

if [[ "$kind" == "ERC721" || "$kind" == "ERC1155" ]]; then
for royalty_info_option in "${all_royalty_info_options[@]}"; do
proj_name="'$kind (royalty info: $royalty_info_option)' test project"
for access_option in "${all_access_options[@]}"; do
for royalty_option in "${all_royalty_options[@]}"; do
proj_name="'$kind, access: $access_option, royalty: $royalty_option' test project"
echo "Generating $proj_name..."
yarn run update_scarb_project --kind=$kind --access=$access_option --royalty=$royalty_option

echo "Compiling $proj_name..."
scarb build

echo "✅ Compiled $proj_name!"
echo "---------------------------------"
done
done

elif [[ "$kind" == "ERC20" || "$kind" == "Custom" ]]; then
for access_option in "${all_access_options[@]}"; do
proj_name="'$kind, access: $access_option' test project"
echo "Generating $proj_name..."
yarn run update_scarb_project $kind $royalty_info_option
yarn run update_scarb_project --kind=$kind --access=$access_option

echo "Compiling $proj_name..."
scarb build
Expand All @@ -68,7 +84,7 @@ jobs:
proj_name="'$kind' test project"

echo "Generating $proj_name..."
yarn run update_scarb_project $kind
yarn run update_scarb_project --kind=$kind

echo "Compiling $proj_name..."
scarb build
Expand Down
8 changes: 8 additions & 0 deletions packages/common/src/ai/descriptions/cairo.ts
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,14 @@ export const cairoCommonDescriptions = {
'Provides information for how much royalty is owed and to whom, based on a sale price. Follows ERC-2981 standard.',
};

export const cairoAlphaAccessDescriptions = {
accessType:
'The type of access control to provision. Ownable is a simple mechanism with a single account authorized for all privileged actions. Roles is a flexible mechanism with a separate role for each privileged action. A role can have many authorized accounts. Roles (Default Admin Rules) provides additional enforced security measures on top of standard Roles mechanism for managing the most privileged role: default admin.',
darInitialDelay: 'The initial delay for the default admin role (in case Roles (Default Admin Rules) is used).',
darDefaultDelayIncrease:
'The default delay increase for the default admin role (in case Roles (Default Admin Rules) is used).',
};

export const cairoRoyaltyInfoDescriptions = {
enabled: 'Whether to enable royalty feature for the contract',
defaultRoyaltyFraction:
Expand Down
2 changes: 2 additions & 0 deletions packages/core/cairo_alpha/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

## Unreleased

- Add AccessControlDefaultAdminRules. ([#698](https://github.com/OpenZeppelin/contracts-wizard/pull/698))

- **Breaking changes**:
- Use OpenZeppelin Contracts for Cairo v3.0.0-alpha.3. ([#688](https://github.com/OpenZeppelin/contracts-wizard/pull/688))
- Use OpenZeppelin Contracts for Cairo v3.0.0-alpha.2. ([#663](https://github.com/OpenZeppelin/contracts-wizard/pull/663))
Expand Down
3 changes: 2 additions & 1 deletion packages/core/cairo_alpha/src/common-options.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import type { Argument } from './contract';
import type { Access } from './set-access-control';
import { AccessControl } from './set-access-control';
import type { Info } from './set-info';
import { defaults as infoDefaults } from './set-info';
import type { Upgradeable } from './set-upgradeable';
Expand All @@ -11,7 +12,7 @@ export const defaults: Required<CommonOptions> = {

export const contractDefaults: Required<CommonContractOptions> = {
...defaults,
access: false,
access: AccessControl.None(),
} as const;

export interface CommonOptions {
Expand Down
19 changes: 14 additions & 5 deletions packages/core/cairo_alpha/src/custom.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { custom } from '.';
import type { CustomOptions } from './custom';
import { buildCustom } from './custom';
import { printContract } from './print';
import { AccessControl, darDefaultOpts, darCustomOpts } from './set-access-control';

function testCustom(title: string, opts: Partial<CustomOptions>) {
test(title, t => {
Expand Down Expand Up @@ -48,20 +49,28 @@ testCustom('upgradeable', {

testCustom('access control disabled', {
upgradeable: false,
access: false,
access: AccessControl.None(),
});

testCustom('access control ownable', {
access: 'ownable',
access: AccessControl.Ownable(),
});

testCustom('access control roles', {
access: 'roles',
access: AccessControl.Roles(),
});

testCustom('access control roles default admin rules (default opts)', {
access: AccessControl.RolesDefaultAdminRules(darDefaultOpts),
});

testCustom('access control roles default admin rules (custom opts)', {
access: AccessControl.RolesDefaultAdminRules(darCustomOpts),
});

testCustom('pausable with access control disabled', {
// API should override access to true since it is required for pausable
access: false,
access: AccessControl.None(),
pausable: true,
upgradeable: false,
});
Expand All @@ -70,7 +79,7 @@ testAPIEquivalence('custom API default');

testAPIEquivalence('custom API full upgradeable', {
name: 'CustomContract',
access: 'roles',
access: AccessControl.Roles(),
pausable: true,
upgradeable: true,
});
Expand Down
163 changes: 163 additions & 0 deletions packages/core/cairo_alpha/src/custom.test.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -380,6 +380,169 @@ Generated by [AVA](https://avajs.dev).
}␊
`

## access control roles default admin rules (default opts)

> Snapshot 1

`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊
const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊
#[starknet::contract]␊
mod MyContract {␊
use openzeppelin::access::accesscontrol::extensions::{␊
AccessControlDefaultAdminRulesComponent,␊
DefaultConfig as AccessControlDefaultAdminRulesDefaultConfig␊
};␊
use openzeppelin::interfaces::upgrades::IUpgradeable;␊
use openzeppelin::introspection::src5::SRC5Component;␊
use openzeppelin::upgrades::UpgradeableComponent;␊
use starknet::{ClassHash, ContractAddress};␊
use super::UPGRADER_ROLE;␊
const INITIAL_DELAY: u64 = 86400; // 1 day␊
component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊
component!(path: SRC5Component, storage: src5, event: SRC5Event);␊
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
// External␊
#[abi(embed_v0)]␊
impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl<ContractState>;␊
// Internal␊
impl AccessControlDefaultAdminRulesInternalImpl = AccessControlDefaultAdminRulesComponent::InternalImpl<ContractState>;␊
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
#[storage]␊
struct Storage {␊
#[substorage(v0)]␊
accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊
#[substorage(v0)]␊
src5: SRC5Component::Storage,␊
#[substorage(v0)]␊
upgradeable: UpgradeableComponent::Storage,␊
}␊
#[event]␊
#[derive(Drop, starknet::Event)]␊
enum Event {␊
#[flat]␊
AccessControlDefaultAdminRulesEvent: AccessControlDefaultAdminRulesComponent::Event,␊
#[flat]␊
SRC5Event: SRC5Component::Event,␊
#[flat]␊
UpgradeableEvent: UpgradeableComponent::Event,␊
}␊
#[constructor]␊
fn constructor(␊
ref self: ContractState,␊
initial_default_admin: ContractAddress,␊
upgrader: ContractAddress,␊
) {␊
self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊
self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊
}␊
//␊
// Upgradeable␊
//␊
#[abi(embed_v0)]␊
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊
self.upgradeable.upgrade(new_class_hash);␊
}␊
}␊
}␊
`

## access control roles default admin rules (custom opts)

> Snapshot 1

`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts for Cairo 3.0.0-alpha.3␊
const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊
#[starknet::contract]␊
mod MyContract {␊
use openzeppelin::access::accesscontrol::extensions::AccessControlDefaultAdminRulesComponent;␊
use openzeppelin::interfaces::upgrades::IUpgradeable;␊
use openzeppelin::introspection::src5::SRC5Component;␊
use openzeppelin::upgrades::UpgradeableComponent;␊
use starknet::{ClassHash, ContractAddress};␊
use super::UPGRADER_ROLE;␊
const INITIAL_DELAY: u64 = 172800; // 2 days␊
component!(path: AccessControlDefaultAdminRulesComponent, storage: accesscontrol_dar, event: AccessControlDefaultAdminRulesEvent);␊
component!(path: SRC5Component, storage: src5, event: SRC5Event);␊
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
// External␊
#[abi(embed_v0)]␊
impl AccessControlMixinImpl = AccessControlDefaultAdminRulesComponent::AccessControlMixinImpl<ContractState>;␊
// Internal␊
impl AccessControlDefaultAdminRulesInternalImpl = AccessControlDefaultAdminRulesComponent::InternalImpl<ContractState>;␊
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
#[storage]␊
struct Storage {␊
#[substorage(v0)]␊
accesscontrol_dar: AccessControlDefaultAdminRulesComponent::Storage,␊
#[substorage(v0)]␊
src5: SRC5Component::Storage,␊
#[substorage(v0)]␊
upgradeable: UpgradeableComponent::Storage,␊
}␊
#[event]␊
#[derive(Drop, starknet::Event)]␊
enum Event {␊
#[flat]␊
AccessControlDefaultAdminRulesEvent: AccessControlDefaultAdminRulesComponent::Event,␊
#[flat]␊
SRC5Event: SRC5Component::Event,␊
#[flat]␊
UpgradeableEvent: UpgradeableComponent::Event,␊
}␊
#[constructor]␊
fn constructor(␊
ref self: ContractState,␊
initial_default_admin: ContractAddress,␊
upgrader: ContractAddress,␊
) {␊
self.accesscontrol_dar.initializer(INITIAL_DELAY, initial_default_admin);␊
self.accesscontrol_dar._grant_role(UPGRADER_ROLE, upgrader);␊
}␊
impl AccessControlDefaultAdminRulesImmutableConfig of AccessControlDefaultAdminRulesComponent::ImmutableConfig {␊
const DEFAULT_ADMIN_DELAY_INCREASE_WAIT: u64 = 604800; // 1 week␊
}␊
//␊
// Upgradeable␊
//␊
#[abi(embed_v0)]␊
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
self.accesscontrol_dar.assert_only_role(UPGRADER_ROLE);␊
self.upgradeable.upgrade(new_class_hash);␊
}␊
}␊
}␊
`

## pausable with access control disabled

> Snapshot 1
Expand Down
Binary file modified packages/core/cairo_alpha/src/custom.test.ts.snap
Binary file not shown.
Loading
Loading