pub type ModuleMapEntry = (ModuleInfo, ModuleReference);
#[cosmwasm_schema::cw_serde]
pub struct Config {
pub is_testnet: bool,
pub namespace_limit: u32,
}
pub mod state {
use cw_controllers::Admin;
use cw_storage_plus::{Item, Map};
use crate::objects::{
account_id::AccountId, common_namespace::ADMIN_NAMESPACE, module::ModuleInfo,
module_reference::ModuleReference,
};
use super::{AccountBase, Config};
pub const ADMIN: Admin = Admin::new(ADMIN_NAMESPACE);
pub const FACTORY: Admin = Admin::new("factory");
pub const CONFIG: Item<Config> = Item::new("config");
pub const PENDING_MODULES: Map<&ModuleInfo, ModuleReference> = Map::new("pending_modules");
pub const REGISTERED_MODULES: Map<&ModuleInfo, ModuleReference> = Map::new("module_lib");
pub const YANKED_MODULES: Map<&ModuleInfo, ModuleReference> = Map::new("yanked_modules");
pub const ACCOUNT_ADDRESSES: Map<AccountId, AccountBase> = Map::new("account");
}
pub struct NamespaceIndexes<'a> {
pub account_id: MultiIndex<'a, AccountId, AccountId, &'a Namespace>,
}
impl<'a> IndexList<AccountId> for NamespaceIndexes<'a> {
fn get_indexes(&'_ self) -> Box<dyn Iterator<Item = &'_ dyn Index<AccountId>> + '_> {
let v: Vec<&dyn Index<AccountId>> = vec![&self.account_id];
Box::new(v.into_iter())
}
}
pub fn namespaces_info<'a>() -> IndexedMap<'a, &'a Namespace, AccountId, NamespaceIndexes<'a>> {
let indexes = NamespaceIndexes {
account_id: MultiIndex::new(|_pk, d| *d, "namespace", "namespace_account"),
};
IndexedMap::new("namespace", indexes)
}
use crate::objects::{
account_id::AccountId,
module::{Module, ModuleInfo, ModuleStatus},
module_reference::ModuleReference,
namespace::Namespace,
};
use cosmwasm_schema::QueryResponses;
use cosmwasm_std::Addr;
use cw_storage_plus::{Index, IndexList, IndexedMap, MultiIndex};
#[cosmwasm_schema::cw_serde]
pub struct AccountBase {
pub manager: Addr,
pub proxy: Addr,
}
#[cosmwasm_schema::cw_serde]
pub struct InstantiateMsg {
pub is_testnet: bool,
pub namespace_limit: u32,
}
#[cw_ownable::cw_ownable_execute]
#[cosmwasm_schema::cw_serde]
#[cfg_attr(feature = "interface", derive(cw_orch::ExecuteFns))]
pub enum ExecuteMsg {
RemoveModule { module: ModuleInfo },
YankModule { module: ModuleInfo },
ProposeModules { modules: Vec<ModuleMapEntry> },
ApproveOrRejectModules {
approves: Vec<ModuleInfo>,
rejects: Vec<ModuleInfo>,
},
ClaimNamespaces {
account_id: AccountId,
namespaces: Vec<String>,
},
RemoveNamespaces { namespaces: Vec<String> },
AddAccount {
account_id: AccountId,
account_base: AccountBase,
},
UpdateNamespaceLimit { new_limit: u32 },
SetFactory { new_factory: String },
}
#[derive(Default)]
#[cosmwasm_schema::cw_serde]
pub struct ModuleFilter {
pub namespace: Option<String>,
pub name: Option<String>,
pub version: Option<String>,
pub status: Option<ModuleStatus>,
}
#[derive(Default)]
#[cosmwasm_schema::cw_serde]
pub struct NamespaceFilter {
pub account_id: Option<AccountId>,
}
#[cw_ownable::cw_ownable_query]
#[cosmwasm_schema::cw_serde]
#[derive(QueryResponses)]
#[cfg_attr(feature = "interface", derive(cw_orch::QueryFns))]
pub enum QueryMsg {
#[returns(AccountBaseResponse)]
AccountBase { account_id: AccountId },
#[returns(ModulesResponse)]
Modules { infos: Vec<ModuleInfo> },
#[returns(NamespacesResponse)]
Namespaces { accounts: Vec<AccountId> },
#[returns(ConfigResponse)]
Config {},
#[returns(ModulesListResponse)]
ModuleList {
filter: Option<ModuleFilter>,
start_after: Option<ModuleInfo>,
limit: Option<u8>,
},
#[returns(NamespaceListResponse)]
NamespaceList {
filter: Option<NamespaceFilter>,
start_after: Option<String>,
limit: Option<u8>,
},
}
#[cosmwasm_schema::cw_serde]
pub struct AccountBaseResponse {
pub account_base: AccountBase,
}
#[cosmwasm_schema::cw_serde]
pub struct ModulesResponse {
pub modules: Vec<Module>,
}
#[cosmwasm_schema::cw_serde]
pub struct ModulesListResponse {
pub modules: Vec<Module>,
}
#[cosmwasm_schema::cw_serde]
pub struct NamespacesResponse {
pub namespaces: Vec<(Namespace, AccountId)>,
}
#[cosmwasm_schema::cw_serde]
pub struct NamespaceListResponse {
pub namespaces: Vec<(Namespace, AccountId)>,
}
#[cosmwasm_schema::cw_serde]
pub struct ConfigResponse {
pub factory: Addr,
}
#[cosmwasm_schema::cw_serde]
pub struct MigrateMsg {}