@@ -17,7 +17,7 @@ use polkadot_sdk::{
1717 polkadot_sdk_frame:: prelude:: { BlockNumberFor , OriginFor } ,
1818 sp_core:: { Get , TryCollect } ,
1919 sp_runtime:: {
20- BoundedBTreeMap , DispatchError , Percent , Vec ,
20+ BoundedBTreeMap , BoundedBTreeSet , DispatchError , Percent , Vec ,
2121 traits:: { CheckedAdd , Saturating , Zero } ,
2222 } ,
2323} ;
@@ -113,7 +113,7 @@ impl<T: Config>
113113#[ allow( clippy:: too_many_arguments) ]
114114pub ( crate ) fn delegate_emission_permission_impl < T : Config > (
115115 delegator : T :: AccountId ,
116- recipients : BoundedBTreeMap < T :: AccountId , u16 , T :: MaxTargetsPerPermission > ,
116+ recipients : BoundedBTreeMap < T :: AccountId , u16 , T :: MaxRecipientsPerPermission > ,
117117 allocation : EmissionAllocation < T > ,
118118 distribution : DistributionControl < T > ,
119119 duration : PermissionDuration < T > ,
@@ -160,8 +160,8 @@ pub(crate) fn delegate_emission_permission_impl<T: Config>(
160160 allocation : allocation. clone ( ) ,
161161 distribution,
162162 accumulating : true , // Start with accumulation enabled by default
163- recipient_manager,
164- weight_setter,
163+ recipient_managers : validate_emission_managers :: < T > ( & delegator , recipient_manager) ? ,
164+ weight_setters : validate_emission_managers :: < T > ( & delegator , weight_setter) ? ,
165165 } ) ;
166166
167167 let permission_id = generate_permission_id :: < T > ( & delegator, & scope) ?;
@@ -317,7 +317,7 @@ pub fn toggle_permission_accumulation_impl<T: Config>(
317317pub ( crate ) fn update_emission_permission < T : Config > (
318318 origin : OriginFor < T > ,
319319 permission_id : PermissionId ,
320- new_recipients : Option < BoundedBTreeMap < T :: AccountId , u16 , T :: MaxTargetsPerPermission > > ,
320+ new_recipients : Option < BoundedBTreeMap < T :: AccountId , u16 , T :: MaxRecipientsPerPermission > > ,
321321 new_streams : Option < BoundedBTreeMap < StreamId , Percent , T :: MaxStreamsPerPermission > > ,
322322 new_distribution_control : Option < DistributionControl < T > > ,
323323 new_recipient_manager : Option < Option < T :: AccountId > > ,
@@ -338,16 +338,8 @@ pub(crate) fn update_emission_permission<T: Config>(
338338 } ;
339339
340340 let allowed_delegator = permission. delegator == caller;
341- let allowed_weights = allowed_delegator
342- || scope
343- . weight_setter
344- . as_ref ( )
345- . is_some_and ( |weight_setter| weight_setter == & caller) ;
346- let allowed_recipients = allowed_delegator
347- || scope
348- . recipient_manager
349- . as_ref ( )
350- . is_some_and ( |recipient_manager| recipient_manager == & caller) ;
341+ let allowed_weights = allowed_delegator || scope. weight_setters . contains ( & caller) ;
342+ let allowed_recipients = allowed_delegator || scope. recipient_managers . contains ( & caller) ;
351343
352344 if !allowed_delegator && !allowed_weights && !allowed_recipients {
353345 return Err ( Error :: < T > :: NotAuthorizedToEdit . into ( ) ) ;
@@ -421,12 +413,14 @@ pub(crate) fn update_emission_permission<T: Config>(
421413
422414 if let Some ( new_recipient_manager) = new_recipient_manager {
423415 ensure ! ( allowed_delegator, Error :: <T >:: NotAuthorizedToEdit ) ;
424- scope. recipient_manager = new_recipient_manager;
416+ scope. recipient_managers =
417+ validate_emission_managers :: < T > ( & permission. delegator , new_recipient_manager) ?;
425418 }
426419
427420 if let Some ( new_weight_setter) = new_weight_setter {
428421 ensure ! ( allowed_delegator, Error :: <T >:: NotAuthorizedToEdit ) ;
429- scope. weight_setter = new_weight_setter;
422+ scope. weight_setters =
423+ validate_emission_managers :: < T > ( & permission. delegator , new_weight_setter) ?;
430424 }
431425
432426 permission. scope = PermissionScope :: Emission ( scope) ;
@@ -435,9 +429,21 @@ pub(crate) fn update_emission_permission<T: Config>(
435429 Ok ( ( ) )
436430}
437431
432+ fn validate_emission_managers < T : Config > (
433+ delegator : & T :: AccountId ,
434+ entry : Option < T :: AccountId > ,
435+ ) -> Result < BoundedBTreeSet < T :: AccountId , T :: MaxControllersPerPermission > , DispatchError > {
436+ let mut set = BoundedBTreeSet :: new ( ) ;
437+ let _ = set. try_insert ( delegator. clone ( ) ) ;
438+ if let Some ( entry) = entry {
439+ let _ = set. try_insert ( entry) ;
440+ }
441+ Ok ( set)
442+ }
443+
438444fn validate_emission_permission_recipients < T : Config > (
439445 delegator : & T :: AccountId ,
440- recipients : & BoundedBTreeMap < T :: AccountId , u16 , T :: MaxTargetsPerPermission > ,
446+ recipients : & BoundedBTreeMap < T :: AccountId , u16 , T :: MaxRecipientsPerPermission > ,
441447) -> DispatchResult {
442448 ensure ! ( !recipients. is_empty( ) , Error :: <T >:: NoTargetsSpecified ) ;
443449
@@ -452,6 +458,7 @@ fn validate_emission_permission_recipients<T: Config>(
452458
453459 Ok ( ( ) )
454460}
461+
455462fn validate_emission_permission_streams < T : Config > (
456463 streams : & BoundedBTreeMap < StreamId , Percent , T :: MaxStreamsPerPermission > ,
457464 delegator : & T :: AccountId ,
0 commit comments