С прошлого года термин NFT распространяется по всему миру, а связанные с ним технологические приложения также сделали его горячей темой среди предприятий. В отличие от традиционной NFT, динамическая NFT, как направление, которому в последнее время уделяется все больше внимания, может содержать интерактивные и изменяемые элементы, принося больше инноваций и полезных приложений.
Динамический NFT может обновлять содержимое метаданных, тем самым изменяя внешний вид и атрибуты NFT.
В dNFT, выпущенных MLB в прошлом году, данные игроков будут меняться вместе с игровыми записями.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract DynamicNFT is ERC721URIStorage {
using Counters for Counters.Counter;
Counters.Counter private _tokenIds;
constructor() ERC721("DynamicNFT", "DNFT") {}
struct NftMetadata {
string name;
string description;
string image;
uint256 price;
uint256[] dynamicAttributes;
}
mapping(uint256 => NftMetadata) private _nftMetadata;
function createNft(
address recipient,
string memory tokenURI,
string memory name,
string memory description,
string memory image,
uint256 price,
uint256[] memory dynamicAttributes
) public {
_tokenIds.increment();
uint256 newItemId = _tokenIds.current();
_mint(recipient, newItemId);
_setTokenURI(newItemId, tokenURI);
_nftMetadata[newItemId] = NftMetadata(
name,
description,
image,
price,
dynamicAttributes
);
emit NftCreated(
newItemId,
recipient,
tokenURI,
name,
description,
image,
price,
dynamicAttributes
);
}
function getNftMetadata(uint256 tokenId)
public
view
returns (NftMetadata memory)
{
require(
_exists(tokenId),
"DynamicNFT: metadata query for nonexistent token"
);
return _nftMetadata[tokenId];
}
function updateDynamicAttribute(
uint256 tokenId,
uint256 attributeIndex,
uint256 newValue
) public {
require(
_exists(tokenId),
"DynamicNFT: attribute update for nonexistent token"
);
NftMetadata storage metadata = _nftMetadata[tokenId];
require(
attributeIndex < metadata.dynamicAttributes.length,
"DynamicNFT: invalid attribute index"
);
uint256 oldValue = metadata.dynamicAttributes[attributeIndex];
metadata.dynamicAttributes[attributeIndex] = newValue;
emit NftAttributeUpdated(tokenId, attributeIndex, oldValue, newValue);
}
event NftCreated(
uint256 newItemId,
address recipient,
string tokenURI,
string name,
string description,
string image,
uint256 price,
uint256[] dynamicAttributes
);
event NftAttributeUpdated(
uint256 tokenId,
uint256 attributeIndex,
uint256 oldValue,
uint256 newValue
);
}
//This code is for educational purposes only, please do not invest in any assets.