pub enum TransactionStatus<Hash, BlockHash> {
    Future,
    Ready,
    Broadcast(Vec<String>),
    InBlock((BlockHash, TxIndex)),
    Retracted(BlockHash),
    FinalityTimeout(BlockHash),
    Finalized((BlockHash, TxIndex)),
    Usurped(Hash),
    Dropped,
    Invalid,
}
Expand description

Possible transaction status events.

This events are being emitted by TransactionPool watchers, which are also exposed over RPC.

The status events can be grouped based on their kinds as:

  1. Entering/Moving within the pool: - Future - Ready
  2. Inside Ready queue: - Broadcast
  3. Leaving the pool: - InBlock - Invalid - Usurped - Dropped 4. Re-entering the pool: - Retracted 5. Block finalized: - Finalized - FinalityTimeout

Transactions are first placed in either the Ready or Future queues of the transaction pool. Substrate validates the transaction before it enters the pool.

A transaction is placed in the Future queue if it will become valid at a future time. For example, submitting a transaction with a higher account nonce than the current expected nonce will place the transaction in the Future queue.

The events will always be received in the order described above, however there might be cases where transactions alternate between Future and Ready pool, and are Broadcast in the meantime.

There is also only single event causing the transaction to leave the pool. I.e. only one of the listed ones should be triggered.

Note that there are conditions that may cause transactions to reappear in the pool.

  1. Due to possible forks, the transaction that ends up being in included in one block, may later re-enter the pool or be marked as invalid.
  2. Transaction Dropped at one point, may later re-enter the pool if some other transactions are removed. A Dropped transaction may re-enter the pool only if it is resubmitted.
  3. Invalid transaction may become valid at some point in the future. (Note that runtimes are encouraged to use UnknownValidity to inform the pool about such case). An Invalid transaction may re-enter the pool only if it is resubmitted.
  4. Retracted transactions might be included in some next block.

The FinalityTimeout event will be emitted when the block did not reach finality within 512 blocks. This either indicates that finality is not available for your chain, or that finality gadget is lagging behind. If you choose to wait for finality longer, you can re-subscribe for a particular transaction hash manually again.

§Last Event

The stream is considered finished when one of the following events happen:

See TransactionStatus::is_final for more details.

§Resubmit Transactions

Users might resubmit the transaction at a later time for the following events:

See TransactionStatus::is_retriable for more details.

Variants§

§

Future

Transaction is part of the future queue.

§

Ready

Transaction is part of the ready queue.

§

Broadcast(Vec<String>)

The transaction has been broadcast to the given peers.

§

InBlock((BlockHash, TxIndex))

Transaction has been included in block with given hash at the given position.

§

Retracted(BlockHash)

The block this transaction was included in has been retracted.

§

FinalityTimeout(BlockHash)

Maximum number of finality watchers has been reached, old watchers are being removed.

§

Finalized((BlockHash, TxIndex))

Transaction has been finalized by a finality-gadget, e.g GRANDPA.

§

Usurped(Hash)

Transaction has been replaced in the pool, by another transaction that provides the same tags. (e.g. same (sender, nonce)).

§

Dropped

Transaction has been dropped from the pool because of the limit.

§

Invalid

Transaction is no longer valid in the current state.

Implementations§

source§

impl<Hash, BlockHash> TransactionStatus<Hash, BlockHash>

source

pub fn is_final(&self) -> bool

Returns true if this is the last event emitted by TransactionStatusStream.

source

pub fn is_retriable(&self) -> bool

Returns true if the transaction could be re-submitted to the pool in the future.

For example, TransactionStatus::Dropped is retriable, because the transaction may enter the pool if there is space for it in the future.

Trait Implementations§

source§

impl<Hash: Clone, BlockHash: Clone> Clone for TransactionStatus<Hash, BlockHash>

source§

fn clone(&self) -> TransactionStatus<Hash, BlockHash>

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl<Hash: Debug, BlockHash: Debug> Debug for TransactionStatus<Hash, BlockHash>

source§

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

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

impl<'de, Hash, BlockHash> Deserialize<'de> for TransactionStatus<Hash, BlockHash>
where Hash: Deserialize<'de>, BlockHash: Deserialize<'de>,

source§

fn deserialize<__D>(__deserializer: __D) -> Result<Self, __D::Error>
where __D: Deserializer<'de>,

Deserialize this value from the given Serde deserializer. Read more
source§

impl<Hash: PartialEq, BlockHash: PartialEq> PartialEq for TransactionStatus<Hash, BlockHash>

source§

fn eq(&self, other: &TransactionStatus<Hash, BlockHash>) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl<Hash, BlockHash> Serialize for TransactionStatus<Hash, BlockHash>
where Hash: Serialize, BlockHash: Serialize,

source§

fn serialize<__S>(&self, __serializer: __S) -> Result<__S::Ok, __S::Error>
where __S: Serializer,

Serialize this value into the given Serde serializer. Read more
source§

impl<Hash, BlockHash> StructuralPartialEq for TransactionStatus<Hash, BlockHash>

Auto Trait Implementations§

§

impl<Hash, BlockHash> Freeze for TransactionStatus<Hash, BlockHash>
where BlockHash: Freeze, Hash: Freeze,

§

impl<Hash, BlockHash> RefUnwindSafe for TransactionStatus<Hash, BlockHash>
where BlockHash: RefUnwindSafe, Hash: RefUnwindSafe,

§

impl<Hash, BlockHash> Send for TransactionStatus<Hash, BlockHash>
where BlockHash: Send, Hash: Send,

§

impl<Hash, BlockHash> Sync for TransactionStatus<Hash, BlockHash>
where BlockHash: Sync, Hash: Sync,

§

impl<Hash, BlockHash> Unpin for TransactionStatus<Hash, BlockHash>
where BlockHash: Unpin, Hash: Unpin,

§

impl<Hash, BlockHash> UnwindSafe for TransactionStatus<Hash, BlockHash>
where BlockHash: UnwindSafe, Hash: 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
source§

impl<T> CheckedConversion for T

source§

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
source§

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> CloneToUninit for T
where T: Clone,

source§

default unsafe fn clone_to_uninit(&self, dst: *mut T)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dst. Read more
source§

impl<T> DynClone for T
where T: Clone,

source§

fn __clone_box(&self, _: Private) -> *mut ()

source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T> Instrument for T

source§

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

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

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
source§

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

source§

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

Get a reference to the inner from the outer.

source§

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

Get a mutable reference to the inner from the outer.

source§

impl<T> Same for T

§

type Output = T

Should always be Self
source§

impl<T> SaturatedConversion for T

source§

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
source§

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

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

impl<T> ToOwned for T
where T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. 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.
source§

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

source§

fn unchecked_into(self) -> T

The counterpart to unchecked_from.
source§

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

source§

fn unique_saturated_into(self) -> T

Consume self to return an equivalent value of T.
source§

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

source§

fn vzip(self) -> V

source§

impl<T> WithSubscriber for T

source§

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
source§

fn with_current_subscriber(self) -> WithDispatch<Self>

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

impl<T> DeserializeOwned for T
where T: for<'de> Deserialize<'de>,

source§

impl<T> JsonSchemaMaybe for T

source§

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

source§

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

source§

impl<T> MaybeSerialize for T
where T: Serialize,

source§

impl<T> MaybeSerializeDeserialize for T