bvs_multi_test/
lib.rs

1#![cfg(not(target_arch = "wasm32"))]
2// Only exposed on unit and integration testing, not compiled to Wasm.
3
4use bvs_guardrail::testing::GuardrailContract;
5pub use bvs_library::testing::{Cw20TokenContract, TestingContract};
6pub use bvs_pauser::testing::PauserContract;
7pub use bvs_registry::testing::RegistryContract;
8pub use bvs_vault_bank::testing::VaultBankContract;
9pub use bvs_vault_cw20::testing::VaultCw20Contract;
10pub use bvs_vault_router::testing::VaultRouterContract;
11use cosmwasm_std::{Addr, Env};
12use cw20::MinterResponse;
13use cw_multi_test::App;
14
15pub struct BvsMultiTest {
16    pub pauser: PauserContract,
17    pub registry: RegistryContract,
18    pub guardrail: GuardrailContract,
19    pub vault_router: VaultRouterContract,
20}
21
22/// [BvsMultiTest] provides a convenient way to bootstrap all the necessary contracts
23/// for testing a Service in the BVS ecosystem.
24impl BvsMultiTest {
25    /// Creates a new instance of [BvsMultiTest] with the given [App] and [Env].
26    /// It initializes the [PauserContract], [RegistryContract], and [VaultRouterContract].
27    pub fn new(app: &mut App, env: &Env) -> Self {
28        let pauser = PauserContract::new(app, env, None);
29        let registry = RegistryContract::new(app, env, None);
30        let guardrail = GuardrailContract::new(app, env, None);
31        let vault_router = VaultRouterContract::new(app, env, None);
32
33        Self {
34            pauser,
35            registry,
36            guardrail,
37            vault_router,
38        }
39    }
40
41    /// Deploys a new [VaultBankContract] with the given operator and denom.
42    pub fn deploy_bank_vault(
43        &self,
44        app: &mut App,
45        env: &Env,
46        operator: impl Into<String>,
47        denom: impl Into<String>,
48    ) -> VaultBankContract {
49        let init_msg = bvs_vault_bank::msg::InstantiateMsg {
50            pauser: self.pauser.addr.to_string(),
51            router: self.vault_router.addr.to_string(),
52            operator: operator.into(),
53            denom: denom.into(),
54        };
55
56        let bank_contract = VaultBankContract::new(app, env, Some(init_msg));
57        let set_vault = &bvs_vault_router::msg::ExecuteMsg::SetVault {
58            vault: bank_contract.addr.to_string(),
59            whitelisted: true,
60        };
61        let owner = app.api().addr_make("owner");
62        self.vault_router.execute(app, &owner, set_vault).unwrap();
63        bank_contract
64    }
65
66    /// Deploys a new [VaultCw20Contract] with the given operator and cw20 contract address.
67    pub fn deploy_cw20_vault(
68        &self,
69        app: &mut App,
70        env: &Env,
71        operator: impl Into<String>,
72        cw20_contract: Addr,
73    ) -> VaultCw20Contract {
74        let init_msg = bvs_vault_cw20::msg::InstantiateMsg {
75            pauser: self.pauser.addr.to_string(),
76            router: self.vault_router.addr.to_string(),
77            operator: operator.into(),
78            cw20_contract: cw20_contract.to_string(),
79        };
80
81        let bank_contract = VaultCw20Contract::new(app, env, Some(init_msg));
82        let set_vault = &bvs_vault_router::msg::ExecuteMsg::SetVault {
83            vault: bank_contract.addr.to_string(),
84            whitelisted: true,
85        };
86        let owner = app.api().addr_make("owner");
87        self.vault_router.execute(app, &owner, set_vault).unwrap();
88        bank_contract
89    }
90
91    /// Deploys a new [Cw20TokenContract] with the given symbol and minter address.
92    pub fn deploy_cw20_token(
93        &self,
94        app: &mut App,
95        env: &Env,
96        symbol: impl Into<String>,
97        minter: impl Into<String>,
98    ) -> Cw20TokenContract {
99        let symbol = symbol.into();
100        let init_msg = cw20_base::msg::InstantiateMsg {
101            symbol: symbol.clone(),
102            name: format!("Token {symbol}"),
103            decimals: 18,
104            initial_balances: vec![],
105            mint: Some(MinterResponse {
106                minter: minter.into(),
107                cap: None,
108            }),
109            marketing: None,
110        };
111
112        Cw20TokenContract::new(app, env, Some(init_msg))
113    }
114}
115
116#[cfg(test)]
117mod tests {
118    use super::*;
119    use cosmwasm_std::testing::mock_env;
120    use cw_multi_test::App;
121
122    #[test]
123    fn test_new() {
124        let mut app = App::default();
125        let env = mock_env();
126        BvsMultiTest::new(&mut app, &env);
127    }
128
129    #[test]
130    fn test_deploy_bank_vault() {
131        let mut app = App::default();
132        let env = mock_env();
133        let bvs = BvsMultiTest::new(&mut app, &env);
134
135        let operator = app.api().addr_make("operator");
136        let denom = "denom".to_string();
137
138        let bank_vault = bvs.deploy_bank_vault(&mut app, &env, operator.clone(), denom.clone());
139        assert_eq!(bank_vault.init.operator, operator.to_string());
140        assert_eq!(bank_vault.init.denom, denom);
141    }
142
143    #[test]
144    fn test_deploy_cw20_vault() {
145        let mut app = App::default();
146        let env = mock_env();
147        let bvs = BvsMultiTest::new(&mut app, &env);
148
149        let owner = app.api().addr_make("owner").to_string();
150        let token = bvs.deploy_cw20_token(&mut app, &env, "FRUIT", owner.clone());
151
152        let operator = app.api().addr_make("operator");
153        let cw20_vault =
154            bvs.deploy_cw20_vault(&mut app, &env, operator.clone(), token.addr.clone());
155        assert_eq!(cw20_vault.init.operator, operator.to_string());
156        assert_eq!(cw20_vault.init.cw20_contract, token.addr.to_string());
157    }
158}