git.delta.rocks / unique-network / refs/commits / 39430dd15dad

difftreelog

Merge pull request #897 from UniqueNetwork/feature/impl_getApproved

Yaroslav Bolyukin2023-03-30parents: #2df4b51 #0361756.patch.diff
in: master

6 files changed

modifiedpallets/nonfungible/src/erc.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/erc.rs
+++ b/pallets/nonfungible/src/erc.rs
@@ -515,10 +515,18 @@
 		Ok(())
 	}
 
-	/// @dev Not implemented
-	fn get_approved(&self, _token_id: U256) -> Result<Address> {
-		// TODO: Not implemetable
-		Err("not implemented".into())
+	/// @notice Get the approved address for a single NFT
+	/// @dev Throws if `tokenId` is not a valid NFT
+	/// @param tokenId The NFT to find the approved address for
+	/// @return The approved address for this NFT, or the zero address if there is none
+	fn get_approved(&self, token_id: U256) -> Result<Address> {
+		let token_id = token_id.try_into()?;
+		let operator = <Pallet<T>>::get_allowance(self, token_id).map_err(dispatch_to_evm::<T>)?;
+		Ok(if let Some(operator) = operator {
+			*operator.as_eth()
+		} else {
+			Address::zero()
+		})
 	}
 
 	/// @notice Tells whether the given `owner` approves the `operator`.
modifiedpallets/nonfungible/src/lib.rsdiffbeforeafterboth
--- a/pallets/nonfungible/src/lib.rs
+++ b/pallets/nonfungible/src/lib.rs
@@ -1082,6 +1082,17 @@
 		}
 	}
 
+	pub fn get_allowance(
+		collection: &NonfungibleHandle<T>,
+		token_id: TokenId,
+	) -> Result<Option<T::CrossAccountId>, DispatchError> {
+		ensure!(
+			<TokenData<T>>::get((collection.id, token_id)).is_some(),
+			<CommonError<T>>::TokenNotFound
+		);
+		Ok(<Allowance<T>>::get((collection.id, token_id)))
+	}
+
 	/// Set allowance for the spender to `transfer` or `burn` sender's token.
 	///
 	/// - `token`: Token the spender is allowed to `transfer` or `burn`.
modifiedpallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterboth

binary blob — no preview

modifiedpallets/nonfungible/src/stubs/UniqueNFT.soldiffbeforeafterboth
--- a/pallets/nonfungible/src/stubs/UniqueNFT.sol
+++ b/pallets/nonfungible/src/stubs/UniqueNFT.sol
@@ -1156,7 +1156,10 @@
 		dummy = 0;
 	}
 
-	/// @dev Not implemented
+	/// @notice Get the approved address for a single NFT
+	/// @dev Throws if `tokenId` is not a valid NFT
+	/// @param tokenId The NFT to find the approved address for
+	/// @return The approved address for this NFT, or the zero address if there is none
 	/// @dev EVM selector for this function is: 0x081812fc,
 	///  or in textual repr: getApproved(uint256)
 	function getApproved(uint256 tokenId) public view returns (address) {
modifiedtests/src/eth/api/UniqueNFT.soldiffbeforeafterboth
--- a/tests/src/eth/api/UniqueNFT.sol
+++ b/tests/src/eth/api/UniqueNFT.sol
@@ -781,7 +781,10 @@
 	///  or in textual repr: setApprovalForAll(address,bool)
 	function setApprovalForAll(address operator, bool approved) external;
 
-	/// @dev Not implemented
+	/// @notice Get the approved address for a single NFT
+	/// @dev Throws if `tokenId` is not a valid NFT
+	/// @param tokenId The NFT to find the approved address for
+	/// @return The approved address for this NFT, or the zero address if there is none
 	/// @dev EVM selector for this function is: 0x081812fc,
 	///  or in textual repr: getApproved(uint256)
 	function getApproved(uint256 tokenId) external view returns (address);
modifiedtests/src/eth/nonFungible.test.tsdiffbeforeafterboth
229 const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);229 const collectionAddress = helper.ethAddress.fromCollectionId(collection.collectionId);
230 const contract = await helper.ethNativeContract.collection(collectionAddress, 'nft', owner);230 const contract = await helper.ethNativeContract.collection(collectionAddress, 'nft', owner);
231231
232 {
233 const badTokenId = await contract.methods.nextTokenId().call() + 1;
234 await expect(contract.methods.getApproved(badTokenId).call()).to.be.rejectedWith('revert TokenNotFound');
235 }
236 {
237 const approved = await contract.methods.getApproved(tokenId).call();
238 expect(approved).to.be.equal('0x0000000000000000000000000000000000000000');
239 }
232 {240 {
233 const result = await contract.methods.approve(spender, tokenId).send({from: owner});241 const result = await contract.methods.approve(spender, tokenId).send({from: owner});
234242
238 expect(event.returnValues.approved).to.be.equal(spender);246 expect(event.returnValues.approved).to.be.equal(spender);
239 expect(event.returnValues.tokenId).to.be.equal(`${tokenId}`);247 expect(event.returnValues.tokenId).to.be.equal(`${tokenId}`);
240 }248 }
249 {
250 const approved = await contract.methods.getApproved(tokenId).call();
251 expect(approved).to.be.equal(spender);
252 }
241 });253 });
242254
243 itEth('Can perform setApprovalForAll()', async ({helper}) => {255 itEth('Can perform setApprovalForAll()', async ({helper}) => {