difftreelog
Resolve conflict in runtime_types
in: master
32 files changed
pallets/nft/src/lib.rsdiffbeforeafterboth54mod default_weights;54mod default_weights;555556pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;56pub const MAX_DECIMAL_POINTS: DecimalPoints = 30;57pub const MAX_REFUNGIBLE_PIECES: u128 = 1_000_000_000_000_000_000_000;57pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000;58pub const MAX_SPONSOR_TIMEOUT: u32 = 10_368_000;58pub const MAX_TOKEN_OWNERSHIP: u32 = 10_000_000;59pub const MAX_TOKEN_OWNERSHIP: u32 = 10_000_000;596071 NFT,72 NFT,72 // decimal points73 // decimal points73 Fungible(DecimalPoints),74 Fungible(DecimalPoints),74 // decimal points75 ReFungible(DecimalPoints),75 ReFungible,76}76}777778impl Default for CollectionMode {78impl Default for CollectionMode {87 CollectionMode::Invalid => 0,87 CollectionMode::Invalid => 0,88 CollectionMode::NFT => 1,88 CollectionMode::NFT => 1,89 CollectionMode::Fungible(_) => 2,89 CollectionMode::Fungible(_) => 2,90 CollectionMode::ReFungible(_) => 3,90 CollectionMode::ReFungible => 3,91 }91 }92 }92 }93}93}271pub struct CreateReFungibleData {271pub struct CreateReFungibleData {272 pub const_data: Vec<u8>,272 pub const_data: Vec<u8>,273 pub variable_data: Vec<u8>,273 pub variable_data: Vec<u8>,274 pub pieces: u128,274}275}275276276#[derive(Encode, Decode, Debug, Clone, PartialEq)]277#[derive(Encode, Decode, Debug, Clone, PartialEq)]382 /// Collection limit bounds per collection exceeded383 /// Collection limit bounds per collection exceeded383 CollectionLimitBoundsExceeded,384 CollectionLimitBoundsExceeded,384 /// Schema data size limit bound exceeded385 /// Schema data size limit bound exceeded385 SchemaDataLimitExceeded386 SchemaDataLimitExceeded,387 /// Maximum refungibility exceeded388 WrongRefungiblePieces386 }389 }387}390}388391553556554 let decimal_points = match mode {557 let decimal_points = match mode {555 CollectionMode::Fungible(points) => points,558 CollectionMode::Fungible(points) => points,556 CollectionMode::ReFungible(points) => points,557 _ => 0559 _ => 0558 };560 };559561938940939 Self::can_create_items_in_collection(collection_id, &target_collection, &sender, &owner)?;941 Self::can_create_items_in_collection(collection_id, &target_collection, &sender, &owner)?;940 Self::validate_create_item_args(&target_collection, &data)?;942 Self::validate_create_item_args(&target_collection, &data)?;941 Self::create_item_no_validation(collection_id, &target_collection, owner, data)?;943 Self::create_item_no_validation(collection_id, owner, data)?;942944943 Ok(())945 Ok(())944 }946 }978 Self::validate_create_item_args(&target_collection, data)?;980 Self::validate_create_item_args(&target_collection, data)?;979 }981 }980 for data in &items_data {982 for data in &items_data {981 Self::create_item_no_validation(collection_id, &target_collection, owner.clone(), data.clone())?;983 Self::create_item_no_validation(collection_id, owner.clone(), data.clone())?;982 }984 }983985984 Ok(())986 Ok(())1017 {1019 {1018 CollectionMode::NFT => Self::burn_nft_item(collection_id, item_id)?,1020 CollectionMode::NFT => Self::burn_nft_item(collection_id, item_id)?,1019 CollectionMode::Fungible(_) => Self::burn_fungible_item(&sender, collection_id, value)?,1021 CollectionMode::Fungible(_) => Self::burn_fungible_item(&sender, collection_id, value)?,1020 CollectionMode::ReFungible(_) => Self::burn_refungible_item(collection_id, item_id, &sender)?,1022 CollectionMode::ReFungible => Self::burn_refungible_item(collection_id, item_id, &sender)?,1021 _ => ()1023 _ => ()1022 };1024 };102310251159 {1161 {1160 CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, from, recipient)?,1162 CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, from, recipient)?,1161 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, value, &from, &recipient)?,1163 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, value, &from, &recipient)?,1162 CollectionMode::ReFungible(_) => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,1164 CollectionMode::ReFungible => Self::transfer_refungible(collection_id, item_id, value, from.clone(), recipient)?,1163 _ => ()1165 _ => ()1164 };1166 };116511671216 match target_collection.mode1218 match target_collection.mode1217 {1219 {1218 CollectionMode::NFT => Self::set_nft_variable_data(collection_id, item_id, data)?,1220 CollectionMode::NFT => Self::set_nft_variable_data(collection_id, item_id, data)?,1219 CollectionMode::ReFungible(_) => Self::set_re_fungible_variable_data(collection_id, item_id, data)?,1221 CollectionMode::ReFungible => Self::set_re_fungible_variable_data(collection_id, item_id, data)?,1220 CollectionMode::Fungible(_) => fail!(Error::<T>::CantStoreMetadataInFungibleTokens),1222 CollectionMode::Fungible(_) => fail!(Error::<T>::CantStoreMetadataInFungibleTokens),1221 _ => fail!(Error::<T>::UnexpectedCollectionType)1223 _ => fail!(Error::<T>::UnexpectedCollectionType)1222 };1224 };1556 {1558 {1557 CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,1559 CollectionMode::NFT => Self::transfer_nft(collection_id, item_id, sender.clone(), recipient)?,1558 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, value, &sender, &recipient)?,1560 CollectionMode::Fungible(_) => Self::transfer_fungible(collection_id, value, &sender, &recipient)?,1559 CollectionMode::ReFungible(_) => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,1561 CollectionMode::ReFungible => Self::transfer_refungible(collection_id, item_id, value, sender.clone(), recipient)?,1560 _ => ()1562 _ => ()1561 };1563 };156215641608 fail!(Error::<T>::NotFungibleDataUsedToMintFungibleCollectionToken);1610 fail!(Error::<T>::NotFungibleDataUsedToMintFungibleCollectionToken);1609 }1611 }1610 },1612 },1611 CollectionMode::ReFungible(_) => {1613 CollectionMode::ReFungible => {1612 if let CreateItemData::ReFungible(data) = data {1614 if let CreateItemData::ReFungible(data) = data {161316151614 // check sizes1616 // check sizes1615 ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, Error::<T>::TokenConstDataLimitExceeded);1617 ensure!(ChainLimit::get().custom_data_limit >= data.const_data.len() as u32, Error::<T>::TokenConstDataLimitExceeded);1616 ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, Error::<T>::TokenVariableDataLimitExceeded);1618 ensure!(ChainLimit::get().custom_data_limit >= data.variable_data.len() as u32, Error::<T>::TokenVariableDataLimitExceeded);16191620 // Check refungibility limits1621 ensure!(data.pieces <= MAX_REFUNGIBLE_PIECES, Error::<T>::WrongRefungiblePieces);1622 ensure!(data.pieces > 0, Error::<T>::WrongRefungiblePieces);1617 } else {1623 } else {1618 fail!(Error::<T>::NotReFungibleDataUsedToMintReFungibleCollectionToken);1624 fail!(Error::<T>::NotReFungibleDataUsedToMintReFungibleCollectionToken);1619 }1625 }1624 Ok(())1630 Ok(())1625 }1631 }162616321627 fn create_item_no_validation(collection_id: CollectionId, collection: &CollectionType<T::AccountId>, owner: T::AccountId, data: CreateItemData) -> DispatchResult {1633 fn create_item_no_validation(collection_id: CollectionId, owner: T::AccountId, data: CreateItemData) -> DispatchResult {1628 match data1634 match data1629 {1635 {1630 CreateItemData::NFT(data) => {1636 CreateItemData::NFT(data) => {1641 },1647 },1642 CreateItemData::ReFungible(data) => {1648 CreateItemData::ReFungible(data) => {1643 let mut owner_list = Vec::new();1649 let mut owner_list = Vec::new();1644 let value = (10 as u128).pow(collection.decimal_points as u32);1645 owner_list.push(Ownership {owner: owner.clone(), fraction: value});1650 owner_list.push(Ownership {owner: owner.clone(), fraction: data.pieces});164616511647 let item = ReFungibleItemType {1652 let item = ReFungibleItemType {1648 owner: owner_list,1653 owner: owner_list,1871 CollectionMode::Fungible(_) => {1876 CollectionMode::Fungible(_) => {1872 <FungibleItemList<T>>::contains_key(collection_id, &subject)1877 <FungibleItemList<T>>::contains_key(collection_id, &subject)1873 }1878 }1874 CollectionMode::ReFungible(_) => {1879 CollectionMode::ReFungible => {1875 <ReFungibleItemList<T>>::get(collection_id, item_id)1880 <ReFungibleItemList<T>>::get(collection_id, item_id)1876 .owner1881 .owner1877 .iter()1882 .iter()1900 {1905 {1901 CollectionMode::NFT => <NftItemList<T>>::contains_key(collection_id, item_id),1906 CollectionMode::NFT => <NftItemList<T>>::contains_key(collection_id, item_id),1902 CollectionMode::Fungible(_) => <FungibleItemList<T>>::contains_key(collection_id, owner),1907 CollectionMode::Fungible(_) => <FungibleItemList<T>>::contains_key(collection_id, owner),1903 CollectionMode::ReFungible(_) => <ReFungibleItemList<T>>::contains_key(collection_id, item_id),1908 CollectionMode::ReFungible => <ReFungibleItemList<T>>::contains_key(collection_id, item_id),1904 _ => false1909 _ => false1905 };1910 };19061911242624312427 sponsored2432 sponsored2428 }2433 }2429 CollectionMode::ReFungible(_) => {2434 CollectionMode::ReFungible => {2430 2435 2431 // get correct limit2436 // get correct limit2432 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {2437 let limit: u32 = if collection_limits.sponsor_transfer_timeout > 0 {pallets/nft/src/tests.rsdiffbeforeafterboth35}35}363637fn default_re_fungible_data () -> CreateReFungibleData {37fn default_re_fungible_data () -> CreateReFungibleData {38 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1] }38 CreateReFungibleData { const_data: vec![1, 2, 3], variable_data: vec![3, 2, 1], pieces: 1023 }39}39}404041fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {41fn create_test_collection_for_owner(mode: &CollectionMode, owner: u64, id: CollectionId) -> CollectionId {113 }); 113 }); 114}114}115116#[test]117fn create_re_fungible_collection_fails_with_large_decimal_numbers() {118 new_test_ext().execute_with(|| {119 default_limits();120121 let col_name1: Vec<u16> = "Test1\0".encode_utf16().collect::<Vec<u16>>();122 let col_desc1: Vec<u16> = "TestDescription1\0".encode_utf16().collect::<Vec<u16>>();123 let token_prefix1: Vec<u8> = b"token_prefix1\0".to_vec();124125 let origin1 = Origin::signed(1);126 assert_noop!(TemplateModule::create_collection(127 origin1,128 col_name1,129 col_desc1,130 token_prefix1,131 CollectionMode::ReFungible(MAX_DECIMAL_POINTS + 1)132 ), Error::<Test>::CollectionDecimalPointLimitExceeded);133 });134}135115136#[test]116#[test]137fn create_nft_item() {117fn create_nft_item() {176fn create_refungible_item() {156fn create_refungible_item() {177 new_test_ext().execute_with(|| {157 new_test_ext().execute_with(|| {178 default_limits();158 default_limits();179 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);159 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);180160181 let data = default_re_fungible_data();161 let data = default_re_fungible_data();182 create_test_item(collection_id, &data.clone().into());162 create_test_item(collection_id, &data.clone().into());192 TemplateModule::refungible_item_id(collection_id, 1).owner[0],172 TemplateModule::refungible_item_id(collection_id, 1).owner[0],193 Ownership {173 Ownership {194 owner: 1,174 owner: 1,195 fraction: 1000175 fraction: 1023196 }176 }197 );177 );198 });178 });203 new_test_ext().execute_with(|| {183 new_test_ext().execute_with(|| {204 default_limits();184 default_limits();205 185 206 create_test_collection(&CollectionMode::ReFungible(3), 1);186 create_test_collection(&CollectionMode::ReFungible, 1);207187208 let origin1 = Origin::signed(1);188 let origin1 = Origin::signed(1);209189224 item.owner[0],204 item.owner[0],225 Ownership {205 Ownership {226 owner: 1,206 owner: 1,227 fraction: 1000207 fraction: 1023228 }208 }229 );209 );230 }210 }312 new_test_ext().execute_with(|| {292 new_test_ext().execute_with(|| {313 default_limits();293 default_limits();314 294 315 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);295 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);316296317 let data = default_re_fungible_data();297 let data = default_re_fungible_data();318 create_test_item(collection_id, &data.clone().into());298 create_test_item(collection_id, &data.clone().into());331 TemplateModule::refungible_item_id(collection_id, 1).owner[0],311 TemplateModule::refungible_item_id(collection_id, 1).owner[0],332 Ownership {312 Ownership {333 owner: 1,313 owner: 1,334 fraction: 1000314 fraction: 1023335 }315 }336 );316 );337 assert_eq!(TemplateModule::balance_count(1, 1), 1000);317 assert_eq!(TemplateModule::balance_count(1, 1), 1023);338 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);318 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);339319340 // change owner scenario320 // change owner scenario341 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1000));321 assert_ok!(TemplateModule::transfer(origin1.clone(), 2, 1, 1, 1023));342 assert_eq!(322 assert_eq!(343 TemplateModule::refungible_item_id(1, 1).owner[0],323 TemplateModule::refungible_item_id(1, 1).owner[0],344 Ownership {324 Ownership {345 owner: 2,325 owner: 2,346 fraction: 1000326 fraction: 1023347 }327 }348 );328 );349 assert_eq!(TemplateModule::balance_count(1, 1), 0);329 assert_eq!(TemplateModule::balance_count(1, 1), 0);350 assert_eq!(TemplateModule::balance_count(1, 2), 1000);330 assert_eq!(TemplateModule::balance_count(1, 2), 1023);351 // assert_eq!(TemplateModule::address_tokens(1, 1), []);331 // assert_eq!(TemplateModule::address_tokens(1, 1), []);352 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);332 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);353333357 TemplateModule::refungible_item_id(1, 1).owner[0],337 TemplateModule::refungible_item_id(1, 1).owner[0],358 Ownership {338 Ownership {359 owner: 2,339 owner: 2,360 fraction: 500340 fraction: 523361 }341 }362 );342 );363 assert_eq!(343 assert_eq!(367 fraction: 500347 fraction: 500368 }348 }369 );349 );370 assert_eq!(TemplateModule::balance_count(1, 2), 500);350 assert_eq!(TemplateModule::balance_count(1, 2), 523);371 assert_eq!(TemplateModule::balance_count(1, 3), 500);351 assert_eq!(TemplateModule::balance_count(1, 3), 500);372 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);352 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);373 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);353 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);378 TemplateModule::refungible_item_id(1, 1).owner[0],358 TemplateModule::refungible_item_id(1, 1).owner[0],379 Ownership {359 Ownership {380 owner: 2,360 owner: 2,381 fraction: 300361 fraction: 323382 }362 }383 );363 );384 assert_eq!(364 assert_eq!(388 fraction: 700368 fraction: 700389 }369 }390 );370 );391 assert_eq!(TemplateModule::balance_count(1, 2), 300);371 assert_eq!(TemplateModule::balance_count(1, 2), 323);392 assert_eq!(TemplateModule::balance_count(1, 3), 700);372 assert_eq!(TemplateModule::balance_count(1, 3), 700);393 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);373 assert_eq!(TemplateModule::address_tokens(1, 2), [1]);394 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);374 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);517 new_test_ext().execute_with(|| {497 new_test_ext().execute_with(|| {518 default_limits();498 default_limits();519 499 520 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);500 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);521 501 522 let origin1 = Origin::signed(1);502 let origin1 = Origin::signed(1);523 let origin2 = Origin::signed(2);503 let origin2 = Origin::signed(2);524504525 let data = default_re_fungible_data();505 let data = default_re_fungible_data();526 create_test_item(collection_id, &data.into());506 create_test_item(collection_id, &data.into());527507528 assert_eq!(TemplateModule::balance_count(1, 1), 1000);508 assert_eq!(TemplateModule::balance_count(1, 1), 1023);529 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);509 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);530510531 assert_ok!(TemplateModule::set_mint_permission(511 assert_ok!(TemplateModule::set_mint_permission(543 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));523 assert_ok!(TemplateModule::add_to_white_list(origin1.clone(), 1, 3));544524545 // do approve525 // do approve546 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1, 1000));526 assert_ok!(TemplateModule::approve(origin1.clone(), 2, 1, 1, 1023));547 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1000);527 assert_eq!(TemplateModule::approved(1, (1, 1, 2)), 1023);548528549 assert_ok!(TemplateModule::transfer_from(529 assert_ok!(TemplateModule::transfer_from(550 origin2.clone(),530 origin2.clone(),554 1,534 1,555 100535 100556 ));536 ));557 assert_eq!(TemplateModule::balance_count(1, 1), 900);537 assert_eq!(TemplateModule::balance_count(1, 1), 923);558 assert_eq!(TemplateModule::balance_count(1, 3), 100);538 assert_eq!(TemplateModule::balance_count(1, 3), 100);559 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);539 assert_eq!(TemplateModule::address_tokens(1, 1), [1]);560 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);540 assert_eq!(TemplateModule::address_tokens(1, 3), [1]);561541562 assert_eq!(542 assert_eq!(563 TemplateModule::approved(1, (1, 1, 2)),543 TemplateModule::approved(1, (1, 1, 2)),564 900544 923565 );545 );566 });546 });567}547}717 new_test_ext().execute_with(|| {697 new_test_ext().execute_with(|| {718 default_limits();698 default_limits();719 699 720 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);700 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);721 let origin1 = Origin::signed(1);701 let origin1 = Origin::signed(1);722702723 assert_ok!(TemplateModule::set_mint_permission(703 assert_ok!(TemplateModule::set_mint_permission(738 create_test_item(collection_id, &data.into());718 create_test_item(collection_id, &data.into());739719740 // check balance (collection with id = 1, user id = 2)720 // check balance (collection with id = 1, user id = 2)741 assert_eq!(TemplateModule::balance_count(1, 1), 1000);721 assert_eq!(TemplateModule::balance_count(1, 1), 1023);742722743 // burn item723 // burn item744 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1000));724 assert_ok!(TemplateModule::burn_item(origin1.clone(), 1, 1, 1023));745 assert_noop!(725 assert_noop!(746 TemplateModule::burn_item(origin1.clone(), 1, 1, 1000),726 TemplateModule::burn_item(origin1.clone(), 1, 1, 1023),747 Error::<Test>::TokenNotFound727 Error::<Test>::TokenNotFound748 );728 );749729807 787 808 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);788 let nft_collection_id = create_test_collection(&CollectionMode::NFT, 1);809 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);789 let fungible_collection_id = create_test_collection(&CollectionMode::Fungible(3), 2);810 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible(3), 3);790 let re_fungible_collection_id = create_test_collection(&CollectionMode::ReFungible, 3);811 791 812 // check balance before792 // check balance before813 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);793 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 0);826 // check balance (collection with id = 1, user id = 1)806 // check balance (collection with id = 1, user id = 1)827 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);807 assert_eq!(TemplateModule::balance_count(nft_collection_id, 1), 1);828 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);808 assert_eq!(TemplateModule::balance_count(fungible_collection_id, 1), 5);829 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1000);809 assert_eq!(TemplateModule::balance_count(re_fungible_collection_id, 1), 1023);830 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);810 assert_eq!(TemplateModule::nft_item_id(nft_collection_id, 1).owner, 1);831 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).value, 5);811 assert_eq!(TemplateModule::fungible_item_id(fungible_collection_id, 1).value, 5);832 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);812 assert_eq!(TemplateModule::refungible_item_id(re_fungible_collection_id, 1).owner[0].owner, 1);1905 new_test_ext().execute_with(|| {1885 new_test_ext().execute_with(|| {1906 default_limits();1886 default_limits();190718871908 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);1888 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);190918891910 let origin1 = Origin::signed(1);1890 let origin1 = Origin::signed(1);191118911982 }));1962 }));19831963198419641985 let collection_id = create_test_collection(&CollectionMode::ReFungible(3), 1);1965 let collection_id = create_test_collection(&CollectionMode::ReFungible, 1);198619661987 let origin1 = Origin::signed(1);1967 let origin1 = Origin::signed(1);19881968runtime_types.jsondiffbeforeafterboth1{1{2 "Schedule": {3 "version": "u32",4 "put_code_per_byte_cost": "Gas",5 "grow_mem_cost": "Gas",6 "regular_op_cost": "Gas",7 "return_data_per_byte_cost": "Gas",8 "event_data_per_byte_cost": "Gas",9 "event_per_topic_cost": "Gas",10 "event_base_cost": "Gas",11 "call_base_cost": "Gas",12 "instantiate_base_cost": "Gas",13 "dispatch_base_cost": "Gas",14 "sandbox_data_read_cost": "Gas",15 "sandbox_data_write_cost": "Gas",16 "transfer_cost": "Gas",17 "instantiate_cost": "Gas",18 "max_event_topics": "u32",19 "max_stack_height": "u32",20 "max_memory_pages": "u32",21 "max_table_size": "u32",22 "enable_println": "bool",23 "max_subject_len": "u32"24 },25 "AccessMode": {2 "AccessMode": {26 "_enum": [3 "_enum": [27 "Normal",4 "Normal",34 "Invalid": null,11 "Invalid": null,35 "NFT": null,12 "NFT": null,36 "Fungible": "DecimalPoints",13 "Fungible": "DecimalPoints",37 "ReFungible": "DecimalPoints"14 "ReFungible": null38 }15 }39 },16 },40 "Ownership": {17 "Ownership": {84 },61 },85 "CreateReFungibleData": {62 "CreateReFungibleData": {86 "const_data": "Vec<u8>",63 "const_data": "Vec<u8>",87 "variable_data": "Vec<u8>" 64 "variable_data": "Vec<u8>",65 "pieces": "u128"88 },66 },89 "CreateItemData": {67 "CreateItemData": {90 "_enum": {68 "_enum": {120 "SponsorTimeout": "u32",98 "SponsorTimeout": "u32",121 "OwnerCanTransfer": "bool",99 "OwnerCanTransfer": "bool",122 "OwnerCanDestroy": "bool"100 "OwnerCanDestroy": "bool"123 },101 }124 "AccountInfo": "AccountInfoWithProviders",125 "AccountInfoWithProviders": {126 "nonce": "Index",127 "consumers": "RefCount",128 "providers": "RefCount",129 "data": "AccountData"130 }131132 }102}133 tests/src/addCollectionAdmin.test.tsdiffbeforeafterboth1//
2// This file is subject to the terms and conditions defined in
3// file 'LICENSE', which is part of this source code package.
4//
5
1import { ApiPromise } from '@polkadot/api';
6import { ApiPromise } from '@polkadot/api';
2import BN from 'bn.js';
7import BN from 'bn.js';
98 });
103 });
99 });
104 });
100
105
101 it('Add an admin to a collection that has reached the maximum number of admins limit', async () => {
106 it.only('Add an admin to a collection that has reached the maximum number of admins limit', async () => {
102 await usingApi(async (api: ApiPromise) => {
107 await usingApi(async (api: ApiPromise) => {
103 const Alice = privateKey('//Alice');
108 const Alice = privateKey('//Alice');
104 const accounts = [
109 const accounts = [
112 ];
117 ];
113 const collectionId = await createCollectionExpectSuccess();
118 const collectionId = await createCollectionExpectSuccess();
114
119
115 const chainLimits: any = await api.query.nft.chainLimit();
120 const chainLimit = await api.query.nft.chainLimit() as unknown as { CollectionAdminsLimit: BN };
116 const chainAdminLimit = chainLimits.CollectionAdminsLimit.toNumber();
121 const chainAdminLimit = chainLimit.CollectionAdminsLimit.toNumber();
117 expect(chainAdminLimit).to.be.equal(5);
122 expect(chainAdminLimit).to.be.equal(5);
118
123
119 for (let i = 0; i < chainAdminLimit; i++) {
124 for (let i = 0; i < chainAdminLimit; i++) {
tests/src/addToContractWhiteList.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import chai from "chai";6import chai from "chai";2import chaiAsPromised from 'chai-as-promised';7import chaiAsPromised from 'chai-as-promised';tests/src/addToWhiteList.test.tsdiffbeforeafterboth1//
2// This file is subject to the terms and conditions defined in
3// file 'LICENSE', which is part of this source code package.
4//
5
1import { IKeyringPair } from '@polkadot/types/types';
6import { IKeyringPair } from '@polkadot/types/types';
2import chai from 'chai';
7import chai from 'chai';
tests/src/approve.test.tsdiffbeforeafterboth34 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);34 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob);35 // reFungible35 // reFungible36 const reFungibleCollectionId =36 const reFungibleCollectionId =37 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});37 await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});38 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');38 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');39 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);39 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);40 });40 });56 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 0);56 await approveExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 0);57 // reFungible57 // reFungible58 const reFungibleCollectionId =58 const reFungibleCollectionId =59 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});59 await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});60 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');60 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');61 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 1);61 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 1);62 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 0);62 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 0);95 await approveExpectFail(fungibleCollectionId, 1, Alice, Bob);95 await approveExpectFail(fungibleCollectionId, 1, Alice, Bob);96 // reFungible96 // reFungible97 const reFungibleCollectionId =97 const reFungibleCollectionId =98 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});98 await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});99 await destroyCollectionExpectSuccess(reFungibleCollectionId);99 await destroyCollectionExpectSuccess(reFungibleCollectionId);100 await approveExpectFail(reFungibleCollectionId, 1, Alice, Bob);100 await approveExpectFail(reFungibleCollectionId, 1, Alice, Bob);101 });101 });113 await approveExpectFail(fungibleCollectionId, 2, Alice, Bob);113 await approveExpectFail(fungibleCollectionId, 2, Alice, Bob);114 // reFungible114 // reFungible115 const reFungibleCollectionId =115 const reFungibleCollectionId =116 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});116 await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});117 await approveExpectFail(reFungibleCollectionId, 2, Alice, Bob);117 await approveExpectFail(reFungibleCollectionId, 2, Alice, Bob);118 });118 });119 });119 });132 await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice);132 await approveExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice);133 // reFungible133 // reFungible134 const reFungibleCollectionId =134 const reFungibleCollectionId =135 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});135 await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});136 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');136 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');137 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice);137 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Bob, Alice);138 });138 });tests/src/burnItem.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from './substrate/substrate-api';6import { default as usingApi, submitTransactionAsync, submitTransactionExpectFailAsync } from './substrate/substrate-api';2import { Keyring } from "@polkadot/api";7import { Keyring } from "@polkadot/api";70 });75 });71 it('Burn item in ReFungible collection', async () => {76 it('Burn item in ReFungible collection', async () => {72 const createMode = 'ReFungible';77 const createMode = 'ReFungible';73 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode, decimalPoints: 2 }});78 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode }});74 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);79 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);758076 await usingApi(async (api) => {81 await usingApi(async (api) => {919692 it('Burn owned portion of item in ReFungible collection', async () => {97 it('Burn owned portion of item in ReFungible collection', async () => {93 const createMode = 'ReFungible';98 const createMode = 'ReFungible';94 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode, decimalPoints: 2 }});99 const collectionId = await createCollectionExpectSuccess({mode: {type: createMode}});95 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);100 const tokenId = await createItemExpectSuccess(alice, collectionId, createMode);9610197 await usingApi(async (api) => {102 await usingApi(async (api) => {tests/src/change-collection-owner.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import chai from 'chai';6import chai from 'chai';2import chaiAsPromised from 'chai-as-promised';7import chaiAsPromised from 'chai-as-promised';tests/src/confirmSponsorship.test.tsdiffbeforeafterboth115 });115 });116116117 it('ReFungible: Transfer fees are paid by the sponsor after confirmation', async () => {117 it('ReFungible: Transfer fees are paid by the sponsor after confirmation', async () => {118 const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0 }});118 const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});119 await setCollectionSponsorExpectSuccess(collectionId, bob.address);119 await setCollectionSponsorExpectSuccess(collectionId, bob.address);120 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');120 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');121121247 });247 });248248249 it('ReFungible: Sponsoring is rate limited', async () => {249 it('ReFungible: Sponsoring is rate limited', async () => {250 const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0 }});250 const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});251 await setCollectionSponsorExpectSuccess(collectionId, bob.address);251 await setCollectionSponsorExpectSuccess(collectionId, bob.address);252 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');252 await confirmSponsorshipExpectSuccess(collectionId, '//Bob');253253tests/src/contracts.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import chai from "chai";6import chai from "chai";2import chaiAsPromised from 'chai-as-promised';7import chaiAsPromised from 'chai-as-promised';tests/src/createCollection.test.tsdiffbeforeafterboth28 await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
28 await createCollectionExpectSuccess({mode: {type: 'Fungible', decimalPoints: 0}});
29 });
29 });
30 it('Create new ReFungible collection', async () => {
30 it('Create new ReFungible collection', async () => {
31 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});
31 await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});
32 });
32 });
33});
33});
34
34
tests/src/createItem.test.tsdiffbeforeafterboth1//
2// This file is subject to the terms and conditions defined in
3// file 'LICENSE', which is part of this source code package.
4//
5
1import { default as usingApi } from './substrate/substrate-api';
6import { default as usingApi } from './substrate/substrate-api';
2import { Keyring } from "@polkadot/api";
7import { Keyring } from "@polkadot/api";
28 });
33 });
29 it('Create new item in ReFungible collection', async () => {
34 it('Create new item in ReFungible collection', async () => {
30 const createMode = 'ReFungible';
35 const createMode = 'ReFungible';
31 const newCollectionID = await createCollectionExpectSuccess({mode: {type: createMode, decimalPoints: 0}});
36 const newCollectionID = await createCollectionExpectSuccess({mode: {type: createMode}});
32 await createItemExpectSuccess(alice, newCollectionID, createMode);
37 await createItemExpectSuccess(alice, newCollectionID, createMode);
33 });
38 });
34});
39});
tests/src/createMultipleItems.test.tsdiffbeforeafterboth565657 it('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => {57 it('Create 0x31, 0x32, 0x33 items in active ReFungible collection and verify tokens data in chain', async () => {58 await usingApi(async (api: ApiPromise) => {58 await usingApi(async (api: ApiPromise) => {59 const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});59 const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});60 const itemsListIndexBefore = await api.query.nft.itemListIndex(collectionId) as unknown as BN;60 const itemsListIndexBefore = await api.query.nft.itemListIndex(collectionId) as unknown as BN;61 expect(itemsListIndexBefore.toNumber()).to.be.equal(0);61 expect(itemsListIndexBefore.toNumber()).to.be.equal(0);62 const Alice = privateKey('//Alice');62 const Alice = privateKey('//Alice');63 const args = [63 const args = [64 { Refungible: ['0x31', '0x31'] },64 {refungible: {const_data: [0x31], variable_data: [0x31], pieces: 1}},65 { Refungible: ['0x32', '0x32'] },65 {refungible: {const_data: [0x32], variable_data: [0x32], pieces: 1}},66 { Refungible: ['0x33', '0x33'] },66 {refungible: {const_data: [0x33], variable_data: [0x33], pieces: 1}},67 ];67 ];68 const createMultipleItemsTx = await api.tx.nft68 const createMultipleItemsTx = await api.tx.nft69 .createMultipleItems(collectionId, Alice.address, args);69 .createMultipleItems(collectionId, Alice.address, args);137137138 // ReFungible138 // ReFungible139 const collectionIdReFungible =139 const collectionIdReFungible =140 await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});140 await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});141 const argsReFungible = [141 const argsReFungible = [142 { ReFungible: ['1'.repeat(2049), '1'.repeat(2049)] },142 { ReFungible: ['1'.repeat(2049), '1'.repeat(2049)] },143 { ReFungible: ['2'.repeat(2049), '2'.repeat(2049)] },143 { ReFungible: ['2'.repeat(2049), '2'.repeat(2049)] },tests/src/destroyCollection.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import chai from 'chai';6import chai from 'chai';2import chaiAsPromised from 'chai-as-promised';7import chaiAsPromised from 'chai-as-promised';3import { default as usingApi, submitTransactionAsync } from "./substrate/substrate-api";8import { default as usingApi } from "./substrate/substrate-api";4import { createCollectionExpectSuccess, createCollectionExpectFailure, destroyCollectionExpectSuccess, destroyCollectionExpectFailure } from "./util/helpers";9import { createCollectionExpectSuccess, destroyCollectionExpectSuccess, destroyCollectionExpectFailure } from "./util/helpers";5import type { AccountId, EventRecord } from '@polkadot/types/interfaces';6import privateKey from './substrate/privateKey';7108chai.use(chaiAsPromised);11chai.use(chaiAsPromised);9const expect = chai.expect;101211describe('integration test: ext. destroyCollection():', () => {13describe('integration test: ext. destroyCollection():', () => {12 it('NFT collection can be destroyed', async () => {14 it('NFT collection can be destroyed', async () => {18 await destroyCollectionExpectSuccess(collectionId);20 await destroyCollectionExpectSuccess(collectionId);19 });21 });20 it('ReFungible collection can be destroyed', async () => {22 it('ReFungible collection can be destroyed', async () => {21 const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});23 const collectionId = await createCollectionExpectSuccess({mode: {type: 'ReFungible'}});22 await destroyCollectionExpectSuccess(collectionId);24 await destroyCollectionExpectSuccess(collectionId);23 });25 });24});26});tests/src/enableContractSponsoring.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import { IKeyringPair } from '@polkadot/types/types';6import { IKeyringPair } from '@polkadot/types/types';2import chai from 'chai';7import chai from 'chai';tests/src/removeCollectionAdmin.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import { ApiPromise } from '@polkadot/api';6import { ApiPromise } from '@polkadot/api';2import BN from 'bn.js';3import chai from 'chai';7import chai from 'chai';4import chaiAsPromised from 'chai-as-promised';8import chaiAsPromised from 'chai-as-promised';5import privateKey from './substrate/privateKey';9import privateKey from './substrate/privateKey';tests/src/removeFromWhiteList.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import chai from 'chai';6import chai from 'chai';2import chaiAsPromised from 'chai-as-promised';7import chaiAsPromised from 'chai-as-promised';tests/src/setCollectionLimits.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51// https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits6// https://unique-network.readthedocs.io/en/latest/jsapi.html#setchainlimits2import { ApiPromise, Keyring } from '@polkadot/api';7import { ApiPromise, Keyring } from '@polkadot/api';tests/src/setCollectionSponsor.test.tsdiffbeforeafterboth9import { createCollectionExpectSuccess, setCollectionSponsorExpectSuccess, destroyCollectionExpectSuccess, setCollectionSponsorExpectFailure } from "./util/helpers";9import { createCollectionExpectSuccess, setCollectionSponsorExpectSuccess, destroyCollectionExpectSuccess, setCollectionSponsorExpectFailure } from "./util/helpers";10import { Keyring } from "@polkadot/api";10import { Keyring } from "@polkadot/api";11import { IKeyringPair } from "@polkadot/types/types";11import { IKeyringPair } from "@polkadot/types/types";12import type { AccountId } from '@polkadot/types/interfaces';131214chai.use(chaiAsPromised);13chai.use(chaiAsPromised);15const expect = chai.expect;14const expect = chai.expect;34 await setCollectionSponsorExpectSuccess(collectionId, bob.address);33 await setCollectionSponsorExpectSuccess(collectionId, bob.address);35 });34 });36 it('Set ReFungible collection sponsor', async () => {35 it('Set ReFungible collection sponsor', async () => {37 const collectionId = await createCollectionExpectSuccess({ mode: {type: 'ReFungible', decimalPoints: 0} });36 const collectionId = await createCollectionExpectSuccess({ mode: {type: 'ReFungible'} });38 await setCollectionSponsorExpectSuccess(collectionId, bob.address);37 await setCollectionSponsorExpectSuccess(collectionId, bob.address);39 });38 });4039tests/src/setConstOnChainSchema.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import { Keyring } from '@polkadot/api';6import { Keyring } from '@polkadot/api';2import { IKeyringPair } from '@polkadot/types/types';7import { IKeyringPair } from '@polkadot/types/types';tests/src/setContractSponsoringRateLimit.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import { IKeyringPair } from '@polkadot/types/types';6import { IKeyringPair } from '@polkadot/types/types';2import privateKey from './substrate/privateKey';7import privateKey from './substrate/privateKey';tests/src/setMintPermission.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import { IKeyringPair } from '@polkadot/types/types';6import { IKeyringPair } from '@polkadot/types/types';2import privateKey from './substrate/privateKey';7import privateKey from './substrate/privateKey';tests/src/setPublicAccessMode.test.tsdiffbeforeafterboth1//
2// This file is subject to the terms and conditions defined in
3// file 'LICENSE', which is part of this source code package.
4//
5
1// https://unique-network.readthedocs.io/en/latest/jsapi.html#setschemaversion
6// https://unique-network.readthedocs.io/en/latest/jsapi.html#setschemaversion
2import { ApiPromise, Keyring } from '@polkadot/api';
7import { ApiPromise, Keyring } from '@polkadot/api';
tests/src/setSchemaVersion.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51// https://unique-network.readthedocs.io/en/latest/jsapi.html#setschemaversion6// https://unique-network.readthedocs.io/en/latest/jsapi.html#setschemaversion2import { ApiPromise, Keyring } from '@polkadot/api';7import { ApiPromise, Keyring } from '@polkadot/api';3import { IKeyringPair } from '@polkadot/types/types';8import { IKeyringPair } from '@polkadot/types/types';4import BN from 'bn.js';5import chai from 'chai';9import chai from 'chai';6import chaiAsPromised from 'chai-as-promised';10import chaiAsPromised from 'chai-as-promised';7import usingApi, {submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api';11import usingApi, {submitTransactionAsync, submitTransactionExpectFailAsync} from './substrate/substrate-api';tests/src/setVariableMetaData.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import { IKeyringPair } from '@polkadot/types/types';6import { IKeyringPair } from '@polkadot/types/types';2import chai from 'chai';7import chai from 'chai';tests/src/setVariableOnChainSchema.test.tsdiffbeforeafterboth1//
2// This file is subject to the terms and conditions defined in
3// file 'LICENSE', which is part of this source code package.
4//
5
1import { Keyring } from '@polkadot/api';
6import { Keyring } from '@polkadot/api';
2import { IKeyringPair } from '@polkadot/types/types';
7import { IKeyringPair } from '@polkadot/types/types';
tests/src/toggleContractWhiteList.test.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import chai from "chai";6import chai from "chai";2import chaiAsPromised from 'chai-as-promised';7import chaiAsPromised from 'chai-as-promised';tests/src/transfer.test.tsdiffbeforeafterboth63 });63 });64 });64 });656566 it('Create collection, balance transfers and check balance', async () => {66 it('User can transfer owned token', async () => {67 await usingApi(async (api) => {67 await usingApi(async (api) => {68 const Alice = privateKey('//Alice');68 const Alice = privateKey('//Alice');69 const Bob = privateKey('//Bob');69 const Bob = privateKey('//Bob');77 await transferExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');77 await transferExpectSuccess(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');78 // reFungible78 // reFungible79 const reFungibleCollectionId = await79 const reFungibleCollectionId = await80 createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});80 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});81 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');81 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');82 await transferExpectSuccess(reFungibleCollectionId,82 await transferExpectSuccess(reFungibleCollectionId,83 newReFungibleTokenId, Alice, Bob, 1, 'ReFungible');83 newReFungibleTokenId, Alice, Bob, 100, 'ReFungible');84 });84 });85 });85 });86});86});119 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');119 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');120 // reFungible120 // reFungible121 const reFungibleCollectionId = await121 const reFungibleCollectionId = await122 createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});122 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});123 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');123 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');124 await destroyCollectionExpectSuccess(reFungibleCollectionId);124 await destroyCollectionExpectSuccess(reFungibleCollectionId);125 await transferExpectFail(reFungibleCollectionId,125 await transferExpectFail(reFungibleCollectionId,134 await transferExpectFail(fungibleCollectionId, 2, Alice, Bob, 1, 'Fungible');134 await transferExpectFail(fungibleCollectionId, 2, Alice, Bob, 1, 'Fungible');135 // reFungible135 // reFungible136 const reFungibleCollectionId = await136 const reFungibleCollectionId = await137 createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});137 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});138 await transferExpectFail(reFungibleCollectionId,138 await transferExpectFail(reFungibleCollectionId,139 2, Alice, Bob, 1, 'ReFungible');139 2, Alice, Bob, 1, 'ReFungible');140 });140 });151 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');151 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Alice, Bob, 1, 'Fungible');152 // reFungible152 // reFungible153 const reFungibleCollectionId = await153 const reFungibleCollectionId = await154 createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});154 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});155 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');155 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');156 await burnItemExpectSuccess(Alice, reFungibleCollectionId, newReFungibleTokenId, 1);156 await burnItemExpectSuccess(Alice, reFungibleCollectionId, newReFungibleTokenId, 1);157 await transferExpectFail(reFungibleCollectionId,157 await transferExpectFail(reFungibleCollectionId,168 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Charlie, Bob, 1, 'Fungible');168 await transferExpectFail(fungibleCollectionId, newFungibleTokenId, Charlie, Bob, 1, 'Fungible');169 // reFungible169 // reFungible170 const reFungibleCollectionId = await170 const reFungibleCollectionId = await171 createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});171 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});172 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');172 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');173 await transferExpectFail(reFungibleCollectionId,173 await transferExpectFail(reFungibleCollectionId,174 newReFungibleTokenId, Charlie, Bob, 1, 'ReFungible');174 newReFungibleTokenId, Charlie, Bob, 1, 'ReFungible');tests/src/transferFrom.test.tsdiffbeforeafterboth25 await usingApi(async (api: ApiPromise) => {25 await usingApi(async (api: ApiPromise) => {26 const Alice = privateKey('//Alice');26 const Alice = privateKey('//Alice');27 const Bob = privateKey('//Bob');27 const Bob = privateKey('//Bob');28 const Charlie = privateKey('//CHARLIE');28 const Charlie = privateKey('//Charlie');29 // nft29 // nft30 const nftCollectionId = await createCollectionExpectSuccess();30 const nftCollectionId = await createCollectionExpectSuccess();31 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');31 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');40 await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1, 'Fungible');40 await transferFromExpectSuccess(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1, 'Fungible');41 // reFungible41 // reFungible42 const reFungibleCollectionId = await42 const reFungibleCollectionId = await43 createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});43 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});44 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');44 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');45 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);45 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob, 100);46 await transferFromExpectSuccess(reFungibleCollectionId,46 await transferFromExpectSuccess(reFungibleCollectionId,47 newReFungibleTokenId, Bob, Alice, Charlie, 1, 'ReFungible');47 newReFungibleTokenId, Bob, Alice, Charlie, 100, 'ReFungible');48 });48 });49 });49 });50});50});54 await usingApi(async (api: ApiPromise) => {54 await usingApi(async (api: ApiPromise) => {55 const Alice = privateKey('//Alice');55 const Alice = privateKey('//Alice');56 const Bob = privateKey('//Bob');56 const Bob = privateKey('//Bob');57 const Charlie = privateKey('//CHARLIE');57 const Charlie = privateKey('//Charlie');58 // nft58 // nft59 const nftCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;59 const nftCollectionCount = await api.query.nft.createdCollectionCount() as unknown as number;60 await approveExpectFail(nftCollectionCount + 1, 1, Alice, Bob);60 await approveExpectFail(nftCollectionCount + 1, 1, Alice, Bob);96 await usingApi(async (api: ApiPromise) => {96 await usingApi(async (api: ApiPromise) => {97 const Alice = privateKey('//Alice');97 const Alice = privateKey('//Alice');98 const Bob = privateKey('//Bob');98 const Bob = privateKey('//Bob');99 const Charlie = privateKey('//CHARLIE');99 const Charlie = privateKey('//Charlie');100 // nft100 // nft101 const nftCollectionId = await createCollectionExpectSuccess();101 const nftCollectionId = await createCollectionExpectSuccess();102 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');102 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');109 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1);109 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 1);110 // reFungible110 // reFungible111 const reFungibleCollectionId = await111 const reFungibleCollectionId = await112 createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});112 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});113 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');113 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');114 await transferFromExpectFail(reFungibleCollectionId,114 await transferFromExpectFail(reFungibleCollectionId,115 newReFungibleTokenId, Bob, Alice, Charlie, 1);115 newReFungibleTokenId, Bob, Alice, Charlie, 1);120 await usingApi(async (api: ApiPromise) => {120 await usingApi(async (api: ApiPromise) => {121 const Alice = privateKey('//Alice');121 const Alice = privateKey('//Alice');122 const Bob = privateKey('//Bob');122 const Bob = privateKey('//Bob');123 const Charlie = privateKey('//CHARLIE');123 const Charlie = privateKey('//Charlie');124 // nft124 // nft125 const nftCollectionId = await createCollectionExpectSuccess();125 const nftCollectionId = await createCollectionExpectSuccess();126 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');126 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');135 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 2);135 await transferFromExpectFail(fungibleCollectionId, newFungibleTokenId, Bob, Alice, Charlie, 2);136 // reFungible136 // reFungible137 const reFungibleCollectionId = await137 const reFungibleCollectionId = await138 createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});138 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});139 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');139 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');140 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);140 await approveExpectSuccess(reFungibleCollectionId, newReFungibleTokenId, Alice, Bob);141 await transferFromExpectFail(reFungibleCollectionId,141 await transferFromExpectFail(reFungibleCollectionId,147 await usingApi(async (api: ApiPromise) => {147 await usingApi(async (api: ApiPromise) => {148 const Alice = privateKey('//Alice');148 const Alice = privateKey('//Alice');149 const Bob = privateKey('//Bob');149 const Bob = privateKey('//Bob');150 const Charlie = privateKey('//CHARLIE');150 const Charlie = privateKey('//Charlie');151 const Dave = privateKey('//DAVE');151 const Dave = privateKey('//Dave');152 // nft152 // nft153 const nftCollectionId = await createCollectionExpectSuccess();153 const nftCollectionId = await createCollectionExpectSuccess();154 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');154 const newNftTokenId = await createItemExpectSuccess(Alice, nftCollectionId, 'NFT');174 }174 }175 // reFungible175 // reFungible176 const reFungibleCollectionId = await176 const reFungibleCollectionId = await177 createCollectionExpectSuccess({mode: {type: 'ReFungible', decimalPoints: 0}});177 createCollectionExpectSuccess({mode: {type: 'ReFungible'}});178 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');178 const newReFungibleTokenId = await createItemExpectSuccess(Alice, reFungibleCollectionId, 'ReFungible');179 try {179 try {180 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Dave, Bob);180 await approveExpectFail(reFungibleCollectionId, newReFungibleTokenId, Dave, Bob);tests/src/types.tsdiffbeforeafterboth1//2// This file is subject to the terms and conditions defined in3// file 'LICENSE', which is part of this source code package.4//51import BN from 'bn.js';6import BN from 'bn.js';27tests/src/util/helpers.tsdiffbeforeafterboth124124125interface ReFungible {125interface ReFungible {126 type: 'ReFungible';126 type: 'ReFungible';127 decimalPoints: number;128}127}129130interface Nft {131 type: 'NFT'132}133134interface Fungible {135 type: 'Fungible',136 decimalPoints: number137}138139interface ReFungible {140 type: 'ReFungible',141 decimalPoints: number142}143128144type CollectionMode = Nft | Fungible | ReFungible | Invalid;129type CollectionMode = Nft | Fungible | ReFungible | Invalid;145130174 } else if (mode.type === 'Fungible') {159 } else if (mode.type === 'Fungible') {175 modeprm = {fungible: mode.decimalPoints};160 modeprm = {fungible: mode.decimalPoints};176 } else if (mode.type === 'ReFungible') {161 } else if (mode.type === 'ReFungible') {177 modeprm = {refungible: mode.decimalPoints};162 modeprm = {refungible: null};178 } else if (mode.type === 'Invalid') {163 } else if (mode.type === 'Invalid') {179 modeprm = {invalid: null};164 modeprm = {invalid: null};180 }165 }216 } else if (mode.type === 'Fungible') {201 } else if (mode.type === 'Fungible') {217 modeprm = {fungible: mode.decimalPoints};202 modeprm = {fungible: mode.decimalPoints};218 } else if (mode.type === 'ReFungible') {203 } else if (mode.type === 'ReFungible') {219 modeprm = {refungible: mode.decimalPoints};204 modeprm = {refungible: null};220 } else if (mode.type === 'Invalid') {205 } else if (mode.type === 'Invalid') {221 modeprm = {invalid: null};206 modeprm = {invalid: null};222 }207 }620 if (createMode === 'Fungible') {605 if (createMode === 'Fungible') {621 const createData = {fungible: {value: 10}};606 const createData = {fungible: {value: 10}};622 tx = api.tx.nft.createItem(collectionId, owner, createData);607 tx = api.tx.nft.createItem(collectionId, owner, createData);623 } else {608 } else if (createMode === 'ReFungible') {609 const createData = {refungible: {const_data: [], variable_data: [], pieces: 100}};610 tx = api.tx.nft.createItem(collectionId, owner, createData);611 } else {624 tx = api.tx.nft.createItem(collectionId, owner, createMode);612 tx = api.tx.nft.createItem(collectionId, owner, createMode);625 }613 }626 const events = await submitTransactionAsync(sender, tx);614 const events = await submitTransactionAsync(sender, tx);