diff --git a/oracle/src/lib.rs b/oracle/src/lib.rs index 42568d868..b92fbeb10 100644 --- a/oracle/src/lib.rs +++ b/oracle/src/lib.rs @@ -163,7 +163,16 @@ pub mod module { let feeder = ensure_signed(origin.clone()) .map(Some) .or_else(|_| ensure_root(origin).map(|_| None))?; - Self::do_feed_values(feeder, values)?; + + let who = Self::ensure_account(feeder)?; + + // ensure account hasn't dispatched an updated yet + ensure!( + HasDispatched::::mutate(|set| set.insert(who.clone())), + Error::::AlreadyFeeded + ); + + Self::do_feed_values(who, values)?; Ok(Pays::No.into()) } } @@ -193,21 +202,17 @@ impl, I: 'static> Pallet { T::CombineData::combine_data(key, values, Self::values(key)) } - fn do_feed_values(who: Option, values: Vec<(T::OracleKey, T::OracleValue)>) -> DispatchResult { + fn ensure_account(who: Option) -> Result { // ensure feeder is authorized - let who = if let Some(who) = who { + if let Some(who) = who { ensure!(T::Members::contains(&who), Error::::NoPermission); - who + Ok(who) } else { - T::RootOperatorAccountId::get() - }; - - // ensure account hasn't dispatched an updated yet - ensure!( - HasDispatched::::mutate(|set| set.insert(who.clone())), - Error::::AlreadyFeeded - ); + Ok(T::RootOperatorAccountId::get()) + } + } + fn do_feed_values(who: T::AccountId, values: Vec<(T::OracleKey, T::OracleValue)>) -> DispatchResult { let now = T::Time::now(); for (key, value) in &values { let timestamped = TimestampedValue { @@ -259,6 +264,6 @@ impl, I: 'static> DataProviderExtended, I: 'static> DataFeeder for Pallet { fn feed_value(who: T::AccountId, key: T::OracleKey, value: T::OracleValue) -> DispatchResult { - Self::do_feed_values(Some(who), vec![(key, value)]) + Self::do_feed_values(Self::ensure_account(Some(who))?, vec![(key, value)]) } }