Struct ibc_test_framework::prelude::ForeignClient
source · [−]pub struct ForeignClient<DstChain, SrcChain> where
DstChain: ChainHandle,
SrcChain: ChainHandle, {
pub id: ClientId,
pub dst_chain: DstChain,
pub src_chain: SrcChain,
}Fields
id: ClientIdThe identifier of this client. The host chain determines this id upon client creation, so we may be using the default value temporarily.
dst_chain: DstChainA handle to the chain hosting this client, i.e., destination chain.
src_chain: SrcChainA handle to the chain whose headers this client is verifying, aka the source chain.
Implementations
sourceimpl<DstChain, SrcChain> ForeignClient<DstChain, SrcChain> where
DstChain: ChainHandle,
SrcChain: ChainHandle,
impl<DstChain, SrcChain> ForeignClient<DstChain, SrcChain> where
DstChain: ChainHandle,
SrcChain: ChainHandle,
sourcepub fn new(
dst_chain: DstChain,
src_chain: SrcChain
) -> Result<ForeignClient<DstChain, SrcChain>, ForeignClientError>
pub fn new(
dst_chain: DstChain,
src_chain: SrcChain
) -> Result<ForeignClient<DstChain, SrcChain>, ForeignClientError>
Creates a new foreign client on dst_chain. Blocks until the client is created, or
an error occurs.
Post-condition: dst_chain hosts an IBC client for src_chain.
pub fn restore(
id: ClientId,
dst_chain: DstChain,
src_chain: SrcChain
) -> ForeignClient<DstChain, SrcChain>
sourcepub fn find(
expected_target_chain: SrcChain,
host_chain: DstChain,
client_id: &ClientId
) -> Result<ForeignClient<DstChain, SrcChain>, ForeignClientError>
pub fn find(
expected_target_chain: SrcChain,
host_chain: DstChain,
client_id: &ClientId
) -> Result<ForeignClient<DstChain, SrcChain>, ForeignClientError>
Queries host_chain to verify that a client with identifier client_id exists.
If the client does not exist, returns an error. If the client exists, cross-checks that the
identifier for the target chain of this client (i.e., the chain whose headers this client is
verifying) is consistent with expected_target_chain, and if so, return a new
ForeignClient representing this client.
pub fn upgrade(&self) -> Result<Vec<IbcEvent, Global>, ForeignClientError>
sourcepub fn src_chain(&self) -> SrcChain
pub fn src_chain(&self) -> SrcChain
Returns a handle to the chain whose headers this client is sourcing (the source chain).
pub fn id(&self) -> &ClientId
sourcepub fn build_create_client(
&self,
options: CreateOptions
) -> Result<MsgCreateAnyClient, ForeignClientError>
pub fn build_create_client(
&self,
options: CreateOptions
) -> Result<MsgCreateAnyClient, ForeignClientError>
Lower-level interface for preparing a message to create a client.
sourcepub fn build_create_client_and_send(
&self,
options: CreateOptions
) -> Result<IbcEvent, ForeignClientError>
pub fn build_create_client_and_send(
&self,
options: CreateOptions
) -> Result<IbcEvent, ForeignClientError>
Returns the identifier of the newly created client.
pub fn validated_client_state(
&self
) -> Result<(AnyClientState, Option<Duration>), ForeignClientError>
pub fn is_expired_or_frozen(&self) -> bool
pub fn refresh(
&mut self
) -> Result<Option<Vec<IbcEvent, Global>>, ForeignClientError>
sourcepub fn build_update_client(
&self,
target_height: Height
) -> Result<Vec<Any, Global>, ForeignClientError>
pub fn build_update_client(
&self,
target_height: Height
) -> Result<Vec<Any, Global>, ForeignClientError>
Wrapper for build_update_client_with_trusted.
sourcepub fn build_update_client_with_trusted(
&self,
target_height: Height,
trusted_height: Height
) -> Result<Vec<Any, Global>, ForeignClientError>
pub fn build_update_client_with_trusted(
&self,
target_height: Height,
trusted_height: Height
) -> Result<Vec<Any, Global>, ForeignClientError>
Returns a vector with a message for updating the client to height target_height.
If the client already stores a consensus state for this height, returns an empty vector.
pub fn build_latest_update_client_and_send(
&self
) -> Result<Vec<IbcEvent, Global>, ForeignClientError>
pub fn build_update_client_and_send(
&self,
height: Height,
trusted_height: Height
) -> Result<Vec<IbcEvent, Global>, ForeignClientError>
sourcepub fn update(&self) -> Result<(), ForeignClientError>
pub fn update(&self) -> Result<(), ForeignClientError>
Attempts to update a client using header from the latest height of its source chain.
sourcepub fn update_client_event(
&self,
consensus_height: Height
) -> Result<Option<UpdateClient>, ForeignClientError>
pub fn update_client_event(
&self,
consensus_height: Height
) -> Result<Option<UpdateClient>, ForeignClientError>
Retrieves the client update event that was emitted when a consensus state at the specified height was created on chain. It is possible that the event cannot be retrieved if the information is not yet available on the full node. To handle this the query is retried a few times.
sourcepub fn detect_misbehaviour(
&self,
update: Option<UpdateClient>
) -> Result<Option<MisbehaviourEvidence>, ForeignClientError>
pub fn detect_misbehaviour(
&self,
update: Option<UpdateClient>
) -> Result<Option<MisbehaviourEvidence>, ForeignClientError>
Checks for evidence of misbehaviour.
The check starts with and update_event emitted by chain B (dst_chain) for a client update
with a header from chain A (src_chain). The algorithm goes backwards through the headers
until it gets to the first misbehaviour.
The following cases are covered:
1 - fork:
Assumes at least one consensus state before the fork point exists.
Let existing consensus states on chain B be: [Sn,.., Sf, Sf-1, S0] with Sf-1 being
the most recent state before fork.
Chain A is queried for a header Hf' at Sf.height and if it is different than the Hf
in the event for the client update (the one that has generated Sf on chain), then the two
headers are included in the evidence and submitted.
Note that in this case the headers are different but have the same height.
2 - BFT time violation for unavailable header (a.k.a. Future Lunatic Attack or FLA):
Some header with a height that is higher than the latest
height on A has been accepted and a consensus state was created on B. Note that this implies
that the timestamp of this header must be within the clock_drift of the client.
Assume the client on B has been updated with h2(not present on/ produced by chain A)
and it has a timestamp of t2 that is at most clock_drift in the future.
Then the latest header from A is fetched, let it be h1, with a timestamp of t1.
If t1 >= t2 then evidence of misbehavior is submitted to A.
3 - BFT time violation for existing headers (TODO): Ensure that consensus state times are monotonically increasing with height.
Other notes:
- the algorithm builds misbehavior at each consensus height, starting with the highest height assuming the previous one is trusted. It submits the first constructed evidence (the one with the highest height)
- a lot of the logic here is derived from the behavior of the only implemented client (ics07-tendermint) and might not be general enough.
pub fn detect_misbehaviour_and_submit_evidence(
&self,
update_event: Option<UpdateClient>
) -> MisbehaviourResults
pub fn map_chain<DstChain2, SrcChain2>(
self,
map_dst: impl Fn(DstChain) -> DstChain2,
map_src: impl Fn(SrcChain) -> SrcChain2
) -> ForeignClient<DstChain2, SrcChain2> where
DstChain2: ChainHandle,
SrcChain2: ChainHandle,
Trait Implementations
sourceimpl<DstChain, SrcChain> Clone for ForeignClient<DstChain, SrcChain> where
DstChain: Clone + ChainHandle,
SrcChain: Clone + ChainHandle,
impl<DstChain, SrcChain> Clone for ForeignClient<DstChain, SrcChain> where
DstChain: Clone + ChainHandle,
SrcChain: Clone + ChainHandle,
sourcefn clone(&self) -> ForeignClient<DstChain, SrcChain>
fn clone(&self) -> ForeignClient<DstChain, SrcChain>
Returns a copy of the value. Read more
1.0.0 · sourcefn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
Performs copy-assignment from source. Read more
sourceimpl<DstChain, SrcChain> Debug for ForeignClient<DstChain, SrcChain> where
DstChain: Debug + ChainHandle,
SrcChain: Debug + ChainHandle,
impl<DstChain, SrcChain> Debug for ForeignClient<DstChain, SrcChain> where
DstChain: Debug + ChainHandle,
SrcChain: Debug + ChainHandle,
sourceimpl<DstChain, SrcChain> Display for ForeignClient<DstChain, SrcChain> where
DstChain: ChainHandle,
SrcChain: ChainHandle,
impl<DstChain, SrcChain> Display for ForeignClient<DstChain, SrcChain> where
DstChain: ChainHandle,
SrcChain: ChainHandle,
Used in Output messages.
Provides a concise description of a ForeignClient,
using the format:
{CHAIN-ID} -> {CHAIN-ID}:{CLIENT}
where the first chain identifier is for the source
chain, and the second chain identifier is the
destination (which hosts the client) chain.
sourceimpl<DstChain: ChainHandle, SrcChain: ChainHandle> TaggedForeignClientExt<DstChain, SrcChain> for ForeignClient<DstChain, SrcChain>
impl<DstChain: ChainHandle, SrcChain: ChainHandle> TaggedForeignClientExt<DstChain, SrcChain> for ForeignClient<DstChain, SrcChain>
sourcefn tagged_src_chain_id(&self) -> TaggedChainId<SrcChain>
fn tagged_src_chain_id(&self) -> TaggedChainId<SrcChain>
Get the source chain ID. Read more
sourcefn tagged_dst_chain_id(&self) -> TaggedChainId<DstChain>
fn tagged_dst_chain_id(&self) -> TaggedChainId<DstChain>
Get the destination chain ID. Read more
sourcefn tagged_client_id(&self) -> TaggedClientIdRef<'_, DstChain, SrcChain>
fn tagged_client_id(&self) -> TaggedClientIdRef<'_, DstChain, SrcChain>
Get the client ID of the destination chain that corresponds to the source chain. Read more
Auto Trait Implementations
impl<DstChain, SrcChain> RefUnwindSafe for ForeignClient<DstChain, SrcChain> where
DstChain: RefUnwindSafe,
SrcChain: RefUnwindSafe,
impl<DstChain, SrcChain> Send for ForeignClient<DstChain, SrcChain>
impl<DstChain, SrcChain> Sync for ForeignClient<DstChain, SrcChain>
impl<DstChain, SrcChain> Unpin for ForeignClient<DstChain, SrcChain> where
DstChain: Unpin,
SrcChain: Unpin,
impl<DstChain, SrcChain> UnwindSafe for ForeignClient<DstChain, SrcChain> where
DstChain: UnwindSafe,
SrcChain: UnwindSafe,
Blanket Implementations
impl<T> AsAny for T where
T: Any,
impl<T> AsAny for T where
T: Any,
fn as_mut_any(&mut self) -> &mut (dyn Any + 'static)
fn as_mut_any(&mut self) -> &mut (dyn Any + 'static)
Borrow this concrete type as a &mut dyn Any
sourceimpl<T> BorrowMut<T> for T where
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
const: unstable · sourcefn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more
impl<T> FutureExt for T
impl<T> FutureExt for T
fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_context(self, otel_cx: Context) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
fn with_current_context(self) -> WithContext<Self>
sourceimpl<T> Instrument for T
impl<T> Instrument for T
sourcefn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
sourcefn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
sourceimpl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
sourcefn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
Wrap the input message T in a tonic::Request
impl<D> OwoColorize for D
impl<D> OwoColorize for D
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self> where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self> where
C: Color,
Set the foreground color generically Read more
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self> where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self> where
C: Color,
Set the background color generically. Read more
fn black(&'a self) -> FgColorDisplay<'a, Black, Self>
fn black(&'a self) -> FgColorDisplay<'a, Black, Self>
Change the foreground color to black
fn on_black(&'a self) -> BgColorDisplay<'a, Black, Self>
fn on_black(&'a self) -> BgColorDisplay<'a, Black, Self>
Change the background color to black
fn red(&'a self) -> FgColorDisplay<'a, Red, Self>
fn red(&'a self) -> FgColorDisplay<'a, Red, Self>
Change the foreground color to red
fn on_red(&'a self) -> BgColorDisplay<'a, Red, Self>
fn on_red(&'a self) -> BgColorDisplay<'a, Red, Self>
Change the background color to red
fn green(&'a self) -> FgColorDisplay<'a, Green, Self>
fn green(&'a self) -> FgColorDisplay<'a, Green, Self>
Change the foreground color to green
fn on_green(&'a self) -> BgColorDisplay<'a, Green, Self>
fn on_green(&'a self) -> BgColorDisplay<'a, Green, Self>
Change the background color to green
fn yellow(&'a self) -> FgColorDisplay<'a, Yellow, Self>
fn yellow(&'a self) -> FgColorDisplay<'a, Yellow, Self>
Change the foreground color to yellow
fn on_yellow(&'a self) -> BgColorDisplay<'a, Yellow, Self>
fn on_yellow(&'a self) -> BgColorDisplay<'a, Yellow, Self>
Change the background color to yellow
fn blue(&'a self) -> FgColorDisplay<'a, Blue, Self>
fn blue(&'a self) -> FgColorDisplay<'a, Blue, Self>
Change the foreground color to blue
fn on_blue(&'a self) -> BgColorDisplay<'a, Blue, Self>
fn on_blue(&'a self) -> BgColorDisplay<'a, Blue, Self>
Change the background color to blue
fn magenta(&'a self) -> FgColorDisplay<'a, Magenta, Self>
fn magenta(&'a self) -> FgColorDisplay<'a, Magenta, Self>
Change the foreground color to magenta
fn on_magenta(&'a self) -> BgColorDisplay<'a, Magenta, Self>
fn on_magenta(&'a self) -> BgColorDisplay<'a, Magenta, Self>
Change the background color to magenta
fn purple(&'a self) -> FgColorDisplay<'a, Magenta, Self>
fn purple(&'a self) -> FgColorDisplay<'a, Magenta, Self>
Change the foreground color to purple
fn on_purple(&'a self) -> BgColorDisplay<'a, Magenta, Self>
fn on_purple(&'a self) -> BgColorDisplay<'a, Magenta, Self>
Change the background color to purple
fn cyan(&'a self) -> FgColorDisplay<'a, Cyan, Self>
fn cyan(&'a self) -> FgColorDisplay<'a, Cyan, Self>
Change the foreground color to cyan
fn on_cyan(&'a self) -> BgColorDisplay<'a, Cyan, Self>
fn on_cyan(&'a self) -> BgColorDisplay<'a, Cyan, Self>
Change the background color to cyan
fn white(&'a self) -> FgColorDisplay<'a, White, Self>
fn white(&'a self) -> FgColorDisplay<'a, White, Self>
Change the foreground color to white
fn on_white(&'a self) -> BgColorDisplay<'a, White, Self>
fn on_white(&'a self) -> BgColorDisplay<'a, White, Self>
Change the background color to white
fn default_color(&'a self) -> FgColorDisplay<'a, Default, Self>
fn default_color(&'a self) -> FgColorDisplay<'a, Default, Self>
Change the foreground color to the terminal default
fn on_default_color(&'a self) -> BgColorDisplay<'a, Default, Self>
fn on_default_color(&'a self) -> BgColorDisplay<'a, Default, Self>
Change the background color to the terminal default
fn bright_black(&'a self) -> FgColorDisplay<'a, BrightBlack, Self>
fn bright_black(&'a self) -> FgColorDisplay<'a, BrightBlack, Self>
Change the foreground color to bright black
fn on_bright_black(&'a self) -> BgColorDisplay<'a, BrightBlack, Self>
fn on_bright_black(&'a self) -> BgColorDisplay<'a, BrightBlack, Self>
Change the background color to bright black
fn bright_red(&'a self) -> FgColorDisplay<'a, BrightRed, Self>
fn bright_red(&'a self) -> FgColorDisplay<'a, BrightRed, Self>
Change the foreground color to bright red
fn on_bright_red(&'a self) -> BgColorDisplay<'a, BrightRed, Self>
fn on_bright_red(&'a self) -> BgColorDisplay<'a, BrightRed, Self>
Change the background color to bright red
fn bright_green(&'a self) -> FgColorDisplay<'a, BrightGreen, Self>
fn bright_green(&'a self) -> FgColorDisplay<'a, BrightGreen, Self>
Change the foreground color to bright green
fn on_bright_green(&'a self) -> BgColorDisplay<'a, BrightGreen, Self>
fn on_bright_green(&'a self) -> BgColorDisplay<'a, BrightGreen, Self>
Change the background color to bright green
fn bright_yellow(&'a self) -> FgColorDisplay<'a, BrightYellow, Self>
fn bright_yellow(&'a self) -> FgColorDisplay<'a, BrightYellow, Self>
Change the foreground color to bright yellow
fn on_bright_yellow(&'a self) -> BgColorDisplay<'a, BrightYellow, Self>
fn on_bright_yellow(&'a self) -> BgColorDisplay<'a, BrightYellow, Self>
Change the background color to bright yellow
fn bright_blue(&'a self) -> FgColorDisplay<'a, BrightBlue, Self>
fn bright_blue(&'a self) -> FgColorDisplay<'a, BrightBlue, Self>
Change the foreground color to bright blue
fn on_bright_blue(&'a self) -> BgColorDisplay<'a, BrightBlue, Self>
fn on_bright_blue(&'a self) -> BgColorDisplay<'a, BrightBlue, Self>
Change the background color to bright blue
fn bright_magenta(&'a self) -> FgColorDisplay<'a, BrightMagenta, Self>
fn bright_magenta(&'a self) -> FgColorDisplay<'a, BrightMagenta, Self>
Change the foreground color to bright magenta
fn on_bright_magenta(&'a self) -> BgColorDisplay<'a, BrightMagenta, Self>
fn on_bright_magenta(&'a self) -> BgColorDisplay<'a, BrightMagenta, Self>
Change the background color to bright magenta
fn bright_purple(&'a self) -> FgColorDisplay<'a, BrightMagenta, Self>
fn bright_purple(&'a self) -> FgColorDisplay<'a, BrightMagenta, Self>
Change the foreground color to bright purple
fn on_bright_purple(&'a self) -> BgColorDisplay<'a, BrightMagenta, Self>
fn on_bright_purple(&'a self) -> BgColorDisplay<'a, BrightMagenta, Self>
Change the background color to bright purple
fn bright_cyan(&'a self) -> FgColorDisplay<'a, BrightCyan, Self>
fn bright_cyan(&'a self) -> FgColorDisplay<'a, BrightCyan, Self>
Change the foreground color to bright cyan
fn on_bright_cyan(&'a self) -> BgColorDisplay<'a, BrightCyan, Self>
fn on_bright_cyan(&'a self) -> BgColorDisplay<'a, BrightCyan, Self>
Change the background color to bright cyan
fn bright_white(&'a self) -> FgColorDisplay<'a, BrightWhite, Self>
fn bright_white(&'a self) -> FgColorDisplay<'a, BrightWhite, Self>
Change the foreground color to bright white
fn on_bright_white(&'a self) -> BgColorDisplay<'a, BrightWhite, Self>
fn on_bright_white(&'a self) -> BgColorDisplay<'a, BrightWhite, Self>
Change the background color to bright white
fn bold(&'a self) -> BoldDisplay<'a, Self>
fn bold(&'a self) -> BoldDisplay<'a, Self>
Make the text bold
fn dimmed(&'a self) -> DimDisplay<'a, Self>
fn dimmed(&'a self) -> DimDisplay<'a, Self>
Make the text dim
fn italic(&'a self) -> ItalicDisplay<'a, Self>
fn italic(&'a self) -> ItalicDisplay<'a, Self>
Make the text italicized
fn underline(&'a self) -> UnderlineDisplay<'a, Self>
fn underline(&'a self) -> UnderlineDisplay<'a, Self>
Make the text italicized
fn blink(&'a self) -> BlinkDisplay<'a, Self>
fn blink(&'a self) -> BlinkDisplay<'a, Self>
Make the text blink
fn blink_fast(&'a self) -> BlinkFastDisplay<'a, Self>
fn blink_fast(&'a self) -> BlinkFastDisplay<'a, Self>
Make the text blink (but fast!)
fn reversed(&'a self) -> ReversedDisplay<'a, Self>
fn reversed(&'a self) -> ReversedDisplay<'a, Self>
Swap the foreground and background colors
Hide the text
fn strikethrough(&'a self) -> StrikeThroughDisplay<'a, Self>
fn strikethrough(&'a self) -> StrikeThroughDisplay<'a, Self>
Cross out the text
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self> where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self> where
Color: DynColor,
Set the foreground color at runtime. Only use if you do not know which color will be used at
compile-time. If the color is constant, use either OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read more
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self> where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self> where
Color: DynColor,
Set the background color at runtime. Only use if you do not know what color to use at
compile-time. If the color is constant, use either OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more
fn fg_rgb<const R: u8, const G: u8, const B: u8>(
&self
) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn fg_rgb<const R: u8, const G: u8, const B: u8>(
&self
) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>
Set the foreground color to a specific RGB value.
fn bg_rgb<const R: u8, const G: u8, const B: u8>(
&self
) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
fn bg_rgb<const R: u8, const G: u8, const B: u8>(
&self
) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>
Set the background color to a specific RGB value.
fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>
Sets the foreground color to an RGB value.
fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>
Sets the background color to an RGB value.
sourceimpl<T> SectionExt for T where
T: 'static + Display + Send + Sync,
impl<T> SectionExt for T where
T: 'static + Display + Send + Sync,
sourceimpl<T> ToOwned for T where
T: Clone,
impl<T> ToOwned for T where
T: Clone,
type Owned = T
type Owned = T
The resulting type after obtaining ownership.
sourcefn clone_into(&self, target: &mut T)
fn clone_into(&self, target: &mut T)
toowned_clone_into)Uses borrowed data to replace owned data, usually by cloning. Read more
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
impl<V, T> VZip<V> for T where
V: MultiLane<T>,
fn vzip(self) -> V
sourceimpl<T> WithSubscriber for T
impl<T> WithSubscriber for T
sourcefn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> where
S: Into<Dispatch>,
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
sourcefn with_current_subscriber(self) -> WithDispatch<Self>
fn with_current_subscriber(self) -> WithDispatch<Self>
Attaches the current default Subscriber to this type, returning a
WithDispatch wrapper. Read more