@@ -4,7 +4,7 @@ The actual snapshot is saved in `custom.test.ts.snap`.
4
4
5
5
Generated by [ AVA] ( https://avajs.dev ) .
6
6
7
- ## custom
7
+ ## custom non-upgradeable
8
8
9
9
> Snapshot 1
10
10
@@ -19,6 +19,62 @@ Generated by [AVA](https://avajs.dev).
19
19
}␊
20
20
`
21
21
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
+
22
78
## pausable
23
79
24
80
> Snapshot 1
@@ -30,10 +86,14 @@ Generated by [AVA](https://avajs.dev).
30
86
mod MyContract {␊
31
87
use openzeppelin::access::ownable::OwnableComponent;␊
32
88
use openzeppelin::security::pausable::PausableComponent;␊
89
+ use openzeppelin::upgrades::UpgradeableComponent;␊
90
+ use openzeppelin::upgrades::interface::IUpgradeable;␊
91
+ use starknet::ClassHash;␊
33
92
use starknet::ContractAddress;␊
34
93
␊
35
94
component!(path: PausableComponent, storage: pausable, event: PausableEvent);␊
36
95
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊
96
+ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
37
97
␊
38
98
#[abi(embed_v0)]␊
39
99
impl PausableImpl = PausableComponent::PausableImpl<ContractState>;␊
@@ -42,13 +102,16 @@ Generated by [AVA](https://avajs.dev).
42
102
␊
43
103
impl PausableInternalImpl = PausableComponent::InternalImpl<ContractState>;␊
44
104
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊
105
+ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
45
106
␊
46
107
#[storage]␊
47
108
struct Storage {␊
48
109
#[substorage(v0)]␊
49
110
pausable: PausableComponent::Storage,␊
50
111
#[substorage(v0)]␊
51
112
ownable: OwnableComponent::Storage,␊
113
+ #[substorage(v0)]␊
114
+ upgradeable: UpgradeableComponent::Storage,␊
52
115
}␊
53
116
␊
54
117
#[event]␊
@@ -58,6 +121,8 @@ Generated by [AVA](https://avajs.dev).
58
121
PausableEvent: PausableComponent::Event,␊
59
122
#[flat]␊
60
123
OwnableEvent: OwnableComponent::Event,␊
124
+ #[flat]␊
125
+ UpgradeableEvent: UpgradeableComponent::Event,␊
61
126
}␊
62
127
␊
63
128
#[constructor]␊
@@ -80,6 +145,14 @@ Generated by [AVA](https://avajs.dev).
80
145
self.pausable._unpause();␊
81
146
}␊
82
147
}␊
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
+ }␊
83
156
}␊
84
157
`
85
158
@@ -164,32 +237,49 @@ Generated by [AVA](https://avajs.dev).
164
237
#[starknet::contract]␊
165
238
mod MyContract {␊
166
239
use openzeppelin::access::ownable::OwnableComponent;␊
240
+ use openzeppelin::upgrades::UpgradeableComponent;␊
241
+ use openzeppelin::upgrades::interface::IUpgradeable;␊
242
+ use starknet::ClassHash;␊
167
243
use starknet::ContractAddress;␊
168
244
␊
169
245
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);␊
246
+ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
170
247
␊
171
248
#[abi(embed_v0)]␊
172
249
impl OwnableMixinImpl = OwnableComponent::OwnableMixinImpl<ContractState>;␊
173
250
␊
174
251
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;␊
252
+ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
175
253
␊
176
254
#[storage]␊
177
255
struct Storage {␊
178
256
#[substorage(v0)]␊
179
257
ownable: OwnableComponent::Storage,␊
258
+ #[substorage(v0)]␊
259
+ upgradeable: UpgradeableComponent::Storage,␊
180
260
}␊
181
261
␊
182
262
#[event]␊
183
263
#[derive(Drop, starknet::Event)]␊
184
264
enum Event {␊
185
265
#[flat]␊
186
266
OwnableEvent: OwnableComponent::Event,␊
267
+ #[flat]␊
268
+ UpgradeableEvent: UpgradeableComponent::Event,␊
187
269
}␊
188
270
␊
189
271
#[constructor]␊
190
272
fn constructor(ref self: ContractState, owner: ContractAddress) {␊
191
273
self.ownable.initializer(owner);␊
192
274
}␊
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
+ }␊
193
283
}␊
194
284
`
195
285
@@ -200,27 +290,37 @@ Generated by [AVA](https://avajs.dev).
200
290
`// SPDX-License-Identifier: MIT␊
201
291
// Compatible with OpenZeppelin Contracts for Cairo ^0.11.0␊
202
292
␊
293
+ const UPGRADER_ROLE: felt252 = selector!("UPGRADER_ROLE");␊
294
+ ␊
203
295
#[starknet::contract]␊
204
296
mod MyContract {␊
205
297
use openzeppelin::access::accesscontrol::AccessControlComponent;␊
206
298
use openzeppelin::access::accesscontrol::DEFAULT_ADMIN_ROLE;␊
207
299
use openzeppelin::introspection::src5::SRC5Component;␊
300
+ use openzeppelin::upgrades::UpgradeableComponent;␊
301
+ use openzeppelin::upgrades::interface::IUpgradeable;␊
302
+ use starknet::ClassHash;␊
208
303
use starknet::ContractAddress;␊
304
+ use super::{UPGRADER_ROLE};␊
209
305
␊
210
306
component!(path: AccessControlComponent, storage: accesscontrol, event: AccessControlEvent);␊
211
307
component!(path: SRC5Component, storage: src5, event: SRC5Event);␊
308
+ component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);␊
212
309
␊
213
310
#[abi(embed_v0)]␊
214
311
impl AccessControlMixinImpl = AccessControlComponent::AccessControlMixinImpl<ContractState>;␊
215
312
␊
216
313
impl AccessControlInternalImpl = AccessControlComponent::InternalImpl<ContractState>;␊
314
+ impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;␊
217
315
␊
218
316
#[storage]␊
219
317
struct Storage {␊
220
318
#[substorage(v0)]␊
221
319
accesscontrol: AccessControlComponent::Storage,␊
222
320
#[substorage(v0)]␊
223
321
src5: SRC5Component::Storage,␊
322
+ #[substorage(v0)]␊
323
+ upgradeable: UpgradeableComponent::Storage,␊
224
324
}␊
225
325
␊
226
326
#[event]␊
@@ -230,13 +330,28 @@ Generated by [AVA](https://avajs.dev).
230
330
AccessControlEvent: AccessControlComponent::Event,␊
231
331
#[flat]␊
232
332
SRC5Event: SRC5Component::Event,␊
333
+ #[flat]␊
334
+ UpgradeableEvent: UpgradeableComponent::Event,␊
233
335
}␊
234
336
␊
235
337
#[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
+ ) {␊
237
343
self.accesscontrol.initializer();␊
238
344
␊
239
345
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
+ }␊
240
355
}␊
241
356
}␊
242
357
`
0 commit comments