// Copyright 2017-2020 Parity Technologies (UK) Ltd. // This file is part of Polkadot. // Polkadot is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // Polkadot is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with Polkadot. If not, see . use super::*; use crate::crowdloan; use sp_runtime::traits::AccountIdConversion; /// Migrations for using fund index to create fund accounts instead of para ID. pub mod slots_crowdloan_index_migration { use super::*; // The old way we generated fund accounts. fn old_fund_account_id(index: ParaId) -> T::AccountId { ::PalletId::get().into_sub_account(index) } pub fn pre_migrate() -> Result<(), &'static str> { for (para_id, leases) in Leases::::iter() { let old_fund_account = old_fund_account_id::(para_id); for maybe_deposit in leases.iter() { if let Some((who, _amount)) = maybe_deposit { if *who == old_fund_account { let crowdloan = crowdloan::Funds::::get(para_id).ok_or("no crowdloan found")?; log::info!( target: "runtime", "para_id={:?}, old_fund_account={:?}, fund_id={:?}, leases={:?}", para_id, old_fund_account, crowdloan.fund_index, leases, ); break } } } } Ok(()) } pub fn migrate() -> frame_support::weights::Weight { let mut weight = 0; for (para_id, mut leases) in Leases::::iter() { weight = weight.saturating_add(T::DbWeight::get().reads(2)); // the para id must have a crowdloan if let Some(fund) = crowdloan::Funds::::get(para_id) { let old_fund_account = old_fund_account_id::(para_id); let new_fund_account = crowdloan::Pallet::::fund_account_id(fund.fund_index); // look for places the old account is used, and replace with the new account. for maybe_deposit in leases.iter_mut() { if let Some((who, _amount)) = maybe_deposit { if *who == old_fund_account { *who = new_fund_account.clone(); } } } // insert the changes. weight = weight.saturating_add(T::DbWeight::get().writes(1)); Leases::::insert(para_id, leases); } } weight } pub fn post_migrate() -> Result<(), &'static str> { for (para_id, leases) in Leases::::iter() { let old_fund_account = old_fund_account_id::(para_id); log::info!(target: "runtime", "checking para_id: {:?}", para_id); // check the old fund account doesn't exist anywhere. for maybe_deposit in leases.iter() { if let Some((who, _amount)) = maybe_deposit { if *who == old_fund_account { panic!("old fund account found after migration!"); } } } } Ok(()) } }