From 8bde366d32fb70f21bb0ce26f2f347c8c0806ffe Mon Sep 17 00:00:00 2001 From: Gavin Wood <gavin@parity.io> Date: Fri, 10 Jan 2020 19:23:20 +0100 Subject: [PATCH] Fixes for pallets (#4595) * Move rebond to the end * Fix identity module * Fix order of things in tresury * Fixes * Fix. * Fix test * Fix test --- substrate/frame/identity/src/lib.rs | 23 +++-- substrate/frame/staking/src/lib.rs | 40 ++++----- substrate/frame/treasury/src/lib.rs | 130 ++++++++++++++-------------- 3 files changed, 96 insertions(+), 97 deletions(-) diff --git a/substrate/frame/identity/src/lib.rs b/substrate/frame/identity/src/lib.rs index 38aa3f9771b..b23407406b6 100644 --- a/substrate/frame/identity/src/lib.rs +++ b/substrate/frame/identity/src/lib.rs @@ -323,7 +323,7 @@ pub struct IdentityInfo { /// /// NOTE: This is stored separately primarily to facilitate the addition of extra fields in a /// backwards compatible way through a specialized `Decode` impl. -#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug)] +#[derive(Clone, Encode, Eq, PartialEq, RuntimeDebug)] pub struct Registration< Balance: Encode + Decode + Copy + Clone + Debug + Eq + PartialEq > { @@ -348,8 +348,17 @@ impl < } } +impl< + Balance: Encode + Decode + Copy + Clone + Debug + Eq + PartialEq, +> Decode for Registration<Balance> { + fn decode<I: codec::Input>(input: &mut I) -> sp_std::result::Result<Self, codec::Error> { + let (judgements, deposit, info) = Decode::decode(&mut AppendZerosInput::new(input))?; + Ok(Self { judgements, deposit, info }) + } +} + /// Information concerning a registrar. -#[derive(Clone, Encode, Eq, PartialEq, RuntimeDebug)] +#[derive(Clone, Encode, Decode, Eq, PartialEq, RuntimeDebug)] pub struct RegistrarInfo< Balance: Encode + Decode + Clone + Debug + Eq + PartialEq, AccountId: Encode + Decode + Clone + Debug + Eq + PartialEq @@ -365,16 +374,6 @@ pub struct RegistrarInfo< pub fields: IdentityFields, } -impl< - Balance: Encode + Decode + Clone + Debug + Eq + PartialEq, - AccountId: Encode + Decode + Clone + Debug + Eq + PartialEq -> Decode for RegistrarInfo<Balance, AccountId> { - fn decode<I: codec::Input>(input: &mut I) -> sp_std::result::Result<Self, codec::Error> { - let (account, fee, fields) = Decode::decode(&mut AppendZerosInput::new(input))?; - Ok(Self { account, fee, fields }) - } -} - decl_storage! { trait Store for Module<T: Trait> as Sudo { /// Information that is pertinent to identify the entity behind an account. diff --git a/substrate/frame/staking/src/lib.rs b/substrate/frame/staking/src/lib.rs index 1331f869b70..eef00a7c245 100644 --- a/substrate/frame/staking/src/lib.rs +++ b/substrate/frame/staking/src/lib.rs @@ -985,26 +985,6 @@ decl_module! { } } - /// Rebond a portion of the stash scheduled to be unlocked. - /// - /// # <weight> - /// - Time complexity: O(1). Bounded by `MAX_UNLOCKING_CHUNKS`. - /// - Storage changes: Can't increase storage, only decrease it. - /// # </weight> - #[weight = SimpleDispatchInfo::FixedNormal(500_000)] - fn rebond(origin, #[compact] value: BalanceOf<T>) { - let controller = ensure_signed(origin)?; - let ledger = Self::ledger(&controller).ok_or(Error::<T>::NotController)?; - ensure!( - ledger.unlocking.len() > 0, - Error::<T>::NoUnlockChunk, - ); - - let ledger = ledger.rebond(value); - - Self::update_ledger(&controller, &ledger); - } - /// Remove any unlocked chunks from the `unlocking` queue from our management. /// /// This essentially frees up that balance to be used by the stash account to do @@ -1256,6 +1236,26 @@ decl_module! { <Self as Store>::UnappliedSlashes::insert(&era, &unapplied); } + + /// Rebond a portion of the stash scheduled to be unlocked. + /// + /// # <weight> + /// - Time complexity: O(1). Bounded by `MAX_UNLOCKING_CHUNKS`. + /// - Storage changes: Can't increase storage, only decrease it. + /// # </weight> + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] + fn rebond(origin, #[compact] value: BalanceOf<T>) { + let controller = ensure_signed(origin)?; + let ledger = Self::ledger(&controller).ok_or(Error::<T>::NotController)?; + ensure!( + ledger.unlocking.len() > 0, + Error::<T>::NoUnlockChunk, + ); + + let ledger = ledger.rebond(value); + + Self::update_ledger(&controller, &ledger); + } } } diff --git a/substrate/frame/treasury/src/lib.rs b/substrate/frame/treasury/src/lib.rs index f86c5383263..1800d0ad043 100644 --- a/substrate/frame/treasury/src/lib.rs +++ b/substrate/frame/treasury/src/lib.rs @@ -311,6 +311,71 @@ decl_module! { fn deposit_event() = default; + /// Put forward a suggestion for spending. A deposit proportional to the value + /// is reserved and slashed if the proposal is rejected. It is returned once the + /// proposal is awarded. + /// + /// # <weight> + /// - O(1). + /// - Limited storage reads. + /// - One DB change, one extra DB entry. + /// # </weight> + #[weight = SimpleDispatchInfo::FixedNormal(500_000)] + fn propose_spend( + origin, + #[compact] value: BalanceOf<T>, + beneficiary: <T::Lookup as StaticLookup>::Source + ) { + let proposer = ensure_signed(origin)?; + let beneficiary = T::Lookup::lookup(beneficiary)?; + + let bond = Self::calculate_bond(value); + T::Currency::reserve(&proposer, bond) + .map_err(|_| Error::<T>::InsufficientProposersBalance)?; + + let c = Self::proposal_count(); + ProposalCount::put(c + 1); + <Proposals<T>>::insert(c, Proposal { proposer, value, beneficiary, bond }); + + Self::deposit_event(RawEvent::Proposed(c)); + } + + /// Reject a proposed spend. The original deposit will be slashed. + /// + /// # <weight> + /// - O(1). + /// - Limited storage reads. + /// - One DB clear. + /// # </weight> + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] + fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { + T::RejectOrigin::ensure_origin(origin)?; + let proposal = <Proposals<T>>::take(&proposal_id).ok_or(Error::<T>::InvalidProposalIndex)?; + + let value = proposal.bond; + let imbalance = T::Currency::slash_reserved(&proposal.proposer, value).0; + T::ProposalRejection::on_unbalanced(imbalance); + + Self::deposit_event(Event::<T>::Rejected(proposal_id, value)); + } + + /// Approve a proposal. At a later time, the proposal will be allocated to the beneficiary + /// and the original deposit will be returned. + /// + /// # <weight> + /// - O(1). + /// - Limited storage reads. + /// - One DB change. + /// # </weight> + #[weight = SimpleDispatchInfo::FixedOperational(100_000)] + fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { + T::ApproveOrigin::ensure_origin(origin)?; + + ensure!(<Proposals<T>>::exists(proposal_id), Error::<T>::InvalidProposalIndex); + + Approvals::mutate(|v| v.push(proposal_id)); + } + /// Report something `reason` that deserves a tip and claim any eventual the finder's fee. /// /// The dispatch origin for this call must be _Signed_. @@ -477,71 +542,6 @@ decl_module! { Self::payout_tip(tip); } - /// Put forward a suggestion for spending. A deposit proportional to the value - /// is reserved and slashed if the proposal is rejected. It is returned once the - /// proposal is awarded. - /// - /// # <weight> - /// - O(1). - /// - Limited storage reads. - /// - One DB change, one extra DB entry. - /// # </weight> - #[weight = SimpleDispatchInfo::FixedNormal(500_000)] - fn propose_spend( - origin, - #[compact] value: BalanceOf<T>, - beneficiary: <T::Lookup as StaticLookup>::Source - ) { - let proposer = ensure_signed(origin)?; - let beneficiary = T::Lookup::lookup(beneficiary)?; - - let bond = Self::calculate_bond(value); - T::Currency::reserve(&proposer, bond) - .map_err(|_| Error::<T>::InsufficientProposersBalance)?; - - let c = Self::proposal_count(); - ProposalCount::put(c + 1); - <Proposals<T>>::insert(c, Proposal { proposer, value, beneficiary, bond }); - - Self::deposit_event(RawEvent::Proposed(c)); - } - - /// Reject a proposed spend. The original deposit will be slashed. - /// - /// # <weight> - /// - O(1). - /// - Limited storage reads. - /// - One DB clear. - /// # </weight> - #[weight = SimpleDispatchInfo::FixedOperational(100_000)] - fn reject_proposal(origin, #[compact] proposal_id: ProposalIndex) { - T::RejectOrigin::ensure_origin(origin)?; - let proposal = <Proposals<T>>::take(&proposal_id).ok_or(Error::<T>::InvalidProposalIndex)?; - - let value = proposal.bond; - let imbalance = T::Currency::slash_reserved(&proposal.proposer, value).0; - T::ProposalRejection::on_unbalanced(imbalance); - - Self::deposit_event(Event::<T>::Rejected(proposal_id, value)); - } - - /// Approve a proposal. At a later time, the proposal will be allocated to the beneficiary - /// and the original deposit will be returned. - /// - /// # <weight> - /// - O(1). - /// - Limited storage reads. - /// - One DB change. - /// # </weight> - #[weight = SimpleDispatchInfo::FixedOperational(100_000)] - fn approve_proposal(origin, #[compact] proposal_id: ProposalIndex) { - T::ApproveOrigin::ensure_origin(origin)?; - - ensure!(<Proposals<T>>::exists(proposal_id), Error::<T>::InvalidProposalIndex); - - Approvals::mutate(|v| v.push(proposal_id)); - } - fn on_finalize(n: T::BlockNumber) { // Check to see if we should spend some funds! if (n % T::SpendPeriod::get()).is_zero() { -- GitLab