pub struct CandidateMetadata<Balance> {
    pub bond: Balance,
    pub delegation_count: u32,
    pub total_counted: Balance,
    pub lowest_top_delegation_amount: Balance,
    pub highest_bottom_delegation_amount: Balance,
    pub lowest_bottom_delegation_amount: Balance,
    pub top_capacity: CapacityStatus,
    pub bottom_capacity: CapacityStatus,
    pub request: Option<CandidateBondLessRequest<Balance>>,
    pub status: CollatorStatus,
}
Expand description

All candidate info except the top and bottom delegations

Fields§

§bond: Balance

This candidate’s self bond amount

§delegation_count: u32

Total number of delegations to this candidate

§total_counted: Balance

Self bond + sum of top delegations

§lowest_top_delegation_amount: Balance

The smallest top delegation amount

§highest_bottom_delegation_amount: Balance

The highest bottom delegation amount

§lowest_bottom_delegation_amount: Balance

The smallest bottom delegation amount

§top_capacity: CapacityStatus

Capacity status for top delegations

§bottom_capacity: CapacityStatus

Capacity status for bottom delegations

§request: Option<CandidateBondLessRequest<Balance>>

Maximum 1 pending request to decrease candidate self bond at any given time

§status: CollatorStatus

Current status of the collator

Implementations§

source§

impl<Balance: Copy + Zero + PartialOrd + AddAssign + SubAssign + Sub<Output = Balance> + Debug + Saturating> CandidateMetadata<Balance>

source

pub fn new(bond: Balance) -> Self

source

pub fn is_active(&self) -> bool

source

pub fn is_leaving(&self) -> bool

source

pub fn schedule_leave<T: Config>( &mut self ) -> Result<(RoundIndex, RoundIndex), DispatchError>

source

pub fn can_leave<T: Config>(&self) -> DispatchResult

source

pub fn go_offline(&mut self)

source

pub fn go_online(&mut self)

source

pub fn bond_more<T: Config>( &mut self, who: T::AccountId, more: Balance ) -> DispatchResult
where BalanceOf<T>: From<Balance>,

source

pub fn bond_less<T: Config>(&mut self, who: T::AccountId, amount: Balance)
where BalanceOf<T>: From<Balance>,

source

pub fn schedule_bond_less<T: Config>( &mut self, less: Balance ) -> Result<RoundIndex, DispatchError>
where BalanceOf<T>: Into<Balance>,

Schedule executable decrease of collator candidate self bond Returns the round at which the collator can execute the pending request

source

pub fn execute_bond_less<T: Config>( &mut self, who: T::AccountId ) -> DispatchResult
where BalanceOf<T>: From<Balance>,

Execute pending request to decrease the collator self bond Returns the event to be emitted

source

pub fn cancel_bond_less<T: Config>( &mut self, who: T::AccountId ) -> DispatchResult
where BalanceOf<T>: From<Balance>,

Cancel candidate bond less request

source

pub fn reset_top_data<T: Config>( &mut self, candidate: T::AccountId, top_delegations: &Delegations<T::AccountId, BalanceOf<T>> )
where BalanceOf<T>: Into<Balance> + From<Balance>,

Reset top delegations metadata

source

pub fn reset_bottom_data<T: Config>( &mut self, bottom_delegations: &Delegations<T::AccountId, BalanceOf<T>> )
where BalanceOf<T>: Into<Balance>,

Reset bottom delegations metadata

source

pub fn add_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegation: Bond<T::AccountId, BalanceOf<T>> ) -> Result<(DelegatorAdded<Balance>, Option<Balance>), DispatchError>
where BalanceOf<T>: Into<Balance> + From<Balance>,

Add delegation Returns whether delegator was added and an optional negative total counted remainder for if a bottom delegation was kicked MUST ensure no delegation exists for this candidate in the DelegatorState before call

source

pub fn add_top_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegation: Bond<T::AccountId, BalanceOf<T>> ) -> Option<Balance>
where BalanceOf<T>: Into<Balance> + From<Balance>,

Add delegation to top delegation Returns Option<negative_total_staked_remainder> Only call if lowest top delegation is less than delegation.amount || !top_full

source

pub fn add_bottom_delegation<T: Config>( &mut self, bumped_from_top: bool, candidate: &T::AccountId, delegation: Bond<T::AccountId, BalanceOf<T>> )
where BalanceOf<T>: Into<Balance> + From<Balance>,

Add delegation to bottom delegations Check before call that if capacity is full, inserted delegation is higher than lowest bottom delegation (and if so, need to adjust the total storage item) CALLER MUST ensure(lowest_bottom_to_be_kicked.amount < delegation.amount)

source

pub fn rm_delegation_if_exists<T: Config>( &mut self, candidate: &T::AccountId, delegator: T::AccountId, amount: Balance ) -> Result<bool, DispatchError>
where BalanceOf<T>: Into<Balance> + From<Balance>,

Remove delegation Removes from top if amount is above lowest top or top is not full Return Ok(if_total_counted_changed)

source

pub fn rm_top_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegator: T::AccountId ) -> Result<bool, DispatchError>
where BalanceOf<T>: Into<Balance> + From<Balance>,

Remove top delegation, bumps top bottom delegation if exists

source

pub fn rm_bottom_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegator: T::AccountId ) -> Result<bool, DispatchError>
where BalanceOf<T>: Into<Balance>,

Remove bottom delegation Returns if_total_counted_changed: bool

source

pub fn increase_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegator: T::AccountId, bond: BalanceOf<T>, more: BalanceOf<T> ) -> Result<bool, DispatchError>
where BalanceOf<T>: Into<Balance> + From<Balance>,

Increase delegation amount

source

pub fn increase_top_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegator: T::AccountId, more: BalanceOf<T> ) -> Result<bool, DispatchError>
where BalanceOf<T>: Into<Balance> + From<Balance>,

Increase top delegation

source

pub fn increase_bottom_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegator: T::AccountId, bond: BalanceOf<T>, more: BalanceOf<T> ) -> Result<bool, DispatchError>
where BalanceOf<T>: Into<Balance> + From<Balance>,

Increase bottom delegation

source

pub fn decrease_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegator: T::AccountId, bond: Balance, less: BalanceOf<T> ) -> Result<bool, DispatchError>
where BalanceOf<T>: Into<Balance> + From<Balance>,

Decrease delegation

source

pub fn decrease_top_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegator: T::AccountId, bond: BalanceOf<T>, less: BalanceOf<T> ) -> Result<bool, DispatchError>
where BalanceOf<T>: Into<Balance> + From<Balance>,

Decrease top delegation

source

pub fn decrease_bottom_delegation<T: Config>( &mut self, candidate: &T::AccountId, delegator: T::AccountId, less: BalanceOf<T> ) -> Result<bool, DispatchError>
where BalanceOf<T>: Into<Balance>,

Decrease bottom delegation

Trait Implementations§

source§

impl<Balance> Debug for CandidateMetadata<Balance>
where Balance: Debug,

source§

fn fmt(&self, fmt: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl<Balance> Decode for CandidateMetadata<Balance>
where Balance: Decode, Option<CandidateBondLessRequest<Balance>>: Decode,

source§

fn decode<__CodecInputEdqy: Input>( __codec_input_edqy: &mut __CodecInputEdqy ) -> Result<Self, Error>

Attempt to deserialise the value from input.
§

fn decode_into<I>( input: &mut I, dst: &mut MaybeUninit<Self> ) -> Result<DecodeFinished, Error>
where I: Input,

Attempt to deserialize the value from input into a pre-allocated piece of memory. Read more
§

fn skip<I>(input: &mut I) -> Result<(), Error>
where I: Input,

Attempt to skip the encoded value from input. Read more
§

fn encoded_fixed_size() -> Option<usize>

Returns the fixed encoded size of the type. Read more
source§

impl<Balance> Encode for CandidateMetadata<Balance>
where Balance: Encode, Option<CandidateBondLessRequest<Balance>>: Encode,

source§

fn size_hint(&self) -> usize

If possible give a hint of expected size of the encoding. Read more
source§

fn encode_to<__CodecOutputEdqy: Output + ?Sized>( &self, __codec_dest_edqy: &mut __CodecOutputEdqy )

Convert self to a slice and append it to the destination.
§

fn encode(&self) -> Vec<u8>

Convert self to an owned vector.
§

fn using_encoded<R, F>(&self, f: F) -> R
where F: FnOnce(&[u8]) -> R,

Convert self to a slice and then invoke the given closure with it.
§

fn encoded_size(&self) -> usize

Calculates the encoded size. Read more
source§

impl<Balance> TypeInfo for CandidateMetadata<Balance>
where Balance: TypeInfo + 'static, Option<CandidateBondLessRequest<Balance>>: TypeInfo + 'static,

§

type Identity = CandidateMetadata<Balance>

The type identifying for which type info is provided. Read more
source§

fn type_info() -> Type

Returns the static type identifier for Self.
source§

impl<Balance> EncodeLike for CandidateMetadata<Balance>
where Balance: Encode, Option<CandidateBondLessRequest<Balance>>: Encode,

Auto Trait Implementations§

§

impl<Balance> RefUnwindSafe for CandidateMetadata<Balance>
where Balance: RefUnwindSafe,

§

impl<Balance> Send for CandidateMetadata<Balance>
where Balance: Send,

§

impl<Balance> Sync for CandidateMetadata<Balance>
where Balance: Sync,

§

impl<Balance> Unpin for CandidateMetadata<Balance>
where Balance: Unpin,

§

impl<Balance> UnwindSafe for CandidateMetadata<Balance>
where Balance: 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
§

impl<T> Conv for T

§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
§

impl<T> DecodeAll for T
where T: Decode,

§

fn decode_all(input: &mut &[u8]) -> Result<T, Error>

Decode Self and consume all of the given input data. Read more
§

impl<T> DecodeLimit for T
where T: Decode,

§

fn decode_all_with_depth_limit( limit: u32, input: &mut &[u8] ) -> Result<T, Error>

Decode Self and consume all of the given input data. Read more
§

fn decode_with_depth_limit<I>(limit: u32, input: &mut I) -> Result<T, Error>
where I: Input,

Decode Self with the given maximum recursion depth and advance input by the number of bytes consumed. Read more
§

impl<T> FmtForward for T

§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

§

impl<T> Hashable for T
where T: Codec,

§

fn blake2_128(&self) -> [u8; 16]

§

fn blake2_256(&self) -> [u8; 32]

§

fn blake2_128_concat(&self) -> Vec<u8>

§

fn twox_128(&self) -> [u8; 16]

§

fn twox_256(&self) -> [u8; 32]

§

fn twox_64_concat(&self) -> Vec<u8>

§

fn identity(&self) -> Vec<u8>

§

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

§

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.

§

impl<T> KeyedVec for T
where T: Codec,

§

fn to_keyed_vec(&self, prepend_key: &[u8]) -> Vec<u8>

Return an encoding of Self prepended by given slice.
source§

impl<Src, Dst> LossyInto<Dst> for Src
where Dst: LossyFrom<Src>,

source§

fn lossy_into(self) -> Dst

Performs the conversion.
§

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

§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
§

impl<T> Pointable for T

§

const ALIGN: usize = _

The alignment of pointer.
§

type Init = T

The type for initializers.
§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> Same for T

§

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
§

impl<T> Tap for T

§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
§

impl<T> TryConv for T

§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
source§

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

§

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>,

§

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
§

impl<S> Codec for S
where S: Decode + Encode,

§

impl<T> EncodeLike<&&T> for T
where T: Encode,

§

impl<T> EncodeLike<&T> for T
where T: Encode,

§

impl<T> EncodeLike<&mut T> for T
where T: Encode,

§

impl<T> EncodeLike<Arc<T>> for T
where T: Encode,

§

impl<T> EncodeLike<Box<T>> for T
where T: Encode,

§

impl<T> EncodeLike<Rc<T>> for T
where T: Encode,

§

impl<S> FullCodec for S
where S: Decode + FullEncode,

§

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

§

impl<T> JsonSchemaMaybe for T

§

impl<T> MaybeDebug for T
where T: Debug,

§

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

§

impl<T> StaticTypeInfo for T
where T: TypeInfo + 'static,