pragma solidity ^0.8.0; // Importing OpenZeppelin's ERC721 and SafeMath contracts import "@openzeppelin/contracts/token/ERC721/ERC721.sol"; import "@openzeppelin/contracts/utils/math/SafeMath.sol"; contract ReptilianCorporation is ERC721 { using SafeMath for uint256; // Variables for tracking NFT minting and staking rewards uint256 public constant MAX_SUPPLY = 4444; uint256 public constant MAX_REMIX_BURNS = 111; uint256 public constant REMIX_BURN_RATIO = 10; uint256 public constant STAKING_REWARD = 1000 * 10 ** 18; // Initial reward of 1000 ERC20 tokens uint256 public stakingEndTime; uint256 public inflationRate; mapping(address => uint256) public stakedBalance; mapping(address => uint256) public lastStakedTime; // Addresses for whitelist and ERC20 token address public whitelistContract; address public erc20Token; address public remixBurnContract = 0xc8ffc4e673fe7aa80e46c5d1bde0fbe746b71341; // Event for staking rewards event StakingRewards(address indexed staker, uint256 rewardAmount); constructor() ERC721("reptiliancorporation", "$CORP") { // Set staking end time to 1 year after contract deployment stakingEndTime = block.timestamp + 365 days; // Set inflation rate to 5% per year inflationRate = 105; // Assign deployer as ERC20 token holder erc20Token = msg.sender; } // Function for ERC20 token to mint NFTs function mintFromERC20(uint256 amount) external { require(amount > 0, "Amount must be greater than 0"); require(amount <= balanceOf(erc20Token), "Not enough ERC20 tokens to mint NFTs"); require(totalSupply() + amount <= MAX_SUPPLY, "Max NFT supply reached"); // Transfer ERC20 tokens from holder to contract ERC20(erc20Token).transferFrom(msg.sender, address(this), amount); // Mint NFTs to sender _mint(msg.sender, amount); } // Function to stake NFTs and earn ERC20 token rewards function stake(uint256 tokenId) external { require(ownerOf(tokenId) == msg.sender, "Only the owner can stake their NFT"); require(block.timestamp < stakingEndTime, "Staking period has ended"); require(lastStakedTime[msg.sender] < stakingEndTime, "Already staked for the maximum time"); // Calculate staking reward based on inflation rate and time since last stake uint256 rewardAmount = STAKING_REWARD.mul(inflationRate ** (block.timestamp.sub(lastStakedTime[msg.sender]))) / 100 ** 18; // Add staked NFT to balance stakedBalance[msg.sender] = stakedBalance[msg.sender].add(1); // Update last staked time lastStakedTime[msg.sender] = block.timestamp; // Transfer staked NFT to contract transferFrom(msg.sender, address(this), tokenId); // Transfer staking reward ERC20 tokens from holder to staker ERC20(erc20Token).transfer(msg.sender, rewardAmount); emit StakingRewards(msg.sender, rewardAmount); // Function for whitelist contract to mint 1 NFT function whitelistMint(address recipient) external { require(msg.sender == whitelistContract, "Caller is not the whitelist contract"); require(totalSupply() + 1 <= MAX_SUPPLY, "Max NFT supply reached"); _mint(recipient, 1); } // Function to burn $REMIX tokens and mint $CORP NFTs function burnToMint(uint256 amount) external { require(msg.sender == remixBurnContract, "Caller is not the authorized contract"); require(amount > 0, "Amount must be greater than 0"); require(totalSupply() + amount <= MAX_SUPPLY, "Max NFT supply reached"); require(amount <= MAX_REMIX_BURNS, "Max $REMIX burns reached"); // Transfer $REMIX tokens from authorized contract to holder ERC20(remixBurnContract).transferFrom(msg.sender, address(this), amount); // Mint $CORP NFTs to holder based on burn ratio _mint(msg.sender, amount * REMIX_BURN_RATIO); } // Function to mint ERC20 tokens for giveaways function mintERC20(uint256 amount) external { require(msg.sender == erc20Token, "Caller is not the ERC20 holder"); // Mint ERC20 tokens to holder ERC20(erc20Token).mint(msg.sender, amount); } // Function to transfer ERC20 tokens to another address function transferERC20(address recipient, uint256 amount) external { require(msg.sender == erc20Token, "Caller is not the ERC20 holder"); // Transfer ERC20 tokens to recipient ERC20(erc20Token).transfer(recipient, amount); } // Override parent function to make $SHARES non-transferable function transfer(address, uint256) public override returns (bool) { require(msg.sender == erc20Token, "Cannot transfer $SHARES tokens"); return false; } }
0.4.18