76 lines
3.1 KiB
Rust
76 lines
3.1 KiB
Rust
//! Errors that can occur when interacting with the mempool.
|
|
//!
|
|
//! Most of the mempool errors are related to manipulating transactions in the
|
|
//! mempool.
|
|
|
|
use thiserror::Error;
|
|
|
|
#[cfg(any(test, feature = "proptest-impl"))]
|
|
use proptest_derive::Arbitrary;
|
|
|
|
use super::storage::{
|
|
ExactTipRejectionError, SameEffectsChainRejectionError, SameEffectsTipRejectionError,
|
|
};
|
|
|
|
/// Mempool errors.
|
|
#[derive(Error, Clone, Debug, PartialEq, Eq)]
|
|
#[cfg_attr(any(test, feature = "proptest-impl"), derive(Arbitrary))]
|
|
pub enum MempoolError {
|
|
/// Transaction rejected based on its authorizing data (scripts, proofs,
|
|
/// signatures). The rejection is valid for the current chain tip.
|
|
///
|
|
/// See [`ExactTipRejectionError`] for more details.
|
|
///
|
|
/// Note that the mempool caches this error. See [`super::storage::Storage`]
|
|
/// for more details.
|
|
#[error("the transaction will be rejected from the mempool until the next chain tip block")]
|
|
StorageExactTip(#[from] ExactTipRejectionError),
|
|
|
|
/// Transaction rejected based on its effects (spends, outputs, transaction
|
|
/// header). The rejection is valid for the current chain tip.
|
|
///
|
|
/// See [`SameEffectsTipRejectionError`] for more details.
|
|
///
|
|
/// Note that the mempool caches this error. See [`super::storage::Storage`]
|
|
/// for more details.
|
|
#[error("any transaction with the same effects will be rejected from the mempool until the next chain tip block")]
|
|
StorageEffectsTip(#[from] SameEffectsTipRejectionError),
|
|
|
|
/// Transaction rejected based on its effects (spends, outputs, transaction
|
|
/// header). The rejection is valid while the current chain continues to
|
|
/// grow.
|
|
///
|
|
/// See [`SameEffectsChainRejectionError`] for more details.
|
|
///
|
|
/// Note that the mempool caches this error. See [`super::storage::Storage`]
|
|
/// for more details.
|
|
#[error("any transaction with the same effects will be rejected from the mempool until a chain reset")]
|
|
StorageEffectsChain(#[from] SameEffectsChainRejectionError),
|
|
|
|
/// Transaction rejected because the mempool already contains another
|
|
/// transaction with the same hash.
|
|
#[error("transaction already exists in mempool")]
|
|
InMempool,
|
|
|
|
/// The transaction hash is already queued, so this request was ignored.
|
|
///
|
|
/// Another peer has already gossiped the same hash to us, or the mempool crawler has fetched it.
|
|
#[error("transaction dropped because it is already queued for download")]
|
|
AlreadyQueued,
|
|
|
|
/// The queue is at capacity, so this request was ignored.
|
|
///
|
|
/// The mempool crawler should discover this transaction later.
|
|
/// If it is mined into a block, it will be downloaded by the syncer, or the inbound block downloader.
|
|
///
|
|
/// The queue's capacity is [`super::downloads::MAX_INBOUND_CONCURRENCY`].
|
|
#[error("transaction dropped because the queue is full")]
|
|
FullQueue,
|
|
|
|
/// The mempool is not enabled yet.
|
|
///
|
|
/// Zebra enables the mempool when it is at the chain tip.
|
|
#[error("mempool is disabled since synchronization is behind the chain tip")]
|
|
Disabled,
|
|
}
|