diff --git a/Cargo.lock b/Cargo.lock index 86c8c45e..e033b6e5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2556,6 +2556,7 @@ dependencies = [ [[package]] name = "orga" version = "0.3.1" +source = "git+https://github.com/nomic-io/orga.git?rev=c5e44ab1b1c008212c175c6c6c47aecaa5948307#c5e44ab1b1c008212c175c6c6c47aecaa5948307" dependencies = [ "abci2", "async-trait", @@ -2616,6 +2617,7 @@ dependencies = [ [[package]] name = "orga-macros" version = "0.3.1" +source = "git+https://github.com/nomic-io/orga.git?rev=c5e44ab1b1c008212c175c6c6c47aecaa5948307#c5e44ab1b1c008212c175c6c6c47aecaa5948307" dependencies = [ "darling", "heck 0.3.3", diff --git a/Cargo.toml b/Cargo.toml index a5d8f9b7..1361495b 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -8,7 +8,7 @@ default-run = "nomic" [dependencies] bitcoin = { version = "0.29.2", features = ["serde", "rand"] } bitcoind = { version = "0.27.0", features = ["22_0"], optional = true } -orga = { git = "https://github.com/nomic-io/orga.git", rev = "19d6718a574e882922418da293e4dcd82d800184", features = ["merk-verify"] } +orga = { git = "https://github.com/nomic-io/orga.git", rev = "c5e44ab1b1c008212c175c6c6c47aecaa5948307", features = ["merk-verify"] } thiserror = "1.0.30" ed = { git = "https://github.com/nomic-io/ed", rev = "9c0e206ffdb59dacb90f083e004e8080713e6ad8" } clap = { version = "3.2.16", features = ["derive"], optional = true } diff --git a/src/app.rs b/src/app.rs index b43a238d..adc687d1 100644 --- a/src/app.rs +++ b/src/app.rs @@ -364,8 +364,11 @@ mod abci { impl BeginBlock for InnerApp { fn begin_block(&mut self, ctx: &BeginBlockCtx) -> Result<()> { - self.upgrade - .step(&vec![Self::CONSENSUS_VERSION].try_into().unwrap())?; + let now = ctx.header.time.as_ref().unwrap().seconds; + self.upgrade.step( + &vec![Self::CONSENSUS_VERSION].try_into().unwrap(), + in_upgrade_window(now), + )?; self.staking.begin_block(ctx)?; #[cfg(feature = "testnet")] @@ -389,7 +392,6 @@ mod abci { self.bitcoin.begin_block(ctx)?; - let now = ctx.header.time.as_ref().unwrap().seconds; let has_nbtc_rewards = self.bitcoin.reward_pool.amount > 0; if self.reward_timer.tick(now) && has_stake && has_nbtc_rewards { let reward_rate = (Amount::new(1) / Amount::new(2377))?; // ~0.00042069 @@ -962,3 +964,23 @@ impl RewardTimer { true } } + +fn in_upgrade_window(now_seconds: i64) -> bool { + use chrono::prelude::*; + let now = Utc.timestamp_opt(now_seconds, 0).unwrap(); + + // Monday - Friday, 17:00 - 17:10 UTC + now.weekday().num_days_from_monday() < 5 && now.hour() == 17 && now.minute() < 10 +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn upgrade_date() { + assert!(in_upgrade_window(1690218300)); // Monday 17:05 UTC + assert!(!in_upgrade_window(1690219200)); // Monday 17:20 UTC + assert!(!in_upgrade_window(1690736700)); // Sunday 17:05 UTC + } +}