// contracts/Baseballs.sol // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import "@openzeppelin/contracts/utils/Context.sol"; import "@openzeppelin/contracts/utils/structs/BitMaps.sol"; import "@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol"; import "./external/MLBC.sol"; contract Baseballs is Context, ERC20Burnable { using BitMaps for BitMaps.BitMap; MLBC public _mlbc; BitMaps.BitMap private _baseballsBitMap; constructor(address mlbcAddress) ERC20("Baseballs", "Baseball") { _mlbc = MLBC(mlbcAddress); } function mint(uint32[] calldata tokenIds) public { require(tokenIds.length < 1001, "Too many"); for (uint i=0; i < tokenIds.length; i++) { uint32 tokenId = tokenIds[i]; //Don't mint past the supply at launch. require(tokenId < 249173, "Token too high"); require(tokenId > 0, "Token too low"); //Validate the tokens exist require(_mlbc.exists(tokenId) == true, "Invalid MLBC token"); //Validate user owns the token require(_mlbc.ownerOf(tokenId) == _msgSender(), "Not token owner"); //Validate these haven't been claimed require(isMinted(tokenId) == false, "Already minted"); } for (uint i=0; i < tokenIds.length; i++) { //Mark as claimed _markMinted(tokenIds[i]); } _mint(_msgSender(), tokenIds.length * (10**18) ); } function isMinted(uint32 tokenId) public view returns (bool) { return _baseballsBitMap.get(tokenId); } function _markMinted(uint32 tokenId) private { _baseballsBitMap.set(tokenId); } }
0.4.18