9 releases (2 stable)

2.1.0 Aug 14, 2024
2.0.0 Aug 12, 2024
0.5.1 Feb 28, 2023
0.4.0 Jan 11, 2023
0.1.1 Dec 14, 2022

#1 in #ownable

Download history 1657/week @ 2024-08-23 1859/week @ 2024-08-30 2132/week @ 2024-09-06 1891/week @ 2024-09-13 1798/week @ 2024-09-20 1761/week @ 2024-09-27 1945/week @ 2024-10-04 2702/week @ 2024-10-11 1838/week @ 2024-10-18 2120/week @ 2024-10-25 2572/week @ 2024-11-01 1900/week @ 2024-11-08 2686/week @ 2024-11-15 1968/week @ 2024-11-22 1823/week @ 2024-11-29 1910/week @ 2024-12-06

8,592 downloads per month
Used in 101 crates (49 directly)

Apache-2.0

32KB
460 lines

CW Ownable

Utility for controlling ownership of CosmWasm smart contracts.

How to use

Initialize the owner during instantiation using the initialize_owner method provided by this crate:

use cosmwasm_std::{entry_point, DepsMut, Env, MessageInfo, Response};
use cw_ownable::OwnershipError;

#[entry_point]
pub fn instantiate(
    deps: DepsMut,
    env: Env,
    _info: MessageInfo,
    msg: InstantiateMsg,
) -> Result<Response<Empty>, OwnershipError> {
    cw_ownable::initialize_owner(deps.storage, deps.api, msg.owner.as_deref())?;
    Ok(Response::new())
}

Use the #[cw_ownable_execute] macro to extend your execute message:

use cosmwasm_schema::cw_serde;
use cw_ownable::cw_ownable_execute;

#[cw_ownable_execute]
#[cw_serde]
enum ExecuteMsg {
    Foo {},
    Bar {},
}

The macro inserts a new variant, UpdateOwnership to the enum:

#[cw_serde]
enum ExecuteMsg {
    UpdateOwnership(cw_ownable::Action),
    Foo {},
    Bar {},
}

Where Action can be one of three:

  • Propose to transfer the contract's ownership to another account
  • Accept the proposed ownership transfer
  • Renounce the ownership, permanently setting the contract's owner to vacant

Handle the messages using the update_ownership function provided by this crate:

use cosmwasm_std::{entry_point, DepsMut, Env, MessageInfo, Response};
use cw_ownable::{cw_serde, update_ownership, OwnershipError};

#[entry_point]
pub fn execute(
    deps: DepsMut,
    env: Env,
    info: MessageInfo,
    msg: ExecuteMsg,
) -> Result<Response, OwnershipError> {
    match msg {
        ExecuteMsg::UpdateOwnership(action) => {
            update_ownership(deps, &env.block, &info.sender, action)?;
        }
        _ => unimplemneted!(),
    }
    Ok(Response::new())
}

Use the #[cw_ownable_query] macro to extend your query message:

use cosmwasm_schema::{cw_serde, QueryResponses};
use cw_ownable::cw_ownable_query;

#[cw_ownable_query]
#[cw_serde]
#[derive(QueryResponses)]
pub enum QueryMsg {
    #[returns(FooResponse)]
    Foo {},
    #[returns(BarResponse)]
    Bar {},
}

The macro inserts a new variant, Ownership:

#[cw_serde]
#[derive(QueryResponses)]
enum QueryMsg {
    #[returns(Ownership<String>)]
    Ownership {},
    #[returns(FooResponse)]
    Foo {},
    #[returns(BarResponse)]
    Bar {},
}

Handle the message using the get_ownership function provided by this crate:

use cosmwasm_std::{entry_point, Deps, Env, Binary};
use cw_ownable::get_ownership;

#[entry_point]
pub fn query(deps: Deps, env: Env, msg: QueryMsg) -> StdResult<Binary> {
    match msg {
        QueryMsg::Ownership {} => to_binary(&get_ownership(deps.storage)?),
        _ => unimplemented!(),
    }
}

You can create new ownerships for other purposes:

use cw_ownable::OwnershipStore;

const CREATOR: OwnershipStore = OwnershipStore::new("creator");

CREATOR has all functions in place: initialize_owner, is_owner, assert_owner, and get_ownership.

License

Contents of this crate at or prior to version 0.5.0 are published under GNU Affero General Public License v3 or later; contents after the said version are published under Apache-2.0 license.

Dependencies

~4–6MB
~124K SLoC