pub struct Xp<T: Config<I>, I: 'static> {
pub free: T::Xp,
pub reserve: T::Xp,
pub lock: T::Xp,
pub pulse: Accumulator<T, I>,
pub timestamp: BlockNumberFor<T>,
}Expand description
The main XP data structure that is utilized on implementation of XpSystem::Xp.
It provides a high-level detail for managing liquid points, reserved points, locked points, and reputation-based pulse tracking with timestamp information.
§Point Categories
- Free Points: Liquid XP that the owner can freely access and use.
- Reserved Points: XP temporarily set aside for Runtime specific purposes.
- Locked Points: XP that is restricted by the Runtime provider (other pallets) or implementor.
§Reputation System
- Pulse: A discrete accumulator that tracks XP mutation frequency for reputation.
- Timestamp: Block number of the last XP increment for heartbeat tracking.
Fields§
§free: T::XpLiquid XP points that the owner can freely access.
reserve: T::XpReserved XP points that are temporarily set aside for specific purposes.
This field aggregates all reserved XP across different RuntimeReasons,
enabling efficient access to the total reserved balance without needing
to iterate through individual reservation records.
lock: T::XpLocked XP points that are restricted by the Runtime provider or implementor.
This field aggregates all locked XP across different RuntimeReasons,
enabling efficient access to the total locked balance without needing
to iterate through individual lock records.
pulse: Accumulator<T, I>Reputation-based pulse accumulator that tracks XP mutation frequency.
The provider represents the runtime intent, awarding XP based on completed work.
The pulse acts as a “heartbeat” of XP activity, serving as a reputational metric for each XP account. It is proportional to the frequency and amount of XP increments, and may influence the raw XP awarded for future actions.
In an untrusted environment, pulse is used as a reputational resource,
allowing the system to adjust raw XP based on the quality and consistency
of the account’s activity as reflected by its pulse.
timestamp: BlockNumberFor<T>The block number at which XP was last incremented.
This timestamp is used to identify inactive (“dead”) XP accounts and can be leveraged to conditionally determine whether to increase reputation (i.e., pulse) based on recent activity, or if the XP is subjected to reaping procedures.
Trait Implementations§
Source§impl<T: Config<I>, I: 'static> Decode for Xp<T, I>where
T::Xp: Decode,
Accumulator<T, I>: Decode,
BlockNumberFor<T>: Decode,
impl<T: Config<I>, I: 'static> Decode for Xp<T, I>where
T::Xp: Decode,
Accumulator<T, I>: Decode,
BlockNumberFor<T>: Decode,
Source§fn decode<__CodecInputEdqy: Input>(
__codec_input_edqy: &mut __CodecInputEdqy,
) -> Result<Self, Error>
fn decode<__CodecInputEdqy: Input>( __codec_input_edqy: &mut __CodecInputEdqy, ) -> Result<Self, Error>
§fn decode_into<I>(
input: &mut I,
dst: &mut MaybeUninit<Self>,
) -> Result<DecodeFinished, Error>where
I: Input,
fn decode_into<I>(
input: &mut I,
dst: &mut MaybeUninit<Self>,
) -> Result<DecodeFinished, Error>where
I: Input,
§fn skip<I>(input: &mut I) -> Result<(), Error>where
I: Input,
fn skip<I>(input: &mut I) -> Result<(), Error>where
I: Input,
§fn encoded_fixed_size() -> Option<usize>
fn encoded_fixed_size() -> Option<usize>
Source§impl<T: Config<I>, I: 'static> Encode for Xp<T, I>where
T::Xp: Encode,
Accumulator<T, I>: Encode,
BlockNumberFor<T>: Encode,
impl<T: Config<I>, I: 'static> Encode for Xp<T, I>where
T::Xp: Encode,
Accumulator<T, I>: Encode,
BlockNumberFor<T>: Encode,
Source§fn size_hint(&self) -> usize
fn size_hint(&self) -> usize
Source§fn encode_to<__CodecOutputEdqy: Output + ?Sized>(
&self,
__codec_dest_edqy: &mut __CodecOutputEdqy,
)
fn encode_to<__CodecOutputEdqy: Output + ?Sized>( &self, __codec_dest_edqy: &mut __CodecOutputEdqy, )
§fn using_encoded<R, F>(&self, f: F) -> R
fn using_encoded<R, F>(&self, f: F) -> R
§fn encoded_size(&self) -> usize
fn encoded_size(&self) -> usize
Source§impl<T: Config<I>, I: 'static> MaxEncodedLen for Xp<T, I>where
T::Xp: MaxEncodedLen,
Accumulator<T, I>: MaxEncodedLen,
BlockNumberFor<T>: MaxEncodedLen,
impl<T: Config<I>, I: 'static> MaxEncodedLen for Xp<T, I>where
T::Xp: MaxEncodedLen,
Accumulator<T, I>: MaxEncodedLen,
BlockNumberFor<T>: MaxEncodedLen,
Source§fn max_encoded_len() -> usize
fn max_encoded_len() -> usize
Source§impl<T, I> TypeInfo for Xp<T, I>where
T::Xp: TypeInfo + 'static,
Accumulator<T, I>: TypeInfo + 'static,
BlockNumberFor<T>: TypeInfo + 'static,
T: Config<I> + 'static,
I: 'static,
impl<T, I> TypeInfo for Xp<T, I>where
T::Xp: TypeInfo + 'static,
Accumulator<T, I>: TypeInfo + 'static,
BlockNumberFor<T>: TypeInfo + 'static,
T: Config<I> + 'static,
I: 'static,
impl<T: Copy + Config<I>, I: Copy + 'static> Copy for Xp<T, I>
impl<T: Config<I>, I: 'static> DecodeWithMemTracking for Xp<T, I>where
T::Xp: DecodeWithMemTracking,
Accumulator<T, I>: DecodeWithMemTracking,
BlockNumberFor<T>: DecodeWithMemTracking,
impl<T: Config<I>, I: 'static> EncodeLike for Xp<T, I>where
T::Xp: Encode,
Accumulator<T, I>: Encode,
BlockNumberFor<T>: Encode,
impl<T: Config<I>, I: 'static> Eq for Xp<T, I>
Auto Trait Implementations§
impl<T, I> Freeze for Xp<T, I>
impl<T, I> RefUnwindSafe for Xp<T, I>where
<T as Config<I>>::Xp: RefUnwindSafe,
<<<T as Config>::Block as Block>::Header as Header>::Number: RefUnwindSafe,
<T as Config<I>>::Pulse: RefUnwindSafe,
impl<T, I> Send for Xp<T, I>
impl<T, I> Sync for Xp<T, I>
impl<T, I> Unpin for Xp<T, I>
impl<T, I> UnwindSafe for Xp<T, I>where
<T as Config<I>>::Xp: UnwindSafe,
<<<T as Config>::Block as Block>::Header as Header>::Number: UnwindSafe,
<T as Config<I>>::Pulse: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> CheckedConversion for T
impl<T> CheckedConversion for T
§fn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
fn checked_from<T>(t: T) -> Option<Self>where
Self: TryFrom<T>,
§fn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
fn checked_into<T>(self) -> Option<T>where
Self: TryInto<T>,
§impl<T> Clear for T
impl<T> Clear for T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> DecodeAll for Twhere
T: Decode,
impl<T> DecodeAll for Twhere
T: Decode,
§fn decode_all(input: &mut &[u8]) -> Result<T, Error>
fn decode_all(input: &mut &[u8]) -> Result<T, Error>
Self and consume all of the given input data. Read more§impl<T> DecodeLimit for Twhere
T: Decode,
impl<T> DecodeLimit for Twhere
T: Decode,
§impl<T> DecodeWithMemLimit for Twhere
T: DecodeWithMemTracking,
impl<T> DecodeWithMemLimit for Twhere
T: DecodeWithMemTracking,
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
§impl<T> Hashable for Twhere
T: Codec,
impl<T> Hashable for Twhere
T: Codec,
§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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 moreSource§impl<T, U, Tag> IntoTag<U, Tag> for Twhere
U: FromTag<T, Tag>,
Tag: DiscriminantTag,
impl<T, U, Tag> IntoTag<U, Tag> for Twhere
U: FromTag<T, Tag>,
Tag: DiscriminantTag,
§impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
impl<Src, Dest> IntoTuple<Dest> for Srcwhere
Dest: FromTuple<Src>,
fn into_tuple(self) -> Dest
§impl<T> IsType<T> for T
impl<T> IsType<T> for T
§impl<T, Outer> IsWrappedBy<Outer> for T
impl<T, Outer> IsWrappedBy<Outer> for T
§impl<T> KeyedVec for Twhere
T: Codec,
impl<T> KeyedVec for Twhere
T: Codec,
Source§impl<T, Time> Logging<Time> for Twhere
Time: Time,
impl<T, Time> Logging<Time> for Twhere
Time: Time,
Source§const FALLBACK_TARGET: &'static str = "routine"
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
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
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
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
Source§fn info(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
fn info(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
Source§fn warn(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
fn warn(
err: &Self::Logger,
timestamp: Timestamp,
target: Option<&str>,
fmt: Option<fn(Timestamp, &Self::Level, &str, &str) -> String>,
) -> Self::Loggerwhere
Self: Sized,
§impl<T> SaturatedConversion for T
impl<T> SaturatedConversion for T
§fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
fn saturated_from<T>(t: T) -> Selfwhere
Self: UniqueSaturatedFrom<T>,
§fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
fn saturated_into<T>(self) -> Twhere
Self: UniqueSaturatedInto<T>,
T. Read more§impl<T, U> TryIntoKey<U> for Twhere
U: TryFromKey<T>,
impl<T, U> TryIntoKey<U> for Twhere
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 Swhere
T: UncheckedFrom<S>,
impl<S, T> UncheckedInto<T> for Swhere
T: UncheckedFrom<S>,
§fn unchecked_into(self) -> T
fn unchecked_into(self) -> T
unchecked_from.§impl<T, S> UniqueSaturatedInto<T> for S
impl<T, S> UniqueSaturatedInto<T> for S
§fn unique_saturated_into(self) -> T
fn unique_saturated_into(self) -> T
T.