From 8361ff2bdbe207beeb736c413527feab975b6504 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Wed, 20 Sep 2023 14:38:04 +0300 Subject: [PATCH 01/12] Add InitializerVersion and IsBalancedCheckRequiredOnRuntimeUpgrade at pallet config --- .../src/lib.rs | 12 ++++++++---- .../src/upgrade_init.rs | 13 ++++++++++--- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/lib.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/lib.rs index f3c61895e..af7caaa56 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/lib.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/lib.rs @@ -39,9 +39,6 @@ type EvmBalanceOf = /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); -/// The current bridges initializer version. -pub const CURRENT_BRIDGES_INITIALIZER_VERSION: u16 = 1; - // We have to temporarily allow some clippy lints. Later on we'll send patches to substrate to // fix them at their end. #[allow(clippy::missing_docs_in_private_items)] @@ -96,6 +93,13 @@ pub mod pallet { /// The evm-native bridge pot account. type EvmNativeBridgePot: Get; + /// The current bridges initializer version. + type InitializerVersion: Get; + + /// Whether currencies balanced check required on runtime upgrade. + #[pallet::constant] + type IsBalancedCheckRequiredOnRuntimeUpgrade: Get; + /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; } @@ -129,7 +133,7 @@ pub mod pallet { } } - >::put(CURRENT_BRIDGES_INITIALIZER_VERSION); + >::put(T::InitializerVersion::get()); } } diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs index fed1b4bd4..5774e2877 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs @@ -4,14 +4,14 @@ use frame_support::pallet_prelude::*; #[cfg(feature = "try-runtime")] use sp_std::vec::Vec; -use crate::{Config, InitializerVersion, Pallet, CURRENT_BRIDGES_INITIALIZER_VERSION}; +use crate::{Config, InitializerVersion, Pallet}; /// Initialize the bridges pot accounts. pub fn on_runtime_upgrade() -> Weight { let initializer_version = >::get(); let mut weight = T::DbWeight::get().reads(1); - if initializer_version != CURRENT_BRIDGES_INITIALIZER_VERSION { + if initializer_version < T::InitializerVersion::get() { let is_balanced = Pallet::::is_balanced().unwrap_or_default(); weight += T::DbWeight::get().reads(8); @@ -22,7 +22,14 @@ pub fn on_runtime_upgrade() -> Weight { } } - >::put(CURRENT_BRIDGES_INITIALIZER_VERSION); + >::put(T::InitializerVersion::get()); + } else if T::IsBalancedCheckRequiredOnRuntimeUpgrade::get() { + let is_balanced = Pallet::::is_balanced().unwrap_or_default(); + weight += T::DbWeight::get().reads(8); + + if !is_balanced { + sp_tracing::error!("currencies are not balanced"); + } } weight From 60003dbf4b808ec2ff211d5d6709cc606b53c838 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Wed, 20 Sep 2023 14:38:36 +0300 Subject: [PATCH 02/12] Add v2 mock environment --- .../src/mock/mod.rs | 5 +- .../src/mock/v1.rs | 4 +- .../src/mock/v2.rs | 137 ++++++++++++++++++ 3 files changed, 144 insertions(+), 2 deletions(-) create mode 100644 crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v2.rs diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/mod.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/mod.rs index aa3853449..669893a3b 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/mod.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/mod.rs @@ -6,9 +6,12 @@ use crate::{self as pallet_balanced_currency_swap_bridges_initializer}; pub mod v0; pub mod v1; +pub mod v2; pub(crate) const EXISTENTIAL_DEPOSIT_NATIVE: u64 = 10; -pub(crate) const EXISTENTIAL_DEPOSIT_EVM: u64 = 20; +pub(crate) const EXISTENTIAL_DEPOSIT_EVM: u64 = 10; +pub(crate) const EXISTENTIAL_DEPOSIT_EVM_NEW: u64 = 1; +pub(crate) const CURRENT_BRIDGES_INITIALIZER_VERSION: u16 = 1; pub(crate) type AccountId = u64; pub(crate) type EvmAccountId = u64; diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v1.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v1.rs index d9801d64d..71baa21a0 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v1.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v1.rs @@ -12,7 +12,7 @@ use frame_support::{ traits::{ConstU32, ConstU64, StorageMapShim}, PalletId, }; -use sp_core::H256; +use sp_core::{ConstBool, ConstU16, H256}; use super::*; @@ -131,5 +131,7 @@ impl pallet_balanced_currency_swap_bridges_initializer::Config for Test { type NativeEvmBridgePot = SwapBridgeNativeToEvmPotAccountId; type NativeTreasuryPot = NativeTreasury; type EvmNativeBridgePot = SwapBridgeEvmToNativePotAccountId; + type InitializerVersion = ConstU16<1>; + type IsBalancedCheckRequiredOnRuntimeUpgrade = ConstBool; type WeightInfo = (); } diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v2.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v2.rs new file mode 100644 index 000000000..f9dafa32a --- /dev/null +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v2.rs @@ -0,0 +1,137 @@ +//! The v2 mock. + +// Allow simple integer arithmetic in tests. +#![allow(clippy::integer_arithmetic)] + +use frame_support::{ + parameter_types, + sp_runtime::{ + testing::Header, + traits::{BlakeTwo256, Identity, IdentityLookup}, + }, + traits::{ConstU32, ConstU64, StorageMapShim}, + PalletId, +}; +use sp_core::{ConstBool, ConstU16, H256}; + +use super::*; + +type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; +type Block = frame_system::mocking::MockBlock; + +frame_support::construct_runtime!( + pub enum Test where + Block = Block, + NodeBlock = Block, + UncheckedExtrinsic = UncheckedExtrinsic, + { + System: frame_system, + Balances: pallet_balances::, + EvmBalances: pallet_balances::, + SwapBridgeNativeToEvmPot: pallet_pot::, + SwapBridgeEvmToNativePot: pallet_pot::, + EvmNativeBridgesInitializer: pallet_balanced_currency_swap_bridges_initializer, + } +); + +impl frame_system::Config for Test { + type BaseCallFilter = frame_support::traits::Everything; + type BlockWeights = (); + type BlockLength = (); + type DbWeight = (); + type RuntimeOrigin = RuntimeOrigin; + type RuntimeCall = RuntimeCall; + type Index = u64; + type BlockNumber = u64; + type Hash = H256; + type Hashing = BlakeTwo256; + type AccountId = AccountId; + type Lookup = IdentityLookup; + type Header = Header; + type RuntimeEvent = RuntimeEvent; + type BlockHashCount = ConstU64<250>; + type Version = (); + type PalletInfo = PalletInfo; + type AccountData = pallet_balances::AccountData; + type OnNewAccount = (); + type OnKilledAccount = (); + type SystemWeightInfo = (); + type SS58Prefix = (); + type OnSetCode = (); + type MaxConsumers = ConstU32<16>; +} + +impl pallet_balances::Config for Test { + type Balance = u64; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ConstU64; + type AccountStore = System; + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type WeightInfo = (); +} + +impl pallet_balances::Config for Test { + type Balance = u64; + type RuntimeEvent = RuntimeEvent; + type DustRemoval = (); + type ExistentialDeposit = ConstU64; + type AccountStore = StorageMapShim< + pallet_balances::Account, + frame_system::Provider, + EvmAccountId, + pallet_balances::AccountData, + >; + type MaxLocks = (); + type MaxReserves = (); + type ReserveIdentifier = [u8; 8]; + type WeightInfo = (); +} + +parameter_types! { + pub const SwapBridgeNativeToEvmPotPalletId: PalletId = PalletId(*b"humanoNE"); + pub const SwapBridgeEvmToNativePotPalletId: PalletId = PalletId(*b"humanoEN"); +} + +type PotInstanceSwapBridgeNativeToEvm = pallet_pot::Instance1; +type PotInstanceSwapBridgeEvmToNative = pallet_pot::Instance2; + +impl pallet_pot::Config for Test { + type RuntimeEvent = RuntimeEvent; + type AccountId = AccountId; + type PalletId = SwapBridgeNativeToEvmPotPalletId; + type Currency = Balances; +} + +impl pallet_pot::Config for Test { + type RuntimeEvent = RuntimeEvent; + type AccountId = EvmAccountId; + type PalletId = SwapBridgeEvmToNativePotPalletId; + type Currency = EvmBalances; +} + +parameter_types! { + pub const SwapBridgeNativeToEvmPalletId: PalletId = PalletId(*b"hmsb/ne1"); + pub const SwapBridgeEvmToNativePalletId: PalletId = PalletId(*b"hmsb/en1"); +} + +parameter_types! { + pub SwapBridgeNativeToEvmPotAccountId: AccountId = SwapBridgeNativeToEvmPot::account_id(); + pub SwapBridgeEvmToNativePotAccountId: AccountId = SwapBridgeEvmToNativePot::account_id(); +} + +impl pallet_balanced_currency_swap_bridges_initializer::Config for Test { + type EvmAccountId = EvmAccountId; + type NativeCurrency = Balances; + type EvmCurrency = EvmBalances; + type BalanceConverterEvmToNative = Identity; + type BalanceConverterNativeToEvm = Identity; + type NativeEvmBridgePot = SwapBridgeNativeToEvmPotAccountId; + type NativeTreasuryPot = NativeTreasury; + type EvmNativeBridgePot = SwapBridgeEvmToNativePotAccountId; + type InitializerVersion = ConstU16<1>; + type IsBalancedCheckRequiredOnRuntimeUpgrade = ConstBool; + type WeightInfo = (); +} From d589effd24e65334bdf0329a2873abbd4f089069 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Wed, 20 Sep 2023 14:46:36 +0300 Subject: [PATCH 03/12] Add additional runtime upgrade test --- .../src/tests.rs | 26 ++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/tests.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/tests.rs index 36f972d44..4535e68a9 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/tests.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/tests.rs @@ -4,8 +4,8 @@ use frame_support::{ }; use crate::{ - mock::{new_test_ext_with, v0, v1, with_runtime_lock, *}, - swappable_balance, InitializerVersion, CURRENT_BRIDGES_INITIALIZER_VERSION, + mock::{new_test_ext_with, v0, v1, v2, with_runtime_lock, *}, + swappable_balance, InitializerVersion, }; /// This test verifies that balanced bridges initialization works in case bridge pot accounts @@ -426,12 +426,32 @@ fn runtime_upgrade() { - (EXISTENTIAL_DEPOSIT_EVM - EXISTENTIAL_DEPOSIT_NATIVE) ); assert_eq!( - v1::EvmBalances::total_balance(&v1::SwapBridgeEvmToNativePot::account_id(),), + v1::EvmBalances::total_balance(&v1::SwapBridgeEvmToNativePot::account_id()), v1::Balances::total_balance(&NativeTreasury::get()) + ALICE.balance + BOB.balance + EXISTENTIAL_DEPOSIT_EVM ); + + // Get bridges balances before runtime upgrade. + let native_evm_bridge_balance_before = + v2::Balances::total_balance(&v1::SwapBridgeNativeToEvmPot::account_id()); + let evm_native_bridge_balance_before = + v2::EvmBalances::total_balance(&v1::SwapBridgeEvmToNativePot::account_id()); + + // Do runtime upgrade hook. + v2::AllPalletsWithoutSystem::on_runtime_upgrade(); + + // Verify result. + assert!(v2::EvmNativeBridgesInitializer::is_balanced().unwrap()); + assert_eq!( + v2::Balances::total_balance(&v1::SwapBridgeNativeToEvmPot::account_id()), + native_evm_bridge_balance_before + ); + assert_eq!( + v2::EvmBalances::total_balance(&v1::SwapBridgeEvmToNativePot::account_id()), + evm_native_bridge_balance_before + ); }); }) } From 42ff388ac3959abe558d367f5ce6244f6cb28f0e Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Wed, 20 Sep 2023 14:55:10 +0300 Subject: [PATCH 04/12] Add missing field into pallet config at runtime --- crates/humanode-runtime/src/lib.rs | 3 +++ crates/humanode-runtime/src/tests/currency_swap.rs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/humanode-runtime/src/lib.rs b/crates/humanode-runtime/src/lib.rs index f5ce2f2d3..0caff9652 100644 --- a/crates/humanode-runtime/src/lib.rs +++ b/crates/humanode-runtime/src/lib.rs @@ -774,6 +774,7 @@ parameter_types! { parameter_types! { pub TreasuryPotAccountId: AccountId = TreasuryPot::account_id(); + pub BridgesInitializerVersion: u16 = 1; } impl pallet_balanced_currency_swap_bridges_initializer::Config for Runtime { @@ -785,6 +786,8 @@ impl pallet_balanced_currency_swap_bridges_initializer::Config for Runtime { type NativeEvmBridgePot = NativeToEvmSwapBridgePotAccountId; type NativeTreasuryPot = TreasuryPotAccountId; type EvmNativeBridgePot = EvmToNativeSwapBridgePotAccountId; + type InitializerVersion = BridgesInitializerVersion; + type IsBalancedCheckRequiredOnRuntimeUpgrade = ConstBool; type WeightInfo = (); } diff --git a/crates/humanode-runtime/src/tests/currency_swap.rs b/crates/humanode-runtime/src/tests/currency_swap.rs index 887205c44..b9ebad5bf 100644 --- a/crates/humanode-runtime/src/tests/currency_swap.rs +++ b/crates/humanode-runtime/src/tests/currency_swap.rs @@ -122,7 +122,7 @@ fn currencies_are_balanced() { new_test_ext_with().execute_with(move || { assert_eq!( BalancedCurrencySwapBridgesInitializer::initializer_version(), - pallet_balanced_currency_swap_bridges_initializer::CURRENT_BRIDGES_INITIALIZER_VERSION + BridgesInitializerVersion::get() ); assert!(BalancedCurrencySwapBridgesInitializer::is_balanced().unwrap()); }) From 73c28576205966c2e867eebe0280a511778dc8f8 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Thu, 21 Sep 2023 15:14:43 +0300 Subject: [PATCH 05/12] Some code refactoring --- .../src/lib.rs | 25 ++++++----- .../src/mock/v1.rs | 7 +-- .../src/mock/v2.rs | 7 +-- .../src/tests.rs | 45 ++++++++++++++----- .../src/upgrade_init.rs | 41 +++++++++-------- 5 files changed, 78 insertions(+), 47 deletions(-) diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/lib.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/lib.rs index af7caaa56..7bd80c4e0 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/lib.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/lib.rs @@ -39,6 +39,9 @@ type EvmBalanceOf = /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); +/// The current bridges initializer version. +pub const CURRENT_BRIDGES_INITIALIZER_VERSION: u16 = 1; + // We have to temporarily allow some clippy lints. Later on we'll send patches to substrate to // fix them at their end. #[allow(clippy::missing_docs_in_private_items)] @@ -93,21 +96,22 @@ pub mod pallet { /// The evm-native bridge pot account. type EvmNativeBridgePot: Get; - /// The current bridges initializer version. - type InitializerVersion: Get; - - /// Whether currencies balanced check required on runtime upgrade. - #[pallet::constant] - type IsBalancedCheckRequiredOnRuntimeUpgrade: Get; + /// The force rebalance ask counter. + type ForceRebalanceAskCounter: Get; /// Weight information for extrinsics in this pallet. type WeightInfo: WeightInfo; } - /// The initializer version. + /// The last initializer version. + #[pallet::storage] + #[pallet::getter(fn last_initializer_version)] + pub type LastInitializerVersion = StorageValue<_, u16, ValueQuery>; + + /// The last force rebalance ask counter. #[pallet::storage] - #[pallet::getter(fn initializer_version)] - pub type InitializerVersion = StorageValue<_, u16, ValueQuery>; + #[pallet::getter(fn last_force_rebalance_ask_counter)] + pub type LastForceRebalanceAskCounter = StorageValue<_, u16, ValueQuery>; #[pallet::genesis_config] pub struct GenesisConfig(PhantomData); @@ -133,7 +137,8 @@ pub mod pallet { } } - >::put(T::InitializerVersion::get()); + >::put(CURRENT_BRIDGES_INITIALIZER_VERSION); + >::put(T::ForceRebalanceAskCounter::get()); } } diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v1.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v1.rs index 71baa21a0..2d4f3b425 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v1.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v1.rs @@ -12,10 +12,12 @@ use frame_support::{ traits::{ConstU32, ConstU64, StorageMapShim}, PalletId, }; -use sp_core::{ConstBool, ConstU16, H256}; +use sp_core::{ConstU16, H256}; use super::*; +pub(crate) const FORCE_REBALANCE_ASK_COUNTER: u16 = 0; + type UncheckedExtrinsic = frame_system::mocking::MockUncheckedExtrinsic; type Block = frame_system::mocking::MockBlock; @@ -131,7 +133,6 @@ impl pallet_balanced_currency_swap_bridges_initializer::Config for Test { type NativeEvmBridgePot = SwapBridgeNativeToEvmPotAccountId; type NativeTreasuryPot = NativeTreasury; type EvmNativeBridgePot = SwapBridgeEvmToNativePotAccountId; - type InitializerVersion = ConstU16<1>; - type IsBalancedCheckRequiredOnRuntimeUpgrade = ConstBool; + type ForceRebalanceAskCounter = ConstU16; type WeightInfo = (); } diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v2.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v2.rs index f9dafa32a..3ddeadbf4 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v2.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/mock/v2.rs @@ -12,7 +12,9 @@ use frame_support::{ traits::{ConstU32, ConstU64, StorageMapShim}, PalletId, }; -use sp_core::{ConstBool, ConstU16, H256}; +use sp_core::{ConstU16, H256}; + +pub(crate) const FORCE_REBALANCE_ASK_COUNTER: u16 = 1; use super::*; @@ -131,7 +133,6 @@ impl pallet_balanced_currency_swap_bridges_initializer::Config for Test { type NativeEvmBridgePot = SwapBridgeNativeToEvmPotAccountId; type NativeTreasuryPot = NativeTreasury; type EvmNativeBridgePot = SwapBridgeEvmToNativePotAccountId; - type InitializerVersion = ConstU16<1>; - type IsBalancedCheckRequiredOnRuntimeUpgrade = ConstBool; + type ForceRebalanceAskCounter = ConstU16; type WeightInfo = (); } diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/tests.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/tests.rs index 4535e68a9..f5a70a3a2 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/tests.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/tests.rs @@ -5,7 +5,7 @@ use frame_support::{ use crate::{ mock::{new_test_ext_with, v0, v1, v2, with_runtime_lock, *}, - swappable_balance, InitializerVersion, + swappable_balance, LastForceRebalanceAskCounter, LastInitializerVersion, }; /// This test verifies that balanced bridges initialization works in case bridge pot accounts @@ -55,9 +55,13 @@ fn initialization_bridges_ed_works() { }; new_test_ext_with(config).execute_with(move || { assert_eq!( - >::get(), + >::get(), CURRENT_BRIDGES_INITIALIZER_VERSION ); + assert_eq!( + >::get(), + v1::FORCE_REBALANCE_ASK_COUNTER + ); assert_eq!( v1::Balances::total_balance(&v1::SwapBridgeNativeToEvmPot::account_id()), LION.balance @@ -133,9 +137,13 @@ fn initialization_bridges_ed_delta_works() { }; new_test_ext_with(config).execute_with(move || { assert_eq!( - >::get(), + >::get(), CURRENT_BRIDGES_INITIALIZER_VERSION ); + assert_eq!( + >::get(), + v1::FORCE_REBALANCE_ASK_COUNTER + ); assert_eq!( v1::Balances::total_balance(&v1::SwapBridgeNativeToEvmPot::account_id()), LION.balance @@ -210,9 +218,13 @@ fn initialization_idempotency() { new_test_ext_with(config).execute_with(move || { // Verify that bridges initialization has been applied at genesis. assert_eq!( - >::get(), + >::get(), CURRENT_BRIDGES_INITIALIZER_VERSION ); + assert_eq!( + >::get(), + v1::FORCE_REBALANCE_ASK_COUNTER + ); assert!(v1::EvmNativeBridgesInitializer::is_balanced().unwrap()); assert_eq!( v1::Balances::total_balance(&v1::SwapBridgeNativeToEvmPot::account_id()), @@ -395,16 +407,21 @@ fn runtime_upgrade() { v1::Balances::total_balance(&v1::SwapBridgeEvmToNativePot::account_id()), 0 ); - assert_eq!(>::get(), 0); + assert_eq!(>::get(), 0); + assert_eq!(>::get(), 0); // Do runtime upgrade hook. v1::AllPalletsWithoutSystem::on_runtime_upgrade(); // Verify bridges initialization result. assert_eq!( - >::get(), + >::get(), CURRENT_BRIDGES_INITIALIZER_VERSION ); + assert_eq!( + >::get(), + v1::FORCE_REBALANCE_ASK_COUNTER + ); assert!(v1::EvmNativeBridgesInitializer::is_balanced().unwrap()); assert_eq!( v1::Balances::total_balance(&v1::SwapBridgeNativeToEvmPot::account_id()), @@ -435,21 +452,29 @@ fn runtime_upgrade() { // Get bridges balances before runtime upgrade. let native_evm_bridge_balance_before = - v2::Balances::total_balance(&v1::SwapBridgeNativeToEvmPot::account_id()); + v2::Balances::total_balance(&v2::SwapBridgeNativeToEvmPot::account_id()); let evm_native_bridge_balance_before = - v2::EvmBalances::total_balance(&v1::SwapBridgeEvmToNativePot::account_id()); + v2::EvmBalances::total_balance(&v2::SwapBridgeEvmToNativePot::account_id()); // Do runtime upgrade hook. v2::AllPalletsWithoutSystem::on_runtime_upgrade(); // Verify result. + assert_eq!( + >::get(), + CURRENT_BRIDGES_INITIALIZER_VERSION + ); + assert_eq!( + >::get(), + v2::FORCE_REBALANCE_ASK_COUNTER + ); assert!(v2::EvmNativeBridgesInitializer::is_balanced().unwrap()); assert_eq!( - v2::Balances::total_balance(&v1::SwapBridgeNativeToEvmPot::account_id()), + v2::Balances::total_balance(&v2::SwapBridgeNativeToEvmPot::account_id()), native_evm_bridge_balance_before ); assert_eq!( - v2::EvmBalances::total_balance(&v1::SwapBridgeEvmToNativePot::account_id()), + v2::EvmBalances::total_balance(&v2::SwapBridgeEvmToNativePot::account_id()), evm_native_bridge_balance_before ); }); diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs index 5774e2877..e1b265b1b 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs @@ -4,32 +4,31 @@ use frame_support::pallet_prelude::*; #[cfg(feature = "try-runtime")] use sp_std::vec::Vec; -use crate::{Config, InitializerVersion, Pallet}; +use crate::{ + Config, LastForceRebalanceAskCounter, LastInitializerVersion, Pallet, + CURRENT_BRIDGES_INITIALIZER_VERSION, +}; -/// Initialize the bridges pot accounts. +/// Initialize the bridges pot accounts if required. pub fn on_runtime_upgrade() -> Weight { - let initializer_version = >::get(); - let mut weight = T::DbWeight::get().reads(1); - - if initializer_version < T::InitializerVersion::get() { - let is_balanced = Pallet::::is_balanced().unwrap_or_default(); - weight += T::DbWeight::get().reads(8); - - if !is_balanced { - match Pallet::::initialize() { - Ok(w) => weight += w, - Err(err) => sp_tracing::error!("error during bridges initialization: {err:?}"), - } - } + let last_initializer_version = >::get(); + let last_force_rebalance_ask_counter = >::get(); + let current_force_rebalance_ask_counter = T::ForceRebalanceAskCounter::get(); + + let mut weight = T::DbWeight::get().reads(3); - >::put(T::InitializerVersion::get()); - } else if T::IsBalancedCheckRequiredOnRuntimeUpgrade::get() { - let is_balanced = Pallet::::is_balanced().unwrap_or_default(); - weight += T::DbWeight::get().reads(8); + let is_version_mismatch = last_initializer_version != CURRENT_BRIDGES_INITIALIZER_VERSION; + let is_forced = last_force_rebalance_ask_counter != current_force_rebalance_ask_counter; - if !is_balanced { - sp_tracing::error!("currencies are not balanced"); + if is_version_mismatch || is_forced { + match Pallet::::initialize() { + Ok(w) => weight += w, + Err(err) => sp_tracing::error!("error during bridges initialization: {err:?}"), } + + >::put(CURRENT_BRIDGES_INITIALIZER_VERSION); + >::put(current_force_rebalance_ask_counter); + weight += T::DbWeight::get().writes(2); } weight From 8dbda384338cb97cdb65813eef5abed8b22e509d Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Thu, 21 Sep 2023 15:20:36 +0300 Subject: [PATCH 06/12] Fix pallet usage at runtime --- crates/humanode-runtime/src/lib.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/crates/humanode-runtime/src/lib.rs b/crates/humanode-runtime/src/lib.rs index 0caff9652..c90df7d94 100644 --- a/crates/humanode-runtime/src/lib.rs +++ b/crates/humanode-runtime/src/lib.rs @@ -786,8 +786,7 @@ impl pallet_balanced_currency_swap_bridges_initializer::Config for Runtime { type NativeEvmBridgePot = NativeToEvmSwapBridgePotAccountId; type NativeTreasuryPot = TreasuryPotAccountId; type EvmNativeBridgePot = EvmToNativeSwapBridgePotAccountId; - type InitializerVersion = BridgesInitializerVersion; - type IsBalancedCheckRequiredOnRuntimeUpgrade = ConstBool; + type ForceRebalanceAskCounter = ConstU16<0>; type WeightInfo = (); } From d32584f38055c99ea5f14aed9875c8fd01339efb Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Thu, 21 Sep 2023 15:21:10 +0300 Subject: [PATCH 07/12] Fix tests --- crates/humanode-runtime/src/tests/currency_swap.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/humanode-runtime/src/tests/currency_swap.rs b/crates/humanode-runtime/src/tests/currency_swap.rs index b9ebad5bf..297fef652 100644 --- a/crates/humanode-runtime/src/tests/currency_swap.rs +++ b/crates/humanode-runtime/src/tests/currency_swap.rs @@ -121,7 +121,7 @@ fn currencies_are_balanced() { // Build the state from the config. new_test_ext_with().execute_with(move || { assert_eq!( - BalancedCurrencySwapBridgesInitializer::initializer_version(), + BalancedCurrencySwapBridgesInitializer::last_initializer_version(), BridgesInitializerVersion::get() ); assert!(BalancedCurrencySwapBridgesInitializer::is_balanced().unwrap()); From 553cb16a8d95103e7a6bf566077cd9fdb7684ed6 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Thu, 21 Sep 2023 15:22:03 +0300 Subject: [PATCH 08/12] Remove unused parameter --- crates/humanode-runtime/src/lib.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/crates/humanode-runtime/src/lib.rs b/crates/humanode-runtime/src/lib.rs index c90df7d94..f30cca5f5 100644 --- a/crates/humanode-runtime/src/lib.rs +++ b/crates/humanode-runtime/src/lib.rs @@ -774,7 +774,6 @@ parameter_types! { parameter_types! { pub TreasuryPotAccountId: AccountId = TreasuryPot::account_id(); - pub BridgesInitializerVersion: u16 = 1; } impl pallet_balanced_currency_swap_bridges_initializer::Config for Runtime { From a3df2efa3680f8165e430fc44db5ded0574dba07 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Thu, 21 Sep 2023 15:37:12 +0300 Subject: [PATCH 09/12] Add storage root check on try-runtime execution --- .../src/upgrade_init.rs | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs index e1b265b1b..55dd61299 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs @@ -48,9 +48,15 @@ pub fn pre_upgrade() -> Result, &'static str> { /// Panics if anything goes wrong. #[cfg(feature = "try-runtime")] pub fn post_upgrade(_state: Vec) -> Result<(), &'static str> { + use frame_support::{storage_root, StateVersion}; + + let storage_root_before = storage_root(StateVersion::V1); + if !Pallet::::is_balanced()? { return Err("currencies are not balanced"); } + assert_eq!(storage_root_before, storage_root(StateVersion::V1)); + Ok(()) } From 67f88e4b43ce9aebcf2c65780ca148a988d54078 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov Date: Thu, 21 Sep 2023 15:39:00 +0300 Subject: [PATCH 10/12] Fix tests again --- crates/humanode-runtime/src/tests/currency_swap.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/humanode-runtime/src/tests/currency_swap.rs b/crates/humanode-runtime/src/tests/currency_swap.rs index 297fef652..4642a6b8f 100644 --- a/crates/humanode-runtime/src/tests/currency_swap.rs +++ b/crates/humanode-runtime/src/tests/currency_swap.rs @@ -122,7 +122,7 @@ fn currencies_are_balanced() { new_test_ext_with().execute_with(move || { assert_eq!( BalancedCurrencySwapBridgesInitializer::last_initializer_version(), - BridgesInitializerVersion::get() + pallet_balanced_currency_swap_bridges_initializer::CURRENT_BRIDGES_INITIALIZER_VERSION ); assert!(BalancedCurrencySwapBridgesInitializer::is_balanced().unwrap()); }) From 921e2161d2654262acbe9f680cf8147f159b7a38 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov <39522748+dmitrylavrenov@users.noreply.github.com> Date: Fri, 22 Sep 2023 10:36:52 +0300 Subject: [PATCH 11/12] Use proper reads value Co-authored-by: MOZGIII --- .../src/upgrade_init.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs index 55dd61299..6cfa52380 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs @@ -15,7 +15,7 @@ pub fn on_runtime_upgrade() -> Weight { let last_force_rebalance_ask_counter = >::get(); let current_force_rebalance_ask_counter = T::ForceRebalanceAskCounter::get(); - let mut weight = T::DbWeight::get().reads(3); + let mut weight = T::DbWeight::get().reads(2); let is_version_mismatch = last_initializer_version != CURRENT_BRIDGES_INITIALIZER_VERSION; let is_forced = last_force_rebalance_ask_counter != current_force_rebalance_ask_counter; From 4a34a4cece6c71997ecf7c79a830c962781e4ec8 Mon Sep 17 00:00:00 2001 From: Dmitry Lavrenov <39522748+dmitrylavrenov@users.noreply.github.com> Date: Fri, 22 Sep 2023 10:38:58 +0300 Subject: [PATCH 12/12] Force rebalance ask counter value should be less to be forced Co-authored-by: MOZGIII --- .../src/upgrade_init.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs index 6cfa52380..4de02b518 100644 --- a/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs +++ b/crates/pallet-balanced-currency-swap-bridges-initializer/src/upgrade_init.rs @@ -18,7 +18,7 @@ pub fn on_runtime_upgrade() -> Weight { let mut weight = T::DbWeight::get().reads(2); let is_version_mismatch = last_initializer_version != CURRENT_BRIDGES_INITIALIZER_VERSION; - let is_forced = last_force_rebalance_ask_counter != current_force_rebalance_ask_counter; + let is_forced = last_force_rebalance_ask_counter < current_force_rebalance_ask_counter; if is_version_mismatch || is_forced { match Pallet::::initialize() {