// This file is part of Bizinikiwi. // Copyright (C) Parity Technologies (UK) Ltd. // SPDX-License-Identifier: Apache-2.0 // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. //! Storage migrations for the core-fellowship pezpallet. use super::*; use pezframe_support::{ pezpallet_prelude::*, storage_alias, traits::{DefensiveTruncateFrom, UncheckedOnRuntimeUpgrade}, BoundedVec, }; #[cfg(feature = "try-runtime")] use alloc::vec::Vec; #[cfg(feature = "try-runtime")] use pezsp_runtime::TryRuntimeError; mod v0 { use pezframe_system::pezpallet_prelude::BlockNumberFor; use super::*; #[derive(Encode, Decode, Eq, PartialEq, Clone, TypeInfo, MaxEncodedLen, RuntimeDebug)] pub struct ParamsType { pub active_salary: [Balance; RANKS], pub passive_salary: [Balance; RANKS], pub demotion_period: [BlockNumber; RANKS], pub min_promotion_period: [BlockNumber; RANKS], pub offboard_timeout: BlockNumber, } impl Default for ParamsType { fn default() -> Self { Self { active_salary: [Balance::default(); RANKS], passive_salary: [Balance::default(); RANKS], demotion_period: [BlockNumber::default(); RANKS], min_promotion_period: [BlockNumber::default(); RANKS], offboard_timeout: BlockNumber::default(), } } } /// Number of available ranks from old version. pub(crate) const RANK_COUNT: usize = 9; pub type ParamsOf = ParamsType<>::Balance, BlockNumberFor, RANK_COUNT>; /// V0 type for [`crate::Params`]. #[storage_alias] pub type Params, I: 'static> = StorageValue, ParamsOf, ValueQuery>; } pub struct MigrateToV1(PhantomData<(T, I)>); impl, I: 'static> UncheckedOnRuntimeUpgrade for MigrateToV1 { #[cfg(feature = "try-runtime")] fn pre_upgrade() -> Result, TryRuntimeError> { ensure!( T::MaxRank::get() as usize >= v0::RANK_COUNT, "pezpallet-core-fellowship: new bound should not truncate" ); Ok(Default::default()) } fn on_runtime_upgrade() -> pezframe_support::weights::Weight { // Read the old value from storage let old_value = v0::Params::::take(); // Write the new value to storage let new = crate::ParamsType { active_salary: BoundedVec::defensive_truncate_from(old_value.active_salary.to_vec()), passive_salary: BoundedVec::defensive_truncate_from(old_value.passive_salary.to_vec()), demotion_period: BoundedVec::defensive_truncate_from( old_value.demotion_period.to_vec(), ), min_promotion_period: BoundedVec::defensive_truncate_from( old_value.min_promotion_period.to_vec(), ), offboard_timeout: old_value.offboard_timeout, }; crate::Params::::put(new); T::DbWeight::get().reads_writes(1, 1) } } /// [`UncheckedOnRuntimeUpgrade`] implementation [`MigrateToV1`] wrapped in a /// [`VersionedMigration`](pezframe_support::migrations::VersionedMigration), which ensures that: /// - The migration only runs once when the on-chain storage version is 0 /// - The on-chain storage version is updated to `1` after the migration executes /// - Reads/Writes from checking/settings the on-chain storage version are accounted for pub type MigrateV0ToV1 = pezframe_support::migrations::VersionedMigration< 0, // The migration will only execute when the on-chain storage version is 0 1, // The on-chain storage version will be set to 1 after the migration is complete MigrateToV1, crate::pezpallet::Pezpallet, ::DbWeight, >;