hypercall/
test_contracts.rs1pub 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}