Browse Source

Merge pull request #184 from comit-network/fix-olivia-actor

Some fixes around the oracle actor
upload-correct-windows-binary
Thomas Eizinger 3 years ago
committed by GitHub
parent
commit
79c7570498
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 19
      Cargo.lock
  2. 2
      daemon/Cargo.toml
  3. 59
      daemon/src/oracle.rs

19
Cargo.lock

@ -1003,6 +1003,21 @@ dependencies = [
"want",
]
[[package]]
name = "hyper-rustls"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f9f7a97316d44c0af9b0301e65010573a853a9fc97046d7331d7f6bc0fd5a64"
dependencies = [
"futures-util",
"hyper",
"log",
"rustls 0.19.1",
"tokio",
"tokio-rustls",
"webpki",
]
[[package]]
name = "ident_case"
version = "1.0.1"
@ -1775,6 +1790,7 @@ dependencies = [
"http",
"http-body",
"hyper",
"hyper-rustls",
"ipnet",
"js-sys",
"lazy_static",
@ -1782,14 +1798,17 @@ dependencies = [
"mime",
"percent-encoding",
"pin-project-lite",
"rustls 0.19.1",
"serde",
"serde_json",
"serde_urlencoded",
"tokio",
"tokio-rustls",
"url",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"webpki-roots 0.21.1",
"winreg",
]

2
daemon/Cargo.toml

@ -15,7 +15,7 @@ futures = { version = "0.3", default-features = false }
hex = "0.4"
hkdf = "0.11"
rand = "0.6"
reqwest = { version = "0.11", default-features = false, features = ["json"] }
reqwest = { version = "0.11", default-features = false, features = ["json", "rustls-tls-webpki-roots"] }
rocket = { version = "0.5.0-rc.1", features = ["json"] }
rocket-basicauth = { version = "2", default-features = false }
rocket_db_pools = { git = "https://github.com/SergioBenitez/Rocket", features = ["sqlx_sqlite"] }

59
daemon/src/oracle.rs

@ -1,17 +1,20 @@
use crate::actors::log_error;
use anyhow::Result;
use anyhow::{Context, Result};
use async_trait::async_trait;
use cfd_protocol::secp256k1_zkp::{schnorrsig, SecretKey};
use futures::stream::FuturesOrdered;
use futures::TryStreamExt;
use rocket::time::{format_description, Duration, OffsetDateTime, Time};
use rocket::time::format_description::FormatItem;
use rocket::time::macros::format_description;
use rocket::time::{Duration, OffsetDateTime, Time};
use std::collections::HashSet;
use std::convert::TryFrom;
/// Where `olivia` is located.
const OLIVIA_URL: &str = "https://h00.ooo/";
const OLIVIA_EVENT_TIME_FORMAT: &str = "[year]-[month]-[day]T[hour]:[minute]:[second]";
const OLIVIA_EVENT_TIME_FORMAT: &[FormatItem] =
format_description!("[year]-[month]-[day]T[hour]:[minute]:[second]");
pub struct Actor<CFD, M>
where
@ -42,8 +45,12 @@ where
}
async fn update_state(&mut self) -> Result<()> {
self.update_latest_announcements().await?;
self.update_pending_attestations().await?;
self.update_latest_announcements()
.await
.context("failed to update announcements")?;
self.update_pending_attestations()
.await
.context("failed to update pending attestations")?;
Ok(())
}
@ -51,11 +58,19 @@ where
async fn update_latest_announcements(&mut self) -> Result<()> {
let new_announcements = next_urls()
.into_iter()
.map(|event_url| async {
let announcement = reqwest::get(event_url)
.await?
.map(|event_url| async move {
let response = reqwest::get(event_url.clone())
.await
.with_context(|| format!("Failed to GET {}", event_url))?;
if !response.status().is_success() {
anyhow::bail!("GET {} responded with {}", event_url, response.status());
}
let announcement = response
.json::<Announcement>()
.await?;
.await
.context("Failed to deserialize as Announcement")?;
Result::<_, anyhow::Error>::Ok(announcement)
})
.collect::<FuturesOrdered<_>>()
@ -173,12 +188,11 @@ fn next_24_hours(datetime: OffsetDateTime) -> Vec<OffsetDateTime> {
/// Construct the URL of `olivia`'s `BitMEX/BXBT` event to be attested
/// for at the time indicated by the argument `datetime`.
fn event_url(datetime: OffsetDateTime) -> String {
let formatter = format_description::parse(OLIVIA_EVENT_TIME_FORMAT).expect("valid formatter");
datetime
.format(&formatter)
let datetime = datetime
.format(&OLIVIA_EVENT_TIME_FORMAT)
.expect("valid formatter for datetime");
format!("{}/BitMEX/BXBT/{}/price", OLIVIA_URL, datetime)
format!("{}x/BitMEX/BXBT/{}.price", OLIVIA_URL, datetime)
}
#[derive(Debug, Clone, serde::Deserialize, PartialEq)]
@ -250,16 +264,15 @@ mod olivia_api {
use crate::oracle::OLIVIA_EVENT_TIME_FORMAT;
use serde::de::Error as _;
use serde::{Deserialize, Deserializer};
use time::{format_description, OffsetDateTime, PrimitiveDateTime};
use time::{OffsetDateTime, PrimitiveDateTime};
pub fn deserialize<'a, D>(deserializer: D) -> Result<OffsetDateTime, D::Error>
where
D: Deserializer<'a>,
{
let string = String::deserialize(deserializer)?;
let format = format_description::parse(OLIVIA_EVENT_TIME_FORMAT).expect("valid format");
let date_time = PrimitiveDateTime::parse(&string, &format).map_err(D::Error::custom)?;
let date_time = PrimitiveDateTime::parse(&string, &OLIVIA_EVENT_TIME_FORMAT)
.map_err(D::Error::custom)?;
Ok(date_time.assume_utc())
}
@ -315,18 +328,16 @@ mod olivia_api {
#[cfg(test)]
mod tests {
use super::*;
use time::format_description;
use time::macros::datetime;
#[test]
fn next_event_url_is_correct() {
let datetime = datetime!(2021-09-23 10:43:00);
let format = format_description::parse(OLIVIA_EVENT_TIME_FORMAT).unwrap();
let date_time_formatted = datetime.format(&format).unwrap();
let expected = "2021-09-23T10:43:00";
let url = event_url(datetime!(2021-09-23 10:00:00).assume_utc());
assert_eq!(date_time_formatted, expected);
assert_eq!(
url,
"https://h00.ooo/x/BitMEX/BXBT/2021-09-23T10:00:00.price"
);
}
#[test]

Loading…
Cancel
Save