diff --git a/contracts/gptmining/GPTMinerInscription.sol b/contracts/gptmining/GPTMinerInscription.sol index 3e7202f..1b2bfbe 100644 --- a/contracts/gptmining/GPTMinerInscription.sol +++ b/contracts/gptmining/GPTMinerInscription.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; +pragma solidity >=0.8.2 <0.9.0; import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; @@ -19,32 +19,83 @@ contract GPTMinerInscription is ERC721, Ownable { tokenIdToAmount[tokenId] = amount; } + function split(uint256 tokenId, uint256 amount) external { + require(_ownerOf(tokenId) == msg.sender, "Not token owner"); + require(tokenIdToAmount[tokenId] > amount, "Amount exceeds"); + uint256 newTokenId = _nextTokenId++; + tokenIdToAmount[tokenId] -= amount; + _safeMint(msg.sender, newTokenId); + tokenIdToAmount[newTokenId] = amount; + } + function tokenURI( uint256 tokenId ) public view virtual override returns (string memory) { _requireOwned(tokenId); - bytes memory dataURI = abi.encodePacked( - "{", - '"name": "GPTMinerInscription #', - tokenId.toString(), - '",', - '"description":"World\'s first token inscribed by GPT.",', - '"attributes":[', - '{', - '"trait_type":"Amount",', - '"value":"', (tokenIdToAmount[tokenId]).toString(), '"', - '}', - "]", - "}" + string[13] memory parts; + string memory amount = (tokenIdToAmount[tokenId]).toString(); + + parts[ + 0 + ] = ''; + + parts[1] = "{"; + + parts[2] = ''; + + parts[3] = '"p": "gpt20"'; + + parts[4] = ''; + + parts[5] = '"op": "mint"'; + + parts[6] = ''; + + parts[7] = '"tick": "gpt"'; + + parts[8] = '"amount": "'; + + parts[9] = amount; + + parts[10] = '"'; + + parts[11] = '}'; + + parts[12] = ""; + + string memory output = string( + abi.encodePacked( + parts[0], + parts[1], + parts[2], + parts[3], + parts[4], + parts[5], + parts[6], + parts[7], + parts[8] + ) ); + output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12])); - return - string( - abi.encodePacked( - "data:application/json;base64,", - Base64.encode(dataURI) + string memory json = Base64.encode( + bytes( + string( + abi.encodePacked( + '{"name": "GPTMiner Inscription #', + tokenId.toString(), + '", "description": "World\'s first token inscribed by GPT.", "image": "data:image/svg+xml;base64,', + Base64.encode(bytes(output)), + '"}' + ) ) - ); + ) + ); + output = string( + abi.encodePacked("data:application/json;base64,", json) + ); + + return output; } }