@@ -400,6 +400,19 @@ impl<'db> ShardLevelState<'db> {
400400 Ok ( ( ) )
401401 }
402402
403+ fn approved_by_registrar ( & self , asset_type : H160 , sender : & Address , approvers : & [ Address ] ) -> StateResult < bool > {
404+ let asset_scheme = self . asset_scheme ( asset_type) ?. ok_or_else ( || RuntimeError :: AssetSchemeNotFound {
405+ asset_type,
406+ shard_id : self . shard_id ,
407+ } ) ?;
408+
409+ if let Some ( registrar) = asset_scheme. registrar ( ) {
410+ Ok ( registrar == sender || approvers. contains ( registrar) )
411+ } else {
412+ Ok ( false )
413+ }
414+ }
415+
403416 fn change_asset_scheme (
404417 & mut self ,
405418 sender : & Address ,
@@ -410,20 +423,10 @@ impl<'db> ShardLevelState<'db> {
410423 registrar : & Option < Address > ,
411424 allowed_script_hashes : & [ H160 ] ,
412425 ) -> StateResult < ( ) > {
413- {
414- let asset_scheme = self . asset_scheme ( * asset_type) ?. ok_or_else ( || RuntimeError :: AssetSchemeNotFound {
415- asset_type : * asset_type,
416- shard_id : self . shard_id ,
417- } ) ?;
418-
419- if let Some ( registrar) = asset_scheme. registrar ( ) . as_ref ( ) {
420- if registrar != sender && !approvers. contains ( registrar) {
421- return Err ( RuntimeError :: InsufficientPermission . into ( ) )
422- }
423- } else {
424- return Err ( RuntimeError :: InsufficientPermission . into ( ) )
425- }
426+ if !self . approved_by_registrar ( * asset_type, sender, approvers) ? {
427+ return Err ( RuntimeError :: InsufficientPermission . into ( ) )
426428 }
429+
427430 let mut asset_scheme = self . get_asset_scheme_mut ( self . shard_id , * asset_type) ?;
428431 asset_scheme. change_data (
429432 metadata. to_string ( ) ,
@@ -443,19 +446,8 @@ impl<'db> ShardLevelState<'db> {
443446 asset_type : & H160 ,
444447 output : & AssetMintOutput ,
445448 ) -> StateResult < ( ) > {
446- {
447- let asset_scheme = self . asset_scheme ( * asset_type) ?. ok_or ( RuntimeError :: AssetSchemeNotFound {
448- asset_type : * asset_type,
449- shard_id : self . shard_id ,
450- } ) ?;
451-
452- if let Some ( registrar) = asset_scheme. registrar ( ) . as_ref ( ) {
453- if registrar != sender && !approvers. contains ( registrar) {
454- return Err ( RuntimeError :: InsufficientPermission . into ( ) )
455- }
456- } else {
457- return Err ( RuntimeError :: InsufficientPermission . into ( ) )
458- }
449+ if !self . approved_by_registrar ( * asset_type, sender, approvers) ? {
450+ return Err ( RuntimeError :: InsufficientPermission . into ( ) )
459451 }
460452
461453 // This assertion should be filtered while verifying action.
@@ -493,21 +485,18 @@ impl<'db> ShardLevelState<'db> {
493485 } = input. prev_out ;
494486
495487 assert_eq ! ( self . shard_id, shard_id) ;
496- let asset_scheme = self . asset_scheme ( asset_type) ?. ok_or_else ( || RuntimeError :: AssetSchemeNotFound {
497- shard_id,
498- asset_type,
499- } ) ?;
500-
501- let from_regulator = match ( asset_scheme. approver ( ) . as_ref ( ) , asset_scheme. registrar ( ) . as_ref ( ) ) {
502- ( _, Some ( registrar) ) if sender == registrar => true , // registrar ignores approvers
503- ( Some ( approver) , _) => {
488+ let approved_by_regulator = self . approved_by_registrar ( asset_type, sender, approvers) ?;
489+ if !approved_by_regulator {
490+ let asset_scheme = self . asset_scheme ( asset_type) ?. ok_or_else ( || RuntimeError :: AssetSchemeNotFound {
491+ shard_id,
492+ asset_type,
493+ } ) ?;
494+ if let Some ( approver) = asset_scheme. approver ( ) {
504495 if sender != approver && !approvers. contains ( approver) {
505496 return Err ( RuntimeError :: NotApproved ( * approver) . into ( ) )
506497 }
507- false
508498 }
509- ( None , _) => false ,
510- } ;
499+ }
511500
512501 let asset = self . asset ( tracker, index) ?. ok_or_else ( || RuntimeError :: AssetNotFound {
513502 shard_id,
@@ -534,7 +523,7 @@ impl<'db> ShardLevelState<'db> {
534523 }
535524 . into ( ) )
536525 }
537- Ok ( ( asset, from_regulator ) )
526+ Ok ( ( asset, approved_by_regulator ) )
538527 }
539528
540529 fn check_output_script_hash (
0 commit comments