Skip to content

Commit

Permalink
Oracle implementations use async and sync
Browse files Browse the repository at this point in the history
  • Loading branch information
bennyhodl committed Nov 1, 2024
1 parent 7f568d0 commit 65a040d
Show file tree
Hide file tree
Showing 3 changed files with 76 additions and 8 deletions.
20 changes: 12 additions & 8 deletions mocks/src/mock_oracle_provider.rs
Original file line number Diff line number Diff line change
Expand Up @@ -86,18 +86,22 @@ impl Oracle for MockOracle {
}

async fn get_announcement(&self, event_id: &str) -> Result<OracleAnnouncement, DaemonError> {
let res = self
.announcements
.get(event_id)
.ok_or_else(|| DaemonError::OracleError("Announcement not found".to_string()))?;
let res = std::future::ready(
self.announcements
.get(event_id)
.ok_or_else(|| DaemonError::OracleError("Announcement not found".to_string()))?,
)
.await;
Ok(res.clone())
}

async fn get_attestation(&self, event_id: &str) -> Result<OracleAttestation, DaemonError> {
let res = self
.attestations
.get(event_id)
.ok_or_else(|| DaemonError::OracleError("Attestation not found".to_string()))?;
let res = std::future::ready(
self.attestations
.get(event_id)
.ok_or_else(|| DaemonError::OracleError("Attestation not found".to_string()))?,
)
.await;
Ok(res.clone())
}
}
Expand Down
5 changes: 5 additions & 0 deletions p2pd-oracle-client/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,14 @@ homepage = "https://github.com/p2pderivatives/rust-dlc"
license-file = "../LICENSE"
name = "p2pd-oracle-client"
repository = "https://github.com/p2pderivatives/rust-dlc/tree/master/p2pd-oracle-client"
edition = "2018"
version = "0.1.0"

[features]
async = ["dep:async-trait", "dlc-manager/async"]

[dependencies]
async-trait = { version = "0.1.83", optional = true }
chrono = {version = "0.4.19", features = ["serde"]}
dlc-manager = {path = "../dlc-manager"}
dlc-messages = {path = "../dlc-messages", features = ["use-serde"]}
Expand Down
59 changes: 59 additions & 0 deletions p2pd-oracle-client/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -144,6 +144,7 @@ fn parse_event_id(event_id: &str) -> Result<(String, DateTime<Utc>), DlcManagerE
Ok((asset_id.to_string(), date_time))
}

#[cfg(not(feature = "async"))]
impl Oracle for P2PDOracleClient {
fn get_public_key(&self) -> XOnlyPublicKey {
self.public_key
Expand Down Expand Up @@ -177,6 +178,62 @@ impl Oracle for P2PDOracleClient {
}
}

#[cfg(feature = "async")]
#[async_trait::async_trait]
impl Oracle for P2PDOracleClient {
fn get_public_key(&self) -> XOnlyPublicKey {
self.public_key
}

async fn get_announcement(
&self,
event_id: &str,
) -> Result<OracleAnnouncement, DlcManagerError> {
let (asset_id, date_time) = parse_event_id(event_id)?;
let path = announcement_path(&self.host, &asset_id, &date_time);
let announcement = reqwest::get(&path)
.await
.map_err(|x| {
dlc_manager::error::Error::IOError(
std::io::Error::new(std::io::ErrorKind::Other, x).into(),
)
})?
.json::<OracleAnnouncement>()
.await
.map_err(|e| DlcManagerError::OracleError(e.to_string()))?;

Ok(announcement)
}

async fn get_attestation(
&self,
event_id: &str,
) -> Result<OracleAttestation, dlc_manager::error::Error> {
let (asset_id, date_time) = parse_event_id(event_id)?;
let path = attestation_path(&self.host, &asset_id, &date_time);
let AttestationResponse {
event_id: _,
signatures,
values,
} = reqwest::get(&path)
.await
.map_err(|x| {
dlc_manager::error::Error::IOError(
std::io::Error::new(std::io::ErrorKind::Other, x).into(),
)
})?
.json::<AttestationResponse>()
.await
.map_err(|e| DlcManagerError::OracleError(e.to_string()))?;

Ok(OracleAttestation {
oracle_public_key: self.public_key,
signatures,
outcomes: values,
})
}
}

#[cfg(test)]
mod tests {
extern crate mockito;
Expand Down Expand Up @@ -217,6 +274,7 @@ mod tests {
}

#[test]
#[cfg(not(feature = "async"))]
fn get_announcement_test() {
let url = &mockito::server_url();
let _pubkey_mock = pubkey_mock();
Expand All @@ -237,6 +295,7 @@ mod tests {
}

#[test]
#[cfg(not(feature = "async"))]
fn get_attestation_test() {
let url = &mockito::server_url();
let _pubkey_mock = pubkey_mock();
Expand Down

0 comments on commit 65a040d

Please sign in to comment.