Skip to content

Commit 5d7a943

Browse files
foriequal0mergify[bot]
authored andcommitted
Check regulator consistantly
1 parent 75b8cdc commit 5d7a943

File tree

1 file changed

+27
-38
lines changed

1 file changed

+27
-38
lines changed

state/src/impls/shard_level.rs

Lines changed: 27 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)