diff --git a/prices/src/lib.rs b/prices/src/lib.rs index b727568dd0a5210ae8aab486eb4d1f51865bea03..5597d7885c038fc16f6ef4ad1e0cc6564dbe065b 100644 --- a/prices/src/lib.rs +++ b/prices/src/lib.rs @@ -2,12 +2,14 @@ use frame_support::{decl_module, decl_storage, Parameter}; use orml_traits::{DataProvider, PriceProvider}; -use sr_primitives::traits::{MaybeSerializeDeserialize, Member, SimpleArithmetic, Zero}; +use orml_utilities::FixedU128; +use sr_primitives::traits::{MaybeSerializeDeserialize, Member}; + +pub type Price = FixedU128; pub trait Trait: frame_system::Trait { type CurrencyId: Parameter + Member + Copy + MaybeSerializeDeserialize; - type Price: Parameter + Member + Zero + SimpleArithmetic + Copy + Ord; - type Source: DataProvider<Self::CurrencyId, Self::Price>; + type Source: DataProvider<Self::CurrencyId, Price>; } mod mock; @@ -23,14 +25,11 @@ decl_module! { impl<T: Trait> Module<T> {} -impl<T: Trait> PriceProvider<T::CurrencyId, T::Price> for Module<T> { - fn get_price(base: T::CurrencyId, quote: T::CurrencyId) -> Option<T::Price> { - if let (Some(base_price), Some(quote_price)) = (T::Source::get(&base), (T::Source::get("e))) { - if !base_price.is_zero() { - return Some(quote_price / base_price); - } - } +impl<T: Trait> PriceProvider<T::CurrencyId, Price> for Module<T> { + fn get_price(base_currency_id: T::CurrencyId, quote_currency_id: T::CurrencyId) -> Option<Price> { + let base_price = T::Source::get(&base_currency_id)?; + let quote_price = T::Source::get("e_currency_id)?; - None + quote_price.checked_div(&base_price) } } diff --git a/prices/src/mock.rs b/prices/src/mock.rs index aee5056ddea7e41316b16645b49e902cb859c645..5e4e9d5542f56e6187c7fe7fe856473323f12e31 100644 --- a/prices/src/mock.rs +++ b/prices/src/mock.rs @@ -44,16 +44,15 @@ impl frame_system::Trait for Runtime { type Version = (); } -type Price = u32; type CurrencyId = u32; pub struct MockDataProvider; impl DataProvider<CurrencyId, Price> for MockDataProvider { fn get(currency: &CurrencyId) -> Option<Price> { match currency { - 0 => Some(0), - 1 => Some(1), - 2 => Some(2), + 0 => Some(Price::from_parts(0)), + 1 => Some(Price::from_parts(1)), + 2 => Some(Price::from_parts(2)), _ => None, } } @@ -61,7 +60,6 @@ impl DataProvider<CurrencyId, Price> for MockDataProvider { impl Trait for Runtime { type CurrencyId = CurrencyId; - type Price = Price; type Source = MockDataProvider; } diff --git a/prices/src/tests.rs b/prices/src/tests.rs index ac07fc9e81258f7b2de7b0d42e6f4e68c3aa7e30..f241d15a3b603c5d3383f962aba7669b32d2e08f 100644 --- a/prices/src/tests.rs +++ b/prices/src/tests.rs @@ -8,7 +8,7 @@ use mock::{ExtBuilder, PricesModule}; #[test] fn get_price_should_work() { ExtBuilder::default().build().execute_with(|| { - assert_eq!(PricesModule::get_price(1, 2), Some(2)); + assert_eq!(PricesModule::get_price(1, 2), Some(Price::from_rational(2, 1))); }); } @@ -25,6 +25,6 @@ fn price_is_none_should_not_panic() { fn price_is_zero_should_not_panic() { ExtBuilder::default().build().execute_with(|| { assert_eq!(PricesModule::get_price(0, 0), None); - assert_eq!(PricesModule::get_price(1, 0), Some(0)); + assert_eq!(PricesModule::get_price(1, 0), Some(Price::from_parts(0))); }); }