1use core::marker::PhantomData;23use frame_support::{dispatch::DispatchResultWithPostInfo, ensure, fail, weights::Weight};4use nft_data_structs::TokenId;5use pallet_common::{6 CommonCollectionOperations, CommonWeightInfo, account::CrossAccountId, with_weight,7};8use sp_runtime::ArithmeticError;9use sp_std::{vec::Vec, vec};1011use crate::{12 Allowance, Balance, Config, Error, FungibleHandle, Pallet, SelfWeightOf, weights::WeightInfo,13};1415pub struct CommonWeights<T: Config>(PhantomData<T>);16impl<T: Config> CommonWeightInfo for CommonWeights<T> {17 fn create_item() -> Weight {18 <SelfWeightOf<T>>::create_item()19 }2021 fn create_multiple_items(_amount: u32) -> Weight {22 Self::create_item()23 }2425 fn burn_item() -> Weight {26 <SelfWeightOf<T>>::burn_item()27 }2829 fn transfer() -> Weight {30 <SelfWeightOf<T>>::transfer()31 }3233 fn approve() -> Weight {34 <SelfWeightOf<T>>::approve()35 }3637 fn transfer_from() -> Weight {38 <SelfWeightOf<T>>::transfer_from()39 }4041 fn burn_from() -> Weight {42 043 }4445 fn set_variable_metadata(_bytes: u32) -> Weight {46 47 048 }49}5051impl<T: Config> CommonCollectionOperations<T> for FungibleHandle<T> {52 fn create_item(53 &self,54 sender: T::CrossAccountId,55 to: T::CrossAccountId,56 data: nft_data_structs::CreateItemData,57 ) -> DispatchResultWithPostInfo {58 match data {59 nft_data_structs::CreateItemData::Fungible(data) => with_weight(60 <Pallet<T>>::create_item(self, &sender, (to, data.value)),61 <CommonWeights<T>>::create_item(),62 ),63 _ => fail!(<Error<T>>::NotFungibleDataUsedToMintFungibleCollectionToken),64 }65 }6667 fn create_multiple_items(68 &self,69 sender: T::CrossAccountId,70 to: T::CrossAccountId,71 data: Vec<nft_data_structs::CreateItemData>,72 ) -> DispatchResultWithPostInfo {73 let mut sum: u128 = 0;74 for data in data {75 match data {76 nft_data_structs::CreateItemData::Fungible(data) => {77 sum = sum78 .checked_add(data.value)79 .ok_or(ArithmeticError::Overflow)?;80 }81 _ => fail!(<Error<T>>::NotFungibleDataUsedToMintFungibleCollectionToken),82 }83 }8485 with_weight(86 <Pallet<T>>::create_item(self, &sender, (to, sum)),87 <CommonWeights<T>>::create_item(),88 )89 }9091 fn burn_item(92 &self,93 sender: T::CrossAccountId,94 token: TokenId,95 amount: u128,96 ) -> DispatchResultWithPostInfo {97 ensure!(98 token == TokenId::default(),99 <Error<T>>::FungibleItemsHaveNoId100 );101102 with_weight(103 <Pallet<T>>::burn(self, &sender, amount),104 <CommonWeights<T>>::burn_item(),105 )106 }107108 fn transfer(109 &self,110 from: T::CrossAccountId,111 to: T::CrossAccountId,112 token: TokenId,113 amount: u128,114 ) -> DispatchResultWithPostInfo {115 ensure!(116 token == TokenId::default(),117 <Error<T>>::FungibleItemsHaveNoId118 );119120 with_weight(121 <Pallet<T>>::transfer(&self, &from, &to, amount),122 <CommonWeights<T>>::transfer(),123 )124 }125126 fn approve(127 &self,128 sender: T::CrossAccountId,129 spender: T::CrossAccountId,130 token: TokenId,131 amount: u128,132 ) -> DispatchResultWithPostInfo {133 ensure!(134 token == TokenId::default(),135 <Error<T>>::FungibleItemsHaveNoId136 );137138 with_weight(139 <Pallet<T>>::set_allowance(&self, &sender, &spender, amount),140 <CommonWeights<T>>::approve(),141 )142 }143144 fn transfer_from(145 &self,146 sender: T::CrossAccountId,147 from: T::CrossAccountId,148 to: T::CrossAccountId,149 token: TokenId,150 amount: u128,151 ) -> DispatchResultWithPostInfo {152 ensure!(153 token == TokenId::default(),154 <Error<T>>::FungibleItemsHaveNoId155 );156157 with_weight(158 <Pallet<T>>::transfer_from(&self, &sender, &from, &to, amount),159 <CommonWeights<T>>::transfer_from(),160 )161 }162163 fn burn_from(164 &self,165 sender: T::CrossAccountId,166 from: T::CrossAccountId,167 token: TokenId,168 amount: u128,169 ) -> DispatchResultWithPostInfo {170 ensure!(171 token == TokenId::default(),172 <Error<T>>::FungibleItemsHaveNoId173 );174175 with_weight(176 <Pallet<T>>::burn_from(&self, &sender, &from, amount),177 <CommonWeights<T>>::burn_from(),178 )179 }180181 fn set_variable_metadata(182 &self,183 _sender: T::CrossAccountId,184 _token: TokenId,185 _data: Vec<u8>,186 ) -> DispatchResultWithPostInfo {187 fail!(<Error<T>>::FungibleItemsHaveData)188 }189190 fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId> {191 if <Balance<T>>::get((self.id, account.as_sub())) != 0 {192 vec![TokenId::default()]193 } else {194 vec![]195 }196 }197198 fn token_exists(&self, token: TokenId) -> bool {199 token == TokenId::default()200 }201202 fn last_token_id(&self) -> TokenId {203 TokenId::default()204 }205206 fn token_owner(&self, _token: TokenId) -> T::CrossAccountId {207 T::CrossAccountId::default()208 }209 fn const_metadata(&self, _token: TokenId) -> Vec<u8> {210 Vec::new()211 }212 fn variable_metadata(&self, _token: TokenId) -> Vec<u8> {213 Vec::new()214 }215216 fn collection_tokens(&self) -> u32 {217 1218 }219220 fn account_balance(&self, account: T::CrossAccountId) -> u32 {221 if <Balance<T>>::get((self.id, account.as_sub())) != 0 {222 1223 } else {224 0225 }226 }227228 fn balance(&self, account: T::CrossAccountId, token: TokenId) -> u128 {229 if token != TokenId::default() {230 return 0;231 }232 <Balance<T>>::get((self.id, account.as_sub()))233 }234235 fn allowance(236 &self,237 sender: T::CrossAccountId,238 spender: T::CrossAccountId,239 token: TokenId,240 ) -> u128 {241 if token != TokenId::default() {242 return 0;243 }244 <Allowance<T>>::get((self.id, sender.as_sub(), spender.as_sub()))245 }246}