git.delta.rocks / unique-network / refs/commits / efe1d7b29799

difftreelog

NFTPAR-183: Storage Refactoring. Decimal points u32 -> u8. Also extended decimal points limit 4 -> 30.

sotmorskiy2020-12-10parent: #e7d3521.patch.diff
in: master

2 files changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
4545
46mod default_weights;46mod default_weights;
47
48pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;
4749
48// Structs50// Structs
49// #region51// #region
5052
51pub type CollectionId = u32;53pub type CollectionId = u32;
52pub type TokenId = u32;54pub type TokenId = u32;
55
56pub type DecimalPoints = u8;
5357
54#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]58#[derive(Encode, Decode, Eq, Debug, Clone, PartialEq)]
55#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]59#[cfg_attr(feature = "std", derive(Serialize, Deserialize))]
56pub enum CollectionMode {60pub enum CollectionMode {
57 Invalid,61 Invalid,
58 NFT,62 NFT,
59 // decimal points63 // decimal points
60 Fungible(u32),64 Fungible(DecimalPoints),
61 // decimal points65 // decimal points
62 ReFungible(u32),66 ReFungible(DecimalPoints),
63}67}
6468
65impl Into<u8> for CollectionMode {69impl Into<u8> for CollectionMode {
104 pub owner: AccountId,108 pub owner: AccountId,
105 pub mode: CollectionMode,109 pub mode: CollectionMode,
106 pub access: AccessMode,110 pub access: AccessMode,
107 pub decimal_points: u32,111 pub decimal_points: DecimalPoints,
108 pub name: Vec<u16>, // 64 include null escape char112 pub name: Vec<u16>, // 64 include null escape char
109 pub description: Vec<u16>, // 256 include null escape char113 pub description: Vec<u16>, // 256 include null escape char
110 pub token_prefix: Vec<u8>, // 16 include null escape char114 pub token_prefix: Vec<u8>, // 16 include null escape char
269 pub enum Error for Module<T: Trait> {273 pub enum Error for Module<T: Trait> {
270 /// Total collections bound exceeded.274 /// Total collections bound exceeded.
271 TotalCollectionsLimitExceeded,275 TotalCollectionsLimitExceeded,
272 /// Decimal_points parameter must be lower than 4.276 /// Decimal_points parameter must be lower than MAX_DECIMAL_POINTS constant, currently it is 30.
273 CollectionDecimalPointLimitExceeded, 277 CollectionDecimalPointLimitExceeded,
274 /// Collection name can not be longer than 63 char.278 /// Collection name can not be longer than 63 char.
275 CollectionNameLimitExceeded, 279 CollectionNameLimitExceeded,
498 ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);502 ensure!(CollectionCount::get() < ChainLimit::get().collection_numbers_limit, Error::<T>::TotalCollectionsLimitExceeded);
499503
500 // check params504 // check params
501 ensure!(decimal_points <= 4, Error::<T>::CollectionDecimalPointLimitExceeded);505 ensure!(decimal_points <= MAX_DECIMAL_POINTS, Error::<T>::CollectionDecimalPointLimitExceeded);
502506
503 let mut name = collection_name.to_vec();507 let mut name = collection_name.to_vec();
504 name.push(0);508 name.push(0);
1461 let item = FungibleItemType {1465 let item = FungibleItemType {
1462 collection: collection_id,1466 collection: collection_id,
1463 owner,1467 owner,
1464 value: (10 as u128).pow(collection.decimal_points)1468 value: (10 as u128).pow(collection.decimal_points as u32)
1465 };1469 };
14661470
1467 Self::add_fungible_item(item)?;1471 Self::add_fungible_item(item)?;
1468 },1472 },
1469 CreateItemData::ReFungible(data) => {1473 CreateItemData::ReFungible(data) => {
1470 let mut owner_list = Vec::new();1474 let mut owner_list = Vec::new();
1471 let value = (10 as u128).pow(collection.decimal_points);1475 let value = (10 as u128).pow(collection.decimal_points as u32);
1472 owner_list.push(Ownership {owner: owner.clone(), fraction: value});1476 owner_list.push(Ownership {owner: owner.clone(), fraction: value});
14731477
1474 let item = ReFungibleItemType {1478 let item = ReFungibleItemType {
1982 fn init_collection(item: &CollectionType<T::AccountId>) {1986 fn init_collection(item: &CollectionType<T::AccountId>) {
1983 // check params1987 // check params
1984 assert!(1988 assert!(
1985 item.decimal_points <= 4,1989 item.decimal_points <= MAX_DECIMAL_POINTS,
1986 "decimal_points parameter must be lower than 4"1990 "decimal_points parameter must be lower than MAX_DECIMAL_POINTS"
1987 );1991 );
1988 assert!(1992 assert!(
1989 item.name.len() <= 64,1993 item.name.len() <= 64,
modifiedpallets/nft/src/tests.rsdiffbeforeafterboth
--- a/pallets/nft/src/tests.rs
+++ b/pallets/nft/src/tests.rs
@@ -3,7 +3,7 @@
 use crate::mock::*;
 use crate::{AccessMode, ApprovePermissions, CollectionMode,
     Ownership, ChainLimits, CreateItemData, CreateNftData, CreateFungibleData, CreateReFungibleData,
-    CollectionId, TokenId}; //Err
+    CollectionId, TokenId, MAX_DECIMAL_POINTS}; //Err
 use frame_support::{assert_noop, assert_ok};
 use frame_system::{ RawOrigin };
 
@@ -78,6 +78,46 @@
 // Use cases tests region
 // #region
 #[test]
+fn create_fungible_collection_fails_with_large_decimal_numbers() {
+    new_test_ext().execute_with(|| {
+        default_limits();
+
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+
+        let origin1 = Origin::signed(1);
+        assert_noop!(TemplateModule::create_collection(
+            origin1,
+            col_name1,
+            col_desc1,
+            token_prefix1,
+            CollectionMode::Fungible(MAX_DECIMAL_POINTS + 1)
+        ), Error::<Test>::CollectionDecimalPointLimitExceeded);
+    });    
+}
+
+#[test]
+fn create_re_fungible_collection_fails_with_large_decimal_numbers() {
+    new_test_ext().execute_with(|| {
+        default_limits();
+
+        let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();
+        let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();
+        let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();
+
+        let origin1 = Origin::signed(1);
+        assert_noop!(TemplateModule::create_collection(
+            origin1,
+            col_name1,
+            col_desc1,
+            token_prefix1,
+            CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)
+        ), Error::<Test>::CollectionDecimalPointLimitExceeded);
+    });
+}
+
+#[test]
 fn create_nft_item() {
     new_test_ext().execute_with(|| {
         default_limits();