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

difftreelog

feat support burning fro evm

Yaroslav Bolyukin2021-04-30parent: #24bc802.patch.diff
in: master

1 file changed

modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
1180 #[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 {
11821182
1183 let sender = ensure_signed(origin)?;1183 let sender = T::CrossAccountId::from_sub(ensure_signed(origin)?);
1184
1185 // Transfer permissions check
1186 let target_collection = Self::get_collection(collection_id)?;1184 let target_collection = Self::get_collection(collection_id)?;
1187 ensure!(1185
1188 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>::NoPermission
1194 );
1195
1196 if target_collection.access == AccessMode::WhiteList {
1197 Self::check_white_list(&target_collection, &sender)?;
1198 }
1199
1200 match target_collection.mode
1201 {
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 };
1207
1208 // call event
1209 Self::deposit_event(RawEvent::ItemDestroyed(target_collection.id, item_id));
12101187
1211 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)?;
14831460
1484 // check schema limit1461 // check schema limit
1485 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)?;
15151492
1516 // check schema limit1493 // check schema limit
1517 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)?;
15471524
1548 // check schema limit1525 // check schema limit
1549 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 }
1878
1879 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>::NoPermission
1892 );
1893
1894 if collection.access == AccessMode::WhiteList {
1895 Self::check_white_list(&collection, &sender)?;
1896 }
1897
1898 match collection.mode
1899 {
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 };
1905
1906 Ok(())
1907 }
19011908
1902 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;
20872094
2095 Self::remove_token_index(collection_id, item_id, owner)?;2102 Self::remove_token_index(collection_id, item_id, owner)?;
20962103
2097 // update balance2104 // update balance
2098 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);
21022109
2103 // Re-create owners list with sender removed2110 // Re-create owners list with sender removed
2104 let index = token2111 let index = token
2129 Self::remove_token_index(collection_id, item_id, &item.owner)?;2136 Self::remove_token_index(collection_id, item_id, &item.owner)?;
21302137
2131 // update balance2138 // update balance
2132 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);
21382145
2146 Self::deposit_event(RawEvent::ItemDestroyed(collection.id, item_id));
2139 Ok(())2147 Ok(())
2140 }2148 }
21412149
2142 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;
21442152
2145 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);
21472155
2148 // update balance2156 // update balance
2149 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);
21532161
2154 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 }
21612169
2162 Ok(())2170 Ok(())