From 8a2f2b83ccb580a6cb883330ea421d6da559d060 Mon Sep 17 00:00:00 2001 From: Daniel Karzel Date: Wed, 6 Oct 2021 10:38:29 +1100 Subject: [PATCH] `BTreeMap` for announcements in cfd actors Replaces the option on ever update by mapping the oracle's announcement array into a BTreeMap. --- daemon/src/maker_cfd.rs | 30 +++++++++++++++++------------- daemon/src/model.rs | 2 +- daemon/src/taker_cfd.rs | 20 ++++++++++++-------- 3 files changed, 30 insertions(+), 22 deletions(-) diff --git a/daemon/src/maker_cfd.rs b/daemon/src/maker_cfd.rs index 42e8526..85818ee 100644 --- a/daemon/src/maker_cfd.rs +++ b/daemon/src/maker_cfd.rs @@ -8,16 +8,16 @@ use crate::model::cfd::{ Cfd, CfdState, CfdStateChangeEvent, CfdStateCommon, Dlc, Order, OrderId, Origin, Role, SettlementProposal, SettlementProposals, }; -use crate::model::{TakerId, Usd}; +use crate::model::{OracleEventId, TakerId, Usd}; use crate::monitor::MonitorParams; use crate::wallet::Wallet; 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 bdk::bitcoin::secp256k1::schnorrsig; use futures::channel::mpsc; use futures::{future, SinkExt}; -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; use std::time::SystemTime; use tokio::sync::watch; use xtra::prelude::*; @@ -74,7 +74,7 @@ pub struct Actor { current_order_id: Option, monitor_actor: Address>, setup_state: SetupState, - latest_announcements: Option, + latest_announcements: Option>, oracle_actor: Address>>, current_settlement_proposals: HashMap, } @@ -135,12 +135,11 @@ impl Actor { .latest_announcements .clone() .context("Cannot create order because no announcement from oracle")? - .0 .iter() - .last() + .next_back() .context("Empty list of announcements")? - .clone() - .id; + .0 + .clone(); let order = Order::new( price, @@ -373,10 +372,8 @@ impl Actor { .clone() .context("No oracle announcements available")?; let offer_announcement = offer_announcements - .0 - .iter() - .find(|announcement| announcement.id == cfd.order.oracle_event_id) - .context("Order's announcement not found in list of current oracle announcements")?; + .get(&cfd.order.oracle_event_id) + .context("Order's announcement not found in current oracle announcements")?; self.oracle_actor .do_send_async(oracle::MonitorEvent { @@ -543,7 +540,14 @@ impl Actor { announcements: oracle::Announcements, ) -> Result<()> { 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(()) } diff --git a/daemon/src/model.rs b/daemon/src/model.rs index 72151b9..0024a15 100644 --- a/daemon/src/model.rs +++ b/daemon/src/model.rs @@ -106,5 +106,5 @@ pub struct WalletInfo { 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); diff --git a/daemon/src/taker_cfd.rs b/daemon/src/taker_cfd.rs index 8a056c8..265ff02 100644 --- a/daemon/src/taker_cfd.rs +++ b/daemon/src/taker_cfd.rs @@ -7,7 +7,7 @@ use crate::model::cfd::{ Cfd, CfdState, CfdStateChangeEvent, CfdStateCommon, Dlc, Order, OrderId, Origin, Role, SettlementProposal, SettlementProposals, }; -use crate::model::Usd; +use crate::model::{OracleEventId, Usd}; use crate::monitor::{self, MonitorParams}; use crate::wallet::Wallet; use crate::wire::SetupMsg; @@ -17,7 +17,7 @@ use async_trait::async_trait; use bdk::bitcoin::secp256k1::schnorrsig; use futures::channel::mpsc; use futures::{future, SinkExt}; -use std::collections::HashMap; +use std::collections::{BTreeMap, HashMap}; use std::time::SystemTime; use tokio::sync::watch; use xtra::prelude::*; @@ -63,7 +63,7 @@ pub struct Actor { send_to_maker: Address>, monitor_actor: Address>, setup_state: SetupState, - latest_announcements: Option, + latest_announcements: Option>, oracle_actor: Address>>, current_settlement_proposals: HashMap, } @@ -218,10 +218,8 @@ impl Actor { .clone() .context("No oracle announcements available")?; let offer_announcement = offer_announcements - .0 - .iter() - .find(|announcement| announcement.id == cfd.order.oracle_event_id) - .context("Order's announcement not found in list of current oracle announcements")?; + .get(&cfd.order.oracle_event_id) + .context("Order's announcement not found in current oracle announcements")?; self.oracle_actor .do_send_async(oracle::MonitorEvent { @@ -397,7 +395,13 @@ impl Actor { &mut self, announcements: oracle::Announcements, ) -> Result<()> { - self.latest_announcements = Some(announcements); + self.latest_announcements.replace( + announcements + .0 + .iter() + .map(|announcement| (announcement.id.clone(), announcement.clone())) + .collect(), + ); Ok(()) }