difftreelog
feat bulk mint/get/set metadata
in: master
5 files changed
pallets/nft/src/eth/erc.rsdiffbeforeafterboth8};8};9use frame_support::storage::{StorageMap, StorageDoubleMap};9use frame_support::storage::{StorageMap, StorageDoubleMap};10use pallet_evm::AddressMapping;10use pallet_evm::AddressMapping;11use pallet_evm_coder_substrate::dispatch_to_evm;11use super::account::CrossAccountId;12use super::account::CrossAccountId;12use sp_std::{vec, vec::Vec};13use sp_std::{vec, vec::Vec};1314300 .into())301 .into())301 }302 }303304 fn set_variable_metadata(305 &mut self,306 caller: caller,307 token_id: uint256,308 data: bytes,309 ) -> Result<void> {310 let caller = T::CrossAccountId::from_eth(caller);311 let token_id = token_id.try_into().map_err(|_| "token id overflow")?;312313 <Module<T>>::set_variable_meta_data_internal(&caller, self, token_id, data)314 .map_err(dispatch_to_evm::<T>)?;315 Ok(())316 }317318 fn get_variable_metadata(&self, token_id: uint256) -> Result<bytes> {319 let token_id = token_id.try_into().map_err(|_| "token id overflow")?;320321 <Module<T>>::get_variable_metadata(self, token_id).map_err(dispatch_to_evm::<T>)322 }323324 fn mint_bulk(&mut self, caller: caller, to: address, token_ids: Vec<uint256>) -> Result<bool> {325 let caller = T::CrossAccountId::from_eth(caller);326 let to = T::CrossAccountId::from_eth(to);327 let mut expected_index = <ItemListIndex>::get(self.id)328 .checked_add(1)329 .ok_or("item id overflow")?;330331 let total_tokens = token_ids.len();332 for id in token_ids.into_iter() {333 let id: u32 = id.try_into().map_err(|_| "token id overflow")?;334 if id != expected_index {335 return Err("item id should be next".into());336 }337 expected_index = expected_index.checked_add(1).ok_or("item id overflow")?;338 }339340 let data = (0..total_tokens)341 .map(|_| {342 CreateItemData::NFT(CreateNftData {343 const_data: vec![].try_into().unwrap(),344 variable_data: vec![].try_into().unwrap(),345 })346 })347 .collect();348349 <Module<T>>::create_multiple_items_internal(&caller, self, &to, data)350 .map_err(dispatch_to_evm::<T>)?;351 Ok(true)352 }353354 #[solidity(rename_selector = "mintBulkWithTokenURI")]355 fn mint_bulk_with_token_uri(356 &mut self,357 caller: caller,358 to: address,359 tokens: Vec<(uint256, string)>,360 ) -> Result<bool> {361 let caller = T::CrossAccountId::from_eth(caller);362 let to = T::CrossAccountId::from_eth(to);363 let mut expected_index = <ItemListIndex>::get(self.id)364 .checked_add(1)365 .ok_or("item id overflow")?;366367 let mut data = Vec::with_capacity(tokens.len());368 for (id, token_uri) in tokens {369 let id: u32 = id.try_into().map_err(|_| "token id overflow")?;370 if id != expected_index {371 panic!("item id should be next ({}) but got {}", expected_index, id);372 }373 expected_index = expected_index.checked_add(1).ok_or("item id overflow")?;374375 data.push(CreateItemData::NFT(CreateNftData {376 const_data: Vec::<u8>::from(token_uri)377 .try_into()378 .map_err(|_| "token uri is too long")?,379 variable_data: vec![].try_into().unwrap(),380 }));381 }382383 <Module<T>>::create_multiple_items_internal(&caller, self, &to, data)384 .map_err(dispatch_to_evm::<T>)?;385 Ok(true)386 }302}387}303388304#[solidity_interface(389#[solidity_interface(pallets/nft/src/eth/stubs/UniqueNFT.rawdiffbeforeafterbothbinary blob — no preview
pallets/nft/src/eth/stubs/UniqueNFT.soldiffbeforeafterboth334pragma solidity >=0.8.0 <0.9.0;4pragma solidity >=0.8.0 <0.9.0;56// Anonymous struct7struct Tuple0 {8 uint256 field_0;9 string field_1;10}5116// Common stubs holder12// Common stubs holder7contract Dummy {13contract Dummy {240 return 0;246 return 0;241 }247 }248249 // Selector: setVariableMetadata(uint256,bytes) d4eac26d250 function setVariableMetadata(uint256 tokenId, bytes memory data) public {251 require(false, stub_error);252 tokenId;253 data;254 dummy = 0;255 }256257 // Selector: getVariableMetadata(uint256) e6c5ce6f258 function getVariableMetadata(uint256 tokenId)259 public260 view261 returns (bytes memory)262 {263 require(false, stub_error);264 tokenId;265 dummy;266 return hex"";267 }268269 // Selector: mintBulk(address,uint256[]) 44a9945e270 function mintBulk(address to, uint256[] memory tokenIds)271 public272 returns (bool)273 {274 require(false, stub_error);275 to;276 tokenIds;277 dummy = 0;278 return false;279 }280281 // Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006282 function mintBulkWithTokenURI(address to, Tuple0[] memory tokens)283 public284 returns (bool)285 {286 require(false, stub_error);287 to;288 tokens;289 dummy = 0;290 return false;291 }242}292}243293244contract UniqueNFT is294contract UniqueNFT ispallets/nft/src/lib.rsdiffbeforeafterboth1501 Ok(())1501 Ok(())1502 }1502 }15031504 pub fn get_variable_metadata(collection: &CollectionHandle<T>, item_id: TokenId) -> Result<Vec<u8>, DispatchError> {1505 Ok(match collection.mode {1506 CollectionMode::NFT => <NftItemList<T>>::get(collection.id, item_id).ok_or(Error::<T>::TokenNotFound)?.variable_data,1507 CollectionMode::ReFungible => <ReFungibleItemList<T>>::get(collection.id, item_id).ok_or(Error::<T>::TokenNotFound)?.variable_data,1508 _ => fail!(Error::<T>::UnexpectedCollectionType),1509 })1510 }150315111504 pub fn create_multiple_items_internal(1512 pub fn create_multiple_items_internal(1505 sender: &T::CrossAccountId,1513 sender: &T::CrossAccountId,tests/src/eth/api/UniqueNFT.soldiffbeforeafterboth334pragma solidity >=0.8.0 <0.9.0;4pragma solidity >=0.8.0 <0.9.0;56// Anonymous struct7struct Tuple0 {8 uint256 field_0;9 string field_1;10}5116// Common stubs holder12// Common stubs holder7interface Dummy {13interface Dummy {120126121 function nextTokenId() external view returns (uint256);127 function nextTokenId() external view returns (uint256);128129 // Selector: setVariableMetadata(uint256,bytes) d4eac26d130 function setVariableMetadata(uint256 tokenId, bytes memory data) external;131132 // Selector: getVariableMetadata(uint256) e6c5ce6f133 function getVariableMetadata(uint256 tokenId)134 external135 view136 returns (bytes memory);137138 // Selector: mintBulk(address,uint256[]) 44a9945e139 function mintBulk(address to, uint256[] memory tokenIds)140 external141 returns (bool);142143 // Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006144 function mintBulkWithTokenURI(address to, Tuple0[] memory tokens)145 external146 returns (bool);122}147}123148124interface UniqueNFT is149interface UniqueNFT is