difftreelog
fix stake and unstake extrinsics
in: master
1 file changed
pallets/app-promotion/src/lib.rsdiffbeforeafterboth260 impl<T: Config> Pallet<T>260 impl<T: Config> Pallet<T>261 where261 where262 T::BlockNumber: From<u32>,262 T::BlockNumber: From<u32>,263 <<T as Config>::Currency as Currency<T::AccountId>>::Balance: Sum + From<u128>263 {264 {264 #[pallet::weight(T::WeightInfo::set_admin_address())]265 #[pallet::weight(T::WeightInfo::set_admin_address())]265 pub fn set_admin_address(origin: OriginFor<T>, admin: T::CrossAccountId) -> DispatchResult {266 pub fn set_admin_address(origin: OriginFor<T>, admin: T::CrossAccountId) -> DispatchResult {313 let staker_id = ensure_signed(staker)?;314 let staker_id = ensure_signed(staker)?;315 314316315 ensure!(amount >= T::Nominal::get(), ArithmeticError::Underflow);317 ensure!(amount >= Into::<BalanceOf<T>>::into(100u128) * T::Nominal::get(), ArithmeticError::Underflow);316318317 let balance =319 let balance =318 <<T as Config>::Currency as Currency<T::AccountId>>::free_balance(&staker_id);320 <<T as Config>::Currency as Currency<T::AccountId>>::free_balance(&staker_id);342 balance_and_recalc_block344 balance_and_recalc_block343 });345 });344346345 // <TotalStaked<T>>::set(347 <TotalStaked<T>>::set(346 // <TotalStaked<T>>::get()348 <TotalStaked<T>>::get()347 // .checked_add(&amount)349 .checked_add(&amount)348 // .ok_or(ArithmeticError::Overflow)?,350 .ok_or(ArithmeticError::Overflow)?,349 // );351 );350352351 Ok(())353 Ok(())352 }354 }353355354 #[pallet::weight(T::WeightInfo::unstake())]356 #[pallet::weight(T::WeightInfo::unstake())]355 pub fn unstake(staker: OriginFor<T>, amount: BalanceOf<T>) -> DispatchResult {357 pub fn unstake(staker: OriginFor<T>) -> DispatchResultWithPostInfo {356 let staker_id = ensure_signed(staker)?;358 let staker_id = ensure_signed(staker)?;357359358 let mut stakes = Staked::<T>::drain_prefix((&staker_id,));360 let mut total_stakes = 0u64;359361360 // let total_staked = stakes362 let total_staked: BalanceOf<T> = Staked::<T>::drain_prefix((&staker_id,))361 // .iter()363 .map(|(_, (amount, _))| {362 // .fold(<BalanceOf<T>>::default(), |acc, (_, amount)| acc + *amount);364 *&mut total_stakes += 1;363365 amount364 // ensure!(total_staked >= amount, ArithmeticError::Underflow);366 })365367 .sum();366 // <TotalStaked<T>>::set(368 367 // <TotalStaked<T>>::get()369 let block =368 // .checked_sub(&amount)370 T::RelayBlockNumberProvider::current_block_number() + T::PendingInterval::get();369 // .ok_or(ArithmeticError::Underflow)?,371 <PendingUnstake<T>>::insert(370 // );372 (&staker_id, block),371373 <PendingUnstake<T>>::get((&staker_id, block))372 // let block =374 .checked_add(&total_staked)373 // T::RelayBlockNumberProvider::current_block_number() + T::PendingInterval::get();375 .ok_or(ArithmeticError::Overflow)?,374 // <PendingUnstake<T>>::insert(376 );375 // (&staker_id, block),377 376 // <PendingUnstake<T>>::get((&staker_id, block))378 TotalStaked::<T>::set(TotalStaked::<T>::get().checked_sub(&total_staked).ok_or(ArithmeticError::Underflow)?); // when error we should recover stake state for the staker377 // .checked_add(&amount)378 // .ok_or(ArithmeticError::Overflow)?,379 // );380381 // stakes.sort_by_key(|(block, _)| *block);382383 // let mut acc_amount = amount;384 // let new_state = stakes385 // .into_iter()386 // .map_while(|(block, balance_per_block)| {387 // if acc_amount == <BalanceOf<T>>::default() {388 // return None;389 // }390 // if acc_amount <= balance_per_block {391 // let res = (block, balance_per_block - acc_amount, acc_amount);392 // acc_amount = <BalanceOf<T>>::default();393 // return Some(res);394 // } else {395 // acc_amount -= balance_per_block;396 // return Some((block, <BalanceOf<T>>::default(), acc_amount));397 // }398 // })399 // .collect::<Vec<_>>();400401 // new_state402 // .into_iter()403 // .for_each(|(block, to_staked, _to_pending)| {404 // if to_staked == <BalanceOf<T>>::default() {405 // <Staked<T>>::remove((&staker_id, block));406 // } else {407 // <Staked<T>>::insert((&staker_id, block), to_staked);408 // }409 // });410379411 Ok(())380 Ok(None.into())412381413 // let staker_id = ensure_signed(staker)?;382 // let staker_id = ensure_signed(staker)?;414383543 Error::<T>::NoPermission512 Error::<T>::NoPermission544 );513 );514 515 let raw_key = Staked::<T>::hashed_key_for((admin_id, T::BlockNumber::default()));516 517 let key_iterator = Staked::<T>::iter_keys_from(raw_key).skip(1).into_iter();518 519 match Self::get_last_calculated_staker() {520 Some(last_staker) => {},521 None => {}522 };545523546 Ok(())524 Ok(())547 }525 }661639662impl<T: Config> Pallet<T>640impl<T: Config> Pallet<T>663where641where664 <<T as pallet::Config>::Currency as Currency<T::AccountId>>::Balance: Sum,642 <<T as Config>::Currency as Currency<T::AccountId>>::Balance: Sum,665{643{666 pub fn cross_id_pending_unstake(staker: Option<T::CrossAccountId>) -> BalanceOf<T> {644 pub fn cross_id_pending_unstake(staker: Option<T::CrossAccountId>) -> BalanceOf<T> {667 staker.map_or(PendingUnstake::<T>::iter_values().sum(), |s| {645 staker.map_or(PendingUnstake::<T>::iter_values().sum(), |s| {