You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
40 lines
1.3 KiB
Rust
40 lines
1.3 KiB
Rust
use crate::bitcoin::Wallet;
|
|
use crate::database::{Database, Swap};
|
|
use crate::protocol::bob::BobState;
|
|
use anyhow::{bail, Result};
|
|
use std::sync::Arc;
|
|
use uuid::Uuid;
|
|
|
|
pub async fn refund(swap_id: Uuid, bitcoin_wallet: Arc<Wallet>, db: Database) -> Result<BobState> {
|
|
let state = db.get_state(swap_id)?.try_into_bob()?.into();
|
|
|
|
let state6 = match state {
|
|
BobState::BtcLocked(state3) => state3.cancel(),
|
|
BobState::XmrLockProofReceived { state, .. } => state.cancel(),
|
|
BobState::XmrLocked(state4) => state4.cancel(),
|
|
BobState::EncSigSent(state4) => state4.cancel(),
|
|
BobState::CancelTimelockExpired(state6) => state6,
|
|
BobState::BtcCancelled(state6) => state6,
|
|
BobState::Started { .. }
|
|
| BobState::SwapSetupCompleted(_)
|
|
| BobState::BtcRedeemed(_)
|
|
| BobState::BtcRefunded(_)
|
|
| BobState::XmrRedeemed { .. }
|
|
| BobState::BtcPunished { .. }
|
|
| BobState::SafelyAborted => bail!(
|
|
"Cannot refund swap {} because it is in state {} which is not refundable.",
|
|
swap_id,
|
|
state
|
|
),
|
|
};
|
|
|
|
state6.publish_refund_btc(bitcoin_wallet.as_ref()).await?;
|
|
|
|
let state = BobState::BtcRefunded(state6);
|
|
let db_state = state.clone().into();
|
|
|
|
db.insert_latest_state(swap_id, Swap::Bob(db_state)).await?;
|
|
|
|
Ok(state)
|
|
}
|