More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 1,707 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Buyback | 21686281 | 8 days ago | IN | 0 ETH | 0.00068002 | ||||
Buyback | 21686276 | 8 days ago | IN | 0 ETH | 0.00085384 | ||||
Buyback | 21669727 | 11 days ago | IN | 0 ETH | 0.00136352 | ||||
Buyback | 21621884 | 17 days ago | IN | 0 ETH | 0.00099371 | ||||
Buyback | 21621880 | 17 days ago | IN | 0 ETH | 0.00086373 | ||||
Buyback | 21621876 | 17 days ago | IN | 0 ETH | 0.00064775 | ||||
Buyback | 21570929 | 24 days ago | IN | 0 ETH | 0.00070667 | ||||
Buyback | 21570924 | 24 days ago | IN | 0 ETH | 0.00078712 | ||||
Buyback | 21570918 | 24 days ago | IN | 0 ETH | 0.00071633 | ||||
Buyback | 21514805 | 32 days ago | IN | 0 ETH | 0.00049237 | ||||
Buyback | 21514801 | 32 days ago | IN | 0 ETH | 0.00053299 | ||||
Buyback | 21514798 | 32 days ago | IN | 0 ETH | 0.00043434 | ||||
Buyback | 21464401 | 39 days ago | IN | 0 ETH | 0.00120615 | ||||
Buyback | 21464398 | 39 days ago | IN | 0 ETH | 0.00148422 | ||||
Buyback | 21464395 | 39 days ago | IN | 0 ETH | 0.00129855 | ||||
Buyback | 21413775 | 46 days ago | IN | 0 ETH | 0.00120975 | ||||
Buyback | 21413771 | 46 days ago | IN | 0 ETH | 0.00146043 | ||||
Buyback | 21413763 | 46 days ago | IN | 0 ETH | 0.0011342 | ||||
Buyback | 21365988 | 53 days ago | IN | 0 ETH | 0.00449032 | ||||
Buyback | 21365984 | 53 days ago | IN | 0 ETH | 0.00493523 | ||||
Buyback | 21365979 | 53 days ago | IN | 0 ETH | 0.00438374 | ||||
Buyback | 21314795 | 60 days ago | IN | 0 ETH | 0.00142265 | ||||
Buyback | 21314792 | 60 days ago | IN | 0 ETH | 0.00154293 | ||||
Buyback | 21314780 | 60 days ago | IN | 0 ETH | 0.00136723 | ||||
Buyback | 21264466 | 67 days ago | IN | 0 ETH | 0.00186412 |
View more zero value Internal Transactions in Advanced View mode
Advanced mode:
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
RewardDistributor
Compiler Version
v0.7.4+commit.3f05b770
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; pragma experimental ABIEncoderV2; import "@openzeppelin/contracts/math/SafeMath.sol"; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/token/ERC20/SafeERC20.sol"; import "@openzeppelin/contracts/utils/Address.sol"; import "@openzeppelin/contracts/utils/Pausable.sol"; import "../../interfaces/IUniswapRouterV2.sol"; import "../../interfaces/ILon.sol"; import "../Ownable.sol"; contract RewardDistributor is Ownable, Pausable { using SafeMath for uint256; using SafeERC20 for IERC20; // Constants do not have storage slot. uint256 private constant MAX_UINT = 2**256 - 1; address public immutable LON_TOKEN_ADDR; // Below are the variables which consume storage slots. uint32 public buybackInterval; uint8 public miningFactor; uint8 public numStrategyAddr; uint8 public numExchangeAddr; mapping(address => bool) public isOperator; address public treasury; address public lonStaking; address public miningTreasury; address public feeTokenRecipient; mapping(uint256 => address) public strategyAddrs; mapping(uint256 => address) public exchangeAddrs; mapping(address => FeeToken) public feeTokens; /* Struct and event declaration */ struct FeeToken { uint8 exchangeIndex; uint8 LFactor; // Percentage of fee token reserved for feeTokenRecipient uint8 RFactor; // Percentage of buyback-ed lon token for treasury uint32 lastTimeBuyback; bool enable; uint256 minBuy; uint256 maxBuy; address[] path; } // Owner events event SetOperator(address operator, bool enable); event SetMiningFactor(uint8 miningFactor); event SetTreasury(address treasury); event SetLonStaking(address lonStaking); event SetMiningTreasury(address miningTreasury); event SetFeeTokenRecipient(address feeTokenRecipient); // Operator events event SetBuybackInterval(uint256 interval); event SetStrategy(uint256 index, address strategy); event SetExchange(uint256 index, address exchange); event EnableFeeToken(address feeToken, bool enable); event SetFeeToken( address feeToken, uint256 exchangeIndex, address[] path, uint256 LFactor, uint256 RFactor, uint256 minBuy, uint256 maxBuy ); event SetFeeTokenFailure(address feeToken, string reason, bytes lowLevelData); event BuyBack( address feeToken, uint256 feeTokenAmount, uint256 swappedLonAmount, uint256 LFactor, uint256 RFactor, uint256 minBuy, uint256 maxBuy ); event BuyBackFailure(address feeToken, uint256 feeTokenAmount, string reason, bytes lowLevelData); event DistributeLon(uint256 treasuryAmount, uint256 lonStakingAmount); event MintLon(uint256 mintedAmount); event Recovered(address token, uint256 amount); /************************************************************ * Access control * *************************************************************/ modifier only_Operator_or_Owner { require(_isAuthorized(msg.sender), "only operator or owner can call"); _; } modifier only_Owner_or_Operator_or_Self { if (msg.sender != address(this)) { require(_isAuthorized(msg.sender), "only operator or owner can call"); } _; } modifier only_EOA { require((msg.sender == tx.origin), "only EOA can call"); _; } modifier only_EOA_or_Self { if (msg.sender != address(this)) { require((msg.sender == tx.origin), "only EOA can call"); } _; } /************************************************************ * Constructor * *************************************************************/ constructor( address _LON_TOKEN_ADDR, address _owner, address _operator, uint32 _buyBackInterval, uint8 _miningFactor, address _treasury, address _lonStaking, address _miningTreasury, address _feeTokenRecipient ) Ownable(_owner) { LON_TOKEN_ADDR = _LON_TOKEN_ADDR; isOperator[_operator] = true; buybackInterval = _buyBackInterval; require(_miningFactor <= 100, "incorrect mining factor"); miningFactor = _miningFactor; require(Address.isContract(_lonStaking), "Lon staking is not a contract"); treasury = _treasury; lonStaking = _lonStaking; miningTreasury = _miningTreasury; feeTokenRecipient = _feeTokenRecipient; } /************************************************************ * Getter functions * *************************************************************/ function getFeeTokenPath(address _feeTokenAddr) public view returns (address[] memory path) { return feeTokens[_feeTokenAddr].path; } /************************************************************ * Management functions for Owner * *************************************************************/ function pause() external onlyOwner whenNotPaused { _pause(); } function unpause() external onlyOwner whenPaused { _unpause(); } function setOperator(address _operator, bool _enable) external onlyOwner { isOperator[_operator] = _enable; emit SetOperator(_operator, _enable); } function setMiningFactor(uint8 _miningFactor) external onlyOwner { require(_miningFactor <= 100, "incorrect mining factor"); miningFactor = _miningFactor; emit SetMiningFactor(_miningFactor); } function setTreasury(address _treasury) external onlyOwner { treasury = _treasury; emit SetTreasury(_treasury); } function setLonStaking(address _lonStaking) external onlyOwner { require(Address.isContract(_lonStaking), "Lon staking is not a contract"); lonStaking = _lonStaking; emit SetLonStaking(_lonStaking); } function setMiningTreasury(address _miningTreasury) external onlyOwner { miningTreasury = _miningTreasury; emit SetMiningTreasury(_miningTreasury); } function setFeeTokenRecipient(address _feeTokenRecipient) external onlyOwner { feeTokenRecipient = _feeTokenRecipient; emit SetFeeTokenRecipient(_feeTokenRecipient); } /************************************************************ * Management functions for Operator * *************************************************************/ function recoverERC20(address _tokenAddress, uint256 _tokenAmount) external only_Operator_or_Owner { IERC20(_tokenAddress).safeTransfer(owner, _tokenAmount); emit Recovered(_tokenAddress, _tokenAmount); } function setBuybackInterval(uint32 _buyBackInterval) external only_Operator_or_Owner { require(_buyBackInterval >= 3600, "invalid buyback interval"); buybackInterval = _buyBackInterval; emit SetBuybackInterval(_buyBackInterval); } function setStrategyAddrs(uint256[] calldata _indexes, address[] calldata _strategyAddrs) external only_Operator_or_Owner { require(_indexes.length == _strategyAddrs.length, "input not the same length"); for (uint256 i = 0; i < _indexes.length; i++) { require(Address.isContract(_strategyAddrs[i]), "strategy is not a contract"); require(_indexes[i] <= numStrategyAddr, "index out of bound"); strategyAddrs[_indexes[i]] = _strategyAddrs[i]; if (_indexes[i] == numStrategyAddr) numStrategyAddr++; emit SetStrategy(_indexes[i], _strategyAddrs[i]); } } function setExchangeAddrs(uint256[] calldata _indexes, address[] calldata _exchangeAddrs) external only_Operator_or_Owner { require(_indexes.length == _exchangeAddrs.length, "input not the same length"); for (uint256 i = 0; i < _indexes.length; i++) { require(Address.isContract(_exchangeAddrs[i]), "exchange is not a contract"); require(_indexes[i] <= numExchangeAddr, "index out of bound"); exchangeAddrs[_indexes[i]] = _exchangeAddrs[i]; if (_indexes[i] == numExchangeAddr) numExchangeAddr++; emit SetExchange(_indexes[i], _exchangeAddrs[i]); } } function setFeeToken( address _feeTokenAddr, uint8 _exchangeIndex, address[] calldata _path, uint8 _LFactor, uint8 _RFactor, bool _enable, uint256 _minBuy, uint256 _maxBuy ) external only_Owner_or_Operator_or_Self { // Validate fee token inputs require(Address.isContract(_feeTokenAddr), "fee token is not a contract"); require(Address.isContract(exchangeAddrs[_exchangeIndex]), "exchange is not a contract"); require(_path.length >= 2, "invalid swap path"); require(_path[_path.length - 1] == LON_TOKEN_ADDR, "output token must be LON"); require(_LFactor <= 100, "incorrect LFactor"); require(_RFactor <= 100, "incorrect RFactor"); require(_minBuy <= _maxBuy, "incorrect minBuy and maxBuy"); FeeToken storage feeToken = feeTokens[_feeTokenAddr]; feeToken.exchangeIndex = _exchangeIndex; feeToken.path = _path; feeToken.LFactor = _LFactor; feeToken.RFactor = _RFactor; if (feeToken.enable != _enable) { feeToken.enable = _enable; emit EnableFeeToken(_feeTokenAddr, _enable); } feeToken.minBuy = _minBuy; feeToken.maxBuy = _maxBuy; emit SetFeeToken(_feeTokenAddr, _exchangeIndex, _path, _LFactor, _RFactor, _minBuy, _maxBuy); } function setFeeTokens( address[] memory _feeTokenAddr, uint8[] memory _exchangeIndex, address[][] memory _path, uint8[] memory _LFactor, uint8[] memory _RFactor, bool[] memory _enable, uint256[] memory _minBuy, uint256[] memory _maxBuy ) external only_Operator_or_Owner { uint256 inputLength = _feeTokenAddr.length; require( (_exchangeIndex.length == inputLength) && (_path.length == inputLength) && (_LFactor.length == inputLength) && (_RFactor.length == inputLength) && (_enable.length == inputLength) && (_minBuy.length == inputLength) && (_maxBuy.length == inputLength), "input not the same length" ); for (uint256 i = 0; i < inputLength; i++) { try this.setFeeToken( _feeTokenAddr[i], _exchangeIndex[i], _path[i], _LFactor[i], _RFactor[i], _enable[i], _minBuy[i], _maxBuy[i] ) { continue; } catch Error(string memory reason) { emit SetFeeTokenFailure(_feeTokenAddr[i], reason, bytes("")); } catch (bytes memory lowLevelData) { emit SetFeeTokenFailure(_feeTokenAddr[i], "", lowLevelData); } } } function enableFeeToken(address _feeTokenAddr, bool _enable) external only_Operator_or_Owner { FeeToken storage feeToken = feeTokens[_feeTokenAddr]; if (feeToken.enable != _enable) { feeToken.enable = _enable; emit EnableFeeToken(_feeTokenAddr, _enable); } } function enableFeeTokens(address[] calldata _feeTokenAddr, bool[] calldata _enable) external only_Operator_or_Owner { require(_feeTokenAddr.length == _enable.length, "input not the same length"); for (uint256 i = 0; i < _feeTokenAddr.length; i++) { FeeToken storage feeToken = feeTokens[_feeTokenAddr[i]]; if (feeToken.enable != _enable[i]) { feeToken.enable = _enable[i]; emit EnableFeeToken(_feeTokenAddr[i], _enable[i]); } } } function _isAuthorized(address _account) internal view returns (bool) { if ((isOperator[_account]) || (_account == owner)) return true; else return false; } function _validate( FeeToken memory _feeToken, uint256 _amount ) internal view returns (uint256 amountFeeTokenToSwap, uint256 amountFeeTokenToTransfer) { require(_amount > 0, "zero fee token amount"); if (!_isAuthorized(msg.sender)) { require(_feeToken.enable, "fee token is not enabled"); } amountFeeTokenToTransfer = _amount.mul(_feeToken.LFactor).div(100); amountFeeTokenToSwap = _amount.sub(amountFeeTokenToTransfer); if (amountFeeTokenToSwap > 0) { require(amountFeeTokenToSwap >= _feeToken.minBuy, "amount less than min buy"); require(amountFeeTokenToSwap <= _feeToken.maxBuy, "amount greater than max buy"); require(block.timestamp > uint256(_feeToken.lastTimeBuyback).add(uint256(buybackInterval)), "already a buyback recently"); } } function _transferFeeToken( address _feeTokenAddr, address _transferTo, uint256 _totalFeeTokenAmount ) internal { address strategyAddr; uint256 balanceInStrategy; uint256 amountToTransferFrom; uint256 cumulatedAmount; for (uint256 i = 0; i < numStrategyAddr; i++) { strategyAddr = strategyAddrs[i]; balanceInStrategy = IERC20(_feeTokenAddr).balanceOf(strategyAddr); if (cumulatedAmount.add(balanceInStrategy) > _totalFeeTokenAmount) { amountToTransferFrom = _totalFeeTokenAmount.sub(cumulatedAmount); } else { amountToTransferFrom = balanceInStrategy; } if (amountToTransferFrom == 0) continue; IERC20(_feeTokenAddr).safeTransferFrom(strategyAddr, _transferTo, amountToTransferFrom); cumulatedAmount = cumulatedAmount.add(amountToTransferFrom); if (cumulatedAmount == _totalFeeTokenAmount) break; } require(cumulatedAmount == _totalFeeTokenAmount, "insufficient amount of fee tokens"); } function _swap( address _feeTokenAddr, address _exchangeAddr, address[] memory _path, uint256 _amountFeeTokenToSwap, uint256 _minLonAmount ) internal returns (uint256 swappedLonAmount) { // Approve exchange contract IERC20(_feeTokenAddr).safeApprove(_exchangeAddr, MAX_UINT); // Swap fee token for Lon IUniswapRouterV2 router = IUniswapRouterV2(_exchangeAddr); uint256[] memory amounts = router.swapExactTokensForTokens( _amountFeeTokenToSwap, _minLonAmount, // Minimum amount of Lon expected to receive _path, address(this), block.timestamp + 60 ); swappedLonAmount = amounts[_path.length - 1]; // Clear allowance for exchange contract IERC20(_feeTokenAddr).safeApprove(_exchangeAddr, 0); } function _distributeLon( FeeToken memory _feeToken, uint256 swappedLonAmount ) internal { // To Treasury uint256 treasuryAmount = swappedLonAmount.mul(_feeToken.RFactor).div(100); if (treasuryAmount > 0) { IERC20(LON_TOKEN_ADDR).safeTransfer(treasury, treasuryAmount); } // To LonStaking uint256 lonStakingAmount = swappedLonAmount.sub(treasuryAmount); if (lonStakingAmount > 0) { IERC20(LON_TOKEN_ADDR).safeTransfer(lonStaking, lonStakingAmount); } emit DistributeLon(treasuryAmount, lonStakingAmount); } function _mintLon(uint256 swappedLonAmount) internal { // Mint Lon for MiningTreasury uint256 mintedAmount = swappedLonAmount.mul(uint256(miningFactor)).div(100); if (mintedAmount > 0) { ILon(LON_TOKEN_ADDR).mint(miningTreasury, mintedAmount); emit MintLon(mintedAmount); } } function _buyback( address _feeTokenAddr, FeeToken storage _feeToken, address _exchangeAddr, uint256 _amountFeeTokenToSwap, uint256 _minLonAmount ) internal { if (_amountFeeTokenToSwap > 0) { uint256 swappedLonAmount = _swap(_feeTokenAddr, _exchangeAddr, _feeToken.path, _amountFeeTokenToSwap, _minLonAmount); // Update fee token data _feeToken.lastTimeBuyback = uint32(block.timestamp); emit BuyBack( _feeTokenAddr, _amountFeeTokenToSwap, swappedLonAmount, _feeToken.LFactor, _feeToken.RFactor, _feeToken.minBuy, _feeToken.maxBuy ); _distributeLon(_feeToken, swappedLonAmount); _mintLon(swappedLonAmount); } } /************************************************************ * External functions * *************************************************************/ function buyback(address _feeTokenAddr, uint256 _amount, uint256 _minLonAmount) external whenNotPaused only_EOA_or_Self { FeeToken storage feeToken = feeTokens[_feeTokenAddr]; // Distribute LON directly without swap if (_feeTokenAddr == LON_TOKEN_ADDR) { require(feeToken.enable, "fee token is not enabled"); require(_amount >= feeToken.minBuy, "amount less than min buy"); uint256 _lonToTreasury = _amount.mul(feeToken.RFactor).div(100); uint256 _lonToStaking = _amount.sub(_lonToTreasury); _transferFeeToken(LON_TOKEN_ADDR, treasury, _lonToTreasury); _transferFeeToken(LON_TOKEN_ADDR, lonStaking, _lonToStaking); emit DistributeLon(_lonToTreasury, _lonToStaking); _mintLon(_amount); // Update lastTimeBuyback feeToken.lastTimeBuyback = uint32(block.timestamp); return; } // Validate fee token data and input amount (uint256 amountFeeTokenToSwap, uint256 amountFeeTokenToTransfer) = _validate(feeToken, _amount); if (amountFeeTokenToSwap == 0) { // No need to swap, transfer feeToken directly _transferFeeToken(_feeTokenAddr, feeTokenRecipient, amountFeeTokenToTransfer); } else { // Transfer fee token from strategy contracts to distributor _transferFeeToken(_feeTokenAddr, address(this), _amount); // Buyback _buyback(_feeTokenAddr, feeToken, exchangeAddrs[feeToken.exchangeIndex], amountFeeTokenToSwap, _minLonAmount); // Transfer fee token from distributor to feeTokenRecipient if (amountFeeTokenToTransfer > 0) { IERC20(_feeTokenAddr).safeTransfer(feeTokenRecipient, amountFeeTokenToTransfer); } } } function batchBuyback( address[] calldata _feeTokenAddr, uint256[] calldata _amount, uint256[] calldata _minLonAmount ) external whenNotPaused only_EOA { uint256 inputLength = _feeTokenAddr.length; require( (_amount.length == inputLength) && (_minLonAmount.length == inputLength), "input not the same length" ); for (uint256 i = 0; i < inputLength; i++) { try this.buyback(_feeTokenAddr[i], _amount[i], _minLonAmount[i]) { continue; } catch Error(string memory reason) { emit BuyBackFailure(_feeTokenAddr[i], _amount[i], reason, bytes("")); } catch (bytes memory lowLevelData) { emit BuyBackFailure(_feeTokenAddr[i], _amount[i], "", lowLevelData); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IERC20.sol"; import "../../math/SafeMath.sol"; import "../../utils/Address.sol"; /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using SafeMath for uint256; 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)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove(IERC20 token, address spender, uint256 value) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' // solhint-disable-next-line max-line-length 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 newAllowance = token.allowance(address(this), spender).add(value); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional // solhint-disable-next-line max-line-length require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.2 <0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ 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"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ 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"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with GSN meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./Context.sol"; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor () internal { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; abstract contract Ownable { address public owner; address public nominatedOwner; constructor(address _owner) { owner = _owner; } function acceptOwnership() external { require(msg.sender == nominatedOwner, "not nominated"); emit OwnerChanged(owner, nominatedOwner); owner = nominatedOwner; nominatedOwner = address(0); } function renounceOwnership() external onlyOwner { emit OwnerChanged(owner, address(0)); owner = address(0); } function nominateNewOwner(address newOwner) external onlyOwner { nominatedOwner = newOwner; emit OwnerNominated(newOwner); } modifier onlyOwner { require(msg.sender == owner, "not owner"); _; } event OwnerNominated(address indexed newOwner); event OwnerChanged(address indexed oldOwner, address indexed newOwner); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IEIP2612 is IERC20 { function DOMAIN_SEPARATOR() external view returns (bytes32); function nonces(address owner) external view returns (uint256); function permit(address owner, address spender, uint256 value, uint256 deadline, uint8 v, bytes32 r, bytes32 s) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; interface IEmergency { function emergencyWithdraw(IERC20 token) external ; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.0 <0.8.0; import "./IEmergency.sol"; import "./IEIP2612.sol"; interface ILon is IEmergency, IEIP2612 { function cap() external view returns(uint256); function mint(address to, uint256 amount) external; function burn(uint256 amount) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.5.0 <0.8.0; interface IUniswapRouterV2 { function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external returns (uint256[] memory amounts); function getAmountsOut(uint256 amountIn, address[] calldata path) external view returns (uint256[] memory amounts); function getAmountsIn(uint256 amountOut, address[] calldata path) external view returns (uint256[] memory amounts); function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable returns (uint256[] memory amounts); }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 1000 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_LON_TOKEN_ADDR","type":"address"},{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"},{"internalType":"uint32","name":"_buyBackInterval","type":"uint32"},{"internalType":"uint8","name":"_miningFactor","type":"uint8"},{"internalType":"address","name":"_treasury","type":"address"},{"internalType":"address","name":"_lonStaking","type":"address"},{"internalType":"address","name":"_miningTreasury","type":"address"},{"internalType":"address","name":"_feeTokenRecipient","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeTokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"swappedLonAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"LFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"RFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBuy","type":"uint256"}],"name":"BuyBack","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"feeTokenAmount","type":"uint256"},{"indexed":false,"internalType":"string","name":"reason","type":"string"},{"indexed":false,"internalType":"bytes","name":"lowLevelData","type":"bytes"}],"name":"BuyBackFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"treasuryAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"lonStakingAmount","type":"uint256"}],"name":"DistributeLon","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"EnableFeeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mintedAmount","type":"uint256"}],"name":"MintLon","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"oldOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerNominated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Recovered","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"interval","type":"uint256"}],"name":"SetBuybackInterval","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"address","name":"exchange","type":"address"}],"name":"SetExchange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"uint256","name":"exchangeIndex","type":"uint256"},{"indexed":false,"internalType":"address[]","name":"path","type":"address[]"},{"indexed":false,"internalType":"uint256","name":"LFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"RFactor","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"minBuy","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"maxBuy","type":"uint256"}],"name":"SetFeeToken","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeToken","type":"address"},{"indexed":false,"internalType":"string","name":"reason","type":"string"},{"indexed":false,"internalType":"bytes","name":"lowLevelData","type":"bytes"}],"name":"SetFeeTokenFailure","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"feeTokenRecipient","type":"address"}],"name":"SetFeeTokenRecipient","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"lonStaking","type":"address"}],"name":"SetLonStaking","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint8","name":"miningFactor","type":"uint8"}],"name":"SetMiningFactor","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"miningTreasury","type":"address"}],"name":"SetMiningTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"enable","type":"bool"}],"name":"SetOperator","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":false,"internalType":"address","name":"strategy","type":"address"}],"name":"SetStrategy","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"treasury","type":"address"}],"name":"SetTreasury","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"LON_TOKEN_ADDR","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_feeTokenAddr","type":"address[]"},{"internalType":"uint256[]","name":"_amount","type":"uint256[]"},{"internalType":"uint256[]","name":"_minLonAmount","type":"uint256[]"}],"name":"batchBuyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenAddr","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minLonAmount","type":"uint256"}],"name":"buyback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"buybackInterval","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenAddr","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"enableFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_feeTokenAddr","type":"address[]"},{"internalType":"bool[]","name":"_enable","type":"bool[]"}],"name":"enableFeeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"exchangeAddrs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeTokenRecipient","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"feeTokens","outputs":[{"internalType":"uint8","name":"exchangeIndex","type":"uint8"},{"internalType":"uint8","name":"LFactor","type":"uint8"},{"internalType":"uint8","name":"RFactor","type":"uint8"},{"internalType":"uint32","name":"lastTimeBuyback","type":"uint32"},{"internalType":"bool","name":"enable","type":"bool"},{"internalType":"uint256","name":"minBuy","type":"uint256"},{"internalType":"uint256","name":"maxBuy","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenAddr","type":"address"}],"name":"getFeeTokenPath","outputs":[{"internalType":"address[]","name":"path","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isOperator","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lonStaking","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningFactor","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"miningTreasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"nominateNewOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"nominatedOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numExchangeAddr","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numStrategyAddr","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_buyBackInterval","type":"uint32"}],"name":"setBuybackInterval","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_indexes","type":"uint256[]"},{"internalType":"address[]","name":"_exchangeAddrs","type":"address[]"}],"name":"setExchangeAddrs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenAddr","type":"address"},{"internalType":"uint8","name":"_exchangeIndex","type":"uint8"},{"internalType":"address[]","name":"_path","type":"address[]"},{"internalType":"uint8","name":"_LFactor","type":"uint8"},{"internalType":"uint8","name":"_RFactor","type":"uint8"},{"internalType":"bool","name":"_enable","type":"bool"},{"internalType":"uint256","name":"_minBuy","type":"uint256"},{"internalType":"uint256","name":"_maxBuy","type":"uint256"}],"name":"setFeeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_feeTokenRecipient","type":"address"}],"name":"setFeeTokenRecipient","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_feeTokenAddr","type":"address[]"},{"internalType":"uint8[]","name":"_exchangeIndex","type":"uint8[]"},{"internalType":"address[][]","name":"_path","type":"address[][]"},{"internalType":"uint8[]","name":"_LFactor","type":"uint8[]"},{"internalType":"uint8[]","name":"_RFactor","type":"uint8[]"},{"internalType":"bool[]","name":"_enable","type":"bool[]"},{"internalType":"uint256[]","name":"_minBuy","type":"uint256[]"},{"internalType":"uint256[]","name":"_maxBuy","type":"uint256[]"}],"name":"setFeeTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_lonStaking","type":"address"}],"name":"setLonStaking","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_miningFactor","type":"uint8"}],"name":"setMiningFactor","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_miningTreasury","type":"address"}],"name":"setMiningTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_enable","type":"bool"}],"name":"setOperator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_indexes","type":"uint256[]"},{"internalType":"address[]","name":"_strategyAddrs","type":"address[]"}],"name":"setStrategyAddrs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_treasury","type":"address"}],"name":"setTreasury","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"strategyAddrs","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040523480156200001157600080fd5b506040516200452d3803806200452d8339810160408190526200003491620001a1565b600080546001600160a01b0319166001600160a01b038a81169190911782556001805460ff60a01b1916815560608c901b6001600160601b031916608052908916825260026020526040909120805460ff191682179055805463ffffffff60a81b1916600160a81b63ffffffff891602179055606460ff86161115620000d75760405162461bcd60e51b8152600401620000ce906200026b565b60405180910390fd5b6001805460ff60c81b1916600160c81b60ff88160217905562000106836200017f602090811b6200210217901c565b620001255760405162461bcd60e51b8152600401620000ce90620002a2565b600380546001600160a01b039586166001600160a01b031991821617909155600480549486169482169490941790935560058054928516928416929092179091556006805491909316911617905550620002d99350505050565b803b15155b919050565b80516001600160a01b03811681146200018457600080fd5b60008060008060008060008060006101208a8c031215620001c0578485fd5b620001cb8a62000189565b9850620001db60208b0162000189565b9750620001eb60408b0162000189565b965060608a015163ffffffff8116811462000204578586fd5b60808b015190965060ff811681146200021b578586fd5b94506200022b60a08b0162000189565b93506200023b60c08b0162000189565b92506200024b60e08b0162000189565b91506200025c6101008b0162000189565b90509295985092959850929598565b60208082526017908201527f696e636f7272656374206d696e696e6720666163746f72000000000000000000604082015260600190565b6020808252601d908201527f4c6f6e207374616b696e67206973206e6f74206120636f6e7472616374000000604082015260600190565b60805160601c6142136200031a60003980610a6c5280610c155280610cc75280610cff528061197f52806124d95280612b615280612baf52506142136000f3fe608060405234801561001057600080fd5b50600436106102925760003560e01c80638980f11f11610160578063b54f8a92116100d8578063dc95c9101161008c578063f0f4426011610071578063f0f44260146104df578063f4789e7e146104f2578063fb4151401461050557610292565b8063dc95c910146104b9578063f008088d146104cc57610292565b8063d145e82b116100bd578063d145e82b1461047e578063d8bad99a14610491578063db750cb1146104a657610292565b8063b54f8a9214610458578063b8a0258d1461046b57610292565b8063a2d3c7e61161012f578063a647c9b111610114578063a647c9b114610435578063a81c53151461043d578063b08710d71461045057610292565b8063a2d3c7e61461041a578063a474ac501461042257610292565b80638980f11f146103ef5780638da5cb5b146104025780639e6531401461040a578063a06a48e11461041257610292565b80635c975abb1161020e5780636d70f7ae116101c257806379ba5097116101a757806379ba5097146103bf5780637e200546146103c75780638456cb59146103e757610292565b80636d70f7ae146103a4578063715018a6146103b757610292565b8063643481af116101f3578063643481af1461036b5780636671ce1f1461037e5780636cde15881461039157610292565b80635c975abb1461034e57806361d027b31461036357610292565b806353116c381161026557806354a7965d1161024a57806354a7965d1461031e578063558a72971461032657806357c698ed1461033957610292565b806353116c38146102f657806353a47bb71461030957610292565b80631627540c1461029757806316605a0d146102ac5780631bac19cc146102db5780633f4ba83a146102ee575b600080fd5b6102aa6102a536600461330d565b610518565b005b6102bf6102ba36600461330d565b6105ad565b6040516102d29796959493929190614006565b60405180910390f35b6102aa6102e936600461345c565b6105fd565b6102aa61081e565b6102aa61030436600461345c565b6108cc565b610311610a5b565b6040516102d2919061383f565b610311610a6a565b6102aa610334366004613327565b610a8e565b610341610b3b565b6040516102d29190613ff8565b610356610b4b565b6040516102d29190613ac9565b610311610b5c565b61031161037936600461373c565b610b6b565b6102aa61038c366004613382565b610b86565b6102aa61039f3660046134c5565b610ef4565b6103566103b236600461330d565b611178565b6102aa61118d565b6102aa611222565b6103da6103d536600461330d565b6112e5565b6040516102d29190613ab6565b6102aa61135f565b6102aa6103fd366004613359565b6113ff565b61031161146f565b61034161147e565b61031161148e565b61031161149d565b6102aa61043036600461355b565b6114ac565b61034161174f565b6102aa61044b36600461376c565b61175f565b61031161181d565b6102aa61046636600461330d565b61182c565b6102aa6104793660046133b4565b6118c2565b61031161048c36600461373c565b611b78565b610499611b93565b6040516102d29190613fe7565b6102aa6104b436600461345c565b611ba6565b6102aa6104c7366004613790565b611d9d565b6102aa6104da36600461330d565b611e6f565b6102aa6104ed36600461330d565b611f05565b6102aa61050036600461330d565b611f9b565b6102aa610513366004613327565b612056565b6000546001600160a01b03163314610563576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60096020526000908152604090208054600182015460029092015460ff80831693610100840482169362010000810483169363ffffffff630100000083041693600160381b909204909116919087565b61060633612108565b61062b5760405162461bcd60e51b815260040161062290613d57565b60405180910390fd5b82811461064a5760405162461bcd60e51b815260040161062290613b68565b60005b838110156108175761067e83838381811061066457fe5b9050602002016020810190610679919061330d565b612102565b61069a5760405162461bcd60e51b815260040161062290613d8e565b600154600160d81b900460ff168585838181106106b357fe5b9050602002013511156106d85760405162461bcd60e51b815260040161062290613dc5565b8282828181106106e457fe5b90506020020160208101906106f9919061330d565b6008600087878581811061070957fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600154600160d81b900460ff1685858381811061075957fe5b9050602002013514156107a4576001805460ff600160d81b80830482168401909116027fffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b7f87dfda767db80601457eaecfea13c08d2bbd8610572aac5773b637874eb11e268585838181106107d157fe5b905060200201358484848181106107e457fe5b90506020020160208101906107f9919061330d565b604051610807929190613f86565b60405180910390a160010161064d565b5050505050565b6000546001600160a01b03163314610869576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b610871610b4b565b6108c2576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6108ca612151565b565b6108d533612108565b6108f15760405162461bcd60e51b815260040161062290613d57565b8281146109105760405162461bcd60e51b815260040161062290613b68565b60005b838110156108175760006009600087878581811061092d57fe5b9050602002016020810190610942919061330d565b6001600160a01b03166001600160a01b03168152602001908152602001600020905083838381811061097057fe5b90506020020160208101906109859190613722565b815460ff600160381b90910416151590151514610a52578383838181106109a857fe5b90506020020160208101906109bd9190613722565b8154901515600160381b0267ff00000000000000199091161781557f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d92038868684818110610a0557fe5b9050602002016020810190610a1a919061330d565b858585818110610a2657fe5b9050602002016020810190610a3b9190613722565b604051610a49929190613853565b60405180910390a15b50600101610913565b6001546001600160a01b031681565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000546001600160a01b03163314610ad9576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090819020805460ff1916831515179055517f1618a22a3b00b9ac70fd5a82f1f5cdd8cb272bd0f1b740ddf7c26ab05881dd5b90610b2f9084908490613853565b60405180910390a15050565b600154600160d01b900460ff1681565b600154600160a01b900460ff165b90565b6003546001600160a01b031681565b6007602052600090815260409020546001600160a01b031681565b610b8e610b4b565b15610bd3576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b333014610bf957333214610bf95760405162461bcd60e51b815260040161062290613dfc565b6001600160a01b038084166000818152600960205260409020917f0000000000000000000000000000000000000000000000000000000000000000161415610d93578054600160381b900460ff16610c635760405162461bcd60e51b815260040161062290613f46565b8060010154831015610c875760405162461bcd60e51b815260040161062290613ce9565b8054600090610cad90606490610ca790879062010000900460ff166121fd565b9061225f565b90506000610cbb85836122c6565b600354909150610cf6907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031684612323565b600454610d2e907f0000000000000000000000000000000000000000000000000000000000000000906001600160a01b031683612323565b7fd4d626561e9dc8e892258af0fcfd4baf2b993f9bd93126e36642fe7ee81b1c2a8282604051610d5f929190613f9d565b60405180910390a1610d708561247c565b5050805466ffffffff000000191663010000004263ffffffff1602179055610eef565b604080516101008082018352835460ff8082168452918104821660208085019190915262010000820483168486015263ffffffff63010000008304166060850152600160381b90910490911615156080830152600184015460a0830152600284015460c08301526003840180548451818402810184019095528085526000948594610e6a949093889360e086019392830182828015610e5b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e3d575b50505050508152505086612579565b915091508160001415610e9457600654610e8f9087906001600160a01b031683612323565b610eeb565b610e9f863087612323565b825460ff16600090815260086020526040902054610ecb90879085906001600160a01b03168588612690565b8015610eeb57600654610eeb906001600160a01b03888116911683612857565b5050505b505050565b610efc610b4b565b15610f41576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b333214610f605760405162461bcd60e51b815260040161062290613dfc565b848381148015610f6f57508181145b610f8b5760405162461bcd60e51b815260040161062290613b68565b60005b8181101561116e5730636671ce1f898984818110610fa857fe5b9050602002016020810190610fbd919061330d565b888885818110610fc957fe5b90506020020135878786818110610fdc57fe5b905060200201356040518463ffffffff1660e01b81526004016110019392919061396c565b600060405180830381600087803b15801561101b57600080fd5b505af192505050801561102c575060015b61116657611038614091565b8061104357506110c7565b7fc252bba88361f08cc26717a3864d409a6674d02c9749694be276bf009ce040a289898481811061107057fe5b9050602002016020810190611085919061330d565b88888581811061109157fe5b9050602002013583604051806020016040528060008152506040516110b994939291906138f4565b60405180910390a150611166565b3d8080156110f1576040519150601f19603f3d011682016040523d82523d6000602084013e6110f6565b606091505b507fc252bba88361f08cc26717a3864d409a6674d02c9749694be276bf009ce040a289898481811061112457fe5b9050602002016020810190611139919061330d565b88888581811061114557fe5b905060200201358360405161115c9392919061392e565b60405180910390a1505b600101610f8e565b5050505050505050565b60026020526000908152604090205460ff1681565b6000546001600160a01b031633146111d8576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c908390a3600080546001600160a01b0319169055565b6001546001600160a01b03163314611281576040805162461bcd60e51b815260206004820152600d60248201527f6e6f74206e6f6d696e6174656400000000000000000000000000000000000000604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001600160a01b03811660009081526009602090815260409182902060030180548351818402810184019094528084526060939283018282801561135257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611334575b505050505090505b919050565b6000546001600160a01b031633146113aa576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6113b2610b4b565b156113f7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6108ca6128c2565b61140833612108565b6114245760405162461bcd60e51b815260040161062290613d57565b60005461143e906001600160a01b03848116911683612857565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051610b2f9291906138db565b6000546001600160a01b031681565b600154600160c81b900460ff1681565b6004546001600160a01b031681565b6006546001600160a01b031681565b6114b533612108565b6114d15760405162461bcd60e51b815260040161062290613d57565b87518751811480156114e35750808751145b80156114ef5750808651145b80156114fb5750808551145b80156115075750808451145b80156115135750808351145b801561151f5750808251145b61153b5760405162461bcd60e51b815260040161062290613b68565b60005b8181101561174357306001600160a01b031663b8a0258d8b838151811061156157fe5b60200260200101518b848151811061157557fe5b60200260200101518b858151811061158957fe5b60200260200101518b868151811061159d57fe5b60200260200101518b87815181106115b157fe5b60200260200101518b88815181106115c557fe5b60200260200101518b89815181106115d957fe5b60200260200101518b8a815181106115ed57fe5b60200260200101516040518963ffffffff1660e01b8152600401611618989796959493929190613a58565b600060405180830381600087803b15801561163257600080fd5b505af1925050508015611643575060015b61173b5761164f614091565b8061165a57506116bd565b7f5d257873bd31a4ef901eefe446bbea52231cc81112ba4c61b319ca53268127728b838151811061168757fe5b602002602001015182604051806020016040528060008152506040516116af9392919061386e565b60405180910390a15061173b565b3d8080156116e7576040519150601f19603f3d011682016040523d82523d6000602084013e6116ec565b606091505b507f5d257873bd31a4ef901eefe446bbea52231cc81112ba4c61b319ca53268127728b838151811061171a57fe5b6020026020010151826040516117319291906138ac565b60405180910390a1505b60010161153e565b50505050505050505050565b600154600160d81b900460ff1681565b61176833612108565b6117845760405162461bcd60e51b815260040161062290613d57565b610e108163ffffffff1610156117ac5760405162461bcd60e51b815260040161062290613e33565b600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b63ffffffff8416021790556040517f890e290c975ea254132a694596f86edbf9e7e7a8e3090438b754382c6b8cefbb90611812908390613fe7565b60405180910390a150565b6005546001600160a01b031681565b6000546001600160a01b03163314611877576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f9e442e9b890aa8c119c011ea97d6e82df7d1a781c1575d17a565d266a87dae129061181290839061383f565b3330146118ee576118d233612108565b6118ee5760405162461bcd60e51b815260040161062290613d57565b6118f789612102565b6119135760405162461bcd60e51b815260040161062290613ea1565b60ff8816600090815260086020526040902054611938906001600160a01b0316612102565b6119545760405162461bcd60e51b815260040161062290613d8e565b60028610156119755760405162461bcd60e51b815260040161062290613c7b565b6001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016878760001981018181106119af57fe5b90506020020160208101906119c4919061330d565b6001600160a01b0316146119ea5760405162461bcd60e51b815260040161062290613ed8565b60648560ff161115611a0e5760405162461bcd60e51b815260040161062290613ad4565b60648460ff161115611a325760405162461bcd60e51b815260040161062290613c0d565b80821115611a525760405162461bcd60e51b815260040161062290613e6a565b6001600160a01b0389166000908152600960205260409020805460ff191660ff8a16178155611a85600382018989613026565b50805461ff00191661010060ff888116919091029190911762ff00001916620100008783160217808355851515600160381b909104909116151514611b1857805467ff000000000000001916600160381b851515021781556040517f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d9203890611b0f908c908790613853565b60405180910390a15b60018101839055600281018290556040517faf033f69586a5a11b9fb76f72a3ff2e0afdf7e308c5a9ddf56cfb4322bec99fa90611b64908c908c908c908c908c908c908b908b906139cb565b60405180910390a150505050505050505050565b6008602052600090815260409020546001600160a01b031681565b600154600160a81b900463ffffffff1681565b611baf33612108565b611bcb5760405162461bcd60e51b815260040161062290613d57565b828114611bea5760405162461bcd60e51b815260040161062290613b68565b60005b8381101561081757611c0483838381811061066457fe5b611c205760405162461bcd60e51b815260040161062290613c44565b600154600160d01b900460ff16858583818110611c3957fe5b905060200201351115611c5e5760405162461bcd60e51b815260040161062290613dc5565b828282818110611c6a57fe5b9050602002016020810190611c7f919061330d565b60076000878785818110611c8f57fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600154600160d01b900460ff16858583818110611cdf57fe5b905060200201351415611d2a576001805460ff600160d01b80830482168401909116027fffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b7f761ab005d4d857f7788e11162cbb52f82eacefb02e69470d644666a42b98f2cc858583818110611d5757fe5b90506020020135848484818110611d6a57fe5b9050602002016020810190611d7f919061330d565b604051611d8d929190613f86565b60405180910390a1600101611bed565b6000546001600160a01b03163314611de8576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b60648160ff161115611e0c5760405162461bcd60e51b815260040161062290613b9f565b600180547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8416021790556040517fc57aba0dc6ec236e9a847d56685af5c3cad259c777f01dcde885bd423d2eee2490611812908390613ff8565b6000546001600160a01b03163314611eba576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0383161790556040517fe8430e1d6b6253a12ff526a2557c17dd74a5536493a74c061695de45dfae6e239061181290839061383f565b6000546001600160a01b03163314611f50576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383161790556040517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39061181290839061383f565b6000546001600160a01b03163314611fe6576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b611fef81612102565b61200b5760405162461bcd60e51b815260040161062290613d20565b600480546001600160a01b0319166001600160a01b0383161790556040517f02c05fb73e764eb909fe065f194dfc51499ac7177131a2aeb25da09b5df907349061181290839061383f565b61205f33612108565b61207b5760405162461bcd60e51b815260040161062290613d57565b6001600160a01b0382166000908152600960205260409020805460ff600160381b90910416151582151514610eef57805467ff000000000000001916600160381b831515021781556040517f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d92038906120f59085908590613853565b60405180910390a1505050565b3b151590565b6001600160a01b03811660009081526002602052604081205460ff168061213c57506000546001600160a01b038381169116145b156121495750600161135a565b50600061135a565b612159610b4b565b6121aa576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6121e0612947565b604080516001600160a01b039092168252519081900360200190a1565b60008261220c57506000612259565b8282028284828161221957fe5b04146122565760405162461bcd60e51b815260040180806020018281038252602181526020018061415d6021913960400191505060405180910390fd5b90505b92915050565b60008082116122b5576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816122be57fe5b049392505050565b60008282111561231d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008060008060005b600154600160d01b900460ff1681101561245357600081815260076020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182169650908916906370a082319061239b90889060040161383f565b60206040518083038186803b1580156123b357600080fd5b505afa1580156123c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123eb9190613754565b9350856123f8838661294b565b111561240f5761240886836122c6565b9250612413565b8392505b8261241d5761244b565b6124326001600160a01b0389168689866129a5565b61243c828461294b565b91508582141561244b57612453565b60010161232c565b508481146124735760405162461bcd60e51b815260040161062290613b0b565b50505050505050565b60015460009061249e90606490610ca7908590600160c81b900460ff166121fd565b90508015612575576005546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116926340c10f199261251492919091169085906004016138db565b600060405180830381600087803b15801561252e57600080fd5b505af1158015612542573d6000803e3d6000fd5b505050507f384910d170ac9ee2eab04d4c079ef744239a826a800eeb568f1d367d3eb7147581604051610b2f9190613f7d565b5050565b6000806000831161259c5760405162461bcd60e51b815260040161062290613cb2565b6125a533612108565b6125ca5783608001516125ca5760405162461bcd60e51b815260040161062290613f46565b6125e96064610ca7866020015160ff16866121fd90919063ffffffff16565b90506125f583826122c6565b91508115612689578360a001518210156126215760405162461bcd60e51b815260040161062290613ce9565b8360c001518211156126455760405162461bcd60e51b815260040161062290613bd6565b600154606085015161266b9163ffffffff91821691600160a81b90910481169061294b16565b42116126895760405162461bcd60e51b815260040161062290613f0f565b9250929050565b81156108175760006127018685876003018054806020026020016040519081016040528092919081815260200182805480156126f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116126d7575b50505050508686612a1e565b855466ffffffff000000191663010000004263ffffffff160217808755600187015460028801546040519394507f147a11a26edd23cd74d00e505c95b4c392991dcf6eeb9dc8457f1947b02099a393612774938b9389938893610100840460ff908116946201000090041692919061398d565b60405180910390a1604080516101008082018352875460ff8082168452918104821660208085019190915262010000820483168486015263ffffffff63010000008304166060850152600160381b90910490911615156080830152600188015460a0830152600288015460c083015260038801805484518184028101840190955280855261284e948a9360e086019391929083018282801561283f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612821575b50505050508152505082612b27565b610eeb8161247c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610eef908490612c17565b6128ca610b4b565b1561290f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121e05b3390565b600082820183811015612256576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03167f23b872dd00000000000000000000000000000000000000000000000000000000179052612a18908590612c17565b50505050565b6000612a366001600160a01b03871686600019612cc8565b6040517f38ed173900000000000000000000000000000000000000000000000000000000815285906060906001600160a01b038316906338ed173990612a8b90889088908b903090603c420190600401613fab565b600060405180830381600087803b158015612aa557600080fd5b505af1158015612ab9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ae19190810190613692565b905080600187510381518110612af357fe5b60200260200101519250612b1c8760008a6001600160a01b0316612cc89092919063ffffffff16565b505095945050505050565b6000612b486064610ca7856040015160ff16856121fd90919063ffffffff16565b90508015612b8a57600354612b8a906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612857565b6000612b9683836122c6565b90508015612bd857600454612bd8906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000008116911683612857565b7fd4d626561e9dc8e892258af0fcfd4baf2b993f9bd93126e36642fe7ee81b1c2a8282604051612c09929190613f9d565b60405180910390a150505050565b6060612c6c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e0d9092919063ffffffff16565b805190915015610eef57808060200190516020811015612c8b57600080fd5b5051610eef5760405162461bcd60e51b815260040180806020018281038252602a81526020018061417e602a913960400191505060405180910390fd5b801580612d675750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d3957600080fd5b505afa158015612d4d573d6000803e3d6000fd5b505050506040513d6020811015612d6357600080fd5b5051155b612da25760405162461bcd60e51b81526004018080602001828103825260368152602001806141a86036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167f095ea7b300000000000000000000000000000000000000000000000000000000179052610eef908490612c17565b6060612e1c8484600085612e26565b90505b9392505050565b606082471015612e675760405162461bcd60e51b81526004018080602001828103825260268152602001806141376026913960400191505060405180910390fd5b612e7085612102565b612ec1576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612f005780518252601f199092019160209182019101612ee1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612f62576040519150601f19603f3d011682016040523d82523d6000602084013e612f67565b606091505b5091509150612f77828286612f82565b979650505050505050565b60608315612f91575081612e1f565b825115612fa15782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612feb578181015183820152602001612fd3565b50505050905090810190601f1680156130185780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b828054828255906000526020600020908101928215613079579160200282015b828111156130795781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613046565b50613085929150613089565b5090565b5b80821115613085576000815560010161308a565b80356001600160a01b038116811461135a57600080fd5b60008083601f8401126130c6578182fd5b50813567ffffffffffffffff8111156130dd578182fd5b602083019150836020808302850101111561268957600080fd5b600082601f830112613107578081fd5b813561311a6131158261406d565b614049565b81815291506020808301908481018184028601820187101561313b57600080fd5b60005b848110156131615761314f8261309e565b8452928201929082019060010161313e565b505050505092915050565b600082601f83011261317c578081fd5b813561318a6131158261406d565b818152915060208083019084810160005b84811015613161576131b2888484358a01016130f7565b8452928201929082019060010161319b565b600082601f8301126131d4578081fd5b81356131e26131158261406d565b81815291506020808301908481018184028601820187101561320357600080fd5b60005b8481101561316157613217826132ec565b84529282019290820190600101613206565b600082601f830112613239578081fd5b81356132476131158261406d565b81815291506020808301908481018184028601820187101561326857600080fd5b60005b848110156131615781358452928201929082019060010161326b565b600082601f830112613297578081fd5b81356132a56131158261406d565b8181529150602080830190848101818402860182018710156132c657600080fd5b60005b84811015613161576132da826132fc565b845292820192908201906001016132c9565b8035801515811461135a57600080fd5b803560ff8116811461135a57600080fd5b60006020828403121561331e578081fd5b612e1f8261309e565b60008060408385031215613339578081fd5b6133428361309e565b9150613350602084016132ec565b90509250929050565b6000806040838503121561336b578182fd5b6133748361309e565b946020939093013593505050565b600080600060608486031215613396578081fd5b61339f8461309e565b95602085013595506040909401359392505050565b60008060008060008060008060006101008a8c0312156133d2578485fd5b6133db8a61309e565b98506133e960208b016132fc565b975060408a013567ffffffffffffffff811115613404578586fd5b6134108c828d016130b5565b9098509650613423905060608b016132fc565b945061343160808b016132fc565b935061343f60a08b016132ec565b925060c08a0135915060e08a013590509295985092959850929598565b60008060008060408587031215613471578182fd5b843567ffffffffffffffff80821115613488578384fd5b613494888389016130b5565b909650945060208701359150808211156134ac578384fd5b506134b9878288016130b5565b95989497509550505050565b600080600080600080606087890312156134dd578384fd5b863567ffffffffffffffff808211156134f4578586fd5b6135008a838b016130b5565b90985096506020890135915080821115613518578586fd5b6135248a838b016130b5565b9096509450604089013591508082111561353c578384fd5b5061354989828a016130b5565b979a9699509497509295939492505050565b600080600080600080600080610100898b031215613577578182fd5b883567ffffffffffffffff8082111561358e578384fd5b61359a8c838d016130f7565b995060208b01359150808211156135af578384fd5b6135bb8c838d01613287565b985060408b01359150808211156135d0578384fd5b6135dc8c838d0161316c565b975060608b01359150808211156135f1578384fd5b6135fd8c838d01613287565b965060808b0135915080821115613612578384fd5b61361e8c838d01613287565b955060a08b0135915080821115613633578384fd5b61363f8c838d016131c4565b945060c08b0135915080821115613654578384fd5b6136608c838d01613229565b935060e08b0135915080821115613675578283fd5b506136828b828c01613229565b9150509295985092959890939650565b600060208083850312156136a4578182fd5b825167ffffffffffffffff8111156136ba578283fd5b8301601f810185136136ca578283fd5b80516136d86131158261406d565b81815283810190838501858402850186018910156136f4578687fd5b8694505b838510156137165780518352600194909401939185019185016136f8565b50979650505050505050565b600060208284031215613733578081fd5b612e1f826132ec565b60006020828403121561374d578081fd5b5035919050565b600060208284031215613765578081fd5b5051919050565b60006020828403121561377d578081fd5b813563ffffffff81168114612256578182fd5b6000602082840312156137a1578081fd5b612e1f826132fc565b6000815180845260208085019450808401835b838110156137e25781516001600160a01b0316875295820195908201906001016137bd565b509495945050505050565b60008151808452815b81811015613812576020818501810151868301820152016137f6565b818111156138235782602083870101525b50601f01601f19169290920160200192915050565b60ff169052565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b60006001600160a01b03851682526060602083015261389060608301856137ed565b82810360408401526138a281856137ed565b9695505050505050565b60006001600160a01b03841682526060602083015280606083015260806040830152612e1c60808301846137ed565b6001600160a01b03929092168252602082015260400190565b60006001600160a01b03861682528460208301526080604083015261391c60808301856137ed565b8281036060840152612f7781856137ed565b60006001600160a01b03851682528360208301526080604083015280608083015260a0606083015261396360a08301846137ed565b95945050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b039790971687526020870195909552604086019390935260ff918216606086015216608084015260a083015260c082015260e00190565b600060e082016001600160a01b03808c168452602060ff8c168186015260e06040860152828a8452610100860190508b9350845b8b811015613a245783613a118661309e565b16825293820193908201906001016139ff565b508094505050505060ff86166060830152613a426080830186613838565b60a082019390935260c001529695505050505050565b60006101006001600160a01b038b16835260ff8a166020840152806040840152613a848184018a6137aa565b60ff98891660608501529690971660808301525092151560a084015260c083019190915260e090910152949350505050565b600060208252612e1f60208301846137aa565b901515815260200190565b60208082526011908201527f696e636f7272656374204c466163746f72000000000000000000000000000000604082015260600190565b60208082526021908201527f696e73756666696369656e7420616d6f756e74206f662066656520746f6b656e60408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f696e707574206e6f74207468652073616d65206c656e67746800000000000000604082015260600190565b60208082526017908201527f696e636f7272656374206d696e696e6720666163746f72000000000000000000604082015260600190565b6020808252601b908201527f616d6f756e742067726561746572207468616e206d6178206275790000000000604082015260600190565b60208082526011908201527f696e636f72726563742052466163746f72000000000000000000000000000000604082015260600190565b6020808252601a908201527f7374726174656779206973206e6f74206120636f6e7472616374000000000000604082015260600190565b60208082526011908201527f696e76616c696420737761702070617468000000000000000000000000000000604082015260600190565b60208082526015908201527f7a65726f2066656520746f6b656e20616d6f756e740000000000000000000000604082015260600190565b60208082526018908201527f616d6f756e74206c657373207468616e206d696e206275790000000000000000604082015260600190565b6020808252601d908201527f4c6f6e207374616b696e67206973206e6f74206120636f6e7472616374000000604082015260600190565b6020808252601f908201527f6f6e6c79206f70657261746f72206f72206f776e65722063616e2063616c6c00604082015260600190565b6020808252601a908201527f65786368616e6765206973206e6f74206120636f6e7472616374000000000000604082015260600190565b60208082526012908201527f696e646578206f7574206f6620626f756e640000000000000000000000000000604082015260600190565b60208082526011908201527f6f6e6c7920454f412063616e2063616c6c000000000000000000000000000000604082015260600190565b60208082526018908201527f696e76616c6964206275796261636b20696e74657276616c0000000000000000604082015260600190565b6020808252601b908201527f696e636f7272656374206d696e42757920616e64206d61784275790000000000604082015260600190565b6020808252601b908201527f66656520746f6b656e206973206e6f74206120636f6e74726163740000000000604082015260600190565b60208082526018908201527f6f757470757420746f6b656e206d757374206265204c4f4e0000000000000000604082015260600190565b6020808252601a908201527f616c72656164792061206275796261636b20726563656e746c79000000000000604082015260600190565b60208082526018908201527f66656520746f6b656e206973206e6f7420656e61626c65640000000000000000604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b600086825285602083015260a06040830152613fca60a08301866137aa565b6001600160a01b0394909416606083015250608001529392505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60ff9788168152958716602087015293909516604085015263ffffffff9190911660608401521515608083015260a082019290925260c081019190915260e00190565b60405181810167ffffffffffffffff8111828210171561406557fe5b604052919050565b600067ffffffffffffffff82111561408157fe5b5060209081020190565b60e01c90565b600060443d10156140a157610b59565b600481823e6308c379a06140b5825161408b565b146140bf57610b59565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156140ef5750505050610b59565b828401925082519150808211156141095750505050610b59565b503d8301602082840101111561412157505050610b59565b601f01601f191681016020016040529150509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220df65c620b4337ce81a1d64f7e205d494eef6b29f0f118968d5a17f2aa214af9464736f6c634300070400330000000000000000000000000000000000095413afc295d19edeb1ad7b71c9520000000000000000000000009afc226dc049b99342ad6774eeb08bfa2f874465000000000000000000000000def3a34689fb7506e75b581c6cde664c9560ca110000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000000006400000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a000000000000000000000000f88506b0f1d30056b9e5580668d5875b9cd30f23000000000000000000000000292a6921efc261070a0d5c96911c102cbf1045e400000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102925760003560e01c80638980f11f11610160578063b54f8a92116100d8578063dc95c9101161008c578063f0f4426011610071578063f0f44260146104df578063f4789e7e146104f2578063fb4151401461050557610292565b8063dc95c910146104b9578063f008088d146104cc57610292565b8063d145e82b116100bd578063d145e82b1461047e578063d8bad99a14610491578063db750cb1146104a657610292565b8063b54f8a9214610458578063b8a0258d1461046b57610292565b8063a2d3c7e61161012f578063a647c9b111610114578063a647c9b114610435578063a81c53151461043d578063b08710d71461045057610292565b8063a2d3c7e61461041a578063a474ac501461042257610292565b80638980f11f146103ef5780638da5cb5b146104025780639e6531401461040a578063a06a48e11461041257610292565b80635c975abb1161020e5780636d70f7ae116101c257806379ba5097116101a757806379ba5097146103bf5780637e200546146103c75780638456cb59146103e757610292565b80636d70f7ae146103a4578063715018a6146103b757610292565b8063643481af116101f3578063643481af1461036b5780636671ce1f1461037e5780636cde15881461039157610292565b80635c975abb1461034e57806361d027b31461036357610292565b806353116c381161026557806354a7965d1161024a57806354a7965d1461031e578063558a72971461032657806357c698ed1461033957610292565b806353116c38146102f657806353a47bb71461030957610292565b80631627540c1461029757806316605a0d146102ac5780631bac19cc146102db5780633f4ba83a146102ee575b600080fd5b6102aa6102a536600461330d565b610518565b005b6102bf6102ba36600461330d565b6105ad565b6040516102d29796959493929190614006565b60405180910390f35b6102aa6102e936600461345c565b6105fd565b6102aa61081e565b6102aa61030436600461345c565b6108cc565b610311610a5b565b6040516102d2919061383f565b610311610a6a565b6102aa610334366004613327565b610a8e565b610341610b3b565b6040516102d29190613ff8565b610356610b4b565b6040516102d29190613ac9565b610311610b5c565b61031161037936600461373c565b610b6b565b6102aa61038c366004613382565b610b86565b6102aa61039f3660046134c5565b610ef4565b6103566103b236600461330d565b611178565b6102aa61118d565b6102aa611222565b6103da6103d536600461330d565b6112e5565b6040516102d29190613ab6565b6102aa61135f565b6102aa6103fd366004613359565b6113ff565b61031161146f565b61034161147e565b61031161148e565b61031161149d565b6102aa61043036600461355b565b6114ac565b61034161174f565b6102aa61044b36600461376c565b61175f565b61031161181d565b6102aa61046636600461330d565b61182c565b6102aa6104793660046133b4565b6118c2565b61031161048c36600461373c565b611b78565b610499611b93565b6040516102d29190613fe7565b6102aa6104b436600461345c565b611ba6565b6102aa6104c7366004613790565b611d9d565b6102aa6104da36600461330d565b611e6f565b6102aa6104ed36600461330d565b611f05565b6102aa61050036600461330d565b611f9b565b6102aa610513366004613327565b612056565b6000546001600160a01b03163314610563576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0383169081179091556040517f906a1c6bd7e3091ea86693dd029a831c19049ce77f1dce2ce0bab1cacbabce2290600090a250565b60096020526000908152604090208054600182015460029092015460ff80831693610100840482169362010000810483169363ffffffff630100000083041693600160381b909204909116919087565b61060633612108565b61062b5760405162461bcd60e51b815260040161062290613d57565b60405180910390fd5b82811461064a5760405162461bcd60e51b815260040161062290613b68565b60005b838110156108175761067e83838381811061066457fe5b9050602002016020810190610679919061330d565b612102565b61069a5760405162461bcd60e51b815260040161062290613d8e565b600154600160d81b900460ff168585838181106106b357fe5b9050602002013511156106d85760405162461bcd60e51b815260040161062290613dc5565b8282828181106106e457fe5b90506020020160208101906106f9919061330d565b6008600087878581811061070957fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600154600160d81b900460ff1685858381811061075957fe5b9050602002013514156107a4576001805460ff600160d81b80830482168401909116027fffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b7f87dfda767db80601457eaecfea13c08d2bbd8610572aac5773b637874eb11e268585838181106107d157fe5b905060200201358484848181106107e457fe5b90506020020160208101906107f9919061330d565b604051610807929190613f86565b60405180910390a160010161064d565b5050505050565b6000546001600160a01b03163314610869576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b610871610b4b565b6108c2576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6108ca612151565b565b6108d533612108565b6108f15760405162461bcd60e51b815260040161062290613d57565b8281146109105760405162461bcd60e51b815260040161062290613b68565b60005b838110156108175760006009600087878581811061092d57fe5b9050602002016020810190610942919061330d565b6001600160a01b03166001600160a01b03168152602001908152602001600020905083838381811061097057fe5b90506020020160208101906109859190613722565b815460ff600160381b90910416151590151514610a52578383838181106109a857fe5b90506020020160208101906109bd9190613722565b8154901515600160381b0267ff00000000000000199091161781557f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d92038868684818110610a0557fe5b9050602002016020810190610a1a919061330d565b858585818110610a2657fe5b9050602002016020810190610a3b9190613722565b604051610a49929190613853565b60405180910390a15b50600101610913565b6001546001600160a01b031681565b7f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c95281565b6000546001600160a01b03163314610ad9576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6001600160a01b03821660009081526002602052604090819020805460ff1916831515179055517f1618a22a3b00b9ac70fd5a82f1f5cdd8cb272bd0f1b740ddf7c26ab05881dd5b90610b2f9084908490613853565b60405180910390a15050565b600154600160d01b900460ff1681565b600154600160a01b900460ff165b90565b6003546001600160a01b031681565b6007602052600090815260409020546001600160a01b031681565b610b8e610b4b565b15610bd3576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b333014610bf957333214610bf95760405162461bcd60e51b815260040161062290613dfc565b6001600160a01b038084166000818152600960205260409020917f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c952161415610d93578054600160381b900460ff16610c635760405162461bcd60e51b815260040161062290613f46565b8060010154831015610c875760405162461bcd60e51b815260040161062290613ce9565b8054600090610cad90606490610ca790879062010000900460ff166121fd565b9061225f565b90506000610cbb85836122c6565b600354909150610cf6907f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c952906001600160a01b031684612323565b600454610d2e907f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c952906001600160a01b031683612323565b7fd4d626561e9dc8e892258af0fcfd4baf2b993f9bd93126e36642fe7ee81b1c2a8282604051610d5f929190613f9d565b60405180910390a1610d708561247c565b5050805466ffffffff000000191663010000004263ffffffff1602179055610eef565b604080516101008082018352835460ff8082168452918104821660208085019190915262010000820483168486015263ffffffff63010000008304166060850152600160381b90910490911615156080830152600184015460a0830152600284015460c08301526003840180548451818402810184019095528085526000948594610e6a949093889360e086019392830182828015610e5b57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311610e3d575b50505050508152505086612579565b915091508160001415610e9457600654610e8f9087906001600160a01b031683612323565b610eeb565b610e9f863087612323565b825460ff16600090815260086020526040902054610ecb90879085906001600160a01b03168588612690565b8015610eeb57600654610eeb906001600160a01b03888116911683612857565b5050505b505050565b610efc610b4b565b15610f41576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b333214610f605760405162461bcd60e51b815260040161062290613dfc565b848381148015610f6f57508181145b610f8b5760405162461bcd60e51b815260040161062290613b68565b60005b8181101561116e5730636671ce1f898984818110610fa857fe5b9050602002016020810190610fbd919061330d565b888885818110610fc957fe5b90506020020135878786818110610fdc57fe5b905060200201356040518463ffffffff1660e01b81526004016110019392919061396c565b600060405180830381600087803b15801561101b57600080fd5b505af192505050801561102c575060015b61116657611038614091565b8061104357506110c7565b7fc252bba88361f08cc26717a3864d409a6674d02c9749694be276bf009ce040a289898481811061107057fe5b9050602002016020810190611085919061330d565b88888581811061109157fe5b9050602002013583604051806020016040528060008152506040516110b994939291906138f4565b60405180910390a150611166565b3d8080156110f1576040519150601f19603f3d011682016040523d82523d6000602084013e6110f6565b606091505b507fc252bba88361f08cc26717a3864d409a6674d02c9749694be276bf009ce040a289898481811061112457fe5b9050602002016020810190611139919061330d565b88888581811061114557fe5b905060200201358360405161115c9392919061392e565b60405180910390a1505b600101610f8e565b5050505050505050565b60026020526000908152604090205460ff1681565b6000546001600160a01b031633146111d8576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600080546040516001600160a01b03909116907fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c908390a3600080546001600160a01b0319169055565b6001546001600160a01b03163314611281576040805162461bcd60e51b815260206004820152600d60248201527f6e6f74206e6f6d696e6174656400000000000000000000000000000000000000604482015290519081900360640190fd5b600154600080546040516001600160a01b0393841693909116917fb532073b38c83145e3e5135377a08bf9aab55bc0fd7c1179cd4fb995d2a5159c91a360018054600080546001600160a01b03199081166001600160a01b03841617909155169055565b6001600160a01b03811660009081526009602090815260409182902060030180548351818402810184019094528084526060939283018282801561135257602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611334575b505050505090505b919050565b6000546001600160a01b031633146113aa576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b6113b2610b4b565b156113f7576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6108ca6128c2565b61140833612108565b6114245760405162461bcd60e51b815260040161062290613d57565b60005461143e906001600160a01b03848116911683612857565b7f8c1256b8896378cd5044f80c202f9772b9d77dc85c8a6eb51967210b09bfaa288282604051610b2f9291906138db565b6000546001600160a01b031681565b600154600160c81b900460ff1681565b6004546001600160a01b031681565b6006546001600160a01b031681565b6114b533612108565b6114d15760405162461bcd60e51b815260040161062290613d57565b87518751811480156114e35750808751145b80156114ef5750808651145b80156114fb5750808551145b80156115075750808451145b80156115135750808351145b801561151f5750808251145b61153b5760405162461bcd60e51b815260040161062290613b68565b60005b8181101561174357306001600160a01b031663b8a0258d8b838151811061156157fe5b60200260200101518b848151811061157557fe5b60200260200101518b858151811061158957fe5b60200260200101518b868151811061159d57fe5b60200260200101518b87815181106115b157fe5b60200260200101518b88815181106115c557fe5b60200260200101518b89815181106115d957fe5b60200260200101518b8a815181106115ed57fe5b60200260200101516040518963ffffffff1660e01b8152600401611618989796959493929190613a58565b600060405180830381600087803b15801561163257600080fd5b505af1925050508015611643575060015b61173b5761164f614091565b8061165a57506116bd565b7f5d257873bd31a4ef901eefe446bbea52231cc81112ba4c61b319ca53268127728b838151811061168757fe5b602002602001015182604051806020016040528060008152506040516116af9392919061386e565b60405180910390a15061173b565b3d8080156116e7576040519150601f19603f3d011682016040523d82523d6000602084013e6116ec565b606091505b507f5d257873bd31a4ef901eefe446bbea52231cc81112ba4c61b319ca53268127728b838151811061171a57fe5b6020026020010151826040516117319291906138ac565b60405180910390a1505b60010161153e565b50505050505050505050565b600154600160d81b900460ff1681565b61176833612108565b6117845760405162461bcd60e51b815260040161062290613d57565b610e108163ffffffff1610156117ac5760405162461bcd60e51b815260040161062290613e33565b600180547fffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffffff16600160a81b63ffffffff8416021790556040517f890e290c975ea254132a694596f86edbf9e7e7a8e3090438b754382c6b8cefbb90611812908390613fe7565b60405180910390a150565b6005546001600160a01b031681565b6000546001600160a01b03163314611877576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600580546001600160a01b0319166001600160a01b0383161790556040517f9e442e9b890aa8c119c011ea97d6e82df7d1a781c1575d17a565d266a87dae129061181290839061383f565b3330146118ee576118d233612108565b6118ee5760405162461bcd60e51b815260040161062290613d57565b6118f789612102565b6119135760405162461bcd60e51b815260040161062290613ea1565b60ff8816600090815260086020526040902054611938906001600160a01b0316612102565b6119545760405162461bcd60e51b815260040161062290613d8e565b60028610156119755760405162461bcd60e51b815260040161062290613c7b565b6001600160a01b037f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c95216878760001981018181106119af57fe5b90506020020160208101906119c4919061330d565b6001600160a01b0316146119ea5760405162461bcd60e51b815260040161062290613ed8565b60648560ff161115611a0e5760405162461bcd60e51b815260040161062290613ad4565b60648460ff161115611a325760405162461bcd60e51b815260040161062290613c0d565b80821115611a525760405162461bcd60e51b815260040161062290613e6a565b6001600160a01b0389166000908152600960205260409020805460ff191660ff8a16178155611a85600382018989613026565b50805461ff00191661010060ff888116919091029190911762ff00001916620100008783160217808355851515600160381b909104909116151514611b1857805467ff000000000000001916600160381b851515021781556040517f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d9203890611b0f908c908790613853565b60405180910390a15b60018101839055600281018290556040517faf033f69586a5a11b9fb76f72a3ff2e0afdf7e308c5a9ddf56cfb4322bec99fa90611b64908c908c908c908c908c908c908b908b906139cb565b60405180910390a150505050505050505050565b6008602052600090815260409020546001600160a01b031681565b600154600160a81b900463ffffffff1681565b611baf33612108565b611bcb5760405162461bcd60e51b815260040161062290613d57565b828114611bea5760405162461bcd60e51b815260040161062290613b68565b60005b8381101561081757611c0483838381811061066457fe5b611c205760405162461bcd60e51b815260040161062290613c44565b600154600160d01b900460ff16858583818110611c3957fe5b905060200201351115611c5e5760405162461bcd60e51b815260040161062290613dc5565b828282818110611c6a57fe5b9050602002016020810190611c7f919061330d565b60076000878785818110611c8f57fe5b6020908102929092013583525081019190915260400160002080546001600160a01b0319166001600160a01b0392909216919091179055600154600160d01b900460ff16858583818110611cdf57fe5b905060200201351415611d2a576001805460ff600160d01b80830482168401909116027fffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffffff9091161790555b7f761ab005d4d857f7788e11162cbb52f82eacefb02e69470d644666a42b98f2cc858583818110611d5757fe5b90506020020135848484818110611d6a57fe5b9050602002016020810190611d7f919061330d565b604051611d8d929190613f86565b60405180910390a1600101611bed565b6000546001600160a01b03163314611de8576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b60648160ff161115611e0c5760405162461bcd60e51b815260040161062290613b9f565b600180547fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff16600160c81b60ff8416021790556040517fc57aba0dc6ec236e9a847d56685af5c3cad259c777f01dcde885bd423d2eee2490611812908390613ff8565b6000546001600160a01b03163314611eba576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600680546001600160a01b0319166001600160a01b0383161790556040517fe8430e1d6b6253a12ff526a2557c17dd74a5536493a74c061695de45dfae6e239061181290839061383f565b6000546001600160a01b03163314611f50576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b600380546001600160a01b0319166001600160a01b0383161790556040517fcb7ef3e545f5cdb893f5c568ba710fe08f336375a2d9fd66e161033f8fc09ef39061181290839061383f565b6000546001600160a01b03163314611fe6576040805162461bcd60e51b81526020600482015260096024820152683737ba1037bbb732b960b91b604482015290519081900360640190fd5b611fef81612102565b61200b5760405162461bcd60e51b815260040161062290613d20565b600480546001600160a01b0319166001600160a01b0383161790556040517f02c05fb73e764eb909fe065f194dfc51499ac7177131a2aeb25da09b5df907349061181290839061383f565b61205f33612108565b61207b5760405162461bcd60e51b815260040161062290613d57565b6001600160a01b0382166000908152600960205260409020805460ff600160381b90910416151582151514610eef57805467ff000000000000001916600160381b831515021781556040517f30f43b8e82d7d6b9dd6abd01752a4ab90b5a01c59e43fc1e87f7447e71d92038906120f59085908590613853565b60405180910390a1505050565b3b151590565b6001600160a01b03811660009081526002602052604081205460ff168061213c57506000546001600160a01b038381169116145b156121495750600161135a565b50600061135a565b612159610b4b565b6121aa576040805162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015290519081900360640190fd5b6001805460ff60a01b191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6121e0612947565b604080516001600160a01b039092168252519081900360200190a1565b60008261220c57506000612259565b8282028284828161221957fe5b04146122565760405162461bcd60e51b815260040180806020018281038252602181526020018061415d6021913960400191505060405180910390fd5b90505b92915050565b60008082116122b5576040805162461bcd60e51b815260206004820152601a60248201527f536166654d6174683a206469766973696f6e206279207a65726f000000000000604482015290519081900360640190fd5b8183816122be57fe5b049392505050565b60008282111561231d576040805162461bcd60e51b815260206004820152601e60248201527f536166654d6174683a207375627472616374696f6e206f766572666c6f770000604482015290519081900360640190fd5b50900390565b60008060008060005b600154600160d01b900460ff1681101561245357600081815260076020526040908190205490517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b039182169650908916906370a082319061239b90889060040161383f565b60206040518083038186803b1580156123b357600080fd5b505afa1580156123c7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123eb9190613754565b9350856123f8838661294b565b111561240f5761240886836122c6565b9250612413565b8392505b8261241d5761244b565b6124326001600160a01b0389168689866129a5565b61243c828461294b565b91508582141561244b57612453565b60010161232c565b508481146124735760405162461bcd60e51b815260040161062290613b0b565b50505050505050565b60015460009061249e90606490610ca7908590600160c81b900460ff166121fd565b90508015612575576005546040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b037f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c9528116926340c10f199261251492919091169085906004016138db565b600060405180830381600087803b15801561252e57600080fd5b505af1158015612542573d6000803e3d6000fd5b505050507f384910d170ac9ee2eab04d4c079ef744239a826a800eeb568f1d367d3eb7147581604051610b2f9190613f7d565b5050565b6000806000831161259c5760405162461bcd60e51b815260040161062290613cb2565b6125a533612108565b6125ca5783608001516125ca5760405162461bcd60e51b815260040161062290613f46565b6125e96064610ca7866020015160ff16866121fd90919063ffffffff16565b90506125f583826122c6565b91508115612689578360a001518210156126215760405162461bcd60e51b815260040161062290613ce9565b8360c001518211156126455760405162461bcd60e51b815260040161062290613bd6565b600154606085015161266b9163ffffffff91821691600160a81b90910481169061294b16565b42116126895760405162461bcd60e51b815260040161062290613f0f565b9250929050565b81156108175760006127018685876003018054806020026020016040519081016040528092919081815260200182805480156126f557602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116126d7575b50505050508686612a1e565b855466ffffffff000000191663010000004263ffffffff160217808755600187015460028801546040519394507f147a11a26edd23cd74d00e505c95b4c392991dcf6eeb9dc8457f1947b02099a393612774938b9389938893610100840460ff908116946201000090041692919061398d565b60405180910390a1604080516101008082018352875460ff8082168452918104821660208085019190915262010000820483168486015263ffffffff63010000008304166060850152600160381b90910490911615156080830152600188015460a0830152600288015460c083015260038801805484518184028101840190955280855261284e948a9360e086019391929083018282801561283f57602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311612821575b50505050508152505082612b27565b610eeb8161247c565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167fa9059cbb00000000000000000000000000000000000000000000000000000000179052610eef908490612c17565b6128ca610b4b565b1561290f576040805162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015290519081900360640190fd5b6001805460ff60a01b1916600160a01b1790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586121e05b3390565b600082820183811015612256576040805162461bcd60e51b815260206004820152601b60248201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03167f23b872dd00000000000000000000000000000000000000000000000000000000179052612a18908590612c17565b50505050565b6000612a366001600160a01b03871686600019612cc8565b6040517f38ed173900000000000000000000000000000000000000000000000000000000815285906060906001600160a01b038316906338ed173990612a8b90889088908b903090603c420190600401613fab565b600060405180830381600087803b158015612aa557600080fd5b505af1158015612ab9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612ae19190810190613692565b905080600187510381518110612af357fe5b60200260200101519250612b1c8760008a6001600160a01b0316612cc89092919063ffffffff16565b505095945050505050565b6000612b486064610ca7856040015160ff16856121fd90919063ffffffff16565b90508015612b8a57600354612b8a906001600160a01b037f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c9528116911683612857565b6000612b9683836122c6565b90508015612bd857600454612bd8906001600160a01b037f0000000000000000000000000000000000095413afc295d19edeb1ad7b71c9528116911683612857565b7fd4d626561e9dc8e892258af0fcfd4baf2b993f9bd93126e36642fe7ee81b1c2a8282604051612c09929190613f9d565b60405180910390a150505050565b6060612c6c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316612e0d9092919063ffffffff16565b805190915015610eef57808060200190516020811015612c8b57600080fd5b5051610eef5760405162461bcd60e51b815260040180806020018281038252602a81526020018061417e602a913960400191505060405180910390fd5b801580612d675750604080517fdd62ed3e0000000000000000000000000000000000000000000000000000000081523060048201526001600160a01b03848116602483015291519185169163dd62ed3e91604480820192602092909190829003018186803b158015612d3957600080fd5b505afa158015612d4d573d6000803e3d6000fd5b505050506040513d6020811015612d6357600080fd5b5051155b612da25760405162461bcd60e51b81526004018080602001828103825260368152602001806141a86036913960400191505060405180910390fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b03167f095ea7b300000000000000000000000000000000000000000000000000000000179052610eef908490612c17565b6060612e1c8484600085612e26565b90505b9392505050565b606082471015612e675760405162461bcd60e51b81526004018080602001828103825260268152602001806141376026913960400191505060405180910390fd5b612e7085612102565b612ec1576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b60208310612f005780518252601f199092019160209182019101612ee1565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612f62576040519150601f19603f3d011682016040523d82523d6000602084013e612f67565b606091505b5091509150612f77828286612f82565b979650505050505050565b60608315612f91575081612e1f565b825115612fa15782518084602001fd5b8160405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b83811015612feb578181015183820152602001612fd3565b50505050905090810190601f1680156130185780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b828054828255906000526020600020908101928215613079579160200282015b828111156130795781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190613046565b50613085929150613089565b5090565b5b80821115613085576000815560010161308a565b80356001600160a01b038116811461135a57600080fd5b60008083601f8401126130c6578182fd5b50813567ffffffffffffffff8111156130dd578182fd5b602083019150836020808302850101111561268957600080fd5b600082601f830112613107578081fd5b813561311a6131158261406d565b614049565b81815291506020808301908481018184028601820187101561313b57600080fd5b60005b848110156131615761314f8261309e565b8452928201929082019060010161313e565b505050505092915050565b600082601f83011261317c578081fd5b813561318a6131158261406d565b818152915060208083019084810160005b84811015613161576131b2888484358a01016130f7565b8452928201929082019060010161319b565b600082601f8301126131d4578081fd5b81356131e26131158261406d565b81815291506020808301908481018184028601820187101561320357600080fd5b60005b8481101561316157613217826132ec565b84529282019290820190600101613206565b600082601f830112613239578081fd5b81356132476131158261406d565b81815291506020808301908481018184028601820187101561326857600080fd5b60005b848110156131615781358452928201929082019060010161326b565b600082601f830112613297578081fd5b81356132a56131158261406d565b8181529150602080830190848101818402860182018710156132c657600080fd5b60005b84811015613161576132da826132fc565b845292820192908201906001016132c9565b8035801515811461135a57600080fd5b803560ff8116811461135a57600080fd5b60006020828403121561331e578081fd5b612e1f8261309e565b60008060408385031215613339578081fd5b6133428361309e565b9150613350602084016132ec565b90509250929050565b6000806040838503121561336b578182fd5b6133748361309e565b946020939093013593505050565b600080600060608486031215613396578081fd5b61339f8461309e565b95602085013595506040909401359392505050565b60008060008060008060008060006101008a8c0312156133d2578485fd5b6133db8a61309e565b98506133e960208b016132fc565b975060408a013567ffffffffffffffff811115613404578586fd5b6134108c828d016130b5565b9098509650613423905060608b016132fc565b945061343160808b016132fc565b935061343f60a08b016132ec565b925060c08a0135915060e08a013590509295985092959850929598565b60008060008060408587031215613471578182fd5b843567ffffffffffffffff80821115613488578384fd5b613494888389016130b5565b909650945060208701359150808211156134ac578384fd5b506134b9878288016130b5565b95989497509550505050565b600080600080600080606087890312156134dd578384fd5b863567ffffffffffffffff808211156134f4578586fd5b6135008a838b016130b5565b90985096506020890135915080821115613518578586fd5b6135248a838b016130b5565b9096509450604089013591508082111561353c578384fd5b5061354989828a016130b5565b979a9699509497509295939492505050565b600080600080600080600080610100898b031215613577578182fd5b883567ffffffffffffffff8082111561358e578384fd5b61359a8c838d016130f7565b995060208b01359150808211156135af578384fd5b6135bb8c838d01613287565b985060408b01359150808211156135d0578384fd5b6135dc8c838d0161316c565b975060608b01359150808211156135f1578384fd5b6135fd8c838d01613287565b965060808b0135915080821115613612578384fd5b61361e8c838d01613287565b955060a08b0135915080821115613633578384fd5b61363f8c838d016131c4565b945060c08b0135915080821115613654578384fd5b6136608c838d01613229565b935060e08b0135915080821115613675578283fd5b506136828b828c01613229565b9150509295985092959890939650565b600060208083850312156136a4578182fd5b825167ffffffffffffffff8111156136ba578283fd5b8301601f810185136136ca578283fd5b80516136d86131158261406d565b81815283810190838501858402850186018910156136f4578687fd5b8694505b838510156137165780518352600194909401939185019185016136f8565b50979650505050505050565b600060208284031215613733578081fd5b612e1f826132ec565b60006020828403121561374d578081fd5b5035919050565b600060208284031215613765578081fd5b5051919050565b60006020828403121561377d578081fd5b813563ffffffff81168114612256578182fd5b6000602082840312156137a1578081fd5b612e1f826132fc565b6000815180845260208085019450808401835b838110156137e25781516001600160a01b0316875295820195908201906001016137bd565b509495945050505050565b60008151808452815b81811015613812576020818501810151868301820152016137f6565b818111156138235782602083870101525b50601f01601f19169290920160200192915050565b60ff169052565b6001600160a01b0391909116815260200190565b6001600160a01b039290921682521515602082015260400190565b60006001600160a01b03851682526060602083015261389060608301856137ed565b82810360408401526138a281856137ed565b9695505050505050565b60006001600160a01b03841682526060602083015280606083015260806040830152612e1c60808301846137ed565b6001600160a01b03929092168252602082015260400190565b60006001600160a01b03861682528460208301526080604083015261391c60808301856137ed565b8281036060840152612f7781856137ed565b60006001600160a01b03851682528360208301526080604083015280608083015260a0606083015261396360a08301846137ed565b95945050505050565b6001600160a01b039390931683526020830191909152604082015260600190565b6001600160a01b039790971687526020870195909552604086019390935260ff918216606086015216608084015260a083015260c082015260e00190565b600060e082016001600160a01b03808c168452602060ff8c168186015260e06040860152828a8452610100860190508b9350845b8b811015613a245783613a118661309e565b16825293820193908201906001016139ff565b508094505050505060ff86166060830152613a426080830186613838565b60a082019390935260c001529695505050505050565b60006101006001600160a01b038b16835260ff8a166020840152806040840152613a848184018a6137aa565b60ff98891660608501529690971660808301525092151560a084015260c083019190915260e090910152949350505050565b600060208252612e1f60208301846137aa565b901515815260200190565b60208082526011908201527f696e636f7272656374204c466163746f72000000000000000000000000000000604082015260600190565b60208082526021908201527f696e73756666696369656e7420616d6f756e74206f662066656520746f6b656e60408201527f7300000000000000000000000000000000000000000000000000000000000000606082015260800190565b60208082526019908201527f696e707574206e6f74207468652073616d65206c656e67746800000000000000604082015260600190565b60208082526017908201527f696e636f7272656374206d696e696e6720666163746f72000000000000000000604082015260600190565b6020808252601b908201527f616d6f756e742067726561746572207468616e206d6178206275790000000000604082015260600190565b60208082526011908201527f696e636f72726563742052466163746f72000000000000000000000000000000604082015260600190565b6020808252601a908201527f7374726174656779206973206e6f74206120636f6e7472616374000000000000604082015260600190565b60208082526011908201527f696e76616c696420737761702070617468000000000000000000000000000000604082015260600190565b60208082526015908201527f7a65726f2066656520746f6b656e20616d6f756e740000000000000000000000604082015260600190565b60208082526018908201527f616d6f756e74206c657373207468616e206d696e206275790000000000000000604082015260600190565b6020808252601d908201527f4c6f6e207374616b696e67206973206e6f74206120636f6e7472616374000000604082015260600190565b6020808252601f908201527f6f6e6c79206f70657261746f72206f72206f776e65722063616e2063616c6c00604082015260600190565b6020808252601a908201527f65786368616e6765206973206e6f74206120636f6e7472616374000000000000604082015260600190565b60208082526012908201527f696e646578206f7574206f6620626f756e640000000000000000000000000000604082015260600190565b60208082526011908201527f6f6e6c7920454f412063616e2063616c6c000000000000000000000000000000604082015260600190565b60208082526018908201527f696e76616c6964206275796261636b20696e74657276616c0000000000000000604082015260600190565b6020808252601b908201527f696e636f7272656374206d696e42757920616e64206d61784275790000000000604082015260600190565b6020808252601b908201527f66656520746f6b656e206973206e6f74206120636f6e74726163740000000000604082015260600190565b60208082526018908201527f6f757470757420746f6b656e206d757374206265204c4f4e0000000000000000604082015260600190565b6020808252601a908201527f616c72656164792061206275796261636b20726563656e746c79000000000000604082015260600190565b60208082526018908201527f66656520746f6b656e206973206e6f7420656e61626c65640000000000000000604082015260600190565b90815260200190565b9182526001600160a01b0316602082015260400190565b918252602082015260400190565b600086825285602083015260a06040830152613fca60a08301866137aa565b6001600160a01b0394909416606083015250608001529392505050565b63ffffffff91909116815260200190565b60ff91909116815260200190565b60ff9788168152958716602087015293909516604085015263ffffffff9190911660608401521515608083015260a082019290925260c081019190915260e00190565b60405181810167ffffffffffffffff8111828210171561406557fe5b604052919050565b600067ffffffffffffffff82111561408157fe5b5060209081020190565b60e01c90565b600060443d10156140a157610b59565b600481823e6308c379a06140b5825161408b565b146140bf57610b59565b6040513d600319016004823e80513d67ffffffffffffffff81602484011181841117156140ef5750505050610b59565b828401925082519150808211156141095750505050610b59565b503d8301602082840101111561412157505050610b59565b601f01601f191681016020016040529150509056fe416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f7420737563636565645361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f20746f206e6f6e2d7a65726f20616c6c6f77616e6365a2646970667358221220df65c620b4337ce81a1d64f7e205d494eef6b29f0f118968d5a17f2aa214af9464736f6c63430007040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000000000000000095413afc295d19edeb1ad7b71c9520000000000000000000000009afc226dc049b99342ad6774eeb08bfa2f874465000000000000000000000000def3a34689fb7506e75b581c6cde664c9560ca110000000000000000000000000000000000000000000000000000000000015180000000000000000000000000000000000000000000000000000000000000006400000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a000000000000000000000000f88506b0f1d30056b9e5580668d5875b9cd30f23000000000000000000000000292a6921efc261070a0d5c96911c102cbf1045e400000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a
-----Decoded View---------------
Arg [0] : _LON_TOKEN_ADDR (address): 0x0000000000095413afC295d19EDeb1Ad7B71c952
Arg [1] : _owner (address): 0x9aFc226Dc049B99342Ad6774Eeb08BfA2F874465
Arg [2] : _operator (address): 0xDEF3a34689fb7506E75b581C6cdE664C9560Ca11
Arg [3] : _buyBackInterval (uint32): 86400
Arg [4] : _miningFactor (uint8): 100
Arg [5] : _treasury (address): 0x74C3cA9431C009dC35587591Dc90780078174f8a
Arg [6] : _lonStaking (address): 0xf88506B0F1d30056B9e5580668D5875b9cd30F23
Arg [7] : _miningTreasury (address): 0x292a6921Efc261070a0d5C96911c102cBF1045E4
Arg [8] : _feeTokenRecipient (address): 0x74C3cA9431C009dC35587591Dc90780078174f8a
-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000095413afc295d19edeb1ad7b71c952
Arg [1] : 0000000000000000000000009afc226dc049b99342ad6774eeb08bfa2f874465
Arg [2] : 000000000000000000000000def3a34689fb7506e75b581c6cde664c9560ca11
Arg [3] : 0000000000000000000000000000000000000000000000000000000000015180
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000064
Arg [5] : 00000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a
Arg [6] : 000000000000000000000000f88506b0f1d30056b9e5580668d5875b9cd30f23
Arg [7] : 000000000000000000000000292a6921efc261070a0d5c96911c102cbf1045e4
Arg [8] : 00000000000000000000000074c3ca9431c009dc35587591dc90780078174f8a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
[ 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.