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 set_variable_metadata(_bytes: u32) -> Weight {42 43 044 }45}4647impl<T: Config> CommonCollectionOperations<T> for FungibleHandle<T> {48 fn create_item(49 &self,50 sender: T::CrossAccountId,51 to: T::CrossAccountId,52 data: nft_data_structs::CreateItemData,53 ) -> DispatchResultWithPostInfo {54 match data {55 nft_data_structs::CreateItemData::Fungible(data) => with_weight(56 <Pallet<T>>::create_item(self, &sender, (to, data.value)),57 <SelfWeightOf<T>>::create_item(),58 ),59 _ => fail!(<Error<T>>::NotFungibleDataUsedToMintFungibleCollectionToken),60 }61 }6263 fn create_multiple_items(64 &self,65 sender: T::CrossAccountId,66 to: T::CrossAccountId,67 data: Vec<nft_data_structs::CreateItemData>,68 ) -> DispatchResultWithPostInfo {69 let mut sum: u128 = 0;70 for data in data {71 match data {72 nft_data_structs::CreateItemData::Fungible(data) => {73 sum = sum74 .checked_add(data.value)75 .ok_or(ArithmeticError::Overflow)?;76 }77 _ => fail!(<Error<T>>::NotFungibleDataUsedToMintFungibleCollectionToken),78 }79 }8081 with_weight(82 <Pallet<T>>::create_item(self, &sender, (to, sum)),83 <SelfWeightOf<T>>::create_item(),84 )85 }8687 fn burn_item(88 &self,89 sender: T::CrossAccountId,90 token: TokenId,91 amount: u128,92 ) -> DispatchResultWithPostInfo {93 ensure!(94 token == TokenId::default(),95 <Error<T>>::FungibleItemsHaveNoId96 );9798 with_weight(99 <Pallet<T>>::burn(self, &sender, amount),100 <SelfWeightOf<T>>::burn_item(),101 )102 }103104 fn transfer(105 &self,106 from: T::CrossAccountId,107 to: T::CrossAccountId,108 token: TokenId,109 amount: u128,110 ) -> DispatchResultWithPostInfo {111 ensure!(112 token == TokenId::default(),113 <Error<T>>::FungibleItemsHaveNoId114 );115116 with_weight(117 <Pallet<T>>::transfer(&self, &from, &to, amount),118 <SelfWeightOf<T>>::transfer(),119 )120 }121122 fn approve(123 &self,124 sender: T::CrossAccountId,125 spender: T::CrossAccountId,126 token: TokenId,127 amount: u128,128 ) -> DispatchResultWithPostInfo {129 ensure!(130 token == TokenId::default(),131 <Error<T>>::FungibleItemsHaveNoId132 );133134 with_weight(135 <Pallet<T>>::set_allowance(&self, &sender, &spender, amount),136 <SelfWeightOf<T>>::approve(),137 )138 }139140 fn transfer_from(141 &self,142 sender: T::CrossAccountId,143 from: T::CrossAccountId,144 to: T::CrossAccountId,145 token: TokenId,146 amount: u128,147 ) -> DispatchResultWithPostInfo {148 ensure!(149 token == TokenId::default(),150 <Error<T>>::FungibleItemsHaveNoId151 );152153 with_weight(154 <Pallet<T>>::transfer_from(&self, &sender, &from, &to, amount),155 <SelfWeightOf<T>>::transfer_from(),156 )157 }158159 fn set_variable_metadata(160 &self,161 _sender: T::CrossAccountId,162 _token: TokenId,163 _data: Vec<u8>,164 ) -> DispatchResultWithPostInfo {165 fail!(<Error<T>>::FungibleItemsHaveData)166 }167168 fn account_tokens(&self, account: T::CrossAccountId) -> Vec<TokenId> {169 if <Balance<T>>::get((self.id, account.as_sub())) != 0 {170 vec![TokenId::default()]171 } else {172 vec![]173 }174 }175176 fn token_exists(&self, token: TokenId) -> bool {177 token == TokenId::default()178 }179180 fn token_owner(&self, _token: TokenId) -> T::CrossAccountId {181 T::CrossAccountId::default()182 }183 fn const_metadata(&self, _token: TokenId) -> Vec<u8> {184 Vec::new()185 }186 fn variable_metadata(&self, _token: TokenId) -> Vec<u8> {187 Vec::new()188 }189190 fn collection_tokens(&self) -> u32 {191 1192 }193194 fn account_balance(&self, account: T::CrossAccountId) -> u32 {195 if <Balance<T>>::get((self.id, account.as_sub())) != 0 {196 1197 } else {198 0199 }200 }201202 fn balance(&self, account: T::CrossAccountId, token: TokenId) -> u128 {203 if token != TokenId::default() {204 return 0;205 }206 <Balance<T>>::get((self.id, account.as_sub()))207 }208209 fn allowance(210 &self,211 sender: T::CrossAccountId,212 spender: T::CrossAccountId,213 token: TokenId,214 ) -> u128 {215 if token != TokenId::default() {216 return 0;217 }218 <Allowance<T>>::get((self.id, sender.as_sub(), spender.as_sub()))219 }220}