WarstreetV2
0x201f5ffdd81c1f68314853f61c40d0ed9e351f94
Verification
Verified
v0.8.24+commit.e11b9ed9
Type
Contract
7,917 bytes
ABI entries
67
23 read · 13 write
License
none
Contract information
- Address
- 0x201f5ffdd81c1f68314853f61c40d0ed9e351f94
- Chain
- Robinhood Chain (4663)
- Compiler
- v0.8.24+commit.e11b9ed9
- Optimization
- Enabled
- Creator
- 0xcf07ec4f94…9E0Cd301f9
- Creation tx
- 0xa1f7cbae22…29eab8a633
Token
- Name
- Warstreet
- Symbol
- WAR
- Decimals
- —
- Holders
- 2,590
- Market
- View token page →
Read contract (23)
FREE_PER_WALLET() → uint256
MAX_PER_WALLET() → uint256
MAX_SUPPLY() → uint256
MIN_HOLD() → uint256
ROYALTY_BPS() → uint96
balanceOf(address) → uint256
getApproved(uint256) → address
isApprovedForAll(address, address) → bool
mintPrice() → uint256
mintedBy(address) → uint256
name() → string
nextPrice(address) → uint256
oracle() → address
owner() → address
ownerOf(uint256) → address
rewardPool() → uint256
royaltyInfo(uint256, uint256) → address, uint256
supportsInterface(bytes4) → bool
symbol() → string
tokenURI(uint256) → string
totalBurned() → uint256
totalMinted() → uint256
treasury() → address
Events (8)
ApprovalApprovalForAllCenturyPayoutMintedOwnershipTransferredRoyaltyReceivedTransferUnitsBurned
ABI
[
{
"inputs": [
{
"internalType": "uint256",
"name": "_mintPrice",
"type": "uint256"
},
{
"internalType": "string",
"name": "_base",
"type": "string"
},
{
"internalType": "address",
"name": "_oracle",
"type": "address"
},
{
"internalType": "address",
"name": "_treasury",
"type": "address"
}
],
"stateMutability": "nonpayable",
"type": "constructor"
},
{
"inputs": [],
"name": "BadToken",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "numerator",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "denominator",
"type": "uint256"
}
],
"name": "ERC2981InvalidDefaultRoyalty",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "receiver",
"type": "address"
}
],
"name": "ERC2981InvalidDefaultRoyaltyReceiver",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "numerator",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "denominator",
"type": "uint256"
}
],
"name": "ERC2981InvalidTokenRoyalty",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "address",
"name": "receiver",
"type": "address"
}
],
"name": "ERC2981InvalidTokenRoyaltyReceiver",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "ERC721IncorrectOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ERC721InsufficientApproval",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "approver",
"type": "address"
}
],
"name": "ERC721InvalidApprover",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "ERC721InvalidOperator",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "ERC721InvalidOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "receiver",
"type": "address"
}
],
"name": "ERC721InvalidReceiver",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "sender",
"type": "address"
}
],
"name": "ERC721InvalidSender",
"type": "error"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ERC721NonexistentToken",
"type": "error"
},
{
"inputs": [],
"name": "NotOracle",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "OwnableInvalidOwner",
"type": "error"
},
{
"inputs": [
{
"internalType": "address",
"name": "account",
"type": "address"
}
],
"name": "OwnableUnauthorizedAccount",
"type": "error"
},
{
"inputs": [],
"name": "ReentrancyGuardReentrantCall",
"type": "error"
},
{
"inputs": [],
"name": "SoldOut",
"type": "error"
},
{
"inputs": [],
"name": "TokenTaken",
"type": "error"
},
{
"inputs": [],
"name": "Underpaid",
"type": "error"
},
{
"inputs": [],
"name": "WalletLimit",
"type": "error"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "approved",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Approval",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"indexed": false,
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "ApprovalForAll",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "poolPaid",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "creatorCut",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "perHolder",
"type": "uint256"
}
],
"name": "CenturyPayout",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"indexed": false,
"internalType": "uint256",
"name": "pricePaid",
"type": "uint256"
}
],
"name": "Minted",
"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": "amount",
"type": "uint256"
}
],
"name": "RoyaltyReceived",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": true,
"internalType": "address",
"name": "from",
"type": "address"
},
{
"indexed": true,
"internalType": "address",
"name": "to",
"type": "address"
},
{
"indexed": true,
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "Transfer",
"type": "event"
},
{
"anonymous": false,
"inputs": [
{
"indexed": false,
"internalType": "uint256",
"name": "count",
"type": "uint256"
}
],
"name": "UnitsBurned",
"type": "event"
},
{
"inputs": [],
"name": "FREE_PER_WALLET",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MAX_PER_WALLET",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MAX_SUPPLY",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "MIN_HOLD",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "ROYALTY_BPS",
"outputs": [
{
"internalType": "uint96",
"name": "",
"type": "uint96"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "approve",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
}
],
"name": "balanceOf",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[]",
"name": "tokenIds",
"type": "uint256[]"
}
],
"name": "burnUnits",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "getApproved",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "owner",
"type": "address"
},
{
"internalType": "address",
"name": "operator",
"type": "address"
}
],
"name": "isApprovedForAll",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "mint",
"outputs": [],
"stateMutability": "payable",
"type": "function"
},
{
"inputs": [],
"name": "mintPrice",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"name": "mintedBy",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "name",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "who",
"type": "address"
}
],
"name": "nextPrice",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "oracle",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "owner",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "ownerOf",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256[5]",
"name": "topFive",
"type": "uint256[5]"
}
],
"name": "payoutCentury",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "renounceOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "rewardPool",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "uint256",
"name": "salePrice",
"type": "uint256"
}
],
"name": "royaltyInfo",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
},
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
},
{
"internalType": "bytes",
"name": "data",
"type": "bytes"
}
],
"name": "safeTransferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "operator",
"type": "address"
},
{
"internalType": "bool",
"name": "approved",
"type": "bool"
}
],
"name": "setApprovalForAll",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "string",
"name": "b",
"type": "string"
}
],
"name": "setBaseURI",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "p",
"type": "uint256"
}
],
"name": "setMintPrice",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "o",
"type": "address"
}
],
"name": "setOracle",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "bytes4",
"name": "interfaceId",
"type": "bytes4"
}
],
"name": "supportsInterface",
"outputs": [
{
"internalType": "bool",
"name": "",
"type": "bool"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "symbol",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "tokenURI",
"outputs": [
{
"internalType": "string",
"name": "",
"type": "string"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalBurned",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [],
"name": "totalMinted",
"outputs": [
{
"internalType": "uint256",
"name": "",
"type": "uint256"
}
],
"stateMutability": "view",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "from",
"type": "address"
},
{
"internalType": "address",
"name": "to",
"type": "address"
},
{
"internalType": "uint256",
"name": "tokenId",
"type": "uint256"
}
],
"name": "transferFrom",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [
{
"internalType": "address",
"name": "newOwner",
"type": "address"
}
],
"name": "transferOwnership",
"outputs": [],
"stateMutability": "nonpayable",
"type": "function"
},
{
"inputs": [],
"name": "treasury",
"outputs": [
{
"internalType": "address",
"name": "",
"type": "address"
}
],
"stateMutability": "view",
"type": "function"
},
{
"stateMutability": "payable",
"type": "receive"
}
]Source code
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Royalty.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/ReentrancyGuard.sol";
/**
* @title WarstreetV2
* @notice Same Warstreet economy, new mint rules:
* - Max 15 mints per wallet
* - First 2 per wallet are FREE (just gas)
* - Mints 3..15 cost `mintPrice` (default 0.0001 ETH)
* Proceeds -> immutable treasury; 10% royalty -> reward pool; oracle settles payouts.
*/
contract WarstreetV2 is ERC721Royalty, Ownable, ReentrancyGuard {
uint256 public constant MAX_SUPPLY = 10_000;
uint256 public constant MIN_HOLD = 6; // hold >= 6 to collect rewards
uint96 public constant ROYALTY_BPS = 1000; // 10%
uint256 public constant MAX_PER_WALLET = 15; // hard cap per wallet
uint256 public constant FREE_PER_WALLET = 2; // first 2 per wallet are free
uint256 public mintPrice; // price for paid mints (after the free ones)
string private baseTokenURI;
address public oracle;
address public immutable treasury;
uint256 public rewardPool;
uint256 public totalMinted;
uint256 public totalBurned;
mapping(address => uint256) public mintedBy; // how many this wallet has minted
event Minted(address indexed to, uint256 indexed tokenId, uint256 pricePaid);
event RoyaltyReceived(uint256 amount);
event CenturyPayout(uint256 poolPaid, uint256 creatorCut, uint256 perHolder);
event UnitsBurned(uint256 count);
error SoldOut();
error TokenTaken();
error BadToken();
error Underpaid();
error NotOracle();
error WalletLimit();
modifier onlyOracle() { if (msg.sender != oracle) revert NotOracle(); _; }
constructor(uint256 _mintPrice, string memory _base, address _oracle, address _treasury)
ERC721("Warstreet", "WAR")
Ownable(msg.sender)
{
require(_treasury != address(0), "treasury=0");
mintPrice = _mintPrice;
baseTokenURI = _base;
oracle = _oracle;
treasury = _treasury;
_setDefaultRoyalty(address(this), ROYALTY_BPS);
}
/// @notice Price this wallet pays for its NEXT mint (0 while within the free allowance).
function nextPrice(address who) external view returns (uint256) {
return mintedBy[who] < FREE_PER_WALLET ? 0 : mintPrice;
}
function mint(uint256 tokenId) external payable nonReentrant {
if (totalMinted >= MAX_SUPPLY) revert SoldOut();
if (tokenId >= MAX_SUPPLY) revert BadToken();
if (_ownerOf(tokenId) != address(0)) revert TokenTaken();
uint256 already = mintedBy[msg.sender];
if (already >= MAX_PER_WALLET) revert WalletLimit();
uint256 price = already < FREE_PER_WALLET ? 0 : mintPrice;
if (msg.value < price) revert Underpaid();
mintedBy[msg.sender] = already + 1;
totalMinted += 1;
_safeMint(msg.sender, tokenId);
if (price > 0) _pay(treasury, price); // proceeds -> cold treasury
uint256 excess = msg.value - price;
if (excess > 0) _pay(msg.sender, excess); // refund overpayment
emit Minted(msg.sender, tokenId, price);
}
receive() external payable { rewardPool += msg.value; emit RoyaltyReceived(msg.value); }
function payoutCentury(uint256[5] calldata topFive) external onlyOracle nonReentrant {
uint256 pool = rewardPool;
if (pool == 0) return;
rewardPool = 0;
uint256 creatorCut = pool / 10;
uint256 perHolder = (pool * 90) / 100 / 5;
uint256 distributed = 0;
_pay(treasury, creatorCut);
distributed += creatorCut;
for (uint256 i = 0; i < 5; i++) {
address h = _ownerOf(topFive[i]);
if (h != address(0) && balanceOf(h) >= MIN_HOLD) { _pay(h, perHolder); distributed += perHolder; }
}
if (distributed < pool) rewardPool += (pool - distributed);
emit CenturyPayout(pool, creatorCut, perHolder);
}
function burnUnits(uint256[] calldata tokenIds) external onlyOracle {
uint256 n;
for (uint256 i = 0; i < tokenIds.length; i++) {
if (_ownerOf(tokenIds[i]) != address(0)) { _burn(tokenIds[i]); n++; }
}
totalBurned += n;
emit UnitsBurned(n);
}
function setBaseURI(string calldata b) external onlyOwner { baseTokenURI = b; }
function setMintPrice(uint256 p) external onlyOwner { mintPrice = p; }
function setOracle(address o) external onlyOwner { oracle = o; }
function _baseURI() internal view override returns (string memory) { return baseTokenURI; }
function _pay(address to, uint256 amt) private {
if (amt == 0) return;
(bool ok, ) = payable(to).call{value: amt}("");
require(ok, "pay failed");
}
}
Chain explorer3513msChain node89ms