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
#[cfg(not(target_arch = "wasm32"))]
pub(crate) mod testing_helpers {

    use std::marker::PhantomData;
    use std::str::FromStr;
    use std::string::ToString;

    use cosmwasm_std::testing::{MockApi, MockStorage};
    use cosmwasm_std::{
        Addr, Api, BlockInfo, ContractInfo, CustomQuery, DepsMut, Env, OwnedDeps, Querier, QuerierWrapper, Storage, Timestamp, TransactionInfo,
    };

    use injective_math::FPDecimal;

    use crate::MarketStatus;
    use crate::{
        exchange::{spot_market::SpotMarket, types::MarketId},
        InjectiveQueryWrapper, WasmMockQuerier,
    };

    pub const TEST_CONTRACT_ADDR: &str = "inj14hj2tavq8fpesdwxxcu44rty3hh90vhujaxlnz";

    pub const TEST_MARKET_ID_1: &str = "0xb0f0cd5dc3d18e0407b88a683871399d52483f06c757858a3a9f388877232b11";
    pub const TEST_MARKET_ID_2: &str = "0xa815458b073ea303494e0c87f532483834f85622e1db1ad08e4ece2d360b248d";
    pub const TEST_MARKET_ID_3: &str = "0x0fb00a5b353c58e92ec15e054473b04ecd80c6aec0294cd6702d45e53cdee791";
    pub const TEST_MARKET_ID_4: &str = "0xcde25cd74f38858ac4514412da4363e162bf76f6ae8b462b02e0450d8c8ce78a";
    pub const TEST_MARKET_ID_5: &str = "0x631000a7505094f18446cb6e29a47d1c2a10f44ddb57c021bc0f782adc5ae181";
    pub const TEST_MARKET_ID_6: &str = "0xae28d026f7df038b4a91513181446b9985bdb532485c4d57c8d130d91ba9ce91";
    pub const TEST_MARKET_ID_7: &str = "0x071e1baf54139efc4f4e7897412fde9d06836e12ecbe8b5736c954c0609514d7";
    pub const TEST_MARKET_ID_8: &str = "0x2b0524a1b95942c28de4463d67bb24e0104fd853582a327b3af136d32a84f15d";
    pub const TEST_MARKET_ID_9: &str = "0x92194a85e26a47057c0180465229803c41603b5e9db0dcb54ae4300b023369a4";
    pub const TEST_MARKET_ID_10: &str = "0xc95810e76d34530ce1dc6ca25eb82123e49033f1e5e36db9a0639003267fac32";

    pub fn test_market_ids() -> Vec<MarketId> {
        vec![
            MarketId::new(TEST_MARKET_ID_1.to_string()).unwrap(),
            MarketId::new(TEST_MARKET_ID_2.to_string()).unwrap(),
            MarketId::new(TEST_MARKET_ID_3.to_string()).unwrap(),
            MarketId::new(TEST_MARKET_ID_4.to_string()).unwrap(),
            MarketId::new(TEST_MARKET_ID_5.to_string()).unwrap(),
            MarketId::new(TEST_MARKET_ID_6.to_string()).unwrap(),
            MarketId::new(TEST_MARKET_ID_7.to_string()).unwrap(),
            MarketId::new(TEST_MARKET_ID_8.to_string()).unwrap(),
            MarketId::new(TEST_MARKET_ID_9.to_string()).unwrap(),
            MarketId::new(TEST_MARKET_ID_10.to_string()).unwrap(),
        ]
    }

    pub fn inj_mock_env() -> Env {
        Env {
            block: BlockInfo {
                height: 12_345,
                time: Timestamp::from_nanos(1_571_797_419_879_305_533),
                chain_id: "cosmos-testnet-14002".to_string(),
            },
            transaction: Some(TransactionInfo { index: 3 }),
            contract: ContractInfo {
                address: Addr::unchecked(TEST_CONTRACT_ADDR),
            },
        }
    }

    pub trait OwnedDepsExt<S, A, Q, C>
    where
        C: CustomQuery,
    {
        fn as_mut_deps(&mut self) -> DepsMut<C>;
    }

    impl<S, A, Q, C> OwnedDepsExt<S, A, Q, C> for OwnedDeps<S, A, Q, C>
    where
        S: Storage,
        A: Api,
        Q: Querier,
        C: CustomQuery,
    {
        fn as_mut_deps(&mut self) -> DepsMut<C> {
            return DepsMut {
                storage: &mut self.storage,
                api: &self.api,
                querier: QuerierWrapper::new(&self.querier),
            };
        }
    }

    pub fn inj_mock_deps<F>(handlers_callback: F) -> OwnedDeps<MockStorage, MockApi, WasmMockQuerier, InjectiveQueryWrapper>
    where
        F: FnOnce(&mut WasmMockQuerier),
    {
        let mut custom_querier: WasmMockQuerier = WasmMockQuerier::new();
        handlers_callback(&mut custom_querier);
        OwnedDeps {
            api: MockApi::default(),
            storage: MockStorage::default(),
            querier: custom_querier,
            custom_query_type: PhantomData::default(),
        }
    }

    pub fn create_mock_spot_market(base: &str, idx: u32) -> SpotMarket {
        SpotMarket {
            ticker: format!("{base}usdt"),
            base_denom: base.to_string(),
            quote_denom: "usdt".to_string(),
            maker_fee_rate: FPDecimal::from_str("0.001").unwrap(),
            taker_fee_rate: FPDecimal::from_str("0.002").unwrap(),
            relayer_fee_share_rate: FPDecimal::from_str("0.4").unwrap(),
            market_id: test_market_ids()[idx as usize].clone(),
            status: MarketStatus::Active,
            min_price_tick_size: FPDecimal::from_str("0.01").unwrap(),
            min_quantity_tick_size: FPDecimal::from_str("0.01").unwrap(),
        }
    }
}