1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
// Copyright 2019-2024 ChainSafe Systems
// SPDX-License-Identifier: Apache-2.0, MIT

use crate::chain::Error as ChainError;
use fvm_ipld_encoding::Error as EncodeError;
use thiserror::Error;

/// `MessagePool` error.
#[derive(Debug, PartialEq, Eq, Error)]
pub enum Error {
    /// Error indicating message that's too large
    #[error("Message is too big")]
    MessageTooBig,
    #[error("gas price is lower than min gas price")]
    GasPriceTooLow,
    #[error("gas fee cap is too low")]
    GasFeeCapTooLow,
    #[error("Cannot send more Filecoin than will ever exist")]
    MessageValueTooHigh,
    #[error("Message sequence too low")]
    SequenceTooLow,
    #[error("Not enough funds to execute transaction")]
    NotEnoughFunds,
    #[cfg(test)]
    #[error("Invalid to address for message")]
    InvalidToAddr,
    #[error("Invalid from address")]
    InvalidFromAddr,
    #[error("Message with sequence already in mempool")]
    DuplicateSequence,
    #[error("Validation Error: {0}")]
    SoftValidationFailure(String),
    #[error("Too many pending messages from actor {0} (trusted: {1})")]
    TooManyPendingMessages(String, bool),
    #[error("{0}")]
    Other(String),
}

impl From<ChainError> for Error {
    fn from(ce: ChainError) -> Self {
        Error::Other(ce.to_string())
    }
}

impl From<EncodeError> for Error {
    fn from(ee: EncodeError) -> Self {
        Error::Other(ee.to_string())
    }
}

impl From<anyhow::Error> for Error {
    fn from(e: anyhow::Error) -> Self {
        Error::Other(e.to_string())
    }
}