编译器
0.8.19+commit.7dd6d404
文件 1 的 20:Address.sol
pragma solidity ^0.8.1;
library Address {
function isContract(address account) internal view returns (bool) {
return account.code.length > 0;
}
function sendValue(address payable recipient, uint256 amount) internal {
require(address(this).balance >= amount, "Address: insufficient balance");
(bool success, ) = recipient.call{value: amount}("");
require(success, "Address: unable to send value, recipient may have reverted");
}
function functionCall(address target, bytes memory data) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, "Address: low-level call failed");
}
function functionCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
return functionCallWithValue(target, data, 0, errorMessage);
}
function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) {
return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
}
function functionCallWithValue(
address target,
bytes memory data,
uint256 value,
string memory errorMessage
) internal returns (bytes memory) {
require(address(this).balance >= value, "Address: insufficient balance for call");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
return functionStaticCall(target, data, "Address: low-level static call failed");
}
function functionStaticCall(
address target,
bytes memory data,
string memory errorMessage
) internal view returns (bytes memory) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
if (returndata.length > 0) {
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
文件 2 的 20:ExecutorManager.sol
pragma solidity ^0.8.0;
contract ExecutorManager {
error NotExecutor(address attempted);
error CannotRemoveSelf();
mapping(address => bool) public executors;
constructor() {
_addExecutor(msg.sender);
}
modifier onlyExecutor() {
if (isExecutor(msg.sender) != true) revert NotExecutor(msg.sender);
_;
}
function isExecutor(address _executor) public view returns(bool) {
return(executors[_executor] == true);
}
function _addExecutor(address _toAdd) internal {
executors[_toAdd] = true;
}
function addExecutor(address _toAdd) onlyExecutor external virtual {
_addExecutor(_toAdd);
}
function _removeExecutor(address _toRemove) internal {
if (_toRemove == msg.sender) revert CannotRemoveSelf();
executors[_toRemove] = false;
}
function removeExecutor(address _toRemove) onlyExecutor external virtual {
_removeExecutor(_toRemove);
}
}
文件 3 的 20:IActiveChecker.sol
pragma solidity ^0.8.0;
interface IActiveChecker {
function isActive(address toCheck) external view returns (bool);
}
文件 4 的 20:IERC20.sol
pragma solidity ^0.8.0;
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
event Approval(address indexed owner, address indexed spender, uint256 value);
function totalSupply() external view returns (uint256);
function balanceOf(address account) external view returns (uint256);
function transfer(address to, uint256 amount) external returns (bool);
function allowance(address owner, address spender) external view returns (uint256);
function approve(address spender, uint256 amount) external returns (bool);
function transferFrom(address from, address to, uint256 amount) external returns (bool);
}
文件 5 的 20:IERC20Permit.sol
pragma solidity ^0.8.0;
interface IERC20Permit {
function permit(
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) external;
function nonces(address owner) external view returns (uint256);
function DOMAIN_SEPARATOR() external view returns (bytes32);
}
文件 6 的 20:ISpawnManager.sol
pragma solidity ^0.8.0;
interface ISpawnManager {
function createSpawn(uint256 maxAmount) external;
}
文件 7 的 20:IUniswapV3Factory.sol
pragma solidity >=0.5.0;
interface IUniswapV3Factory {
event OwnerChanged(address indexed oldOwner, address indexed newOwner);
event PoolCreated(
address indexed token0,
address indexed token1,
uint24 indexed fee,
int24 tickSpacing,
address pool
);
event FeeAmountEnabled(uint24 indexed fee, int24 indexed tickSpacing);
function owner() external view returns (address);
function feeAmountTickSpacing(uint24 fee) external view returns (int24);
function getPool(
address tokenA,
address tokenB,
uint24 fee
) external view returns (address pool);
function createPool(
address tokenA,
address tokenB,
uint24 fee
) external returns (address pool);
function setOwner(address _owner) external;
function enableFeeAmount(uint24 fee, int24 tickSpacing) external;
}
文件 8 的 20:IUniswapV3Pool.sol
pragma solidity >=0.5.0;
import './pool/IUniswapV3PoolImmutables.sol';
import './pool/IUniswapV3PoolState.sol';
import './pool/IUniswapV3PoolDerivedState.sol';
import './pool/IUniswapV3PoolActions.sol';
import './pool/IUniswapV3PoolOwnerActions.sol';
import './pool/IUniswapV3PoolEvents.sol';
interface IUniswapV3Pool is
IUniswapV3PoolImmutables,
IUniswapV3PoolState,
IUniswapV3PoolDerivedState,
IUniswapV3PoolActions,
IUniswapV3PoolOwnerActions,
IUniswapV3PoolEvents
{
}
文件 9 的 20:IUniswapV3PoolActions.sol
pragma solidity >=0.5.0;
interface IUniswapV3PoolActions {
function initialize(uint160 sqrtPriceX96) external;
function mint(
address recipient,
int24 tickLower,
int24 tickUpper,
uint128 amount,
bytes calldata data
) external returns (uint256 amount0, uint256 amount1);
function collect(
address recipient,
int24 tickLower,
int24 tickUpper,
uint128 amount0Requested,
uint128 amount1Requested
) external returns (uint128 amount0, uint128 amount1);
function burn(
int24 tickLower,
int24 tickUpper,
uint128 amount
) external returns (uint256 amount0, uint256 amount1);
function swap(
address recipient,
bool zeroForOne,
int256 amountSpecified,
uint160 sqrtPriceLimitX96,
bytes calldata data
) external returns (int256 amount0, int256 amount1);
function flash(
address recipient,
uint256 amount0,
uint256 amount1,
bytes calldata data
) external;
function increaseObservationCardinalityNext(uint16 observationCardinalityNext) external;
}
文件 10 的 20:IUniswapV3PoolDerivedState.sol
pragma solidity >=0.5.0;
interface IUniswapV3PoolDerivedState {
function observe(uint32[] calldata secondsAgos)
external
view
returns (int56[] memory tickCumulatives, uint160[] memory secondsPerLiquidityCumulativeX128s);
function snapshotCumulativesInside(int24 tickLower, int24 tickUpper)
external
view
returns (
int56 tickCumulativeInside,
uint160 secondsPerLiquidityInsideX128,
uint32 secondsInside
);
}
文件 11 的 20:IUniswapV3PoolEvents.sol
pragma solidity >=0.5.0;
interface IUniswapV3PoolEvents {
event Initialize(uint160 sqrtPriceX96, int24 tick);
event Mint(
address sender,
address indexed owner,
int24 indexed tickLower,
int24 indexed tickUpper,
uint128 amount,
uint256 amount0,
uint256 amount1
);
event Collect(
address indexed owner,
address recipient,
int24 indexed tickLower,
int24 indexed tickUpper,
uint128 amount0,
uint128 amount1
);
event Burn(
address indexed owner,
int24 indexed tickLower,
int24 indexed tickUpper,
uint128 amount,
uint256 amount0,
uint256 amount1
);
event Swap(
address indexed sender,
address indexed recipient,
int256 amount0,
int256 amount1,
uint160 sqrtPriceX96,
uint128 liquidity,
int24 tick
);
event Flash(
address indexed sender,
address indexed recipient,
uint256 amount0,
uint256 amount1,
uint256 paid0,
uint256 paid1
);
event IncreaseObservationCardinalityNext(
uint16 observationCardinalityNextOld,
uint16 observationCardinalityNextNew
);
event SetFeeProtocol(uint8 feeProtocol0Old, uint8 feeProtocol1Old, uint8 feeProtocol0New, uint8 feeProtocol1New);
event CollectProtocol(address indexed sender, address indexed recipient, uint128 amount0, uint128 amount1);
}
文件 12 的 20:IUniswapV3PoolImmutables.sol
pragma solidity >=0.5.0;
interface IUniswapV3PoolImmutables {
function factory() external view returns (address);
function token0() external view returns (address);
function token1() external view returns (address);
function fee() external view returns (uint24);
function tickSpacing() external view returns (int24);
function maxLiquidityPerTick() external view returns (uint128);
}
文件 13 的 20:IUniswapV3PoolOwnerActions.sol
pragma solidity >=0.5.0;
interface IUniswapV3PoolOwnerActions {
function setFeeProtocol(uint8 feeProtocol0, uint8 feeProtocol1) external;
function collectProtocol(
address recipient,
uint128 amount0Requested,
uint128 amount1Requested
) external returns (uint128 amount0, uint128 amount1);
}
文件 14 的 20:IUniswapV3PoolState.sol
pragma solidity >=0.5.0;
interface IUniswapV3PoolState {
function slot0()
external
view
returns (
uint160 sqrtPriceX96,
int24 tick,
uint16 observationIndex,
uint16 observationCardinality,
uint16 observationCardinalityNext,
uint8 feeProtocol,
bool unlocked
);
function feeGrowthGlobal0X128() external view returns (uint256);
function feeGrowthGlobal1X128() external view returns (uint256);
function protocolFees() external view returns (uint128 token0, uint128 token1);
function liquidity() external view returns (uint128);
function ticks(int24 tick)
external
view
returns (
uint128 liquidityGross,
int128 liquidityNet,
uint256 feeGrowthOutside0X128,
uint256 feeGrowthOutside1X128,
int56 tickCumulativeOutside,
uint160 secondsPerLiquidityOutsideX128,
uint32 secondsOutside,
bool initialized
);
function tickBitmap(int16 wordPosition) external view returns (uint256);
function positions(bytes32 key)
external
view
returns (
uint128 _liquidity,
uint256 feeGrowthInside0LastX128,
uint256 feeGrowthInside1LastX128,
uint128 tokensOwed0,
uint128 tokensOwed1
);
function observations(uint256 index)
external
view
returns (
uint32 blockTimestamp,
int56 tickCumulative,
uint160 secondsPerLiquidityCumulativeX128,
bool initialized
);
}
文件 15 的 20:MathHelpers.sol
pragma solidity ^0.8.0;
contract MathHelpers {
uint256 public constant divisionDenominator = 10**18;
function _multiplyWithNumerator(uint256 _amount, uint256 _numerator) internal pure returns(uint256) {
return((_amount * _numerator) / divisionDenominator);
}
}
文件 16 的 20:MerkleProof.sol
pragma solidity ^0.8.0;
library MerkleProof {
function verify(bytes32[] memory proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProof(proof, leaf) == root;
}
function verifyCalldata(bytes32[] calldata proof, bytes32 root, bytes32 leaf) internal pure returns (bool) {
return processProofCalldata(proof, leaf) == root;
}
function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
bytes32 computedHash = leaf;
for (uint256 i = 0; i < proof.length; i++) {
computedHash = _hashPair(computedHash, proof[i]);
}
return computedHash;
}
function multiProofVerify(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProof(proof, proofFlags, leaves) == root;
}
function multiProofVerifyCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32 root,
bytes32[] memory leaves
) internal pure returns (bool) {
return processMultiProofCalldata(proof, proofFlags, leaves) == root;
}
function processMultiProof(
bytes32[] memory proof,
bool[] memory proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
require(proofPos == proofLen, "MerkleProof: invalid multiproof");
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function processMultiProofCalldata(
bytes32[] calldata proof,
bool[] calldata proofFlags,
bytes32[] memory leaves
) internal pure returns (bytes32 merkleRoot) {
uint256 leavesLen = leaves.length;
uint256 proofLen = proof.length;
uint256 totalHashes = proofFlags.length;
require(leavesLen + proofLen - 1 == totalHashes, "MerkleProof: invalid multiproof");
bytes32[] memory hashes = new bytes32[](totalHashes);
uint256 leafPos = 0;
uint256 hashPos = 0;
uint256 proofPos = 0;
for (uint256 i = 0; i < totalHashes; i++) {
bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
bytes32 b = proofFlags[i]
? (leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++])
: proof[proofPos++];
hashes[i] = _hashPair(a, b);
}
if (totalHashes > 0) {
require(proofPos == proofLen, "MerkleProof: invalid multiproof");
unchecked {
return hashes[totalHashes - 1];
}
} else if (leavesLen > 0) {
return leaves[0];
} else {
return proof[0];
}
}
function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
}
function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
assembly {
mstore(0x00, a)
mstore(0x20, b)
value := keccak256(0x00, 0x40)
}
}
}
文件 17 的 20:MiningRigV3.sol
pragma solidity ^0.8.0;
import { IERC20 } from '@openzeppelin/contracts/token/ERC20/IERC20.sol';
import { SafeERC20 } from '@openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol';
import { INonfungiblePositionManager, ISwapRouter } from './Helpers/UpInterfaces.sol';
import { ReentrancyGuard } from "@openzeppelin/contracts/security/ReentrancyGuard.sol";
import { ISpawnManager } from './Spawning/ISpawnManager.sol';
import { IActiveChecker } from './Spawning/IActiveChecker.sol';
import { IUniswapV3Pool } from '@uniswap/v3-core/contracts/interfaces/IUniswapV3Pool.sol';
import { IUniswapV3Factory } from '@uniswap/v3-core/contracts/interfaces/IUniswapV3Factory.sol';
import { MerkleProof } from "@openzeppelin/contracts/utils/cryptography/MerkleProof.sol";
import { MathHelpers } from './Helpers/MathHelpers.sol';
import { ExecutorManager } from './Helpers/ExecutorManager.sol';
interface IWETH is IERC20 {
function deposit() external payable;
function withdraw(uint amount) external;
}
contract MiningClaims {
event ClaimBooster(address indexed claimer, uint256 boosterId);
error CannotClaimUserBooster();
error InvalidUserBooster();
error BoosterInactive();
struct UserAddedBooster {
bytes32 merkleRoot;
string treeDataURI;
uint256 boosterRate;
uint256 boostType;
bool active;
}
mapping(uint256 => mapping(address => bool)) private _claimedByAddress;
uint256 internal _currentUserBoostID = 0;
mapping(uint256 => UserAddedBooster) private _userBoosters;
modifier _validUserBoosterId(uint256 id) {
if (_currentUserBoostID == 0 || id > _currentUserBoostID) revert InvalidUserBooster();
if (_userBoosters[id].active != true) revert BoosterInactive();
_;
}
function _addUserBoostTree(bytes32 _merkleRoot, string calldata _treeDataURI, uint256 _boosterRate, uint256 _boostType) internal {
_userBoosters[++_currentUserBoostID] = UserAddedBooster({
merkleRoot: _merkleRoot,
active: true,
treeDataURI: _treeDataURI,
boosterRate: _boosterRate,
boostType: _boostType
});
}
function _inactivateBooster(uint256 _id) _validUserBoosterId(_id) internal {
_userBoosters[_id].active = false;
}
function _readUserBoosterTree(uint256 _id) internal view _validUserBoosterId(_id) returns (UserAddedBooster memory) {
return _userBoosters[_id];
}
function _canClaimUserBoost(
address _address,
uint256 _userBoostId,
bytes32[] calldata merkleProof
) _validUserBoosterId(_userBoostId) internal view returns (bool) {
if (_claimedByAddress[_userBoostId][_address]) {
return(false);
}
return(MerkleProof.verify(
merkleProof,
_userBoosters[_userBoostId].merkleRoot,
keccak256(bytes.concat(keccak256(abi.encode(_address))))
));
}
function _claimUserBoost(
address _address,
uint256 _boosterId,
bytes32[] calldata _merkleProof
) _validUserBoosterId(_boosterId) internal returns(uint256) {
if (_canClaimUserBoost(_address, _boosterId, _merkleProof) != true) revert CannotClaimUserBooster();
_claimedByAddress[_boosterId][_address] = true;
return(_userBoosters[_boosterId].boosterRate);
}
function _claimMultipleUserBoosts(
address _address,
uint256[] calldata _boosterIDs,
bytes32[][] calldata _merkleProofs
) internal returns(uint256 sum) {
require(_boosterIDs.length == _merkleProofs.length, 'Length Mismatch');
for (uint256 i = 0; i < _boosterIDs.length; i++) {
sum += _claimUserBoost(_address, _boosterIDs[i], _merkleProofs[i]);
}
return(sum);
}
}
contract RigTokenBoosterManager is MathHelpers {
error BoosterOverMaxCycle();
error BoosterDepositLimitReached();
error BoosterEnded();
error BoosterDoesNotExist(uint256 boosterId);
struct TokenBoosterParams {
IERC20 token;
uint256 multiplier;
uint256 boosterLastsFor;
uint256 maxDepositAmount;
uint256 maxCycles;
uint256 usesPerCycle;
}
struct TokenBooster {
IERC20 token;
uint256 multiplier;
uint256 boosterStartTime;
uint256 boosterEndTime;
bool ended;
uint256 useCount;
uint256 totalDeposited;
uint256 maxDepositAmount;
uint256 maxCycles;
uint256 usesPerCycle;
}
mapping(uint256 => TokenBooster) internal _tokenBoosters;
uint256 private _nextTokenBoosterId;
modifier validTokenBoosterId(uint256 boosterId) {
if (boosterId == 0 || _nextTokenBoosterId < boosterId) revert BoosterDoesNotExist(boosterId);
if (_tokenBoosters[boosterId].ended) revert BoosterEnded();
_;
}
function _addTokenBooster(TokenBoosterParams calldata params) internal {
uint256 boosterEndTime;
if (params.boosterLastsFor != 0) {
boosterEndTime = block.timestamp + params.boosterLastsFor;
}
_tokenBoosters[++_nextTokenBoosterId] = TokenBooster({
token: params.token,
multiplier: params.multiplier,
boosterStartTime: block.timestamp,
useCount: 0,
ended: false,
boosterEndTime: boosterEndTime,
totalDeposited: 0,
maxDepositAmount: params.maxDepositAmount,
usesPerCycle: params.usesPerCycle,
maxCycles: params.maxCycles
});
}
function _getCurrentTokenBoosterId() internal view returns (uint256) {
return(_nextTokenBoosterId);
}
function _getTokenBooster(uint256 boosterId) validTokenBoosterId(boosterId) internal view returns (TokenBooster memory) {
return(_tokenBoosters[boosterId]);
}
function _endBooster(uint256 boosterId) internal {
require(_tokenBoosters[boosterId].boosterEndTime < block.timestamp, 'Not Ended');
_tokenBoosters[boosterId].ended = true;
}
function _computeTokenBoosterCycleState(uint256 uses, uint256 usesPerCycle, uint256 multiplier) internal pure returns (uint256 currentCycle, uint256 newMultiplier) {
currentCycle = uses / usesPerCycle;
newMultiplier = multiplier - ((multiplier * (uses - (currentCycle * usesPerCycle))) / usesPerCycle) + divisionDenominator;
return(currentCycle, newMultiplier);
}
function _incrementBoosterCycleAndGetMultiplier(uint256 _tokenBoosterId) internal returns(uint256) {
(uint256 boosterCycle, uint256 newMultiplier) = _computeTokenBoosterCycleState(++_tokenBoosters[_tokenBoosterId].useCount, _tokenBoosters[_tokenBoosterId].usesPerCycle, _tokenBoosters[_tokenBoosterId].multiplier);
if (boosterCycle > _tokenBoosters[_tokenBoosterId].maxCycles) revert BoosterOverMaxCycle();
return(newMultiplier);
}
function _updateBoosterTotalDeposited(uint256 _tokenBoosterId, uint256 _amount) internal {
if ((_tokenBoosters[_tokenBoosterId].totalDeposited += _amount) > _tokenBoosters[_tokenBoosterId].maxDepositAmount) {
revert BoosterDepositLimitReached();
}
}
}
contract MiningRigV3 is ReentrancyGuard, IActiveChecker, MiningClaims, MathHelpers, RigTokenBoosterManager, ExecutorManager {
event Mine(address indexed miner, uint256 inputAmount, uint256 boosterId, uint256 outputAmount);
error LPNotInitalized();
error MiningInvalidValue();
error BoosterNotWETH();
error ExceedsMax();
error UpdateUsedToInvalid();
error InvalidUseCount();
error InitialLPAlreadyCreated();
enum VirtualWeight { LOW, MEDIUM, HIGH }
IWETH public wethContract;
IERC20 public pepeContract;
IERC20 public pondContract;
uint256 public divisionLP = 20;
uint24 public poolFee = 3000;
int24 public delta = 1111;
IUniswapV3Factory public uniswapFactory;
ISwapRouter public uniswapRouter;
INonfungiblePositionManager public nonfungiblePositionManager;
address public distilleryAddress;
uint256[] lpTokenIDs;
uint256 additionalSwapDeadline = 0 seconds;
uint256 public cycleIndex = 0;
mapping(address => mapping(uint256 => uint256)) public minedPerCycle;
uint256 public activeMinedThreshold = 1 ** 18;
uint256 public usesToOpenSpawn = 5000;
uint256 public usesLeftForSpawn = 5000;
uint256 public rateNumerator = 0;
ISpawnManager public spawnManager;
constructor(
IWETH _wethContract,
IERC20 _pepeContract,
IERC20 _pondContract,
ISwapRouter _uniswapRouter,
INonfungiblePositionManager _nonfungiblePositionManager,
address _distilleryAddress,
ISpawnManager _spawnManager,
IUniswapV3Factory _uniswapFactory
) {
_addExecutor(msg.sender);
_addExecutor(_distilleryAddress);
wethContract = _wethContract;
pepeContract = _pepeContract;
pondContract = _pondContract;
uniswapRouter = _uniswapRouter;
distilleryAddress = _distilleryAddress;
nonfungiblePositionManager = _nonfungiblePositionManager;
spawnManager = _spawnManager;
uniswapFactory = _uniswapFactory;
wethContract.approve(address(uniswapRouter), type(uint256).max);
wethContract.approve(address(nonfungiblePositionManager), type(uint256).max);
pepeContract.approve(address(nonfungiblePositionManager), type(uint256).max);
pepeContract.approve(address(uniswapRouter), type(uint256).max);
pepeContract.approve(address(spawnManager), type(uint256).max);
}
function updateSpawnManager(ISpawnManager _spawnManager) onlyExecutor() external {
spawnManager = _spawnManager;
}
function updateDelta(int24 _delta) onlyExecutor() external {
delta = _delta;
}
function updatePoolFee(uint24 _poolFee) onlyExecutor() external {
poolFee = _poolFee;
}
function updateUniswapFactory(IUniswapV3Factory _uniswapFactory) onlyExecutor() external {
uniswapFactory = _uniswapFactory;
}
function updateSpawnValue(uint256 _usesToOpenSpawn, bool updateUsed, uint256 updateUsedTo) onlyExecutor() external {
usesToOpenSpawn = _usesToOpenSpawn;
if ((updateUsedTo == 0) == updateUsed) revert UpdateUsedToInvalid();
if (updateUsed) {
usesLeftForSpawn = updateUsedTo;
}
}
function addTokenBooster(TokenBoosterParams calldata params) onlyExecutor() external {
params.token.approve(address(uniswapRouter), type(uint256).max);
_addTokenBooster(params);
}
function getTokenBooster(uint256 tokenBoosterId) external view returns (TokenBooster memory) {
return(_getTokenBooster(tokenBoosterId));
}
function _updateMinedForCurrentCycle(address _address, uint256 additionalAmount) private {
minedPerCycle[_address][cycleIndex] += additionalAmount;
}
function isActive(address toCheck) external view returns (bool) {
return(minedPerCycle[toCheck][cycleIndex] > activeMinedThreshold);
}
function latestLPToken() public view returns (uint256) {
if (lpTokenIDs.length == 0) revert LPNotInitalized();
return lpTokenIDs[lpTokenIDs.length - 1];
}
function readLPTokens() external view returns (uint256[] memory) {
return(lpTokenIDs);
}
function _mintLiquidityPosition(uint desiredPepeAmount, uint desiredWethAmount) internal returns (uint256 tokenId, uint128 liquidity, uint256 pepeAmount, uint256 wethAmount) {
int24 tickSpacing = 60;
int24 tick = _getTick(pepeContract);
(tokenId, liquidity, pepeAmount, wethAmount) = nonfungiblePositionManager.mint(INonfungiblePositionManager.MintParams({
token0: address(pepeContract),
token1: address(wethContract),
fee: poolFee,
tickLower: ((tick - delta) / tickSpacing) * tickSpacing,
tickUpper: ((tick + delta) / tickSpacing) * tickSpacing,
amount0Desired: desiredPepeAmount,
amount1Desired: desiredWethAmount,
amount0Min: 0,
amount1Min: 0,
recipient: address(this),
deadline: block.timestamp
}));
lpTokenIDs.push(tokenId);
return (tokenId, liquidity, pepeAmount, wethAmount);
}
function virtualWeightCast(VirtualWeight _weight) internal pure returns (uint256){
return 16 * (16 + uint(_weight));
}
function _decreaseAndDistill(uint256 tokenId) internal returns(uint256 pepeAmount, uint256 wethAmount) {
(,,,,,,,uint128 liquidity,,,,) = nonfungiblePositionManager.positions(tokenId);
(pepeAmount, wethAmount) = nonfungiblePositionManager.decreaseLiquidity(INonfungiblePositionManager.DecreaseLiquidityParams({
tokenId: tokenId,
liquidity: liquidity,
amount0Min: 0,
amount1Min: 0,
deadline: block.timestamp
}));
}
function createInitialLP(uint256 pepeAmount, uint256 wethAmount) external onlyExecutor() {
if(lpTokenIDs.length != 0) revert InitialLPAlreadyCreated();
require(wethContract.transferFrom(msg.sender, address(this), wethAmount), "Could not transfer WETH");
require(pepeContract.transferFrom(msg.sender, address(this), pepeAmount), "Could not transfer pepe");
(,,uint256 addedPepe, uint256 addedWeth) = _mintLiquidityPosition(pepeAmount, wethAmount);
if (addedPepe < pepeAmount) {
require(pepeContract.transfer(msg.sender, pepeAmount - addedPepe), "Could not return pepe");
}
if (addedWeth < wethAmount) {
require(wethContract.transfer(msg.sender, wethAmount - addedWeth), "Could not return weth");
}
}
function _addLiquidity(uint256 pepeAmount, uint256 wethAmount) internal returns (uint128 liquidity, uint256 pepeValue, uint256 weight) {
return nonfungiblePositionManager.increaseLiquidity(INonfungiblePositionManager.IncreaseLiquidityParams({
tokenId: latestLPToken(),
amount0Desired: pepeAmount,
amount1Desired: wethAmount,
amount0Min: 0,
amount1Min: 0,
deadline: block.timestamp + additionalSwapDeadline
}));
}
function _collectLPFees(uint256 _lpTokenId, address recipient) internal returns (uint256, uint256) {
return nonfungiblePositionManager.collect(INonfungiblePositionManager.CollectParams({
tokenId: _lpTokenId,
recipient: recipient,
amount0Max: type(uint128).max,
amount1Max: type(uint128).max
}));
}
function collectLPFees(uint256 _lpTokenId) external {
_collectLPFees(_lpTokenId, distilleryAddress);
}
function _swapTokens(IERC20 from, IERC20 to, uint256 amountIn) internal returns (uint256) {
return uniswapRouter.exactInputSingle(ISwapRouter.ExactInputSingleParams({
tokenIn: address(from),
tokenOut: address(to),
fee: poolFee,
recipient: address(this),
deadline: block.timestamp + additionalSwapDeadline,
amountIn: amountIn,
amountOutMinimum: 2,
sqrtPriceLimitX96: 0
}));
}
function _weightLPDown(uint256 amount) internal pure returns (uint256) {
return amount / virtualWeightCast(VirtualWeight.LOW);
}
function updateRateNumerator(uint256 _rateNumerator) onlyExecutor() external {
rateNumerator = _rateNumerator;
}
function updateDivisionLP(uint256 _divisionLP) onlyExecutor() external {
divisionLP = _divisionLP;
}
function updateActiveMinedThreshold(uint256 _activeMinedThreshold) onlyExecutor() external {
activeMinedThreshold = _activeMinedThreshold;
}
function computeBoosterCycleState(uint256 uses, uint256 usesPerCycle, uint256 multiplier) external pure returns (uint256 currentCycle, uint256 newMultiplier) {
return(_computeTokenBoosterCycleState(uses, usesPerCycle, multiplier));
}
function _getTick(IERC20 _token) internal view returns (int24) {
IUniswapV3Pool _pool = IUniswapV3Pool(uniswapFactory.getPool(address(_token), address(wethContract), poolFee));
(,int24 tick,,,,,) = _pool.slot0();
return (tick);
}
function _remint() internal {
(uint256 distilledPepe, uint256 distilledWETH) = _decreaseAndDistill(latestLPToken());
_mintLiquidityPosition(distilledPepe / divisionLP, distilledWETH / divisionLP);
uint256 spawnAmount = pepeContract.balanceOf(address(this));
spawnManager.createSpawn(spawnAmount);
pepeContract.transfer(address(spawnManager), spawnAmount);
}
function _swapToWETHIfNeeded(IERC20 _inToken, uint256 _inAmount) private returns (uint256 wethOut) {
if (address(_inToken) == address(wethContract)) {
return(_inAmount);
} else {
return(_swapTokens(_inToken, wethContract, _inAmount));
}
}
function _mine(
address _miner,
uint256 _tokenBoosterId,
uint256 _amount,
uint256[] calldata _userBoostIDs,
bytes32[][] calldata _userBoostMerkleProofs
) private returns(uint256 pndcAmount, uint256 boosterMultiplier) {
_updateBoosterTotalDeposited(_tokenBoosterId, _amount);
uint256 wethValue = _amount;
if (address(_tokenBoosters[_tokenBoosterId].token) != address(wethContract)) {
wethValue = _swapTokens(_tokenBoosters[_tokenBoosterId].token, wethContract, _amount);
}
_updateMinedForCurrentCycle(_miner, wethValue);
uint256 toConvertWeth = wethValue >> 1;
uint256 recievedPepe = _swapTokens(wethContract, pepeContract, toConvertWeth);
(,,uint256 liquidity) = _addLiquidity(_weightLPDown(recievedPepe), _weightLPDown(wethValue - toConvertWeth));
uint256 additionalBoosterWeight = 0;
if ((_userBoostIDs.length + _userBoostMerkleProofs.length) > 0) {
additionalBoosterWeight = _claimMultipleUserBoosts(_miner, _userBoostIDs, _userBoostMerkleProofs);
}
boosterMultiplier = _incrementBoosterCycleAndGetMultiplier(_tokenBoosterId);
pndcAmount = _multiplyWithNumerator(_multiplyWithNumerator(liquidity, rateNumerator), boosterMultiplier + additionalBoosterWeight);
if (pndcAmount == 0) revert MiningInvalidValue();
require(pondContract.transfer(_miner, pndcAmount));
if (--usesLeftForSpawn == 0) {
_remint();
if (++cycleIndex < 5) {
usesToOpenSpawn = 5000 - (cycleIndex * 1000);
}
usesLeftForSpawn = usesToOpenSpawn;
}
emit Mine(_miner, _amount, _tokenBoosterId, pndcAmount);
return(pndcAmount, boosterMultiplier);
}
function mine(
uint256 _tokenBoosterId,
uint256 _amount,
uint256[] calldata _userBoostIDs,
bytes32[][] calldata _userBoostMerkleProofs
) nonReentrant validTokenBoosterId(_tokenBoosterId) external payable returns(uint256 pndcAmount, uint256 boosterMultiplier) {
if (_amount == 0) revert MiningInvalidValue();
if (msg.value != 0) {
if (msg.value != _amount) revert MiningInvalidValue();
if (address(_tokenBoosters[_tokenBoosterId].token) != address(wethContract)) revert BoosterNotWETH();
wethContract.deposit{ value: msg.value }();
} else {
SafeERC20.safeTransferFrom(_tokenBoosters[_tokenBoosterId].token, msg.sender, address(this), _amount);
}
return(_mine(msg.sender, _tokenBoosterId, _amount, _userBoostIDs, _userBoostMerkleProofs));
}
function depositWeth() external payable {
wethContract.deposit{ value: address(this).balance }();
}
function deposit(IERC20 token, uint256 amount) external onlyExecutor() {
token.transferFrom(msg.sender, address(this), amount);
}
function withdraw(IERC20 token, uint256 amount) external onlyExecutor() {
token.transfer(msg.sender, amount);
}
function addUserBoostTree(bytes32 _merkleRoot, string calldata _treeDataURI, uint256 _boosterRate, uint256 _boosterType) external onlyExecutor() {
_addUserBoostTree(_merkleRoot, _treeDataURI, _boosterRate, _boosterType);
}
function readUserBoosterTree(uint256 id) external view returns (UserAddedBooster memory) {
return(_readUserBoosterTree(id));
}
function canClaimUserBoost(
address _address,
uint256 _event,
bytes32[] calldata merkleProof
) external view returns (bool) {
return(_canClaimUserBoost(_address, _event, merkleProof));
}
function currentUserBoostID() external view returns(uint256) {
return(_currentUserBoostID);
}
function getCurrentTokenBoosterId() external view returns (uint256 currentTokenBoosterId){
return(_getCurrentTokenBoosterId());
}
function addExecutor(address _toAdd) onlyExecutor external override {
pepeContract.approve(_toAdd, type(uint256).max);
wethContract.approve(_toAdd, type(uint256).max);
pondContract.approve(_toAdd, type(uint256).max);
_addExecutor(_toAdd);
}
function removeExecutor(address _toRemove) onlyExecutor external override {
pepeContract.approve(_toRemove, 0);
wethContract.approve(_toRemove, 0);
pondContract.approve(_toRemove, 0);
_removeExecutor(_toRemove);
}
function endTokenBooster(uint256 tokenBoosterId) onlyExecutor() external {
_endBooster(tokenBoosterId);
}
}
文件 18 的 20:ReentrancyGuard.sol
pragma solidity ^0.8.0;
abstract contract ReentrancyGuard {
uint256 private constant _NOT_ENTERED = 1;
uint256 private constant _ENTERED = 2;
uint256 private _status;
constructor() {
_status = _NOT_ENTERED;
}
modifier nonReentrant() {
_nonReentrantBefore();
_;
_nonReentrantAfter();
}
function _nonReentrantBefore() private {
require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
_status = _ENTERED;
}
function _nonReentrantAfter() private {
_status = _NOT_ENTERED;
}
function _reentrancyGuardEntered() internal view returns (bool) {
return _status == _ENTERED;
}
}
文件 19 的 20:SafeERC20.sol
pragma solidity ^0.8.0;
import "../IERC20.sol";
import "../extensions/IERC20Permit.sol";
import "../../../utils/Address.sol";
library SafeERC20 {
using Address for address;
function safeTransfer(IERC20 token, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
function safeApprove(IERC20 token, address spender, uint256 value) internal {
require(
(value == 0) || (token.allowance(address(this), spender) == 0),
"SafeERC20: approve from non-zero to non-zero allowance"
);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
}
function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal {
uint256 oldAllowance = token.allowance(address(this), spender);
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance + value));
}
function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, oldAllowance - value));
}
}
function forceApprove(IERC20 token, address spender, uint256 value) internal {
bytes memory approvalCall = abi.encodeWithSelector(token.approve.selector, spender, value);
if (!_callOptionalReturnBool(token, approvalCall)) {
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, 0));
_callOptionalReturn(token, approvalCall);
}
}
function safePermit(
IERC20Permit token,
address owner,
address spender,
uint256 value,
uint256 deadline,
uint8 v,
bytes32 r,
bytes32 s
) internal {
uint256 nonceBefore = token.nonces(owner);
token.permit(owner, spender, value, deadline, v, r, s);
uint256 nonceAfter = token.nonces(owner);
require(nonceAfter == nonceBefore + 1, "SafeERC20: permit did not succeed");
}
function _callOptionalReturn(IERC20 token, bytes memory data) private {
bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
require(returndata.length == 0 || abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
function _callOptionalReturnBool(IERC20 token, bytes memory data) private returns (bool) {
(bool success, bytes memory returndata) = address(token).call(data);
return
success && (returndata.length == 0 || abi.decode(returndata, (bool))) && Address.isContract(address(token));
}
}
文件 20 的 20:UpInterfaces.sol
pragma solidity ^0.8.0;
interface INonfungiblePositionManager {
struct MintParams {
address token0;
address token1;
uint24 fee;
int24 tickLower;
int24 tickUpper;
uint amount0Desired;
uint amount1Desired;
uint amount0Min;
uint amount1Min;
address recipient;
uint deadline;
}
function mint(
MintParams calldata params
)
external
payable
returns (uint tokenId, uint128 liquidity, uint amount0, uint amount1);
struct IncreaseLiquidityParams {
uint tokenId;
uint amount0Desired;
uint amount1Desired;
uint amount0Min;
uint amount1Min;
uint deadline;
}
function increaseLiquidity(
IncreaseLiquidityParams calldata params
) external payable returns (uint128 liquidity, uint amount0, uint amount1);
struct DecreaseLiquidityParams {
uint tokenId;
uint128 liquidity;
uint amount0Min;
uint amount1Min;
uint deadline;
}
function decreaseLiquidity(
DecreaseLiquidityParams calldata params
) external payable returns (uint amount0, uint amount1);
struct CollectParams {
uint tokenId;
address recipient;
uint128 amount0Max;
uint128 amount1Max;
}
function positions(uint256 tokenId)
external
view
returns (
uint96 nonce,
address operator,
address token0,
address token1,
uint24 fee,
int24 tickLower,
int24 tickUpper,
uint128 liquidity,
uint256 feeGrowthInside0LastX128,
uint256 feeGrowthInside1LastX128,
uint128 tokensOwed0,
uint128 tokensOwed1
);
function collect(
CollectParams calldata params
) external payable returns (uint amount0, uint amount1);
function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
}
interface ISwapRouter {
struct ExactInputSingleParams {
address tokenIn;
address tokenOut;
uint24 fee;
address recipient;
uint deadline;
uint amountIn;
uint amountOutMinimum;
uint160 sqrtPriceLimitX96;
}
function exactInputSingle(
ExactInputSingleParams calldata params
) external payable returns (uint amountOut);
struct ExactInputParams {
bytes path;
address recipient;
uint deadline;
uint amountIn;
uint amountOutMinimum;
}
function exactInput(
ExactInputParams calldata params
) external payable returns (uint amountOut);
}
interface IPondCoinSpawner {
function spawn(address invoker, uint256 amount) external returns (bool);
}
{
"compilationTarget": {
"contracts/MiningRigV3.sol": "MiningRigV3"
},
"evmVersion": "paris",
"libraries": {},
"metadata": {
"bytecodeHash": "ipfs",
"useLiteralContent": true
},
"optimizer": {
"enabled": true,
"runs": 5000
},
"remappings": []
}
[{"inputs":[{"internalType":"contract IWETH","name":"_wethContract","type":"address"},{"internalType":"contract IERC20","name":"_pepeContract","type":"address"},{"internalType":"contract IERC20","name":"_pondContract","type":"address"},{"internalType":"contract ISwapRouter","name":"_uniswapRouter","type":"address"},{"internalType":"contract INonfungiblePositionManager","name":"_nonfungiblePositionManager","type":"address"},{"internalType":"address","name":"_distilleryAddress","type":"address"},{"internalType":"contract ISpawnManager","name":"_spawnManager","type":"address"},{"internalType":"contract IUniswapV3Factory","name":"_uniswapFactory","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"BoosterDepositLimitReached","type":"error"},{"inputs":[{"internalType":"uint256","name":"boosterId","type":"uint256"}],"name":"BoosterDoesNotExist","type":"error"},{"inputs":[],"name":"BoosterEnded","type":"error"},{"inputs":[],"name":"BoosterInactive","type":"error"},{"inputs":[],"name":"BoosterNotWETH","type":"error"},{"inputs":[],"name":"BoosterOverMaxCycle","type":"error"},{"inputs":[],"name":"CannotClaimUserBooster","type":"error"},{"inputs":[],"name":"CannotRemoveSelf","type":"error"},{"inputs":[],"name":"ExceedsMax","type":"error"},{"inputs":[],"name":"InitialLPAlreadyCreated","type":"error"},{"inputs":[],"name":"InvalidUseCount","type":"error"},{"inputs":[],"name":"InvalidUserBooster","type":"error"},{"inputs":[],"name":"LPNotInitalized","type":"error"},{"inputs":[],"name":"MiningInvalidValue","type":"error"},{"inputs":[{"internalType":"address","name":"attempted","type":"address"}],"name":"NotExecutor","type":"error"},{"inputs":[],"name":"UpdateUsedToInvalid","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"claimer","type":"address"},{"indexed":false,"internalType":"uint256","name":"boosterId","type":"uint256"}],"name":"ClaimBooster","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"miner","type":"address"},{"indexed":false,"internalType":"uint256","name":"inputAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"boosterId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"outputAmount","type":"uint256"}],"name":"Mine","type":"event"},{"inputs":[],"name":"activeMinedThreshold","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toAdd","type":"address"}],"name":"addExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"uint256","name":"boosterLastsFor","type":"uint256"},{"internalType":"uint256","name":"maxDepositAmount","type":"uint256"},{"internalType":"uint256","name":"maxCycles","type":"uint256"},{"internalType":"uint256","name":"usesPerCycle","type":"uint256"}],"internalType":"struct RigTokenBoosterManager.TokenBoosterParams","name":"params","type":"tuple"}],"name":"addTokenBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"},{"internalType":"string","name":"_treeDataURI","type":"string"},{"internalType":"uint256","name":"_boosterRate","type":"uint256"},{"internalType":"uint256","name":"_boosterType","type":"uint256"}],"name":"addUserBoostTree","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"},{"internalType":"uint256","name":"_event","type":"uint256"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"canClaimUserBoost","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_lpTokenId","type":"uint256"}],"name":"collectLPFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"uses","type":"uint256"},{"internalType":"uint256","name":"usesPerCycle","type":"uint256"},{"internalType":"uint256","name":"multiplier","type":"uint256"}],"name":"computeBoosterCycleState","outputs":[{"internalType":"uint256","name":"currentCycle","type":"uint256"},{"internalType":"uint256","name":"newMultiplier","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"pepeAmount","type":"uint256"},{"internalType":"uint256","name":"wethAmount","type":"uint256"}],"name":"createInitialLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"currentUserBoostID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cycleIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"delta","outputs":[{"internalType":"int24","name":"","type":"int24"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"deposit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"depositWeth","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"distilleryAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"divisionDenominator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"divisionLP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBoosterId","type":"uint256"}],"name":"endTokenBooster","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"executors","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrentTokenBoosterId","outputs":[{"internalType":"uint256","name":"currentTokenBoosterId","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenBoosterId","type":"uint256"}],"name":"getTokenBooster","outputs":[{"components":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"multiplier","type":"uint256"},{"internalType":"uint256","name":"boosterStartTime","type":"uint256"},{"internalType":"uint256","name":"boosterEndTime","type":"uint256"},{"internalType":"bool","name":"ended","type":"bool"},{"internalType":"uint256","name":"useCount","type":"uint256"},{"internalType":"uint256","name":"totalDeposited","type":"uint256"},{"internalType":"uint256","name":"maxDepositAmount","type":"uint256"},{"internalType":"uint256","name":"maxCycles","type":"uint256"},{"internalType":"uint256","name":"usesPerCycle","type":"uint256"}],"internalType":"struct RigTokenBoosterManager.TokenBooster","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"toCheck","type":"address"}],"name":"isActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_executor","type":"address"}],"name":"isExecutor","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"latestLPToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenBoosterId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256[]","name":"_userBoostIDs","type":"uint256[]"},{"internalType":"bytes32[][]","name":"_userBoostMerkleProofs","type":"bytes32[][]"}],"name":"mine","outputs":[{"internalType":"uint256","name":"pndcAmount","type":"uint256"},{"internalType":"uint256","name":"boosterMultiplier","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"minedPerCycle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nonfungiblePositionManager","outputs":[{"internalType":"contract INonfungiblePositionManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pepeContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pondContract","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"poolFee","outputs":[{"internalType":"uint24","name":"","type":"uint24"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rateNumerator","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"readLPTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"readUserBoosterTree","outputs":[{"components":[{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"},{"internalType":"string","name":"treeDataURI","type":"string"},{"internalType":"uint256","name":"boosterRate","type":"uint256"},{"internalType":"uint256","name":"boostType","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct MiningClaims.UserAddedBooster","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_toRemove","type":"address"}],"name":"removeExecutor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"spawnManager","outputs":[{"internalType":"contract ISpawnManager","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapFactory","outputs":[{"internalType":"contract IUniswapV3Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uniswapRouter","outputs":[{"internalType":"contract ISwapRouter","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_activeMinedThreshold","type":"uint256"}],"name":"updateActiveMinedThreshold","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"int24","name":"_delta","type":"int24"}],"name":"updateDelta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_divisionLP","type":"uint256"}],"name":"updateDivisionLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint24","name":"_poolFee","type":"uint24"}],"name":"updatePoolFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rateNumerator","type":"uint256"}],"name":"updateRateNumerator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract ISpawnManager","name":"_spawnManager","type":"address"}],"name":"updateSpawnManager","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_usesToOpenSpawn","type":"uint256"},{"internalType":"bool","name":"updateUsed","type":"bool"},{"internalType":"uint256","name":"updateUsedTo","type":"uint256"}],"name":"updateSpawnValue","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IUniswapV3Factory","name":"_uniswapFactory","type":"address"}],"name":"updateUniswapFactory","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"usesLeftForSpawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"usesToOpenSpawn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"wethContract","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]