Browse Source

`BTreeMap` for announcements in cfd actors

Replaces the option on ever update by mapping the oracle's announcement array into a BTreeMap.
upload-correct-windows-binary
Daniel Karzel 3 years ago
parent
commit
8a2f2b83cc
No known key found for this signature in database GPG Key ID: 30C3FC2E438ADB6E
  1. 30
      daemon/src/maker_cfd.rs
  2. 2
      daemon/src/model.rs
  3. 20
      daemon/src/taker_cfd.rs

30
daemon/src/maker_cfd.rs

@ -8,16 +8,16 @@ use crate::model::cfd::{
Cfd, CfdState, CfdStateChangeEvent, CfdStateCommon, Dlc, Order, OrderId, Origin, Role, Cfd, CfdState, CfdStateChangeEvent, CfdStateCommon, Dlc, Order, OrderId, Origin, Role,
SettlementProposal, SettlementProposals, SettlementProposal, SettlementProposals,
}; };
use crate::model::{TakerId, Usd}; use crate::model::{OracleEventId, TakerId, Usd};
use crate::monitor::MonitorParams; use crate::monitor::MonitorParams;
use crate::wallet::Wallet; use crate::wallet::Wallet;
use crate::{maker_inc_connections, monitor, oracle, setup_contract, wire}; use crate::{maker_inc_connections, monitor, oracle, setup_contract, wire};
use anyhow::{bail, Context as _, Result}; use anyhow::{Context as _, Result};
use async_trait::async_trait; use async_trait::async_trait;
use bdk::bitcoin::secp256k1::schnorrsig; use bdk::bitcoin::secp256k1::schnorrsig;
use futures::channel::mpsc; use futures::channel::mpsc;
use futures::{future, SinkExt}; use futures::{future, SinkExt};
use std::collections::HashMap; use std::collections::{BTreeMap, HashMap};
use std::time::SystemTime; use std::time::SystemTime;
use tokio::sync::watch; use tokio::sync::watch;
use xtra::prelude::*; use xtra::prelude::*;
@ -74,7 +74,7 @@ pub struct Actor {
current_order_id: Option<OrderId>, current_order_id: Option<OrderId>,
monitor_actor: Address<monitor::Actor<Actor>>, monitor_actor: Address<monitor::Actor<Actor>>,
setup_state: SetupState, setup_state: SetupState,
latest_announcements: Option<oracle::Announcements>, latest_announcements: Option<BTreeMap<OracleEventId, oracle::Announcement>>,
oracle_actor: Address<oracle::Actor<Actor, monitor::Actor<Actor>>>, oracle_actor: Address<oracle::Actor<Actor, monitor::Actor<Actor>>>,
current_settlement_proposals: HashMap<OrderId, SettlementProposal>, current_settlement_proposals: HashMap<OrderId, SettlementProposal>,
} }
@ -135,12 +135,11 @@ impl Actor {
.latest_announcements .latest_announcements
.clone() .clone()
.context("Cannot create order because no announcement from oracle")? .context("Cannot create order because no announcement from oracle")?
.0
.iter() .iter()
.last() .next_back()
.context("Empty list of announcements")? .context("Empty list of announcements")?
.clone() .0
.id; .clone();
let order = Order::new( let order = Order::new(
price, price,
@ -373,10 +372,8 @@ impl Actor {
.clone() .clone()
.context("No oracle announcements available")?; .context("No oracle announcements available")?;
let offer_announcement = offer_announcements let offer_announcement = offer_announcements
.0 .get(&cfd.order.oracle_event_id)
.iter() .context("Order's announcement not found in current oracle announcements")?;
.find(|announcement| announcement.id == cfd.order.oracle_event_id)
.context("Order's announcement not found in list of current oracle announcements")?;
self.oracle_actor self.oracle_actor
.do_send_async(oracle::MonitorEvent { .do_send_async(oracle::MonitorEvent {
@ -543,7 +540,14 @@ impl Actor {
announcements: oracle::Announcements, announcements: oracle::Announcements,
) -> Result<()> { ) -> Result<()> {
tracing::debug!("Updating latest oracle announcements"); tracing::debug!("Updating latest oracle announcements");
self.latest_announcements = Some(announcements);
self.latest_announcements.replace(
announcements
.0
.iter()
.map(|announcement| (announcement.id.clone(), announcement.clone()))
.collect(),
);
Ok(()) Ok(())
} }

2
daemon/src/model.rs

@ -106,5 +106,5 @@ pub struct WalletInfo {
pub last_updated_at: SystemTime, pub last_updated_at: SystemTime,
} }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash)] #[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct OracleEventId(pub String); pub struct OracleEventId(pub String);

20
daemon/src/taker_cfd.rs

@ -7,7 +7,7 @@ use crate::model::cfd::{
Cfd, CfdState, CfdStateChangeEvent, CfdStateCommon, Dlc, Order, OrderId, Origin, Role, Cfd, CfdState, CfdStateChangeEvent, CfdStateCommon, Dlc, Order, OrderId, Origin, Role,
SettlementProposal, SettlementProposals, SettlementProposal, SettlementProposals,
}; };
use crate::model::Usd; use crate::model::{OracleEventId, Usd};
use crate::monitor::{self, MonitorParams}; use crate::monitor::{self, MonitorParams};
use crate::wallet::Wallet; use crate::wallet::Wallet;
use crate::wire::SetupMsg; use crate::wire::SetupMsg;
@ -17,7 +17,7 @@ use async_trait::async_trait;
use bdk::bitcoin::secp256k1::schnorrsig; use bdk::bitcoin::secp256k1::schnorrsig;
use futures::channel::mpsc; use futures::channel::mpsc;
use futures::{future, SinkExt}; use futures::{future, SinkExt};
use std::collections::HashMap; use std::collections::{BTreeMap, HashMap};
use std::time::SystemTime; use std::time::SystemTime;
use tokio::sync::watch; use tokio::sync::watch;
use xtra::prelude::*; use xtra::prelude::*;
@ -63,7 +63,7 @@ pub struct Actor {
send_to_maker: Address<send_to_socket::Actor<wire::TakerToMaker>>, send_to_maker: Address<send_to_socket::Actor<wire::TakerToMaker>>,
monitor_actor: Address<monitor::Actor<Actor>>, monitor_actor: Address<monitor::Actor<Actor>>,
setup_state: SetupState, setup_state: SetupState,
latest_announcements: Option<oracle::Announcements>, latest_announcements: Option<BTreeMap<OracleEventId, oracle::Announcement>>,
oracle_actor: Address<oracle::Actor<Actor, monitor::Actor<Actor>>>, oracle_actor: Address<oracle::Actor<Actor, monitor::Actor<Actor>>>,
current_settlement_proposals: HashMap<OrderId, SettlementProposal>, current_settlement_proposals: HashMap<OrderId, SettlementProposal>,
} }
@ -218,10 +218,8 @@ impl Actor {
.clone() .clone()
.context("No oracle announcements available")?; .context("No oracle announcements available")?;
let offer_announcement = offer_announcements let offer_announcement = offer_announcements
.0 .get(&cfd.order.oracle_event_id)
.iter() .context("Order's announcement not found in current oracle announcements")?;
.find(|announcement| announcement.id == cfd.order.oracle_event_id)
.context("Order's announcement not found in list of current oracle announcements")?;
self.oracle_actor self.oracle_actor
.do_send_async(oracle::MonitorEvent { .do_send_async(oracle::MonitorEvent {
@ -397,7 +395,13 @@ impl Actor {
&mut self, &mut self,
announcements: oracle::Announcements, announcements: oracle::Announcements,
) -> Result<()> { ) -> Result<()> {
self.latest_announcements = Some(announcements); self.latest_announcements.replace(
announcements
.0
.iter()
.map(|announcement| (announcement.id.clone(), announcement.clone()))
.collect(),
);
Ok(()) Ok(())
} }

Loading…
Cancel
Save