You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
141 lines
5.3 KiB
141 lines
5.3 KiB
use crate::wownero::TransferProof;
|
|
use crate::protocol::bob;
|
|
use crate::protocol::bob::BobState;
|
|
use wownero_rpc::wallet::BlockHeight;
|
|
use serde::{Deserialize, Serialize};
|
|
use serde_with::{serde_as, DisplayFromStr};
|
|
use std::fmt;
|
|
|
|
#[serde_as]
|
|
#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
|
|
pub enum Bob {
|
|
Started {
|
|
#[serde(with = "::bitcoin::util::amount::serde::as_sat")]
|
|
btc_amount: bitcoin::Amount,
|
|
#[serde_as(as = "DisplayFromStr")]
|
|
change_address: bitcoin::Address,
|
|
},
|
|
ExecutionSetupDone {
|
|
state2: bob::State2,
|
|
},
|
|
BtcLocked {
|
|
state3: bob::State3,
|
|
},
|
|
WowLockProofReceived {
|
|
state: bob::State3,
|
|
lock_transfer_proof: TransferProof,
|
|
wownero_wallet_restore_blockheight: BlockHeight,
|
|
},
|
|
WowLocked {
|
|
state4: bob::State4,
|
|
},
|
|
EncSigSent {
|
|
state4: bob::State4,
|
|
},
|
|
BtcRedeemed(bob::State5),
|
|
CancelTimelockExpired(bob::State6),
|
|
BtcCancelled(bob::State6),
|
|
Done(BobEndState),
|
|
}
|
|
|
|
#[derive(Clone, strum::Display, Debug, Deserialize, Serialize, PartialEq)]
|
|
pub enum BobEndState {
|
|
SafelyAborted,
|
|
WowRedeemed { tx_lock_id: bitcoin::Txid },
|
|
BtcRefunded(Box<bob::State6>),
|
|
BtcPunished { tx_lock_id: bitcoin::Txid },
|
|
}
|
|
|
|
impl From<BobState> for Bob {
|
|
fn from(bob_state: BobState) -> Self {
|
|
match bob_state {
|
|
BobState::Started {
|
|
btc_amount,
|
|
change_address,
|
|
} => Bob::Started {
|
|
btc_amount,
|
|
change_address,
|
|
},
|
|
BobState::SwapSetupCompleted(state2) => Bob::ExecutionSetupDone { state2 },
|
|
BobState::BtcLocked(state3) => Bob::BtcLocked { state3 },
|
|
BobState::WowLockProofReceived {
|
|
state,
|
|
lock_transfer_proof,
|
|
wownero_wallet_restore_blockheight,
|
|
} => Bob::WowLockProofReceived {
|
|
state,
|
|
lock_transfer_proof,
|
|
wownero_wallet_restore_blockheight,
|
|
},
|
|
BobState::WowLocked(state4) => Bob::WowLocked { state4 },
|
|
BobState::EncSigSent(state4) => Bob::EncSigSent { state4 },
|
|
BobState::BtcRedeemed(state5) => Bob::BtcRedeemed(state5),
|
|
BobState::CancelTimelockExpired(state6) => Bob::CancelTimelockExpired(state6),
|
|
BobState::BtcCancelled(state6) => Bob::BtcCancelled(state6),
|
|
BobState::BtcRefunded(state6) => Bob::Done(BobEndState::BtcRefunded(Box::new(state6))),
|
|
BobState::WowRedeemed { tx_lock_id } => {
|
|
Bob::Done(BobEndState::WowRedeemed { tx_lock_id })
|
|
}
|
|
BobState::BtcPunished { tx_lock_id } => {
|
|
Bob::Done(BobEndState::BtcPunished { tx_lock_id })
|
|
}
|
|
BobState::SafelyAborted => Bob::Done(BobEndState::SafelyAborted),
|
|
}
|
|
}
|
|
}
|
|
|
|
impl From<Bob> for BobState {
|
|
fn from(db_state: Bob) -> Self {
|
|
match db_state {
|
|
Bob::Started {
|
|
btc_amount,
|
|
change_address,
|
|
} => BobState::Started {
|
|
btc_amount,
|
|
change_address,
|
|
},
|
|
Bob::ExecutionSetupDone { state2 } => BobState::SwapSetupCompleted(state2),
|
|
Bob::BtcLocked { state3 } => BobState::BtcLocked(state3),
|
|
Bob::WowLockProofReceived {
|
|
state,
|
|
lock_transfer_proof,
|
|
wownero_wallet_restore_blockheight,
|
|
} => BobState::WowLockProofReceived {
|
|
state,
|
|
lock_transfer_proof,
|
|
wownero_wallet_restore_blockheight,
|
|
},
|
|
Bob::WowLocked { state4 } => BobState::WowLocked(state4),
|
|
Bob::EncSigSent { state4 } => BobState::EncSigSent(state4),
|
|
Bob::BtcRedeemed(state5) => BobState::BtcRedeemed(state5),
|
|
Bob::CancelTimelockExpired(state6) => BobState::CancelTimelockExpired(state6),
|
|
Bob::BtcCancelled(state6) => BobState::BtcCancelled(state6),
|
|
Bob::Done(end_state) => match end_state {
|
|
BobEndState::SafelyAborted => BobState::SafelyAborted,
|
|
BobEndState::WowRedeemed { tx_lock_id } => BobState::WowRedeemed { tx_lock_id },
|
|
BobEndState::BtcRefunded(state6) => BobState::BtcRefunded(*state6),
|
|
BobEndState::BtcPunished { tx_lock_id } => BobState::BtcPunished { tx_lock_id },
|
|
},
|
|
}
|
|
}
|
|
}
|
|
|
|
impl fmt::Display for Bob {
|
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
|
match self {
|
|
Bob::Started { .. } => write!(f, "Started"),
|
|
Bob::ExecutionSetupDone { .. } => f.write_str("Execution setup done"),
|
|
Bob::BtcLocked { .. } => f.write_str("Bitcoin locked"),
|
|
Bob::WowLockProofReceived { .. } => {
|
|
f.write_str("WOW lock transaction transfer proof received")
|
|
}
|
|
Bob::WowLocked { .. } => f.write_str("Wownero locked"),
|
|
Bob::CancelTimelockExpired(_) => f.write_str("Cancel timelock is expired"),
|
|
Bob::BtcCancelled(_) => f.write_str("Bitcoin refundable"),
|
|
Bob::BtcRedeemed(_) => f.write_str("Wownero redeemable"),
|
|
Bob::Done(end_state) => write!(f, "Done: {}", end_state),
|
|
Bob::EncSigSent { .. } => f.write_str("Encrypted signature sent"),
|
|
}
|
|
}
|
|
}
|