Skip to content

Commit

Permalink
chore(XPNFTToken): add NFTMetadataGeneratorURL
Browse files Browse the repository at this point in the history
  • Loading branch information
gravityblast committed Oct 9, 2024
1 parent 5a71ed7 commit f36d85a
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
24 changes: 24 additions & 0 deletions src/nft-metadata-generators/NFTMetadataGeneratorURL.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import { Strings } from "@openzeppelin/contracts/utils/Strings.sol";
import { BaseNFTMetadataGenerator } from "./BaseNFTMetadataGenerator.sol";

contract NFTMetadataGeneratorURL is BaseNFTMetadataGenerator {
string public urlPrefix;
string public urlSuffix;

constructor(address nft, string memory _urlPrefix, string memory _urlSuffix) BaseNFTMetadataGenerator(nft) {
urlPrefix = _urlPrefix;
urlSuffix = _urlSuffix;
}

function setURLStrings(string memory _urlPrefix, string memory _urlSuffix) external onlyOwner {
urlPrefix = _urlPrefix;
urlSuffix = _urlSuffix;
}

function generateImageURI(address account, uint256) internal view override returns (string memory) {
return string(abi.encodePacked(urlPrefix, Strings.toHexString(account), urlSuffix));
}
}
51 changes: 51 additions & 0 deletions test/nft-metadata-generators/NFTMetadataGeneratorURL.t.sol
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;

import { Test, console } from "forge-std/Test.sol";

Check warning on line 4 in test/nft-metadata-generators/NFTMetadataGeneratorURL.t.sol

View workflow job for this annotation

GitHub Actions / lint

imported name console is not used
import { Base64 } from "@openzeppelin/contracts/utils/Base64.sol";
import { Ownable } from "@openzeppelin/contracts/access/Ownable.sol";
import { MockToken } from "../mocks/MockToken.sol";
import { NFTMetadataGeneratorURL } from "../../src/nft-metadata-generators/NFTMetadataGeneratorURL.sol";

contract NFTMetadataGeneratorURLTest is Test {
MockToken erc20Token;

Check warning on line 11 in test/nft-metadata-generators/NFTMetadataGeneratorURL.t.sol

View workflow job for this annotation

GitHub Actions / lint

Explicitly mark visibility of state
NFTMetadataGeneratorURL metadataGenerator;

Check warning on line 12 in test/nft-metadata-generators/NFTMetadataGeneratorURL.t.sol

View workflow job for this annotation

GitHub Actions / lint

Explicitly mark visibility of state

address alice = makeAddr("alice");

Check warning on line 14 in test/nft-metadata-generators/NFTMetadataGeneratorURL.t.sol

View workflow job for this annotation

GitHub Actions / lint

Explicitly mark visibility of state

function setUp() public {
erc20Token = new MockToken("Test", "TEST");
metadataGenerator = new NFTMetadataGeneratorURL(address(erc20Token), "http://test.local/images/", ".jpg");

erc20Token.mint(alice, 10e18);
}

function testGenerateMetadata() public view {
string memory expectedMetadata = "data:application/json;base64,";
bytes memory json = abi.encodePacked(
"{\"name\":\"XPNFT Token 0x328809bc894f92807417d2dad6b7c998c1afdac6\",",
"\"description\":\"This is a XPNFT token for address 0x328809bc894f92807417d2dad6b7c998c1afdac6 with balance 10000000000000000000\",",

Check failure on line 27 in test/nft-metadata-generators/NFTMetadataGeneratorURL.t.sol

View workflow job for this annotation

GitHub Actions / lint

Line length must be no more than 120 but current length is 146
"\"image\":\"http://test.local/images/0x328809bc894f92807417d2dad6b7c998c1afdac6.jpg\"}"
);
expectedMetadata = string(abi.encodePacked(expectedMetadata, Base64.encode(json)));

string memory metadata = metadataGenerator.generate(alice, erc20Token.balanceOf(alice));
assertEq(metadata, expectedMetadata);
}

function testSetBaseURL() public {
string memory newURLPrefix = "http://new-test.local/images/";
string memory newURLSuffix = ".png";

metadataGenerator.setURLStrings(newURLPrefix, newURLSuffix);

assertEq(metadataGenerator.urlPrefix(), newURLPrefix);
assertEq(metadataGenerator.urlSuffix(), newURLSuffix);
}

function testSetBaseURLRevert() public {
vm.prank(alice);
vm.expectPartialRevert(Ownable.OwnableUnauthorizedAccount.selector);
metadataGenerator.setURLStrings("http://new-test.local/images/", ".png");
}
}

0 comments on commit f36d85a

Please sign in to comment.