use super::*;
use frame_support::traits::OnRuntimeUpgrade;
#[cfg(feature = "try-runtime")]
use sp_runtime::TryRuntimeError;
pub mod unversioned {
use super::*;
#[cfg(feature = "try-runtime")]
use alloc::vec::Vec;
use sp_runtime::traits::AccountIdConversion;
pub struct ProxyDelegatorMigration<T, MaxAgents>(PhantomData<(T, MaxAgents)>);
impl<T: Config, MaxAgents: Get<u32>> OnRuntimeUpgrade for ProxyDelegatorMigration<T, MaxAgents> {
fn on_runtime_upgrade() -> Weight {
let mut weight = Weight::zero();
let old_proxy_delegator = |agent: T::AccountId| {
T::PalletId::get()
.into_sub_account_truncating((AccountType::ProxyDelegator, agent.clone()))
};
Agents::<T>::iter_keys().take(MaxAgents::get() as usize).for_each(|agent| {
weight.saturating_accrue(T::DbWeight::get().reads_writes(1, 0));
let old_proxy = old_proxy_delegator(agent.clone());
if let Some(delegation) = Delegation::<T>::get(&old_proxy) {
weight.saturating_accrue(T::DbWeight::get().reads_writes(1, 0));
let new_proxy =
Pallet::<T>::generate_proxy_delegator(Agent::from(agent.clone()));
weight.saturating_accrue(T::DbWeight::get().reads_writes(8, 8));
let _ = Pallet::<T>::do_migrate_delegation(
Delegator::from(old_proxy.clone()),
new_proxy.clone(),
delegation.amount,
)
.map_err(|e| {
log!(
error,
"Failed to migrate old proxy delegator {:?} to new proxy {:?} for agent {:?} with error: {:?}",
old_proxy,
new_proxy,
agent,
e,
);
});
};
});
log!(info, "Finished migrating old proxy delegator accounts to new ones");
weight
}
#[cfg(feature = "try-runtime")]
fn post_upgrade(_data: Vec<u8>) -> Result<(), TryRuntimeError> {
let mut unmigrated_count = 0;
let old_proxy_delegator = |agent: T::AccountId| {
T::PalletId::get()
.into_sub_account_truncating((AccountType::ProxyDelegator, agent.clone()))
};
Agents::<T>::iter_keys().take(MaxAgents::get() as usize).for_each(|agent| {
let old_proxy: T::AccountId = old_proxy_delegator(agent.clone());
let held_balance = Pallet::<T>::held_balance_of(Delegator::from(old_proxy.clone()));
let delegation = Delegation::<T>::get(&old_proxy);
if delegation.is_some() || !held_balance.is_zero() {
log!(
error,
"Old proxy delegator {:?} for agent {:?} is not migrated.",
old_proxy,
agent,
);
unmigrated_count += 1;
}
});
if unmigrated_count > 0 {
Err(TryRuntimeError::Other("Some old proxy delegator accounts are not migrated."))
} else {
Ok(())
}
}
}
}