bark/exit/models/
error.rs1use bitcoin::{Amount, Txid};
2use bitcoin::address::FromScriptError;
3use thiserror::Error;
4
5use ark::VtxoId;
6use ark::vtxo::VtxoStandardnessError;
7use bitcoin_ext::BlockHeight;
8
9use crate::chain::BroadcastError;
10use crate::exit::models::ExitStateKind;
11use crate::exit::models::states::ExitTxStatus;
12
13#[derive(Clone, Debug, Error, PartialEq, Eq)]
14pub enum ExitError {
15 #[error("Transaction Retrieval Failure: Unable to retrieve ancestral data for TX {txid}: {error}")]
16 AncestorRetrievalFailure {
17 txid: Txid,
18 error: String
19 },
20
21 #[error("Block Retrieval Failure: Unable to retrieve a block at height {height}: {error}")]
22 BlockRetrievalFailure { height: BlockHeight, error: String },
23
24 #[error("Cannot Cancel Exit: The exit for VTXO {vtxo} can no longer be canceled (state: {state})")]
25 CannotCancelExit { vtxo: VtxoId, state: ExitStateKind },
26
27 #[error("Claim Missing Inputs: No inputs given to claim")]
28 ClaimMissingInputs,
29
30 #[error("Claim Fee Exceeds Output: Cost to claim exits was {needed}, but the total output was {output}")]
31 ClaimFeeExceedsOutput {
32 needed: Amount,
33 output: Amount,
34 },
35
36 #[error("Claim Missing Signable Clause: Couldn't find a signable clause for VTXO {vtxo}")]
37 ClaimMissingSignableClause { vtxo: VtxoId },
38
39 #[error("Claim Signing Error: Unable to sign claim: {error}")]
40 ClaimSigningError { error: String },
41
42 #[error("Cyclic Exit Transactions Error: The exit transactions for VTXO {vtxo} are cyclic")]
43 CyclicExitTransactions {
44 vtxo: VtxoId
45 },
46
47 #[error("Database Store Failure: Unable to update exit VTXO {vtxo_id} in the database: {error}")]
48 DatabaseVtxoStoreFailure {
49 vtxo_id: VtxoId,
50 error: String
51 },
52
53 #[error("Database Retrieval Failure: Unable to get child tx: {error}")]
54 DatabaseChildRetrievalFailure { error: String },
55
56 #[error("Database Store Failure: Unable to store child tx: {error}")]
57 DatabaseChildStoreFailure { error: String },
58
59 #[error("Dust Limit Error: The dust limit for a VTXO is {dust} but the balance is only {vtxo}")]
60 DustLimit {
61 vtxo: Amount,
62 dust: Amount
63 },
64
65 #[error("Exit Package Broadcast Failure: Unable to broadcast exit transaction package {txid}: {error}")]
66 ExitPackageBroadcastFailure {
67 txid: Txid,
68 error: BroadcastError,
69 },
70
71 #[error("Exit Package Finalize Failure: Unable to create exit transaction package: {error}")]
72 ExitPackageFinalizeFailure { error: String },
73
74 #[error("Exit Package Store Failure: Unable to store exit transaction package {txid}: {error}")]
75 ExitPackageStoreFailure {
76 txid: Txid,
77 error: String
78 },
79
80 #[error("Exit Tx Already Broadcast: Cannot cancel the exit for VTXO {vtxo}, its final exit tx {txid} has already been broadcast")]
81 ExitTxAlreadyBroadcast { vtxo: VtxoId, txid: Txid },
82
83 #[error("Insufficient Confirmed Funds: {needed} is needed but only {available} is available")]
84 InsufficientConfirmedFunds {
85 needed: Amount,
86 available: Amount
87 },
88
89 #[error("Internal Error: An unexpected problem occurred, {error}")]
90 InternalError { error: String },
91
92 #[error("Invalid Exit Transaction Status: Exit tx {txid} has an invalid status ({status}): {error}")]
93 InvalidExitTransactionStatus {
94 txid: Txid,
95 status: ExitTxStatus,
96 error: String
97 },
98
99 #[error("Invalid Locktime ({tip}): {error}")]
100 InvalidLocktime { tip: BlockHeight, error: String },
101
102 #[error("Invalid Wallet State: {error}")]
103 InvalidWalletState { error: String },
104
105 #[error("Missing Anchor Output: Malformed exit tx {txid}")]
106 MissingAnchorOutput { txid: Txid },
107
108 #[error("Missing VTXO Transaction: Couldn't find exit tx {txid}")]
109 MissingExitTransaction { txid: Txid },
110
111 #[error("Non-Standard VTXO {vtxo}: exit chain is not relayable: {error}")]
112 NonStandardVtxo {
113 vtxo: VtxoId,
114 error: VtxoStandardnessError,
115 },
116
117 #[error("Movement Registration Failure: {error}")]
118 MovementRegistrationFailure { error: String },
119
120 #[error("Not Exiting: VTXO {vtxo} has no unilateral exit")]
121 NotExiting { vtxo: VtxoId },
122
123 #[error("Tip Retrieval Failure: Unable to retrieve the blockchain tip height: {error}")]
124 TipRetrievalFailure { error: String },
125
126 #[error("Transaction Retrieval Failure: Unable to check the status of TX {txid}: {error}")]
127 TransactionRetrievalFailure { txid: Txid, error: String },
128
129 #[error("VTXO Not Spendable Error: Attempted to claim a VTXO which is not in a spendable state: {vtxo}")]
130 VtxoNotClaimable { vtxo: VtxoId },
131
132 #[error("VTXO ScriptPubKey Invalid: {error}")]
133 VtxoScriptPubKeyInvalid { error: String },
134}
135
136impl From<FromScriptError> for ExitError {
137 fn from(e: FromScriptError) -> Self {
138 ExitError::VtxoScriptPubKeyInvalid { error: e.to_string() }
139 }
140}