// SPDX-License-Identifier: MIT
pragma solidity 0.8.24;
// optimize 200
interface IERC20 {
function balanceOf(address account) external view returns (uint256);
function transfer(address recipient, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
}
interface StakeV2{
function getPending1(address staker) external view returns(uint256 _pendingReward);
function getPending2(address staker) external view returns(uint256 _pendingReward);
function getPending3(address staker) external view returns(uint256 _pendingReward);
function isStakeholder(address _address) external view returns(bool);
function userStakedFEG(address user) external view returns(uint256 StakedFEG);
}
interface dr {
function setMainBreaker(bool boolean) external;
function isAdmin(address addy) external view returns(bool);
function superAdmin(address addy) external view returns(bool);
function wETH() external view returns(address);
function stake(address user, uint256 amt) external returns(uint256);
function FEGstake() external view returns(address);
}
interface backing {
function liquifyForBacking(uint256 amt) external;
function BackingLogicAddress() external view returns(address);
function backingLogicAddress() external view returns(address);
}
library TransferHelper {
function safeApprove(address token, address to, uint value) internal {
// bytes4(keccak256(bytes('approve(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: APPROVE_FAILED');
}
function safeTransfer(address token, address to, uint value) internal {
// bytes4(keccak256(bytes('transfer(address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FAILED');
}
function safeTransferFrom(address token, address from, address to, uint value) internal {
// bytes4(keccak256(bytes('transferFrom(address,address,uint256)')));
(bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value));
require(success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper: TRANSFER_FROM_FAILED');
}
function safeTransferETH(address to, uint value) internal {
(bool success,) = to.call{value:value}(new bytes(0));
require(success, 'TransferHelper: ETH_TRANSFER_FAILED');
}
}
contract ReEntrancyGuard {
bool internal locked;
modifier noReentrant() {
require(!locked, "No re-entrancy");
locked = true;
_;
locked = false;
}
}
interface br {
function costBridge(uint16 toChain) external view returns(uint256,uint256);
function bridge(uint16 toChain, uint256 amount, address user) external payable;
function bridgeSD(address addy) external view returns(address);
}
contract Upgrader is ReEntrancyGuard {
address public constant V_2 = 0x4a9D6b95459eb9532B7E4d82Ca214a3b20fa2358;
address public constant FEGv1 = 0x389999216860AB8E0175387A0c90E5c52522C945;
address public constant FEGv2 = 0xbededDf2eF49E87037c4fb2cA34d1FF3D3992A11;
address public constant FEGv3 = 0xF3c7CECF8cBC3066F9a87b310cEBE198d00479aC;
address public constant ROX = 0x378c77C5379cA07BBB5B3506c08a1C769dEC91c2 ;
address public dev = 0x249Df570e549E93788F0682dc522741701Ef75E1;
address public dataread = 0xdAE383661587232FBd254b05a395CB8e35E6e7B6;
mapping(address => bool) public expired;
mapping(address => uint256) public convertedROX;
mapping(address => uint256) public FEGfromROX;
mapping(address => uint256) public FEGperDist;
mapping(address => uint256) public totalFEGFromROXAvailable;
mapping(address => uint256) public lastClaimed;
mapping(address => bool) public convertEnabledROX;
uint256 public timer;
uint256 public coolDown = 1 days;
uint256 public timerFee;
uint256 public burnThreshold = 100000000e18;
uint256 public FEGforROXTotal;
uint256 public FEGforROXClaimed;
uint256 public ROXReleasePeriods = 25;
uint256 public timerROX = 30 days;
uint256 public ROXPerRelease;
uint256 public FEGperROX;
uint256 public FEGSinceLastUpgrade;
uint256 public FEGUpgraded;
uint256 public convertCheckRate = 1000000000e18;
uint256 public _fee = 10;
bool public live = true;
event Upgrade(address, uint256, uint256, uint16);
event SaveLostTokens(address, uint256);
event FEGClaimedForROX(address, uint256, uint16);
event StakeFEGClaimedForROX(address, uint256);
event DepositROX(address, uint256);
mapping(address=>uint256) public amtClaimed;
mapping(address=>bool) public claimed;
constructor() {
timer = 1717200000; //june 1st 0:00 utc
}
receive() external payable {}
modifier Live() {
require(live, "not live");
_;
}
function FEGStake() public view returns(address) {
return dr(dataread).FEGstake();
}
function fee() public view returns(uint256 fee_) {
uint256 time = timerFee;
if(time > 0) {
for(uint256 i = 0; i < 25; i++) {
if(block.timestamp > time) {
time += 30 days;
fee_ += _fee;
if(fee_ >= 100) {
fee_ = 100;
break;
}
}
if(block.timestamp <= time) {
break;
}
}
}
if(time == 0) {
fee_ = 0;
}
}
function setfee(uint256 fee_) external {
require(dr(dataread).superAdmin(msg.sender));
_fee = fee_;
}
function setDev(address addy) external {
require(dr(dataread).superAdmin(msg.sender));
dev = addy;
}
function resetFEGChecker() external {
require(dr(dataread).superAdmin(msg.sender) || dr(dataread).isAdmin(msg.sender));
FEGSinceLastUpgrade = 0;
}
function setTimerFee(uint256 amt) external {
require(dr(dataread).superAdmin(msg.sender));
timerFee = amt;
}
function setConvertCheckRate(uint256 amt) external {
require(dr(dataread).superAdmin(msg.sender));
require(amt > 10000000e18, "10m min");
convertCheckRate = amt;
}
function loadFEGForROX(uint256 amt) external noReentrant {
require(dr(dataread).superAdmin(msg.sender));
TransferHelper.safeTransferFrom(FEGv3, msg.sender, address(this), amt * 1e18);
FEGforROXTotal += amt;
ROXPerRelease = FEGforROXTotal / ROXReleasePeriods;
FEGperROX = FEGforROXTotal * 1e9 / 1000;
}
function roundROX() public view returns(uint256 round) {
round = 1;
if(block.timestamp < timer) {
round = 0;
}
if(round > 0) {
for(uint256 i = 0; i < 26; i++) {
if(block.timestamp > timer + (timerROX * round)) {
round += 1;
if(round == 25) {
break; //failsafe
}
}
}
}
}
function costBridge(uint16 toChain) external view returns(uint256 cost) {
address brd = br(dataread).bridgeSD(FEGv3);
(cost,) = br(brd).costBridge(toChain);
}
function setLive(bool _bool) external {
require(dr(dataread).superAdmin(msg.sender));
live = _bool;
}
function setCoolDown(uint256 amt) external {
require(dr(dataread).superAdmin(msg.sender));
coolDown = amt;
}
function setBurnThreshold(uint256 amt) external {
require(dr(dataread).superAdmin(msg.sender));
burnThreshold = amt;
}
function setExp(address user, bool _bool) external {
require(dr(dataread).isAdmin(msg.sender));
expired[user] = _bool;
}
function WETH() public view returns(address) {
return dr(dataread).wETH();
}
function depositROX() external noReentrant {
require(block.timestamp > timer, "<June1");
require(!expired[msg.sender], "expired wallet");
uint256 amt = IERC20(ROX).balanceOf(msg.sender);
require(!convertEnabledROX[msg.sender], "already");
uint256 tot = totalEligibleROXForFEG(msg.sender);
TransferHelper.safeTransferFrom(ROX, msg.sender, address(this), amt);
convertedROX[msg.sender] = amt;
convertEnabledROX[msg.sender] = true;
FEGperDist[msg.sender] = tot / ROXReleasePeriods;
totalFEGFromROXAvailable[msg.sender] = tot;
emit DepositROX(msg.sender, amt);
}
function claimFEGRelease(uint256 amt, uint16 toChain, address to) external noReentrant payable {
require(!expired[msg.sender], "expired wallet");
require(convertEnabledROX[msg.sender], "not ready");
require(block.timestamp > lastClaimed[msg.sender] + coolDown, "1 day cooldown");
require(amt > 0, "cannot claim 0");
require(totalFEGFromROXAvailable[msg.sender] >= amt, "over");
uint256 tot = roundROX() * FEGperDist[msg.sender];
uint256 amtOpen = tot - FEGfromROX[msg.sender];
require(amt <= amtOpen, "not enough open");
lastClaimed[msg.sender] = block.timestamp;
FEGfromROX[msg.sender] += amt;
totalFEGFromROXAvailable[msg.sender] -= amt;
FEGforROXClaimed += amt;
if(toChain == 0) {
TransferHelper.safeTransfer(FEGv3,to,amt);
}
if(toChain > 0) {
address brd = br(dataread).bridgeSD(FEGv3);
(uint256 cost,) = br(brd).costBridge(toChain);
require(msg.value >= cost, "insufficient fee");
TransferHelper.safeApprove(FEGv3, brd, amt);
br(brd).bridge{value: cost}(toChain,amt,to);
}
emit FEGClaimedForROX(msg.sender, amt, toChain);
}
function stakeFEGRelease(uint256 amt) external noReentrant {
require(!expired[msg.sender], "expired wallet");
require(convertEnabledROX[msg.sender], "not ready");
require(block.timestamp > lastClaimed[msg.sender] + coolDown, "1 day cooldown");
require(amt > 0, "cannot claim 0");
require(totalFEGFromROXAvailable[msg.sender] >= amt, "over");
uint256 tot = roundROX() * FEGperDist[msg.sender];
uint256 amtOpen = tot - FEGfromROX[msg.sender];
require(amt <= amtOpen, "not enough open");
FEGfromROX[msg.sender] += amt;
FEGforROXClaimed += amt;
totalFEGFromROXAvailable[msg.sender] -= amt;
lastClaimed[msg.sender] = block.timestamp;
address stake = FEGStake();
TransferHelper.safeApprove(FEGv3, stake, amt);
dr(stake).stake(msg.sender, amt);
emit StakeFEGClaimedForROX(msg.sender, amt);
}
function totalEligibleROXForFEG(address holder) public view returns(uint256) {
return (IERC20(ROX).balanceOf(holder) * FEGperROX);
}
function totalOpenROXForFEG(address holder) public view returns(uint256) {
uint256 tot = roundROX() * FEGperDist[holder];
uint256 amtOpen = tot - FEGfromROX[holder];
return amtOpen;
}
function balanceEligible(address holder) public view returns(uint256,uint256,uint256) {
uint256 fv = IERC20(FEGv1).balanceOf(holder);
uint256 totOld = fv > 1000000 ? (fv / 1000000) * 1e9: 0;
uint256 totFee;
if(fee() > 0 && totOld > 0) {
totFee = totOld * fee() / 100;
totOld -= totFee;
}
uint256 totF = IERC20(FEGv2).balanceOf(holder);
return (totOld, totFee, totF);
}
function allBalances(address holder) external view returns(uint256 fegv1, uint256 fegv2, uint256 stakev2, uint256 rox) {
fegv1 = IERC20(FEGv1).balanceOf(holder);
fegv2 = IERC20(FEGv2).balanceOf(holder);
stakev2 = StakeV2(V_2).userStakedFEG(holder);
rox = IERC20(ROX).balanceOf(holder);
}
function stakingV2Eligible(address holder) public view returns(uint256,uint256) {
uint256 sv = StakeV2(V_2).userStakedFEG(holder);
uint256 tot = sv > 1000000 ? (sv / 1000000) * 1e9: 0;
uint256 totFee;
if(fee() > 0) {
totFee += tot * fee() / 100;
tot -= totFee;
}
return (tot , totFee);
}
function upgradeFEG(uint16 toChain, address to) external noReentrant Live payable {
require(!expired[msg.sender], "expired wallet");
require(IERC20(FEGv1).balanceOf(msg.sender) == 0 && IERC20(V_2).balanceOf(msg.sender) == 0, "must be 0");
uint256 bal = IERC20(FEGv2).balanceOf(msg.sender);
FEGSinceLastUpgrade += bal;
require(FEGSinceLastUpgrade < convertCheckRate, "reset checker");
if(bal > 0) {
require(!claimed[msg.sender], "done");
require(IERC20(FEGv3).balanceOf(address(this)) >= bal + ((FEGforROXTotal * 1e18) - FEGforROXClaimed), "fill upgrader");
TransferHelper.safeTransferFrom(FEGv2, msg.sender, address(this), bal);
if(toChain == 0) {
TransferHelper.safeTransfer(FEGv3,to,bal);
}
if(toChain > 0) {
address brd = br(dataread).bridgeSD(FEGv3);
(uint256 cost,) = br(brd).costBridge(toChain);
require(msg.value >= cost, "insufficient fee");
TransferHelper.safeApprove(FEGv3, brd, bal);
br(brd).bridge{value: cost}(toChain,bal,to);
}
claimed[msg.sender] = true;
amtClaimed[msg.sender] += bal;
}
if(IERC20(FEGv2).balanceOf(address(this)) > burnThreshold) {
addBacking();
}
emit Upgrade(msg.sender, 0 , bal, toChain);
}
function stakeUpgradeFEG() external noReentrant Live {
require(!expired[msg.sender], "expired wallet");
require(IERC20(FEGv1).balanceOf(msg.sender) == 0 && IERC20(V_2).balanceOf(msg.sender) == 0, "must be 0");
uint256 bal = IERC20(FEGv2).balanceOf(msg.sender);
if(bal > 0) {
require(!claimed[msg.sender], "done");
require(IERC20(FEGv3).balanceOf(address(this)) >= bal + ((FEGforROXTotal * 1e18) - FEGforROXClaimed), "fill upgrader");
TransferHelper.safeTransferFrom(FEGv2, msg.sender, address(this), bal);
amtClaimed[msg.sender] += bal;
claimed[msg.sender] = true;
address stake = FEGStake();
TransferHelper.safeApprove(FEGv3, stake, bal);
dr(stake).stake(msg.sender, bal);
}
if(IERC20(FEGv2).balanceOf(address(this)) > burnThreshold) {
addBacking();
}
emit Upgrade(msg.sender, 0 , bal, 0);
}
function totalEligible(address holder) public view returns(uint256){
(uint256 a,,uint256 c) = balanceEligible(holder);
(uint256 b,) = stakingV2Eligible(holder);
return a + b + c;
}
function saveLostTokens(address toSave) external { //added function to save any lost tokens
require(FEGv1 != toSave,"Can't extract FEG");
require(FEGv2 != toSave,"Can't extract FEG"); // only burn for backing
require(V_2 != toSave,"Can't extract V-2");
require(ROX != toSave,"Can't extract V-2");
require(WETH() != toSave,"Can't extract WETH");
require(dr(dataread).superAdmin(msg.sender));
uint256 toSend = IERC20(toSave).balanceOf(address(this));
TransferHelper.safeTransfer(toSave,dev,toSend);
emit SaveLostTokens(toSave, toSend);
}
function addBacking() public {
address back = backing(FEGv2).BackingLogicAddress();
uint256 bh = IERC20(FEGv2).balanceOf(address(this));
TransferHelper.safeApprove(FEGv2, back, bh);
backing(back).liquifyForBacking(bh);
address newback = backing(FEGv3).backingLogicAddress();
address weth = WETH();
TransferHelper.safeTransfer(weth, newback, IERC20(weth).balanceOf(address(this)));
}
function upgradeAllOLD(uint16 toChain, address to) external noReentrant Live payable {
require(!claimed[msg.sender]);
require(!expired[msg.sender], "expired wallet");
address user = msg.sender;
uint256 toSend = 0;
(uint256 old, uint256 fbe, uint256 old2) = balanceEligible(user);
if(old > 0){
TransferHelper.safeTransferFrom(FEGv1, user, address(this), IERC20(FEGv1).balanceOf(user));
}
if(old2 > 0){
TransferHelper.safeTransferFrom(FEGv2, user, address(this), IERC20(FEGv2).balanceOf(user));
if(IERC20(FEGv2).balanceOf(address(this)) > burnThreshold) {
addBacking();
}
}
toSend += (old + old2);
//Staking V_2
(uint256 v2Bal, uint256 v2v) = stakingV2Eligible(user);
uint256 v2tot = IERC20(V_2).balanceOf(user);
if(v2Bal > 0){
//V_2 logic
toSend += v2Bal;
TransferHelper.safeTransferFrom(V_2, user, address(this), v2tot);
//Guarantee transfer of FSS
require(IERC20(V_2).balanceOf(user) == 0, "Must be left with 0 FSS balance");
}
FEGSinceLastUpgrade += toSend;
require(FEGSinceLastUpgrade < convertCheckRate, "reset checker");
//checks if the person get's anything
require(toSend > 0, "Nothing to upgrade");
require(IERC20(FEGv3).balanceOf(address(this)) >= toSend + ((FEGforROXTotal * 1e18) - FEGforROXClaimed), "fill upgrader");
amtClaimed[user] += toSend + fbe + v2v;
claimed[user] = true;
if(toChain == 0) {
TransferHelper.safeTransfer(FEGv3,to,toSend);
}
if(toChain > 0) {
address brd = br(dataread).bridgeSD(FEGv3);
(uint256 cost,) = br(brd).costBridge(toChain);
require(msg.value >= cost, "insufficient fee");
TransferHelper.safeApprove(FEGv3, brd, toSend);
br(brd).bridge{value: cost}(toChain,toSend,to);
}
emit Upgrade(user, v2Bal, toSend, toChain);
}
}
{
"compilationTarget": {
"Upgrader.sol": "Upgrader"
},
"evmVersion": "shanghai",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs"
},
"optimizer": {
"enabled": true,
"runs": 200
},
"remappings": []
}
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"DepositROX","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"","type":"uint16"}],"name":"FEGClaimedForROX","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"SaveLostTokens","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"StakeFEGClaimedForROX","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"},{"indexed":false,"internalType":"uint16","name":"","type":"uint16"}],"name":"Upgrade","type":"event"},{"inputs":[],"name":"FEGSinceLastUpgrade","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEGStake","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEGUpgraded","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEGforROXClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEGforROXTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"FEGfromROX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"FEGperDist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEGperROX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEGv1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEGv2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"FEGv3","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROX","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROXPerRelease","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROXReleasePeriods","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"V_2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_fee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addBacking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"allBalances","outputs":[{"internalType":"uint256","name":"fegv1","type":"uint256"},{"internalType":"uint256","name":"fegv2","type":"uint256"},{"internalType":"uint256","name":"stakev2","type":"uint256"},{"internalType":"uint256","name":"rox","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amtClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"balanceEligible","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"},{"internalType":"uint16","name":"toChain","type":"uint16"},{"internalType":"address","name":"to","type":"address"}],"name":"claimFEGRelease","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"convertCheckRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"convertEnabledROX","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"convertedROX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coolDown","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"toChain","type":"uint16"}],"name":"costBridge","outputs":[{"internalType":"uint256","name":"cost","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dataread","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"depositROX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"dev","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"expired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"fee","outputs":[{"internalType":"uint256","name":"fee_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lastClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"live","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"loadFEGForROX","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"resetFEGChecker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"roundROX","outputs":[{"internalType":"uint256","name":"round","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toSave","type":"address"}],"name":"saveLostTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setBurnThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setConvertCheckRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setCoolDown","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addy","type":"address"}],"name":"setDev","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"bool","name":"_bool","type":"bool"}],"name":"setExp","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_bool","type":"bool"}],"name":"setLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"setTimerFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"fee_","type":"uint256"}],"name":"setfee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amt","type":"uint256"}],"name":"stakeFEGRelease","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakeUpgradeFEG","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"stakingV2Eligible","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timerFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"timerROX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"totalEligible","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"totalEligibleROXForFEG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalFEGFromROXAvailable","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"holder","type":"address"}],"name":"totalOpenROXForFEG","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"toChain","type":"uint16"},{"internalType":"address","name":"to","type":"address"}],"name":"upgradeAllOLD","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint16","name":"toChain","type":"uint16"},{"internalType":"address","name":"to","type":"address"}],"name":"upgradeFEG","outputs":[],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]