// SPDX-License-Identifier: MIT pragma solidity ^0.8.13; import "../Assets.sol"; abstract contract ERC721AssetUtils { function _assetClass() internal pure returns (bytes4) { return Assets.ERC721; } /// @dev Extract token address + tokenId for ERC721 (works for ERC1155 tokens as well) function _tokenWithId(Assets.Asset memory self) internal pure returns (address, uint256) { return _tokenWithId(self.id); } /// @dev Extract token address + tokenId for ERC721 (works for ERC1155 tokens as well) function _tokenWithId(Assets.AssetId memory self) internal pure returns (address, uint256) { return abi.decode(self.data, (address, uint256)); } /** * @dev Calculates collection ID. * Foe ERC721 tokens, the collection ID is calculated by hashing the contract address itself. */ function _collectionId(address token) internal pure returns (bytes32) { return keccak256(abi.encode(token)); } /** * @dev Decodes asset ID and extracts identification data. * @param id Asset ID structure. * @return token Token contract address. * @return tokenId Token ID. */ function _decodeAssetId(Assets.AssetId memory id) internal pure returns (address token, uint256 tokenId) { return abi.decode(id.data, (address, uint256)); } /** * @dev Encodes asset ID. * @param token Token contract address. * @param tokenId Token ID. * @return Asset ID structure. */ function _encodeAssetId(address token, uint256 tokenId) internal pure returns (Assets.AssetId memory) { return Assets.AssetId(_assetClass(), abi.encode(token, tokenId)); } }