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

difftreelog

feat bulk mint/get/set metadata

Yaroslav Bolyukin2021-09-01parent: #742db63.patch.diff
in: master

5 files changed

modifiedpallets/nft/src/eth/erc.rsdiffbeforeafterboth
8};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};
1314
300 .into())301 .into())
301 }302 }
303
304 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")?;
312
313 <Module<T>>::set_variable_meta_data_internal(&caller, self, token_id, data)
314 .map_err(dispatch_to_evm::<T>)?;
315 Ok(())
316 }
317
318 fn get_variable_metadata(&self, token_id: uint256) -> Result<bytes> {
319 let token_id = token_id.try_into().map_err(|_| "token id overflow")?;
320
321 <Module<T>>::get_variable_metadata(self, token_id).map_err(dispatch_to_evm::<T>)
322 }
323
324 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")?;
330
331 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 }
339
340 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();
348
349 <Module<T>>::create_multiple_items_internal(&caller, self, &to, data)
350 .map_err(dispatch_to_evm::<T>)?;
351 Ok(true)
352 }
353
354 #[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")?;
366
367 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")?;
374
375 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 }
382
383 <Module<T>>::create_multiple_items_internal(&caller, self, &to, data)
384 .map_err(dispatch_to_evm::<T>)?;
385 Ok(true)
386 }
302}387}
303388
304#[solidity_interface(389#[solidity_interface(
modifiedpallets/nft/src/eth/stubs/UniqueNFT.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/nft/src/eth/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nft/src/eth/stubs/UniqueNFT.sol
+++ b/pallets/nft/src/eth/stubs/UniqueNFT.sol
@@ -3,6 +3,12 @@
 
 pragma solidity >=0.8.0 <0.9.0;
 
+// Anonymous struct
+struct Tuple0 {
+	uint256 field_0;
+	string field_1;
+}
+
 // Common stubs holder
 contract Dummy {
 	uint8 dummy;
@@ -239,6 +245,50 @@
 		dummy;
 		return 0;
 	}
+
+	// Selector: setVariableMetadata(uint256,bytes) d4eac26d
+	function setVariableMetadata(uint256 tokenId, bytes memory data) public {
+		require(false, stub_error);
+		tokenId;
+		data;
+		dummy = 0;
+	}
+
+	// Selector: getVariableMetadata(uint256) e6c5ce6f
+	function getVariableMetadata(uint256 tokenId)
+		public
+		view
+		returns (bytes memory)
+	{
+		require(false, stub_error);
+		tokenId;
+		dummy;
+		return hex"";
+	}
+
+	// Selector: mintBulk(address,uint256[]) 44a9945e
+	function mintBulk(address to, uint256[] memory tokenIds)
+		public
+		returns (bool)
+	{
+		require(false, stub_error);
+		to;
+		tokenIds;
+		dummy = 0;
+		return false;
+	}
+
+	// Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006
+	function mintBulkWithTokenURI(address to, Tuple0[] memory tokens)
+		public
+		returns (bool)
+	{
+		require(false, stub_error);
+		to;
+		tokens;
+		dummy = 0;
+		return false;
+	}
 }
 
 contract UniqueNFT is
modifiedpallets/nft/src/lib.rsdiffbeforeafterboth
--- a/pallets/nft/src/lib.rs
+++ b/pallets/nft/src/lib.rs
@@ -1501,6 +1501,14 @@
 		Ok(())
 	}
 
+	pub fn get_variable_metadata(collection: &CollectionHandle<T>, item_id: TokenId) -> Result<Vec<u8>, DispatchError> {
+		Ok(match collection.mode {
+			CollectionMode::NFT => <NftItemList<T>>::get(collection.id, item_id).ok_or(Error::<T>::TokenNotFound)?.variable_data,
+			CollectionMode::ReFungible => <ReFungibleItemList<T>>::get(collection.id, item_id).ok_or(Error::<T>::TokenNotFound)?.variable_data,
+			_ => fail!(Error::<T>::UnexpectedCollectionType),
+		})
+	}
+
 	pub fn create_multiple_items_internal(
 		sender: &T::CrossAccountId,
 		collection: &CollectionHandle<T>,
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -3,6 +3,12 @@
 
 pragma solidity >=0.8.0 <0.9.0;
 
+// Anonymous struct
+struct Tuple0 {
+	uint256 field_0;
+	string field_1;
+}
+
 // Common stubs holder
 interface Dummy {
 
@@ -119,6 +125,25 @@
 	function transfer(address to, uint256 tokenId) external;
 
 	function nextTokenId() external view returns (uint256);
+
+	// Selector: setVariableMetadata(uint256,bytes) d4eac26d
+	function setVariableMetadata(uint256 tokenId, bytes memory data) external;
+
+	// Selector: getVariableMetadata(uint256) e6c5ce6f
+	function getVariableMetadata(uint256 tokenId)
+		external
+		view
+		returns (bytes memory);
+
+	// Selector: mintBulk(address,uint256[]) 44a9945e
+	function mintBulk(address to, uint256[] memory tokenIds)
+		external
+		returns (bool);
+
+	// Selector: mintBulkWithTokenURI(address,(uint256,string)[]) 36543006
+	function mintBulkWithTokenURI(address to, Tuple0[] memory tokens)
+		external
+		returns (bool);
 }
 
 interface UniqueNFT is