Skip to content

Commit e5b7154

Browse files
committed
feat: upgrade dependency and add owner && contract upgradability
1 parent 7975a3d commit e5b7154

File tree

3 files changed

+48
-7
lines changed

3 files changed

+48
-7
lines changed

Scarb.lock

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,20 @@
11
# Code generated by scarb DO NOT EDIT.
22
version = 1
33

4+
[[package]]
5+
name = "openzeppelin"
6+
version = "0.9.0"
7+
source = "git+https://github.com/OpenZeppelin/cairo-contracts.git?tag=v0.9.0#861fc416f87addbe23a3b47f9d19ab27c10d5dc8"
8+
49
[[package]]
510
name = "snforge_std"
6-
version = "0.14.0"
7-
source = "git+https://github.com/foundry-rs/starknet-foundry.git?tag=v0.14.0#e8cbecee4e31ed428c76d5173eaa90c8df796fe3"
11+
version = "0.17.0"
12+
source = "git+https://github.com/foundry-rs/starknet-foundry.git?tag=v0.17.0#63f7f0b533a3d852e2b60214e0f40b99c9dcbb26"
813

914
[[package]]
1015
name = "token_bound_accounts"
1116
version = "0.1.0"
1217
dependencies = [
18+
"openzeppelin",
1319
"snforge_std",
1420
]

Scarb.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@ sierra = true
99
casm = true
1010

1111
[dependencies]
12-
starknet = "2.4.3"
13-
snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.14.0" }
14-
12+
starknet = "2.5.3"
13+
snforge_std = { git = "https://github.com/foundry-rs/starknet-foundry.git", tag = "v0.17.0" }
14+
openzeppelin = { git = "https://github.com/OpenZeppelin/cairo-contracts.git", tag = "v0.9.0" }
1515
[tool.snforge]
1616
# exit_first = true

src/registry/registry.cairo

+37-2
Original file line numberDiff line numberDiff line change
@@ -17,18 +17,40 @@ mod Registry {
1717

1818
use token_bound_accounts::interfaces::IERC721::{IERC721DispatcherTrait, IERC721Dispatcher};
1919
use token_bound_accounts::interfaces::IRegistry::IRegistry;
20+
use openzeppelin::{
21+
access::ownable::OwnableComponent, upgrades::{UpgradeableComponent, interface::IUpgradeable}
22+
};
23+
24+
component!(path: UpgradeableComponent, storage: upgradeable, event: UpgradeableEvent);
25+
component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);
26+
27+
// add an owner
28+
#[abi(embed_v0)]
29+
impl OwnableImpl = OwnableComponent::OwnableImpl<ContractState>;
30+
impl OwnableInternalImpl = OwnableComponent::InternalImpl<ContractState>;
31+
// make it upgradable
32+
impl UpgradeableInternalImpl = UpgradeableComponent::InternalImpl<ContractState>;
2033

2134
#[storage]
2235
struct Storage {
36+
admin: ContractAddress,
2337
registry_deployed_accounts: LegacyMap<
2438
(ContractAddress, u256), u8
2539
>, // tracks no. of deployed accounts by registry for an NFT
40+
#[substorage(v0)]
41+
ownable: OwnableComponent::Storage,
42+
#[substorage(v0)]
43+
upgradeable: UpgradeableComponent::Storage,
2644
}
2745

2846
#[event]
2947
#[derive(Drop, starknet::Event)]
3048
enum Event {
31-
AccountCreated: AccountCreated
49+
AccountCreated: AccountCreated,
50+
#[flat]
51+
OwnableEvent: OwnableComponent::Event,
52+
#[flat]
53+
UpgradeableEvent: UpgradeableComponent::Event,
3254
}
3355

3456
/// @notice Emitted when a new tokenbound account is deployed/created
@@ -42,7 +64,20 @@ mod Registry {
4264
token_id: u256,
4365
}
4466

45-
#[external(v0)]
67+
#[constructor]
68+
fn constructor(ref self: ContractState, admin: ContractAddress) {
69+
self.admin.write(admin)
70+
}
71+
72+
#[abi(embed_v0)]
73+
impl UpgradeableImpl of IUpgradeable<ContractState> {
74+
fn upgrade(ref self: ContractState, new_class_hash: ClassHash) {
75+
self.ownable.assert_only_owner();
76+
self.upgradeable._upgrade(new_class_hash);
77+
}
78+
}
79+
80+
#[abi(embed_v0)]
4681
impl IRegistryImpl of IRegistry<ContractState> {
4782
/// @notice deploys a new tokenbound account for an NFT
4883
/// @param implementation_hash the class hash of the reference account

0 commit comments

Comments
 (0)