1use std::collections::HashSet;
2use std::fmt;
3
4use bitcoin::Txid;
5
6use bitcoin_ext::BlockHeight;
7use crate::primitives::BlockRef;
8
9#[cfg(feature = "utoipa")]
10use utoipa::ToSchema;
11
12#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
13#[cfg_attr(feature = "utoipa", derive(ToSchema))]
14pub struct ExitTx {
15 #[cfg_attr(feature = "utoipa", schema(value_type = String))]
16 pub txid: Txid,
17 pub status: ExitTxStatus,
18}
19
20#[derive(Clone, Debug, Default, Eq, PartialEq, Deserialize, Serialize)]
21#[cfg_attr(feature = "utoipa", derive(ToSchema))]
22#[serde(tag = "type", rename_all = "kebab-case")]
23pub enum ExitTxStatus {
24 #[default]
25 VerifyInputs,
26 AwaitingInputConfirmation {
27 #[cfg_attr(feature = "utoipa", schema(value_type = Vec<String>))]
28 txids: HashSet<Txid>
29 },
30 AwaitingCpfpBroadcast,
31 AwaitingConfirmation {
32 #[cfg_attr(feature = "utoipa", schema(value_type = String))]
33 child_txid: Txid,
34 origin: ExitTxOrigin,
35 },
36 Confirmed {
37 #[cfg_attr(feature = "utoipa", schema(value_type = String))]
38 child_txid: Txid,
39 block: BlockRef,
40 origin: ExitTxOrigin,
41 },
42}
43
44impl fmt::Display for ExitTxStatus {
45 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
46 fmt::Debug::fmt(self, f)
47 }
48}
49
50impl From<bark::exit::ExitTxStatus> for ExitTxStatus {
51 fn from(v: bark::exit::ExitTxStatus) -> Self {
52 match v {
53 bark::exit::ExitTxStatus::VerifyInputs => {
54 ExitTxStatus::VerifyInputs
55 },
56 bark::exit::ExitTxStatus::AwaitingInputConfirmation { txids } => {
57 ExitTxStatus::AwaitingInputConfirmation { txids }
58 },
59 bark::exit::ExitTxStatus::AwaitingCpfpBroadcast => {
60 ExitTxStatus::AwaitingCpfpBroadcast
61 },
62 bark::exit::ExitTxStatus::AwaitingConfirmation { child_txid, origin } => {
63 ExitTxStatus::AwaitingConfirmation { child_txid, origin: origin.into() }
64 },
65 bark::exit::ExitTxStatus::Confirmed { child_txid, block, origin } => {
66 ExitTxStatus::Confirmed { child_txid, block: block.into(), origin: origin.into() }
67 },
68 }
69 }
70}
71
72#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
73#[cfg_attr(feature = "utoipa", derive(ToSchema))]
74#[serde(tag = "type", rename_all = "kebab-case")]
75pub enum ExitTxOrigin {
76 Wallet {
77 confirmed_in: Option<BlockRef>
78 },
79 Mempool,
80 Block {
81 confirmed_in: BlockRef
82 },
83}
84
85impl fmt::Display for ExitTxOrigin {
86 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
87 fmt::Debug::fmt(self, f)
88 }
89}
90
91impl From<bark::exit::ExitTxOrigin> for ExitTxOrigin {
92 fn from(v: bark::exit::ExitTxOrigin) -> Self {
93 match v {
94 bark::exit::ExitTxOrigin::Wallet { confirmed_in } => {
95 ExitTxOrigin::Wallet { confirmed_in: confirmed_in.map(Into::into) }
96 },
97 bark::exit::ExitTxOrigin::Mempool => ExitTxOrigin::Mempool,
98 bark::exit::ExitTxOrigin::Block { confirmed_in } => {
99 ExitTxOrigin::Block { confirmed_in: confirmed_in.into() }
100 },
101 }
102 }
103}
104
105#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
106#[cfg_attr(feature = "utoipa", derive(ToSchema))]
107pub struct ExitStartState {
108 pub tip_height: BlockHeight,
109}
110
111#[derive(Clone, Debug, Eq, PartialEq, Deserialize, Serialize)]
112#[cfg_attr(feature = "utoipa", derive(ToSchema))]
113pub struct ExitProcessingState {
114 pub tip_height: BlockHeight,
115 pub transactions: Vec<ExitTx>,
116}
117
118#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
119#[cfg_attr(feature = "utoipa", derive(ToSchema))]
120pub struct ExitAwaitingDeltaState {
121 pub tip_height: BlockHeight,
122 pub confirmed_block: BlockRef,
123 pub claimable_height: BlockHeight,
124}
125
126#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
127#[cfg_attr(feature = "utoipa", derive(ToSchema))]
128pub struct ExitClaimableState {
129 pub tip_height: BlockHeight,
130 pub claimable_since: BlockRef,
131 pub last_scanned_block: Option<BlockRef>,
132}
133
134#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
135#[cfg_attr(feature = "utoipa", derive(ToSchema))]
136pub struct ExitClaimInProgressState {
137 pub tip_height: BlockHeight,
138 pub claimable_since: BlockRef,
139 #[cfg_attr(feature = "utoipa", schema(value_type = String))]
140 pub claim_txid: Txid,
141}
142
143#[derive(Clone, Copy, Debug, Eq, PartialEq, Deserialize, Serialize)]
144#[cfg_attr(feature = "utoipa", derive(ToSchema))]
145pub struct ExitClaimedState {
146 pub tip_height: BlockHeight,
147 #[cfg_attr(feature = "utoipa", schema(value_type = String))]
148 pub txid: Txid,
149 pub block: BlockRef,
150}