Skip to main content

hypercall/
test_contracts.rs

1pub const TESTNET_EXCHANGE_CONTRACT_ADDRESS: &str = "0xe8507472aDd9F35f7Bd73aE8a505E08196A52207";
2pub const TESTNET_CORE_DEPOSIT_WALLET_ADDRESS: &str = "0x6B9E773128f453f5c2C60935Ee2DE2CBc5390A24";
3pub const TESTNET_USDC_ADDRESS: &str = "0x2B3370eE501B4a559b57D449569354196457D8Ab";
4pub const TESTNET_OPTION_REGISTRY_ADDRESS: &str = "0xEd55460d83cC0B37964C377a058B8d6cE0da3034";
5pub const TESTNET_OPTION_TOKEN_BEACON_PROXY_INIT_CODE_HASH: &str =
6    "0x4bff6a944492f2b349eaafcfac839d3e141f08391de02e808c5cfa97a16b5d64";
7
8pub fn apply_testnet_contract_env() {
9    std::env::set_var(
10        "EXCHANGE_CONTRACT_ADDRESS",
11        TESTNET_EXCHANGE_CONTRACT_ADDRESS,
12    );
13    std::env::set_var(
14        "CORE_DEPOSIT_WALLET_ADDRESS",
15        TESTNET_CORE_DEPOSIT_WALLET_ADDRESS,
16    );
17    std::env::set_var("USDC_ADDRESS", TESTNET_USDC_ADDRESS);
18    std::env::set_var("OPTION_REGISTRY_ADDRESS", TESTNET_OPTION_REGISTRY_ADDRESS);
19    std::env::set_var(
20        "OPTION_TOKEN_BEACON_PROXY_INIT_CODE_HASH",
21        TESTNET_OPTION_TOKEN_BEACON_PROXY_INIT_CODE_HASH,
22    );
23}
24
25#[cfg(test)]
26pub struct TestnetContractEnvGuard {
27    saved: Vec<(&'static str, Option<String>)>,
28}
29
30#[cfg(test)]
31impl TestnetContractEnvGuard {
32    pub fn apply() -> Self {
33        let keys = [
34            "TESTNET_MODE",
35            "EXCHANGE_CONTRACT_ADDRESS",
36            "CORE_DEPOSIT_WALLET_ADDRESS",
37            "USDC_ADDRESS",
38            "OPTION_REGISTRY_ADDRESS",
39            "OPTION_TOKEN_BEACON_PROXY_INIT_CODE_HASH",
40        ];
41        let saved = keys
42            .iter()
43            .map(|key| (*key, std::env::var(key).ok()))
44            .collect();
45
46        std::env::set_var("TESTNET_MODE", "1");
47        apply_testnet_contract_env();
48
49        Self { saved }
50    }
51}
52
53#[cfg(test)]
54impl Drop for TestnetContractEnvGuard {
55    fn drop(&mut self) {
56        for (key, value) in self.saved.iter().rev() {
57            if let Some(value) = value {
58                std::env::set_var(key, value);
59            } else {
60                std::env::remove_var(key);
61            }
62        }
63    }
64}
65
66#[cfg(test)]
67pub fn test_database_url_with_database(url: &str, db_name: &str) -> String {
68    let (base, query) = url
69        .split_once('?')
70        .map_or((url, None), |(base, query)| (base, Some(query)));
71    let db_base = base
72        .rsplit_once('/')
73        .map(|(prefix, _)| format!("{prefix}/{db_name}"))
74        .unwrap_or_else(|| format!("{base}/{db_name}"));
75
76    match query {
77        Some(query) => format!("{db_base}?{query}"),
78        None => db_base,
79    }
80}
81
82pub fn testnet_contracts_yaml_block() -> String {
83    format!(
84        r#"contracts:
85  exchange_contract_address: "{TESTNET_EXCHANGE_CONTRACT_ADDRESS}"
86  core_deposit_wallet_address: "{TESTNET_CORE_DEPOSIT_WALLET_ADDRESS}"
87  usdc_address: "{TESTNET_USDC_ADDRESS}"
88  option_registry_address: "{TESTNET_OPTION_REGISTRY_ADDRESS}"
89  option_token_beacon_proxy_init_code_hash: "{TESTNET_OPTION_TOKEN_BEACON_PROXY_INIT_CODE_HASH}"
90"#
91    )
92}
93
94#[cfg(test)]
95mod tests {
96    use super::test_database_url_with_database;
97
98    #[test]
99    fn swaps_database_name_and_preserves_options() {
100        let url = "postgresql://user:password@localhost:5432/original?sslmode=disable&application_name=test";
101
102        let updated = test_database_url_with_database(url, "isolated");
103
104        assert_eq!(
105            updated,
106            "postgresql://user:password@localhost:5432/isolated?sslmode=disable&application_name=test"
107        );
108    }
109}