@@ -163,8 +163,8 @@ macro_rules! impl_outer_origin {
163163 Modules { } ;
164164 $( $module: ident $( < $generic: ident > ) ? $( { $generic_instance: ident } ) ? , ) *
165165 ) => {
166- // WARNING: All instance must hold the filter `frame_system::Trait::BaseCallFilter`.
167- // One can use `OriginTrait::reset_filter` to do so.
166+ // WARNING: All instance must hold the filter `frame_system::Trait::BaseCallFilter`, except
167+ // when caller is system Root. One can use `OriginTrait::reset_filter` to do so.
168168 #[ derive( Clone ) ]
169169 pub struct $name {
170170 caller: $caller_name,
@@ -241,28 +241,40 @@ macro_rules! impl_outer_origin {
241241
242242 #[ allow( dead_code) ]
243243 impl $name {
244+ /// Create with system none origin and `frame-system::Trait::BaseCallFilter`.
244245 pub fn none( ) -> Self {
245246 $system:: RawOrigin :: None . into( )
246247 }
248+ /// Create with system root origin and no filter.
247249 pub fn root( ) -> Self {
248250 $system:: RawOrigin :: Root . into( )
249251 }
252+ /// Create with system signed origin and `frame-system::Trait::BaseCallFilter`.
250253 pub fn signed( by: <$runtime as $system:: Trait >:: AccountId ) -> Self {
251254 $system:: RawOrigin :: Signed ( by) . into( )
252255 }
253256 }
254257
255258 impl From <$system:: Origin <$runtime>> for $name {
259+ /// Convert to runtime origin:
260+ /// * root origin is built with no filter
261+ /// * others use `frame-system::Trait::BaseCallFilter`
256262 fn from( x: $system:: Origin <$runtime>) -> Self {
257263 let mut o = $name {
258264 caller: $caller_name:: system( x) ,
259265 filter: $crate:: sp_std:: rc:: Rc :: new( Box :: new( |_| true ) ) ,
260266 } ;
261- $crate:: traits:: OriginTrait :: reset_filter( & mut o) ;
267+
268+ // Root has no filter
269+ if !matches!( o. caller, $caller_name:: system( $system:: Origin :: <$runtime>:: Root ) ) {
270+ $crate:: traits:: OriginTrait :: reset_filter( & mut o) ;
271+ }
272+
262273 o
263274 }
264275 }
265276 impl Into <$crate:: sp_std:: result:: Result <$system:: Origin <$runtime>, $name>> for $name {
277+ /// NOTE: converting to pallet origin loses the origin filter information.
266278 fn into( self ) -> $crate:: sp_std:: result:: Result <$system:: Origin <$runtime>, Self > {
267279 if let $caller_name:: system( l) = self . caller {
268280 Ok ( l)
@@ -272,13 +284,16 @@ macro_rules! impl_outer_origin {
272284 }
273285 }
274286 impl From <Option <<$runtime as $system:: Trait >:: AccountId >> for $name {
287+ /// Convert to runtime origin with caller being system signed or none and use filter
288+ /// `frame-system::Trait::BaseCallFilter`.
275289 fn from( x: Option <<$runtime as $system:: Trait >:: AccountId >) -> Self {
276290 <$system:: Origin <$runtime>>:: from( x) . into( )
277291 }
278292 }
279293 $(
280294 $crate:: paste:: item! {
281295 impl From <$module:: Origin < $( $generic ) ? $( , $module:: $generic_instance ) ? > > for $name {
296+ /// Convert to runtime origin using `frame-system::Trait::BaseCallFilter`.
282297 fn from( x: $module:: Origin < $( $generic ) ? $( , $module:: $generic_instance ) ? >) -> Self {
283298 let mut o = $name {
284299 caller: $caller_name:: [ < $module $( _ $generic_instance ) ? >] ( x) ,
@@ -294,6 +309,7 @@ macro_rules! impl_outer_origin {
294309 $name,
295310 >>
296311 for $name {
312+ /// NOTE: converting to pallet origin loses the origin filter information.
297313 fn into( self ) -> $crate:: sp_std:: result:: Result <
298314 $module:: Origin < $( $generic ) ? $( , $module:: $generic_instance ) ? >,
299315 Self ,
@@ -402,7 +418,7 @@ mod tests {
402418 #[ test]
403419 fn test_default_filter ( ) {
404420 assert_eq ! ( OriginWithSystem :: root( ) . filter_call( & 0 ) , true ) ;
405- assert_eq ! ( OriginWithSystem :: root( ) . filter_call( & 1 ) , false ) ;
421+ assert_eq ! ( OriginWithSystem :: root( ) . filter_call( & 1 ) , true ) ;
406422 assert_eq ! ( OriginWithSystem :: none( ) . filter_call( & 0 ) , true ) ;
407423 assert_eq ! ( OriginWithSystem :: none( ) . filter_call( & 1 ) , false ) ;
408424 assert_eq ! ( OriginWithSystem :: signed( 0 ) . filter_call( & 0 ) , true ) ;
0 commit comments