diff --git a/docs/api/runtime-calls.md b/docs/api/runtime-calls.md index 011ff2ce4dc5c39f6d2b034bfc96285c1ebeebf8..68c737183f1d8f5bcd74be7f2bf5c27925823891 100644 --- a/docs/api/runtime-calls.md +++ b/docs/api/runtime-calls.md @@ -53,7 +53,7 @@ Anonymously schedule a task. <details><summary><code>cancel(when, index)</code></summary> -Taking 0.0239 % of a block. +Taking 0.0241 % of a block. ```rust when: BlockNumberFor<T> @@ -86,7 +86,7 @@ Schedule a named task. <details><summary><code>cancel_named(id)</code></summary> -Taking 0.0252 % of a block. +Taking 0.0253 % of a block. ```rust id: TaskName @@ -162,7 +162,7 @@ original `total_retries`. <details><summary><code>set_retry_named(id, retries, period)</code></summary> -Taking 0.0129 % of a block. +Taking 0.0127 % of a block. ```rust id: TaskName @@ -203,7 +203,7 @@ Removes the retry configuration of a task. <details><summary><code>cancel_retry_named(id)</code></summary> -Taking 0.0128 % of a block. +Taking 0.0127 % of a block. ```rust id: TaskName @@ -334,7 +334,7 @@ The dispatch origin for this call is `root`. <details><summary><code>force_adjust_total_issuance(direction, delta)</code></summary> -Taking 0.0039 % of a block. +Taking 0.0038 % of a block. ```rust direction: AdjustmentDirection @@ -359,7 +359,7 @@ Taking 0.0113 % of a block. ```rust dest: <T::Lookup as StaticLookup>::Source -value: <T::Currency as Currency<T::AccountId>>::Balance +value: BalanceOf<T> ``` </details> @@ -400,7 +400,7 @@ Taking 0.0269 % of a block. block_height: BlockNumberFor<T> dest: Account<<T::Lookup as StaticLookup>::Source> remaining_to: Account<<T::Lookup as StaticLookup>::Source> -balance: <T::Currency as Currency<T::AccountId>>::Balance +balance: BalanceOf<T> ``` </details> @@ -422,7 +422,7 @@ and the remaining amount to another account. <details><summary><code>invite_smith(receiver)</code></summary> -Taking 0.0239 % of a block. +Taking 0.0237 % of a block. ```rust receiver: T::IdtyIndex @@ -449,7 +449,7 @@ Accept an invitation (must have been invited first) <details><summary><code>certify_smith(receiver)</code></summary> -Taking 0.0287 % of a block. +Taking 0.0286 % of a block. ```rust receiver: T::IdtyIndex @@ -465,7 +465,7 @@ Certify an invited smith which can lead the certified to become a Smith <details><summary><code>go_offline()</code></summary> -Taking 0.0167 % of a block. +Taking 0.0165 % of a block. ```rust ``` @@ -478,7 +478,7 @@ ask to leave the set of validators two sessions after <details><summary><code>go_online()</code></summary> -Taking 0.0192 % of a block. +Taking 0.0188 % of a block. ```rust ``` @@ -491,7 +491,7 @@ ask to join the set of validators two sessions after <details><summary><code>set_session_keys(keys)</code></summary> -Taking 0.0254 % of a block. +Taking 0.0251 % of a block. ```rust keys: T::Keys @@ -562,7 +562,7 @@ The weight of this call is defined by the caller. <details><summary><code>note_preimage(bytes)</code></summary> -Taking 0.2893 % of a block. +Taking 0.2953 % of a block. ```rust bytes: Vec<u8> @@ -598,7 +598,7 @@ If `len` is provided, then it will be a much cheaper operation. <details><summary><code>request_preimage(hash)</code></summary> -Taking 0.0127 % of a block. +Taking 0.0126 % of a block. ```rust hash: T::Hash @@ -615,7 +615,7 @@ a user may have paid, and take the control of the preimage out of their hands. <details><summary><code>unrequest_preimage(hash)</code></summary> -Taking 0.0185 % of a block. +Taking 0.0186 % of a block. ```rust hash: T::Hash @@ -631,7 +631,7 @@ NOTE: THIS MUST NOT BE CALLED ON `hash` MORE TIMES THAN `request_preimage`. <details><summary><code>ensure_updated(hashes)</code></summary> -Taking 20.7987 % of a block. +Taking 21.073 % of a block. ```rust hashes: Vec<T::Hash> @@ -649,7 +649,7 @@ The caller pays no fee if at least 90% of pre-images were successfully updated. <details><summary><code>execute(proposal, length_bound)</code></summary> -Taking 0.0052 % of a block. +Taking 0.0051 % of a block. ```rust proposal: Box<<T as Config<I>>::Proposal> @@ -701,7 +701,7 @@ or put up for voting. <details><summary><code>vote(proposal, index, approve)</code></summary> -Taking 0.0125 % of a block. +Taking 0.0124 % of a block. ```rust proposal: T::Hash @@ -767,7 +767,7 @@ proposal. <details><summary><code>claim_uds()</code></summary> -Taking 0.022 % of a block. +Taking 0.0218 % of a block. ```rust ``` @@ -812,7 +812,7 @@ Transfer some liquid free balance to another account, in milliUD. <details><summary><code>create_identity(owner_key)</code></summary> -Taking 0.0906 % of a block. +Taking 0.0912 % of a block. ```rust owner_key: T::AccountId @@ -830,7 +830,7 @@ The origin must be allowed to create an identity. <details><summary><code>confirm_identity(idty_name)</code></summary> -Taking 0.0337 % of a block. +Taking 0.0338 % of a block. ```rust idty_name: IdtyName @@ -848,7 +848,7 @@ The identity must have been created using `create_identity` before it can be con <details><summary><code>change_owner_key(new_key, new_key_sig)</code></summary> -Taking 0.0429 % of a block. +Taking 0.0431 % of a block. ```rust new_key: T::AccountId @@ -869,7 +869,7 @@ The origin should be the old identity owner key. <details><summary><code>revoke_identity(idty_index, revocation_key, revocation_sig)</code></summary> -Taking 0.0413 % of a block. +Taking 0.0416 % of a block. ```rust idty_index: T::IdtyIndex @@ -938,7 +938,7 @@ Add a new certification. <details><summary><code>renew_cert(receiver)</code></summary> -Taking 0.03 % of a block. +Taking 0.0299 % of a block. ```rust receiver: T::IdtyIndex @@ -952,7 +952,7 @@ Renew an existing certification. <details><summary><code>del_cert(issuer, receiver)</code></summary> -Taking 0.0265 % of a block. +Taking 0.0263 % of a block. ```rust issuer: T::IdtyIndex @@ -967,7 +967,7 @@ remove a certification (only root) <details><summary><code>remove_all_certs_received_by(idty_index)</code></summary> -Taking 7.3619 % of a block. +Taking 7.395 % of a block. ```rust idty_index: T::IdtyIndex @@ -983,7 +983,7 @@ remove all certifications received by an identity (only root) <details><summary><code>request_distance_evaluation()</code></summary> -Taking 0.0327 % of a block. +Taking 0.0325 % of a block. ```rust ``` @@ -998,7 +998,7 @@ negative evaluation will result in slash for caller <details><summary><code>request_distance_evaluation_for(target)</code></summary> -Taking 0.0339 % of a block. +Taking 0.0336 % of a block. ```rust target: T::IdtyIndex @@ -1013,7 +1013,7 @@ only possible for unvalidated identity <details><summary><code>update_evaluation(computation_result)</code></summary> -Taking 0.0347 % of a block. +Taking 0.0346 % of a block. ```rust computation_result: ComputationResult @@ -1028,7 +1028,7 @@ this is called internally by validators (= inherent) <details><summary><code>force_update_evaluation(evaluator, computation_result)</code></summary> -Taking 0.0184 % of a block. +Taking 0.0183 % of a block. ```rust evaluator: <T as frame_system::Config>::AccountId @@ -1130,7 +1130,7 @@ The dispatch origin for this call must be _Signed_. <details><summary><code>as_multi_threshold_1(other_signatories, call)</code></summary> -Taking 0.0041 % of a block. +Taking 0.004 % of a block. ```rust other_signatories: Vec<T::AccountId> @@ -1298,7 +1298,7 @@ transaction for this dispatch. <details><summary><code>request(randomness_type, salt)</code></summary> -Taking 0.0418 % of a block. +Taking 0.042 % of a block. ```rust randomness_type: RandomnessType @@ -1315,7 +1315,7 @@ Request a randomness <details><summary><code>proxy(real, force_proxy_type, call)</code></summary> -Taking 0.0053 % of a block. +Taking 0.0052 % of a block. ```rust real: AccountIdLookupOf<T> @@ -1498,7 +1498,7 @@ Parameters: <details><summary><code>remove_announcement(real, call_hash)</code></summary> -Taking 0.0185 % of a block. +Taking 0.0186 % of a block. ```rust real: AccountIdLookupOf<T> @@ -1522,7 +1522,7 @@ Parameters: <details><summary><code>reject_announcement(delegate, call_hash)</code></summary> -Taking 0.0185 % of a block. +Taking 0.0186 % of a block. ```rust delegate: AccountIdLookupOf<T> @@ -1575,7 +1575,7 @@ Parameters: <details><summary><code>batch(calls)</code></summary> -Taking 0.1077 % of a block. +Taking 0.1039 % of a block. ```rust calls: Vec<<T as Config>::RuntimeCall> @@ -1606,7 +1606,7 @@ event is deposited. <details><summary><code>as_derivative(index, call)</code></summary> -Taking 0.0038 % of a block. +Taking 0.0037 % of a block. ```rust index: u16 @@ -1633,7 +1633,7 @@ The dispatch origin for this call must be _Signed_. <details><summary><code>batch_all(calls)</code></summary> -Taking 0.1127 % of a block. +Taking 0.1131 % of a block. ```rust calls: Vec<<T as Config>::RuntimeCall> @@ -1659,7 +1659,7 @@ includes bypassing `frame_system::Config::BaseCallFilter`). <details><summary><code>force_batch(calls)</code></summary> -Taking 0.1071 % of a block. +Taking 0.104 % of a block. ```rust calls: Vec<<T as Config>::RuntimeCall> @@ -1707,7 +1707,7 @@ The dispatch origin for this call must be _Root_. <details><summary><code>propose_spend(value, beneficiary)</code></summary> -Taking 0.0172 % of a block. +Taking 0.0174 % of a block. ```rust value: BalanceOf<T, I> @@ -1737,7 +1737,7 @@ Emits [`Event::Proposed`] if successful. <details><summary><code>spend_local(amount, beneficiary)</code></summary> -Taking 0.0036 % of a block. +Taking 0.0035 % of a block. ```rust amount: BalanceOf<T, I> @@ -1768,7 +1768,7 @@ Emits [`Event::SpendApproved`] if successful. <details><summary><code>remove_approval(proposal_id)</code></summary> -Taking 0.0108 % of a block. +Taking 0.0107 % of a block. ```rust proposal_id: ProposalIndex @@ -1802,7 +1802,7 @@ The original deposit will no longer be returned. <details><summary><code>spend(asset_kind, amount, beneficiary, valid_from)</code></summary> -Taking 0.0036 % of a block. +Taking 0.0035 % of a block. ```rust asset_kind: Box<T::AssetKind> @@ -1844,7 +1844,7 @@ Emits [`Event::AssetSpendApproved`] if successful. <details><summary><code>payout(index)</code></summary> -Taking 0.0263 % of a block. +Taking 0.0265 % of a block. ```rust index: SpendIndex @@ -1945,7 +1945,7 @@ There are **18** root calls from **8** pallets. <details><summary><code>set_heap_pages(pages)</code></summary> -Taking 0.0165 % of a block. +Taking 0.0166 % of a block. ```rust pages: u64 @@ -1959,7 +1959,7 @@ Set the number of pages in the WebAssembly environment's heap. <details><summary><code>set_code(code)</code></summary> -Taking 4.0113 % of a block. +Taking 3.2097 % of a block. ```rust code: Vec<u8> @@ -1990,7 +1990,7 @@ version! <details><summary><code>set_storage(items)</code></summary> -Taking 5.8851 % of a block. +Taking 6.0054 % of a block. ```rust items: Vec<KeyValue> @@ -2004,7 +2004,7 @@ Set some items of storage. <details><summary><code>kill_storage(keys)</code></summary> -Taking 5.8773 % of a block. +Taking 5.9992 % of a block. ```rust keys: Vec<Key> @@ -2018,7 +2018,7 @@ Kill some items from storage. <details><summary><code>kill_prefix(prefix, subkeys)</code></summary> -Taking 6.9458 % of a block. +Taking 7.0112 % of a block. ```rust prefix: Key @@ -2036,7 +2036,7 @@ the prefix we are removing to accurately calculate the weight of this function. <details><summary><code>authorize_upgrade(code_hash)</code></summary> -Taking 0.0101 % of a block. +Taking 0.01 % of a block. ```rust code_hash: T::Hash @@ -2074,7 +2074,7 @@ This call requires Root origin. <details><summary><code>apply_authorized_upgrade(code)</code></summary> -Taking 4.2016 % of a block. +Taking 3.461 % of a block. ```rust code: Vec<u8> @@ -2117,7 +2117,7 @@ not been enacted yet. <details><summary><code>force_transfer(source, dest, value)</code></summary> -Taking 0.0265 % of a block. +Taking 0.0266 % of a block. ```rust source: AccountIdLookupOf<T> @@ -2134,7 +2134,7 @@ may be specified. <details><summary><code>force_unreserve(who, amount)</code></summary> -Taking 0.0112 % of a block. +Taking 0.0111 % of a block. ```rust who: AccountIdLookupOf<T> @@ -2153,7 +2153,7 @@ Can only be called by ROOT. <details><summary><code>remove_member(member_id)</code></summary> -Taking 0.0701 % of a block. +Taking 0.0709 % of a block. ```rust member_id: T::MemberId @@ -2197,7 +2197,7 @@ Only callable by root. <details><summary><code>set_members(new_members, prime, old_count)</code></summary> -Taking 0.1657 % of a block. +Taking 0.1668 % of a block. ```rust new_members: Vec<T::AccountId> @@ -2236,7 +2236,7 @@ with other logic managing the member set. <details><summary><code>disapprove_proposal(proposal_hash)</code></summary> -Taking 0.0229 % of a block. +Taking 0.0231 % of a block. ```rust proposal_hash: T::Hash @@ -2261,7 +2261,7 @@ O(P) where P is the number of max proposals <details><summary><code>prune_item_identities_names(names)</code></summary> -Taking 5.9211 % of a block. +Taking 6.0421 % of a block. ```rust names: Vec<IdtyName> @@ -2277,7 +2277,7 @@ remove identity names from storage <details><summary><code>dispatch_as(as_origin, call)</code></summary> -Taking 0.0039 % of a block. +Taking 0.0038 % of a block. ```rust as_origin: Box<T::PalletsOrigin> @@ -2324,7 +2324,7 @@ Can be executed by every `origin`. <details><summary><code>remark_with_event(remark)</code></summary> -Taking 0.2052 % of a block. +Taking 0.2151 % of a block. ```rust remark: Vec<u8> @@ -2340,7 +2340,7 @@ Make some on-chain remark and emit event. <details><summary><code>set_keys(keys, proof)</code></summary> -Taking 0.0394 % of a block. +Taking 0.0395 % of a block. ```rust keys: T::Keys @@ -2363,7 +2363,7 @@ The dispatch origin of this function must be signed. <details><summary><code>purge_keys()</code></summary> -Taking 0.0347 % of a block. +Taking 0.0351 % of a block. ```rust ``` diff --git a/docs/api/runtime-events.md b/docs/api/runtime-events.md index 6b1404aa3c120c6d61fcf3c2d213dc9b5cf91aa8..bde9aa35a192f1f363ea2f35092cd4520ce56585 100644 --- a/docs/api/runtime-events.md +++ b/docs/api/runtime-events.md @@ -581,7 +581,7 @@ A oneshot account was created. ```rust account: T::AccountId -balance: <T::Currency as Currency<T::AccountId>>::Balance +balance: BalanceOf<T> creator: T::AccountId ``` @@ -595,10 +595,8 @@ A oneshot account was consumed. ```rust account: T::AccountId -dest1: (T::AccountId,<T::Currency as Currency<T::AccountId>>::Balance,) -dest2: Option< -(T::AccountId,<T::Currency as Currency<T::AccountId>>::Balance,) -> +dest1: (T::AccountId, BalanceOf<T>) +dest2: Option<(T::AccountId, BalanceOf<T>)> ``` </details> @@ -611,7 +609,7 @@ A withdrawal was executed on a oneshot account. ```rust account: T::AccountId -balance: <T::Currency as Currency<T::AccountId>>::Balance +balance: BalanceOf<T> ``` </details> diff --git a/pallets/distance/src/benchmarking.rs b/pallets/distance/src/benchmarking.rs index 91589bbb31873c4baa12589722e88192d464950a..bf1a6a519fd0125d28331223ce359c276e82f29d 100644 --- a/pallets/distance/src/benchmarking.rs +++ b/pallets/distance/src/benchmarking.rs @@ -21,13 +21,9 @@ use super::*; use codec::Encode; use frame_benchmarking::v2::*; -use frame_support::traits::Get; -use frame_support::traits::OnInitialize; -use frame_support::traits::{Currency, OnFinalize}; +use frame_support::traits::{Get, OnFinalize, OnInitialize}; use frame_system::pallet_prelude::BlockNumberFor; use frame_system::RawOrigin; -use pallet_balances::Pallet as Balances; -use sp_runtime::traits::Bounded; use sp_runtime::Perbill; use crate::Pallet; @@ -35,7 +31,7 @@ use crate::Pallet; #[benchmarks( where T: pallet_balances::Config, - T::Balance: From<u64>, + BalanceOf<T>: From<u32>, BlockNumberFor<T>: From<u32>, )] mod benchmarks { @@ -63,8 +59,7 @@ mod benchmarks { let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty) .unwrap() .owner_key; - let _ = - <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value()); + let _ = T::Currency::set_balance(&caller, u32::MAX.into()); #[extrinsic_call] _(RawOrigin::Signed(caller.clone())); @@ -88,7 +83,7 @@ mod benchmarks { let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty) .unwrap() .owner_key; - <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value()); + T::Currency::set_balance(&caller, u32::MAX.into()); let target: T::IdtyIndex = 2u32; // set target status since targeted distance evaluation only allowed for unvalidated pallet_identity::Identities::<T>::mutate(target, |idty_val| { @@ -193,8 +188,7 @@ mod benchmarks { let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty) .unwrap() .owner_key; - let _ = - <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value()); + let _ = T::Currency::set_balance(&caller, u32::MAX.into()); Pallet::<T>::request_distance_evaluation(RawOrigin::Signed(caller.clone()).into())?; assert_has_event::<T>( Event::<T>::EvaluationRequested { @@ -237,8 +231,7 @@ mod benchmarks { let caller: T::AccountId = pallet_identity::Identities::<T>::get(idty) .unwrap() .owner_key; - let _ = - <Balances<T> as Currency<_>>::make_free_balance_be(&caller, T::Balance::max_value()); + let _ = T::Currency::set_balance(&caller, u32::MAX.into()); Pallet::<T>::request_distance_evaluation(RawOrigin::Signed(caller.clone()).into())?; assert_has_event::<T>( Event::<T>::EvaluationRequested { diff --git a/pallets/distance/src/lib.rs b/pallets/distance/src/lib.rs index 76d580b2d2913510698b1c60591fa1aa495da2e1..06e58088fdca6c87f10c2623f17b1a088abc533a 100644 --- a/pallets/distance/src/lib.rs +++ b/pallets/distance/src/lib.rs @@ -34,14 +34,16 @@ pub use traits::*; pub use types::*; pub use weights::WeightInfo; -use frame_support::traits::StorageVersion; +use frame_support::traits::{ + fungible::{self, hold::Balanced, Mutate, MutateHold}, + tokens::Precision, + StorageVersion, +}; use sp_distance::{InherentError, INHERENT_IDENTIFIER}; use sp_inherents::{InherentData, InherentIdentifier}; -use sp_runtime::traits::One; -use sp_runtime::traits::Zero; +use sp_runtime::traits::{One, Zero}; use sp_runtime::Saturating; -use sp_std::convert::TryInto; -use sp_std::prelude::*; +use sp_std::{convert::TryInto, prelude::*}; type IdtyIndex = u32; @@ -53,9 +55,17 @@ pub const MAX_EVALUATORS_PER_SESSION: u32 = 100; #[frame_support::pallet()] pub mod pallet { use super::*; - use frame_support::{pallet_prelude::*, traits::ReservableCurrency}; + use frame_support::pallet_prelude::*; use frame_system::pallet_prelude::*; use sp_runtime::Perbill; + pub type AccountIdOf<T> = <T as frame_system::Config>::AccountId; + pub type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance; + + #[pallet::composite_enum] + pub enum HoldReason { + /// The funds are held as deposit for the distance evaluation. + DistanceHold, + } /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); @@ -71,12 +81,14 @@ pub mod pallet { + pallet_identity::Config<IdtyIndex = IdtyIndex> { /// Currency type used in this pallet (used for reserve/slash) - type Currency: ReservableCurrency<Self::AccountId>; + type Currency: Mutate<Self::AccountId> + + MutateHold<Self::AccountId, Reason = Self::RuntimeHoldReason> + + Balanced<Self::AccountId>; + /// Overarching hold reason. + type RuntimeHoldReason: From<HoldReason>; /// Amount reserved during evaluation #[pallet::constant] - type EvaluationPrice: Get< - <Self::Currency as frame_support::traits::Currency<Self::AccountId>>::Balance, - >; + type EvaluationPrice: Get<BalanceOf<Self>>; /// Evaluation period number of blocks. /// As the evaluation is done using 3 pools, /// the evaluation will take 3 * EvaluationPeriod. @@ -463,7 +475,11 @@ pub mod pallet { Error::<T>::QueueFull ); - T::Currency::reserve(who, <T as Config>::EvaluationPrice::get())?; + T::Currency::hold( + &HoldReason::DistanceHold.into(), + who, + <T as Config>::EvaluationPrice::get(), + )?; current_pool .evaluations @@ -559,9 +575,11 @@ pub mod pallet { if let Some(distance) = distance_result { if distance >= T::MinAccessibleReferees::get() { // Positive result, unreserve and apply - T::Currency::unreserve( + let _ = T::Currency::release( + &HoldReason::DistanceHold.into(), &requester, <T as Config>::EvaluationPrice::get(), + Precision::Exact, ); Self::do_valid_distance_status(idty, distance); weight = weight.saturating_add( @@ -572,7 +590,8 @@ pub mod pallet { ); } else { // Negative result, slash and deposit event - let _ = T::Currency::slash_reserved( + let _ = T::Currency::slash( + &HoldReason::DistanceHold.into(), &requester, <T as Config>::EvaluationPrice::get(), ); @@ -589,7 +608,12 @@ pub mod pallet { } } else { // No result, unreserve - T::Currency::unreserve(&requester, <T as Config>::EvaluationPrice::get()); + let _ = T::Currency::release( + &HoldReason::DistanceHold.into(), + &requester, + <T as Config>::EvaluationPrice::get(), + Precision::Exact, + ); weight = weight.saturating_add( <T as pallet::Config>::WeightInfo::do_evaluation_failure() .saturating_sub( diff --git a/pallets/distance/src/mock.rs b/pallets/distance/src/mock.rs index 5d68135168973de8f88f9a7ffbb386cd8683c2d8..7b2391ce46b9e71789340c1c3cb6ff30a35d5109 100644 --- a/pallets/distance/src/mock.rs +++ b/pallets/distance/src/mock.rs @@ -210,7 +210,7 @@ impl pallet_balances::Config for Test { type ReserveIdentifier = [u8; 8]; type RuntimeEvent = RuntimeEvent; type RuntimeFreezeReason = (); - type RuntimeHoldReason = (); + type RuntimeHoldReason = RuntimeHoldReason; type WeightInfo = pallet_balances::weights::SubstrateWeight<Test>; } @@ -262,6 +262,7 @@ impl pallet_distance::Config for Test { type MinAccessibleReferees = MinAccessibleReferees; type OnValidDistanceStatus = (); type RuntimeEvent = RuntimeEvent; + type RuntimeHoldReason = RuntimeHoldReason; type WeightInfo = (); } diff --git a/pallets/duniter-account/src/lib.rs b/pallets/duniter-account/src/lib.rs index 346dab97619dfa125435274e00260d96c1fa48a2..2e131264a222ec8b23c0a5e98e6bd54840aaadcf 100644 --- a/pallets/duniter-account/src/lib.rs +++ b/pallets/duniter-account/src/lib.rs @@ -29,8 +29,7 @@ pub use types::*; pub use weights::WeightInfo; use frame_support::pallet_prelude::*; -use frame_support::traits::StoredMap; -use frame_support::traits::{Currency, StorageVersion}; +use frame_support::traits::{fungible, fungible::Credit, IsSubType, StorageVersion, StoredMap}; use frame_system::pallet_prelude::*; use pallet_quota::traits::RefundFee; use pallet_transaction_payment::OnChargeTransaction; @@ -42,8 +41,8 @@ pub mod pallet { use super::*; pub type IdtyIdOf<T> = <T as pallet_identity::Config>::IdtyIndex; pub type CurrencyOf<T> = pallet_balances::Pallet<T>; - pub type BalanceOf<T> = - <CurrencyOf<T> as Currency<<T as frame_system::Config>::AccountId>>::Balance; + type AccountIdOf<T> = <T as frame_system::Config>::AccountId; + pub type BalanceOf<T> = <CurrencyOf<T> as fungible::Inspect<AccountIdOf<T>>>::Balance; /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); @@ -290,14 +289,15 @@ where // allows pay fees with quota instead of currency if available impl<T: Config> OnChargeTransaction<T> for Pallet<T> where + T::RuntimeCall: IsSubType<Call<T>>, T::InnerOnChargeTransaction: OnChargeTransaction< T, - Balance = <CurrencyOf<T> as Currency<T::AccountId>>::Balance, - LiquidityInfo = Option<<CurrencyOf<T> as Currency<T::AccountId>>::NegativeImbalance>, + Balance = BalanceOf<T>, + LiquidityInfo = Option<Credit<T::AccountId, T::Currency>>, >, { type Balance = BalanceOf<T>; - type LiquidityInfo = Option<<CurrencyOf<T> as Currency<T::AccountId>>::NegativeImbalance>; + type LiquidityInfo = Option<Credit<T::AccountId, T::Currency>>; fn withdraw_fee( who: &T::AccountId, diff --git a/pallets/oneshot-account/src/benchmarking.rs b/pallets/oneshot-account/src/benchmarking.rs index fb389d414b5695b29a24f5638528f3f1bb32133a..ed38c4377d08d44f192c13e3255f5c8b8ca07846 100644 --- a/pallets/oneshot-account/src/benchmarking.rs +++ b/pallets/oneshot-account/src/benchmarking.rs @@ -22,16 +22,19 @@ use super::*; use frame_benchmarking::v2::*; use frame_benchmarking::{account, whitelisted_caller}; use frame_support::pallet_prelude::IsType; +use frame_support::traits::fungible::Mutate; use frame_system::RawOrigin; use pallet_balances::Pallet as Balances; use crate::Pallet; +type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance; + #[benchmarks( where T: pallet_balances::Config, T::Balance: From<u64>, - <T::Currency as Currency<T::AccountId>>::Balance: IsType<T::Balance>+From<T::Balance> + BalanceOf<T>: IsType<T::Balance>+From<T::Balance> )] mod benchmarks { use super::*; @@ -41,7 +44,10 @@ mod benchmarks { let existential_deposit = T::ExistentialDeposit::get(); let caller = whitelisted_caller(); let balance = existential_deposit.saturating_mul((2).into()); - let _ = T::Currency::make_free_balance_be(&caller, balance.into()); + let _ = <<T as pallet::Config>::Currency as Mutate<T::AccountId>>::set_balance( + &caller, + balance.into(), + ); let recipient: T::AccountId = account("recipient", 0, 1); let recipient_lookup: <T::Lookup as StaticLookup>::Source = T::Lookup::unlookup(recipient.clone()); @@ -66,16 +72,16 @@ mod benchmarks { let existential_deposit = T::ExistentialDeposit::get(); let caller: T::AccountId = whitelisted_caller(); let balance = existential_deposit.saturating_mul((2).into()); - OneshotAccounts::<T>::insert( - caller.clone(), - Into::<<T::Currency as Currency<T::AccountId>>::Balance>::into(balance), - ); + OneshotAccounts::<T>::insert(caller.clone(), Into::<BalanceOf<T>>::into(balance)); // Deposit into a normal account is more expensive than into a oneshot account // so we create the recipient account with an existential deposit. let recipient: T::AccountId = account("recipient", 0, 1); let recipient_lookup: <T::Lookup as StaticLookup>::Source = T::Lookup::unlookup(recipient.clone()); - let _ = T::Currency::make_free_balance_be(&recipient, existential_deposit.into()); + let _ = <<T as pallet::Config>::Currency as Mutate<T::AccountId>>::set_balance( + &recipient, + existential_deposit.into(), + ); #[extrinsic_call] _( @@ -96,20 +102,23 @@ mod benchmarks { let existential_deposit = T::ExistentialDeposit::get(); let caller: T::AccountId = whitelisted_caller(); let balance = existential_deposit.saturating_mul((2).into()); - OneshotAccounts::<T>::insert( - caller.clone(), - Into::<<T::Currency as Currency<T::AccountId>>::Balance>::into(balance), - ); + OneshotAccounts::<T>::insert(caller.clone(), Into::<BalanceOf<T>>::into(balance)); // Deposit into a normal account is more expensive than into a oneshot account // so we create the recipient accounts with an existential deposits. let recipient1: T::AccountId = account("recipient1", 0, 1); let recipient1_lookup: <T::Lookup as StaticLookup>::Source = T::Lookup::unlookup(recipient1.clone()); - let _ = T::Currency::make_free_balance_be(&recipient1, existential_deposit.into()); + let _ = <<T as pallet::Config>::Currency as Mutate<T::AccountId>>::set_balance( + &recipient1, + existential_deposit.into(), + ); let recipient2: T::AccountId = account("recipient2", 1, 1); let recipient2_lookup: <T::Lookup as StaticLookup>::Source = T::Lookup::unlookup(recipient2.clone()); - let _ = T::Currency::make_free_balance_be(&recipient2, existential_deposit.into()); + let _ = <<T as pallet::Config>::Currency as Mutate<T::AccountId>>::set_balance( + &recipient2, + existential_deposit.into(), + ); #[extrinsic_call] _( diff --git a/pallets/oneshot-account/src/lib.rs b/pallets/oneshot-account/src/lib.rs index 637debf4d6ee77bd9aac739bc967ee57048a1d58..a22e897a9546feceb2980a5f7bf89b2276925478 100644 --- a/pallets/oneshot-account/src/lib.rs +++ b/pallets/oneshot-account/src/lib.rs @@ -29,14 +29,20 @@ pub use types::*; pub use weights::WeightInfo; use frame_support::pallet_prelude::*; +use frame_support::traits::fungible; use frame_support::traits::{ - Currency, ExistenceRequirement, Imbalance, IsSubType, WithdrawReasons, + fungible::{Balanced, Credit, Inspect}, + tokens::{Fortitude, Precision, Preservation}, + Imbalance, IsSubType, }; use frame_system::pallet_prelude::*; use pallet_transaction_payment::OnChargeTransaction; use sp_runtime::traits::{DispatchInfoOf, PostDispatchInfoOf, Saturating, StaticLookup, Zero}; use sp_std::convert::TryInto; +type AccountIdOf<T> = <T as frame_system::Config>::AccountId; +type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance; + #[frame_support::pallet] pub mod pallet { use super::*; @@ -49,7 +55,7 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config + pallet_transaction_payment::Config { - type Currency: Currency<Self::AccountId>; + type Currency: fungible::Balanced<Self::AccountId> + fungible::Mutate<Self::AccountId>; type InnerOnChargeTransaction: OnChargeTransaction<Self>; type RuntimeEvent: From<Event<Self>> + IsType<<Self as frame_system::Config>::RuntimeEvent>; /// Type representing the weight of this pallet @@ -60,13 +66,8 @@ pub mod pallet { #[pallet::storage] #[pallet::getter(fn oneshot_account)] - pub type OneshotAccounts<T: Config> = StorageMap< - _, - Blake2_128Concat, - T::AccountId, - <T::Currency as Currency<T::AccountId>>::Balance, - OptionQuery, - >; + pub type OneshotAccounts<T: Config> = + StorageMap<_, Blake2_128Concat, T::AccountId, BalanceOf<T>, OptionQuery>; // EVENTS // @@ -77,25 +78,19 @@ pub mod pallet { /// A oneshot account was created. OneshotAccountCreated { account: T::AccountId, - balance: <T::Currency as Currency<T::AccountId>>::Balance, + balance: BalanceOf<T>, creator: T::AccountId, }, /// A oneshot account was consumed. OneshotAccountConsumed { account: T::AccountId, - dest1: ( - T::AccountId, - <T::Currency as Currency<T::AccountId>>::Balance, - ), - dest2: Option<( - T::AccountId, - <T::Currency as Currency<T::AccountId>>::Balance, - )>, + dest1: (T::AccountId, BalanceOf<T>), + dest2: Option<(T::AccountId, BalanceOf<T>)>, }, /// A withdrawal was executed on a oneshot account. Withdraw { account: T::AccountId, - balance: <T::Currency as Currency<T::AccountId>>::Balance, + balance: BalanceOf<T>, }, } @@ -133,13 +128,13 @@ pub mod pallet { pub fn create_oneshot_account( origin: OriginFor<T>, dest: <T::Lookup as StaticLookup>::Source, - #[pallet::compact] value: <T::Currency as Currency<T::AccountId>>::Balance, + #[pallet::compact] value: BalanceOf<T>, ) -> DispatchResult { let transactor = ensure_signed(origin)?; let dest = T::Lookup::lookup(dest)?; ensure!( - value >= <T::Currency as Currency<T::AccountId>>::minimum_balance(), + value >= T::Currency::minimum_balance(), Error::<T>::ExistentialDeposit ); ensure!( @@ -147,11 +142,12 @@ pub mod pallet { Error::<T>::OneshotAccountAlreadyCreated ); - let _ = <T::Currency as Currency<T::AccountId>>::withdraw( + let _ = T::Currency::withdraw( &transactor, value, - WithdrawReasons::TRANSFER, - ExistenceRequirement::KeepAlive, + Precision::Exact, + Preservation::Preserve, + Fortitude::Polite, )?; OneshotAccounts::<T>::insert(&dest, value); Self::deposit_event(Event::OneshotAccountCreated { @@ -205,9 +201,8 @@ pub mod pallet { balance: value, creator: transactor.clone(), }); - } else { - let _ = - <T::Currency as Currency<T::AccountId>>::deposit_into_existing(&dest, value)?; + } else if frame_system::Pallet::<T>::providers(&dest) > 0 { + let _ = T::Currency::deposit(&dest, value, Precision::Exact)?; } OneshotAccounts::<T>::remove(&transactor); Self::deposit_event(Event::OneshotAccountConsumed { @@ -236,7 +231,7 @@ pub mod pallet { block_height: BlockNumberFor<T>, dest: Account<<T::Lookup as StaticLookup>::Source>, remaining_to: Account<<T::Lookup as StaticLookup>::Source>, - #[pallet::compact] balance: <T::Currency as Currency<T::AccountId>>::Balance, + #[pallet::compact] balance: BalanceOf<T>, ) -> DispatchResult { let transactor = ensure_signed(origin)?; @@ -271,12 +266,12 @@ pub mod pallet { Error::<T>::OneshotAccountAlreadyCreated ); ensure!( - balance1 >= <T::Currency as Currency<T::AccountId>>::minimum_balance(), + balance1 >= T::Currency::minimum_balance(), Error::<T>::ExistentialDeposit ); } else { ensure!( - !<T::Currency as Currency<T::AccountId>>::free_balance(&dest1).is_zero(), + !T::Currency::balance(&dest1).is_zero(), Error::<T>::DestAccountNotExist ); } @@ -286,7 +281,7 @@ pub mod pallet { Error::<T>::OneshotAccountAlreadyCreated ); ensure!( - balance2 >= <T::Currency as Currency<T::AccountId>>::minimum_balance(), + balance2 >= T::Currency::minimum_balance(), Error::<T>::ExistentialDeposit ); OneshotAccounts::<T>::insert(&dest2, balance2); @@ -295,10 +290,8 @@ pub mod pallet { balance: balance2, creator: transactor.clone(), }); - } else { - let _ = <T::Currency as Currency<T::AccountId>>::deposit_into_existing( - &dest2, balance2, - )?; + } else if frame_system::Pallet::<T>::providers(&dest2) > 0 { + let _ = T::Currency::deposit(&dest2, balance2, Precision::Exact)?; } if dest1_is_oneshot { OneshotAccounts::<T>::insert(&dest1, balance1); @@ -307,10 +300,8 @@ pub mod pallet { balance: balance1, creator: transactor.clone(), }); - } else { - let _ = <T::Currency as Currency<T::AccountId>>::deposit_into_existing( - &dest1, balance1, - )?; + } else if frame_system::Pallet::<T>::providers(&dest1) > 0 { + let _ = T::Currency::deposit(&dest1, balance1, Precision::Exact)?; } OneshotAccounts::<T>::remove(&transactor); Self::deposit_event(Event::OneshotAccountConsumed { @@ -329,12 +320,12 @@ where T::RuntimeCall: IsSubType<Call<T>>, T::InnerOnChargeTransaction: OnChargeTransaction< T, - Balance = <T::Currency as Currency<T::AccountId>>::Balance, - LiquidityInfo = Option<<T::Currency as Currency<T::AccountId>>::NegativeImbalance>, + Balance = BalanceOf<T>, + LiquidityInfo = Option<Credit<T::AccountId, T::Currency>>, >, { - type Balance = <T::Currency as Currency<T::AccountId>>::Balance; - type LiquidityInfo = Option<<T::Currency as Currency<T::AccountId>>::NegativeImbalance>; + type Balance = BalanceOf<T>; + type LiquidityInfo = Option<Credit<T::AccountId, T::Currency>>; fn withdraw_fee( who: &T::AccountId, @@ -359,10 +350,7 @@ where account: who.clone(), balance: fee, }); - // TODO - return Ok(Some( - <T::Currency as Currency<T::AccountId>>::NegativeImbalance::zero(), - )); + return Ok(Some(Imbalance::zero())); } } Err(TransactionValidityError::Invalid( diff --git a/pallets/oneshot-account/src/mock.rs b/pallets/oneshot-account/src/mock.rs index 8e83c61f054c0cb95e44c738fcd29d66f755b28e..451c5c154968ae3b2d1575af3bf1c348682accf9 100644 --- a/pallets/oneshot-account/src/mock.rs +++ b/pallets/oneshot-account/src/mock.rs @@ -14,12 +14,10 @@ // You should have received a copy of the GNU Affero General Public License // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>. -#![allow(deprecated)] // TODO - use crate::{self as pallet_oneshot_account}; use frame_support::{parameter_types, traits::Everything, weights::IdentityFee}; use frame_system as system; -use pallet_transaction_payment::CurrencyAdapter; +use pallet_transaction_payment::FungibleAdapter; use sp_core::{ConstU32, H256}; use sp_runtime::{ traits::{BlakeTwo256, IdentityLookup}, @@ -107,16 +105,15 @@ impl pallet_transaction_payment::Config for Test { } impl pallet_oneshot_account::Config for Test { type Currency = Balances; - type InnerOnChargeTransaction = CurrencyAdapter<Balances, HandleFees>; + type InnerOnChargeTransaction = FungibleAdapter<Balances, HandleFees>; type RuntimeEvent = RuntimeEvent; type WeightInfo = (); } pub struct HandleFees; -type NegativeImbalance = <Balances as frame_support::traits::Currency<u64>>::NegativeImbalance; -impl frame_support::traits::OnUnbalanced<NegativeImbalance> for HandleFees { - fn on_nonzero_unbalanced(_amount: NegativeImbalance) {} -} +type Imbalance = + frame_support::traits::fungible::Credit<<Test as frame_system::Config>::AccountId, Balances>; +impl frame_support::traits::OnUnbalanced<Imbalance> for HandleFees {} // Build genesis storage according to the mock runtime. #[allow(dead_code)] diff --git a/pallets/provide-randomness/src/benchmarking.rs b/pallets/provide-randomness/src/benchmarking.rs index b5cd3f11b1ab13c20b54adcac012860b3d8e032b..c0a4a9a557a613b70cdc541b6796b2ae640f2c2b 100644 --- a/pallets/provide-randomness/src/benchmarking.rs +++ b/pallets/provide-randomness/src/benchmarking.rs @@ -19,14 +19,14 @@ use super::*; -use frame_benchmarking::v2::*; -use frame_benchmarking::whitelisted_caller; -use frame_support::ensure; -use frame_support::pallet_prelude::IsType; -use frame_support::sp_runtime::{traits::One, Saturating}; -use frame_support::traits::{Currency, Get, OnInitialize}; -use frame_system::pallet_prelude::BlockNumberFor; -use frame_system::RawOrigin; +use frame_benchmarking::{v2::*, whitelisted_caller}; +use frame_support::{ + ensure, + pallet_prelude::IsType, + sp_runtime::{traits::One, Saturating}, + traits::{fungible::Mutate, Get, OnInitialize}, +}; +use frame_system::{pallet_prelude::BlockNumberFor, RawOrigin}; use sp_core::H256; use crate::Pallet; @@ -35,7 +35,7 @@ use crate::Pallet; where T: pallet_balances::Config, T::Balance: From<u64>, - <T::Currency as Currency<T::AccountId>>::Balance: IsType<T::Balance>, + BalanceOf<T>: IsType<T::Balance>, BlockNumberFor<T>: From<u32>, )] mod benchmarks { @@ -80,7 +80,7 @@ mod benchmarks { // Provide deposit let existential_deposit = T::ExistentialDeposit::get(); let balance = existential_deposit.saturating_mul((200).into()); - let _ = T::Currency::make_free_balance_be(&caller, balance.into()); + let _ = T::Currency::set_balance(&caller, balance.into()); // Set randomness parameters let random = RandomnessType::RandomnessFromOneEpochAgo; diff --git a/pallets/provide-randomness/src/lib.rs b/pallets/provide-randomness/src/lib.rs index b6c36c3454f54e2da6e22f1b374d14b0e5a71bee..608197496aa267c2bcd540d0d83bb45eb23479de 100644 --- a/pallets/provide-randomness/src/lib.rs +++ b/pallets/provide-randomness/src/lib.rs @@ -24,6 +24,10 @@ mod types; pub mod weights; use frame_support::pallet_prelude::Weight; +use frame_support::traits::{ + fungible::{self, Balanced, Credit}, + tokens::{Fortitude, Precision, Preservation}, +}; use sp_core::H256; use sp_std::prelude::*; @@ -46,17 +50,12 @@ impl OnFilledRandomness for () { pub mod pallet { use super::*; use frame_support::pallet_prelude::*; - use frame_support::traits::{ - Currency, ExistenceRequirement, OnUnbalanced, Randomness, StorageVersion, WithdrawReasons, - }; + use frame_support::traits::{OnUnbalanced, Randomness, StorageVersion}; use frame_system::pallet_prelude::*; use sp_core::H256; - pub type BalanceOf<T> = - <<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance; - pub type NegativeImbalanceOf<T> = <<T as Config>::Currency as Currency< - <T as frame_system::Config>::AccountId, - >>::NegativeImbalance; + type AccountIdOf<T> = <T as frame_system::Config>::AccountId; + pub type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance; /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); @@ -70,7 +69,7 @@ pub mod pallet { #[pallet::config] pub trait Config: frame_system::Config<Hash = H256> { // The currency - type Currency: Currency<Self::AccountId>; + type Currency: fungible::Balanced<Self::AccountId> + fungible::Mutate<Self::AccountId>; /// Get the current epoch index type GetCurrentEpochIndex: Get<u64>; /// Maximum number of not yet filled requests @@ -82,7 +81,7 @@ pub mod pallet { /// On filled randomness type OnFilledRandomness: OnFilledRandomness; /// Handler for the unbalanced reduction when the requestor pays fees. - type OnUnbalanced: OnUnbalanced<NegativeImbalanceOf<Self>>; + type OnUnbalanced: OnUnbalanced<Credit<Self::AccountId, Self::Currency>>; /// A safe source of randomness from the parent block type ParentBlockRandomness: Randomness<Option<H256>, BlockNumberFor<Self>>; /// A safe source of randomness from one epoch ago @@ -251,8 +250,9 @@ pub mod pallet { let imbalance = T::Currency::withdraw( requestor, T::RequestPrice::get(), - WithdrawReasons::FEE, - ExistenceRequirement::KeepAlive, + Precision::Exact, + Preservation::Preserve, + Fortitude::Polite, )?; T::OnUnbalanced::on_unbalanced(imbalance); Ok(()) diff --git a/pallets/universal-dividend/src/benchmarking.rs b/pallets/universal-dividend/src/benchmarking.rs index d9d0856ca1a26f9b2c790e9c4380352defb2d023..b38ec7493c4f05ceee24a316d401cb7df41f4c7d 100644 --- a/pallets/universal-dividend/src/benchmarking.rs +++ b/pallets/universal-dividend/src/benchmarking.rs @@ -18,15 +18,12 @@ #![allow(clippy::multiple_bound_locations)] use super::*; - use core::num::NonZeroU16; -use frame_benchmarking::v2::*; -use frame_benchmarking::{account, whitelisted_caller}; -use frame_support::pallet_prelude::IsType; -use frame_support::traits::StoredMap; +use frame_benchmarking::{account, v2::*, whitelisted_caller}; +use frame_support::{pallet_prelude::IsType, traits::StoredMap}; use frame_system::RawOrigin; use pallet_balances::Pallet as Balances; -use sp_runtime::traits::Bounded; +use sp_runtime::traits::Convert; use crate::Pallet; @@ -35,7 +32,7 @@ const ED_MULTIPLIER: u32 = 10; #[benchmarks( where T: pallet_balances::Config, T::Balance: From<u64>, - <T::Currency as Currency<T::AccountId>>::Balance: IsType<T::Balance> + BalanceOf<T>: IsType<T::Balance> )] mod benchmarks { use super::*; @@ -82,7 +79,7 @@ mod benchmarks { let existential_deposit = T::ExistentialDeposit::get(); let caller = whitelisted_caller(); let balance = existential_deposit.saturating_mul(ED_MULTIPLIER.into()); - let _ = T::Currency::make_free_balance_be(&caller, balance.into()); + let _ = T::Currency::set_balance(&caller, balance.into()); // Transfer `e - 1` existential deposits + 1 unit, which guarantees to create one account and reap this user. let recipient: T::AccountId = account("recipient", 0, 1); let recipient_lookup: <T::Lookup as StaticLookup>::Source = @@ -112,10 +109,7 @@ mod benchmarks { let recipient_lookup: <T::Lookup as StaticLookup>::Source = T::Lookup::unlookup(recipient.clone()); // Give the sender account max funds, thus a transfer will not kill account. - let _ = T::Currency::make_free_balance_be( - &caller, - <T::Currency as Currency<T::AccountId>>::Balance::max_value(), - ); + let _ = T::Currency::set_balance(&caller, u32::MAX.into()); let existential_deposit = T::ExistentialDeposit::get(); let transfer_amount = existential_deposit.saturating_mul(ED_MULTIPLIER.into()); let transfer_amount_ud = diff --git a/pallets/universal-dividend/src/lib.rs b/pallets/universal-dividend/src/lib.rs index 6c6f60da2c80f79d2ec3ea6d822e2aa839df0440..0b6360055d3cc99939dabc0b2b86ea691d429ed4 100644 --- a/pallets/universal-dividend/src/lib.rs +++ b/pallets/universal-dividend/src/lib.rs @@ -33,7 +33,11 @@ pub use pallet::*; pub use types::*; pub use weights::WeightInfo; -use frame_support::traits::{tokens::ExistenceRequirement, Currency, OnTimestampSet}; +use frame_support::traits::tokens::{Precision, Preservation}; +use frame_support::traits::{ + fungible::{self, Balanced, Mutate}, + OnTimestampSet, +}; use sp_arithmetic::{ per_things::Perbill, traits::{One, Saturating, Zero}, @@ -48,8 +52,8 @@ pub mod pallet { use frame_system::pallet_prelude::*; use sp_runtime::traits::Convert; - pub type BalanceOf<T> = - <<T as Config>::Currency as Currency<<T as frame_system::Config>::AccountId>>::Balance; + type AccountIdOf<T> = <T as frame_system::Config>::AccountId; + pub type BalanceOf<T> = <<T as Config>::Currency as fungible::Inspect<AccountIdOf<T>>>::Balance; /// The current storage version. const STORAGE_VERSION: StorageVersion = StorageVersion::new(1); @@ -64,7 +68,7 @@ pub mod pallet { // Moment into Balance converter type MomentIntoBalance: Convert<Self::Moment, BalanceOf<Self>>; // The currency - type Currency: Currency<Self::AccountId>; + type Currency: fungible::Balanced<Self::AccountId> + fungible::Mutate<Self::AccountId>; /// Maximum number of past UD revaluations to keep in storage. #[pallet::constant] type MaxPastReeval: Get<u32>; @@ -310,7 +314,7 @@ pub mod pallet { core::num::NonZeroU16::new(current_ud_index) .expect("unreachable because current_ud_index is never zero."), ); - let _ = T::Currency::deposit_creating(who, uds_total); + let _ = T::Currency::deposit(who, uds_total, Precision::Exact); Self::deposit_event(Event::UdsClaimed { count: uds_count, total: uds_total, @@ -329,7 +333,7 @@ pub mod pallet { origin: OriginFor<T>, dest: <T::Lookup as StaticLookup>::Source, value: BalanceOf<T>, - existence_requirement: ExistenceRequirement, + preservation: Preservation, ) -> DispatchResultWithPostInfo { let who = ensure_signed(origin)?; let dest = T::Lookup::lookup(dest)?; @@ -338,7 +342,7 @@ pub mod pallet { &who, &dest, value.saturating_mul(ud_amount) / T::UnitsPerUd::get(), - existence_requirement, + preservation, )?; Ok(().into()) } @@ -416,7 +420,7 @@ pub mod pallet { dest: <T::Lookup as StaticLookup>::Source, #[pallet::compact] value: BalanceOf<T>, ) -> DispatchResultWithPostInfo { - Self::do_transfer_ud(origin, dest, value, ExistenceRequirement::AllowDeath) + Self::do_transfer_ud(origin, dest, value, Preservation::Expendable) } /// Transfer some liquid free balance to another account, in milliUD. @@ -427,7 +431,7 @@ pub mod pallet { dest: <T::Lookup as StaticLookup>::Source, #[pallet::compact] value: BalanceOf<T>, ) -> DispatchResultWithPostInfo { - Self::do_transfer_ud(origin, dest, value, ExistenceRequirement::KeepAlive) + Self::do_transfer_ud(origin, dest, value, Preservation::Preserve) } } @@ -448,7 +452,7 @@ pub mod pallet { first_ud_index, PastReevals::<T>::get().into_iter(), ); - let _ = T::Currency::deposit_creating(who, uds_total); + let _ = T::Currency::deposit(who, uds_total, Precision::Exact); Self::deposit_event(Event::UdsAutoPaid { count: uds_count, total: uds_total, diff --git a/resources/metadata.scale b/resources/metadata.scale index a8e24383b2f1ae9d40710fe9d4b78344ce741442..a7d62dcf1ef7c1b04ff72729a9f83eb8693d861a 100644 Binary files a/resources/metadata.scale and b/resources/metadata.scale differ diff --git a/runtime/common/src/pallets_config.rs b/runtime/common/src/pallets_config.rs index 6cbe9d6e9dd48c9f6a88a13e9bb6b5080b3b7c70..4537936a837263ab2daa3c9734f4f6c245201cad 100644 --- a/runtime/common/src/pallets_config.rs +++ b/runtime/common/src/pallets_config.rs @@ -108,7 +108,7 @@ macro_rules! pallets_config { type RuntimeEvent = RuntimeEvent; type WeightInfo = common_runtime::weights::pallet_duniter_account::WeightInfo<Runtime>; // does currency adapter in any case, but adds "refund with quota" feature - type InnerOnChargeTransaction = CurrencyAdapter<Balances, HandleFees>; + type InnerOnChargeTransaction = FungibleAdapter<Balances, HandleFees>; type Refund = Quota; } @@ -165,43 +165,27 @@ type MaxNominators = MaxNominators; // MONEY MANAGEMENT // impl pallet_balances::Config for Runtime { -type RuntimeHoldReason = (); -type RuntimeFreezeReason = (); + type RuntimeHoldReason = RuntimeHoldReason; + type RuntimeFreezeReason = (); type RuntimeEvent = RuntimeEvent; type MaxLocks = MaxLocks; type MaxReserves = frame_support::pallet_prelude::ConstU32<5>; type ReserveIdentifier = [u8; 8]; - /// The type for recording an account's balance. type Balance = Balance; - type DustRemoval = HandleDust; + type DustRemoval = HandleFees; type ExistentialDeposit = ExistentialDeposit; type AccountStore = Account; - type FreezeIdentifier = (); - type MaxFreezes = frame_support::pallet_prelude::ConstU32<0>; + type FreezeIdentifier = (); + type MaxFreezes = frame_support::pallet_prelude::ConstU32<0>; type WeightInfo = common_runtime::weights::pallet_balances::WeightInfo<Runtime>; } - // Take Dust from Balances and put it in the Treasury pot - pub struct HandleDust; type CreditOf = frame_support::traits::tokens::fungible::Credit<AccountId, Balances>; - impl frame_support::traits::OnUnbalanced<CreditOf> for HandleDust { - fn on_nonzero_unbalanced(amount: CreditOf) { - use frame_support::traits::Currency as _; - use frame_support::traits::Imbalance as _; - let imbalance = NegativeImbalance::new(amount.peek()); - Balances::resolve_creating(&Treasury::account_id(), imbalance); - } - } - - // fees are moved to the treasury pub struct HandleFees; - type NegativeImbalance = <Balances as frame_support::traits::Currency<AccountId>>::NegativeImbalance; - impl frame_support::traits::OnUnbalanced<NegativeImbalance> for HandleFees { - fn on_nonzero_unbalanced(amount: NegativeImbalance) { - use frame_support::traits::Currency as _; - + impl frame_support::traits::OnUnbalanced<CreditOf> for HandleFees { + fn on_nonzero_unbalanced(amount: CreditOf) { // fee is moved to treasury - Balances::resolve_creating(&Treasury::account_id(), amount); + let _ = Balances::deposit(&Treasury::account_id(), amount.peek(), frame_support::traits::tokens::Precision::Exact); // should move the tip to author // if let Some(author) = Authorship::author() { // Balances::resolve_creating(&author, amount); @@ -349,7 +333,7 @@ type RuntimeFreezeReason = (); type MaxRequests = frame_support::traits::ConstU32<100>; type RequestPrice = frame_support::traits::ConstU64<2_000>; type OnFilledRandomness = (); - type OnUnbalanced = Treasury; + type OnUnbalanced = HandleFees; type ParentBlockRandomness = pallet_babe::ParentBlockRandomness<Self>; type RandomnessFromOneEpochAgo = pallet_babe::RandomnessFromOneEpochAgo<Self>; type WeightInfo = common_runtime::weights::pallet_provide_randomness::WeightInfo<Runtime>; @@ -534,6 +518,7 @@ type RuntimeFreezeReason = (); type EvaluationPrice = frame_support::traits::ConstU64<1000>; type MaxRefereeDistance = frame_support::traits::ConstU32<5>; type MinAccessibleReferees = MinAccessibleReferees; + type RuntimeHoldReason = RuntimeHoldReason; type RuntimeEvent = RuntimeEvent; type WeightInfo = common_runtime::weights::pallet_distance::WeightInfo<Runtime>; type OnValidDistanceStatus = Wot; diff --git a/runtime/g1/src/lib.rs b/runtime/g1/src/lib.rs index 8129cbc2ea5b231bc21103d3b02277adb5c22caf..20c078caabce898f8cef2f6ce5204d75577a00e8 100644 --- a/runtime/g1/src/lib.rs +++ b/runtime/g1/src/lib.rs @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Affero General Public License // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>. -#![allow(deprecated)] // TODO #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] @@ -34,13 +33,15 @@ pub use common_runtime::{ constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber, FullIdentificationOfImpl, GetCurrentEpochIndex, Hash, Header, IdtyIndex, Index, Signature, }; +use frame_support::traits::fungible::Balanced; +use frame_support::traits::Imbalance; pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; pub use pallet_identity::{IdtyStatus, IdtyValue}; pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_session::historical as session_historical; pub use pallet_timestamp::Call as TimestampCall; -use pallet_transaction_payment::CurrencyAdapter; +use pallet_transaction_payment::FungibleAdapter; pub use pallet_universal_dividend; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; diff --git a/runtime/gdev/src/lib.rs b/runtime/gdev/src/lib.rs index c662393b479ca23cdc08cd50ef99121c7285f454..b7f63c3e3dbb0ac933dd633fd48aad388730fad3 100644 --- a/runtime/gdev/src/lib.rs +++ b/runtime/gdev/src/lib.rs @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Affero General Public License // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>. -#![allow(deprecated)] // TODO #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] @@ -34,13 +33,15 @@ pub use common_runtime::{ constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber, FullIdentificationOfImpl, GetCurrentEpochIndex, Hash, Header, IdtyIndex, Index, Signature, }; +use frame_support::traits::fungible::Balanced; +use frame_support::traits::Imbalance; pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; pub use pallet_duniter_test_parameters::Parameters as GenesisParameters; pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_session::historical as session_historical; pub use pallet_timestamp::Call as TimestampCall; -use pallet_transaction_payment::CurrencyAdapter; +use pallet_transaction_payment::FungibleAdapter; pub use pallet_universal_dividend; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage; diff --git a/runtime/gtest/src/lib.rs b/runtime/gtest/src/lib.rs index 385887b0b58b2975cb2a84ef8f3d0fe819533589..9a39989c6218c9cb2d9505aa5698e1c294afa3b1 100644 --- a/runtime/gtest/src/lib.rs +++ b/runtime/gtest/src/lib.rs @@ -14,7 +14,6 @@ // You should have received a copy of the GNU Affero General Public License // along with Duniter-v2S. If not, see <https://www.gnu.org/licenses/>. -#![allow(deprecated)] // TODO #![cfg_attr(not(feature = "std"), no_std)] // `construct_runtime!` does a lot of recursion and requires us to increase the limit to 256. #![recursion_limit = "256"] @@ -34,12 +33,14 @@ pub use common_runtime::{ constants::*, entities::*, handlers::*, AccountId, Address, Balance, BlockNumber, FullIdentificationOfImpl, GetCurrentEpochIndex, Hash, Header, IdtyIndex, Index, Signature, }; +use frame_support::traits::fungible::Balanced; +use frame_support::traits::Imbalance; pub use frame_system::Call as SystemCall; pub use pallet_balances::Call as BalancesCall; pub use pallet_im_online::sr25519::AuthorityId as ImOnlineId; use pallet_session::historical as session_historical; pub use pallet_timestamp::Call as TimestampCall; -use pallet_transaction_payment::CurrencyAdapter; +use pallet_transaction_payment::FungibleAdapter; pub use pallet_universal_dividend; #[cfg(any(feature = "std", test))] pub use sp_runtime::BuildStorage;