1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145
//! # Account Factory
//!
//! `abstract_std::account_factory` handles Account creation and registration.
//!
//! ## Description
//! The Account factory instantiates a new Account instance and registers it with the [`crate::version_control`] contract.  
//! ## Create a new Account
//! Call [`ExecuteMsg::CreateAccount`] on this contract along with a [`crate::objects::gov_type`] and name you'd like to display on your Account.
//!
pub mod state {
    use cosmwasm_std::Addr;
    use cw_storage_plus::Item;
    use serde::{Deserialize, Serialize};
    use crate::{
        objects::{
            account::{AccountId, AccountSequence},
            module::Module,
        },
        version_control::AccountBase,
    };
    /// Account Factory configuration
    #[cosmwasm_schema::cw_serde]
    pub struct Config {
        pub version_control_contract: Addr,
        pub ans_host_contract: Addr,
        pub module_factory_address: Addr,
    }
    /// Account Factory context for post-[`crate::manager`] [`crate::proxy`] creation
    #[derive(Serialize, Deserialize, Clone, Debug)]
    pub struct Context {
        pub account_base: AccountBase,
        pub manager_module: Module,
        pub proxy_module: Module,
        pub account_id: AccountId,
    }
    pub const CONFIG: Item<Config> = Item::new("cfg");
    pub const CONTEXT: Item<Context> = Item::new("contxt");
    pub const LOCAL_ACCOUNT_SEQUENCE: Item<AccountSequence> = Item::new("acseq");
}
use cosmwasm_schema::QueryResponses;
use cosmwasm_std::Addr;
use crate::{
    manager::ModuleInstallConfig,
    objects::{
        account::{AccountId, AccountSequence, AccountTrace},
        gov_type::GovernanceDetails,
        AssetEntry,
    },
};
/// Msg used on instantiation
#[cosmwasm_schema::cw_serde]
pub struct InstantiateMsg {
    /// Admin of the contract
    pub admin: String,
    /// Version control contract used to get code-ids and register Account
    pub version_control_address: String,
    /// AnsHost contract
    pub ans_host_address: String,
    /// AnsHosts of module factory. Used for instantiating manager.
    pub module_factory_address: String,
}
/// Account Factory execute messages
#[cw_ownable::cw_ownable_execute]
#[cosmwasm_schema::cw_serde]
#[derive(cw_orch::ExecuteFns)]
pub enum ExecuteMsg {
    /// Update config
    UpdateConfig {
        // New ans_host contract
        ans_host_contract: Option<String>,
        // New version control contract
        version_control_contract: Option<String>,
        // New module factory contract
        module_factory_address: Option<String>,
    },
    /// Creates the core contracts and sets the permissions.
    /// [`crate::manager`] and [`crate::proxy`]
    #[cw_orch(payable)]
    CreateAccount {
        // Governance details
        governance: GovernanceDetails<String>,
        // Account name
        name: String,
        // Optionally specify a base asset for the account
        base_asset: Option<AssetEntry>,
        // Account description
        description: Option<String>,
        // Account link
        link: Option<String>,
        /// Indicates the AccountId for the new account.
        ///
        /// If `None`, will create a new local account without asserting account-id.
        ///
        /// When [`AccountTrace::Local`] when sequence in 0..2147483648 range: The tx will error \
        /// When [`AccountTrace::Local`] when sequence in 2147483648..u32::MAX range: Signals use of unclaimed Account Id in this range. The tx will error if this account-id already claimed. Useful for instantiate2 address prediction. \
        /// When [`AccountTrace::Remote`]: Account id on the remote chain.
        account_id: Option<AccountId>,
        // optionally specify a namespace for the account
        namespace: Option<String>,
        // Provide list of module to install after account creation
        install_modules: Vec<ModuleInstallConfig>,
    },
}
/// Account Factory query messages
#[cw_ownable::cw_ownable_query]
#[cosmwasm_schema::cw_serde]
#[derive(QueryResponses, cw_orch::QueryFns)]
pub enum QueryMsg {
    /// Returns [`ConfigResponse`]
    #[returns(ConfigResponse)]
    Config {},
}
/// Account Factory config response
#[cosmwasm_schema::cw_serde]
pub struct ConfigResponse {
    pub ans_host_contract: Addr,
    pub version_control_contract: Addr,
    pub module_factory_address: Addr,
    pub local_account_sequence: AccountSequence,
}
/// Sequence numbers for each origin.
#[cosmwasm_schema::cw_serde]
pub struct SequencesResponse {
    pub sequences: Vec<(AccountTrace, AccountSequence)>,
}
#[cosmwasm_schema::cw_serde]
pub struct SequenceResponse {
    pub sequence: AccountSequence,
}
/// Account Factory migrate messages
#[cosmwasm_schema::cw_serde]
pub struct MigrateMsg {}