use network::constants::Network;
use util::uint::Uint256;
const MAX_BITS_BITCOIN: Uint256 = Uint256([
0xffffffffffffffffu64,
0xffffffffffffffffu64,
0xffffffffffffffffu64,
0x00000fffffffffffu64,
]);
const MAX_BITS_TESTNET: Uint256 = Uint256([
0xffffffffffffffffu64,
0xffffffffffffffffu64,
0xffffffffffffffffu64,
0x00000fffffffffffu64,
]);
const MAX_BITS_REGTEST: Uint256 = Uint256([
0xffffffffffffffffu64,
0xffffffffffffffffu64,
0xffffffffffffffffu64,
0x7fffffffffffffffu64,
]);
#[derive(Debug, Clone)]
pub struct Params {
pub network: Network,
pub bip16_time: u32,
pub bip34_height: u32,
pub bip65_height: u32,
pub bip66_height: u32,
pub rule_change_activation_threshold: u32,
pub miner_confirmation_window: u32,
pub pow_limit: Uint256,
pub pow_target_spacing: u64,
pub pow_target_timespan: u64,
pub allow_min_difficulty_blocks: bool,
pub no_pow_retargeting: bool,
pub switch_lyra2rev2_dgwblock: u32,
}
impl Params {
pub fn new(network: Network) -> Self {
match network {
Network::Monacoin => Params {
network: Network::Monacoin,
bip16_time: 0, bip34_height: 0,
bip65_height: 977759, bip66_height: 977759, rule_change_activation_threshold: 7560, miner_confirmation_window: 10080, pow_limit: MAX_BITS_BITCOIN,
pow_target_spacing: 90, pow_target_timespan: 95040, allow_min_difficulty_blocks: false,
no_pow_retargeting: false,
switch_lyra2rev2_dgwblock: 450000,
},
Network::MonacoinTestnet => Params {
network: Network::MonacoinTestnet,
bip16_time: 0, bip34_height: 0,
bip65_height: 100000000, bip66_height: 100000000, rule_change_activation_threshold: 75, miner_confirmation_window: 100,
pow_limit: MAX_BITS_TESTNET,
pow_target_spacing: 90, pow_target_timespan: 95040, allow_min_difficulty_blocks: true,
no_pow_retargeting: false,
switch_lyra2rev2_dgwblock: 60,
},
Network::MonacoinRegtest => Params {
network: Network::MonacoinRegtest,
bip16_time: 0, bip34_height: 100000000, bip65_height: 100000000,
bip66_height: 100000000, rule_change_activation_threshold: 108, miner_confirmation_window: 144,
pow_limit: MAX_BITS_REGTEST,
pow_target_spacing: 90, pow_target_timespan: 95040, allow_min_difficulty_blocks: true,
no_pow_retargeting: true,
switch_lyra2rev2_dgwblock: 30,
},
}
}
pub fn difficulty_adjustment_interval(&self) -> u64 {
self.pow_target_timespan / self.pow_target_spacing
}
}