Skip to content

Instantly share code, notes, and snippets.

@CS6
Created August 24, 2023 09:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save CS6/dfe7d1de389bf48627cc30d3286551a1 to your computer and use it in GitHub Desktop.
Save CS6/dfe7d1de389bf48627cc30d3286551a1 to your computer and use it in GitHub Desktop.
Created using remix-ide: Realtime Ethereum Contract Compiler and Runtime. Load this file by pasting this gists URL or ID at https://remix.ethereum.org/#version=soljson-v0.8.18+commit.87f61d96.js&optimize=false&runs=200&gist=
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.9;
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
contract XmasToken is
ERC721,
ERC721Enumerable,
ERC721URIStorage,
ERC721Burnable,
Ownable
{
using Counters for Counters.Counter;
Counters.Counter private _tokenIdCounter;
// Mapping from token ID to creator's address
mapping(uint256 => address) private _tokenCreators;
constructor() ERC721("XmasToken", "XMAS") {}
function safeMint(address to, string memory uri, address tokenCreator) public onlyOwner {
uint256 tokenId = _tokenIdCounter.current();
_tokenIdCounter.increment();
_safeMint(to, tokenId);
_setTokenURI(tokenId, uri);
_tokenCreators[tokenId] = tokenCreator;
}
function getCreatorOfToken(uint256 tokenId) public view returns (address) {
return _tokenCreators[tokenId];
}
// The following functions are overrides required by Solidity.
function _beforeTokenTransfer(
address from,
address to,
uint256 tokenId,
uint256 batchSize
) internal override(ERC721, ERC721Enumerable) {
super._beforeTokenTransfer(from, to, tokenId, batchSize);
}
function _burn(uint256 tokenId)
internal
override(ERC721, ERC721URIStorage)
{
super._burn(tokenId);
}
function tokenURI(uint256 tokenId)
public
view
override(ERC721, ERC721URIStorage)
returns (string memory)
{
return super.tokenURI(tokenId);
}
function supportsInterface(bytes4 interfaceId)
public
view
override(ERC721, ERC721Enumerable, ERC721URIStorage)
returns (bool)
{
return super.supportsInterface(interfaceId);
}
function mintAndAirdrop(address[] memory recipients, string[] memory uris, address[] memory tokenCreator) public onlyOwner {
require(recipients.length == uris.length, "Mismatched arrays length");
for (uint256 i = 0; i < recipients.length; i++) {
safeMint(recipients[i], uris[i], tokenCreator[i]);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment