2021-02-15 01:19:43 +00:00
|
|
|
use crate::bitcoin::{CancelTimelock, PunishTimelock};
|
2021-03-17 04:01:08 +00:00
|
|
|
use std::cmp::max;
|
2020-12-01 23:00:00 +00:00
|
|
|
use std::time::Duration;
|
2021-03-11 03:59:57 +00:00
|
|
|
use time::NumericalStdDurationShort;
|
2020-12-01 23:00:00 +00:00
|
|
|
|
|
|
|
#[derive(Debug, Copy, Clone)]
|
2021-03-17 03:55:42 +00:00
|
|
|
pub struct Config {
|
2020-12-01 23:00:00 +00:00
|
|
|
pub bob_time_to_act: Duration,
|
|
|
|
pub bitcoin_finality_confirmations: u32,
|
|
|
|
pub bitcoin_avg_block_time: Duration,
|
2021-02-15 01:19:43 +00:00
|
|
|
pub bitcoin_cancel_timelock: CancelTimelock,
|
|
|
|
pub bitcoin_punish_timelock: PunishTimelock,
|
2021-03-17 02:36:43 +00:00
|
|
|
pub bitcoin_network: bitcoin::Network,
|
2021-03-17 02:18:49 +00:00
|
|
|
pub monero_avg_block_time: Duration,
|
|
|
|
pub monero_finality_confirmations: u32,
|
2021-03-17 02:36:43 +00:00
|
|
|
pub monero_network: monero::Network,
|
2020-12-01 23:00:00 +00:00
|
|
|
}
|
|
|
|
|
2021-03-17 04:01:08 +00:00
|
|
|
impl Config {
|
|
|
|
pub fn bitcoin_sync_interval(&self) -> Duration {
|
|
|
|
sync_interval(self.bitcoin_avg_block_time)
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn monero_sync_interval(&self) -> Duration {
|
|
|
|
sync_interval(self.monero_avg_block_time)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-03-17 03:55:42 +00:00
|
|
|
pub trait GetConfig {
|
|
|
|
fn get_config() -> Config;
|
2021-01-27 06:03:52 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Clone, Copy)]
|
|
|
|
pub struct Mainnet;
|
|
|
|
|
|
|
|
#[derive(Clone, Copy)]
|
|
|
|
pub struct Testnet;
|
|
|
|
|
|
|
|
#[derive(Clone, Copy)]
|
|
|
|
pub struct Regtest;
|
|
|
|
|
2021-03-17 03:55:42 +00:00
|
|
|
impl GetConfig for Mainnet {
|
|
|
|
fn get_config() -> Config {
|
|
|
|
Config {
|
2021-03-11 03:59:57 +00:00
|
|
|
bob_time_to_act: 10.minutes(),
|
2021-03-11 03:57:47 +00:00
|
|
|
bitcoin_finality_confirmations: 3,
|
2021-03-11 03:59:57 +00:00
|
|
|
bitcoin_avg_block_time: 10.minutes(),
|
2021-03-11 03:57:47 +00:00
|
|
|
bitcoin_cancel_timelock: CancelTimelock::new(72),
|
|
|
|
bitcoin_punish_timelock: PunishTimelock::new(72),
|
2021-03-17 02:36:43 +00:00
|
|
|
bitcoin_network: bitcoin::Network::Bitcoin,
|
2021-03-17 02:18:49 +00:00
|
|
|
monero_avg_block_time: 2.minutes(),
|
|
|
|
monero_finality_confirmations: 15,
|
2021-03-17 02:36:43 +00:00
|
|
|
monero_network: monero::Network::Mainnet,
|
2021-01-04 09:29:11 +00:00
|
|
|
}
|
|
|
|
}
|
2021-01-27 06:03:52 +00:00
|
|
|
}
|
2021-01-04 09:29:11 +00:00
|
|
|
|
2021-03-17 03:55:42 +00:00
|
|
|
impl GetConfig for Testnet {
|
|
|
|
fn get_config() -> Config {
|
|
|
|
Config {
|
2021-03-11 03:59:57 +00:00
|
|
|
bob_time_to_act: 60.minutes(),
|
2021-03-11 03:57:47 +00:00
|
|
|
bitcoin_finality_confirmations: 1,
|
2021-03-11 03:59:57 +00:00
|
|
|
bitcoin_avg_block_time: 5.minutes(),
|
2021-03-11 03:57:47 +00:00
|
|
|
bitcoin_cancel_timelock: CancelTimelock::new(12),
|
|
|
|
bitcoin_punish_timelock: PunishTimelock::new(6),
|
2021-03-17 02:36:43 +00:00
|
|
|
bitcoin_network: bitcoin::Network::Testnet,
|
2021-03-17 02:18:49 +00:00
|
|
|
monero_avg_block_time: 2.minutes(),
|
|
|
|
monero_finality_confirmations: 10,
|
2021-03-17 02:36:43 +00:00
|
|
|
monero_network: monero::Network::Stagenet,
|
2020-12-01 23:00:00 +00:00
|
|
|
}
|
|
|
|
}
|
2021-01-27 06:03:52 +00:00
|
|
|
}
|
2020-12-01 23:00:00 +00:00
|
|
|
|
2021-03-17 03:55:42 +00:00
|
|
|
impl GetConfig for Regtest {
|
|
|
|
fn get_config() -> Config {
|
|
|
|
Config {
|
2021-03-11 03:59:57 +00:00
|
|
|
bob_time_to_act: 30.seconds(),
|
2021-03-11 03:57:47 +00:00
|
|
|
bitcoin_finality_confirmations: 1,
|
2021-03-11 03:59:57 +00:00
|
|
|
bitcoin_avg_block_time: 5.seconds(),
|
2021-03-11 03:57:47 +00:00
|
|
|
bitcoin_cancel_timelock: CancelTimelock::new(100),
|
|
|
|
bitcoin_punish_timelock: PunishTimelock::new(50),
|
2021-03-17 02:36:43 +00:00
|
|
|
bitcoin_network: bitcoin::Network::Regtest,
|
2021-03-17 02:18:49 +00:00
|
|
|
monero_avg_block_time: 1.seconds(),
|
|
|
|
monero_finality_confirmations: 10,
|
2021-03-17 03:55:42 +00:00
|
|
|
monero_network: monero::Network::Mainnet, // yes this is strange
|
2020-12-01 23:00:00 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
2021-03-17 04:01:08 +00:00
|
|
|
|
|
|
|
fn sync_interval(avg_block_time: Duration) -> Duration {
|
|
|
|
max(avg_block_time / 10, Duration::from_secs(1))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod tests {
|
|
|
|
use super::*;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn check_interval_is_one_second_if_avg_blocktime_is_one_second() {
|
|
|
|
let interval = sync_interval(Duration::from_secs(1));
|
|
|
|
|
|
|
|
assert_eq!(interval, Duration::from_secs(1))
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn check_interval_is_tenth_of_avg_blocktime() {
|
|
|
|
let interval = sync_interval(Duration::from_secs(100));
|
|
|
|
|
|
|
|
assert_eq!(interval, Duration::from_secs(10))
|
|
|
|
}
|
|
|
|
}
|