Struct FairElection

Source
pub struct FairElection<T: Config>(PhantomData<T>);
Expand description

A FairElection represents an election model that preserves the structure and fairness of backing by retaining each supporter’s individual contribution weight.

Unlike FlatElection, this model does not flatten backing. Instead, every supporter - including the author themselves - is treated as an individual backer with a distinct weight.

Self-collateral is therefore considered self-backing, contributing to the author’s support while still remaining structurally independent from other backers.

Both:

  • self-backing (author’s own collateral), and
  • external backing (direct backers, unmanaged indexes, or managed pools) are preserved as separate weighted relationships rather than being aggregated into a single scalar.

Each backing weight is mapped individually to the author they support, and the election outcome is computed from these unaggregated backer-author relationships.

§Characteristics

  • Treats self-collateral as self-backing (not flattened).
  • Preserves individual backer weights without aggregation.
  • Maintains structural fairness across all supporters.
  • Reflects both commitment (self-backing) and community support.
  • Emphasizes proportional and decentralized representation.

§Election Flow

  1. Gather all backers for each author, including self-backing.
  2. Map each backer’s weight individually to their chosen author.
  3. Provide these mappings to the Config::FairElectionModel plugin.
  4. Compute outcomes that reflect proportional and distributed support.

§Typical Use-Case

  • Selecting representatives, validators, or leaders where fair proportional influence from all supporters - including the author’s own stake - should be preserved without flattening.

§Summary

FairElection preserves the backing structure: every supporter (self or external) is represented individually, and each weight contributes proportionally without being merged into a single value.

The model prioritizes fair representation and structural integrity of support.

Tuple Fields§

§0: PhantomData<T>

Trait Implementations§

Source§

impl<T: Config> ElectionManager<<T as Config>::AccountId> for FairElection<T>

Implementation of the ElectionManager trait for FairElection.

This binds the FairElection system to a concrete election computation using backing-based metrics, leveraging runtime-configured plugin models and contexts.

Source§

type ElectionWeight = (Funder<T>, <<T as Config>::CommitmentAdapter as InspectAsset<<T as Config>::AccountId>>::Asset)

Election weight type: corresponds to a singular backing contribution to an author.

Source§

type ElectionWeightOf = Vec<<FairElection<T> as ElectionManager<<T as Config>::AccountId>>::ElectionWeight>

Collection type holding all weights (backing contributions) of an author.

Each author may have multiple backers; this vector represents all backing weights.

Source§

type Params = Vec<(<T as Config>::AccountId, Vec<(Funder<T>, <<T as Config>::CommitmentAdapter as InspectAsset<<T as Config>::AccountId>>::Asset)>)>

Input type for election computation: authors paired with their backing weights.

Source§

type Elected = Vec<<T as Config>::AccountId>

Output type representing elected authors.

Source§

type ElectionContext = <T as Config>::FairElectionContext

Plugin context providing runtime configuration for the election model.

Source§

type ElectionModel = <T as Config>::FairElectionModel

Plugin model implementing the election algorithm.

Source§

fn reveal() -> Option<Self::Elected>

Retrieve the currently elected candidates.

Fetches the authors elected in the most recent election round, using RecentElectedOn to determine the latest block where results were stored.

§Returns
  • Ok(Elected) - A collection of elected authors.
  • None otherwise.
Source§

fn remove(who: &Author<T>)

Optimistically remove a candidate from the most recent elected pool.

Directly updates storage by deleting the (block, author) entry from Elected for the latest election block.

Does not retroactively remove authors from historical elections.

Source§

fn is_candidate(who: &Author<T>) -> DispatchResult

Search if the given candidate is an elected in the recent election.

DispatchError otherwise

Source§

fn store(elects: &Self::Elected) -> DispatchResult

Persist the election results into storage.

Stores the newly elected authors under the current block number, updating Elected and RecentElectedOn.

§Behavior
  • Ensures the number of elected candidates meets the minimum requirement.
  • Optionally truncates to the maximum limit if ForceMaxElected is enabled.
  • Each elected author is stored under (current_block, author).
§Errors
  • Returns a [DispatchError] if fails.
Source§

fn can_prepare(from: &Self::Params) -> DispatchResult

Check if the election can be prepared with the given authors as candidates.

Ensures that the provided candidate set meets the configured minimum (MinElected) before initiating election computation.

Source§

fn on_prepare_success(elects: &Self::Elected)

Hook invoked after a successful election process.

Source§

fn on_prepare_fail(error: DispatchError)

Hook invoked when an election process fails.

Source§

fn prepare(from: Self::Params) -> Result<(), DispatchError>

Executes the election process and persists the results. Read more
Source§

fn run_model(input: Self::Params) -> Self::Elected

Self::ElectionModel plugin output function. Read more
Source§

impl<T: Config> InspectWeight<<T as Config>::AccountId, Vec<(Funder<T>, <<T as Config>::CommitmentAdapter as InspectAsset<<T as Config>::AccountId>>::Asset)>> for FairElection<T>

Implementation of the InspectWeight trait for FairElection.

This provides a way to inspect the backing weights of an Author in terms of their individual contributions from backers, leveraging the stored backing information in the pallet.

§Author Weight
  • Returns the weight of an author as a Vec<BackingElectionWeight>. Each element represents the backing contribution of an individual backer i.e., an external funder.
  • Wrapping the contributions in a vector satisfies the generic input requirements of ElectionManager for both FairElection and FlatElection.
Source§

fn weight_of( who: &Author<T>, ) -> Result<Vec<BackingElectionWeight<T>>, DispatchError>

Returns the backing weights of an author wrapped in a vector.

§Behavior
  1. Fetches the list of backers for the author using FundRoles::backers_of.
  2. Returns the backers’ contributions as a vector.
§Errors
  • Returns a [DispatchError] if fails.

Auto Trait Implementations§

§

impl<T> Freeze for FairElection<T>

§

impl<T> RefUnwindSafe for FairElection<T>
where T: RefUnwindSafe,

§

impl<T> Send for FairElection<T>
where T: Send,

§

impl<T> Sync for FairElection<T>
where T: Sync,

§

impl<T> Unpin for FairElection<T>
where T: Unpin,

§

impl<T> UnwindSafe for FairElection<T>
where T: UnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> CheckedConversion for T

§

fn checked_from<T>(t: T) -> Option<Self>
where Self: TryFrom<T>,

Convert from a value of T into an equivalent instance of Option<Self>. Read more
§

fn checked_into<T>(self) -> Option<T>
where Self: TryInto<T>,

Consume self to return Some equivalent value of Option<T>. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Instrument for T

§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided [Span], returning an Instrumented wrapper. Read more
§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
§

impl<T, U> IntoKey<U> for T
where U: FromKey<T>,

§

fn into_key(self) -> U

Source§

impl<T, U, Tag> IntoTag<U, Tag> for T
where U: FromTag<T, Tag>, Tag: DiscriminantTag,

Source§

fn into_tag(self) -> U

§

impl<Src, Dest> IntoTuple<Dest> for Src
where Dest: FromTuple<Src>,

§

fn into_tuple(self) -> Dest

§

impl<T> IsType<T> for T

§

fn from_ref(t: &T) -> &T

Cast reference.
§

fn into_ref(&self) -> &T

Cast reference.
§

fn from_mut(t: &mut T) -> &mut T

Cast mutable reference.
§

fn into_mut(&mut self) -> &mut T

Cast mutable reference.
§

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

§

fn from_ref(outer: &Outer) -> &T

Get a reference to the inner from the outer.

§

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

Get a mutable reference to the inner from the outer.

Source§

impl<T, Time> Logging<Time> for T
where Time: Time,

Source§

const FALLBACK_TARGET: &'static str = "routine"

Default logging target if none is provided.

Most routines, especially offchain workers or background tasks, use this target for simplicity.

It allows a consistent place to look for routine logs without requiring every call to specify a target.

Note: This target is only a conveninence and may be somewhat vague. To ensure errors can still be traced accurately, the logged messages should include additional metadata (e.g., module name, error index, or contextual info) so that the source of the error can be identified even if the target is generic.

Source§

type Logger = DispatchError

The type taken and returned for logging.

We simply return the same [DispatchError] that was logged, so logging does not change control flow or error propagation.

DispatchError is used because in Substrate it encompasses all runtime errors - including module errors, token errors, arithmetic issues, and transactional boundaries - making it the universal substrate-side error representation.

Source§

type Level = LogLevel

The log level type.

We use the LogLevel enum to standardize severity levels (Info, Warn, Error, Debug) across all routine logs.

Source§

fn log( level: <T as Logging<Time>>::Level, err: &<T as Logging<Time>>::Logger, timestamp: Time, target: Option<&str>, fmt: Option<fn(Time, &<T as Logging<Time>>::Level, &str, &str) -> String>, ) -> <T as Logging<Time>>::Logger

Core logging function that all helpers delegate to. Read more
Source§

fn info( err: &Self::Logger, timestamp: Timestamp, target: Option<&str>, fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>, ) -> Self::Logger
where Self: Sized,

Logs an info-level message. Read more
Source§

fn warn( err: &Self::Logger, timestamp: Timestamp, target: Option<&str>, fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>, ) -> Self::Logger
where Self: Sized,

Logs a warning-level message. Read more
Source§

fn error( err: &Self::Logger, timestamp: Timestamp, target: Option<&str>, fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>, ) -> Self::Logger
where Self: Sized,

Logs an error-level message. Read more
Source§

fn debug( err: &Self::Logger, timestamp: Timestamp, target: Option<&str>, fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>, ) -> Self::Logger
where Self: Sized,

Logs a debug-level message. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
§

impl<T> SaturatedConversion for T

§

fn saturated_from<T>(t: T) -> Self
where Self: UniqueSaturatedFrom<T>,

Convert from a value of T into an equivalent instance of Self. Read more
§

fn saturated_into<T>(self) -> T
where Self: UniqueSaturatedInto<T>,

Consume self to return an equivalent value of T. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

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

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
§

impl<T, U> TryIntoKey<U> for T
where U: TryFromKey<T>,

§

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

§

fn try_into_key(self) -> Result<U, <U as TryFromKey<T>>::Error>

§

impl<S, T> UncheckedInto<T> for S
where T: UncheckedFrom<S>,

§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
§

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

§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
§

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

§

fn vzip(self) -> V

§

impl<T> WithSubscriber for T

§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a [WithDispatch] wrapper. Read more
§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a [WithDispatch] wrapper. Read more
Source§

impl<Provider, Discriminant, T> DelegateVirtualDynBound<Provider, Discriminant> for T
where Provider: VirtualDynBound<Discriminant>, Discriminant: DiscriminantTag,

Source§

impl<Provider, Discriminant, T> DelegateVirtualStaticBound<Provider, Discriminant> for T
where Provider: VirtualStaticBound<Discriminant>, Discriminant: DiscriminantTag,

§

impl<T> JsonSchemaMaybe for T

§

impl<T> MaybeRefUnwindSafe for T
where T: RefUnwindSafe,