From c07cc3812cc514da7d1cf5364faf4346fbc066e6 Mon Sep 17 00:00:00 2001 From: marcellorigotti Date: Wed, 25 Sep 2024 17:42:29 +0200 Subject: [PATCH] prevent upgrade if we are using a nonce --- state-chain/pallets/cf-environment/src/lib.rs | 12 ++++++++++-- state-chain/runtime/src/lib.rs | 1 + state-chain/traits/src/lib.rs | 5 +++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/state-chain/pallets/cf-environment/src/lib.rs b/state-chain/pallets/cf-environment/src/lib.rs index 2013fc4d97..1aa4f4580e 100644 --- a/state-chain/pallets/cf-environment/src/lib.rs +++ b/state-chain/pallets/cf-environment/src/lib.rs @@ -20,8 +20,8 @@ use cf_primitives::{ NetworkEnvironment, SemVer, }; use cf_traits::{ - CompatibleCfeVersions, GetBitcoinFeeInfo, KeyProvider, NetworkEnvironmentProvider, SafeMode, - SolanaNonceWatch, + CompatibleCfeVersions, ExecutionCondition, GetBitcoinFeeInfo, KeyProvider, + NetworkEnvironmentProvider, SafeMode, SolanaNonceWatch, }; use frame_support::{pallet_prelude::*, traits::StorageVersion}; use frame_system::pallet_prelude::*; @@ -752,3 +752,11 @@ impl NetworkEnvironmentProvider for Pallet { Self::network_environment() } } + +pub struct NoUsedNonce(PhantomData); + +impl ExecutionCondition for NoUsedNonce { + fn is_satisfied() -> bool { + SolanaAvailableNonceAccounts::::get().len() == 10 + } +} diff --git a/state-chain/runtime/src/lib.rs b/state-chain/runtime/src/lib.rs index 8df7f8f690..ce5852c97a 100644 --- a/state-chain/runtime/src/lib.rs +++ b/state-chain/runtime/src/lib.rs @@ -724,6 +724,7 @@ impl pallet_cf_governance::Config for Runtime { type UpgradeCondition = ( pallet_cf_validator::NotDuringRotation, pallet_cf_swapping::NoPendingSwaps, + pallet_cf_environment::NoUsedNonce, ); type RuntimeUpgrade = chainflip::RuntimeUpgradeManager; type CompatibleCfeVersions = Environment; diff --git a/state-chain/traits/src/lib.rs b/state-chain/traits/src/lib.rs index fa82ca329e..19f8754aa1 100644 --- a/state-chain/traits/src/lib.rs +++ b/state-chain/traits/src/lib.rs @@ -638,13 +638,14 @@ pub trait ExecutionCondition { fn is_satisfied() -> bool; } -impl ExecutionCondition for (A, B) +impl ExecutionCondition for (A, B, C) where A: ExecutionCondition, B: ExecutionCondition, + C: ExecutionCondition, { fn is_satisfied() -> bool { - A::is_satisfied() && B::is_satisfied() + A::is_satisfied() && B::is_satisfied() && C::is_satisfied() } }