编译器
0.8.11+commit.d7f03943
文件 1 的 8: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 的 8: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);
}
文件 3 的 8:IERC1155TokenReceiver.sol
pragma solidity >=0.8.0;
interface IERC1155TokenReceiver {
function onERC1155Received(
address operator,
address from,
uint256 id,
uint256 amount,
bytes calldata data
) external returns (bytes4);
function onERC1155BatchReceived(
address operator,
address from,
uint256[] calldata ids,
uint256[] calldata amounts,
bytes calldata data
) external returns (bytes4);
}
文件 4 的 8: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 的 8: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;
}
文件 6 的 8:IRefinery.sol
pragma solidity ^0.8.0;
interface IRefinery {
struct RefineryInfo {
uint8 inputType;
uint8 outputType;
uint8 burnRate;
uint8 refineRate;
}
function getRefineryInfo(uint256 _rid)
external
view
returns(RefineryInfo memory);
function pendingRefine(uint256 _rid, address _user)
external
returns (uint256 refining, uint256 refined);
function depositRaw(
uint256 _rid,
uint256 _tokenId,
uint256 _amount
) external;
function withdrawRaw(uint256 _rid) external;
}
文件 7 的 8: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());
}
}
文件 8 的 8:Refinery.sol
pragma solidity ^0.8.0;
import "@openzeppelin/contracts/security/Pausable.sol";
import "./interfaces/IERC1155TokenReceiver.sol";
import "./interfaces/IRefinery.sol";
import "./interfaces/IImperialGuild.sol";
import "./interfaces/IEON.sol";
import "./interfaces/IRAW.sol";
contract Refinery is IRefinery, IERC1155TokenReceiver, Pausable {
struct UserInfo {
uint256 amount;
uint256 refineEndBlock;
uint256 lastClaimBlock;
}
uint256 public constant multiplier = 10**18;
RefineryInfo[] public refineryInfo;
address public auth;
mapping(uint256 => mapping(address => UserInfo)) public userRefines;
mapping(address => bool) private admins;
event DepositRaw(address indexed user, uint256 indexed rid, uint256 amount);
event WithdrawRaw(
address indexed user,
uint256 indexed rid,
uint256 amount
);
event EmergencyWithdrawRaw(
address indexed user,
uint256 indexed rid,
uint256 amount
);
IRAW public raw;
IEON public eon;
bool public emergencyActivated;
constructor() {
_pause();
auth = msg.sender;
admins[msg.sender] = true;
}
modifier onlyOwner() {
require(msg.sender == auth);
_;
}
modifier requireContractsSet() {
require(
address(raw) != address(0) && address(eon) != address(0),
"Contracts not set"
);
_;
}
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!"
);
_;
}
function setContracts(address _raw, address _eon) external onlyOwner {
raw = IRAW(_raw);
eon = IEON(_eon);
}
function addRefinery(
uint8 _inputType,
uint8 _outputType,
uint8 _burnRate,
uint8 _refineRate
) external onlyOwner {
refineryInfo.push(
RefineryInfo({
inputType: _inputType,
outputType: _outputType,
burnRate: _burnRate,
refineRate: _refineRate
})
);
}
function updateRefineryInfo(
uint8 _rid,
uint8 _inputType,
uint8 _outputType,
uint8 _burnRate,
uint8 _refineRate
) external onlyOwner {
refineryInfo[_rid].inputType = _inputType;
refineryInfo[_rid].outputType = _outputType;
refineryInfo[_rid].burnRate = _burnRate;
refineryInfo[_rid].refineRate = _refineRate;
}
function getRefineryInfo(uint256 _rid)
external
view
returns (RefineryInfo memory)
{
return refineryInfo[_rid];
}
function getTimeDif(uint256 _current, uint256 _lastClaim)
internal
pure
returns (uint256)
{
return (_current - _lastClaim);
}
function pendingRefine(uint256 _rid, address _user)
external
view
returns (uint256 refining, uint256 refined)
{
RefineryInfo memory refinery = refineryInfo[_rid];
UserInfo storage user = userRefines[_rid][_user];
if (block.number < user.refineEndBlock) {
uint256 timeDif = getTimeDif(block.number, user.lastClaimBlock);
uint256 burnAmt = refinery.burnRate * timeDif;
uint256 remaining = user.amount - burnAmt;
uint256 refineRateCut = (refinery.refineRate * burnAmt) / 100;
uint256 userRefined = (burnAmt - refineRateCut);
return (remaining, userRefined);
} else if (block.number > user.refineEndBlock) {
uint256 burnAmt = user.amount;
uint256 refineRateCut = (refinery.refineRate * burnAmt) / 100;
uint256 userRefined = (burnAmt - refineRateCut);
return (0, userRefined);
}
}
function updateRefined(
uint256 _rid,
uint256 _amount,
address refiner
) private returns (uint256 burn, uint256 refined) {
RefineryInfo memory refinery = refineryInfo[_rid];
UserInfo storage user = userRefines[_rid][refiner];
if (block.number < user.refineEndBlock) {
uint256 timeDif = getTimeDif(block.number, user.lastClaimBlock);
uint256 burnAmt = refinery.burnRate * timeDif;
uint256 refineRateCut = (refinery.refineRate * burnAmt) / 100;
uint256 refinedAmt = (burnAmt - refineRateCut);
uint256 updatedRefining = (user.amount - burnAmt) + _amount;
user.lastClaimBlock = block.number;
user.refineEndBlock =
(updatedRefining / refinery.burnRate) +
block.number;
user.amount = updatedRefining;
return (burnAmt, refinedAmt);
} else if (block.number > user.refineEndBlock && user.amount != 0) {
uint256 burnAmt = user.amount;
uint256 refineRateCut = ((refinery.refineRate * burnAmt) / 100);
uint256 refinedAmt = (burnAmt - refineRateCut);
user.lastClaimBlock = block.number;
user.amount = _amount;
user.refineEndBlock = (_amount / refinery.burnRate) + block.number;
return (burnAmt, refinedAmt);
}
}
function depositRaw(
uint256 _rid,
uint256 _tokenId,
uint256 _amount
) external whenNotPaused noCheaters {
require(tx.origin == msg.sender, "Only EOA");
RefineryInfo memory refinery = refineryInfo[_rid];
UserInfo storage user = userRefines[_rid][msg.sender];
uint256 typeId = refinery.inputType;
uint256 outputId = refinery.outputType;
if (user.amount > 0) {
(uint256 burnAmt, uint256 refinedAmt) = updateRefined(
_rid,
_amount,
msg.sender
);
raw.burn(typeId, burnAmt, address(this));
if ((outputId == 0)) {
uint256 mint = refinedAmt * multiplier;
eon.mint(msg.sender, mint);
} else {
raw.mint(outputId, refinedAmt, msg.sender);
}
}
require(_tokenId == refinery.inputType);
raw.safeTransferFrom(
address(msg.sender),
address(this),
(refinery.inputType),
_amount,
""
);
if (user.amount == 0) {
user.refineEndBlock = (_amount / refinery.burnRate) + block.number;
user.lastClaimBlock = block.number;
user.amount += _amount;
}
emit DepositRaw(msg.sender, _rid, _amount);
}
function withdrawRaw(uint256 _rid) external whenNotPaused noCheaters {
require(tx.origin == msg.sender, "Only EOA");
RefineryInfo memory refinery = refineryInfo[_rid];
UserInfo storage user = userRefines[_rid][msg.sender];
uint256 typeId = refinery.inputType;
uint256 outputId = refinery.outputType;
uint8 eonType = 0;
if (user.amount > 0) {
(uint256 burnAmt, uint256 refinedAmt) = updateRefined(
_rid,
0,
msg.sender
);
uint256 unrefined = (user.amount - burnAmt);
user.amount = 0;
raw.safeTransferFrom(
address(this),
msg.sender,
typeId,
unrefined,
""
);
if (burnAmt > 0 && refinedAmt > 0) {
raw.burn(typeId, burnAmt, address(this));
if ((outputId == eonType)) {
eon.mint(msg.sender, refinedAmt);
} else {
raw.mint(outputId, refinedAmt, msg.sender);
}
}
emit WithdrawRaw(msg.sender, _rid, unrefined);
}
}
function emergencyWithdraw(uint256 _rid) external {
require(emergencyActivated, "THIS IS NOT AN EMERGENCY SITUATION");
RefineryInfo memory refinery = refineryInfo[_rid];
UserInfo storage user = userRefines[_rid][msg.sender];
uint256 typeId = refinery.inputType;
uint256 unrefined = user.amount;
raw.safeTransferFrom(address(this), msg.sender, typeId, unrefined, "");
user.amount = 0;
user.lastClaimBlock = block.number;
}
function activateEmergency(bool _enabled) external onlyOwner {
emergencyActivated = _enabled;
}
function setPaused(bool _paused) external requireContractsSet onlyOwner {
if (_paused) _pause();
else _unpause();
}
function addAdmin(address addr) external onlyOwner {
admins[addr] = true;
}
function removeAdmin(address addr) external onlyOwner {
admins[addr] = false;
}
function onERC1155Received(
address,
address,
uint256,
uint256,
bytes calldata
) external pure override returns (bytes4) {
return IERC1155TokenReceiver.onERC1155Received.selector;
}
function onERC1155BatchReceived(
address,
address,
uint256[] calldata,
uint256[] calldata,
bytes calldata
) external pure override returns (bytes4) {
return IERC1155TokenReceiver.onERC1155Received.selector;
}
function supportsInterface(bytes4 interfaceId) public pure returns (bool) {
return
interfaceId == 0x01ffc9a7 ||
interfaceId == 0xd9b67a26 ||
interfaceId == 0x0e89341c;
}
}
{
"compilationTarget": {
"contracts/Refinery.sol": "Refinery"
},
"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":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"rid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"DepositRaw","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"rid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"EmergencyWithdrawRaw","type":"event"},{"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":true,"internalType":"address","name":"user","type":"address"},{"indexed":true,"internalType":"uint256","name":"rid","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"WithdrawRaw","type":"event"},{"inputs":[{"internalType":"bool","name":"_enabled","type":"bool"}],"name":"activateEmergency","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_inputType","type":"uint8"},{"internalType":"uint8","name":"_outputType","type":"uint8"},{"internalType":"uint8","name":"_burnRate","type":"uint8"},{"internalType":"uint8","name":"_refineRate","type":"uint8"}],"name":"addRefinery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"auth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rid","type":"uint256"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"depositRaw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"emergencyActivated","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rid","type":"uint256"}],"name":"emergencyWithdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"eon","outputs":[{"internalType":"contract IEON","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rid","type":"uint256"}],"name":"getRefineryInfo","outputs":[{"components":[{"internalType":"uint8","name":"inputType","type":"uint8"},{"internalType":"uint8","name":"outputType","type":"uint8"},{"internalType":"uint8","name":"burnRate","type":"uint8"},{"internalType":"uint8","name":"refineRate","type":"uint8"}],"internalType":"struct IRefinery.RefineryInfo","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"multiplier","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155BatchReceived","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC1155Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rid","type":"uint256"},{"internalType":"address","name":"_user","type":"address"}],"name":"pendingRefine","outputs":[{"internalType":"uint256","name":"refining","type":"uint256"},{"internalType":"uint256","name":"refined","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"raw","outputs":[{"internalType":"contract IRAW","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"refineryInfo","outputs":[{"internalType":"uint8","name":"inputType","type":"uint8"},{"internalType":"uint8","name":"outputType","type":"uint8"},{"internalType":"uint8","name":"burnRate","type":"uint8"},{"internalType":"uint8","name":"refineRate","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"removeAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_raw","type":"address"},{"internalType":"address","name":"_eon","type":"address"}],"name":"setContracts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint8","name":"_rid","type":"uint8"},{"internalType":"uint8","name":"_inputType","type":"uint8"},{"internalType":"uint8","name":"_outputType","type":"uint8"},{"internalType":"uint8","name":"_burnRate","type":"uint8"},{"internalType":"uint8","name":"_refineRate","type":"uint8"}],"name":"updateRefineryInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"userRefines","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"refineEndBlock","type":"uint256"},{"internalType":"uint256","name":"lastClaimBlock","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rid","type":"uint256"}],"name":"withdrawRaw","outputs":[],"stateMutability":"nonpayable","type":"function"}]