diff --git a/swap/src/network.rs b/swap/src/network.rs index fb4606fb..c2eb17a1 100644 --- a/swap/src/network.rs +++ b/swap/src/network.rs @@ -1,5 +1,6 @@ mod impl_from_rr_event; +pub mod asb; pub mod cbor_request_response; pub mod encrypted_signature; pub mod json_pull_codec; diff --git a/swap/src/network/asb.rs b/swap/src/network/asb.rs new file mode 100644 index 00000000..d5ef2c32 --- /dev/null +++ b/swap/src/network/asb.rs @@ -0,0 +1,3 @@ +pub mod behaviour; +mod execution_setup; +pub mod spot_price; diff --git a/swap/src/protocol/alice/behaviour.rs b/swap/src/network/asb/behaviour.rs similarity index 96% rename from swap/src/protocol/alice/behaviour.rs rename to swap/src/network/asb/behaviour.rs index 6d2ad548..d82d8030 100644 --- a/swap/src/protocol/alice/behaviour.rs +++ b/swap/src/network/asb/behaviour.rs @@ -1,13 +1,15 @@ -use crate::network::quote::BidQuote; -use crate::network::{encrypted_signature, quote, transfer_proof}; -use crate::protocol::alice::event_loop::LatestRate; -use crate::protocol::alice::{execution_setup, spot_price, State3}; -use crate::{env, monero}; use anyhow::{anyhow, Error}; use libp2p::request_response::{RequestId, ResponseChannel}; use libp2p::{NetworkBehaviour, PeerId}; use uuid::Uuid; +use crate::network::asb::{execution_setup, spot_price}; +use crate::network::quote::BidQuote; +use crate::network::{encrypted_signature, quote, transfer_proof}; +use crate::protocol::alice::event_loop::LatestRate; +use crate::protocol::alice::State3; +use crate::{env, monero}; + #[derive(Debug)] pub enum OutEvent { SwapRequestDeclined { diff --git a/swap/src/protocol/alice/execution_setup.rs b/swap/src/network/asb/execution_setup.rs similarity index 100% rename from swap/src/protocol/alice/execution_setup.rs rename to swap/src/network/asb/execution_setup.rs diff --git a/swap/src/protocol/alice/spot_price.rs b/swap/src/network/asb/spot_price.rs similarity index 92% rename from swap/src/protocol/alice/spot_price.rs rename to swap/src/network/asb/spot_price.rs index 43fcf600..faad46f7 100644 --- a/swap/src/protocol/alice/spot_price.rs +++ b/swap/src/network/asb/spot_price.rs @@ -1,18 +1,20 @@ -use crate::network::cbor_request_response::CborCodec; -use crate::network::spot_price; -use crate::network::spot_price::{BlockchainNetwork, SpotPriceProtocol}; -use crate::protocol::alice; -use crate::protocol::alice::event_loop::LatestRate; -use crate::{env, monero}; +use std::collections::VecDeque; +use std::fmt::Debug; +use std::task::{Context, Poll}; + use libp2p::request_response::{ ProtocolSupport, RequestResponseConfig, RequestResponseEvent, RequestResponseMessage, ResponseChannel, }; use libp2p::swarm::{NetworkBehaviourAction, NetworkBehaviourEventProcess, PollParameters}; use libp2p::{NetworkBehaviour, PeerId}; -use std::collections::VecDeque; -use std::fmt::Debug; -use std::task::{Context, Poll}; + +use crate::network::cbor_request_response::CborCodec; +use crate::network::spot_price; +use crate::network::spot_price::{BlockchainNetwork, SpotPriceProtocol}; +use crate::protocol::alice; +use crate::protocol::alice::event_loop::LatestRate; +use crate::{env, monero}; #[derive(Debug)] pub enum OutEvent { @@ -302,16 +304,19 @@ impl Error { #[cfg(test)] mod tests { - use super::*; - use crate::asb::Rate; - use crate::env::GetConfig; - use crate::monero; - use crate::network::test::{await_events_or_timeout, connect, new_swarm}; - use crate::protocol::{alice, bob}; use anyhow::anyhow; use libp2p::Swarm; use rust_decimal::Decimal; + use crate::asb::Rate; + use crate::env::GetConfig; + use crate::monero; + use crate::network::asb; + use crate::network::test::{await_events_or_timeout, connect, new_swarm}; + use crate::protocol::bob; + + use super::*; + impl Default for AliceBehaviourValues { fn default() -> Self { Self { @@ -349,7 +354,7 @@ mod tests { test.construct_and_send_request(btc_to_swap); test.assert_error( - alice::spot_price::Error::BalanceTooLow { + asb::spot_price::Error::BalanceTooLow { balance: monero::Amount::ZERO, buy: btc_to_swap, }, @@ -375,7 +380,7 @@ mod tests { test.construct_and_send_request(btc_to_swap); test.assert_error( - alice::spot_price::Error::BalanceTooLow { + asb::spot_price::Error::BalanceTooLow { balance: monero::Amount::ZERO, buy: btc_to_swap, }, @@ -398,7 +403,7 @@ mod tests { let btc_to_swap = bitcoin::Amount::from_btc(0.01).unwrap(); test.construct_and_send_request(btc_to_swap); test.assert_error( - alice::spot_price::Error::BalanceTooLow { + asb::spot_price::Error::BalanceTooLow { balance, buy: btc_to_swap, }, @@ -417,7 +422,7 @@ mod tests { let btc_to_swap = bitcoin::Amount::from_btc(0.0001).unwrap(); test.construct_and_send_request(btc_to_swap); test.assert_error( - alice::spot_price::Error::AmountBelowMinimum { + asb::spot_price::Error::AmountBelowMinimum { buy: btc_to_swap, min: min_buy, }, @@ -440,7 +445,7 @@ mod tests { test.construct_and_send_request(btc_to_swap); test.assert_error( - alice::spot_price::Error::AmountAboveMaximum { + asb::spot_price::Error::AmountAboveMaximum { buy: btc_to_swap, max: max_buy, }, @@ -460,7 +465,7 @@ mod tests { let btc_to_swap = bitcoin::Amount::from_btc(0.01).unwrap(); test.construct_and_send_request(btc_to_swap); test.assert_error( - alice::spot_price::Error::ResumeOnlyMode, + asb::spot_price::Error::ResumeOnlyMode, bob::spot_price::Error::NoSwapsAccepted, ) .await; @@ -475,7 +480,7 @@ mod tests { let btc_to_swap = bitcoin::Amount::from_btc(0.01).unwrap(); test.construct_and_send_request(btc_to_swap); test.assert_error( - alice::spot_price::Error::LatestRateFetchFailed(Box::new(TestRateError {})), + asb::spot_price::Error::LatestRateFetchFailed(Box::new(TestRateError {})), bob::spot_price::Error::Other, ) .await; @@ -492,7 +497,7 @@ mod tests { test.construct_and_send_request(btc_to_swap); test.assert_error( - alice::spot_price::Error::SellQuoteCalculationFailed(anyhow!( + asb::spot_price::Error::SellQuoteCalculationFailed(anyhow!( "Error text irrelevant, won't be checked here" )), bob::spot_price::Error::Other, @@ -510,7 +515,7 @@ mod tests { let btc_to_swap = bitcoin::Amount::from_btc(0.01).unwrap(); test.construct_and_send_request(btc_to_swap); test.assert_error( - alice::spot_price::Error::BlockchainNetworkMismatch { + asb::spot_price::Error::BlockchainNetworkMismatch { cli: BlockchainNetwork { bitcoin: bitcoin::Network::Testnet, monero: monero::Network::Stagenet, @@ -549,7 +554,7 @@ mod tests { test.send_request(request); test.assert_error( - alice::spot_price::Error::BlockchainNetworkMismatch { + asb::spot_price::Error::BlockchainNetworkMismatch { cli: BlockchainNetwork { bitcoin: bitcoin::Network::Bitcoin, monero: monero::Network::Mainnet, @@ -574,7 +579,7 @@ mod tests { } struct SpotPriceTest { - alice_swarm: Swarm>, + alice_swarm: Swarm>, bob_swarm: Swarm, alice_peer_id: PeerId, @@ -628,7 +633,7 @@ mod tests { ) { match await_events_or_timeout(self.alice_swarm.next(), self.bob_swarm.next()).await { ( - alice::spot_price::OutEvent::ExecutionSetupParams { btc, xmr, .. }, + asb::spot_price::OutEvent::ExecutionSetupParams { btc, xmr, .. }, spot_price::OutEvent::Message { message, .. }, ) => { assert_eq!(alice_assert, (btc, xmr)); @@ -654,22 +659,22 @@ mod tests { async fn assert_error( &mut self, - alice_assert: alice::spot_price::Error, + alice_assert: asb::spot_price::Error, bob_assert: bob::spot_price::Error, ) { match await_events_or_timeout(self.alice_swarm.next(), self.bob_swarm.next()).await { ( - alice::spot_price::OutEvent::Error { error, .. }, + asb::spot_price::OutEvent::Error { error, .. }, spot_price::OutEvent::Message { message, .. }, ) => { // TODO: Somehow make PartialEq work on Alice's spot_price::Error match (alice_assert, error) { ( - alice::spot_price::Error::BalanceTooLow { + asb::spot_price::Error::BalanceTooLow { balance: balance1, buy: buy1, }, - alice::spot_price::Error::BalanceTooLow { + asb::spot_price::Error::BalanceTooLow { balance: balance2, buy: buy2, }, @@ -678,11 +683,11 @@ mod tests { assert_eq!(buy1, buy2); } ( - alice::spot_price::Error::BlockchainNetworkMismatch { + asb::spot_price::Error::BlockchainNetworkMismatch { cli: cli1, asb: asb1, }, - alice::spot_price::Error::BlockchainNetworkMismatch { + asb::spot_price::Error::BlockchainNetworkMismatch { cli: cli2, asb: asb2, }, @@ -691,24 +696,24 @@ mod tests { assert_eq!(asb1, asb2); } ( - alice::spot_price::Error::AmountBelowMinimum { .. }, - alice::spot_price::Error::AmountBelowMinimum { .. }, + asb::spot_price::Error::AmountBelowMinimum { .. }, + asb::spot_price::Error::AmountBelowMinimum { .. }, ) | ( - alice::spot_price::Error::AmountAboveMaximum { .. }, - alice::spot_price::Error::AmountAboveMaximum { .. }, + asb::spot_price::Error::AmountAboveMaximum { .. }, + asb::spot_price::Error::AmountAboveMaximum { .. }, ) | ( - alice::spot_price::Error::LatestRateFetchFailed(_), - alice::spot_price::Error::LatestRateFetchFailed(_), + asb::spot_price::Error::LatestRateFetchFailed(_), + asb::spot_price::Error::LatestRateFetchFailed(_), ) | ( - alice::spot_price::Error::SellQuoteCalculationFailed(_), - alice::spot_price::Error::SellQuoteCalculationFailed(_), + asb::spot_price::Error::SellQuoteCalculationFailed(_), + asb::spot_price::Error::SellQuoteCalculationFailed(_), ) | ( - alice::spot_price::Error::ResumeOnlyMode, - alice::spot_price::Error::ResumeOnlyMode, + asb::spot_price::Error::ResumeOnlyMode, + asb::spot_price::Error::ResumeOnlyMode, ) => {} (alice_assert, error) => { panic!("Expected: {:?} Actual: {:?}", alice_assert, error) diff --git a/swap/src/protocol/alice.rs b/swap/src/protocol/alice.rs index 9d5394ba..d0c8dba6 100644 --- a/swap/src/protocol/alice.rs +++ b/swap/src/protocol/alice.rs @@ -1,12 +1,14 @@ //! Run an XMR/BTC swap in the role of Alice. //! Alice holds XMR and wishes receive BTC. -use crate::database::Database; -use crate::env::Config; -use crate::{bitcoin, monero}; use std::sync::Arc; + use uuid::Uuid; -pub use self::behaviour::{Behaviour, OutEvent}; +use crate::database::Database; +use crate::env::Config; +pub use crate::network::asb::behaviour::{Behaviour, OutEvent}; +use crate::{bitcoin, monero}; + pub use self::event_loop::{EventLoop, EventLoopHandle}; pub use self::recovery::cancel::cancel; pub use self::recovery::punish::punish; @@ -17,11 +19,8 @@ pub use self::recovery::{cancel, punish, redeem, refund, safely_abort}; pub use self::state::*; pub use self::swap::{run, run_until}; -mod behaviour; pub mod event_loop; -mod execution_setup; mod recovery; -mod spot_price; pub mod state; pub mod swap; diff --git a/swap/src/protocol/alice/event_loop.rs b/swap/src/protocol/alice/event_loop.rs index 832f658c..c52d7bfa 100644 --- a/swap/src/protocol/alice/event_loop.rs +++ b/swap/src/protocol/alice/event_loop.rs @@ -1,9 +1,9 @@ use crate::asb::Rate; use crate::database::Database; use crate::env::Config; +use crate::network::asb::spot_price::Error; use crate::network::quote::BidQuote; use crate::network::transfer_proof; -use crate::protocol::alice::spot_price::Error; use crate::protocol::alice::{AliceState, Behaviour, OutEvent, State0, State3, Swap}; use crate::{bitcoin, kraken, monero}; use anyhow::{Context, Result};