Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 14,493 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Claim | 18589804 | 513 days ago | IN | 0 ETH | 0.0005156 | ||||
Transfer | 17915296 | 607 days ago | IN | 0.01 ETH | 0.00071091 | ||||
Mine Liquidity | 17915212 | 607 days ago | IN | 1 ETH | 0.00138434 | ||||
Finalize Block | 17914887 | 607 days ago | IN | 0 ETH | 0.00074344 | ||||
Finalize Block | 17914832 | 607 days ago | IN | 0 ETH | 0.00087914 | ||||
Finalize Block | 17914826 | 607 days ago | IN | 0 ETH | 0.00067728 | ||||
Finalize Block | 17914790 | 607 days ago | IN | 0 ETH | 0.00085836 | ||||
Mine Liquidity | 17914490 | 607 days ago | IN | 0.01 ETH | 0.00246421 | ||||
Claim | 17914465 | 607 days ago | IN | 0 ETH | 0.00294655 | ||||
Locked | 17914448 | 607 days ago | IN | 0.01 ETH | 0.00089232 | ||||
Mine Liquidity | 17914329 | 607 days ago | IN | 0.1 ETH | 0.00339893 | ||||
Mine Liquidity | 17914303 | 607 days ago | IN | 0.1 ETH | 0.00140011 | ||||
Claim | 17912914 | 607 days ago | IN | 0 ETH | 0.00131781 | ||||
Unifee | 17910888 | 608 days ago | IN | 0.005 ETH | 0.00169621 | ||||
Locked | 17909893 | 608 days ago | IN | 0 ETH | 0.00028925 | ||||
Mine Liquidity | 17909804 | 608 days ago | IN | 0 ETH | 0.00027455 | ||||
Boot Up | 17909742 | 608 days ago | IN | 0.000001 ETH | 0.00037215 | ||||
Claim | 17909722 | 608 days ago | IN | 0 ETH | 0.00030529 | ||||
Claim | 17908820 | 608 days ago | IN | 0 ETH | 0.0010105 | ||||
Claim | 17908738 | 608 days ago | IN | 0 ETH | 0.00109594 | ||||
Mine Liquidity | 17908545 | 608 days ago | IN | 0.0001 ETH | 0.00573483 | ||||
Locked | 17908541 | 608 days ago | IN | 0.001 ETH | 0.00034972 | ||||
Unifee | 17908301 | 608 days ago | IN | 0.01 ETH | 0.00279717 | ||||
Mine Liquidity | 17908130 | 608 days ago | IN | 0.01 ETH | 0.00089633 | ||||
Locked | 17908122 | 608 days ago | IN | 0.25000001 ETH | 0.00151383 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
Exact Input Sing... | 17915212 | 607 days ago | 0.5 ETH | ||||
Exact Input Sing... | 17914490 | 607 days ago | 0.005 ETH | ||||
Exact Input Sing... | 17914329 | 607 days ago | 0.05 ETH | ||||
Exact Input Sing... | 17914303 | 607 days ago | 0.05 ETH | ||||
Deposit | 17908545 | 608 days ago | 0.00005 ETH | ||||
Exact Input Sing... | 17908545 | 608 days ago | 0.00005 ETH | ||||
Exact Input Sing... | 17908130 | 608 days ago | 0.005 ETH | ||||
Transfer | 17908122 | 608 days ago | 0.25000001 ETH | ||||
Transfer | 17906375 | 608 days ago | 0.25000001 ETH | ||||
Transfer | 17904309 | 609 days ago | 0.00144527 ETH | ||||
Transfer | 17904309 | 609 days ago | 0.00144527 ETH | ||||
Transfer | 17904309 | 609 days ago | 0.261101 ETH | ||||
Deposit | 17809669 | 622 days ago | 0.05 ETH | ||||
Exact Input Sing... | 17809669 | 622 days ago | 0.05 ETH | ||||
Deposit | 17809334 | 622 days ago | 0.0046 ETH | ||||
Exact Input Sing... | 17809334 | 622 days ago | 0.0046 ETH | ||||
Deposit | 17809245 | 622 days ago | 0.005 ETH | ||||
Exact Input Sing... | 17809245 | 622 days ago | 0.005 ETH | ||||
Deposit | 17807765 | 622 days ago | 1 wei | ||||
Exact Input Sing... | 17807765 | 622 days ago | 1 wei | ||||
Transfer | 17805867 | 622 days ago | 4 wei | ||||
Transfer | 17805867 | 622 days ago | 4 wei | ||||
Transfer | 17805867 | 622 days ago | 0.26 ETH | ||||
Deposit | 17805459 | 622 days ago | 1 wei | ||||
Exact Input Sing... | 17805459 | 622 days ago | 1 wei |
Loading...
Loading
Contract Name:
MiningRig
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // Shipped as BUSL-1.1 License pragma solidity ^0.8.17; import {SafeTransferLib} from "solady/src/utils/SafeTransferLib.sol"; contract MiningRig { uint256 public PID; address private immutable WETH; address private immutable NANO; address private immutable HOPPED; address private immutable DISTILLERY; INonfungiblePositionManager private immutable nonfungiblePositionManager; struct Mining { uint blockno; uint256 mined; uint256 totalMinedPositions; uint256 difficulty; uint256 virtualWeight; uint256 vPool; } struct MiningRewards { uint256 base; uint256 balance; uint256 frequency; uint256 held; uint256 debt; uint256 redeemable; } mapping(address => MiningRewards) public scores; Mining public rig; constructor( INonfungiblePositionManager _nonfungiblePositionManager, address _nano, address _hopped, address _weth, address _distillary ) { nonfungiblePositionManager = _nonfungiblePositionManager; NANO = _nano; HOPPED = _hopped; WETH = _weth; DISTILLERY = _distillary; SafeTransferLib.safeApprove(WETH, address(_nonfungiblePositionManager), type(uint256).max); } //ETHEREUM IS ULTRA SOUND MONEY function mineLiquidity(uint256 amountOutMinUniswap) payable external returns(uint128, uint newAllot, uint256 quote) { require(msg.value != 0, "NONZERO"); if (rig.totalMinedPositions <= 1000) require(msg.value <= 5 ether, "UNFAIR"); uint256 swappedAmtOut = _hopOnUniswap(amountOutMinUniswap); (uint128 liquidity, uint128 vliquidity ) = _addLiquidity(swappedAmtOut); uint256 _totalLiquidity = uint256(liquidity); uint256 _xt = _totalLiquidity + (_totalLiquidity+uint256(vliquidity)); quote = (_totalLiquidity * 4) + (swappedAmtOut * 8); MINEABLE(NANO).mintSupplyFromMinedLP(msg.sender, quote); if (scores[msg.sender].base == 0 && rig.blockno <= 9 ) scores[msg.sender].redeemable = rig.blockno + 1; scores[msg.sender].base += _xt + (_totalLiquidity * rig.difficulty); scores[msg.sender].balance = IERC20(NANO).balanceOf(msg.sender); ++scores[msg.sender].frequency; scores[msg.sender].held = IERC20(HOPPED).balanceOf(msg.sender); newAllot = _calculate(msg.sender); scores[msg.sender].debt += newAllot; rig.mined += newAllot; if (rig.difficulty != 0){ --rig.difficulty; } rig.vPool += swappedAmtOut; ++rig.totalMinedPositions; return (liquidity, newAllot, quote); } function _calculate(address _address) internal view returns(uint) { uint256 _alloc = scores[_address].base; _alloc += 1 << scores[_address].frequency; _alloc += scores[_address].held; _alloc += scores[_address].balance; return _alloc; } function score(address _address) external view returns(uint) { require(scores[_address].base != 0, "COPE"); return _calculate(_address); } function claim(address _address) external returns(uint){ require(scores[_address].base != 0, "COPE HARDER"); require(_address == msg.sender, "NOPE"); require(rig.blockno >= scores[_address].redeemable, "EARL LEE"); uint256 _hoppedBalance = IERC20(HOPPED).balanceOf(address(this)); uint256 totalDebt = _hoppedBalance * (scores[_address].debt / rig.mined); SafeTransferLib.safeApprove(HOPPED, _address, type(uint256).max); SafeTransferLib.safeTransfer(HOPPED, _address, totalDebt); scores[_address].base = 0; scores[_address].debt = 0; scores[_address].redeemable ++; return totalDebt; } function _hopOnUniswap( uint256 amountOutMin ) internal returns (uint amountOut) { amountOut = ISwapRouter(0xE592427A0AEce92De3Edee1F18E0157C05861564).exactInputSingle{value: msg.value >> 1}( ISwapRouter.ExactInputSingleParams({ tokenIn: WETH, tokenOut: HOPPED, fee: 3000, recipient: address(this), deadline: block.timestamp + 300, amountIn: msg.value >> 1, amountOutMinimum: amountOutMin, sqrtPriceLimitX96: 0 }) ); return amountOut; } function _addLiquidity( uint256 amountIn ) internal returns (uint128 liquidity, uint128 vliquidity) { IWETH(WETH).deposit{ value: msg.value >> 1 }(); IERC20(HOPPED).approve(address(nonfungiblePositionManager), type(uint256).max); IWETH(WETH).approve(address(nonfungiblePositionManager), type(uint256).max); INonfungiblePositionManager.IncreaseLiquidityParams memory params = INonfungiblePositionManager.IncreaseLiquidityParams({ tokenId: PID, amount0Desired: amountIn / rig.virtualWeight, amount1Desired: (msg.value >> 1) / rig.virtualWeight, amount0Min: 0, amount1Min: 0, deadline: block.timestamp + 300 }); uint256 amount0; uint256 amount1; (liquidity, amount0, amount1) = nonfungiblePositionManager.increaseLiquidity(params); return (liquidity, uint128(liquidity * uint128(rig.virtualWeight)) - liquidity); } function bootUp(uint256 amountOutMinUniswap ) payable external returns(uint256 lpTokenId, uint256 liquidity, uint amount0, uint amount1 ) { require(msg.value != 0, "Must pass non 0 ETH amount"); require(rig.virtualWeight == 0, "Set"); uint256 swappedAmtOut = _hopOnUniswap(amountOutMinUniswap); rig.difficulty = 1000; rig.virtualWeight = 16; (lpTokenId, liquidity, amount0, amount1) = _bootLiquidityPosition(swappedAmtOut, msg.value >> 1, 60, -211140, -210120); MINEABLE(NANO).activate(); PID = lpTokenId; return (liquidity, lpTokenId, amount0, amount1); } function _bootLiquidityPosition( uint amount0ToAdd, uint amount1ToAdd, int24 tickspacing, int24 mintick, int24 maxtick ) internal returns (uint tokenId, uint128 liquidity, uint amount0, uint amount1) { IWETH(WETH).deposit{ value: msg.value >> 1 }(); IERC20(HOPPED).approve(address(nonfungiblePositionManager), amount0ToAdd); IWETH(WETH).approve(address(nonfungiblePositionManager), amount1ToAdd); INonfungiblePositionManager.MintParams memory params = INonfungiblePositionManager.MintParams({ token0: HOPPED, token1: WETH, fee: 3000, tickLower: (mintick / tickspacing) * tickspacing, tickUpper: (maxtick / tickspacing) * tickspacing, amount0Desired: amount0ToAdd, amount1Desired: amount1ToAdd, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: block.timestamp }); (tokenId, liquidity, amount0, amount1) = nonfungiblePositionManager.mint( params ); return (tokenId, liquidity, amount0, amount1); } receive() external payable {} function sqrt96Tick( uint24 _fee, address _factory, address _token ) internal view returns (uint, int24) { (address _pool) = IUniswapV3Factory(_factory).getPool(_token, WETH, _fee); (uint160 sqrtPriceX96, int24 tick, , , , , ) = IUniswapV3Pool(_pool).slot0(); return ((uint(sqrtPriceX96) ** 2) * (1**18) / (192**2), tick); } function deltaNeutralLPContinuum( address _factory, uint128 _liquidity, uint amountOutMinUniswap, uint256 _virtualWeight, int24 _delta, uint24 _fee ) external payable returns(uint tokenId, uint128 liquidity ) { require(msg.value > 1 ether, "FEE"); (, int24 tick) = sqrt96Tick(_fee, _factory, HOPPED); _collectLpFees(PID); uint256 swappedAmtOut = _hopOnUniswap(amountOutMinUniswap); int24 TICK_SPACING = 60; IWETH(WETH).deposit{ value: msg.value >> 1 }(); IERC20(HOPPED).approve(address(nonfungiblePositionManager), swappedAmtOut); IWETH(WETH).approve(address(nonfungiblePositionManager), msg.value >> 1); INonfungiblePositionManager.MintParams memory params = INonfungiblePositionManager.MintParams({ token0: HOPPED, token1: WETH, fee: _fee, tickLower: ((tick - _delta) / TICK_SPACING) * TICK_SPACING, tickUpper: ((tick + _delta) / TICK_SPACING) * TICK_SPACING, amount0Desired: swappedAmtOut, amount1Desired: msg.value >> 1, amount0Min: 0, amount1Min: 0, recipient: address(this), deadline: block.timestamp + 300 }); (tokenId, liquidity, , ) = nonfungiblePositionManager.mint( params ); _produceLevelsFromPools(_liquidity, PID); _observeVirtualPoolCardinality(); PID = tokenId; rig.virtualWeight = _virtualWeight; _convertWETHforETH(); return (tokenId, liquidity); } function precision(uint a, uint b, uint _precision) internal pure returns ( uint) { return a*(10**_precision)/b; } function calculateBlock() internal view returns (uint) { uint256 _supply = IERC20(NANO).totalSupply(); uint256 _complete = precision(_supply, 420690000000000000000000000000000, 1); return _complete; } function finalizeBlock( uint128 liquidity, uint256 tokenId ) external returns(uint){ uint256 _block = calculateBlock(); require(_block != rig.blockno, 'UNMET'); _produceLevelsFromPools(liquidity, tokenId); rig.blockno = uint(_block); _observeVirtualPoolCardinality(); return _block; } function bribeForLevelReward() external payable returns (uint128 liquidity, uint256 amount0, uint256 amount1){ require(msg.value > 0.25 ether, "NONZERO"); uint256 _block = calculateBlock(); (,,,,,,,liquidity,,,,) = nonfungiblePositionManager.positions(PID); INonfungiblePositionManager.DecreaseLiquidityParams memory params = INonfungiblePositionManager.DecreaseLiquidityParams({ tokenId: PID, liquidity: liquidity, amount0Min: 0, amount1Min: 0, deadline: block.timestamp }); (amount0, amount1) = nonfungiblePositionManager.decreaseLiquidity(params); _observeVirtualPoolCardinality(); _convertWETHforETH(); rig.blockno = uint(_block); return (liquidity, amount0, amount1); } function _observeVirtualPoolCardinality() internal returns (uint){ SafeTransferLib.safeTransferETH(address(DISTILLERY), address(this).balance); uint256 _hoppedBalance = IERC20(HOPPED).balanceOf(address(this)); SafeTransferLib.safeApprove(HOPPED, address(DISTILLERY), type(uint256).max); SafeTransferLib.safeTransfer(HOPPED, address(DISTILLERY), _hoppedBalance >> 1); return _hoppedBalance; } function _convertWETHforETH() internal returns (bool){ IWETH(WETH).withdraw(IWETH(WETH).balanceOf(address(this))); SafeTransferLib.safeTransferETH(address(DISTILLERY), address(this).balance); return true; } function _produceLevelsFromPools( uint128 liquidity, uint256 tokenId ) internal returns (uint amount0, uint amount1) { INonfungiblePositionManager.DecreaseLiquidityParams memory params = INonfungiblePositionManager.DecreaseLiquidityParams({ tokenId: tokenId, liquidity: liquidity, amount0Min: 0, amount1Min: 0, deadline: block.timestamp }); (amount0, amount1) = nonfungiblePositionManager.decreaseLiquidity(params); return (amount0, amount1); } function _collectLpFees (uint256 tokenId) internal returns (uint amount0, uint amount1) { INonfungiblePositionManager.CollectParams memory params = INonfungiblePositionManager.CollectParams({ tokenId: tokenId, recipient: address(this), amount0Max: type(uint128).max, amount1Max: type(uint128).max }); (amount0, amount1) = nonfungiblePositionManager.collect(params); } function unifee(uint256 tokenId) external payable returns (uint amount0, uint amount1) { (amount0, amount1) = _collectLpFees(tokenId); } function locked() external payable returns (uint){ require(rig.blockno >= 9, "LOCKED"); require(msg.value > 0.25 ether, "NONZERO"); _collectLpFees(PID); _observeVirtualPoolCardinality(); _convertWETHforETH(); return PID; } } interface IUniswapV3Factory { function getPool( address tokenA, address tokenB, uint24 fee ) external view returns (address pool); } interface IUniswapV3PoolState { /// @notice The 0th storage slot in the pool stores many values, and is exposed as a single method to save gas /// when accessed externally. /// @return sqrtPriceX96 The current price of the pool as a sqrt(token1/token0) Q64.96 value /// tick The current tick of the pool, i.e. according to the last tick transition that was run. /// This value may not always be equal to SqrtTickMath.getTickAtSqrtRatio(sqrtPriceX96) if the price is on a tick /// boundary. /// observationIndex The index of the last oracle observation that was written, /// observationCardinality The current maximum number of observations stored in the pool, /// observationCardinalityNext The next maximum number of observations, to be updated when the observation. /// feeProtocol The protocol fee for both tokens of the pool. /// Encoded as two 4 bit values, where the protocol fee of token1 is shifted 4 bits and the protocol fee of token0 /// is the lower 4 bits. Used as the denominator of a fraction of the swap fee, e.g. 4 means 1/4th of the swap fee. /// unlocked Whether the pool is currently locked to reentrancy function slot0() external view returns ( uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked ); /// @notice The fee growth as a Q128.128 fees of token0 collected per unit of liquidity for the entire life of the pool /// @dev This value can overflow the uint256 function feeGrowthGlobal0X128() external view returns (uint256); /// @notice The fee growth as a Q128.128 fees of token1 collected per unit of liquidity for the entire life of the pool /// @dev This value can overflow the uint256 function feeGrowthGlobal1X128() external view returns (uint256); /// @notice The amounts of token0 and token1 that are owed to the protocol /// @dev Protocol fees will never exceed uint128 max in either token function protocolFees() external view returns (uint128 token0, uint128 token1); /// @notice The currently in range liquidity available to the pool /// @dev This value has no relationship to the total liquidity across all ticks function liquidity() external view returns (uint128); /// @notice Look up information about a specific tick in the pool /// @param tick The tick to look up /// @return liquidityGross the total amount of position liquidity that uses the pool either as tick lower or /// tick upper, /// liquidityNet how much liquidity changes when the pool price crosses the tick, /// feeGrowthOutside0X128 the fee growth on the other side of the tick from the current tick in token0, /// feeGrowthOutside1X128 the fee growth on the other side of the tick from the current tick in token1, /// tickCumulativeOutside the cumulative tick value on the other side of the tick from the current tick /// secondsPerLiquidityOutsideX128 the seconds spent per liquidity on the other side of the tick from the current tick, /// secondsOutside the seconds spent on the other side of the tick from the current tick, /// initialized Set to true if the tick is initialized, i.e. liquidityGross is greater than 0, otherwise equal to false. /// Outside values can only be used if the tick is initialized, i.e. if liquidityGross is greater than 0. /// In addition, these values are only relative and must be used only in comparison to previous snapshots for /// a specific position. function ticks(int24 tick) external view returns ( uint128 liquidityGross, int128 liquidityNet, uint256 feeGrowthOutside0X128, uint256 feeGrowthOutside1X128, int56 tickCumulativeOutside, uint160 secondsPerLiquidityOutsideX128, uint32 secondsOutside, bool initialized ); /// @notice Returns 256 packed tick initialized boolean values. See TickBitmap for more information function tickBitmap(int16 wordPosition) external view returns (uint256); /// @notice Returns the information about a position by the position's key /// @param key The position's key is a hash of a preimage composed by the owner, tickLower and tickUpper /// @return _liquidity The amount of liquidity in the position, /// Returns feeGrowthInside0LastX128 fee growth of token0 inside the tick range as of the last mint/burn/poke, /// Returns feeGrowthInside1LastX128 fee growth of token1 inside the tick range as of the last mint/burn/poke, /// Returns tokensOwed0 the computed amount of token0 owed to the position as of the last mint/burn/poke, /// Returns tokensOwed1 the computed amount of token1 owed to the position as of the last mint/burn/poke function positions(bytes32 key) external view returns ( uint128 _liquidity, uint256 feeGrowthInside0LastX128, uint256 feeGrowthInside1LastX128, uint128 tokensOwed0, uint128 tokensOwed1 ); /// @notice Returns data about a specific observation index /// @param index The element of the observations array to fetch /// @dev You most likely want to use #observe() instead of this method to get an observation as of some amount of time /// ago, rather than at a specific index in the array. /// @return blockTimestamp The timestamp of the observation, /// Returns tickCumulative the tick multiplied by seconds elapsed for the life of the pool as of the observation timestamp, /// Returns secondsPerLiquidityCumulativeX128 the seconds per in range liquidity for the life of the pool as of the observation timestamp, /// Returns initialized whether the observation has been initialized and the values are safe to use function observations(uint256 index) external view returns ( uint32 blockTimestamp, int56 tickCumulative, uint160 secondsPerLiquidityCumulativeX128, bool initialized ); } interface IUniswapV3Pool is IUniswapV3PoolState {} interface IERC20 { function totalSupply() external view returns (uint); function balanceOf(address account) external view returns (uint); function transfer(address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint amount) external returns (bool); function transferFrom( address sender, address recipient, uint amount ) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); } 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 MINEABLE { function mintSupplyFromMinedLP(address miner, uint256 value) external; function activate() external; } interface IWETH is IERC20 { function deposit() external payable; function withdraw(uint amount) external; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.4; /// @notice Safe ETH and ERC20 transfer library that gracefully handles missing return values. /// @author Solady (https://github.com/vectorized/solady/blob/main/src/utils/SafeTransferLib.sol) /// @author Modified from Solmate (https://github.com/transmissions11/solmate/blob/main/src/utils/SafeTransferLib.sol) /// @dev Caution! This library won't check that a token has code, responsibility is delegated to the caller. library SafeTransferLib { /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CUSTOM ERRORS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev The ETH transfer has failed. error ETHTransferFailed(); /// @dev The ERC20 `transferFrom` has failed. error TransferFromFailed(); /// @dev The ERC20 `transfer` has failed. error TransferFailed(); /// @dev The ERC20 `approve` has failed. error ApproveFailed(); /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* CONSTANTS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Suggested gas stipend for contract receiving ETH /// that disallows any storage writes. uint256 internal constant _GAS_STIPEND_NO_STORAGE_WRITES = 2300; /// @dev Suggested gas stipend for contract receiving ETH to perform a few /// storage reads and writes, but low enough to prevent griefing. /// Multiply by a small constant (e.g. 2), if needed. uint256 internal constant _GAS_STIPEND_NO_GRIEF = 100000; /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ETH OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Sends `amount` (in wei) ETH to `to`. /// Reverts upon failure. function safeTransferETH(address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { // Transfer the ETH and check if it succeeded or not. if iszero(call(gas(), to, amount, 0, 0, 0, 0)) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } } } /// @dev Force sends `amount` (in wei) ETH to `to`, with a `gasStipend`. /// The `gasStipend` can be set to a low enough value to prevent /// storage writes or gas griefing. /// /// If sending via the normal procedure fails, force sends the ETH by /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH. /// /// Reverts if the current contract has insufficient balance. function forceSafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal { /// @solidity memory-safe-assembly assembly { // If insufficient balance, revert. if lt(selfbalance(), amount) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } // Transfer the ETH and check if it succeeded or not. if iszero(call(gasStipend, to, amount, 0, 0, 0, 0)) { mstore(0x00, to) // Store the address in scratch space. mstore8(0x0b, 0x73) // Opcode `PUSH20`. mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`. // We can directly use `SELFDESTRUCT` in the contract creation. // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758 if iszero(create(amount, 0x0b, 0x16)) { // For better gas estimation. if iszero(gt(gas(), 1000000)) { revert(0, 0) } } } } } /// @dev Force sends `amount` (in wei) ETH to `to`, with a gas stipend /// equal to `_GAS_STIPEND_NO_GRIEF`. This gas stipend is a reasonable default /// for 99% of cases and can be overriden with the three-argument version of this /// function if necessary. /// /// If sending via the normal procedure fails, force sends the ETH by /// creating a temporary contract which uses `SELFDESTRUCT` to force send the ETH. /// /// Reverts if the current contract has insufficient balance. function forceSafeTransferETH(address to, uint256 amount) internal { // Manually inlined because the compiler doesn't inline functions with branches. /// @solidity memory-safe-assembly assembly { // If insufficient balance, revert. if lt(selfbalance(), amount) { // Store the function selector of `ETHTransferFailed()`. mstore(0x00, 0xb12d13eb) // Revert with (offset, size). revert(0x1c, 0x04) } // Transfer the ETH and check if it succeeded or not. if iszero(call(_GAS_STIPEND_NO_GRIEF, to, amount, 0, 0, 0, 0)) { mstore(0x00, to) // Store the address in scratch space. mstore8(0x0b, 0x73) // Opcode `PUSH20`. mstore8(0x20, 0xff) // Opcode `SELFDESTRUCT`. // We can directly use `SELFDESTRUCT` in the contract creation. // Compatible with `SENDALL`: https://eips.ethereum.org/EIPS/eip-4758 if iszero(create(amount, 0x0b, 0x16)) { // For better gas estimation. if iszero(gt(gas(), 1000000)) { revert(0, 0) } } } } } /// @dev Sends `amount` (in wei) ETH to `to`, with a `gasStipend`. /// The `gasStipend` can be set to a low enough value to prevent /// storage writes or gas griefing. /// /// Simply use `gasleft()` for `gasStipend` if you don't need a gas stipend. /// /// Note: Does NOT revert upon failure. /// Returns whether the transfer of ETH is successful instead. function trySafeTransferETH(address to, uint256 amount, uint256 gasStipend) internal returns (bool success) { /// @solidity memory-safe-assembly assembly { // Transfer the ETH and check if it succeeded or not. success := call(gasStipend, to, amount, 0, 0, 0, 0) } } /*´:°•.°+.*•´.*:˚.°*.˚•´.°:°•.°•.*•´.*:˚.°*.˚•´.°:°•.°+.*•´.*:*/ /* ERC20 OPERATIONS */ /*.•°:°.´+˚.*°.˚:*.´•*.+°.•°:´*.´•*.•°.•°:°.´:•˚°.*°.˚:*.´+°.•*/ /// @dev Sends `amount` of ERC20 `token` from `from` to `to`. /// Reverts upon failure. /// /// The `from` account must have at least `amount` approved for /// the current contract to manage. function safeTransferFrom(address token, address from, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Cache the free memory pointer. mstore(0x60, amount) // Store the `amount` argument. mstore(0x40, to) // Store the `to` argument. mstore(0x2c, shl(96, from)) // Store the `from` argument. // Store the function selector of `transferFrom(address,address,uint256)`. mstore(0x0c, 0x23b872dd000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, m) // Restore the free memory pointer. } } /// @dev Sends all of ERC20 `token` from `from` to `to`. /// Reverts upon failure. /// /// The `from` account must have at least `amount` approved for /// the current contract to manage. function safeTransferAllFrom(address token, address from, address to) internal returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { let m := mload(0x40) // Cache the free memory pointer. mstore(0x40, to) // Store the `to` argument. mstore(0x2c, shl(96, from)) // Store the `from` argument. // Store the function selector of `balanceOf(address)`. mstore(0x0c, 0x70a08231000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x1c, 0x24, 0x60, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } // Store the function selector of `transferFrom(address,address,uint256)`. mstore(0x00, 0x23b872dd) // The `amount` argument is already written to the memory word at 0x6c. amount := mload(0x60) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x1c, 0x64, 0x00, 0x20) ) ) { // Store the function selector of `TransferFromFailed()`. mstore(0x00, 0x7939f424) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x60, 0) // Restore the zero slot to zero. mstore(0x40, m) // Restore the free memory pointer. } } /// @dev Sends `amount` of ERC20 `token` from the current contract to `to`. /// Reverts upon failure. function safeTransfer(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { mstore(0x14, to) // Store the `to` argument. mstore(0x34, amount) // Store the `amount` argument. // Store the function selector of `transfer(address,uint256)`. mstore(0x00, 0xa9059cbb000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Sends all of ERC20 `token` from the current contract to `to`. /// Reverts upon failure. function safeTransferAll(address token, address to) internal returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { mstore(0x00, 0x70a08231) // Store the function selector of `balanceOf(address)`. mstore(0x20, address()) // Store the address of the current contract. if iszero( and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x1c, 0x24, 0x34, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } mstore(0x14, to) // Store the `to` argument. // The `amount` argument is already written to the memory word at 0x34. amount := mload(0x34) // Store the function selector of `transfer(address,uint256)`. mstore(0x00, 0xa9059cbb000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `TransferFailed()`. mstore(0x00, 0x90b8ec18) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Sets `amount` of ERC20 `token` for `to` to manage on behalf of the current contract. /// Reverts upon failure. function safeApprove(address token, address to, uint256 amount) internal { /// @solidity memory-safe-assembly assembly { mstore(0x14, to) // Store the `to` argument. mstore(0x34, amount) // Store the `amount` argument. // Store the function selector of `approve(address,uint256)`. mstore(0x00, 0x095ea7b3000000000000000000000000) if iszero( and( // The arguments of `and` are evaluated from right to left. // Set success to whether the call reverted, if not we check it either // returned exactly 1 (can't just be non-zero data), or had no return data. or(eq(mload(0x00), 1), iszero(returndatasize())), call(gas(), token, 0, 0x10, 0x44, 0x00, 0x20) ) ) { // Store the function selector of `ApproveFailed()`. mstore(0x00, 0x3e3f8f73) // Revert with (offset, size). revert(0x1c, 0x04) } // Restore the part of the free memory pointer that was overwritten. mstore(0x34, 0) } } /// @dev Returns the amount of ERC20 `token` owned by `account`. /// Returns zero if the `token` does not exist. function balanceOf(address token, address account) internal view returns (uint256 amount) { /// @solidity memory-safe-assembly assembly { mstore(0x14, account) // Store the `account` argument. // Store the function selector of `balanceOf(address)`. mstore(0x00, 0x70a08231000000000000000000000000) amount := mul( mload(0x20), and( // The arguments of `and` are evaluated from right to left. gt(returndatasize(), 0x1f), // At least 32 bytes returned. staticcall(gas(), token, 0x10, 0x24, 0x20, 0x20) ) ) } } }
{ "evmVersion": "london", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 5000 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract INonfungiblePositionManager","name":"_nonfungiblePositionManager","type":"address"},{"internalType":"address","name":"_nano","type":"address"},{"internalType":"address","name":"_hopped","type":"address"},{"internalType":"address","name":"_weth","type":"address"},{"internalType":"address","name":"_distillary","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"PID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMinUniswap","type":"uint256"}],"name":"bootUp","outputs":[{"internalType":"uint256","name":"lpTokenId","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"bribeForLevelReward","outputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"claim","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"uint128","name":"_liquidity","type":"uint128"},{"internalType":"uint256","name":"amountOutMinUniswap","type":"uint256"},{"internalType":"uint256","name":"_virtualWeight","type":"uint256"},{"internalType":"int24","name":"_delta","type":"int24"},{"internalType":"uint24","name":"_fee","type":"uint24"}],"name":"deltaNeutralLPContinuum","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint128","name":"liquidity","type":"uint128"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint128","name":"liquidity","type":"uint128"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"finalizeBlock","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMinUniswap","type":"uint256"}],"name":"mineLiquidity","outputs":[{"internalType":"uint128","name":"","type":"uint128"},{"internalType":"uint256","name":"newAllot","type":"uint256"},{"internalType":"uint256","name":"quote","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"rig","outputs":[{"internalType":"uint256","name":"blockno","type":"uint256"},{"internalType":"uint256","name":"mined","type":"uint256"},{"internalType":"uint256","name":"totalMinedPositions","type":"uint256"},{"internalType":"uint256","name":"difficulty","type":"uint256"},{"internalType":"uint256","name":"virtualWeight","type":"uint256"},{"internalType":"uint256","name":"vPool","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"score","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"scores","outputs":[{"internalType":"uint256","name":"base","type":"uint256"},{"internalType":"uint256","name":"balance","type":"uint256"},{"internalType":"uint256","name":"frequency","type":"uint256"},{"internalType":"uint256","name":"held","type":"uint256"},{"internalType":"uint256","name":"debt","type":"uint256"},{"internalType":"uint256","name":"redeemable","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"unifee","outputs":[{"internalType":"uint256","name":"amount0","type":"uint256"},{"internalType":"uint256","name":"amount1","type":"uint256"}],"stateMutability":"payable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
6101206040523480156200001257600080fd5b5060405162003027380380620030278339810160408190526200003591620000ed565b6001600160a01b038581166101005284811660a05283811660c052828116608081905290821660e05262000079908660001962000084602090811b6200147017901c565b50505050506200016d565b81601452806034526f095ea7b300000000000000000000000060005260206000604460106000875af13d156001600051141716620000ca57633e3f8f736000526004601cfd5b6000603452505050565b6001600160a01b0381168114620000ea57600080fd5b50565b600080600080600060a086880312156200010657600080fd5b85516200011381620000d4565b60208701519095506200012681620000d4565b60408701519094506200013981620000d4565b60608701519093506200014c81620000d4565b60808701519092506200015f81620000d4565b809150509295509295909350565b60805160a05160c05160e05161010051612d56620002d16000396000818161038f015281816104780152818161090a015281816109db01528181610ba801528181611a4001528181611cf801528181611e2301528181611ef4015281816120770152818161224201528181612314015261248201526000818161157001528181611661015281816116ae01526117dd0152600081816106790152818161072a015281816107570152818161081e0152818161093901528181610a8a015281816111ea015281816115c6015281816116400152818161168d01528181611b2001528181611e5201528181611fa10152612272015260008181610dae015281816110050152818161111a01526114c401526000818161086701528181610a0c01528181610ab90152818161170d0152818161188501528181611af101528181611d8001528181611f2301528181611fd00152818161219f01526123440152612d566000f3fe6080604052600436106100cb5760003560e01c80635eaec0e4116100745780638e8ce9371161004e5780638e8ce937146102b3578063cf309012146102c6578063e1c1d37d146102ce57600080fd5b80635eaec0e41461022c57806376dd110f14610242578063776f38431461029357600080fd5b80632cee8e93116100a55780632cee8e93146101795780634de2d5e0146101a1578063536e60cd146101d457600080fd5b80630758eac2146100d75780631e83409a14610112578063297684eb1461014057600080fd5b366100d257005b600080fd5b6100df6102ee565b604080516fffffffffffffffffffffffffffffffff90941684526020840192909252908201526060015b60405180910390f35b34801561011e57600080fd5b5061013261012d366004612580565b61051a565b604051908152602001610109565b61015361014e3660046125db565b6107bb565b604080519283526fffffffffffffffffffffffffffffffff909116602083015201610109565b61018c61018736600461264b565b610c62565b60408051928352602083019190915201610109565b6101b46101af36600461264b565b610c78565b604080519485526020850193909352918301526060820152608001610109565b3480156101e057600080fd5b506002546003546004546005546006546007546101ff95949392919086565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610109565b34801561023857600080fd5b5061013260005481565b34801561024e57600080fd5b506101ff61025d366004612580565b60016020819052600091825260409091208054918101546002820154600383015460048401546005909401549293919290919086565b34801561029f57600080fd5b506101326102ae366004612580565b610e2f565b6100df6102c136600461264b565b610ea7565b61013261131b565b3480156102da57600080fd5b506101326102e9366004612664565b6113f0565b60008060006703782dace9d90000341161034f5760405162461bcd60e51b815260206004820152600760248201527f4e4f4e5a45524f0000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60006103596114bf565b6000546040517f99fbab880000000000000000000000000000000000000000000000000000000081529192506001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916399fbab88916103c69160040190815260200190565b61018060405180830381865afa1580156103e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040891906126bc565b50506040805160a0810182526000805482526fffffffffffffffffffffffffffffffff86166020830152818301819052606082015242608082015290517f0c49ccbe000000000000000000000000000000000000000000000000000000008152939e509950506001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169750630c49ccbe96506104b6955088945050600401915061279d9050565b60408051808303816000875af11580156104d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f891906127e9565b9094509250610505611569565b5061050e6116dc565b50506002559192909190565b6001600160a01b03811660009081526001602052604081205481036105815760405162461bcd60e51b815260206004820152600b60248201527f434f5045204841524445520000000000000000000000000000000000000000006044820152606401610346565b6001600160a01b03821633146105db5760405162461bcd60e51b81526004016103469060208082526004908201527f4e4f504500000000000000000000000000000000000000000000000000000000604082015260600190565b6001600160a01b03821660009081526001602052604090206005015460025410156106485760405162461bcd60e51b815260206004820152600860248201527f4541524c204c45450000000000000000000000000000000000000000000000006044820152606401610346565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa1580156106c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ec919061280d565b6003546001600160a01b038516600090815260016020526040812060040154929350916107199190612884565b6107239083612898565b90506107527f000000000000000000000000000000000000000000000000000000000000000085600019611470565b61077d7f00000000000000000000000000000000000000000000000000000000000000008583611808565b6001600160a01b0384166000908152600160205260408120818155600481018290556005018054916107ae836128af565b9091555090949350505050565b600080670de0b6b3a764000034116108155760405162461bcd60e51b815260206004820152600360248201527f46454500000000000000000000000000000000000000000000000000000000006044820152606401610346565b6000610842848a7f000000000000000000000000000000000000000000000000000000000000000061184d565b9150506108506000546119b6565b5050600061085d88611ab9565b90506000603c90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0600134901c6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108c457600080fd5b505af11580156108d8573d6000803e3d6000fd5b50506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018790527f000000000000000000000000000000000000000000000000000000000000000016935063095ea7b3925060440190506020604051808303816000875af1158015610986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109aa91906128d9565b506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000811660048301523460011c60248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015610a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7991906128d9565b5060006040518061016001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020018862ffffff16815260200183848b88610aff91906128f4565b610b099190612919565b610b139190612953565b60020b81526020018380610b278c8961297a565b610b319190612919565b610b3b9190612953565b60020b8152602081018590523460011c604082015260006060820181905260808201523060a082015260c001610b734261012c61299f565b90526040517f883164560000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690638831645690610bdd9084906004016129b2565b6080604051808303816000875af1158015610bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c209190612a76565b50506000549197509550610c35908c90611c69565b5050610c3f611569565b5060008690556006899055610c526116dc565b5050505050965096945050505050565b600080610c6e836119b6565b9094909350915050565b60008060008034600003610cce5760405162461bcd60e51b815260206004820152601a60248201527f4d7573742070617373206e6f6e20302045544820616d6f756e740000000000006044820152606401610346565b60065415610d1e5760405162461bcd60e51b815260206004820152600360248201527f53657400000000000000000000000000000000000000000000000000000000006044820152606401610346565b6000610d2986611ab9565b6103e860055560106006559050610d87813460011c603c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc73c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffccb38611d78565b826fffffffffffffffffffffffffffffffff169250809550819650829750839850505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316630f15f4c06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b505050600086905550929392509193509193565b6001600160a01b0381166000908152600160205260408120548103610e985760405162461bcd60e51b81526004016103469060208082526004908201527f434f504500000000000000000000000000000000000000000000000000000000604082015260600190565b610ea182612118565b92915050565b600080600034600003610efc5760405162461bcd60e51b815260206004820152600760248201527f4e4f4e5a45524f000000000000000000000000000000000000000000000000006044820152606401610346565b6004546103e810610f5f57674563918244f40000341115610f5f5760405162461bcd60e51b815260206004820152600660248201527f554e4641495200000000000000000000000000000000000000000000000000006044820152606401610346565b6000610f6a85611ab9565b9050600080610f788361219a565b90925090506fffffffffffffffffffffffffffffffff80831690600090610fa19084168361299f565b610fab908361299f565b9050610fb8856008612898565b610fc3836004612898565b610fcd919061299f565b6040517f5372b2f6000000000000000000000000000000000000000000000000000000008152336004820152602481018290529096507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690635372b2f690604401600060405180830381600087803b15801561105157600080fd5b505af1158015611065573d6000803e3d6000fd5b50503360009081526001602052604090205415915050801561108a5750600254600910155b156110b15760025461109d90600161299f565b336000908152600160205260409020600501555b6005546110be9083612898565b6110c8908261299f565b33600090815260016020526040812080549091906110e790849061299f565b90915550506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d919061280d565b336000908152600160208190526040822090810192909255600290910180549091906111b8906128af565b909155506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d919061280d565b3360008181526001602052604090206003019190915561127c90612118565b336000908152600160205260408120600401805492995089929091906112a390849061299f565b9091555050600380548891906000906112bd90849061299f565b9091555050600554156112df57600580546000906112da90612ab4565b909155505b84600260050160008282546112f4919061299f565b909155505060048054600090611309906128af565b90915550929650505050509193909250565b6000600960026000015410156113735760405162461bcd60e51b815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610346565b6703782dace9d9000034116113ca5760405162461bcd60e51b815260206004820152600760248201527f4e4f4e5a45524f000000000000000000000000000000000000000000000000006044820152606401610346565b6113d56000546119b6565b50506113df611569565b506113e86116dc565b505060005490565b6000806113fb6114bf565b600254909150810361144f5760405162461bcd60e51b815260206004820152600560248201527f554e4d45540000000000000000000000000000000000000000000000000000006044820152606401610346565b6114598484611c69565b50506002819055611468611569565b509392505050565b81601452806034526f095ea7b300000000000000000000000060005260206000604460106000875af13d1560016000511417166114b557633e3f8f736000526004601cfd5b6000603452505050565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611520573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611544919061280d565b90506000611562826d14bddab3e51a57cff87a50000000600161251e565b9392505050565b60006115957f000000000000000000000000000000000000000000000000000000000000000047612548565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611615573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611639919061280d565b90506116887f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600019611470565b6116d77f00000000000000000000000000000000000000000000000000000000000000007f0000000000000000000000000000000000000000000000000000000000000000600184901c611808565b919050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015611764573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611788919061280d565b6040518263ffffffff1660e01b81526004016117a691815260200190565b600060405180830381600087803b1580156117c057600080fd5b505af11580156117d4573d6000803e3d6000fd5b505050506118027f000000000000000000000000000000000000000000000000000000000000000047612548565b50600190565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d1560016000511417166114b5576390b8ec186000526004601cfd5b6040517f1698ee820000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f00000000000000000000000000000000000000000000000000000000000000008116602483015262ffffff851660448301526000918291829190861690631698ee8290606401602060405180830381865afa1580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b9190612acb565b9050600080826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561194e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119729190612afa565b5050505050915091506190006002836001600160a01b03166119949190612c71565b61199f906001612898565b6119a99190612884565b9890975095505050505050565b6040805160808101825282815230602082019081526fffffffffffffffffffffffffffffffff8284018181526060840182815294517ffc6f78650000000000000000000000000000000000000000000000000000000081528451600482015292516001600160a01b03908116602485015290518216604484015293511660648201526000928392917f00000000000000000000000000000000000000000000000000000000000000009091169063fc6f78659060840160408051808303816000875af1158015611a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aae91906127e9565b909590945092505050565b600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663414bf389600134901c6040518061010001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b031681526020014261012c611b77919061299f565b81523460011c60208083019190915260408083018990526000606093840152805160e087811b7fffffffff0000000000000000000000000000000000000000000000000000000016825285516001600160a01b03908116600484015293860151841660248301529185015162ffffff16604482015292840151821660648401526080840151608484015260a084015160a484015260c084015160c4840152929092015190911660e48201526101040160206040518083038185885af1158015611c44573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ea1919061280d565b6040805160a0810182528281526fffffffffffffffffffffffffffffffff84811660208301908152600083850181815260608501828152426080870190815296517f0c49ccbe00000000000000000000000000000000000000000000000000000000815286516004820152935190941660248401525160448301529151606482015292516084840152918291907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690630c49ccbe9060a40160408051808303816000875af1158015611d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6c91906127e9565b90969095509350505050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0600134901c6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b50506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018e90527f000000000000000000000000000000000000000000000000000000000000000016935063095ea7b3925060440190506020604051808303816000875af1158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec391906128d9565b506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000081166004830152602482018a90527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af1158015611f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9091906128d9565b5060006040518061016001604052807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031681526020017f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168152602001610bb862ffffff168152602001898a8a6120179190612919565b6120219190612953565b60020b815260200189612034818a612919565b61203e9190612953565b60020b81526020018b81526020018a81526020016000815260200160008152602001306001600160a01b031681526020014281525090507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03166388316456826040518263ffffffff1660e01b81526004016120c191906129b2565b6080604051808303816000875af11580156120e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121049190612a76565b929d919c509a509098509650505050505050565b6001600160a01b0381166000908152600160208190526040822080546002909101549091612147911b8261299f565b6001600160a01b038416600090815260016020526040902060030154909150612170908261299f565b6001600160a01b03841660009081526001602081905260409091200154909150611562908261299f565b6000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0600134901c6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121fc57600080fd5b505af1158015612210573d6000803e3d6000fd5b50506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260001960248301527f000000000000000000000000000000000000000000000000000000000000000016935063095ea7b3925060440190506020604051808303816000875af11580156122bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e391906128d9565b506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116600483015260001960248301527f0000000000000000000000000000000000000000000000000000000000000000169063095ea7b3906044016020604051808303816000875af115801561238d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b191906128d9565b5060006040518060c001604052806000548152602001600260040154866123d89190612884565b81526006546020909101906123f0903460011c612884565b8152600060208201819052604082015260600161240f4261012c61299f565b9052604080517f219f5d170000000000000000000000000000000000000000000000000000000081528251600482015260208301516024820152908201516044820152606082015160648201526080820151608482015260a082015160a482015290915060009081906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169063219f5d179060c4016060604051808303816000875af11580156124cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ef9190612c80565b6006549297509093509150859081906125089082612cb7565b6125129190612ceb565b94509450505050915091565b60008261252c83600a612d14565b6125369086612898565b6125409190612884565b949350505050565b60008060008084865af16125645763b12d13eb6000526004601cfd5b5050565b6001600160a01b038116811461257d57600080fd5b50565b60006020828403121561259257600080fd5b813561156281612568565b6fffffffffffffffffffffffffffffffff8116811461257d57600080fd5b8060020b811461257d57600080fd5b62ffffff8116811461257d57600080fd5b60008060008060008060c087890312156125f457600080fd5b86356125ff81612568565b9550602087013561260f8161259d565b94506040870135935060608701359250608087013561262d816125bb565b915060a087013561263d816125ca565b809150509295509295509295565b60006020828403121561265d57600080fd5b5035919050565b6000806040838503121561267757600080fd5b82356126828161259d565b946020939093013593505050565b80516116d781612568565b80516116d7816125ca565b80516116d7816125bb565b80516116d78161259d565b6000806000806000806000806000806000806101808d8f0312156126df57600080fd5b8c516bffffffffffffffffffffffff811681146126fb57600080fd5b9b5061270960208e01612690565b9a5061271760408e01612690565b995061272560608e01612690565b985061273360808e0161269b565b975061274160a08e016126a6565b965061274f60c08e016126a6565b955061275d60e08e016126b1565b94506101008d015193506101208d0151925061277c6101408e016126b1565b915061278b6101608e016126b1565b90509295989b509295989b509295989b565b600060a082019050825182526fffffffffffffffffffffffffffffffff602084015116602083015260408301516040830152606083015160608301526080830151608083015292915050565b600080604083850312156127fc57600080fd5b505080516020909101519092909150565b60006020828403121561281f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008261289357612893612826565b500490565b8082028115828204841417610ea157610ea1612855565b600060001982036128c2576128c2612855565b5060010190565b805180151581146116d757600080fd5b6000602082840312156128eb57600080fd5b611562826128c9565b600282810b9082900b03627fffff198112627fffff82131715610ea157610ea1612855565b60008160020b8360020b8061293057612930612826565b6000198114627fffff198314161561294a5761294a612855565b90059392505050565b60008260020b8260020b028060020b915080821461297357612973612855565b5092915050565b600281810b9083900b01627fffff8113627fffff1982121715610ea157610ea1612855565b80820180821115610ea157610ea1612855565b81516001600160a01b03168152610160810160208301516129de60208401826001600160a01b03169052565b5060408301516129f5604084018262ffffff169052565b506060830151612a0a606084018260020b9052565b506080830151612a1f608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151612a65828501826001600160a01b03169052565b505061014092830151919092015290565b60008060008060808587031215612a8c57600080fd5b845193506020850151612a9e8161259d565b6040860151606090960151949790965092505050565b600081612ac357612ac3612855565b506000190190565b600060208284031215612add57600080fd5b815161156281612568565b805161ffff811681146116d757600080fd5b600080600080600080600060e0888a031215612b1557600080fd5b8751612b2081612568565b6020890151909750612b31816125bb565b9550612b3f60408901612ae8565b9450612b4d60608901612ae8565b9350612b5b60808901612ae8565b925060a088015160ff81168114612b7157600080fd5b9150612b7f60c089016128c9565b905092959891949750929550565b600181815b80851115612bc8578160001904821115612bae57612bae612855565b80851615612bbb57918102915b93841c9390800290612b92565b509250929050565b600082612bdf57506001610ea1565b81612bec57506000610ea1565b8160018114612c025760028114612c0c57612c28565b6001915050610ea1565b60ff841115612c1d57612c1d612855565b50506001821b610ea1565b5060208310610133831016604e8410600b8410161715612c4b575081810a610ea1565b612c558383612b8d565b8060001904821115612c6957612c69612855565b029392505050565b600061156260ff841683612bd0565b600080600060608486031215612c9557600080fd5b8351612ca08161259d565b602085015160409095015190969495509392505050565b6fffffffffffffffffffffffffffffffff818116838216028082169190828114612ce357612ce3612855565b505092915050565b6fffffffffffffffffffffffffffffffff82811682821603908082111561297357612973612855565b60006115628383612bd056fea26469706673582212201ad7b1680764c1cef6a57b0fd69dae92bde3af8e9f99eb1f0219ecf24d59e69464736f6c63430008110033000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe880000000000000000000000001d4214081985ad20aa3ca93a2206ae792635cbec0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000017cc6042605381c158d2adab487434bde79aa61c
Deployed Bytecode
0x6080604052600436106100cb5760003560e01c80635eaec0e4116100745780638e8ce9371161004e5780638e8ce937146102b3578063cf309012146102c6578063e1c1d37d146102ce57600080fd5b80635eaec0e41461022c57806376dd110f14610242578063776f38431461029357600080fd5b80632cee8e93116100a55780632cee8e93146101795780634de2d5e0146101a1578063536e60cd146101d457600080fd5b80630758eac2146100d75780631e83409a14610112578063297684eb1461014057600080fd5b366100d257005b600080fd5b6100df6102ee565b604080516fffffffffffffffffffffffffffffffff90941684526020840192909252908201526060015b60405180910390f35b34801561011e57600080fd5b5061013261012d366004612580565b61051a565b604051908152602001610109565b61015361014e3660046125db565b6107bb565b604080519283526fffffffffffffffffffffffffffffffff909116602083015201610109565b61018c61018736600461264b565b610c62565b60408051928352602083019190915201610109565b6101b46101af36600461264b565b610c78565b604080519485526020850193909352918301526060820152608001610109565b3480156101e057600080fd5b506002546003546004546005546006546007546101ff95949392919086565b604080519687526020870195909552938501929092526060840152608083015260a082015260c001610109565b34801561023857600080fd5b5061013260005481565b34801561024e57600080fd5b506101ff61025d366004612580565b60016020819052600091825260409091208054918101546002820154600383015460048401546005909401549293919290919086565b34801561029f57600080fd5b506101326102ae366004612580565b610e2f565b6100df6102c136600461264b565b610ea7565b61013261131b565b3480156102da57600080fd5b506101326102e9366004612664565b6113f0565b60008060006703782dace9d90000341161034f5760405162461bcd60e51b815260206004820152600760248201527f4e4f4e5a45524f0000000000000000000000000000000000000000000000000060448201526064015b60405180910390fd5b60006103596114bf565b6000546040517f99fbab880000000000000000000000000000000000000000000000000000000081529192506001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8816916399fbab88916103c69160040190815260200190565b61018060405180830381865afa1580156103e4573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061040891906126bc565b50506040805160a0810182526000805482526fffffffffffffffffffffffffffffffff86166020830152818301819052606082015242608082015290517f0c49ccbe000000000000000000000000000000000000000000000000000000008152939e509950506001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88169750630c49ccbe96506104b6955088945050600401915061279d9050565b60408051808303816000875af11580156104d4573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906104f891906127e9565b9094509250610505611569565b5061050e6116dc565b50506002559192909190565b6001600160a01b03811660009081526001602052604081205481036105815760405162461bcd60e51b815260206004820152600b60248201527f434f5045204841524445520000000000000000000000000000000000000000006044820152606401610346565b6001600160a01b03821633146105db5760405162461bcd60e51b81526004016103469060208082526004908201527f4e4f504500000000000000000000000000000000000000000000000000000000604082015260600190565b6001600160a01b03821660009081526001602052604090206005015460025410156106485760405162461bcd60e51b815260206004820152600860248201527f4541524c204c45450000000000000000000000000000000000000000000000006044820152606401610346565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b0316906370a0823190602401602060405180830381865afa1580156106c8573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106ec919061280d565b6003546001600160a01b038516600090815260016020526040812060040154929350916107199190612884565b6107239083612898565b90506107527f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193385600019611470565b61077d7f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119338583611808565b6001600160a01b0384166000908152600160205260408120818155600481018290556005018054916107ae836128af565b9091555090949350505050565b600080670de0b6b3a764000034116108155760405162461bcd60e51b815260206004820152600360248201527f46454500000000000000000000000000000000000000000000000000000000006044820152606401610346565b6000610842848a7f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193361184d565b9150506108506000546119b6565b5050600061085d88611ab9565b90506000603c90507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0600134901c6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156108c457600080fd5b505af11580156108d8573d6000803e3d6000fd5b50506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8881166004830152602482018790527f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193316935063095ea7b3925060440190506020604051808303816000875af1158015610986573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109aa91906128d9565b506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88811660048301523460011c60248301527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063095ea7b3906044016020604051808303816000875af1158015610a55573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a7991906128d9565b5060006040518061016001604052807f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b031681526020017f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020018862ffffff16815260200183848b88610aff91906128f4565b610b099190612919565b610b139190612953565b60020b81526020018380610b278c8961297a565b610b319190612919565b610b3b9190612953565b60020b8152602081018590523460011c604082015260006060820181905260808201523060a082015260c001610b734261012c61299f565b90526040517f883164560000000000000000000000000000000000000000000000000000000081529091506001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe881690638831645690610bdd9084906004016129b2565b6080604051808303816000875af1158015610bfc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c209190612a76565b50506000549197509550610c35908c90611c69565b5050610c3f611569565b5060008690556006899055610c526116dc565b5050505050965096945050505050565b600080610c6e836119b6565b9094909350915050565b60008060008034600003610cce5760405162461bcd60e51b815260206004820152601a60248201527f4d7573742070617373206e6f6e20302045544820616d6f756e740000000000006044820152606401610346565b60065415610d1e5760405162461bcd60e51b815260206004820152600360248201527f53657400000000000000000000000000000000000000000000000000000000006044820152606401610346565b6000610d2986611ab9565b6103e860055560106006559050610d87813460011c603c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffcc73c7ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffccb38611d78565b826fffffffffffffffffffffffffffffffff169250809550819650829750839850505050507f0000000000000000000000001d4214081985ad20aa3ca93a2206ae792635cbec6001600160a01b0316630f15f4c06040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610e0757600080fd5b505af1158015610e1b573d6000803e3d6000fd5b505050600086905550929392509193509193565b6001600160a01b0381166000908152600160205260408120548103610e985760405162461bcd60e51b81526004016103469060208082526004908201527f434f504500000000000000000000000000000000000000000000000000000000604082015260600190565b610ea182612118565b92915050565b600080600034600003610efc5760405162461bcd60e51b815260206004820152600760248201527f4e4f4e5a45524f000000000000000000000000000000000000000000000000006044820152606401610346565b6004546103e810610f5f57674563918244f40000341115610f5f5760405162461bcd60e51b815260206004820152600660248201527f554e4641495200000000000000000000000000000000000000000000000000006044820152606401610346565b6000610f6a85611ab9565b9050600080610f788361219a565b90925090506fffffffffffffffffffffffffffffffff80831690600090610fa19084168361299f565b610fab908361299f565b9050610fb8856008612898565b610fc3836004612898565b610fcd919061299f565b6040517f5372b2f6000000000000000000000000000000000000000000000000000000008152336004820152602481018290529096507f0000000000000000000000001d4214081985ad20aa3ca93a2206ae792635cbec6001600160a01b031690635372b2f690604401600060405180830381600087803b15801561105157600080fd5b505af1158015611065573d6000803e3d6000fd5b50503360009081526001602052604090205415915050801561108a5750600254600910155b156110b15760025461109d90600161299f565b336000908152600160205260409020600501555b6005546110be9083612898565b6110c8908261299f565b33600090815260016020526040812080549091906110e790849061299f565b90915550506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f0000000000000000000000001d4214081985ad20aa3ca93a2206ae792635cbec6001600160a01b0316906370a0823190602401602060405180830381865afa158015611169573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061118d919061280d565b336000908152600160208190526040822090810192909255600290910180549091906111b8906128af565b909155506040517f70a082310000000000000000000000000000000000000000000000000000000081523360048201527f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b0316906370a0823190602401602060405180830381865afa158015611239573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061125d919061280d565b3360008181526001602052604090206003019190915561127c90612118565b336000908152600160205260408120600401805492995089929091906112a390849061299f565b9091555050600380548891906000906112bd90849061299f565b9091555050600554156112df57600580546000906112da90612ab4565b909155505b84600260050160008282546112f4919061299f565b909155505060048054600090611309906128af565b90915550929650505050509193909250565b6000600960026000015410156113735760405162461bcd60e51b815260206004820152600660248201527f4c4f434b454400000000000000000000000000000000000000000000000000006044820152606401610346565b6703782dace9d9000034116113ca5760405162461bcd60e51b815260206004820152600760248201527f4e4f4e5a45524f000000000000000000000000000000000000000000000000006044820152606401610346565b6113d56000546119b6565b50506113df611569565b506113e86116dc565b505060005490565b6000806113fb6114bf565b600254909150810361144f5760405162461bcd60e51b815260206004820152600560248201527f554e4d45540000000000000000000000000000000000000000000000000000006044820152606401610346565b6114598484611c69565b50506002819055611468611569565b509392505050565b81601452806034526f095ea7b300000000000000000000000060005260206000604460106000875af13d1560016000511417166114b557633e3f8f736000526004601cfd5b6000603452505050565b6000807f0000000000000000000000001d4214081985ad20aa3ca93a2206ae792635cbec6001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611520573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611544919061280d565b90506000611562826d14bddab3e51a57cff87a50000000600161251e565b9392505050565b60006115957f00000000000000000000000017cc6042605381c158d2adab487434bde79aa61c47612548565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b0316906370a0823190602401602060405180830381865afa158015611615573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611639919061280d565b90506116887f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119337f00000000000000000000000017cc6042605381c158d2adab487434bde79aa61c600019611470565b6116d77f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119337f00000000000000000000000017cc6042605381c158d2adab487434bde79aa61c600184901c611808565b919050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201526000907f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031690632e1a7d4d9082906370a0823190602401602060405180830381865afa158015611764573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611788919061280d565b6040518263ffffffff1660e01b81526004016117a691815260200190565b600060405180830381600087803b1580156117c057600080fd5b505af11580156117d4573d6000803e3d6000fd5b505050506118027f00000000000000000000000017cc6042605381c158d2adab487434bde79aa61c47612548565b50600190565b81601452806034526fa9059cbb00000000000000000000000060005260206000604460106000875af13d1560016000511417166114b5576390b8ec186000526004601cfd5b6040517f1698ee820000000000000000000000000000000000000000000000000000000081526001600160a01b0382811660048301527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28116602483015262ffffff851660448301526000918291829190861690631698ee8290606401602060405180830381865afa1580156118e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061190b9190612acb565b9050600080826001600160a01b0316633850c7bd6040518163ffffffff1660e01b815260040160e060405180830381865afa15801561194e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119729190612afa565b5050505050915091506190006002836001600160a01b03166119949190612c71565b61199f906001612898565b6119a99190612884565b9890975095505050505050565b6040805160808101825282815230602082019081526fffffffffffffffffffffffffffffffff8284018181526060840182815294517ffc6f78650000000000000000000000000000000000000000000000000000000081528451600482015292516001600160a01b03908116602485015290518216604484015293511660648201526000928392917f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe889091169063fc6f78659060840160408051808303816000875af1158015611a8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aae91906127e9565b909590945092505050565b600073e592427a0aece92de3edee1f18e0157c058615646001600160a01b031663414bf389600134901c6040518061010001604052807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031681526020017f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b03168152602001610bb862ffffff168152602001306001600160a01b031681526020014261012c611b77919061299f565b81523460011c60208083019190915260408083018990526000606093840152805160e087811b7fffffffff0000000000000000000000000000000000000000000000000000000016825285516001600160a01b03908116600484015293860151841660248301529185015162ffffff16604482015292840151821660648401526080840151608484015260a084015160a484015260c084015160c4840152929092015190911660e48201526101040160206040518083038185885af1158015611c44573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190610ea1919061280d565b6040805160a0810182528281526fffffffffffffffffffffffffffffffff84811660208301908152600083850181815260608501828152426080870190815296517f0c49ccbe00000000000000000000000000000000000000000000000000000000815286516004820152935190941660248401525160448301529151606482015292516084840152918291907f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe886001600160a01b031690630c49ccbe9060a40160408051808303816000875af1158015611d48573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d6c91906127e9565b90969095509350505050565b6000806000807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0600134901c6040518263ffffffff1660e01b81526004016000604051808303818588803b158015611ddd57600080fd5b505af1158015611df1573d6000803e3d6000fd5b50506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8881166004830152602482018e90527f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193316935063095ea7b3925060440190506020604051808303816000875af1158015611e9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ec391906128d9565b506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe8881166004830152602482018a90527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063095ea7b3906044016020604051808303816000875af1158015611f6c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f9091906128d9565b5060006040518061016001604052807f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d23119336001600160a01b031681526020017f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168152602001610bb862ffffff168152602001898a8a6120179190612919565b6120219190612953565b60020b815260200189612034818a612919565b61203e9190612953565b60020b81526020018b81526020018a81526020016000815260200160008152602001306001600160a01b031681526020014281525090507f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe886001600160a01b03166388316456826040518263ffffffff1660e01b81526004016120c191906129b2565b6080604051808303816000875af11580156120e0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121049190612a76565b929d919c509a509098509650505050505050565b6001600160a01b0381166000908152600160208190526040822080546002909101549091612147911b8261299f565b6001600160a01b038416600090815260016020526040902060030154909150612170908261299f565b6001600160a01b03841660009081526001602081905260409091200154909150611562908261299f565b6000807f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0600134901c6040518263ffffffff1660e01b81526004016000604051808303818588803b1580156121fc57600080fd5b505af1158015612210573d6000803e3d6000fd5b50506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe888116600483015260001960248301527f0000000000000000000000006982508145454ce325ddbe47a25d4ec3d231193316935063095ea7b3925060440190506020604051808303816000875af11580156122bf573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122e391906128d9565b506040517f095ea7b30000000000000000000000000000000000000000000000000000000081526001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe888116600483015260001960248301527f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2169063095ea7b3906044016020604051808303816000875af115801561238d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123b191906128d9565b5060006040518060c001604052806000548152602001600260040154866123d89190612884565b81526006546020909101906123f0903460011c612884565b8152600060208201819052604082015260600161240f4261012c61299f565b9052604080517f219f5d170000000000000000000000000000000000000000000000000000000081528251600482015260208301516024820152908201516044820152606082015160648201526080820151608482015260a082015160a482015290915060009081906001600160a01b037f000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88169063219f5d179060c4016060604051808303816000875af11580156124cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124ef9190612c80565b6006549297509093509150859081906125089082612cb7565b6125129190612ceb565b94509450505050915091565b60008261252c83600a612d14565b6125369086612898565b6125409190612884565b949350505050565b60008060008084865af16125645763b12d13eb6000526004601cfd5b5050565b6001600160a01b038116811461257d57600080fd5b50565b60006020828403121561259257600080fd5b813561156281612568565b6fffffffffffffffffffffffffffffffff8116811461257d57600080fd5b8060020b811461257d57600080fd5b62ffffff8116811461257d57600080fd5b60008060008060008060c087890312156125f457600080fd5b86356125ff81612568565b9550602087013561260f8161259d565b94506040870135935060608701359250608087013561262d816125bb565b915060a087013561263d816125ca565b809150509295509295509295565b60006020828403121561265d57600080fd5b5035919050565b6000806040838503121561267757600080fd5b82356126828161259d565b946020939093013593505050565b80516116d781612568565b80516116d7816125ca565b80516116d7816125bb565b80516116d78161259d565b6000806000806000806000806000806000806101808d8f0312156126df57600080fd5b8c516bffffffffffffffffffffffff811681146126fb57600080fd5b9b5061270960208e01612690565b9a5061271760408e01612690565b995061272560608e01612690565b985061273360808e0161269b565b975061274160a08e016126a6565b965061274f60c08e016126a6565b955061275d60e08e016126b1565b94506101008d015193506101208d0151925061277c6101408e016126b1565b915061278b6101608e016126b1565b90509295989b509295989b509295989b565b600060a082019050825182526fffffffffffffffffffffffffffffffff602084015116602083015260408301516040830152606083015160608301526080830151608083015292915050565b600080604083850312156127fc57600080fd5b505080516020909101519092909150565b60006020828403121561281f57600080fd5b5051919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60008261289357612893612826565b500490565b8082028115828204841417610ea157610ea1612855565b600060001982036128c2576128c2612855565b5060010190565b805180151581146116d757600080fd5b6000602082840312156128eb57600080fd5b611562826128c9565b600282810b9082900b03627fffff198112627fffff82131715610ea157610ea1612855565b60008160020b8360020b8061293057612930612826565b6000198114627fffff198314161561294a5761294a612855565b90059392505050565b60008260020b8260020b028060020b915080821461297357612973612855565b5092915050565b600281810b9083900b01627fffff8113627fffff1982121715610ea157610ea1612855565b80820180821115610ea157610ea1612855565b81516001600160a01b03168152610160810160208301516129de60208401826001600160a01b03169052565b5060408301516129f5604084018262ffffff169052565b506060830151612a0a606084018260020b9052565b506080830151612a1f608084018260020b9052565b5060a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151612a65828501826001600160a01b03169052565b505061014092830151919092015290565b60008060008060808587031215612a8c57600080fd5b845193506020850151612a9e8161259d565b6040860151606090960151949790965092505050565b600081612ac357612ac3612855565b506000190190565b600060208284031215612add57600080fd5b815161156281612568565b805161ffff811681146116d757600080fd5b600080600080600080600060e0888a031215612b1557600080fd5b8751612b2081612568565b6020890151909750612b31816125bb565b9550612b3f60408901612ae8565b9450612b4d60608901612ae8565b9350612b5b60808901612ae8565b925060a088015160ff81168114612b7157600080fd5b9150612b7f60c089016128c9565b905092959891949750929550565b600181815b80851115612bc8578160001904821115612bae57612bae612855565b80851615612bbb57918102915b93841c9390800290612b92565b509250929050565b600082612bdf57506001610ea1565b81612bec57506000610ea1565b8160018114612c025760028114612c0c57612c28565b6001915050610ea1565b60ff841115612c1d57612c1d612855565b50506001821b610ea1565b5060208310610133831016604e8410600b8410161715612c4b575081810a610ea1565b612c558383612b8d565b8060001904821115612c6957612c69612855565b029392505050565b600061156260ff841683612bd0565b600080600060608486031215612c9557600080fd5b8351612ca08161259d565b602085015160409095015190969495509392505050565b6fffffffffffffffffffffffffffffffff818116838216028082169190828114612ce357612ce3612855565b505092915050565b6fffffffffffffffffffffffffffffffff82811682821603908082111561297357612973612855565b60006115628383612bd056fea26469706673582212201ad7b1680764c1cef6a57b0fd69dae92bde3af8e9f99eb1f0219ecf24d59e69464736f6c63430008110033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe880000000000000000000000001d4214081985ad20aa3ca93a2206ae792635cbec0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc200000000000000000000000017cc6042605381c158d2adab487434bde79aa61c
-----Decoded View---------------
Arg [0] : _nonfungiblePositionManager (address): 0xC36442b4a4522E871399CD717aBDD847Ab11FE88
Arg [1] : _nano (address): 0x1d4214081985ad20aa3cA93A2206aE792635cBec
Arg [2] : _hopped (address): 0x6982508145454Ce325dDbE47a25d4ec3d2311933
Arg [3] : _weth (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
Arg [4] : _distillary (address): 0x17CC6042605381c158D2adab487434Bde79Aa61C
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 000000000000000000000000c36442b4a4522e871399cd717abdd847ab11fe88
Arg [1] : 0000000000000000000000001d4214081985ad20aa3ca93a2206ae792635cbec
Arg [2] : 0000000000000000000000006982508145454ce325ddbe47a25d4ec3d2311933
Arg [3] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Arg [4] : 00000000000000000000000017cc6042605381c158d2adab487434bde79aa61c
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.