diff --git a/pallets/asset/src/mock.rs b/pallets/asset/src/mock.rs index c76af0c4f..af2667745 100644 --- a/pallets/asset/src/mock.rs +++ b/pallets/asset/src/mock.rs @@ -65,7 +65,7 @@ impl mock_origin::Config for Test { parameter_types! { pub const MaxEncodedValueLength: u32 = 1_024; - pub const MaxAssetDistribution: u32 = u32::MAX; + pub const MaxAssetDistribution: u32 = 25; } impl Config for Test { diff --git a/pallets/asset/src/tests.rs b/pallets/asset/src/tests.rs index d6515f9e6..bcd67534c 100644 --- a/pallets/asset/src/tests.rs +++ b/pallets/asset/src/tests.rs @@ -1,5 +1,5 @@ use super::*; -use crate::mock::*; +use crate::{mock::*, types::AssetIssuanceEntry, Error}; use codec::Encode; use cord_utilities::mock::{mock_origin::DoubleOrigin, SubjectId}; use frame_support::{assert_err, assert_ok, BoundedVec}; @@ -3057,3 +3057,98 @@ fn asset_vc_status_change_with_wrong_asset_id_should_fail() { ); }); } + +#[test] +fn asset_issue_should_fail_when_distribution_limit_exceeds() { + let creator = DID_00; + let author = ACCOUNT_00; + let capacity = 200u64; + + let raw_space = [2u8; 256].to_vec(); + let space_digest = ::Hashing::hash(&raw_space.encode()[..]); + let space_id_digest = ::Hashing::hash( + &[&space_digest.encode()[..], &creator.encode()[..]].concat()[..], + ); + let space_id: SpaceIdOf = generate_space_id::(&space_id_digest); + + let auth_digest = ::Hashing::hash( + &[&space_id.encode()[..], &creator.encode()[..], &creator.encode()[..]].concat()[..], + ); + let authorization_id: Ss58Identifier = generate_authorization_id::(&auth_digest); + let asset_desc = BoundedVec::try_from([72u8; 10].to_vec()).unwrap(); + let asset_tag = BoundedVec::try_from([72u8; 10].to_vec()).unwrap(); + let asset_meta = BoundedVec::try_from([72u8; 10].to_vec()).unwrap(); + let asset_qty = 1000; + let asset_value = 10; + let asset_type = AssetTypeOf::MF; + + let entry = AssetInputEntryOf:: { + asset_desc, + asset_qty, + asset_type, + asset_value, + asset_tag, + asset_meta, + }; + + let digest = ::Hashing::hash(&[&entry.encode()[..]].concat()[..]); + + let issue_id_digest = ::Hashing::hash( + &[&digest.encode()[..], &space_id.encode()[..], &creator.encode()[..]].concat()[..], + ); + + let asset_id: Ss58Identifier = generate_asset_id::(&issue_id_digest); + + new_test_ext().execute_with(|| { + // Create and approve space + assert_ok!(Space::create( + DoubleOrigin(author.clone(), creator.clone()).into(), + space_digest, + )); + assert_ok!(Space::approve(RawOrigin::Root.into(), space_id.clone(), capacity)); + assert_ok!(Asset::create( + DoubleOrigin(author.clone(), creator.clone()).into(), + entry.clone(), + digest, + authorization_id.clone() + )); + + let max_distribution = ::MaxAssetDistribution::get(); + + for _ in 0..max_distribution { + let issuance_entry = AssetIssuanceEntry { + asset_id: asset_id.clone(), + asset_owner: creator.clone(), + asset_issuance_qty: Some(1), + }; + + let issuance_digest = + ::Hashing::hash(&issuance_entry.encode()[..]); + + assert_ok!(Asset::issue( + DoubleOrigin(author.clone(), creator.clone()).into(), + issuance_entry, + issuance_digest, + authorization_id.clone() + )); + } + let exceeding_entry = AssetIssuanceEntry { + asset_id: asset_id.clone(), + asset_owner: creator.clone(), + asset_issuance_qty: Some(1), + }; + + let exceeding_digest = + ::Hashing::hash(&exceeding_entry.encode()[..]); + + assert_err!( + Asset::issue( + DoubleOrigin(author.clone(), creator.clone()).into(), + exceeding_entry, + exceeding_digest, + authorization_id.clone() + ), + Error::::DistributionLimitExceeded + ); + }); +}