// SPDX-License-Identifier: UNLICENSED pragma solidity ^0.8.13; /******* Mint Mechanics .00 per unaboomer (BOOMR) - 10k supply .02 per bomb (BOMB) - infinite supply BOMB holders can randomly mail bombs to other owners 1 BOMB kills 1 BOOMR - BOOMR image switches to explosion after being bombed chaos ensues until 1000 survivors - the game stops ********/ import {ERC721} from "solmate/tokens/ERC721.sol"; import {Owned} from "solmate/auth/Owned.sol"; import {LibString} from "solmate/utils/LibString.sol"; import {UnaboomerCommon} from "./UnaboomerCommon.sol"; contract Unaboomer is ERC721, Owned { using LibString for uint256; mapping(uint256 => bool) public tokenDead; uint256 public constant MAX_SUPPLY = 10000; uint256 public constant SURVIVOR_COUNT = 1000; uint256 public killCount; uint256 public minted; string public aliveURI; string public deadURI; UnaboomerCommon public main; constructor() ERC721("Unaboomer", "BOOMR") Owned(msg.sender) {} // ========================================================================= // Admin // ========================================================================= /// Withdraw funds to contract owner function withdraw() external onlyOwner { uint256 balance = address(this).balance; payable(msg.sender).transfer(balance); } /// Set metadata URI for alive BOOMR function setAliveURI(string calldata _baseURI) external onlyOwner { aliveURI = _baseURI; } /// Set metadata URI for dead BOOMR function setDeadURI(string calldata _baseURI) external onlyOwner { deadURI = _baseURI; } /// Set main contract address for executing functions function setMainContract(address _address) external onlyOwner { main = UnaboomerCommon(_address); } // ========================================================================= // Modifiers // ========================================================================= modifier onlyMain { require(msg.sender == address(main), "invalid minter"); _; } // ========================================================================= // Tokens // ========================================================================= /// Mint tokens from main contract function radicalize(address _to, uint256 _amount) external payable onlyMain { require(minted + _amount <= MAX_SUPPLY, "supply reached"); unchecked { for (uint256 i; i < _amount; i++) { minted++; _mint(_to, minted); } } } /// Toggle token state from living to dead function kill(uint256 tokenId) external onlyMain { require(tokenId < minted, "invalid token id"); if (tokenDead[tokenId] == false) { killCount++; tokenDead[tokenId] = true; } } function totalSupply() public view returns (uint256 supply) { return minted; } function tokenURI(uint256 _tokenId) public view override returns (string memory) { if (tokenDead[_tokenId]) { return string(abi.encodePacked(deadURI, _tokenId.toString(), ".json")); } else { return string(abi.encodePacked(aliveURI, _tokenId.toString(), ".json")); } } function supportsInterface(bytes4 interfaceId) public view virtual override (ERC721) returns (bool) { return super.supportsInterface(interfaceId); } }