Skip to main content

forest/message_pool/
errors.rs

1// Copyright 2019-2026 ChainSafe Systems
2// SPDX-License-Identifier: Apache-2.0, MIT
3
4use crate::chain::Error as ChainError;
5use crate::shim::econ::TokenAmount;
6use fvm_ipld_encoding::Error as EncodeError;
7use thiserror::Error;
8
9/// `MessagePool` error.
10#[derive(Debug, PartialEq, Eq, Error)]
11pub enum Error {
12    /// Error indicating message that's too large
13    #[error("Message is too big")]
14    MessageTooBig,
15    #[error("gas price is lower than min gas price")]
16    GasPriceTooLow,
17    #[error("gas fee cap is too low")]
18    GasFeeCapTooLow,
19    #[error("Message sequence too low")]
20    SequenceTooLow,
21    #[error("Not enough funds to execute transaction, balance: {balance}, required: {required}")]
22    NotEnoughFunds {
23        balance: TokenAmount,
24        required: TokenAmount,
25    },
26    #[cfg(test)]
27    #[error("Invalid to address for message")]
28    InvalidToAddr,
29    #[error("Invalid from address")]
30    InvalidFromAddr,
31    #[error("Message with sequence already in mempool")]
32    DuplicateSequence,
33    #[error("unfulfilled nonce gap")]
34    NonceGap,
35    #[error("Validation Error: {0}")]
36    SoftValidationFailure(String),
37    #[error("Too many pending messages from actor {0} (trusted: {1})")]
38    TooManyPendingMessages(String, bool),
39    #[error("{0}")]
40    Other(String),
41}
42
43impl From<ChainError> for Error {
44    fn from(ce: ChainError) -> Self {
45        Error::Other(ce.to_string())
46    }
47}
48
49impl From<EncodeError> for Error {
50    fn from(ee: EncodeError) -> Self {
51        Error::Other(ee.to_string())
52    }
53}
54
55impl From<anyhow::Error> for Error {
56    fn from(e: anyhow::Error) -> Self {
57        Error::Other(format!("{e:#}"))
58    }
59}