parent
b8793df4f8
commit
cd02184d35
@ -0,0 +1,9 @@
|
||||
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||||
|
||||
pragma solidity ^0.8.14;
|
||||
|
||||
import "./INFT.sol";
|
||||
|
||||
interface INFTMetadata {
|
||||
function tokenURI(uint256 tokenId, INFT.TokenInfo memory token) external view returns (string memory);
|
||||
}
|
@ -0,0 +1,83 @@
|
||||
// SPDX-License-Identifier: MIT OR Apache-2.0
|
||||
|
||||
pragma solidity ^0.8.14;
|
||||
|
||||
import "@openzeppelin/contracts/utils/Strings.sol";
|
||||
import "@openzeppelin/contracts/utils/Base64.sol";
|
||||
import "./interfaces/INFT.sol";
|
||||
|
||||
contract NFTMetadata {
|
||||
function tokenURI(uint256 tokenId, INFT.TokenInfo calldata token) external view returns (string memory) {
|
||||
return
|
||||
string(
|
||||
abi.encodePacked(
|
||||
"data:application/json;base64,",
|
||||
Base64.encode(
|
||||
bytes(
|
||||
abi.encodePacked(
|
||||
'{"name": "Babies of Mars #',
|
||||
Strings.toString(tokenId),
|
||||
'", "description": "adasdasdasd", "image": "',
|
||||
token.image,
|
||||
'",{ "attributes": [ {"trait_type": "tokens", "value": ',
|
||||
addressArrayToString(token.tokens),
|
||||
'}, { "trait_type": "attack", "value": ',
|
||||
compileStatString(token)
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
function compileStatString(INFT.TokenInfo calldata token) internal view returns (string memory) {
|
||||
return string(abi.encodePacked(
|
||||
'}, { "trait_type": "attack", "value": ',
|
||||
Strings.toString(token.attack),
|
||||
'}, { "trait_type": "defense", "value": ',
|
||||
Strings.toString(token.defense),
|
||||
'}, { "trait_type": "health", "value": ',
|
||||
Strings.toString(token.health),
|
||||
'}, { "trait_type": "critical rate", "value": ',
|
||||
Strings.toString(token.critChance),
|
||||
'}, { "trait_type": "critical damage", "value": ',
|
||||
Strings.toString(token.critDmg),
|
||||
'}, { "trait_type": "recovery", "value": ',
|
||||
Strings.toString(token.recover),
|
||||
"} ] }"
|
||||
));
|
||||
}
|
||||
|
||||
function addressArrayToString(address[] memory addressArray) internal pure returns (string memory) {
|
||||
string memory result = "[";
|
||||
for(uint256 i = 0; i < addressArray.length; i++) {
|
||||
if(i == addressArray.length-1) {
|
||||
result = string.concat(result,"'0x",toAsciiString(addressArray[i]),"'");
|
||||
} else {
|
||||
|
||||
result = string.concat(result,"'0x",toAsciiString(addressArray[i]),"',");
|
||||
}
|
||||
}
|
||||
result = string.concat(result,"]");
|
||||
return result;
|
||||
}
|
||||
|
||||
function toAsciiString(address x) internal pure returns (string memory) {
|
||||
bytes memory s = new bytes(40);
|
||||
for (uint i = 0; i < 20; i++) {
|
||||
bytes1 b = bytes1(uint8(uint(uint160(x)) / (2**(8*(19 - i)))));
|
||||
bytes1 hi = bytes1(uint8(b) / 16);
|
||||
bytes1 lo = bytes1(uint8(b) - 16 * uint8(hi));
|
||||
s[2*i] = char(hi);
|
||||
s[2*i+1] = char(lo);
|
||||
}
|
||||
return string(s);
|
||||
}
|
||||
|
||||
function char(bytes1 b) internal pure returns (bytes1 c) {
|
||||
if (uint8(b) < 10)
|
||||
return bytes1(uint8(b) + 0x30);
|
||||
else
|
||||
return bytes1(uint8(b) + 0x57);
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
import { DeployFunction } from 'hardhat-deploy/dist/types';
|
||||
|
||||
const deployFunc: DeployFunction = async ({ getNamedAccounts, deployments, getChainId }) => {
|
||||
const { deploy } = deployments;
|
||||
const { deployer } = await getNamedAccounts();
|
||||
await deploy('NFTMetadata', {
|
||||
from: deployer,
|
||||
args: [],
|
||||
log: true,
|
||||
});
|
||||
};
|
||||
|
||||
const tags = ['NFTMetadata'];
|
||||
|
||||
export default deployFunc;
|
||||
export { tags };
|
Loading…
Reference in new issue