编译器
0.8.18+commit.87f61d96
文件 1 的 12:ERC721.sol
pragma solidity >=0.8.0;
abstract contract ERC721 {
event Transfer(address indexed from, address indexed to, uint256 indexed id);
event Approval(address indexed owner, address indexed spender, uint256 indexed id);
event ApprovalForAll(address indexed owner, address indexed operator, bool approved);
string public name;
string public symbol;
function tokenURI(uint256 id) public view virtual returns (string memory);
mapping(uint256 => address) internal _ownerOf;
mapping(address => uint256) internal _balanceOf;
function ownerOf(uint256 id) public view virtual returns (address owner) {
require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
}
function balanceOf(address owner) public view virtual returns (uint256) {
require(owner != address(0), "ZERO_ADDRESS");
return _balanceOf[owner];
}
mapping(uint256 => address) public getApproved;
mapping(address => mapping(address => bool)) public isApprovedForAll;
constructor(string memory _name, string memory _symbol) {
name = _name;
symbol = _symbol;
}
function approve(address spender, uint256 id) public virtual {
address owner = _ownerOf[id];
require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");
getApproved[id] = spender;
emit Approval(owner, spender, id);
}
function setApprovalForAll(address operator, bool approved) public virtual {
isApprovedForAll[msg.sender][operator] = approved;
emit ApprovalForAll(msg.sender, operator, approved);
}
function transferFrom(
address from,
address to,
uint256 id
) public virtual {
require(from == _ownerOf[id], "WRONG_FROM");
require(to != address(0), "INVALID_RECIPIENT");
require(
msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
"NOT_AUTHORIZED"
);
unchecked {
_balanceOf[from]--;
_balanceOf[to]++;
}
_ownerOf[id] = to;
delete getApproved[id];
emit Transfer(from, to, id);
}
function safeTransferFrom(
address from,
address to,
uint256 id
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function safeTransferFrom(
address from,
address to,
uint256 id,
bytes calldata data
) public virtual {
transferFrom(from, to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
return
interfaceId == 0x01ffc9a7 ||
interfaceId == 0x80ac58cd ||
interfaceId == 0x5b5e139f;
}
function _mint(address to, uint256 id) internal virtual {
require(to != address(0), "INVALID_RECIPIENT");
require(_ownerOf[id] == address(0), "ALREADY_MINTED");
unchecked {
_balanceOf[to]++;
}
_ownerOf[id] = to;
emit Transfer(address(0), to, id);
}
function _burn(uint256 id) internal virtual {
address owner = _ownerOf[id];
require(owner != address(0), "NOT_MINTED");
unchecked {
_balanceOf[owner]--;
}
delete _ownerOf[id];
delete getApproved[id];
emit Transfer(owner, address(0), id);
}
function _safeMint(address to, uint256 id) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
function _safeMint(
address to,
uint256 id,
bytes memory data
) internal virtual {
_mint(to, id);
require(
to.code.length == 0 ||
ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
ERC721TokenReceiver.onERC721Received.selector,
"UNSAFE_RECIPIENT"
);
}
}
abstract contract ERC721TokenReceiver {
function onERC721Received(
address,
address,
uint256,
bytes calldata
) external virtual returns (bytes4) {
return ERC721TokenReceiver.onERC721Received.selector;
}
}
文件 2 的 12:ERC721Guardable.sol
pragma solidity ^0.8.13;
import "solmate/tokens/ERC721.sol";
import "../Guardable.sol";
contract ERC721Guardable is ERC721, Guardable {
string internal baseUri;
constructor(string memory name_, string memory symbol_) ERC721(name_, symbol_) {}
function supportsInterface(bytes4 interfaceId) public view virtual override(Guardable, ERC721) returns (bool) {
return Guardable.supportsInterface(interfaceId) || ERC721.supportsInterface(interfaceId);
}
function approve(address to, uint256 tokenId) public override {
if (locks[msg.sender] != address(0)) {
revert TokenIsLocked();
}
super.approve(to, tokenId);
}
function setApprovalForAll(address operator, bool approved) public override {
if (locks[msg.sender] != address(0) && approved) {
revert TokenIsLocked();
}
super.setApprovalForAll(operator, approved);
}
function tokenURI(uint256 id) public view virtual override returns (string memory) {
return string(abi.encodePacked(baseUri, _toString(id)));
}
function _toString(uint256 value) internal pure virtual returns (string memory str) {
assembly {
let m := add(mload(0x40), 0xa0)
mstore(0x40, m)
str := sub(m, 0x20)
mstore(str, 0)
let end := str
for { let temp := value } 1 {} {
str := sub(str, 1)
mstore8(str, add(48, mod(temp, 10)))
temp := div(temp, 10)
if iszero(temp) { break }
}
let length := sub(end, str)
str := sub(str, 0x20)
mstore(str, length)
}
}
}
文件 3 的 12:Guardable.sol
pragma solidity ^0.8.13;
import "./IGuardable.sol";
abstract contract Guardable is IGuardable {
mapping(address => address) internal locks;
function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
return interfaceId == type(IGuardable).interfaceId;
}
function setGuardian(address guardian) public {
if (msg.sender == guardian || guardian == address(0)) {
revert InvalidGuardian();
}
locks[msg.sender] = guardian;
emit GuardianAdded(msg.sender, guardian);
}
function guardianOf(address tokenOwner) public view returns (address) {
return locks[tokenOwner];
}
function removeGuardianOf(address tokenOwner) external {
if (msg.sender != guardianOf(tokenOwner)) {
revert CallerGuardianMismatch(msg.sender, guardianOf(tokenOwner));
}
delete locks[tokenOwner];
emit GuardianRemoved(tokenOwner);
}
function _lockToSelf() internal virtual {
locks[msg.sender] = msg.sender;
emit GuardianAdded(msg.sender, msg.sender);
}
}
文件 4 的 12:IDelegateCash.sol
pragma solidity 0.8.18;
interface IDelegateCash {
function checkDelegateForToken(
address delegate,
address vault,
address contract_,
uint256 tokenId
) external view returns (bool);
}
文件 5 的 12:IERC165.sol
pragma solidity ^0.8.0;
interface IERC165 {
function supportsInterface(bytes4 interfaceId) external view returns (bool);
}
文件 6 的 12:IGuardable.sol
pragma solidity ^0.8.13;
import "openzeppelin/contracts/utils/introspection/IERC165.sol";
interface IGuardable is IERC165 {
error TokenIsLocked();
error CallerGuardianMismatch(address caller, address guardian);
error InvalidGuardian();
event GuardianAdded(address indexed addressGuarded, address indexed guardian);
event GuardianRemoved(address indexed addressGuarded);
function setGuardian(address guardian) external;
function removeGuardianOf(address tokenOwner) external;
function guardianOf(address tokenOwner) external view returns (address);
}
文件 7 的 12:INuclearNerds.sol
pragma solidity 0.8.18;
interface INuclearNerds {
function isOwnerOf(address account, uint256[] calldata _tokenIds) external view returns (bool);
function ownerOf(uint256 tokenid) external view returns (address);
}
文件 8 的 12:IWarm.sol
pragma solidity 0.8.18;
interface IWarm {
function ownerOf(
address contractAddress,
uint256 tokenId
) external view returns (address);
}
文件 9 的 12:MadMaraudersOfTheAccidentalApocalypse.sol
import "Guardable/ERC721Guardable.sol";
import "solmate/auth/Owned.sol";
import "./lib/MarauderErrors.sol";
import "./lib/MarauderStructs.sol";
import "./interfaces/INuclearNerds.sol";
import "./interfaces/IWarm.sol";
import "./interfaces/IDelegateCash.sol";
pragma solidity ^0.8.18;
contract MadMaraudersOfTheAccidentalApocalypse is ERC721Guardable, Owned {
address public immutable BOX_O_BAD_GUYS_CONTRACT_ADDRESS;
address public immutable NERDS_CONTRACT_ADDRESS;
bool claimOpen;
IWarm public immutable warm;
IDelegateCash public immutable delegateCash;
INuclearNerds private immutable nerds;
mapping(uint256 => bool) public nerdHasClaimed;
mapping(uint256 => bool) public berserkersEligibleForClaim;
ClaimableTokenDetails public raiderTokenDetails;
MintableTokenDetails public enforcerTokenDetails;
MintableTokenDetails public warlordTokenDetails;
constructor(
address _mintPassContractAddress,
address _nerdsContractAddress,
address _warmWalletContractAddress,
address _delegateCashContract,
uint256[43] memory berserkerTokenIds,
string memory _uri
) ERC721Guardable("Marauders Of The Accidental Apocalypse", "MARAUDERS") Owned(msg.sender) {
BOX_O_BAD_GUYS_CONTRACT_ADDRESS = _mintPassContractAddress;
NERDS_CONTRACT_ADDRESS = _nerdsContractAddress;
warm = IWarm(_warmWalletContractAddress);
delegateCash = IDelegateCash(_delegateCashContract);
nerds = INuclearNerds(NERDS_CONTRACT_ADDRESS);
enforcerTokenDetails.startTokenId = enforcerTokenDetails.currentTokenId = 9043;
warlordTokenDetails.startTokenId = warlordTokenDetails.currentTokenId = 14050;
raiderTokenDetails.currentBonusTokenId = 9000;
raiderTokenDetails.maxBonusTokenId = 9042;
for (uint256 i = 0; i < berserkerTokenIds.length;) {
berserkersEligibleForClaim[berserkerTokenIds[i]] = true;
unchecked {++i;}
}
baseUri = _uri;
}
function claimRaiders(uint256[] calldata _tokenIds) external {
if (!claimOpen) revert ClaimNotStarted();
for (uint256 i = 0; i < _tokenIds.length;) {
uint256 tokenId = _tokenIds[i];
if (!ownerOrDelegateOf(tokenId)) revert MustOwnMatchingNerd();
if (nerdHasClaimed[tokenId]) revert AlreadyClaimed();
nerdHasClaimed[tokenId] = true;
_mint(msg.sender, tokenId);
if (berserkersEligibleForClaim[tokenId]) {
if (raiderTokenDetails.currentBonusTokenId > raiderTokenDetails.maxBonusTokenId) revert AllBerserkersMinted();
_mint(msg.sender, raiderTokenDetails.currentBonusTokenId);
unchecked {
++raiderTokenDetails.currentBonusTokenId;
++raiderTokenDetails.totalSupply;
}
}
unchecked {
++i;
++raiderTokenDetails.totalSupply;
}
}
}
function tokenURI(uint256 id) public view virtual override returns (string memory) {
return string(abi.encodePacked(baseUri, _toString(id)));
}
function totalRaiderSupply() public view returns (uint256) {
return raiderTokenDetails.totalSupply;
}
function totalEnforcerSupply() public view returns (uint256) {
return enforcerTokenDetails.currentTokenId - enforcerTokenDetails.startTokenId;
}
function totalWarlordSupply() public view returns (uint256) {
return warlordTokenDetails.currentTokenId - warlordTokenDetails.startTokenId;
}
function totalSupply() public view returns (uint256) {
return totalRaiderSupply() + totalEnforcerSupply() + totalWarlordSupply();
}
function burn(uint256[] calldata tokenIds) external {
for (uint256 i = 0; i < tokenIds.length;) {
address from = ownerOf(tokenIds[i]);
if (msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[tokenIds[i]]) {
revert InvalidCaller();
}
_burn(tokenIds[i]);
unchecked { ++i; }
}
}
function ownerOrDelegateOf(uint256 tokenId) internal view returns (bool) {
return
msg.sender == nerds.ownerOf(tokenId) ||
delegateCash.checkDelegateForToken(msg.sender, nerds.ownerOf(tokenId), NERDS_CONTRACT_ADDRESS, tokenId) ||
msg.sender == warm.ownerOf(NERDS_CONTRACT_ADDRESS, tokenId);
}
function mintFromBox(address recipient, uint256 amount) external onlyBox {
_mint(enforcerTokenDetails, amount * 2, recipient);
_mint(warlordTokenDetails, amount, recipient);
}
function mintEnforcer(address recipient, uint256 amount) external onlyBox {
_mint(enforcerTokenDetails, amount, recipient);
}
function mintWarlord(address recipient, uint256 amount) external onlyBox {
_mint(warlordTokenDetails, amount, recipient);
}
modifier onlyBox {
if (msg.sender != BOX_O_BAD_GUYS_CONTRACT_ADDRESS) revert InvalidCaller();
_;
}
function setBaseURI(string memory _uri) external onlyOwner {
baseUri = _uri;
}
function setClaimStatus(bool status) external onlyOwner {
claimOpen = status;
}
function _mint(MintableTokenDetails storage tokenDetails, uint256 amount, address recipient) internal {
for (uint256 i = 0; i < amount;) {
_mint(recipient, tokenDetails.currentTokenId);
unchecked {
++tokenDetails.currentTokenId;
++i;
}
}
}
}
文件 10 的 12:MarauderErrors.sol
pragma solidity ^0.8.18;
error InvalidProof();
error WrongValueSent();
error ExceedMaxSupply();
error InvalidCaller();
error TokenTypeSoldOut();
error MustOwnMatchingNerd();
error AllBerserkersMinted();
error AlreadyClaimed();
error ConsumerAlreadySet();
error SaleNotActive();
error ArrayLengthMismatch();
error ExceedMaxPerWallet();
error SmashingNotActive();
error FailedToMint();
error ClaimNotStarted();
error MintZeroAmount();
文件 11 的 12:MarauderStructs.sol
pragma solidity 0.8.18;
struct MintableTokenDetails {
uint16 startTokenId;
uint16 currentTokenId;
}
struct ClaimableTokenDetails {
uint16 totalSupply;
uint16 currentBonusTokenId;
uint16 maxBonusTokenId;
}
struct PhaseDetails {
bytes32 root;
uint64 startTime;
}
struct ItemDetails {
bytes4 mintFunctionSelector;
uint16 numUnitsSold;
uint16 maxUnitsAllowed;
uint16 maxNerdPhaseUnitsAllowedPerWallet;
address mintContractAddress;
uint64 price;
uint64 discountedPrice;
}
struct MintTracker {
uint32 numBoxesMinted;
uint32 numEnforcersMinted;
uint32 numWarlordsMinted;
uint32 numSerumsMinted;
}
文件 12 的 12:Owned.sol
pragma solidity >=0.8.0;
abstract contract Owned {
event OwnershipTransferred(address indexed user, address indexed newOwner);
address public owner;
modifier onlyOwner() virtual {
require(msg.sender == owner, "UNAUTHORIZED");
_;
}
constructor(address _owner) {
owner = _owner;
emit OwnershipTransferred(address(0), _owner);
}
function transferOwnership(address newOwner) public virtual onlyOwner {
owner = newOwner;
emit OwnershipTransferred(msg.sender, newOwner);
}
}
{
"compilationTarget": {
"src/MadMaraudersOfTheAccidentalApocalypse.sol": "MadMaraudersOfTheAccidentalApocalypse"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": [
":@openzeppelin/=lib/Guardable/lib/openzeppelin-contracts/",
":ERC721A/=lib/ERC721A/contracts/",
":Guardable/=lib/Guardable/src/tokens/",
":ds-test/=lib/forge-std/lib/ds-test/src/",
":forge-std/=lib/forge-std/src/",
":openzeppelin-contracts/=lib/openzeppelin-contracts/",
":openzeppelin/=lib/openzeppelin-contracts/",
":solmate/=lib/solmate/src/"
]
}
[{"inputs":[{"internalType":"address","name":"_mintPassContractAddress","type":"address"},{"internalType":"address","name":"_nerdsContractAddress","type":"address"},{"internalType":"address","name":"_warmWalletContractAddress","type":"address"},{"internalType":"address","name":"_delegateCashContract","type":"address"},{"internalType":"uint256[43]","name":"berserkerTokenIds","type":"uint256[43]"},{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AllBerserkersMinted","type":"error"},{"inputs":[],"name":"AlreadyClaimed","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"address","name":"guardian","type":"address"}],"name":"CallerGuardianMismatch","type":"error"},{"inputs":[],"name":"ClaimNotStarted","type":"error"},{"inputs":[],"name":"InvalidCaller","type":"error"},{"inputs":[],"name":"InvalidGuardian","type":"error"},{"inputs":[],"name":"MustOwnMatchingNerd","type":"error"},{"inputs":[],"name":"TokenIsLocked","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":true,"internalType":"address","name":"addressGuarded","type":"address"},{"indexed":true,"internalType":"address","name":"guardian","type":"address"}],"name":"GuardianAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"addressGuarded","type":"address"}],"name":"GuardianRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BOX_O_BAD_GUYS_CONTRACT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NERDS_CONTRACT_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"","type":"uint256"}],"name":"berserkersEligibleForClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenIds","type":"uint256[]"}],"name":"claimRaiders","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"delegateCash","outputs":[{"internalType":"contract IDelegateCash","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"enforcerTokenDetails","outputs":[{"internalType":"uint16","name":"startTokenId","type":"uint16"},{"internalType":"uint16","name":"currentTokenId","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"guardianOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintEnforcer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintFromBox","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mintWarlord","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nerdHasClaimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raiderTokenDetails","outputs":[{"internalType":"uint16","name":"totalSupply","type":"uint16"},{"internalType":"uint16","name":"currentBonusTokenId","type":"uint16"},{"internalType":"uint16","name":"maxBonusTokenId","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"}],"name":"removeGuardianOf","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","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":"_uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setClaimStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"guardian","type":"address"}],"name":"setGuardian","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":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalEnforcerSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRaiderSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalWarlordSupply","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":"id","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":"warlordTokenDetails","outputs":[{"internalType":"uint16","name":"startTokenId","type":"uint16"},{"internalType":"uint16","name":"currentTokenId","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"warm","outputs":[{"internalType":"contract IWarm","name":"","type":"address"}],"stateMutability":"view","type":"function"}]