diff --git a/oracle/src/default_combine_data.rs b/oracle/src/default_combine_data.rs index aabaa522cfc7a7dcd441621eb220efbeae4ce8fe..23352a3183aea8fe2437490408b98f204f2232b2 100644 --- a/oracle/src/default_combine_data.rs +++ b/oracle/src/default_combine_data.rs @@ -1,23 +1,26 @@ -use frame_support::{ - parameter_types, - traits::{Get, Time}, -}; +use frame_support::traits::{Get, Time}; use orml_traits::CombineData; -use rstd::prelude::Vec; +use rstd::prelude::*; use crate::{MomentOf, TimestampedValueOf, Trait}; /// Sort by value and returns median timestamped value. /// Returns prev_value if not enough valid values. -pub struct DefaultCombineData<T: Trait>(rstd::marker::PhantomData<T>); - -impl<T: Trait> CombineData<T::OracleKey, TimestampedValueOf<T>> for DefaultCombineData<T> { +pub struct DefaultCombineData<T, MinimumCount, ExpiresIn>(rstd::marker::PhantomData<(T, MinimumCount, ExpiresIn)>); + +impl<T, MinimumCount, ExpiresIn> CombineData<T::OracleKey, TimestampedValueOf<T>> + for DefaultCombineData<T, MinimumCount, ExpiresIn> +where + T: Trait, + MinimumCount: Get<u32>, + ExpiresIn: Get<MomentOf<T>>, +{ fn combine_data( _key: &T::OracleKey, values: Vec<TimestampedValueOf<T>>, prev_value: Option<TimestampedValueOf<T>>, ) -> Option<TimestampedValueOf<T>> { - let expires_in: MomentOf<T> = <Self as Parameters<MomentOf<T>>>::expires_in::get().into(); + let expires_in = ExpiresIn::get(); let now = T::Time::now(); let mut valid_values = values .into_iter() @@ -29,8 +32,8 @@ impl<T: Trait> CombineData<T::OracleKey, TimestampedValueOf<T>> for DefaultCombi }) .collect::<Vec<TimestampedValueOf<T>>>(); - let count = valid_values.len(); - let minimum_count = <Self as Parameters<MomentOf<T>>>::minimum_count::get(); + let count = valid_values.len() as u32; + let minimum_count = MinimumCount::get(); if count < minimum_count { return prev_value; } @@ -38,21 +41,6 @@ impl<T: Trait> CombineData<T::OracleKey, TimestampedValueOf<T>> for DefaultCombi valid_values.sort_by(|a, b| a.value.cmp(&b.value)); let median_index = count / 2; - return Some(valid_values[median_index].clone()); + return Some(valid_values[median_index as usize].clone()); } } - -parameter_types! { - pub const MinimumCount: usize = 3; - pub const ExpiresIn: u32 = 600; -} - -trait Parameters<Moment> { - type minimum_count: Get<usize>; - type expires_in: Get<Moment>; -} - -impl<T: Trait> Parameters<MomentOf<T>> for DefaultCombineData<T> { - type minimum_count = MinimumCount; - type expires_in = ExpiresIn; -} diff --git a/oracle/src/mock.rs b/oracle/src/mock.rs index 0f3c97dc73244bfd7b62f56aa7b720437a906696..b7b6064295650428ed331cacc2b73406be5495ca 100644 --- a/oracle/src/mock.rs +++ b/oracle/src/mock.rs @@ -71,11 +71,16 @@ impl OperatorProvider<AccountId> for MockOperatorProvider { } } +parameter_types! { + pub const MinimumCount: u32 = 3; + pub const ExpiresIn: u32 = 600; +} + impl Trait for Test { type Event = (); type OnNewData = (); type OperatorProvider = MockOperatorProvider; - type CombineData = DefaultCombineData<Self>; + type CombineData = DefaultCombineData<Self, MinimumCount, ExpiresIn>; type Time = pallet_timestamp::Module<Self>; type OracleKey = Key; type OracleValue = Value;