文件 1 的 3:Context.sol
pragma solidity ^0.8.0;
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
文件 2 的 3:Ownable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
constructor() {
_transferOwnership(_msgSender());
}
function owner() public view virtual returns (address) {
return _owner;
}
modifier onlyOwner() {
require(owner() == _msgSender(), "Ownable: caller is not the owner");
_;
}
function renounceOwnership() public virtual onlyOwner {
_transferOwnership(address(0));
}
function transferOwnership(address newOwner) public virtual onlyOwner {
require(newOwner != address(0), "Ownable: new owner is the zero address");
_transferOwnership(newOwner);
}
function _transferOwnership(address newOwner) internal virtual {
address oldOwner = _owner;
_owner = newOwner;
emit OwnershipTransferred(oldOwner, newOwner);
}
}
文件 3 的 3:TroverseStarsMinter.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/access/Ownable.sol";
interface IYieldToken {
function burn(address _from, uint256 _amount) external;
}
interface INFTContract {
function Mint(address to, uint256 quantity) external payable;
function totalSupply() external view returns (uint256);
}
contract TroverseStarsMinter is Ownable {
INFTContract public NFTContract;
uint256 public constant TOTAL_NFTS = 750;
uint256 public mintPrice;
mapping(address => uint256) public whitelist;
bool public isClaimActive;
IYieldToken public yieldToken;
event YieldTokenChanged(address _yieldToken);
event PriceChanged(uint256 _price);
event ClaimStateChanged(bool _isActive);
event NFTContractChanged(address _NFTContract);
constructor() { }
modifier callerIsUser() {
require(tx.origin == msg.sender, "The caller is another contract");
_;
}
function setYieldToken(address _yieldToken) external onlyOwner {
require(_yieldToken != address(0), "Bad YieldToken address");
yieldToken = IYieldToken(_yieldToken);
emit YieldTokenChanged(_yieldToken);
}
function setPrice(uint256 _price) external onlyOwner {
mintPrice = _price;
emit PriceChanged(_price);
}
function updateWhitelist(address[] calldata addresses, uint256 limit) external onlyOwner {
for (uint256 i = 0; i < addresses.length; i++) {
whitelist[addresses[i]] = limit;
}
}
function setClaimState(bool _isActive) external onlyOwner {
isClaimActive = _isActive;
emit ClaimStateChanged(_isActive);
}
function Claim(uint256 quantity) external callerIsUser {
require(isClaimActive, "Claiming is not active");
require(whitelist[msg.sender] > 0, "Not eligible for whitelist mint");
require(whitelist[msg.sender] >= quantity, "Can not mint this many");
NFTContract.Mint(msg.sender, quantity);
whitelist[msg.sender] -= quantity;
}
function Mint(uint256 quantity) external callerIsUser {
require(mintPrice > 0, "Minting is not active");
yieldToken.burn(msg.sender, quantity * mintPrice);
NFTContract.Mint(msg.sender, quantity);
}
function Airdrop(address[] calldata accounts, uint256 quantity) external onlyOwner {
for (uint256 i; i < accounts.length; i++) {
NFTContract.Mint(accounts[i], quantity);
}
}
function setNFTContract(address _NFTContract) external onlyOwner {
require(_NFTContract != address(0), "Bad NFTContract address");
NFTContract = INFTContract(_NFTContract);
emit NFTContractChanged(_NFTContract);
}
function totalSupply() public view returns (uint256) {
return NFTContract.totalSupply();
}
}
{
"compilationTarget": {
"contracts/TroverseStarsMinter.sol": "TroverseStarsMinter"
},
"evmVersion": "berlin",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": false,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"_isActive","type":"bool"}],"name":"ClaimStateChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_NFTContract","type":"address"}],"name":"NFTContractChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"PriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_yieldToken","type":"address"}],"name":"YieldTokenChanged","type":"event"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"Airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"Claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"Mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"NFTContract","outputs":[{"internalType":"contract INFTContract","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOTAL_NFTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isClaimActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isActive","type":"bool"}],"name":"setClaimState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_NFTContract","type":"address"}],"name":"setNFTContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_yieldToken","type":"address"}],"name":"setYieldToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256","name":"limit","type":"uint256"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"yieldToken","outputs":[{"internalType":"contract IYieldToken","name":"","type":"address"}],"stateMutability":"view","type":"function"}]