abstract_account/
lib.rs

1#![cfg_attr(all(coverage_nightly, test), feature(coverage_attribute))]
2
3pub mod config;
4pub mod contract;
5pub mod error;
6pub mod execution;
7pub mod migrate;
8pub mod modules;
9pub mod queries;
10pub mod reply;
11pub mod sub_account;
12pub mod versioning;
13
14pub mod state {
15    pub use abstract_std::account::state::*;
16
17    #[cfg(feature = "xion")]
18    pub use abstract_xion::state::*;
19}
20
21/// Abstract Account
22#[cfg(feature = "xion")]
23pub use abstract_xion;
24
25// re-export based on the feature
26pub mod msg {
27    pub use abstract_std::account::{MigrateMsg, QueryMsg};
28
29    #[cfg(feature = "xion")]
30    pub type Authenticator = crate::abstract_xion::AddAuthenticator;
31    #[cfg(not(feature = "xion"))]
32    pub type Authenticator = cosmwasm_std::Empty;
33
34    pub type ExecuteMsg = abstract_std::account::ExecuteMsg<Authenticator>;
35    pub type InstantiateMsg = abstract_std::account::InstantiateMsg<Authenticator>;
36}
37
38#[cfg(test)]
39mod test_common {
40    use abstract_std::{
41        account::{self},
42        objects::{account::AccountTrace, gov_type::GovernanceDetails, ownership, AccountId},
43    };
44    use abstract_testing::prelude::*;
45    use cosmwasm_std::{testing::*, Addr, Empty, OwnedDeps};
46
47    use crate::{contract::AccountResult, error::AccountError, msg::ExecuteMsg};
48
49    /// Initialize the account with the test owner as the owner
50    pub(crate) fn mock_init(
51        deps: &mut OwnedDeps<MockStorage, MockApi, MockQuerier, Empty>,
52    ) -> AccountResult {
53        let abstr = AbstractMockAddrs::new(deps.api);
54
55        let info = message_info(&abstr.owner, &[]);
56        let env = mock_env_validated(deps.api);
57
58        crate::contract::instantiate(
59            deps.as_mut(),
60            env,
61            info,
62            account::InstantiateMsg {
63                code_id: 1,
64                account_id: Some(AccountId::new(1, AccountTrace::Local).unwrap()),
65                owner: Some(GovernanceDetails::Monarchy {
66                    monarch: abstr.owner.to_string(),
67                }),
68                namespace: None,
69                name: Some("test".to_string()),
70                description: None,
71                link: None,
72                install_modules: vec![],
73                authenticator: None,
74            },
75        )
76    }
77
78    pub fn test_only_owner(msg: ExecuteMsg) -> anyhow::Result<()> {
79        let mut deps = mock_dependencies();
80        deps.querier = abstract_mock_querier(deps.api);
81        let not_owner = deps.api.addr_make("not_owner");
82        mock_init(&mut deps)?;
83
84        let res = execute_as(&mut deps, &not_owner, msg);
85        assert_eq!(
86            res,
87            Err(AccountError::Ownership(
88                ownership::GovOwnershipError::NotOwner,
89            ))
90        );
91
92        Ok(())
93    }
94
95    pub fn execute_as(deps: &mut MockDeps, sender: &Addr, msg: ExecuteMsg) -> AccountResult {
96        let env = mock_env_validated(deps.api);
97        crate::contract::execute(deps.as_mut(), env, message_info(sender, &[]), msg)
98    }
99
100    pub fn execute_as_admin(deps: &mut MockDeps, msg: ExecuteMsg) -> AccountResult {
101        let abstr = AbstractMockAddrs::new(deps.api);
102        let info = message_info(&abstr.owner, &[]);
103        let env = mock_env_validated(deps.api);
104        crate::contract::execute(deps.as_mut(), env, info, msg)
105    }
106}