diff --git a/oracle/src/lib.rs b/oracle/src/lib.rs index 4298306e81a5da516110b3013031a79050d7bb0c..8871cf1596f46b84bcf20c4189f49a8fd505d38b 100644 --- a/oracle/src/lib.rs +++ b/oracle/src/lib.rs @@ -8,6 +8,7 @@ mod tests; mod timestamped_value; use codec::Encode; +pub use default_combine_data::DefaultCombineData; use frame_support::{ decl_error, decl_event, decl_module, decl_storage, ensure, traits::{ChangeMembers, Get, InitializeMembers, Time}, @@ -25,8 +26,7 @@ use sp_std::{convert::TryInto, prelude::*, vec}; // FIXME: `pallet/frame-` prefix should be used for all pallet modules, but currently `frame_system` // would cause compiling error in `decl_module!` and `construct_runtime!` // #3295 https://github.com/paritytech/substrate/issues/3295 -pub use default_combine_data::DefaultCombineData; -use frame_system::{self as system, ensure_none, ensure_signed}; +use frame_system::{self as system, ensure_none, ensure_root, ensure_signed}; pub use orml_traits::{CombineData, DataProvider, DataProviderExtended, OnNewData, OnRedundantCall}; use orml_utilities::OrderedSet; pub use timestamped_value::TimestampedValue; @@ -124,7 +124,7 @@ decl_module! { // we can skip doing it here again. _signature: <T::AuthorityId as RuntimeAppPublic>::Signature, ) { - ensure_none(origin)?; + ensure_none(origin.clone()).or_else(|_| ensure_root(origin))?; let who = Self::members().0[index as usize].clone(); Self::_feed_values(who, values)?; } diff --git a/oracle/src/tests.rs b/oracle/src/tests.rs index 4546a5faa0612a3c9240843472ee84dd61a6712c..f96a9b0a2af21761a2477d68f32d94c96b7397be 100644 --- a/oracle/src/tests.rs +++ b/oracle/src/tests.rs @@ -11,7 +11,7 @@ use frame_support::{ unsigned::ValidateUnsigned, }; use sp_runtime::{ - testing::UintAuthorityId, + testing::{TestSignature, UintAuthorityId}, transaction_validity::{InvalidTransaction, TransactionSource, TransactionValidityError}, RuntimeAppPublic, }; @@ -76,6 +76,44 @@ fn should_feed_values() { }); } +#[test] +fn should_feed_values_from_root() { + new_test_ext().execute_with(|| { + let account_id: AccountId = 1; + + assert_ok!(ModuleOracle::feed_values( + Origin::ROOT, + vec![(50, 1000), (51, 900), (52, 800)], + 0, + TestSignature(0, vec![]) + )); + + assert_eq!( + ModuleOracle::raw_values(&account_id, &50), + Some(TimestampedValue { + value: 1000, + timestamp: 12345, + }) + ); + + assert_eq!( + ModuleOracle::raw_values(&account_id, &51), + Some(TimestampedValue { + value: 900, + timestamp: 12345, + }) + ); + + assert_eq!( + ModuleOracle::raw_values(&account_id, &52), + Some(TimestampedValue { + value: 800, + timestamp: 12345, + }) + ); + }); +} + #[test] fn should_update_is_updated() { new_test_ext().execute_with(|| {