diff --git a/api-demo/src/demo/envoy.rs b/api-demo/src/demo/envoy.rs index 7a0e342..913064a 100644 --- a/api-demo/src/demo/envoy.rs +++ b/api-demo/src/demo/envoy.rs @@ -72,7 +72,11 @@ impl Envoy { loop { chapter_title("💸 Envoy tells Passport the USD exchange rate."); let msg = EnvoyMessage::new( - QuantumLinkMessage::ExchangeRate(ExchangeRate::new("USD", 65432.21)), + QuantumLinkMessage::ExchangeRate(ExchangeRate { + currency_code: String::from("USD"), + rate: 65432.21, + timestamp: 0, + }), 12345, ); diff --git a/api/src/api/fx.rs b/api/src/api/fx.rs index 6251d1a..bec1a35 100644 --- a/api/src/api/fx.rs +++ b/api/src/api/fx.rs @@ -6,21 +6,22 @@ pub struct ExchangeRate { pub currency_code: String, #[n(1)] pub rate: f32, + #[n(2)] + pub timestamp: u64, } -impl ExchangeRate { - pub fn new(currency_code: &str, rate: f32) -> Self { - Self { - currency_code: currency_code.to_string(), - rate, - } - } - - pub fn currency_code(&self) -> &str { - &self.currency_code - } +#[quantum_link] +pub struct ExchangeRateHistory { + #[n(0)] + pub history: Vec, + #[n(1)] + pub currency_code: String, +} - pub fn rate(&self) -> f32 { - self.rate - } +#[quantum_link] +pub struct PricePoint { + #[n(0)] + pub rate: f32, + #[n(1)] + pub timestamp: u64, } diff --git a/api/src/api/message.rs b/api/src/api/message.rs index 4a3c020..f9eca59 100644 --- a/api/src/api/message.rs +++ b/api/src/api/message.rs @@ -14,7 +14,7 @@ use crate::{ FirmwareFetchEvent, FirmwareFetchRequest, FirmwareUpdateCheckRequest, FirmwareUpdateCheckResponse, FirmwareUpdateResult, }, - fx::ExchangeRate, + fx::{ExchangeRate, ExchangeRateHistory}, pairing::{PairingRequest, PairingResponse}, scv::SecurityCheck, status::{DeviceStatus, EnvoyStatus}, @@ -74,6 +74,9 @@ impl PassportMessage { pub enum QuantumLinkMessage { #[n(0)] ExchangeRate(#[n(0)] ExchangeRate), + #[n(26)] + ExchangeRateHistory(#[n(0)] ExchangeRateHistory), + #[n(1)] FirmwareUpdateCheckRequest(#[n(0)] FirmwareUpdateCheckRequest), #[n(2)] diff --git a/api/src/api/quantum_link.rs b/api/src/api/quantum_link.rs index 07cb0e0..75895dc 100644 --- a/api/src/api/quantum_link.rs +++ b/api/src/api/quantum_link.rs @@ -256,7 +256,11 @@ mod tests { #[test] fn test_encode_decode_quantumlink_message() { - let fx_rate = ExchangeRate::new("USD", 0.85); + let fx_rate = ExchangeRate { + currency_code: String::from("USD"), + rate: 0.85, + timestamp: 0, + }; let original_message = QuantumLinkMessage::ExchangeRate(fx_rate.clone()); // Encode the message @@ -271,7 +275,7 @@ mod tests { }; // Assert that the original and decoded messages are the same - assert_eq!(fx_rate.rate(), fx_rate_decoded.rate()); + assert_eq!(fx_rate.rate, fx_rate_decoded.rate); } #[test] @@ -279,7 +283,11 @@ mod tests { let envoy = QuantumLinkIdentity::generate(); let passport = QuantumLinkIdentity::generate(); - let fx_rate = ExchangeRate::new("USD", 0.85); + let fx_rate = ExchangeRate { + currency_code: String::from("USD"), + rate: 0.85, + timestamp: 0, + }; let original_message = EnvoyMessage { message: QuantumLinkMessage::ExchangeRate(fx_rate.clone()), timestamp: 123456, @@ -302,7 +310,7 @@ mod tests { }; // Assert that the original and decoded messages are the same - assert_eq!(fx_rate.rate(), fx_rate_decoded.rate()); + assert_eq!(fx_rate.rate, fx_rate_decoded.rate); } #[test] @@ -325,7 +333,11 @@ mod tests { let passport = QuantumLinkIdentity::generate(); let mut arid_cache = ARIDCache::new(); - let fx_rate = ExchangeRate::new("USD", 0.85); + let fx_rate = ExchangeRate { + currency_code: String::from("USD"), + rate: 0.85, + timestamp: 0, + }; let original_message = EnvoyMessage { message: QuantumLinkMessage::ExchangeRate(fx_rate.clone()), timestamp: 123456, @@ -366,7 +378,11 @@ mod tests { let passport = QuantumLinkIdentity::generate(); // Create and seal multiple messages - let fx_rate = ExchangeRate::new("USD", 0.85); + let fx_rate = ExchangeRate { + currency_code: String::from("USD"), + rate: 0.85, + timestamp: 0, + }; let message1 = EnvoyMessage { message: QuantumLinkMessage::ExchangeRate(fx_rate.clone()), timestamp: 123456, @@ -439,7 +455,11 @@ fn test_replay_check() { let envoy = QuantumLinkIdentity::generate(); let passport = QuantumLinkIdentity::generate(); - let fx_rate = ExchangeRate::new("USD", 0.85); + let fx_rate = ExchangeRate { + currency_code: String::from("USD"), + rate: 0.85, + timestamp: 0, + }; let message = EnvoyMessage { message: QuantumLinkMessage::ExchangeRate(fx_rate), timestamp: 123456,