Skip to content

Commit

Permalink
Cairo: Enable upgradeable option by default (#334)
Browse files Browse the repository at this point in the history
  • Loading branch information
ericglau authored Apr 17, 2024
1 parent d612bc7 commit 104bee3
Show file tree
Hide file tree
Showing 15 changed files with 1,449 additions and 21 deletions.
5 changes: 5 additions & 0 deletions packages/core-cairo/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
# Changelog

## 0.11.0 (2024-04-17)

- **Breaking changes**:
- Set `upgradeable` to `true` by default. ([#334](https://github.com/OpenZeppelin/contracts-wizard/pull/334))

## 0.10.2 (2024-04-03)

- Use OpenZeppelin Contracts for Cairo v0.11.0. ([#351](https://github.com/OpenZeppelin/contracts-wizard/pull/351))
Expand Down
2 changes: 1 addition & 1 deletion packages/core-cairo/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@openzeppelin/wizard-cairo",
"version": "0.10.2",
"version": "0.11.0",
"description": "A boilerplate generator to get started with OpenZeppelin Contracts for Cairo",
"license": "MIT",
"repository": "github:OpenZeppelin/contracts-wizard",
Expand Down
2 changes: 1 addition & 1 deletion packages/core-cairo/src/common-options.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import type { Upgradeable } from "./set-upgradeable";

export const defaults: Required<CommonOptions> = {
access: false,
upgradeable: false,
upgradeable: true,
info: infoDefaults,
} as const;

Expand Down
8 changes: 7 additions & 1 deletion packages/core-cairo/src/custom.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,11 @@ function testCustom(title: string, opts: Partial<CustomOptions>) {
});
}

testCustom('custom', {});
testCustom('custom non-upgradeable', {
upgradeable: false,
});

testCustom('custom defaults', {});

testCustom('pausable', {
pausable: true,
Expand All @@ -37,6 +41,7 @@ testCustom('upgradeable', {
});

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

Expand All @@ -52,6 +57,7 @@ testCustom('pausable with access control disabled', {
// API should override access to true since it is required for pausable
access: false,
pausable: true,
upgradeable: false,
});

testAPIEquivalence('custom API default');
Expand Down
119 changes: 117 additions & 2 deletions packages/core-cairo/src/custom.test.ts.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ The actual snapshot is saved in `custom.test.ts.snap`.

Generated by [AVA](https://avajs.dev).

## custom
## custom non-upgradeable

> Snapshot 1
Expand All @@ -19,6 +19,62 @@ Generated by [AVA](https://avajs.dev).
}␊
`

## custom defaults

> Snapshot 1
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts for Cairo ^0.11.0␊
#[starknet::contract]␊
mod MyContract {␊
use openzeppelin::access::ownable::OwnableComponent;␊
use openzeppelin::upgrades::UpgradeableComponent;␊
use openzeppelin::upgrades::interface::IUpgradeable;␊
use starknet::ClassHash;␊
use starknet::ContractAddress;␊
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊
#[abi(embed_v0)]␊
impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊
#[storage]␊
struct Storage {␊
#[substorage(v0)]␊
upgradeable: UpgradeableComponent::Storage,␊
#[substorage(v0)]␊
ownable: OwnableComponent::Storage,␊
}␊
#[event]␊
#[derive(Drop, starknet::Event)]␊
enum Event {␊
#[flat]␊
UpgradeableEvent: UpgradeableComponent::Event,␊
#[flat]␊
OwnableEvent: OwnableComponent::Event,␊
}␊
#[constructor]␊
fn constructor(ref self: ContractState, owner: ContractAddress) {␊
self.ownable.initializer(owner);␊
}␊
#[abi(embed_v0)]␊
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
self.ownable.assert_only_owner();␊
self.upgradeable._upgrade(new_class_hash);␊
}␊
}␊
}␊
`

## pausable

> Snapshot 1
Expand All @@ -30,10 +86,14 @@ Generated by [AVA](https://avajs.dev).
mod MyContract {␊
use openzeppelin::access::ownable::OwnableComponent;␊
use openzeppelin::security::pausable::PausableComponent;␊
use openzeppelin::upgrades::UpgradeableComponent;␊
use openzeppelin::upgrades::interface::IUpgradeable;␊
use starknet::ClassHash;␊
use starknet::ContractAddress;␊
component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
#[abi(embed_v0)]␊
impl PausableImpl = PausableComponent::PausableImpl<ContractState>;␊
Expand All @@ -42,13 +102,16 @@ Generated by [AVA](https://avajs.dev).
impl PausableInternalImpl = PausableComponent::InternalImpl<ContractState>;␊
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
#[storage]␊
struct Storage {␊
#[substorage(v0)]␊
pausable: PausableComponent::Storage,␊
#[substorage(v0)]␊
ownable: OwnableComponent::Storage,␊
#[substorage(v0)]␊
upgradeable: UpgradeableComponent::Storage,␊
}␊
#[event]␊
Expand All @@ -58,6 +121,8 @@ Generated by [AVA](https://avajs.dev).
PausableEvent: PausableComponent::Event,␊
#[flat]␊
OwnableEvent: OwnableComponent::Event,␊
#[flat]␊
UpgradeableEvent: UpgradeableComponent::Event,␊
}␊
#[constructor]␊
Expand All @@ -80,6 +145,14 @@ Generated by [AVA](https://avajs.dev).
self.pausable._unpause();␊
}␊
}␊
#[abi(embed_v0)]␊
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
self.ownable.assert_only_owner();␊
self.upgradeable._upgrade(new_class_hash);␊
}␊
}␊
}␊
`

Expand Down Expand Up @@ -164,32 +237,49 @@ Generated by [AVA](https://avajs.dev).
#[starknet::contract]␊
mod MyContract {␊
use openzeppelin::access::ownable::OwnableComponent;␊
use openzeppelin::upgrades::UpgradeableComponent;␊
use openzeppelin::upgrades::interface::IUpgradeable;␊
use starknet::ClassHash;␊
use starknet::ContractAddress;␊
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
#[abi(embed_v0)]␊
impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
#[storage]␊
struct Storage {␊
#[substorage(v0)]␊
ownable: OwnableComponent::Storage,␊
#[substorage(v0)]␊
upgradeable: UpgradeableComponent::Storage,␊
}␊
#[event]␊
#[derive(Drop, starknet::Event)]␊
enum Event {␊
#[flat]␊
OwnableEvent: OwnableComponent::Event,␊
#[flat]␊
UpgradeableEvent: UpgradeableComponent::Event,␊
}␊
#[constructor]␊
fn constructor(ref self: ContractState, owner: ContractAddress) {␊
self.ownable.initializer(owner);␊
}␊
#[abi(embed_v0)]␊
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
self.ownable.assert_only_owner();␊
self.upgradeable._upgrade(new_class_hash);␊
}␊
}␊
}␊
`

Expand All @@ -200,27 +290,37 @@ Generated by [AVA](https://avajs.dev).
`// SPDX-License-Identifier: MIT␊
// Compatible with OpenZeppelin Contracts for Cairo ^0.11.0␊
const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊
#[starknet::contract]␊
mod MyContract {␊
use openzeppelin::access::accesscontrol::AccessControlComponent;␊
use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊
use openzeppelin::introspection::src5::SRC5Component;␊
use openzeppelin::upgrades::UpgradeableComponent;␊
use openzeppelin::upgrades::interface::IUpgradeable;␊
use starknet::ClassHash;␊
use starknet::ContractAddress;␊
use super::{UPGRADER_ROLE};␊
component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊
component!(path: SRC5Component, storage: src5, event: SRC5Event);␊
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
#[abi(embed_v0)]␊
impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl<ContractState>;␊
impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;␊
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
#[storage]␊
struct Storage {␊
#[substorage(v0)]␊
accesscontrol: AccessControlComponent::Storage,␊
#[substorage(v0)]␊
src5: SRC5Component::Storage,␊
#[substorage(v0)]␊
upgradeable: UpgradeableComponent::Storage,␊
}␊
#[event]␊
Expand All @@ -230,13 +330,28 @@ Generated by [AVA](https://avajs.dev).
AccessControlEvent: AccessControlComponent::Event,␊
#[flat]␊
SRC5Event: SRC5Component::Event,␊
#[flat]␊
UpgradeableEvent: UpgradeableComponent::Event,␊
}␊
#[constructor]␊
fn constructor(ref self: ContractState, default_admin: ContractAddress) {␊
fn constructor(␊
ref self: ContractState,␊
default_admin: ContractAddress,␊
upgrader: ContractAddress,␊
) {␊
self.accesscontrol.initializer();␊
self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊
self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊
}␊
#[abi(embed_v0)]␊
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊
self.upgradeable._upgrade(new_class_hash);␊
}␊
}␊
}␊
`
Expand Down
Binary file modified packages/core-cairo/src/custom.test.ts.snap
Binary file not shown.
12 changes: 12 additions & 0 deletions packages/core-cairo/src/erc1155.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ function testERC1155(title: string, opts: Partial<ERC1155Options>) {
});
}

testERC1155('basic non-upgradeable', {
upgradeable: false,
});

testERC1155('basic', {});

testERC1155('basic + roles', {
Expand Down Expand Up @@ -55,6 +59,14 @@ testERC1155('mintable + roles', {
access: 'roles',
});

testERC1155('full non-upgradeable', {
mintable: true,
access: 'roles',
burnable: true,
pausable: true,
upgradeable: false,
});

testERC1155('full upgradeable', {
mintable: true,
access: 'roles',
Expand Down
Loading

0 comments on commit 104bee3

Please sign in to comment.