pub struct EpochCommittees {
non_epoch_committee: NonEpochCommittee,
state: HashMap<<SeqTypes as NodeType>::Epoch, EpochCommittee>,
randomized_committees: BTreeMap<<SeqTypes as NodeType>::Epoch, RandomizedCommittee<StakeTableEntry<PubKey>>>,
first_epoch: Option<<SeqTypes as NodeType>::Epoch>,
epoch_height: u64,
block_reward: Option<RewardAmount>,
fetcher: Arc<Fetcher>,
}
Expand description
Type to describe DA and Stake memberships
Fields§
§non_epoch_committee: NonEpochCommittee
Committee used when we’re in pre-epoch state
state: HashMap<<SeqTypes as NodeType>::Epoch, EpochCommittee>
Holds Stake table and da stake
randomized_committees: BTreeMap<<SeqTypes as NodeType>::Epoch, RandomizedCommittee<StakeTableEntry<PubKey>>>
Randomized committees, filled when we receive the DrbResult
first_epoch: Option<<SeqTypes as NodeType>::Epoch>
§epoch_height: u64
§block_reward: Option<RewardAmount>
§fetcher: Arc<Fetcher>
Implementations§
Source§impl EpochCommittees
impl EpochCommittees
pub fn first_epoch(&self) -> Option<<SeqTypes as NodeType>::Epoch>
pub fn fetcher(&self) -> &Fetcher
Sourceasync fn update_fixed_block_reward(
membership: Arc<RwLock<Self>>,
epoch: EpochNumber,
) -> Result<RewardAmount>
async fn update_fixed_block_reward( membership: Arc<RwLock<Self>>, epoch: EpochNumber, ) -> Result<RewardAmount>
Fetch the block reward and update it if its None.
We used a fixed block reward for version v3
Version v4 uses the dynamic block reward based
Assumes the stake table contract proxy address does not change
In the future, if we want to support updates to the stake table contract address via chain config,
or allow the contract to handle additional block reward calculation parameters (e.g., inflation, block time),
the fetch_block_reward
logic can be updated to support per-epoch rewards.
Initially, the block reward is zero if the node starts on pre-epoch version
but it is updated on the first call to add_epoch_root()
pub fn compute_block_reward( epoch: &EpochNumber, total_supply: U256, total_stake: U256, avg_block_time_ms: u64, ) -> Result<RewardAmount>
Sourceasync fn calculate_dynamic_block_reward(
&self,
epoch: &<SeqTypes as NodeType>::Epoch,
header: Header,
validators: &ValidatorMap,
) -> Result<RewardAmount>
async fn calculate_dynamic_block_reward( &self, epoch: &<SeqTypes as NodeType>::Epoch, header: Header, validators: &ValidatorMap, ) -> Result<RewardAmount>
Calculates the dynamic block reward for a given block header within an epoch.
The reward is based on a dynamic inflation rate computed from the current stake ratio (p),
where p = total_stake / total_supply
. The inflation function R(p) is defined piecewise:
- If
p <= 0.01
: R(p) = 0.03 / sqrt(2 * 0.01) - Else: R(p) = 0.03 / sqrt(2 * p)
Sourcefn insert_committee(
&mut self,
epoch: EpochNumber,
validators: ValidatorMap,
block_reward: Option<RewardAmount>,
hash: Option<StakeTableHash>,
)
fn insert_committee( &mut self, epoch: EpochNumber, validators: ValidatorMap, block_reward: Option<RewardAmount>, hash: Option<StakeTableHash>, )
Updates Self.stake_table
with stake_table for
Self.contract_address
at l1_block_height
. This is intended
to be called before calling self.stake()
so that
Self.stake_table
only needs to be updated once in a given
life-cycle but may be read from many times.
pub fn active_validators( &self, epoch: &<SeqTypes as NodeType>::Epoch, ) -> Result<ValidatorMap>
pub fn address( &self, epoch: &<SeqTypes as NodeType>::Epoch, bls_key: BLSPubKey, ) -> Result<Address>
pub fn get_validator_config( &self, epoch: &<SeqTypes as NodeType>::Epoch, key: BLSPubKey, ) -> Result<Validator<BLSPubKey>>
pub fn block_reward(&self, epoch: Option<EpochNumber>) -> Option<RewardAmount>
pub fn new_stake( committee_members: Vec<PeerConfig<SeqTypes>>, da_members: Vec<PeerConfig<SeqTypes>>, block_reward: Option<RewardAmount>, fetcher: Fetcher, epoch_height: u64, ) -> Self
pub async fn reload_stake(&mut self, limit: u64)
fn get_stake_table( &self, epoch: &Option<<SeqTypes as NodeType>::Epoch>, ) -> Option<Vec<PeerConfig<SeqTypes>>>
Trait Implementations§
Source§impl Clone for EpochCommittees
impl Clone for EpochCommittees
Source§fn clone(&self) -> EpochCommittees
fn clone(&self) -> EpochCommittees
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for EpochCommittees
impl Debug for EpochCommittees
Source§impl Membership<SeqTypes> for EpochCommittees
impl Membership<SeqTypes> for EpochCommittees
Source§fn stake_table(
&self,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> HSStakeTable<SeqTypes>
fn stake_table( &self, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> HSStakeTable<SeqTypes>
Get the stake table for the current view
Source§fn da_stake_table(
&self,
_epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> HSStakeTable<SeqTypes>
fn da_stake_table( &self, _epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> HSStakeTable<SeqTypes>
Get the stake table for the current view
Source§fn committee_members(
&self,
_view_number: <SeqTypes as NodeType>::View,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> BTreeSet<PubKey>
fn committee_members( &self, _view_number: <SeqTypes as NodeType>::View, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> BTreeSet<PubKey>
Get all members of the committee for the current view
Source§fn da_committee_members(
&self,
_view_number: <SeqTypes as NodeType>::View,
_epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> BTreeSet<PubKey>
fn da_committee_members( &self, _view_number: <SeqTypes as NodeType>::View, _epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> BTreeSet<PubKey>
Get all members of the committee for the current view
Source§fn stake(
&self,
pub_key: &PubKey,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> Option<PeerConfig<SeqTypes>>
fn stake( &self, pub_key: &PubKey, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> Option<PeerConfig<SeqTypes>>
Get the stake table entry for a public key
Source§fn da_stake(
&self,
pub_key: &PubKey,
_epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> Option<PeerConfig<SeqTypes>>
fn da_stake( &self, pub_key: &PubKey, _epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> Option<PeerConfig<SeqTypes>>
Get the DA stake table entry for a public key
Source§fn has_stake(
&self,
pub_key: &PubKey,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> bool
fn has_stake( &self, pub_key: &PubKey, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> bool
Check if a node has stake in the committee
Source§fn has_da_stake(
&self,
pub_key: &PubKey,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> bool
fn has_da_stake( &self, pub_key: &PubKey, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> bool
Check if a node has stake in the committee
Source§fn lookup_leader(
&self,
view_number: <SeqTypes as NodeType>::View,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> Result<PubKey, Self::Error>
fn lookup_leader( &self, view_number: <SeqTypes as NodeType>::View, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> Result<PubKey, Self::Error>
Returns the leader’s public key for a given view number and epoch.
If an epoch is provided and a randomized committee exists for that epoch, the leader is selected from the randomized committee. Otherwise, the leader is selected from the non-epoch committee.
§Arguments
view_number
- The view number to index into the committee.epoch
- The epoch for which to determine the leader. IfNone
, uses the non-epoch committee.
§Errors
Returns LeaderLookupError
if the epoch is before the first epoch or if the committee is missing.
Source§fn total_nodes(&self, epoch: Option<<SeqTypes as NodeType>::Epoch>) -> usize
fn total_nodes(&self, epoch: Option<<SeqTypes as NodeType>::Epoch>) -> usize
Get the total number of nodes in the committee
Source§fn da_total_nodes(&self, epoch: Option<<SeqTypes as NodeType>::Epoch>) -> usize
fn da_total_nodes(&self, epoch: Option<<SeqTypes as NodeType>::Epoch>) -> usize
Get the total number of DA nodes in the committee
Source§fn success_threshold(
&self,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> U256
fn success_threshold( &self, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> U256
Get the voting success threshold for the committee
Source§fn da_success_threshold(
&self,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> U256
fn da_success_threshold( &self, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> U256
Get the voting success threshold for the committee
Source§fn failure_threshold(
&self,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> U256
fn failure_threshold( &self, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> U256
Get the voting failure threshold for the committee
Source§fn upgrade_threshold(
&self,
epoch: Option<<SeqTypes as NodeType>::Epoch>,
) -> U256
fn upgrade_threshold( &self, epoch: Option<<SeqTypes as NodeType>::Epoch>, ) -> U256
Get the voting upgrade threshold for the committee
Source§async fn add_epoch_root(
membership: Arc<RwLock<Self>>,
epoch: <SeqTypes as NodeType>::Epoch,
block_header: Header,
) -> Result<()>
async fn add_epoch_root( membership: Arc<RwLock<Self>>, epoch: <SeqTypes as NodeType>::Epoch, block_header: Header, ) -> Result<()>
Adds the epoch committee and block reward for a given epoch, either by fetching from L1 or using local state if available. It also calculates and stores the block reward based on header version.
Source§fn has_randomized_stake_table(
&self,
epoch: <SeqTypes as NodeType>::Epoch,
) -> Result<bool>
fn has_randomized_stake_table( &self, epoch: <SeqTypes as NodeType>::Epoch, ) -> Result<bool>
Checks if the randomized stake table is available for the given epoch.
Returns Ok(true)
if a randomized committee exists for the specified epoch and
the epoch is not before the first epoch. Returns an error if first_epoch
is None
or if the provided epoch is before the first epoch.
§Arguments
epoch
- The epoch for which to check the presence of a randomized stake table.
§Errors
Returns an error if first_epoch
is None
or if epoch
is before first_epoch
.
Source§type Error = LeaderLookupError
type Error = LeaderLookupError
lookup_leader
.type StakeTableHash = StakeTableState
Source§fn new(
_committee_members: Vec<PeerConfig<SeqTypes>>,
_da_members: Vec<PeerConfig<SeqTypes>>,
) -> Self
fn new( _committee_members: Vec<PeerConfig<SeqTypes>>, _da_members: Vec<PeerConfig<SeqTypes>>, ) -> Self
Source§fn has_stake_table(&self, epoch: <SeqTypes as NodeType>::Epoch) -> bool
fn has_stake_table(&self, epoch: <SeqTypes as NodeType>::Epoch) -> bool
Source§async fn get_epoch_root(
membership: Arc<RwLock<Self>>,
block_height: u64,
epoch: <SeqTypes as NodeType>::Epoch,
) -> Result<Leaf2>
async fn get_epoch_root( membership: Arc<RwLock<Self>>, block_height: u64, epoch: <SeqTypes as NodeType>::Epoch, ) -> Result<Leaf2>
Source§async fn get_epoch_drb(
membership: Arc<RwLock<Self>>,
epoch: <SeqTypes as NodeType>::Epoch,
) -> Result<DrbResult>
async fn get_epoch_drb( membership: Arc<RwLock<Self>>, epoch: <SeqTypes as NodeType>::Epoch, ) -> Result<DrbResult>
Source§fn add_drb_result(
&mut self,
epoch: <SeqTypes as NodeType>::Epoch,
drb: DrbResult,
)
fn add_drb_result( &mut self, epoch: <SeqTypes as NodeType>::Epoch, drb: DrbResult, )
Source§fn set_first_epoch(
&mut self,
epoch: <SeqTypes as NodeType>::Epoch,
initial_drb_result: DrbResult,
)
fn set_first_epoch( &mut self, epoch: <SeqTypes as NodeType>::Epoch, initial_drb_result: DrbResult, )
Source§fn first_epoch(&self) -> Option<<SeqTypes as NodeType>::Epoch>
fn first_epoch(&self) -> Option<<SeqTypes as NodeType>::Epoch>
None
otherwiseSource§fn stake_table_hash(
&self,
epoch: <SeqTypes as NodeType>::Epoch,
) -> Option<StakeTableHash>
fn stake_table_hash( &self, epoch: <SeqTypes as NodeType>::Epoch, ) -> Option<StakeTableHash>
fn total_stake(&self, epoch: Option<<TYPES as NodeType>::Epoch>) -> Uint<256, 4>
fn total_da_stake( &self, epoch: Option<<TYPES as NodeType>::Epoch>, ) -> Uint<256, 4>
Auto Trait Implementations§
impl Freeze for EpochCommittees
impl !RefUnwindSafe for EpochCommittees
impl Send for EpochCommittees
impl Sync for EpochCommittees
impl Unpin for EpochCommittees
impl !UnwindSafe for EpochCommittees
Blanket Implementations§
§impl<T> ArchivePointee for T
impl<T> ArchivePointee for T
§type ArchivedMetadata = ()
type ArchivedMetadata = ()
§fn pointer_metadata(
_: &<T as ArchivePointee>::ArchivedMetadata,
) -> <T as Pointee>::Metadata
fn pointer_metadata( _: &<T as ArchivePointee>::ArchivedMetadata, ) -> <T as Pointee>::Metadata
§impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedExplicit<'a, E> for Twhere
T: 'a,
§impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
impl<'a, T, E> AsTaggedImplicit<'a, E> for Twhere
T: 'a,
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Conv for T
impl<T> Conv for T
§impl<F, W, T, D> Deserialize<With<T, W>, D> for F
impl<F, W, T, D> Deserialize<With<T, W>, D> for F
§fn deserialize(
&self,
deserializer: &mut D,
) -> Result<With<T, W>, <D as Fallible>::Error>
fn deserialize( &self, deserializer: &mut D, ) -> Result<With<T, W>, <D as Fallible>::Error>
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.§impl<T> DowncastSync for T
impl<T> DowncastSync for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self
to use its Binary
implementation when Debug
-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self
to use its Display
implementation when
Debug
-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self
to use its LowerExp
implementation when
Debug
-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self
to use its LowerHex
implementation when
Debug
-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self
to use its Octal
implementation when Debug
-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self
to use its Pointer
implementation when
Debug
-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self
to use its UpperExp
implementation when
Debug
-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self
to use its UpperHex
implementation when
Debug
-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§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> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§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 more§impl<T> LayoutRaw for T
impl<T> LayoutRaw for T
§fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
fn layout_raw(_: <T as Pointee>::Metadata) -> Result<Layout, LayoutError>
§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
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) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
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
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
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
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
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
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self
, then passes self.deref()
into the pipe function.§impl<T> Pointable for T
impl<T> Pointable for T
§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B>
of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B>
of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R>
view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R>
view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target
of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target
of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap()
only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut()
only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.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
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut()
only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.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
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut()
only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref()
only in debug builds, and is erased in release
builds.