// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.15; import "@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol"; import "@openzeppelin/contracts/utils/Strings.sol"; import "./libraries/Base64.sol"; contract TokenURIRenderer { using Strings for uint256; bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; function render(address nftContract, uint256 tokenId) external view returns (string memory output) { string memory _name; try IERC721Metadata(nftContract).name() returns (string memory name) { _name = name; } catch { _name = uint256(uint160(nftContract)).toHexString(20); } string memory color = _toColor(nftContract); output = string( abi.encodePacked( 'Wrapped', _name, '#', tokenId.toString(), "" ) ); string memory json = Base64.encode( bytes( string( abi.encodePacked( '{"name": "Wrapped ', _name, " #", tokenId.toString(), '", "description": "Wrapped NFT that earns passive LEVX yield in proportional to the THANO$ staked together", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}' ) ) ) ); output = string(abi.encodePacked("data:application/json;base64,", json)); } function _toColor(address addr) internal pure returns (string memory) { uint160 value = uint160(addr); bytes memory buffer = new bytes(7); for (uint256 i = 6; i > 0; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "TURIR: HEX_LENGTH_INSUFFICIENT"); return string(buffer); } }