difftreelog
Merge pull request #897 from UniqueNetwork/feature/impl_getApproved
in: master
6 files changed
pallets/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`.
pallets/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`.
pallets/nonfungible/src/stubs/UniqueNFT.rawdiffbeforeafterbothbinary blob — no preview
pallets/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) {
tests/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);
tests/src/eth/nonFungible.test.tsdiffbeforeafterboth229 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);231231232 {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});234242238 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 });242254243 itEth('Can perform setApprovalForAll()', async ({helper}) => {255 itEth('Can perform setApprovalForAll()', async ({helper}) => {