编译器
0.8.11+commit.d7f03943
文件 1 的 12: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 的 12:IColonist.sol
pragma solidity ^0.8.0;
interface IColonist {
struct Colonist {
bool isColonist;
uint8 background;
uint8 body;
uint8 shirt;
uint8 jacket;
uint8 jaw;
uint8 eyes;
uint8 hair;
uint8 held;
uint8 gen;
}
struct HColonist {
uint8 Legendary;
}
function transferFrom(
address from,
address to,
uint256 tokenId
) external;
function safeTransferFrom(
address from,
address to,
uint256 tokenId,
bytes memory _data
) external;
function safeTransferFrom(
address from,
address to,
uint256 tokenId
) external;
function isOwner(uint256 tokenId)
external
view
returns (address);
function minted() external returns (uint16);
function totalCir() external returns (uint256);
function _mintColonist(address recipient, uint256 seed) external;
function _mintToHonors(address recipient, uint256 seed) external;
function _mintHonors(address recipient, uint8 id) external;
function burn(uint256 tokenId) external;
function getMaxTokens() external view returns (uint256);
function getPaidTokens() external view returns (uint256);
function getTokenTraitsColonist(uint256 tokenId)
external
view
returns (Colonist memory);
function getTokenTraitsHonors(uint256 tokenId)
external
view
returns (HColonist memory);
function tokenNameByIndex(uint256 index)
external
view
returns (string memory);
function hasBeenNamed(uint256 tokenId) external view returns (bool);
function nameColonist(uint256 tokenId, string memory newName) external;
}
文件 3 的 12:IEON.sol
pragma solidity ^0.8.0;
interface IEON {
function mint(address to, uint256 amount) external;
function burn(address from, uint256 amount) external;
function transferFrom(
address sender,
address recipient,
uint256 amount
) external returns (bool);
}
文件 4 的 12:IImperialGuild.sol
pragma solidity ^0.8.0;
interface IImperialGuild {
function getBalance(
address account,
uint256 id
) external returns(uint256);
function mint(
uint256 typeId,
uint256 paymentId,
uint16 qty,
address recipient
) external;
function burn(
uint256 typeId,
uint16 qty,
address burnFrom
) external;
function handlePayment(uint256 amount) external;
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) external;
}
文件 5 的 12:IOrbitalBlockade.sol
pragma solidity ^0.8.0;
interface IOrbitalBlockade {
function addPiratesToCrew(address account, uint16[] calldata tokenIds)
external;
function claimPiratesFromCrew(address account, uint16[] calldata tokenIds, bool unstake)
external;
function payPirateTax(uint256 amount) external;
function randomPirateOwner(uint256 seed) external view returns (address);
}
文件 6 的 12:IPytheas.sol
pragma solidity ^0.8.0;
interface IPytheas {
function addColonistToPytheas(address account, uint16[] calldata tokenIds)
external;
function claimColonistFromPytheas(address account, uint16[] calldata tokenIds, bool unstake)
external;
function getColonistMined(address account, uint16 tokenId)
external
returns (uint256);
function handleJoinPirates(address addr, uint16 tokenId) external;
function payUp(
uint16 tokenId,
uint256 amtMined,
address addr
) external;
}
文件 7 的 12:IRAW.sol
pragma solidity ^0.8.0;
interface IRAW {
function getBalance(
address account,
uint256 id
) external returns(uint256);
function mint(
uint256 typeId,
uint256 qty,
address recipient
) external;
function burn(
uint256 typeId,
uint256 qty,
address burnFrom
) external;
function updateMintBurns(
uint256 typeId,
uint256 mintQty,
uint256 burnQty
) external;
function safeTransferFrom(
address from,
address to,
uint256 id,
uint256 amount,
bytes memory data
) external;
function safeBatchTransferFrom(
address from,
address to,
uint256[] memory ids,
uint256[] memory amounts,
bytes memory data
) external;
}
文件 8 的 12:IRandomizer.sol
pragma solidity ^0.8.0;
interface IRandomizer {
function random(uint256) external returns (uint256);
}
文件 9 的 12:IShatteredEON.sol
pragma solidity ^0.8.0;
interface IShatteredEON {}
文件 10 的 12:ITColonist.sol
pragma solidity ^0.8.0;
interface ITColonist {
function tokenURI(uint256 tokenId) external view returns (string memory);
}
文件 11 的 12:Pausable.sol
pragma solidity ^0.8.0;
import "../utils/Context.sol";
abstract contract Pausable is Context {
event Paused(address account);
event Unpaused(address account);
bool private _paused;
constructor() {
_paused = false;
}
function paused() public view virtual returns (bool) {
return _paused;
}
modifier whenNotPaused() {
require(!paused(), "Pausable: paused");
_;
}
modifier whenPaused() {
require(paused(), "Pausable: not paused");
_;
}
function _pause() internal virtual whenNotPaused {
_paused = true;
emit Paused(_msgSender());
}
function _unpause() internal virtual whenPaused {
_paused = false;
emit Unpaused(_msgSender());
}
}
文件 12 的 12:ShatteredEON.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/security/Pausable.sol";
import "./interfaces/IShatteredEON.sol";
import "./interfaces/IPytheas.sol";
import "./interfaces/IOrbitalBlockade.sol";
import "./interfaces/IColonist.sol";
import "./interfaces/ITColonist.sol";
import "./interfaces/IEON.sol";
import "./interfaces/IRAW.sol";
import "./interfaces/IImperialGuild.sol";
import "./interfaces/IRandomizer.sol";
contract ShatteredEON is IShatteredEON, Pausable {
uint256 public OnosiaLiquorId;
uint256 public constant maxRawEonCost = 250000;
uint256 public constant maxEonCost = 200000 ether;
address public auth;
bool public eonOnlyActive;
mapping(address => bool) private admins;
event newUser(address newUser);
bytes32 internal entropySauce;
IPytheas public pytheas;
IOrbitalBlockade public orbital;
IRAW public raw;
IEON public EON;
ITColonist public colTraits;
IColonist public colonistNFT;
IImperialGuild public imperialGuild;
IRandomizer public randomizer;
constructor() {
_pause();
auth = msg.sender;
admins[msg.sender] = true;
}
modifier noCheaters() {
uint256 size = 0;
address acc = msg.sender;
assembly {
size := extcodesize(acc)
}
require(
admins[msg.sender] || (msg.sender == tx.origin && size == 0),
"you're trying to cheat!"
);
_;
entropySauce = keccak256(abi.encodePacked(acc, block.coinbase));
}
modifier onlyOwner() {
require(msg.sender == auth);
_;
}
modifier requireContractsSet() {
require(
address(raw) != address(0) &&
address(EON) != address(0) &&
address(colTraits) != address(0) &&
address(colonistNFT) != address(0) &&
address(pytheas) != address(0) &&
address(orbital) != address(0) &&
address(imperialGuild) != address(0) &&
address(randomizer) != address(0),
"Contracts not set"
);
_;
}
function setContracts(
address _rEON,
address _EON,
address _colTraits,
address _colonistNFT,
address _pytheas,
address _orbital,
address _imperialGuild,
address _randomizer
) external onlyOwner {
raw = IRAW(_rEON);
EON = IEON(_EON);
colTraits = ITColonist(_colTraits);
colonistNFT = IColonist(_colonistNFT);
pytheas = IPytheas(_pytheas);
orbital = IOrbitalBlockade(_orbital);
imperialGuild = IImperialGuild(_imperialGuild);
randomizer = IRandomizer(_randomizer);
}
function mintColonist(
uint256 amount,
uint8 paymentId,
bool stake
) external noCheaters {
uint16 minted = colonistNFT.minted();
uint256 MAX_TOKENS = colonistNFT.getMaxTokens();
require(amount > 0 && amount <= 5, "5 max mints pers tx");
if (eonOnlyActive) {
require(paymentId == 0, "Only Eon sales phase");
}
uint16[] memory tokenIds = new uint16[](amount);
uint256 seed;
uint256 rawCost = 0;
uint256 eonCost = 0;
address origin = tx.origin;
bytes32 blockies = blockhash(block.number - 1);
bytes32 sauce = entropySauce;
uint256 blockTime = block.timestamp;
for (uint256 i = 0; i < amount; i++) {
minted++;
seed = random(origin, blockies, sauce, minted, blockTime);
address recipient = selectRecipient(seed);
if (
recipient != msg.sender &&
imperialGuild.getBalance(msg.sender, OnosiaLiquorId) > 0
) {
if (seed & 1 == 1) {
imperialGuild.safeTransferFrom(
msg.sender,
recipient,
OnosiaLiquorId,
1,
""
);
recipient = msg.sender;
}
}
tokenIds[i] = minted;
if (!stake || recipient != msg.sender) {
colonistNFT._mintColonist(recipient, seed);
} else {
colonistNFT._mintColonist(address(pytheas), seed);
tokenIds[i] = minted;
}
}
if (paymentId == 1) {
rawCost = rawMintCost(minted, MAX_TOKENS) * amount;
raw.burn(1, rawCost, msg.sender);
} else {
eonCost = EONmintCost(minted, MAX_TOKENS) * amount;
EON.burn(msg.sender, eonCost);
}
if (stake) {
pytheas.addColonistToPytheas(msg.sender, tokenIds);
}
emit newUser(msg.sender);
}
function rawMintCost(uint256 tokenId, uint256 maxTokens)
public
pure
returns (uint256)
{
if (tokenId <= (maxTokens * 8) / 24) return 4000;
if (tokenId <= (maxTokens * 12) / 24) return 16000;
if (tokenId <= (maxTokens * 16) / 24) return 48000;
if (tokenId <= (maxTokens * 20) / 24) return 122500;
if (tokenId <= (maxTokens * 22) / 24) return 250000;
return maxRawEonCost;
}
function EONmintCost(uint256 tokenId, uint256 maxTokens)
public
pure
returns (uint256)
{
if (tokenId <= (maxTokens * 8) / 24) return 3000 ether;
if (tokenId <= (maxTokens * 12) / 24) return 12000 ether;
if (tokenId <= (maxTokens * 16) / 24) return 36000 ether;
if (tokenId <= (maxTokens * 20) / 24) return 98000 ether;
if (tokenId <= (maxTokens * 22) / 24) return 200000 ether;
return maxEonCost;
}
function selectRecipient(uint256 seed) internal view returns (address) {
if (((seed >> 245) % 10) != 0) return _msgSender();
address thief = orbital.randomPirateOwner(seed >> 144);
if (thief == address(0x0)) return msg.sender;
return thief;
}
function setPaused(bool _paused) external requireContractsSet onlyOwner {
if (_paused) _pause();
else _unpause();
}
function setOnosiaLiquorId(uint256 typeId) external onlyOwner {
OnosiaLiquorId = typeId;
}
function setEonOnly(bool _eonOnlyActive) external onlyOwner {
eonOnlyActive = _eonOnlyActive;
}
function addAdmin(address addr) external onlyOwner {
admins[addr] = true;
}
function removeAdmin(address addr) external onlyOwner {
admins[addr] = false;
}
function transferOwnership(address newOwner) external onlyOwner {
auth = newOwner;
}
function random(address origin, bytes32 blockies,
bytes32 sauce, uint16 seed, uint256 blockTime) internal pure returns (uint256) {
return
uint256(
keccak256(
abi.encodePacked(
origin,
blockies,
blockTime,
sauce,
seed
)
)
);
}
}
{
"compilationTarget": {
"contracts/ShatteredEON.sol": "ShatteredEON"
},
"evmVersion": "london",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"details": {
"constantOptimizer": true,
"cse": true,
"deduplicate": true,
"inliner": true,
"jumpdestRemover": true,
"orderLiterals": true,
"peephole": true,
"yul": true,
"yulDetails": {
"optimizerSteps": "dhfoDgvulfnTUtnIf",
"stackAllocation": true
}
},
"runs": 2000
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newUser","type":"address"}],"name":"newUser","type":"event"},{"inputs":[],"name":"EON","outputs":[{"internalType":"contract IEON","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"maxTokens","type":"uint256"}],"name":"EONmintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"OnosiaLiquorId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"colTraits","outputs":[{"internalType":"contract ITColonist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"colonistNFT","outputs":[{"internalType":"contract IColonist","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"eonOnlyActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"imperialGuild","outputs":[{"internalType":"contract IImperialGuild","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxEonCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxRawEonCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint8","name":"paymentId","type":"uint8"},{"internalType":"bool","name":"stake","type":"bool"}],"name":"mintColonist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"orbital","outputs":[{"internalType":"contract IOrbitalBlockade","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pytheas","outputs":[{"internalType":"contract IPytheas","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"randomizer","outputs":[{"internalType":"contract IRandomizer","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raw","outputs":[{"internalType":"contract IRAW","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"maxTokens","type":"uint256"}],"name":"rawMintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_rEON","type":"address"},{"internalType":"address","name":"_EON","type":"address"},{"internalType":"address","name":"_colTraits","type":"address"},{"internalType":"address","name":"_colonistNFT","type":"address"},{"internalType":"address","name":"_pytheas","type":"address"},{"internalType":"address","name":"_orbital","type":"address"},{"internalType":"address","name":"_imperialGuild","type":"address"},{"internalType":"address","name":"_randomizer","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_eonOnlyActive","type":"bool"}],"name":"setEonOnly","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"typeId","type":"uint256"}],"name":"setOnosiaLiquorId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]