[][src]Enum pallet_staking::Call

pub enum Call<T: Trait> {
    bond(<T::Lookup as StaticLookup>::SourceBalanceOf<T>, RewardDestination),
    bond_extra(BalanceOf<T>),
    unbond(BalanceOf<T>),
    withdraw_unbonded(),
    validate(ValidatorPrefs),
    nominate(Vec<<T::Lookup as StaticLookup>::Source>),
    chill(),
    set_payee(RewardDestination),
    set_controller(<T::Lookup as StaticLookup>::Source),
    set_validator_count(u32),
    force_no_eras(),
    force_new_era(),
    set_invulnerables(Vec<T::AccountId>),
    force_unstake(T::AccountId),
    force_new_era_always(),
    cancel_deferred_slash(EraIndexVec<u32>),
    payout_nominator(EraIndexVec<(T::AccountId, u32)>),
    payout_validator(EraIndex),
    payout_stakers(T::AccountIdEraIndex),
    rebond(BalanceOf<T>),
    set_history_depth(EraIndex),
    reap_stash(T::AccountId),
    submit_election_solution(Vec<ValidatorIndex>, CompactAssignmentsPhragmenScoreEraIndex),
    submit_election_solution_unsigned(Vec<ValidatorIndex>, CompactAssignmentsPhragmenScoreEraIndex),
    // some variants omitted
}

Dispatchable calls.

Each variant of this enum maps to a dispatchable function from the associated module.

Variants

Take the origin account as a stash and lock up value of its balance. controller will be the account that controls it.

value must be more than the minimum_balance specified by T::Currency.

The dispatch origin for this call must be Signed by the stash account.

Emits Bonded.

  • Independent of the arguments. Moderate complexity.
  • O(1).
  • Three extra DB entries.

NOTE: Two of the storage writes (Self::bonded, Self::payee) are never cleaned unless the origin falls below existential deposit and gets removed as dust.

bond_extra(BalanceOf<T>)

Add some extra amount that have appeared in the stash free_balance into the balance up for staking.

Use this if there are additional funds in your stash account that you wish to bond. Unlike [bond] or [unbond] this function does not impose any limitation on the amount that can be added.

The dispatch origin for this call must be Signed by the stash, not the controller and it can be only called when EraElectionStatus is Closed.

Emits Bonded.

  • Independent of the arguments. Insignificant complexity.
  • O(1).
  • One DB entry.

unbond(BalanceOf<T>)

Schedule a portion of the stash to be unlocked ready for transfer out after the bond period ends. If this leaves an amount actively bonded less than T::Currency::minimum_balance(), then it is increased to the full amount.

Once the unlock period is done, you can call withdraw_unbonded to actually move the funds out of management ready for transfer.

No more than a limited number of unlocking chunks (see MAX_UNLOCKING_CHUNKS) can co-exists at the same time. In that case, Call::withdraw_unbonded need to be called first to remove some of the chunks (if possible).

The dispatch origin for this call must be Signed by the controller, not the stash. And, it can be only called when EraElectionStatus is Closed.

Emits Unbonded.

See also Call::withdraw_unbonded.

  • Independent of the arguments. Limited but potentially exploitable complexity.
  • Contains a limited number of reads.
  • Each call (requires the remainder of the bonded balance to be above minimum_balance) will cause a new entry to be inserted into a vector (Ledger.unlocking) kept in storage. The only way to clean the aforementioned storage item is also user-controlled via withdraw_unbonded.
  • One DB entry.
withdraw_unbonded()

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 whatever it wants.

The dispatch origin for this call must be Signed by the controller, not the stash. And, it can be only called when EraElectionStatus is Closed.

Emits Withdrawn.

See also Call::unbond.

  • Could be dependent on the origin argument and how much unlocking chunks exist. It implies consolidate_unlocked which loops over Ledger.unlocking, which is indirectly user-controlled. See [unbond] for more detail.
  • Contains a limited number of reads, yet the size of which could be large based on ledger.
  • Writes are limited to the origin account key.

validate(ValidatorPrefs)

Declare the desire to validate for the origin controller.

Effects will be felt at the beginning of the next era.

The dispatch origin for this call must be Signed by the controller, not the stash. And, it can be only called when EraElectionStatus is Closed.

  • Independent of the arguments. Insignificant complexity.
  • Contains a limited number of reads.
  • Writes are limited to the origin account key.

nominate(Vec<<T::Lookup as StaticLookup>::Source>)

Declare the desire to nominate targets for the origin controller.

Effects will be felt at the beginning of the next era. This can only be called when EraElectionStatus is Closed.

The dispatch origin for this call must be Signed by the controller, not the stash. And, it can be only called when EraElectionStatus is Closed.

  • The transaction's complexity is proportional to the size of targets, which is capped at CompactAssignments::LIMIT.
  • Both the reads and writes follow a similar pattern.

chill()

Declare no desire to either validate or nominate.

Effects will be felt at the beginning of the next era.

The dispatch origin for this call must be Signed by the controller, not the stash. And, it can be only called when EraElectionStatus is Closed.

  • Independent of the arguments. Insignificant complexity.
  • Contains one read.
  • Writes are limited to the origin account key.

(Re-)set the payment target for a controller.

Effects will be felt at the beginning of the next era.

The dispatch origin for this call must be Signed by the controller, not the stash.

  • Independent of the arguments. Insignificant complexity.
  • Contains a limited number of reads.
  • Writes are limited to the origin account key.

set_controller(<T::Lookup as StaticLookup>::Source)

(Re-)set the controller of a stash.

Effects will be felt at the beginning of the next era.

The dispatch origin for this call must be Signed by the stash, not the controller.

  • Independent of the arguments. Insignificant complexity.
  • Contains a limited number of reads.
  • Writes are limited to the origin account key.

set_validator_count(u32)

The ideal number of validators.

force_no_eras()

Force there to be no new eras indefinitely.

  • No arguments.

force_new_era()

Force there to be a new era at the end of the next session. After this, it will be reset to normal (non-forced) behaviour.

  • No arguments.

set_invulnerables(Vec<T::AccountId>)

Set the validators who cannot be slashed (if any).

force_unstake(T::AccountId)

Force a current staker to become completely unstaked, immediately.

force_new_era_always()

Force there to be a new era at the end of sessions indefinitely.

  • One storage write

cancel_deferred_slash(EraIndexVec<u32>)

Cancel enactment of a deferred slash. Can be called by either the root origin or the T::SlashCancelOrigin. passing the era and indices of the slashes for that era to kill.

  • One storage write.

payout_nominator(EraIndexVec<(T::AccountId, u32)>)

This extrinsic will be removed after MigrationEra + HistoryDepth has passed, giving opportunity for users to claim all rewards before moving to Simple Payouts. After this time, you should use payout_stakers instead.

Make one nominator's payout for one era.

  • who is the controller account of the nominator to pay out.
  • era may not be lower than one following the most recently paid era. If it is higher, then it indicates an instruction to skip the payout of all previous eras.
  • validators is the list of all validators that who had exposure to during era, alongside the index of who in the clipped exposure of the validator. I.e. each element is a tuple of (validator, index of who in clipped exposure of validator). If it is incomplete, then less than the full reward will be paid out. It must not exceed MAX_NOMINATIONS.

WARNING: once an era is payed for a validator such validator can't claim the payout of previous era.

WARNING: Incorrect arguments here can result in loss of payout. Be very careful.

  • Number of storage read of O(validators); validators is the argument of the call, and is bounded by MAX_NOMINATIONS.
  • Each storage read is O(N) size and decode complexity; N is the maximum nominations that can be given to a single validator.
  • Computation complexity: O(MAX_NOMINATIONS * logN); MAX_NOMINATIONS is the maximum number of validators that may be nominated by a single nominator, it is bounded only economically (all nominators are required to place a minimum stake).

payout_validator(EraIndex)

This extrinsic will be removed after MigrationEra + HistoryDepth has passed, giving opportunity for users to claim all rewards before moving to Simple Payouts. After this time, you should use payout_stakers instead.

Make one validator's payout for one era.

  • who is the controller account of the validator to pay out.
  • era may not be lower than one following the most recently paid era. If it is higher, then it indicates an instruction to skip the payout of all previous eras.

WARNING: once an era is payed for a validator such validator can't claim the payout of previous era.

WARNING: Incorrect arguments here can result in loss of payout. Be very careful.

  • Time complexity: O(1).
  • Contains a limited number of reads and writes.

payout_stakers(T::AccountIdEraIndex)

Pay out all the stakers behind a single validator for a single era.

  • validator_stash is the stash account of the validator. Their nominators, up to T::MaxNominatorRewardedPerValidator, will also receive their rewards.
  • era may be any era between [current_era - history_depth; current_era].

The origin of this call must be Signed. Any account can call this function, even if it is not one of the stakers.

This can only be called when EraElectionStatus is Closed.

  • Time complexity: at most O(MaxNominatorRewardedPerValidator).
  • Contains a limited number of reads and writes.

rebond(BalanceOf<T>)

Rebond a portion of the stash scheduled to be unlocked.

The dispatch origin must be signed by the controller, and it can be only called when EraElectionStatus is Closed.

  • Time complexity: O(1). Bounded by MAX_UNLOCKING_CHUNKS.
  • Storage changes: Can't increase storage, only decrease it.

set_history_depth(EraIndex)

Set history_depth value.

Origin must be root.

reap_stash(T::AccountId)

Remove all data structure concerning a staker/stash once its balance is zero. This is essentially equivalent to withdraw_unbonded except it can be called by anyone and the target stash must have no funds left.

This can be called from any origin.

  • stash: The stash account to reap. Its balance must be zero.

Submit a phragmen result to the chain. If the solution:

  1. is valid.
  2. has a better score than a potentially existing solution on chain.

then, it will be put on chain.

A solution consists of two pieces of data:

  1. winners: a flat vector of all the winners of the round.
  2. assignments: the compact version of an assignment vector that encodes the edge weights.

Both of which may be computed using [phragmen], or any other algorithm.

Additionally, the submitter must provide:

  • The score that they claim their solution has.

Both validators and nominators will be represented by indices in the solution. The indices should respect the corresponding types (ValidatorIndex and NominatorIndex). Moreover, they should be valid when used to index into SnapshotValidators and SnapshotNominators. Any invalid index will cause the solution to be rejected. These two storage items are set during the election window and may be used to determine the indices.

A solution is valid if:

  1. It is submitted when EraElectionStatus is Open.
  2. Its claimed score is equal to the score computed on-chain.
  3. Presents the correct number of winners.
  4. All indexes must be value according to the snapshot vectors. All edge values must also be correct and should not overflow the granularity of the ratio type (i.e. 256 or billion).
  5. For each edge, all targets are actually nominated by the voter.
  6. Has correct self-votes.

A solutions score is consisted of 3 parameters:

  1. min { support.total } for each support of a winner. This value should be maximized.
  2. sum { support.total } for each support of a winner. This value should be minimized.
  3. sum { support.total^2 } for each support of a winner. This value should be minimized (to ensure less variance)

E: number of edges. m: size of winner committee. n: number of nominators. d: edge degree (16 for now) v: number of on-chain validator candidates.

NOTE: given a solution which is reduced, we can enable a new check the ensure |E| < n + m. We don't do this yet, but our offchain worker code executes it nonetheless.

major steps (all done in check_and_replace_solution):

  • Storage: O(1) read ElectionStatus.

  • Storage: O(1) read PhragmenScore.

  • Storage: O(1) read ValidatorCount.

  • Storage: O(1) length read from SnapshotValidators.

  • Storage: O(v) reads of AccountId to fetch snapshot_validators.

  • Memory: O(m) iterations to map winner index to validator id.

  • Storage: O(n) reads AccountId to fetch snapshot_nominators.

  • Memory: O(n + m) reads to map index to AccountId for un-compact.

  • Storage: O(e) accountid reads from Nomination to read correct nominations.

  • Storage: O(e) calls into slashable_balance_of_extended to convert ratio to staked.

  • Memory: build_support_map. O(e).

  • Memory: evaluate_support: O(E).

  • Storage: O(e) writes to QueuedElected.

  • Storage: O(1) write to QueuedScore

The weight of this call is 1/10th of the blocks total weight.

submit_election_solution_unsigned(Vec<ValidatorIndex>, CompactAssignmentsPhragmenScoreEraIndex)

Unsigned version of submit_election_solution.

Note that this must pass the [ValidateUnsigned] check which only allows transactions from the local node to be included. In other words, only the block author can include a transaction in the block.

Trait Implementations

impl<T: Trait> Clone for Call<T>[src]

impl<T: Trait> Debug for Call<T>[src]

impl<T: Trait> Decode for Call<T> where
    <T::Lookup as StaticLookup>::Source: Decode,
    <T::Lookup as StaticLookup>::Source: Decode,
    Vec<<T::Lookup as StaticLookup>::Source>: Decode,
    Vec<<T::Lookup as StaticLookup>::Source>: Decode,
    <T::Lookup as StaticLookup>::Source: Decode,
    <T::Lookup as StaticLookup>::Source: Decode,
    Vec<T::AccountId>: Decode,
    Vec<T::AccountId>: Decode,
    T::AccountId: Decode,
    T::AccountId: Decode,
    Vec<(T::AccountId, u32)>: Decode,
    Vec<(T::AccountId, u32)>: Decode,
    T::AccountId: Decode,
    T::AccountId: Decode,
    T::AccountId: Decode,
    T::AccountId: Decode,
    BalanceOf<T>: HasCompact,
    BalanceOf<T>: HasCompact,
    BalanceOf<T>: HasCompact,
    BalanceOf<T>: HasCompact
[src]

impl<T: Trait> Dispatchable for Call<T>[src]

type Trait = T

...

type Origin = T::Origin

Every function call from your runtime has an origin, which specifies where the extrinsic was generated from. In the case of a signed extrinsic (transaction), the origin contains an identifier for the caller. The origin can be empty in the case of an inherent extrinsic. Read more

type Info = DispatchInfo

An opaque set of information attached to the transaction. This could be constructed anywhere down the line in a runtime. The current Substrate runtime uses a struct with the same name to represent the dispatch class and weight. Read more

type PostInfo = PostDispatchInfo

Additional information that is returned by dispatch. Can be used to supply the caller with information about a Dispatchable that is ownly known post dispatch. Read more

impl<T: Trait> Encode for Call<T> where
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    Vec<<T::Lookup as StaticLookup>::Source>: Encode,
    Vec<<T::Lookup as StaticLookup>::Source>: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    Vec<T::AccountId>: Encode,
    Vec<T::AccountId>: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    Vec<(T::AccountId, u32)>: Encode,
    Vec<(T::AccountId, u32)>: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    BalanceOf<T>: HasCompact,
    BalanceOf<T>: HasCompact,
    BalanceOf<T>: HasCompact,
    BalanceOf<T>: HasCompact
[src]

impl<T: Trait> EncodeLike<Call<T>> for Call<T> where
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    Vec<<T::Lookup as StaticLookup>::Source>: Encode,
    Vec<<T::Lookup as StaticLookup>::Source>: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    <T::Lookup as StaticLookup>::Source: Encode,
    Vec<T::AccountId>: Encode,
    Vec<T::AccountId>: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    Vec<(T::AccountId, u32)>: Encode,
    Vec<(T::AccountId, u32)>: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    T::AccountId: Encode,
    BalanceOf<T>: HasCompact,
    BalanceOf<T>: HasCompact,
    BalanceOf<T>: HasCompact,
    BalanceOf<T>: HasCompact
[src]

impl<T: Trait> Eq for Call<T>[src]

impl<T: Trait> GetCallName for Call<T>[src]

impl<T: Trait> GetDispatchInfo for Call<T>[src]

impl<T: Trait> PartialEq<Call<T>> for Call<T>[src]

Auto Trait Implementations

impl<T> RefUnwindSafe for Call<T> where
    T: RefUnwindSafe,
    <T as Trait>::AccountId: RefUnwindSafe,
    <<T as Trait>::Currency as Currency<<T as Trait>::AccountId>>::Balance: RefUnwindSafe,
    <T as Trait>::Currency: Currency<<T as Trait>::AccountId>,
    <T as Trait>::Lookup: StaticLookup,
    <<T as Trait>::Lookup as StaticLookup>::Source: RefUnwindSafe

impl<T> Send for Call<T> where
    T: Send,
    <T as Trait>::AccountId: Send,
    <<T as Trait>::Currency as Currency<<T as Trait>::AccountId>>::Balance: Send,
    <T as Trait>::Currency: Currency<<T as Trait>::AccountId>,
    <T as Trait>::Lookup: StaticLookup,
    <<T as Trait>::Lookup as StaticLookup>::Source: Send

impl<T> Sync for Call<T> where
    T: Sync,
    <T as Trait>::AccountId: Sync,
    <<T as Trait>::Currency as Currency<<T as Trait>::AccountId>>::Balance: Sync,
    <T as Trait>::Currency: Currency<<T as Trait>::AccountId>,
    <T as Trait>::Lookup: StaticLookup,
    <<T as Trait>::Lookup as StaticLookup>::Source: Sync

impl<T> Unpin for Call<T> where
    T: Unpin,
    <T as Trait>::AccountId: Unpin,
    <<T as Trait>::Currency as Currency<<T as Trait>::AccountId>>::Balance: Unpin,
    <T as Trait>::Currency: Currency<<T as Trait>::AccountId>,
    <T as Trait>::Lookup: StaticLookup,
    <<T as Trait>::Lookup as StaticLookup>::Source: Unpin

impl<T> UnwindSafe for Call<T> where
    T: UnwindSafe,
    <T as Trait>::AccountId: UnwindSafe,
    <<T as Trait>::Currency as Currency<<T as Trait>::AccountId>>::Balance: UnwindSafe,
    <T as Trait>::Currency: Currency<<T as Trait>::AccountId>,
    <T as Trait>::Lookup: StaticLookup,
    <<T as Trait>::Lookup as StaticLookup>::Source: UnwindSafe

Blanket Implementations

impl<T> Any for T where
    T: 'static + ?Sized
[src]

impl<T> Borrow<T> for T where
    T: ?Sized
[src]

impl<T> BorrowMut<T> for T where
    T: ?Sized
[src]

impl<T> CheckedConversion for T[src]

impl<S> Codec for S where
    S: Encode + Decode
[src]

impl<T, X> Decode for X where
    T: Decode + Into<X>,
    X: WrapperTypeDecode<Wrapped = T>, 
[src]

impl<T> DecodeAll for T where
    T: Decode
[src]

impl<T, X> Encode for X where
    T: Encode + ?Sized,
    X: WrapperTypeEncode<Target = T>, 
[src]

impl<'_, '_, T> EncodeLike<&'_ &'_ T> for T where
    T: Encode
[src]

impl<'_, T> EncodeLike<&'_ T> for T where
    T: Encode
[src]

impl<'_, T> EncodeLike<&'_ mut T> for T where
    T: Encode
[src]

impl<T> EncodeLike<Arc<T>> for T where
    T: Encode
[src]

impl<T> EncodeLike<Box<T>> for T where
    T: Encode
[src]

impl<'a, T> EncodeLike<Cow<'a, T>> for T where
    T: Encode + ToOwned
[src]

impl<T> EncodeLike<Rc<T>> for T where
    T: Encode
[src]

impl<T> From<T> for T[src]

impl<S> FullCodec for S where
    S: Decode + FullEncode
[src]

impl<S> FullEncode for S where
    S: Encode + EncodeLike<S>, 
[src]

impl<T> Hashable for T where
    T: Codec
[src]

impl<T, U> Into<U> for T where
    U: From<T>, 
[src]

impl<T, Outer> IsWrappedBy<Outer> for T where
    Outer: AsRef<T> + AsMut<T> + From<T>,
    T: From<Outer>, 
[src]

fn from_ref(outer: &Outer) -> &T[src]

Get a reference to the inner from the outer.

fn from_mut(outer: &mut Outer) -> &mut T[src]

Get a mutable reference to the inner from the outer.

impl<T> KeyedVec for T where
    T: Codec
[src]

impl<T> MaybeDebug for T where
    T: Debug

impl<T> MaybeDebug for T where
    T: Debug

impl<T> MaybeRefUnwindSafe for T where
    T: RefUnwindSafe

impl<T> Member for T where
    T: 'static + Clone + PartialEq<T> + Eq + Send + Sync + Debug
[src]

impl<T> Parameter for T where
    T: Codec + EncodeLike<T> + Clone + Eq + Debug
[src]

impl<T> Same<T> for T

type Output = T

Should always be Self

impl<T> SaturatedConversion for T

impl<T> ToOwned for T where
    T: Clone
[src]

type Owned = T

The resulting type after obtaining ownership.

impl<T, U> TryFrom<U> for T where
    U: Into<T>, 
[src]

type Error = Infallible

The type returned in the event of a conversion error.

impl<T, U> TryInto<U> for T where
    U: TryFrom<T>, 
[src]

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.

impl<S, T> UncheckedInto<T> for S where
    T: UncheckedFrom<S>, 
[src]

impl<T, S> UniqueSaturatedInto<T> for S where
    S: TryInto<T>,
    T: Bounded

impl<V, T> VZip<V> for T where
    V: MultiLane<T>,