@@ -49,7 +49,7 @@ pub fn delegate_namespace_permission_impl<T: Config>(
4949 > ,
5050 duration : PermissionDuration < T > ,
5151 revocation : RevocationTerms < T > ,
52- instances : u32 ,
52+ max_instances : u32 ,
5353) -> Result < PermissionId , DispatchError > {
5454 let delegator = ensure_signed ( delegator) ?;
5555
@@ -62,7 +62,7 @@ pub fn delegate_namespace_permission_impl<T: Config>(
6262 Error :: <T >:: NotRegisteredAgent
6363 ) ;
6464
65- ensure ! ( instances > 0 , Error :: <T >:: NotEnoughInstances ) ;
65+ ensure ! ( max_instances > 0 , Error :: <T >:: NotEnoughInstances ) ;
6666
6767 let total_multi_parent = paths. keys ( ) . filter ( |p| p. is_some ( ) ) . count ( ) ;
6868 ensure ! ( total_multi_parent <= 1 , Error :: <T >:: MultiParentForbidden ) ;
@@ -94,7 +94,7 @@ pub fn delegate_namespace_permission_impl<T: Config>(
9494 ) ;
9595
9696 ensure ! (
97- instances <= parent. available_instances( ) ,
97+ max_instances <= parent. available_instances( ) . unwrap_or_default ( ) ,
9898 Error :: <T >:: NotEnoughInstances
9999 ) ;
100100
@@ -121,12 +121,18 @@ pub fn delegate_namespace_permission_impl<T: Config>(
121121 let scope = PermissionScope :: Namespace ( NamespaceScope {
122122 recipient : recipient. clone ( ) ,
123123 paths,
124+ children : Default :: default ( ) ,
125+ max_instances,
124126 } ) ;
125127 let permission_id = generate_permission_id :: < T > ( & delegator, & scope) ?;
126128
127129 for parent in parents {
128130 Permissions :: < T > :: mutate_extant ( parent, |parent| {
129- parent. children . try_insert ( permission_id) . ok ( )
131+ if let Some ( children) = parent. children_mut ( ) {
132+ children. try_insert ( permission_id) . ok ( )
133+ } else {
134+ Some ( false )
135+ }
130136 } )
131137 . ok_or ( Error :: < T > :: TooManyChildren ) ?;
132138 }
@@ -137,7 +143,6 @@ pub fn delegate_namespace_permission_impl<T: Config>(
137143 duration,
138144 revocation,
139145 crate :: EnforcementAuthority :: None ,
140- instances,
141146 ) ;
142147
143148 Permissions :: < T > :: insert ( permission_id, & contract) ;
@@ -281,35 +286,36 @@ pub(crate) fn update_namespace_permission<T: Config>(
281286
282287 ensure ! ( permission. delegator == who, Error :: <T >:: NotAuthorizedToEdit ) ;
283288
284- let scope = permission. scope . clone ( ) ;
285- match & scope {
286- PermissionScope :: Namespace ( namespace) => {
287- if max_instances == permission. max_instances {
288- return Ok ( ( ) ) ;
289- } else if max_instances > permission. max_instances {
290- for parent in namespace. paths . keys ( ) . copied ( ) . flatten ( ) {
291- let Some ( parent) = Permissions :: < T > :: get ( parent) else {
292- continue ;
293- } ;
294-
295- ensure ! (
296- max_instances <= parent. available_instances( ) ,
297- Error :: <T >:: NotEnoughInstances
298- ) ;
299- }
300- } else {
301- ensure ! ( permission. is_updatable( ) , Error :: <T >:: NotAuthorizedToEdit ) ;
302- ensure ! (
303- max_instances >= permission. used_instances( ) ,
304- Error :: <T >:: NotEnoughInstances
305- ) ;
306- }
289+ let PermissionScope :: Namespace ( mut namespace) = permission. scope . clone ( ) else {
290+ return Err ( Error :: < T > :: NotEditable . into ( ) ) ;
291+ } ;
292+
293+ if max_instances == namespace. max_instances {
294+ return Ok ( ( ) ) ;
295+ } else if max_instances > namespace. max_instances {
296+ for parent in namespace. paths . keys ( ) . copied ( ) . flatten ( ) {
297+ let Some ( parent) = Permissions :: < T > :: get ( parent) else {
298+ continue ;
299+ } ;
300+
301+ ensure ! (
302+ max_instances <= parent. available_instances( ) . unwrap_or_default( ) ,
303+ Error :: <T >:: NotEnoughInstances
304+ ) ;
307305 }
308- _ => return Err ( Error :: < T > :: NotEditable . into ( ) ) ,
306+ } else {
307+ ensure ! ( permission. is_updatable( ) , Error :: <T >:: NotAuthorizedToEdit ) ;
308+ ensure ! (
309+ max_instances >= permission. used_instances( ) ,
310+ Error :: <T >:: NotEnoughInstances
311+ ) ;
309312 }
310313
311- permission. max_instances = max_instances;
314+ namespace. max_instances = max_instances;
315+
316+ permission. scope = PermissionScope :: Namespace ( namespace) ;
312317 permission. last_update = frame_system:: Pallet :: < T > :: block_number ( ) ;
318+
313319 Permissions :: < T > :: set ( permission_id, Some ( permission) ) ;
314320
315321 Ok ( ( ) )
0 commit comments