Browse Source

Rename `OracleEventId`

This is not just any event id. It is the ID of a price event on the
BitMex exchange.
refactor/no-log-handler
Thomas Eizinger 3 years ago
parent
commit
9c0d320dc1
No known key found for this signature in database GPG Key ID: 651AC83A6C6C8B96
  1. 20
      daemon/src/db.rs
  2. 4
      daemon/src/maker_inc_connections.rs
  3. 8
      daemon/src/model.rs
  4. 12
      daemon/src/model/cfd.rs
  5. 10
      daemon/src/monitor.rs
  6. 40
      daemon/src/oracle.rs
  7. 6
      daemon/src/setup_contract.rs
  8. 4
      daemon/src/taker_cfd.rs
  9. 4
      daemon/src/wire.rs

20
daemon/src/db.rs

@ -1,5 +1,5 @@
use crate::model::cfd::{Cfd, CfdState, Order, OrderId, Origin};
use crate::model::{Leverage, OracleEventId, Position};
use crate::model::{BitMexPriceEventId, Leverage, Position};
use anyhow::{Context, Result};
use rocket_db_pools::sqlx;
use sqlx::pool::PoolConnection;
@ -88,7 +88,7 @@ pub async fn load_order_by_id(
let creation_timestamp = serde_json::from_str(row.creation_timestamp.as_str()).unwrap();
let term = serde_json::from_str(row.term.as_str()).unwrap();
let origin = serde_json::from_str(row.origin.as_str()).unwrap();
let oracle_event_id = OracleEventId(row.oracle_event_id);
let oracle_event_id = BitMexPriceEventId(row.oracle_event_id);
Ok(Order {
id: uuid,
@ -299,7 +299,7 @@ pub async fn load_cfd_by_order_id(
let creation_timestamp = serde_json::from_str(row.creation_timestamp.as_str()).unwrap();
let term = serde_json::from_str(row.term.as_str()).unwrap();
let origin: Origin = serde_json::from_str(row.origin.as_str()).unwrap();
let oracle_event_id = OracleEventId(row.oracle_event_id.clone());
let oracle_event_id = BitMexPriceEventId(row.oracle_event_id.clone());
let quantity = serde_json::from_str(row.quantity_usd.as_str()).unwrap();
let latest_state = serde_json::from_str(row.state.as_str()).unwrap();
@ -377,7 +377,7 @@ pub async fn load_all_cfds(conn: &mut PoolConnection<Sqlite>) -> anyhow::Result<
let creation_timestamp = serde_json::from_str(row.creation_timestamp.as_str()).unwrap();
let term = serde_json::from_str(row.term.as_str()).unwrap();
let origin: Origin = serde_json::from_str(row.origin.as_str()).unwrap();
let oracle_event_id = OracleEventId(row.oracle_event_id.clone());
let oracle_event_id = BitMexPriceEventId(row.oracle_event_id.clone());
let quantity = serde_json::from_str(row.quantity_usd.as_str()).unwrap();
let latest_state = serde_json::from_str(row.state.as_str()).unwrap();
@ -410,7 +410,7 @@ pub async fn load_all_cfds(conn: &mut PoolConnection<Sqlite>) -> anyhow::Result<
/// Loads all CFDs with the latest state as the CFD state
pub async fn load_cfds_by_oracle_event_id(
oracle_event_id: OracleEventId,
oracle_event_id: BitMexPriceEventId,
conn: &mut PoolConnection<Sqlite>,
) -> anyhow::Result<Vec<Cfd>> {
let rows = sqlx::query!(
@ -462,7 +462,7 @@ pub async fn load_cfds_by_oracle_event_id(
let creation_timestamp = serde_json::from_str(row.creation_timestamp.as_str()).unwrap();
let term = serde_json::from_str(row.term.as_str()).unwrap();
let origin: Origin = serde_json::from_str(row.origin.as_str()).unwrap();
let oracle_event_id = OracleEventId(row.oracle_event_id.clone());
let oracle_event_id = BitMexPriceEventId(row.oracle_event_id.clone());
let quantity = serde_json::from_str(row.quantity_usd.as_str()).unwrap();
let latest_state = serde_json::from_str(row.state.as_str()).unwrap();
@ -580,8 +580,8 @@ mod tests {
let pool = setup_test_db().await;
let mut conn = pool.acquire().await.unwrap();
let oracle_event_id_1 = OracleEventId("dummy_1".to_string());
let oracle_event_id_2 = OracleEventId("dummy_2".to_string());
let oracle_event_id_1 = BitMexPriceEventId("dummy_1".to_string());
let oracle_event_id_2 = BitMexPriceEventId("dummy_2".to_string());
let cfd_1 = Cfd::default()
.with_order(Order::default().with_oracle_event_id(oracle_event_id_1.clone()));
@ -686,14 +686,14 @@ mod tests {
Usd(dec!(100)),
Usd(dec!(1000)),
Origin::Theirs,
OracleEventId("Dummy".to_string()),
BitMexPriceEventId("Dummy".to_string()),
)
.unwrap()
}
}
impl Order {
pub fn with_oracle_event_id(mut self, oracle_event_id: OracleEventId) -> Self {
pub fn with_oracle_event_id(mut self, oracle_event_id: BitMexPriceEventId) -> Self {
self.oracle_event_id = oracle_event_id;
self
}

4
daemon/src/maker_inc_connections.rs

@ -1,6 +1,6 @@
use crate::actors::log_error;
use crate::model::cfd::{Order, OrderId};
use crate::model::{OracleEventId, TakerId};
use crate::model::{BitMexPriceEventId, TakerId};
use crate::{maker_cfd, send_to_socket, wire};
use anyhow::{Context as AnyhowContext, Result};
use async_trait::async_trait;
@ -38,7 +38,7 @@ pub enum TakerCommand {
},
NotifyRollOverAccepted {
id: OrderId,
oracle_event_id: OracleEventId,
oracle_event_id: BitMexPriceEventId,
},
NotifyRollOverRejected {
id: OrderId,

8
daemon/src/model.rs

@ -110,9 +110,9 @@ pub struct WalletInfo {
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct OracleEventId(pub String);
pub struct BitMexPriceEventId(pub String);
impl OracleEventId {
impl BitMexPriceEventId {
pub fn to_olivia_url(&self) -> Url {
Url::from_str("https://h00.ooo")
.expect("valid URL from constant")
@ -121,7 +121,7 @@ impl OracleEventId {
}
}
impl Display for OracleEventId {
impl Display for BitMexPriceEventId {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
self.0.fmt(f)
}
@ -133,7 +133,7 @@ mod tests {
#[test]
fn to_olivia_url() {
let url = OracleEventId("/x/BitMEX/BXBT/2021-09-23T10:00:00.price?n=20".to_string())
let url = BitMexPriceEventId("/x/BitMEX/BXBT/2021-09-23T10:00:00.price?n=20".to_string())
.to_olivia_url();
assert_eq!(

12
daemon/src/model/cfd.rs

@ -1,4 +1,4 @@
use crate::model::{Leverage, OracleEventId, Percent, Position, TakerId, TradingPair, Usd};
use crate::model::{BitMexPriceEventId, Leverage, Percent, Position, TakerId, TradingPair, Usd};
use crate::{monitor, oracle};
use anyhow::{bail, Context, Result};
use bdk::bitcoin::secp256k1::{SecretKey, Signature};
@ -97,7 +97,7 @@ pub struct Order {
/// The id of the event to be used for price attestation
///
/// The maker includes this into the Order based on the Oracle announcement to be used.
pub oracle_event_id: OracleEventId,
pub oracle_event_id: BitMexPriceEventId,
}
#[allow(dead_code)] // Only one binary and the tests use this.
@ -109,7 +109,7 @@ impl Order {
min_quantity: Usd,
max_quantity: Usd,
origin: Origin,
oracle_event_id: OracleEventId,
oracle_event_id: BitMexPriceEventId,
) -> Result<Self> {
let leverage = Leverage(2);
let maintenance_margin_rate = dec!(0.005);
@ -286,7 +286,7 @@ pub enum CfdState {
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct Attestation {
pub id: OracleEventId,
pub id: BitMexPriceEventId,
pub scalars: Vec<SecretKey>,
#[serde(with = "::bdk::bitcoin::util::amount::serde::as_sat")]
payout: Amount,
@ -296,7 +296,7 @@ pub struct Attestation {
impl Attestation {
pub fn new(
id: OracleEventId,
id: BitMexPriceEventId,
price: u64,
scalars: Vec<SecretKey>,
dlc: Dlc,
@ -1483,7 +1483,7 @@ pub struct Dlc {
/// The fully signed lock transaction ready to be published on chain
pub lock: (Transaction, Descriptor<PublicKey>),
pub commit: (Transaction, EcdsaAdaptorSignature, Descriptor<PublicKey>),
pub cets: HashMap<OracleEventId, Vec<Cet>>,
pub cets: HashMap<BitMexPriceEventId, Vec<Cet>>,
pub refund: (Transaction, Signature),
#[serde(with = "::bdk::bitcoin::util::amount::serde::as_sat")]

10
daemon/src/monitor.rs

@ -1,6 +1,6 @@
use crate::actors::log_error;
use crate::model::cfd::{CetStatus, Cfd, CfdState, Dlc, OrderId};
use crate::model::OracleEventId;
use crate::model::BitMexPriceEventId;
use crate::oracle::Attestation;
use crate::{model, oracle};
use anyhow::{Context, Result};
@ -27,7 +27,7 @@ pub struct StartMonitoring {
pub struct MonitorParams {
lock: (Txid, Descriptor<PublicKey>),
commit: (Txid, Descriptor<PublicKey>),
cets: HashMap<OracleEventId, Vec<Cet>>,
cets: HashMap<BitMexPriceEventId, Vec<Cet>>,
refund: (Txid, Script, u32),
revoked_commits: Vec<(Txid, Script)>,
}
@ -209,7 +209,7 @@ where
fn monitor_cet_finality(
&mut self,
cets: HashMap<OracleEventId, Vec<Cet>>,
cets: HashMap<BitMexPriceEventId, Vec<Cet>>,
attestation: Attestation,
order_id: OrderId,
) -> Result<()> {
@ -581,8 +581,8 @@ impl From<model::cfd::Cet> for Cet {
}
fn map_cets(
cets: HashMap<OracleEventId, Vec<model::cfd::Cet>>,
) -> HashMap<OracleEventId, Vec<Cet>> {
cets: HashMap<BitMexPriceEventId, Vec<model::cfd::Cet>>,
) -> HashMap<BitMexPriceEventId, Vec<Cet>> {
cets.into_iter()
.map(|(event_id, cets)| {
(

40
daemon/src/oracle.rs

@ -1,6 +1,6 @@
use crate::actors::log_error;
use crate::model::cfd::{Cfd, CfdState};
use crate::model::OracleEventId;
use crate::model::BitMexPriceEventId;
use anyhow::{Context, Result};
use async_trait::async_trait;
use cfd_protocol::secp256k1_zkp::{schnorrsig, SecretKey};
@ -17,9 +17,9 @@ const OLIVIA_EVENT_TIME_FORMAT: &[FormatItem] =
format_description!("[year]-[month]-[day]T[hour]:[minute]:[second]");
pub struct Actor<CFD, M> {
announcements: HashMap<OracleEventId, (OffsetDateTime, Vec<schnorrsig::PublicKey>)>,
pending_announcements: HashSet<OracleEventId>,
pending_attestations: HashSet<OracleEventId>,
announcements: HashMap<BitMexPriceEventId, (OffsetDateTime, Vec<schnorrsig::PublicKey>)>,
pending_announcements: HashSet<BitMexPriceEventId>,
pending_attestations: HashSet<BitMexPriceEventId>,
cfd_actor_address: xtra::Address<CFD>,
monitor_actor_address: xtra::Address<M>,
}
@ -32,25 +32,25 @@ pub struct Sync;
/// The `Announcement` corresponds to the `OracleEventId` included in
/// the message.
#[derive(Debug, Clone)]
pub struct FetchAnnouncement(pub OracleEventId);
pub struct FetchAnnouncement(pub BitMexPriceEventId);
pub struct MonitorAttestation {
pub event_id: OracleEventId,
pub event_id: BitMexPriceEventId,
}
/// Message used to request the `Announcement` from the
/// `oracle::Actor`'s local state.
///
/// The `Announcement` corresponds to the `OracleEventId` included in
/// The `Announcement` corresponds to the [`BitMexPriceEventId`] included in
/// the message.
#[derive(Debug, Clone)]
pub struct GetAnnouncement(pub OracleEventId);
pub struct GetAnnouncement(pub BitMexPriceEventId);
// TODO: Split xtra::Message and API object
#[derive(Debug, Clone, Deserialize, PartialEq)]
#[serde(try_from = "olivia_api::Response")]
pub struct Attestation {
pub id: OracleEventId,
pub id: BitMexPriceEventId,
pub price: u64,
pub scalars: Vec<SecretKey>,
}
@ -58,7 +58,7 @@ pub struct Attestation {
/// A module-private message to allow parallelization of fetching announcements.
#[derive(Debug)]
struct NewAnnouncementFetched {
id: OracleEventId,
id: BitMexPriceEventId,
expected_outcome_time: OffsetDateTime,
nonce_pks: Vec<schnorrsig::PublicKey>,
}
@ -258,7 +258,7 @@ impl<CFD: 'static, M: 'static> xtra::Handler<NewAnnouncementFetched> for Actor<C
}
#[allow(dead_code)]
pub fn next_announcement_after(timestamp: OffsetDateTime) -> Result<OracleEventId> {
pub fn next_announcement_after(timestamp: OffsetDateTime) -> Result<BitMexPriceEventId> {
let adjusted = ceil_to_next_hour(timestamp)?;
Ok(event_id(adjusted))
@ -275,12 +275,12 @@ fn ceil_to_next_hour(original: OffsetDateTime) -> Result<OffsetDateTime, anyhow:
/// Construct the URL of `olivia`'s `BitMEX/BXBT` event to be attested
/// for at the time indicated by the argument `datetime`.
fn event_id(datetime: OffsetDateTime) -> OracleEventId {
fn event_id(datetime: OffsetDateTime) -> BitMexPriceEventId {
let datetime = datetime
.format(&OLIVIA_EVENT_TIME_FORMAT)
.expect("valid formatter for datetime");
OracleEventId(format!("/x/BitMEX/BXBT/{}.price?n=20", datetime))
BitMexPriceEventId(format!("/x/BitMEX/BXBT/{}.price?n=20", datetime))
}
#[derive(Debug, Clone, serde::Deserialize, PartialEq)]
@ -290,7 +290,7 @@ pub struct Announcement {
///
/// Doubles up as the path of the URL for this event i.e.
/// https://h00.ooo/{id}.
pub id: OracleEventId,
pub id: BitMexPriceEventId,
pub expected_outcome_time: OffsetDateTime,
pub nonce_pks: Vec<schnorrsig::PublicKey>,
}
@ -341,7 +341,7 @@ impl xtra::Message for NewAnnouncementFetched {
}
mod olivia_api {
use crate::model::OracleEventId;
use crate::model::BitMexPriceEventId;
use anyhow::Context;
use cfd_protocol::secp256k1_zkp::{schnorrsig, SecretKey};
use std::convert::TryFrom;
@ -363,7 +363,7 @@ mod olivia_api {
serde_json::from_str::<AnnouncementData>(&response.announcement.oracle_event.data)?;
Ok(Self {
id: OracleEventId(data.id),
id: BitMexPriceEventId(data.id),
expected_outcome_time: data.expected_outcome_time,
nonce_pks: data.schemes.olivia_v1.nonces,
})
@ -381,7 +381,7 @@ mod olivia_api {
let attestation = response.attestation.context("attestation missing")?;
Ok(Self {
id: OracleEventId(data.id),
id: BitMexPriceEventId(data.id),
price: attestation.outcome.parse()?,
scalars: attestation.schemes.olivia_v1.scalars,
})
@ -452,7 +452,7 @@ mod olivia_api {
mod tests {
use std::vec;
use crate::model::OracleEventId;
use crate::model::BitMexPriceEventId;
use crate::oracle;
use time::macros::datetime;
@ -462,7 +462,7 @@ mod olivia_api {
let deserialized = serde_json::from_str::<oracle::Announcement>(json).unwrap();
let expected = oracle::Announcement {
id: OracleEventId("/x/BitMEX/BXBT/2021-10-04T22:00:00.price?n=20".to_string()),
id: BitMexPriceEventId("/x/BitMEX/BXBT/2021-10-04T22:00:00.price?n=20".to_string()),
expected_outcome_time: datetime!(2021-10-04 22:00:00).assume_utc(),
nonce_pks: vec![
"8d72028eeaf4b85aec0f750f05a4a320cac193f5d8494bfe05cd4b29f3df4239"
@ -537,7 +537,7 @@ mod olivia_api {
let deserialized = serde_json::from_str::<oracle::Attestation>(json).unwrap();
let expected = oracle::Attestation {
id: OracleEventId("/x/BitMEX/BXBT/2021-10-04T22:00:00.price?n=20".to_string()),
id: BitMexPriceEventId("/x/BitMEX/BXBT/2021-10-04T22:00:00.price?n=20".to_string()),
price: 48935,
scalars: vec![
"1327b3bd0f1faf45d6fed6c96d0c158da22a2033a6fed98bed036df0a4eef484"

6
daemon/src/setup_contract.rs

@ -1,5 +1,5 @@
use crate::model::cfd::{Cet, Cfd, Dlc, RevokedCommit, Role};
use crate::model::OracleEventId;
use crate::model::BitMexPriceEventId;
use crate::wallet::Wallet;
use crate::wire::{
Msg0, Msg1, Msg2, RollOverMsg, RollOverMsg0, RollOverMsg1, RollOverMsg2, SetupMsg,
@ -213,7 +213,7 @@ pub async fn new(
})
})
.collect::<Result<Vec<_>>>()?;
Ok((OracleEventId(event_id), cets))
Ok((BitMexPriceEventId(event_id), cets))
})
.collect::<Result<HashMap<_, _>>>()?;
@ -435,7 +435,7 @@ pub async fn roll_over(
})
})
.collect::<Result<Vec<_>>>()?;
Ok((OracleEventId(event_id), cets))
Ok((BitMexPriceEventId(event_id), cets))
})
.collect::<Result<HashMap<_, _>>>()?;

4
daemon/src/taker_cfd.rs

@ -8,7 +8,7 @@ use crate::model::cfd::{
Role, RollOverProposal, SettlementKind, SettlementProposal, UpdateCfdProposal,
UpdateCfdProposals,
};
use crate::model::{OracleEventId, Usd};
use crate::model::{BitMexPriceEventId, Usd};
use crate::monitor::{self, MonitorParams};
use crate::wallet::Wallet;
use crate::wire::{MakerToTaker, RollOverMsg, SetupMsg};
@ -380,7 +380,7 @@ impl Actor {
async fn handle_roll_over_accepted(
&mut self,
order_id: OrderId,
oracle_event_id: OracleEventId,
oracle_event_id: BitMexPriceEventId,
ctx: &mut Context<Self>,
) -> Result<()> {
tracing::info!(%order_id, "Roll; over request got accepted");

4
daemon/src/wire.rs

@ -1,5 +1,5 @@
use crate::model::cfd::OrderId;
use crate::model::{OracleEventId, Usd};
use crate::model::{BitMexPriceEventId, Usd};
use crate::Order;
use anyhow::{bail, Result};
use bdk::bitcoin::secp256k1::Signature;
@ -72,7 +72,7 @@ pub enum MakerToTaker {
RollOverProtocol(RollOverMsg),
ConfirmRollOver {
order_id: OrderId,
oracle_event_id: OracleEventId,
oracle_event_id: BitMexPriceEventId,
},
RejectRollOver(OrderId),
}

Loading…
Cancel
Save