36 lines
1.1 KiB
Solidity
36 lines
1.1 KiB
Solidity
// SPDX-License-Identifier: CC0-1.0
|
|
pragma solidity ^0.8.0;
|
|
|
|
contract Verifier {
|
|
|
|
function verifyOwnership(
|
|
address token,
|
|
uint256 tokenId
|
|
) internal {
|
|
// bytes(keccak256(bytes('ownerOf(uint256)')));
|
|
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x6352211e, tokenId));
|
|
require(
|
|
success && (data.length == 32 && bytesToAddress(data) == address(this)),
|
|
"Verifier::verifyOwnership: NFT ownership verification failed"
|
|
);
|
|
}
|
|
|
|
function getOwner(
|
|
address token,
|
|
uint256 tokenId
|
|
) internal returns(address) {
|
|
// bytes(keccak256(bytes('ownerOf(uint256)')));
|
|
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x6352211e, tokenId));
|
|
require(
|
|
success && (data.length == 32),
|
|
"Verifier::getOwner: NFT ownership verification failed"
|
|
);
|
|
return bytesToAddress(data);
|
|
}
|
|
|
|
function bytesToAddress(bytes memory bys) internal pure returns (address addr) {
|
|
assembly {
|
|
addr := mload(add(bys,32))
|
|
}
|
|
}
|
|
} |