Skip to content

Commit

Permalink
Refactor Ownable as a component
Browse files Browse the repository at this point in the history
  • Loading branch information
archseer committed Jan 9, 2024
1 parent 693b677 commit d00e1c1
Show file tree
Hide file tree
Showing 12 changed files with 293 additions and 343 deletions.
70 changes: 24 additions & 46 deletions contracts/src/access_control/access_controller.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,31 @@ mod AccessController {
use starknet::class_hash::ClassHash;

use chainlink::libraries::access_control::{AccessControl, IAccessController};
use chainlink::libraries::ownable::{Ownable, IOwnable};
use chainlink::libraries::ownable::{OwnableComponent, IOwnable};
use chainlink::libraries::upgradeable::{Upgradeable, IUpgradeable};

component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);

#[abi(embed_v0)]
impl OwnableImpl = OwnableComponent::OwnableImpl<ContractState>;
impl InternalImpl = OwnableComponent::InternalImpl<ContractState>;

#[event]
#[derive(Drop, starknet::Event)]
enum Event {
#[flat]
OwnableEvent: OwnableComponent::Event,
}

#[storage]
struct Storage {}
struct Storage {
#[substorage(v0)]
ownable: OwnableComponent::Storage,
}

#[constructor]
fn constructor(ref self: ContractState, owner_address: ContractAddress) {
let mut ownable = Ownable::unsafe_new_contract_state();
Ownable::constructor(ref ownable, owner_address);
self.ownable.initializer(owner_address);
let mut access_control = AccessControl::unsafe_new_contract_state();
AccessControl::constructor(ref access_control);
}
Expand All @@ -28,66 +43,30 @@ mod AccessController {
}

fn add_access(ref self: ContractState, user: ContractAddress) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
let mut state = AccessControl::unsafe_new_contract_state();
AccessControl::add_access(ref state, user);
}

fn remove_access(ref self: ContractState, user: ContractAddress) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
let mut state = AccessControl::unsafe_new_contract_state();
AccessControl::remove_access(ref state, user);
}

fn enable_access_check(ref self: ContractState) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
let mut state = AccessControl::unsafe_new_contract_state();
AccessControl::enable_access_check(ref state);
}

fn disable_access_check(ref self: ContractState) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
let mut state = AccessControl::unsafe_new_contract_state();
AccessControl::disable_access_check(ref state);
}
}

///
/// Ownable
///

#[external(v0)]
impl OwnableImpl of IOwnable<ContractState> {
fn owner(self: @ContractState) -> ContractAddress {
let state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::owner(@state)
}

fn proposed_owner(self: @ContractState) -> ContractAddress {
let state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::proposed_owner(@state)
}

fn transfer_ownership(ref self: ContractState, new_owner: ContractAddress) {
let mut state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::transfer_ownership(ref state, new_owner)
}

fn accept_ownership(ref self: ContractState) {
let mut state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::accept_ownership(ref state)
}

fn renounce_ownership(ref self: ContractState) {
let mut state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::renounce_ownership(ref state)
}
}

///
/// Upgradeable
///
Expand All @@ -100,8 +79,7 @@ mod AccessController {
#[external(v0)]
impl UpgradeableImpl of IUpgradeable<ContractState> {
fn upgrade(ref self: ContractState, new_impl: ClassHash) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
Upgradeable::upgrade(new_impl);
}
}
Expand Down
68 changes: 20 additions & 48 deletions contracts/src/emergency/sequencer_uptime_feed.cairo
Original file line number Diff line number Diff line change
Expand Up @@ -27,15 +27,25 @@ mod SequencerUptimeFeed {
use option::OptionTrait;
use zeroable::Zeroable;

use chainlink::libraries::ownable::{Ownable, IOwnable};
use chainlink::libraries::ownable::{OwnableComponent, IOwnable};
use chainlink::libraries::access_control::{AccessControl, IAccessController};
use chainlink::ocr2::aggregator::Round;
use chainlink::ocr2::aggregator::IAggregator;
use chainlink::ocr2::aggregator::{Transmission};
use chainlink::libraries::upgradeable::Upgradeable;

component!(path: OwnableComponent, storage: ownable, event: OwnableEvent);

#[abi(embed_v0)]
impl OwnableImpl = OwnableComponent::OwnableImpl<ContractState>;
impl InternalImpl = OwnableComponent::InternalImpl<ContractState>;


#[storage]
struct Storage {
#[substorage(v0)]
ownable: OwnableComponent::Storage,

// l1 sender is an starknet validator ethereum address
_l1_sender: felt252,
// maps round id to round transmission
Expand All @@ -46,6 +56,8 @@ mod SequencerUptimeFeed {
#[event]
#[derive(Drop, starknet::Event)]
enum Event {
#[flat]
OwnableEvent: OwnableComponent::Event,
RoundUpdated: RoundUpdated,
NewRound: NewRound,
AnswerUpdated: AnswerUpdated,
Expand Down Expand Up @@ -167,8 +179,7 @@ mod SequencerUptimeFeed {
#[external(v0)]
impl SequencerUptimeFeedImpl of super::ISequencerUptimeFeed<ContractState> {
fn set_l1_sender(ref self: ContractState, address: EthAddress) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();

assert(!address.is_zero(), '0 address not allowed');

Expand Down Expand Up @@ -198,44 +209,10 @@ mod SequencerUptimeFeed {

#[external(v0)]
fn upgrade(ref self: ContractState, new_impl: ClassHash) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
Upgradeable::upgrade(new_impl)
}

///
/// Ownership
///

#[external(v0)]
impl OwnableImpl of IOwnable<ContractState> {
fn owner(self: @ContractState) -> ContractAddress {
let state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::owner(@state)
}

fn proposed_owner(self: @ContractState) -> ContractAddress {
let state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::proposed_owner(@state)
}

fn transfer_ownership(ref self: ContractState, new_owner: ContractAddress) {
let mut state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::transfer_ownership(ref state, new_owner)
}

fn accept_ownership(ref self: ContractState) {
let mut state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::accept_ownership(ref state)
}

fn renounce_ownership(ref self: ContractState) {
let mut state = Ownable::unsafe_new_contract_state();
Ownable::OwnableImpl::renounce_ownership(ref state)
}
}


///
/// Access Control
///
Expand All @@ -248,29 +225,25 @@ mod SequencerUptimeFeed {
}

fn add_access(ref self: ContractState, user: ContractAddress) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
let mut state = AccessControl::unsafe_new_contract_state();
AccessControl::add_access(ref state, user)
}

fn remove_access(ref self: ContractState, user: ContractAddress) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
let mut state = AccessControl::unsafe_new_contract_state();
AccessControl::remove_access(ref state, user)
}

fn enable_access_check(ref self: ContractState) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
let mut state = AccessControl::unsafe_new_contract_state();
AccessControl::enable_access_check(ref state)
}

fn disable_access_check(ref self: ContractState) {
let ownable = Ownable::unsafe_new_contract_state();
Ownable::assert_only_owner(@ownable);
self.ownable.assert_only_owner();
let mut state = AccessControl::unsafe_new_contract_state();
AccessControl::disable_access_check(ref state)
}
Expand All @@ -292,8 +265,7 @@ mod SequencerUptimeFeed {
fn _initializer(
ref self: ContractState, initial_status: u128, owner_address: ContractAddress
) {
let mut ownable = Ownable::unsafe_new_contract_state();
Ownable::constructor(ref ownable, owner_address);
self.ownable.initializer(owner_address);
let mut access_control = AccessControl::unsafe_new_contract_state();
AccessControl::constructor(ref access_control);
let round_id = 1_u128;
Expand Down
Loading

0 comments on commit d00e1c1

Please sign in to comment.