Skip to content

Commit 104bee3

Browse files
authored
Cairo: Enable upgradeable option by default (#334)
1 parent d612bc7 commit 104bee3

15 files changed

+1449
-21
lines changed

packages/core-cairo/CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
# Changelog
22

3+
## 0.11.0 (2024-04-17)
4+
5+
- **Breaking changes**:
6+
- Set `upgradeable` to `true` by default. ([#334](https://github.com/OpenZeppelin/contracts-wizard/pull/334))
7+
38
## 0.10.2 (2024-04-03)
49

510
- Use OpenZeppelin Contracts for Cairo v0.11.0. ([#351](https://github.com/OpenZeppelin/contracts-wizard/pull/351))

packages/core-cairo/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@openzeppelin/wizard-cairo",
3-
"version": "0.10.2",
3+
"version": "0.11.0",
44
"description": "A boilerplate generator to get started with OpenZeppelin Contracts for Cairo",
55
"license": "MIT",
66
"repository": "github:OpenZeppelin/contracts-wizard",

packages/core-cairo/src/common-options.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import type { Upgradeable } from "./set-upgradeable";
66

77
export const defaults: Required<CommonOptions> = {
88
access: false,
9-
upgradeable: false,
9+
upgradeable: true,
1010
info: infoDefaults,
1111
} as const;
1212

packages/core-cairo/src/custom.test.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,11 @@ function testCustom(title: string, opts: Partial<CustomOptions>) {
2626
});
2727
}
2828

29-
testCustom('custom', {});
29+
testCustom('custom non-upgradeable', {
30+
upgradeable: false,
31+
});
32+
33+
testCustom('custom defaults', {});
3034

3135
testCustom('pausable', {
3236
pausable: true,
@@ -37,6 +41,7 @@ testCustom('upgradeable', {
3741
});
3842

3943
testCustom('access control disabled', {
44+
upgradeable: false,
4045
access: false,
4146
});
4247

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

5763
testAPIEquivalence('custom API default');

packages/core-cairo/src/custom.test.ts.md

Lines changed: 117 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ The actual snapshot is saved in `custom.test.ts.snap`.
44

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

7-
## custom
7+
## custom non-upgradeable
88

99
> Snapshot 1
1010
@@ -19,6 +19,62 @@ Generated by [AVA](https://avajs.dev).
1919
}␊
2020
`
2121

22+
## custom defaults
23+
24+
> Snapshot 1
25+
26+
`// SPDX-License-Identifier: MIT␊
27+
// Compatible with OpenZeppelin Contracts for Cairo ^0.11.0␊
28+
29+
#[starknet::contract]␊
30+
mod MyContract {␊
31+
use openzeppelin::access::ownable::OwnableComponent;␊
32+
use openzeppelin::upgrades::UpgradeableComponent;␊
33+
use openzeppelin::upgrades::interface::IUpgradeable;␊
34+
use starknet::ClassHash;␊
35+
use starknet::ContractAddress;␊
36+
37+
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
38+
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊
39+
40+
#[abi(embed_v0)]␊
41+
impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊
42+
43+
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
44+
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊
45+
46+
#[storage]␊
47+
struct Storage {␊
48+
#[substorage(v0)]␊
49+
upgradeable: UpgradeableComponent::Storage,␊
50+
#[substorage(v0)]␊
51+
ownable: OwnableComponent::Storage,␊
52+
}␊
53+
54+
#[event]␊
55+
#[derive(Drop, starknet::Event)]␊
56+
enum Event {␊
57+
#[flat]␊
58+
UpgradeableEvent: UpgradeableComponent::Event,␊
59+
#[flat]␊
60+
OwnableEvent: OwnableComponent::Event,␊
61+
}␊
62+
63+
#[constructor]␊
64+
fn constructor(ref self: ContractState, owner: ContractAddress) {␊
65+
self.ownable.initializer(owner);␊
66+
}␊
67+
68+
#[abi(embed_v0)]␊
69+
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
70+
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
71+
self.ownable.assert_only_owner();␊
72+
self.upgradeable._upgrade(new_class_hash);␊
73+
}␊
74+
}␊
75+
}␊
76+
`
77+
2278
## pausable
2379

2480
> Snapshot 1
@@ -30,10 +86,14 @@ Generated by [AVA](https://avajs.dev).
3086
mod MyContract {␊
3187
use openzeppelin::access::ownable::OwnableComponent;␊
3288
use openzeppelin::security::pausable::PausableComponent;␊
89+
use openzeppelin::upgrades::UpgradeableComponent;␊
90+
use openzeppelin::upgrades::interface::IUpgradeable;␊
91+
use starknet::ClassHash;␊
3392
use starknet::ContractAddress;␊
3493
3594
component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊
3695
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊
96+
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
3797
3898
#[abi(embed_v0)]␊
3999
impl PausableImpl = PausableComponent::PausableImpl<ContractState>;␊
@@ -42,13 +102,16 @@ Generated by [AVA](https://avajs.dev).
42102
43103
impl PausableInternalImpl = PausableComponent::InternalImpl<ContractState>;␊
44104
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊
105+
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
45106
46107
#[storage]␊
47108
struct Storage {␊
48109
#[substorage(v0)]␊
49110
pausable: PausableComponent::Storage,␊
50111
#[substorage(v0)]␊
51112
ownable: OwnableComponent::Storage,␊
113+
#[substorage(v0)]␊
114+
upgradeable: UpgradeableComponent::Storage,␊
52115
}␊
53116
54117
#[event]␊
@@ -58,6 +121,8 @@ Generated by [AVA](https://avajs.dev).
58121
PausableEvent: PausableComponent::Event,␊
59122
#[flat]␊
60123
OwnableEvent: OwnableComponent::Event,␊
124+
#[flat]␊
125+
UpgradeableEvent: UpgradeableComponent::Event,␊
61126
}␊
62127
63128
#[constructor]␊
@@ -80,6 +145,14 @@ Generated by [AVA](https://avajs.dev).
80145
self.pausable._unpause();␊
81146
}␊
82147
}␊
148+
149+
#[abi(embed_v0)]␊
150+
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
151+
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
152+
self.ownable.assert_only_owner();␊
153+
self.upgradeable._upgrade(new_class_hash);␊
154+
}␊
155+
}␊
83156
}␊
84157
`
85158

@@ -164,32 +237,49 @@ Generated by [AVA](https://avajs.dev).
164237
#[starknet::contract]␊
165238
mod MyContract {␊
166239
use openzeppelin::access::ownable::OwnableComponent;␊
240+
use openzeppelin::upgrades::UpgradeableComponent;␊
241+
use openzeppelin::upgrades::interface::IUpgradeable;␊
242+
use starknet::ClassHash;␊
167243
use starknet::ContractAddress;␊
168244
169245
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊
246+
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
170247
171248
#[abi(embed_v0)]␊
172249
impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊
173250
174251
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊
252+
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
175253
176254
#[storage]␊
177255
struct Storage {␊
178256
#[substorage(v0)]␊
179257
ownable: OwnableComponent::Storage,␊
258+
#[substorage(v0)]␊
259+
upgradeable: UpgradeableComponent::Storage,␊
180260
}␊
181261
182262
#[event]␊
183263
#[derive(Drop, starknet::Event)]␊
184264
enum Event {␊
185265
#[flat]␊
186266
OwnableEvent: OwnableComponent::Event,␊
267+
#[flat]␊
268+
UpgradeableEvent: UpgradeableComponent::Event,␊
187269
}␊
188270
189271
#[constructor]␊
190272
fn constructor(ref self: ContractState, owner: ContractAddress) {␊
191273
self.ownable.initializer(owner);␊
192274
}␊
275+
276+
#[abi(embed_v0)]␊
277+
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
278+
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
279+
self.ownable.assert_only_owner();␊
280+
self.upgradeable._upgrade(new_class_hash);␊
281+
}␊
282+
}␊
193283
}␊
194284
`
195285

@@ -200,27 +290,37 @@ Generated by [AVA](https://avajs.dev).
200290
`// SPDX-License-Identifier: MIT␊
201291
// Compatible with OpenZeppelin Contracts for Cairo ^0.11.0␊
202292
293+
const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊
294+
203295
#[starknet::contract]␊
204296
mod MyContract {␊
205297
use openzeppelin::access::accesscontrol::AccessControlComponent;␊
206298
use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊
207299
use openzeppelin::introspection::src5::SRC5Component;␊
300+
use openzeppelin::upgrades::UpgradeableComponent;␊
301+
use openzeppelin::upgrades::interface::IUpgradeable;␊
302+
use starknet::ClassHash;␊
208303
use starknet::ContractAddress;␊
304+
use super::{UPGRADER_ROLE};␊
209305
210306
component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊
211307
component!(path: SRC5Component, storage: src5, event: SRC5Event);␊
308+
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
212309
213310
#[abi(embed_v0)]␊
214311
impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl<ContractState>;␊
215312
216313
impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;␊
314+
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
217315
218316
#[storage]␊
219317
struct Storage {␊
220318
#[substorage(v0)]␊
221319
accesscontrol: AccessControlComponent::Storage,␊
222320
#[substorage(v0)]␊
223321
src5: SRC5Component::Storage,␊
322+
#[substorage(v0)]␊
323+
upgradeable: UpgradeableComponent::Storage,␊
224324
}␊
225325
226326
#[event]␊
@@ -230,13 +330,28 @@ Generated by [AVA](https://avajs.dev).
230330
AccessControlEvent: AccessControlComponent::Event,␊
231331
#[flat]␊
232332
SRC5Event: SRC5Component::Event,␊
333+
#[flat]␊
334+
UpgradeableEvent: UpgradeableComponent::Event,␊
233335
}␊
234336
235337
#[constructor]␊
236-
fn constructor(ref self: ContractState, default_admin: ContractAddress) {␊
338+
fn constructor(␊
339+
ref self: ContractState,␊
340+
default_admin: ContractAddress,␊
341+
upgrader: ContractAddress,␊
342+
) {␊
237343
self.accesscontrol.initializer();␊
238344
239345
self.accesscontrol._grant_role(DEFAULT_ADMIN_ROLE, default_admin);␊
346+
self.accesscontrol._grant_role(UPGRADER_ROLE, upgrader);␊
347+
}␊
348+
349+
#[abi(embed_v0)]␊
350+
impl UpgradeableImpl of IUpgradeable<ContractState> {␊
351+
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {␊
352+
self.accesscontrol.assert_only_role(UPGRADER_ROLE);␊
353+
self.upgradeable._upgrade(new_class_hash);␊
354+
}␊
240355
}␊
241356
}␊
242357
`
203 Bytes
Binary file not shown.

packages/core-cairo/src/erc1155.test.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,10 @@ function testERC1155(title: string, opts: Partial<ERC1155Options>) {
2828
});
2929
}
3030

31+
testERC1155('basic non-upgradeable', {
32+
upgradeable: false,
33+
});
34+
3135
testERC1155('basic', {});
3236

3337
testERC1155('basic + roles', {
@@ -55,6 +59,14 @@ testERC1155('mintable + roles', {
5559
access: 'roles',
5660
});
5761

62+
testERC1155('full non-upgradeable', {
63+
mintable: true,
64+
access: 'roles',
65+
burnable: true,
66+
pausable: true,
67+
upgradeable: false,
68+
});
69+
5870
testERC1155('full upgradeable', {
5971
mintable: true,
6072
access: 'roles',

0 commit comments

Comments
 (0)