From 3539f20b18744ec44f05738b84f4e6d9cb352c31 Mon Sep 17 00:00:00 2001 From: Grigoriy Simonov Date: Mon, 22 May 2023 13:21:36 +0000 Subject: [PATCH] feat: switch `collator-selection` from `Currency` trait to `fungible::*` traits --- --- a/pallets/collator-selection/src/benchmarking.rs +++ b/pallets/collator-selection/src/benchmarking.rs @@ -40,7 +40,11 @@ use frame_support::{ assert_ok, codec::Decode, - traits::{Currency, EnsureOrigin, Get}, + traits::{ + EnsureOrigin, + fungible::{Inspect, Mutate}, + Get, + }, }; use frame_system::{EventRecord, RawOrigin}; use pallet_authorship::EventHandler; @@ -78,7 +82,7 @@ ) -> T::AccountId { let user = account(string, n, SEED); let balance = balance_unit::() * balance_factor.into(); - let _ = T::Currency::make_free_balance_be(&user, balance); + let _ = T::Currency::set_balance(&user, balance); user } @@ -137,7 +141,7 @@ ); for who in candidates { - T::Currency::make_free_balance_be(&who, >::get() * 2u32.into()); + T::Currency::set_balance(&who, >::get() * 2u32.into()); >::get_license(RawOrigin::Signed(who.clone()).into()).unwrap(); >::onboard(RawOrigin::Signed(who).into()).unwrap(); } @@ -153,14 +157,14 @@ ); for who in candidates { - T::Currency::make_free_balance_be(&who, >::get() * 2u32.into()); + T::Currency::set_balance(&who, >::get() * 2u32.into()); >::get_license(RawOrigin::Signed(who.clone()).into()).unwrap(); } } /// `Currency::minimum_balance` was used originally, but in unique-chain, we have /// zero existential deposit, thus triggering zero bond assertion. -fn balance_unit() -> >::Balance { +fn balance_unit() -> BalanceOf { 200u32.into() } @@ -168,7 +172,9 @@ const INITIAL_INVULNERABLES: u32 = 2; benchmarks! { - where_clause { where T: pallet_authorship::Config + session::Config + configuration::Config } + where_clause { where + T: pallet_authorship::Config + session::Config + configuration::Config + } // todo:collator this and all the following do not work for some reason, going all the way up to 10 in length // Both invulnerables and candidates count together against MaxCollators. @@ -182,7 +188,7 @@ let new_invulnerable: T::AccountId = whitelisted_caller(); let bond: BalanceOf = balance_unit::() * 2u32.into(); - T::Currency::make_free_balance_be(&new_invulnerable, bond.clone()); + T::Currency::set_balance(&new_invulnerable, bond.clone()); >::set_keys( RawOrigin::Signed(new_invulnerable.clone()).into(), @@ -227,7 +233,7 @@ let caller: T::AccountId = whitelisted_caller(); let bond: BalanceOf = balance_unit::() * 2u32.into(); - T::Currency::make_free_balance_be(&caller, bond.clone()); + T::Currency::set_balance(&caller, bond.clone()); >::set_keys( RawOrigin::Signed(caller.clone()).into(), @@ -253,7 +259,7 @@ let caller: T::AccountId = whitelisted_caller(); let bond: BalanceOf = balance_unit::() * 2u32.into(); - T::Currency::make_free_balance_be(&caller, bond.clone()); + T::Currency::set_balance(&caller, bond.clone()); let origin = RawOrigin::Signed(caller.clone()); @@ -329,7 +335,7 @@ // worst case is paying a non-existing candidate account. note_author { >::put(balance_unit::()); - T::Currency::make_free_balance_be( + T::Currency::set_balance( &>::account_id(), balance_unit::() * 4u32.into(), ); @@ -337,11 +343,11 @@ let new_block: T::BlockNumber = 10u32.into(); frame_system::Pallet::::set_block_number(new_block); - assert!(T::Currency::free_balance(&author) == 0u32.into()); + assert!(T::Currency::balance(&author) == 0u32.into()); }: { as EventHandler<_, _>>::note_author(author.clone()) } verify { - assert!(T::Currency::free_balance(&author) > 0u32.into()); + assert!(T::Currency::balance(&author) > 0u32.into()); assert_eq!(frame_system::Pallet::::block_number(), new_block); } --- a/pallets/collator-selection/src/lib.rs +++ b/pallets/collator-selection/src/lib.rs @@ -92,6 +92,7 @@ #[frame_support::pallet] pub mod pallet { + use super::*; pub use crate::weights::WeightInfo; use core::ops::Div; use frame_support::{ @@ -100,8 +101,10 @@ pallet_prelude::*, sp_runtime::traits::{AccountIdConversion, CheckedSub, Saturating, Zero}, traits::{ - Currency, EnsureOrigin, ExistenceRequirement::KeepAlive, ReservableCurrency, + EnsureOrigin, + fungible::{Balanced, BalancedHold, Inspect, InspectHold, Mutate, MutateHold}, ValidatorRegistration, + tokens::{Precision, Preservation}, }, BoundedVec, PalletId, }; @@ -158,6 +161,9 @@ /// The weight information of this pallet. type WeightInfo: WeightInfo; + + #[pallet::constant] + type LicenceBondIdentifier: Get<<::Currency as InspectHold>::Reason>; } #[pallet::pallet] @@ -361,7 +367,7 @@ let deposit = >::get(); - T::Currency::reserve(&who, deposit)?; + T::Currency::hold(&T::LicenceBondIdentifier::get(), &who, deposit)?; LicenseDepositOf::::insert(who.clone(), deposit); Self::deposit_event(Event::LicenseObtained { @@ -523,17 +529,24 @@ let slashed = T::SlashRatio::get() * deposit; let remaining = deposit - slashed; - let (imbalance, _) = T::Currency::slash_reserved(who, slashed); + let (imbalance, _) = + T::Currency::slash(&T::LicenceBondIdentifier::get(), who, slashed); //T::Currency::unreserve(who, remaining); deposit_returned = remaining; - T::Currency::resolve_creating(&T::TreasuryAccountId::get(), imbalance); + T::Currency::resolve(&T::TreasuryAccountId::get(), imbalance) + .map_err(|_| DispatchError::Other("Failed to deposit imbalance"))?; } else { //T::Currency::unreserve(who, deposit); deposit_returned = deposit; } - T::Currency::unreserve(who, deposit_returned); + T::Currency::release( + &T::LicenceBondIdentifier::get(), + who, + deposit_returned, + Precision::Exact, + )?; Ok(()) } else { Err(Error::::NoLicense.into()) @@ -594,12 +607,12 @@ fn note_author(author: T::AccountId) { let pot = Self::account_id(); // assumes an ED will be sent to pot. - let reward = T::Currency::free_balance(&pot) + let reward = T::Currency::balance(&pot) .checked_sub(&T::Currency::minimum_balance()) .unwrap_or_else(Zero::zero) .div(2u32.into()); // `reward` is half of pot account minus ED, this should never fail. - let _success = T::Currency::transfer(&pot, &author, reward, KeepAlive); + let _success = T::Currency::transfer(&pot, &author, reward, Preservation::Preserve); debug_assert!(_success.is_ok()); >::insert(author, frame_system::Pallet::::block_number()); --- a/pallets/collator-selection/src/tests.rs +++ b/pallets/collator-selection/src/tests.rs @@ -417,7 +417,10 @@ fn authorship_event_handler() { new_test_ext().execute_with(|| { // put 100 in the pot + 5 for ED - Balances::make_free_balance_be(&CollatorSelection::account_id(), 105); + as fungible::Mutate>::set_balance( + &CollatorSelection::account_id(), + 105, + ); // 4 is the default author. assert_eq!(Balances::free_balance(4), 100); @@ -441,7 +444,10 @@ // Nothing panics, no reward when no ED in balance Authorship::on_initialize(1); // put some money into the pot at ED - Balances::make_free_balance_be(&CollatorSelection::account_id(), 5); + as fungible::Mutate>::set_balance( + &CollatorSelection::account_id(), + 5, + ); // 4 is the default author. assert_eq!(Balances::free_balance(4), 100); get_license_and_onboard(4); --- a/pallets/configuration/src/lib.rs +++ b/pallets/configuration/src/lib.rs @@ -49,21 +49,20 @@ use frame_system::{pallet_prelude::OriginFor, ensure_root, Config as SystemConfig}; pub use crate::weights::WeightInfo; - pub type BalanceOf = - <::Balances as fungible::Inspect<::AccountId>>::Balance; + pub type BalanceOf = + <::Currency as fungible::Inspect<::AccountId>>::Balance; #[pallet::config] pub trait Config: frame_system::Config { /// Overarching event type. type RuntimeEvent: From> + IsType<::RuntimeEvent>; - type Balances: - fungible::Inspect - + fungible::Mutate:: - + fungible::MutateFreeze:: - + fungible::InspectHold:: - + fungible::MutateHold:: - + fungible::BalancedHold::; + type Currency: fungible::Inspect + + fungible::Mutate + + fungible::MutateFreeze + + fungible::InspectHold + + fungible::MutateHold + + fungible::BalancedHold; #[pallet::constant] type DefaultWeightToFeeCoefficient: Get; -- gitstuff