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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
use num_derive::FromPrimitive;
use solana_program::{decode_error::DecodeError, program_error::ProgramError};
use thiserror::Error;
#[derive(Clone, Debug, Eq, Error, FromPrimitive, PartialEq)]
pub enum LendingError {
#[error("Failed to unpack instruction data")]
InstructionUnpackError,
#[error("Account is already initialized")]
AlreadyInitialized,
#[error("Lamport balance below rent-exempt threshold")]
NotRentExempt,
#[error("Market authority is invalid")]
InvalidMarketAuthority,
#[error("Market owner is invalid")]
InvalidMarketOwner,
#[error("Input account owner is not the program address")]
InvalidAccountOwner,
#[error("Input token account is not owned by the correct token program id")]
InvalidTokenOwner,
#[error("Input token account is not valid")]
InvalidTokenAccount,
#[error("Input token mint account is not valid")]
InvalidTokenMint,
#[error("Input token program account is not valid")]
InvalidTokenProgram,
#[error("Input amount is invalid")]
InvalidAmount,
#[error("Input config value is invalid")]
InvalidConfig,
#[error("Input account must be a signer")]
InvalidSigner,
#[error("Invalid account input")]
InvalidAccountInput,
#[error("Math operation overflow")]
MathOverflow,
#[error("Token initialize mint failed")]
TokenInitializeMintFailed,
#[error("Token initialize account failed")]
TokenInitializeAccountFailed,
#[error("Token transfer failed")]
TokenTransferFailed,
#[error("Token mint to failed")]
TokenMintToFailed,
#[error("Token burn failed")]
TokenBurnFailed,
#[error("Insufficient liquidity available")]
InsufficientLiquidity,
#[error("Input reserve has collateral disabled")]
ReserveCollateralDisabled,
#[error("Reserve state needs to be refreshed")]
ReserveStale,
#[error("Withdraw amount too small")]
WithdrawTooSmall,
#[error("Withdraw amount too large")]
WithdrawTooLarge,
#[error("Borrow amount too small to receive liquidity after fees")]
BorrowTooSmall,
#[error("Borrow amount too large for deposited collateral")]
BorrowTooLarge,
#[error("Repay amount too small to transfer liquidity")]
RepayTooSmall,
#[error("Liquidation amount too small to receive collateral")]
LiquidationTooSmall,
#[error("Cannot liquidate healthy obligations")]
ObligationHealthy,
#[error("Obligation state needs to be refreshed")]
ObligationStale,
#[error("Obligation reserve limit exceeded")]
ObligationReserveLimit,
#[error("Obligation owner is invalid")]
InvalidObligationOwner,
#[error("Obligation deposits are empty")]
ObligationDepositsEmpty,
#[error("Obligation borrows are empty")]
ObligationBorrowsEmpty,
#[error("Obligation deposits have zero value")]
ObligationDepositsZero,
#[error("Obligation borrows have zero value")]
ObligationBorrowsZero,
#[error("Invalid obligation collateral")]
InvalidObligationCollateral,
#[error("Invalid obligation liquidity")]
InvalidObligationLiquidity,
#[error("Obligation collateral is empty")]
ObligationCollateralEmpty,
#[error("Obligation liquidity is empty")]
ObligationLiquidityEmpty,
#[error("Interest rate is negative")]
NegativeInterestRate,
#[error("Input oracle config is invalid")]
InvalidOracleConfig,
#[error("Input flash loan receiver program account is not valid")]
InvalidFlashLoanReceiverProgram,
#[error("Not enough liquidity after flash loan")]
NotEnoughLiquidityAfterFlashLoan,
#[error("Invalid Staking pool argument for staking")]
InvalidStakingPool,
#[error("Invalid Staking account argument for staking")]
InvalidStakeAccount,
#[error("Invalid reserve fee account")]
InvalidReserveFeeAccount,
}
impl From<LendingError> for ProgramError {
fn from(e: LendingError) -> Self {
ProgramError::Custom(e as u32)
}
}
impl<T> DecodeError<T> for LendingError {
fn type_of() -> &'static str {
"Lending Error"
}
}