difftreelog
feat support burning fro evm
in: master
1 file changed
pallets/nft/src/lib.rsdiffbeforeafterboth1180 #[transactional]1180 #[transactional]1181 pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResult {1181 pub fn burn_item(origin, collection_id: CollectionId, item_id: TokenId, value: u128) -> DispatchResult {118211821183 let sender = ensure_signed(origin)?;1183 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);11841185 // Transfer permissions check1186 let target_collection = Self::get_collection(collection_id)?;1184 let target_collection = Self::get_collection(collection_id)?;1187 ensure!(11851188 Self::is_item_owner(sender.clone(), &target_collection, item_id) ||1186 Self::burn_item_internal(&sender, &target_collection, item_id, value)?;1189 (1190 target_collection.limits.owner_can_transfer &&1191 Self::is_owner_or_admin_permissions(&target_collection, sender.clone())1192 ),1193 Error::<T>::NoPermission1194 );11951196 if target_collection.access == AccessMode::WhiteList {1197 Self::check_white_list(&target_collection, &sender)?;1198 }11991200 match target_collection.mode1201 {1202 CollectionMode::NFT => Self::burn_nft_item(&target_collection, item_id)?,1203 CollectionMode::Fungible(_) => Self::burn_fungible_item(&sender, &target_collection, value)?,1204 CollectionMode::ReFungible => Self::burn_refungible_item(&target_collection, item_id, &sender)?,1205 _ => ()1206 };12071208 // call event1209 Self::deposit_event(RawEvent::ItemDestroyed(target_collection.id, item_id));121011871211 Ok(())1188 Ok(())1212 }1189 }1477 collection_id: CollectionId,1454 collection_id: CollectionId,1478 schema: Vec<u8>1455 schema: Vec<u8>1479 ) -> DispatchResult {1456 ) -> DispatchResult {1480 let sender = ensure_signed(origin)?;1457 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1481 let mut target_collection = Self::get_collection(collection_id)?;1458 let mut target_collection = Self::get_collection(collection_id)?;1482 Self::check_owner_or_admin_permissions(&target_collection, sender.clone())?;1459 Self::check_owner_or_admin_permissions(&target_collection, sender)?;148314601484 // check schema limit1461 // check schema limit1485 ensure!(schema.len() as u32 <= ChainLimit::get().offchain_schema_limit, "");1462 ensure!(schema.len() as u32 <= ChainLimit::get().offchain_schema_limit, "");1509 collection_id: CollectionId,1486 collection_id: CollectionId,1510 schema: Vec<u8>1487 schema: Vec<u8>1511 ) -> DispatchResult {1488 ) -> DispatchResult {1512 let sender = ensure_signed(origin)?;1489 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1513 let mut target_collection = Self::get_collection(collection_id)?;1490 let mut target_collection = Self::get_collection(collection_id)?;1514 Self::check_owner_or_admin_permissions(&target_collection, sender.clone())?;1491 Self::check_owner_or_admin_permissions(&target_collection, sender)?;151514921516 // check schema limit1493 // check schema limit1517 ensure!(schema.len() as u32 <= ChainLimit::get().const_on_chain_schema_limit, "");1494 ensure!(schema.len() as u32 <= ChainLimit::get().const_on_chain_schema_limit, "");1541 collection_id: CollectionId,1518 collection_id: CollectionId,1542 schema: Vec<u8>1519 schema: Vec<u8>1543 ) -> DispatchResult {1520 ) -> DispatchResult {1544 let sender = ensure_signed(origin)?;1521 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);1545 let mut target_collection = Self::get_collection(collection_id)?;1522 let mut target_collection = Self::get_collection(collection_id)?;1546 Self::check_owner_or_admin_permissions(&target_collection, sender.clone())?;1523 Self::check_owner_or_admin_permissions(&target_collection, sender)?;154715241548 // check schema limit1525 // check schema limit1549 ensure!(schema.len() as u32 <= ChainLimit::get().variable_on_chain_schema_limit, "");1526 ensure!(schema.len() as u32 <= ChainLimit::get().variable_on_chain_schema_limit, "");1899 Ok(())1876 Ok(())1900 }1877 }18781879 pub fn burn_item_internal(1880 sender: &T::CrossAccountId,1881 collection: &CollectionHandle<T>,1882 item_id: TokenId,1883 value: u128,1884 ) -> DispatchResult {1885 ensure!(1886 Self::is_item_owner(sender.clone(), &collection, item_id) ||1887 (1888 collection.limits.owner_can_transfer &&1889 Self::is_owner_or_admin_permissions(&collection, sender.clone())1890 ),1891 Error::<T>::NoPermission1892 );18931894 if collection.access == AccessMode::WhiteList {1895 Self::check_white_list(&collection, &sender)?;1896 }18971898 match collection.mode1899 {1900 CollectionMode::NFT => Self::burn_nft_item(&collection, item_id)?,1901 CollectionMode::Fungible(_) => Self::burn_fungible_item(&sender, &collection, value)?,1902 CollectionMode::ReFungible => Self::burn_refungible_item(&collection, item_id, &sender)?,1903 _ => ()1904 };19051906 Ok(())1907 }190119081902 fn is_correct_transfer(collection: &CollectionHandle<T>, recipient: &T::AccountId) -> DispatchResult {1909 fn is_correct_transfer(collection: &CollectionHandle<T>, recipient: &T::AccountId) -> DispatchResult {1903 let collection_id = collection.id;1910 let collection_id = collection.id;2081 fn burn_refungible_item(2088 fn burn_refungible_item(2082 collection: &CollectionHandle<T>,2089 collection: &CollectionHandle<T>,2083 item_id: TokenId,2090 item_id: TokenId,2084 owner: &T::AccountId,2091 owner: &T::CrossAccountId,2085 ) -> DispatchResult {2092 ) -> DispatchResult {2086 let collection_id = collection.id;2093 let collection_id = collection.id;208720942095 Self::remove_token_index(collection_id, item_id, owner)?;2102 Self::remove_token_index(collection_id, item_id, owner)?;209621032097 // update balance2104 // update balance2098 let new_balance = <Balance<T>>::get(collection_id, rft_balance.owner.clone())2105 let new_balance = <Balance<T>>::get(collection_id, rft_balance.owner.as_sub())2099 .checked_sub(rft_balance.fraction)2106 .checked_sub(rft_balance.fraction)2100 .ok_or(Error::<T>::NumOverflow)?;2107 .ok_or(Error::<T>::NumOverflow)?;2101 <Balance<T>>::insert(collection_id, rft_balance.owner.clone(), new_balance);2108 <Balance<T>>::insert(collection_id, rft_balance.owner.as_sub(), new_balance);210221092103 // Re-create owners list with sender removed2110 // Re-create owners list with sender removed2104 let index = token2111 let index = token2129 Self::remove_token_index(collection_id, item_id, &item.owner)?;2136 Self::remove_token_index(collection_id, item_id, &item.owner)?;213021372131 // update balance2138 // update balance2132 let new_balance = <Balance<T>>::get(collection_id, &item.owner)2139 let new_balance = <Balance<T>>::get(collection_id, item.owner.as_sub())2133 .checked_sub(1)2140 .checked_sub(1)2134 .ok_or(Error::<T>::NumOverflow)?;2141 .ok_or(Error::<T>::NumOverflow)?;2135 <Balance<T>>::insert(collection_id, item.owner.clone(), new_balance);2142 <Balance<T>>::insert(collection_id, item.owner.as_sub(), new_balance);2136 <NftItemList<T>>::remove(collection_id, item_id);2143 <NftItemList<T>>::remove(collection_id, item_id);2137 <VariableMetaDataBasket<T>>::remove(collection_id, item_id);2144 <VariableMetaDataBasket<T>>::remove(collection_id, item_id);213821452146 Self::deposit_event(RawEvent::ItemDestroyed(collection.id, item_id));2139 Ok(())2147 Ok(())2140 }2148 }214121492142 fn burn_fungible_item(owner: &T::AccountId, collection: &CollectionHandle<T>, value: u128) -> DispatchResult {2150 fn burn_fungible_item(owner: &T::CrossAccountId, collection: &CollectionHandle<T>, value: u128) -> DispatchResult {2143 let collection_id = collection.id;2151 let collection_id = collection.id;214421522145 let mut balance = <FungibleItemList<T>>::get(collection_id, owner);2153 let mut balance = <FungibleItemList<T>>::get(collection_id, owner.as_sub());2146 ensure!(balance.value >= value, Error::<T>::TokenValueNotEnough);2154 ensure!(balance.value >= value, Error::<T>::TokenValueNotEnough);214721552148 // update balance2156 // update balance2149 let new_balance = <Balance<T>>::get(collection_id, owner)2157 let new_balance = <Balance<T>>::get(collection_id, owner.as_sub())2150 .checked_sub(value)2158 .checked_sub(value)2151 .ok_or(Error::<T>::NumOverflow)?;2159 .ok_or(Error::<T>::NumOverflow)?;2152 <Balance<T>>::insert(collection_id, (*owner).clone(), new_balance);2160 <Balance<T>>::insert(collection_id, owner.as_sub(), new_balance);215321612154 if balance.value - value > 0 {2162 if balance.value - value > 0 {2155 balance.value -= value;2163 balance.value -= value;2156 <FungibleItemList<T>>::insert(collection_id, (*owner).clone(), balance);2164 <FungibleItemList<T>>::insert(collection_id, owner.as_sub(), balance);2157 }2165 }2158 else {2166 else {2159 <FungibleItemList<T>>::remove(collection_id, owner);2167 <FungibleItemList<T>>::remove(collection_id, owner.as_sub());2160 }2168 }216121692162 Ok(())2170 Ok(())