Overview
S Balance
0 S
S Value
-More Info
Private Name Tags
ContractCreator
Loading...
Loading
Contract Name:
RewardRouterV2
Compiler Version
v0.6.12+commit.27d51765
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "../libraries/math/SafeMath.sol"; import "../libraries/token/IERC20.sol"; import "../libraries/token/SafeERC20.sol"; import "../libraries/utils/ReentrancyGuard.sol"; import "../libraries/utils/Address.sol"; import "./interfaces/IRewardTracker.sol"; import "./interfaces/IRewardRouterV2.sol"; import "./interfaces/IVester.sol"; import "./interfaces/INslpManager.sol"; import "../tokens/interfaces/IMintable.sol"; import "../tokens/interfaces/IWETH.sol"; import "../core/interfaces/INlpManager.sol"; import "../access/Governable.sol"; contract RewardRouterV2 is IRewardRouterV2, ReentrancyGuard, Governable { using SafeMath for uint256; using SafeERC20 for IERC20; using Address for address payable; bool public isInitialized; address public weth; address public navi; address public esNavi; address public bnNavi; address public nlp; // NAVI Liquidity Provider token address public nslp; // NSLP Liquidity Provider token address public stakedNaviTracker; address public bonusNaviTracker; address public feeNaviTracker; address public override stakedNlpTracker; address public override stakedNslpTracker; address public override feeNlpTracker; address public override feeNslpTracker; address public nlpManager; address public nslpManager; address public naviVester; address public nlpVester; address public nslpVester; mapping(address => address) public pendingReceivers; event StakeNavi(address account, address token, uint256 amount); event UnstakeNavi(address account, address token, uint256 amount); event StakeNlp(address account, uint256 amount); event StakeNslp(address account, uint256 amount); event UnstakeNlp(address account, uint256 amount); event UnstakeNslp(address account, uint256 amount); receive() external payable { require(msg.sender == weth, "Router: invalid sender"); } function initialize( address[] memory _configs // // address _weth, // address _navi, // address _esNavi, // address _bnNavi, // address _nlp, // address _nslp, // address _stakedNaviTracker, // address _bonusNaviTracker, // address _feeNaviTracker, // address _feeNlpTracker, // address _feeNslpTracker, // address _stakedNlpTracker, // address _stakedNslpTracker, // address _nlpManager, // address _nslpManager, // address _naviVester, // address _nlpVester, // address _nslpVester ) external onlyGov { require(!isInitialized, "RewardRouter: already initialized"); isInitialized = true; weth = _configs[0]; navi = _configs[1]; esNavi = _configs[2]; bnNavi = _configs[3]; nlp = _configs[4]; nslp = _configs[5]; stakedNaviTracker = _configs[6]; bonusNaviTracker = _configs[7]; feeNaviTracker = _configs[8]; feeNlpTracker = _configs[9]; feeNslpTracker = _configs[10]; stakedNlpTracker = _configs[11]; stakedNslpTracker = _configs[12]; nlpManager = _configs[13]; nslpManager = _configs[14]; naviVester = _configs[15]; nlpVester = _configs[16]; nslpVester = _configs[17]; } // to help users who accidentally send their tokens to this contract function withdrawToken(address _token, address _account, uint256 _amount) external onlyGov { IERC20(_token).safeTransfer(_account, _amount); } function batchStakeNaviForAccount(address[] memory _accounts, uint256[] memory _amounts) external nonReentrant onlyGov { address _navi = navi; for (uint256 i = 0; i < _accounts.length; i++) { _stakeNavi(msg.sender, _accounts[i], _navi, _amounts[i]); } } function stakeNaviForAccount(address _account, uint256 _amount) external nonReentrant onlyGov { _stakeNavi(msg.sender, _account, navi, _amount); } function stakeNavi(uint256 _amount) external nonReentrant { _stakeNavi(msg.sender, msg.sender, navi, _amount); } function stakeEsNavi(uint256 _amount) external nonReentrant { _stakeNavi(msg.sender, msg.sender, esNavi, _amount); } function unstakeNavi(uint256 _amount) external nonReentrant { _unstakeNavi(msg.sender, navi, _amount, true); } function unstakeEsNavi(uint256 _amount) external nonReentrant { _unstakeNavi(msg.sender, esNavi, _amount, true); } function mintAndStakeNlp(address _token, uint256 _amount, uint256 _minUsdn, uint256 _minNlp) external nonReentrant returns (uint256) { require(_amount > 0, "RewardRouter: invalid _amount"); address account = msg.sender; uint256 nlpAmount = INlpManager(nlpManager).addLiquidityForAccount(account, account, _token, _amount, _minUsdn, _minNlp); IRewardTracker(feeNlpTracker).stakeForAccount(account, account, nlp, nlpAmount); IRewardTracker(stakedNlpTracker).stakeForAccount(account, account, feeNlpTracker, nlpAmount); emit StakeNlp(account, nlpAmount); return nlpAmount; } function mintAndStakeNslp(address _token, uint256 _amount) external nonReentrant returns (uint256) { require(_amount > 0, "RewardRouter: invalid _amount"); address account = msg.sender; IERC20(_token).safeTransferFrom(msg.sender, address(this), _amount); IERC20(_token).safeIncreaseAllowance(nslpManager, _amount); uint256 nslpAmount = INslpManager(nslpManager).stake(account, _token, _amount); IRewardTracker(feeNslpTracker).stakeForAccount(account, account, nslp, nslpAmount); IRewardTracker(stakedNslpTracker).stakeForAccount(account, account, feeNslpTracker, nslpAmount); emit StakeNslp(account, nslpAmount); return nslpAmount; } function mintAndStakeNlpETH(uint256 _minUsdn, uint256 _minNlp) external payable nonReentrant returns (uint256) { require(msg.value > 0, "RewardRouter: invalid msg.value"); IWETH(weth).deposit{value: msg.value}(); IERC20(weth).approve(nlpManager, msg.value); address account = msg.sender; uint256 nlpAmount = INlpManager(nlpManager).addLiquidityForAccount(address(this), account, weth, msg.value, _minUsdn, _minNlp); IRewardTracker(feeNlpTracker).stakeForAccount(account, account, nlp, nlpAmount); IRewardTracker(stakedNlpTracker).stakeForAccount(account, account, feeNlpTracker, nlpAmount); emit StakeNlp(account, nlpAmount); return nlpAmount; } function unstakeAndRedeemNlp(address _tokenOut, uint256 _nlpAmount, uint256 _minOut, address _receiver) external nonReentrant returns (uint256) { require(_nlpAmount > 0, "RewardRouter: invalid _nlpAmount"); address account = msg.sender; IRewardTracker(stakedNlpTracker).unstakeForAccount(account, feeNlpTracker, _nlpAmount, account); IRewardTracker(feeNlpTracker).unstakeForAccount(account, nlp, _nlpAmount, account); uint256 amountOut = INlpManager(nlpManager).removeLiquidityForAccount(account, _tokenOut, _nlpAmount, _minOut, _receiver); emit UnstakeNlp(account, _nlpAmount); return amountOut; } function unstakeAndRedeemNslp(address _tokenOut, uint256 _nslpAmount, uint256 _minOut) external nonReentrant returns (uint256) { require(_nslpAmount > 0, "RewardRouter: invalid _nslpAmount"); address account = msg.sender; IRewardTracker(stakedNslpTracker).unstakeForAccount(account, feeNslpTracker, _nslpAmount, account); IRewardTracker(feeNslpTracker).unstakeForAccount(account, nslp, _nslpAmount, account); uint256 amountOut = INslpManager(nslpManager).unstake(account, _tokenOut, _nslpAmount); require(amountOut >= _minOut, "RewardRouter: invalid _minOut"); emit UnstakeNslp(account, _nslpAmount); return amountOut; } function unstakeAndRedeemNlpETH(uint256 _nlpAmount, uint256 _minOut, address payable _receiver) external nonReentrant returns (uint256) { require(_nlpAmount > 0, "RewardRouter: invalid _nlpAmount"); address account = msg.sender; IRewardTracker(stakedNlpTracker).unstakeForAccount(account, feeNlpTracker, _nlpAmount, account); IRewardTracker(feeNlpTracker).unstakeForAccount(account, nlp, _nlpAmount, account); uint256 amountOut = INlpManager(nlpManager).removeLiquidityForAccount(account, weth, _nlpAmount, _minOut, address(this)); IWETH(weth).withdraw(amountOut); _receiver.sendValue(amountOut); emit UnstakeNlp(account, _nlpAmount); return amountOut; } function claim() external nonReentrant { _claimEsNavi(msg.sender, msg.sender); _claimFees(msg.sender, msg.sender); } function claimEsNavi() external nonReentrant { _claimEsNavi(msg.sender, msg.sender); } function _claimEsNavi(address account, address _receiver) internal returns (uint256) { uint256 esNaviAmount0 = IRewardTracker(stakedNaviTracker).claimForAccount(account, _receiver); uint256 esNaviAmount1 = IRewardTracker(stakedNlpTracker).claimForAccount(account, _receiver); uint256 esNaviAmount2 = IRewardTracker(stakedNslpTracker).claimForAccount(account, _receiver); return esNaviAmount0.add(esNaviAmount1).add(esNaviAmount2); } function claimFees() external nonReentrant { _claimFees(msg.sender, msg.sender); } function _claimFees(address account, address _receiver) internal returns (uint256) { uint256 feeAmount0 = IRewardTracker(feeNaviTracker).claimForAccount(account, _receiver); uint256 feeAmount1 = IRewardTracker(feeNlpTracker).claimForAccount(account, _receiver); uint256 feeAmount2 = IRewardTracker(feeNslpTracker).claimForAccount(account, _receiver); return feeAmount0.add(feeAmount1).add(feeAmount2); } function compound() external nonReentrant { _compound(msg.sender); } function compoundForAccount(address _account) external nonReentrant onlyGov { _compound(_account); } function handleRewards( bool _shouldClaimNavi, bool _shouldStakeNavi, bool _shouldClaimEsNavi, bool _shouldStakeEsNavi, bool _shouldStakeMultiplierPoints, bool _shouldClaimWeth, bool _shouldConvertWethToEth ) external nonReentrant { address account = msg.sender; uint256 naviAmount = 0; if (_shouldClaimNavi) { uint256 naviAmount0 = IVester(naviVester).claimForAccount(account, account); uint256 naviAmount1 = IVester(nlpVester).claimForAccount(account, account); uint256 naviAmount2 = IVester(nslpVester).claimForAccount(account, account); naviAmount = naviAmount0.add(naviAmount1).add(naviAmount2); } if (_shouldStakeNavi && naviAmount > 0) { _stakeNavi(account, account, navi, naviAmount); } uint256 esNaviAmount = 0; if (_shouldClaimEsNavi) { // uint256 esNaviAmount0 = IRewardTracker(stakedNaviTracker).claimForAccount(account, account); // uint256 esNaviAmount1 = IRewardTracker(stakedNlpTracker).claimForAccount(account, account); // uint256 esNaviAmount2 = IRewardTracker(stakedNslpTracker).claimForAccount(account, account); esNaviAmount = _claimEsNavi(account, account); } if (_shouldStakeEsNavi && esNaviAmount > 0) { _stakeNavi(account, account, esNavi, esNaviAmount); } if (_shouldStakeMultiplierPoints) { uint256 bnNaviAmount = IRewardTracker(bonusNaviTracker).claimForAccount(account, account); if (bnNaviAmount > 0) { IRewardTracker(feeNaviTracker).stakeForAccount(account, account, bnNavi, bnNaviAmount); } } if (_shouldClaimWeth) { if (_shouldConvertWethToEth) { // uint256 weth0 = IRewardTracker(feeNaviTracker).claimForAccount(account, address(this)); // uint256 weth1 = IRewardTracker(feeNlpTracker).claimForAccount(account, address(this)); // uint256 weth2 = IRewardTracker(feeNslpTracker).claimForAccount(account, address(this)); uint256 wethAmount = _claimFees(account, address(this)); //weth0.add(weth1).add(weth2); IWETH(weth).withdraw(wethAmount); payable(account).sendValue(wethAmount); } else { // IRewardTracker(feeNaviTracker).claimForAccount(account, account); // IRewardTracker(feeNlpTracker).claimForAccount(account, account); // IRewardTracker(feeNslpTracker).claimForAccount(account, account); _claimFees(account, account); } } } function batchCompoundForAccounts(address[] memory _accounts) external nonReentrant onlyGov { for (uint256 i = 0; i < _accounts.length; i++) { _compound(_accounts[i]); } } function signalTransfer(address _receiver) external nonReentrant { require(IERC20(naviVester).balanceOf(msg.sender) == 0, "RewardRouter: balance > 0"); require(IERC20(nlpVester).balanceOf(msg.sender) == 0, "RewardRouter: balance > 0"); require(IERC20(nslpVester).balanceOf(msg.sender) == 0, "RewardRouter: balance > 0"); _validateReceiver(_receiver); pendingReceivers[msg.sender] = _receiver; } function acceptTransfer(address _sender) external nonReentrant { require(IERC20(naviVester).balanceOf(_sender) == 0, "RewardRouter: balance > 0"); require(IERC20(nlpVester).balanceOf(_sender) == 0, "RewardRouter: balance > 0"); require(IERC20(nslpVester).balanceOf(_sender) == 0, "RewardRouter: balance > 0"); address receiver = msg.sender; require(pendingReceivers[_sender] == receiver, "RewardRouter: transfer not signalled"); delete pendingReceivers[_sender]; _validateReceiver(receiver); _compound(_sender); uint256 stakedNavi = IRewardTracker(stakedNaviTracker).depositBalances(_sender, navi); if (stakedNavi > 0) { _unstakeNavi(_sender, navi, stakedNavi, false); _stakeNavi(_sender, receiver, navi, stakedNavi); } uint256 stakedEsNavi = IRewardTracker(stakedNaviTracker).depositBalances(_sender, esNavi); if (stakedEsNavi > 0) { _unstakeNavi(_sender, esNavi, stakedEsNavi, false); _stakeNavi(_sender, receiver, esNavi, stakedEsNavi); } uint256 stakedBnNavi = IRewardTracker(feeNaviTracker).depositBalances(_sender, bnNavi); if (stakedBnNavi > 0) { IRewardTracker(feeNaviTracker).unstakeForAccount(_sender, bnNavi, stakedBnNavi, _sender); IRewardTracker(feeNaviTracker).stakeForAccount(_sender, receiver, bnNavi, stakedBnNavi); } uint256 esNaviBalance = IERC20(esNavi).balanceOf(_sender); if (esNaviBalance > 0) { IERC20(esNavi).transferFrom(_sender, receiver, esNaviBalance); } uint256 nlpAmount = IRewardTracker(feeNlpTracker).depositBalances(_sender, nlp); if (nlpAmount > 0) { IRewardTracker(stakedNlpTracker).unstakeForAccount(_sender, feeNlpTracker, nlpAmount, _sender); IRewardTracker(feeNlpTracker).unstakeForAccount(_sender, nlp, nlpAmount, _sender); IRewardTracker(feeNlpTracker).stakeForAccount(_sender, receiver, nlp, nlpAmount); IRewardTracker(stakedNlpTracker).stakeForAccount(receiver, receiver, feeNlpTracker, nlpAmount); } uint256 nslpAmount = IRewardTracker(feeNslpTracker).depositBalances(_sender, nslp); if (nslpAmount > 0) { IRewardTracker(stakedNslpTracker).unstakeForAccount(_sender, feeNslpTracker, nslpAmount, _sender); IRewardTracker(feeNslpTracker).unstakeForAccount(_sender, nslp, nslpAmount, _sender); IRewardTracker(feeNslpTracker).stakeForAccount(_sender, receiver, nslp, nslpAmount); IRewardTracker(stakedNslpTracker).stakeForAccount(receiver, receiver, feeNslpTracker, nslpAmount); } IVester(naviVester).transferStakeValues(_sender, receiver); IVester(nlpVester).transferStakeValues(_sender, receiver); IVester(nslpVester).transferStakeValues(_sender, receiver); } function _validateTracker(address _tracker, address _receiver) private view { require(IRewardTracker(_tracker).averageStakedAmounts(_receiver) == 0, "averageStakedAmounts > 0"); require(IRewardTracker(_tracker).cumulativeRewards(_receiver) == 0, "cumulativeRewards > 0"); } function _validateVester(address _vester, address _receiver) private view { require(IVester(_vester).transferredAverageStakedAmounts(_receiver) == 0, "transferredAverageStakedAmounts > 0"); require(IVester(_vester).transferredCumulativeRewards(_receiver) == 0, "transferredCumulativeRewards > 0"); } function _validateReceiver(address _receiver) private view { _validateTracker(stakedNaviTracker, _receiver); _validateTracker(bonusNaviTracker, _receiver); _validateTracker(feeNaviTracker, _receiver); _validateVester(naviVester, _receiver); _validateTracker(stakedNlpTracker, _receiver); _validateTracker(feeNlpTracker, _receiver); _validateVester(nlpVester, _receiver); _validateTracker(stakedNslpTracker, _receiver); _validateTracker(feeNslpTracker, _receiver); _validateVester(nslpVester, _receiver); require(IERC20(naviVester).balanceOf(_receiver) == 0, "RewardRouter: balance > 0"); require(IERC20(nlpVester).balanceOf(_receiver) == 0, "RewardRouter: balance > 0"); require(IERC20(nslpVester).balanceOf(_receiver) == 0, "RewardRouter: balance > 0"); } function _compound(address _account) private { _compoundNavi(_account); _compoundNlp(_account); _compoundNslp(_account); } function _compoundNavi(address _account) private { uint256 esNaviAmount = IRewardTracker(stakedNaviTracker).claimForAccount(_account, _account); if (esNaviAmount > 0) { _stakeNavi(_account, _account, esNavi, esNaviAmount); } uint256 bnNaviAmount = IRewardTracker(bonusNaviTracker).claimForAccount(_account, _account); if (bnNaviAmount > 0) { IRewardTracker(feeNaviTracker).stakeForAccount(_account, _account, bnNavi, bnNaviAmount); } } function _compoundNlp(address _account) private { uint256 esNaviAmount = IRewardTracker(stakedNlpTracker).claimForAccount(_account, _account); if (esNaviAmount > 0) { _stakeNavi(_account, _account, esNavi, esNaviAmount); } } function _compoundNslp(address _account) private { uint256 esNaviAmount = IRewardTracker(stakedNslpTracker).claimForAccount(_account, _account); if (esNaviAmount > 0) { _stakeNavi(_account, _account, esNavi, esNaviAmount); } } function _stakeNavi(address _fundingAccount, address _account, address _token, uint256 _amount) private { require(_amount > 0, "RewardRouter: invalid _amount"); IRewardTracker(stakedNaviTracker).stakeForAccount(_fundingAccount, _account, _token, _amount); IRewardTracker(bonusNaviTracker).stakeForAccount(_account, _account, stakedNaviTracker, _amount); IRewardTracker(feeNaviTracker).stakeForAccount(_account, _account, bonusNaviTracker, _amount); emit StakeNavi(_account, _token, _amount); } function _unstakeNavi(address _account, address _token, uint256 _amount, bool _shouldReduceBnNavi) private { require(_amount > 0, "RewardRouter: invalid _amount"); uint256 balance = IRewardTracker(stakedNaviTracker).stakedAmounts(_account); IRewardTracker(feeNaviTracker).unstakeForAccount(_account, bonusNaviTracker, _amount, _account); IRewardTracker(bonusNaviTracker).unstakeForAccount(_account, stakedNaviTracker, _amount, _account); IRewardTracker(stakedNaviTracker).unstakeForAccount(_account, _token, _amount, _account); if (_shouldReduceBnNavi) { uint256 bnNaviAmount = IRewardTracker(bonusNaviTracker).claimForAccount(_account, _account); if (bnNaviAmount > 0) { IRewardTracker(feeNaviTracker).stakeForAccount(_account, _account, bnNavi, bnNaviAmount); } uint256 stakedBnNavi = IRewardTracker(feeNaviTracker).depositBalances(_account, bnNavi); if (stakedBnNavi > 0) { uint256 reductionAmount = stakedBnNavi.mul(_amount).div(balance); IRewardTracker(feeNaviTracker).unstakeForAccount(_account, bnNavi, reductionAmount, _account); IMintable(bnNavi).burn(_account, reductionAmount); } } emit UnstakeNavi(_account, _token, _amount); } }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12; contract Governable { address public gov; constructor() public { gov = msg.sender; } modifier onlyGov() { require(msg.sender == gov, "Governable: forbidden"); _; } function setGov(address _gov) external onlyGov { gov = _gov; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "./IVault.sol"; interface INlpManager { function nlp() external view returns (address); function usdn() external view returns (address); function vault() external view returns (IVault); function cooldownDuration() external returns (uint256); function getAumInUsdn(bool maximise) external view returns (uint256); function lastAddedAt(address _account) external returns (uint256); function addLiquidity(address _token, uint256 _amount, uint256 _minUsdn, uint256 _minNlp) external returns (uint256); function addLiquidityForAccount(address _fundingAccount, address _account, address _token, uint256 _amount, uint256 _minUsdn, uint256 _minNlp) external returns (uint256); function removeLiquidity(address _tokenOut, uint256 _nlpAmount, uint256 _minOut, address _receiver) external returns (uint256); function removeLiquidityForAccount(address _account, address _tokenOut, uint256 _nlpAmount, uint256 _minOut, address _receiver) external returns (uint256); function setShortsTrackerAveragePriceWeight(uint256 _shortsTrackerAveragePriceWeight) external; function setCooldownDuration(uint256 _cooldownDuration) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; import "./IVaultUtils.sol"; interface IVault { function isInitialized() external view returns (bool); function isSwapEnabled() external view returns (bool); function isLeverageEnabled() external view returns (bool); function setVaultUtils(IVaultUtils _vaultUtils) external; function setError(uint256 _errorCode, string calldata _error) external; function router() external view returns (address); function usdn() external view returns (address); function gov() external view returns (address); function whitelistedTokenCount() external view returns (uint256); function maxLeverage() external view returns (uint256); function minProfitTime() external view returns (uint256); function hasDynamicFees() external view returns (bool); function fundingInterval() external view returns (uint256); function totalTokenWeights() external view returns (uint256); function getTargetUsdnAmount(address _token) external view returns (uint256); function inManagerMode() external view returns (bool); function inPrivateLiquidationMode() external view returns (bool); function maxGasPrice() external view returns (uint256); function approvedRouters(address _account, address _router) external view returns (bool); function isLiquidator(address _account) external view returns (bool); function isManager(address _account) external view returns (bool); function minProfitBasisPoints(address _token) external view returns (uint256); function tokenBalances(address _token) external view returns (uint256); function lastFundingTimes(address _token) external view returns (uint256); function setMaxLeverage(uint256 _maxLeverage) external; function setInManagerMode(bool _inManagerMode) external; function setManager(address _manager, bool _isManager) external; function setIsSwapEnabled(bool _isSwapEnabled) external; function setIsLeverageEnabled(bool _isLeverageEnabled) external; function setMaxGasPrice(uint256 _maxGasPrice) external; function setUsdnAmount(address _token, uint256 _amount) external; function setBufferAmount(address _token, uint256 _amount) external; function setMaxGlobalShortSize(address _token, uint256 _amount) external; function setInPrivateLiquidationMode(bool _inPrivateLiquidationMode) external; function setLiquidator(address _liquidator, bool _isActive) external; function setFundingRate(uint256 _fundingInterval, uint256 _fundingRateFactor, uint256 _stableFundingRateFactor) external; function setFees( uint256 _taxBasisPoints, uint256 _stableTaxBasisPoints, uint256 _mintBurnFeeBasisPoints, uint256 _swapFeeBasisPoints, uint256 _stableSwapFeeBasisPoints, uint256 _marginFeeBasisPoints, uint256 _liquidationFeeUsd, uint256 _minProfitTime, bool _hasDynamicFees ) external; function setTokenConfig( address _token, uint256 _tokenDecimals, uint256 _redemptionBps, uint256 _minProfitBps, uint256 _maxUsdnAmount, bool _isStable, bool _isShortable ) external; function setPriceFeed(address _priceFeed) external; function withdrawFees(address _token, address _receiver) external returns (uint256); function directPoolDeposit(address _token) external; function buyUSDN(address _token, address _receiver) external returns (uint256); function sellUSDN(address _token, address _receiver) external returns (uint256); function swap(address _tokenIn, address _tokenOut, address _receiver) external returns (uint256); function increasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external; function decreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external returns (uint256); function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256); function liquidatePosition(address _account, address _collateralToken, address _indexToken, bool _isLong, address _feeReceiver) external; function tokenToUsdMin(address _token, uint256 _tokenAmount) external view returns (uint256); function priceFeed() external view returns (address); function fundingRateFactor() external view returns (uint256); function stableFundingRateFactor() external view returns (uint256); function cumulativeFundingRates(address _token) external view returns (uint256); function getNextFundingRate(address _token) external view returns (uint256); function getFeeBasisPoints(address _token, uint256 _usdnDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256); function liquidationFeeUsd() external view returns (uint256); function taxBasisPoints() external view returns (uint256); function stableTaxBasisPoints() external view returns (uint256); function mintBurnFeeBasisPoints() external view returns (uint256); function swapFeeBasisPoints() external view returns (uint256); function stableSwapFeeBasisPoints() external view returns (uint256); function marginFeeBasisPoints() external view returns (uint256); function allWhitelistedTokensLength() external view returns (uint256); function allWhitelistedTokens(uint256) external view returns (address); function whitelistedTokens(address _token) external view returns (bool); function stableTokens(address _token) external view returns (bool); function shortableTokens(address _token) external view returns (bool); function feeReserves(address _token) external view returns (uint256); function globalShortSizes(address _token) external view returns (uint256); function globalShortAveragePrices(address _token) external view returns (uint256); function maxGlobalShortSizes(address _token) external view returns (uint256); function tokenDecimals(address _token) external view returns (uint256); function tokenWeights(address _token) external view returns (uint256); function guaranteedUsd(address _token) external view returns (uint256); function poolAmounts(address _token) external view returns (uint256); function bufferAmounts(address _token) external view returns (uint256); function reservedAmounts(address _token) external view returns (uint256); function usdnAmounts(address _token) external view returns (uint256); function maxUsdnAmounts(address _token) external view returns (uint256); function getRedemptionAmount(address _token, uint256 _usdnAmount) external view returns (uint256); function getMaxPrice(address _token) external view returns (uint256); function getMinPrice(address _token) external view returns (uint256); function getDelta(address _indexToken, uint256 _size, uint256 _averagePrice, bool _isLong, uint256 _lastIncreasedTime) external view returns (bool, uint256); function getPosition(address _account, address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256, uint256, uint256, uint256, uint256, uint256, bool, uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IVaultUtils { function updateCumulativeFundingRate(address _collateralToken, address _indexToken) external returns (bool); function validateIncreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _sizeDelta, bool _isLong) external view; function validateDecreasePosition(address _account, address _collateralToken, address _indexToken, uint256 _collateralDelta, uint256 _sizeDelta, bool _isLong, address _receiver) external view; function validateLiquidation(address _account, address _collateralToken, address _indexToken, bool _isLong, bool _raise) external view returns (uint256, uint256); function getEntryFundingRate(address _collateralToken, address _indexToken, bool _isLong) external view returns (uint256); function getPositionFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _sizeDelta) external view returns (uint256); function getFundingFee(address _account, address _collateralToken, address _indexToken, bool _isLong, uint256 _size, uint256 _entryFundingRate) external view returns (uint256); function getBuyUsdnFeeBasisPoints(address _token, uint256 _usdnAmount) external view returns (uint256); function getSellUsdnFeeBasisPoints(address _token, uint256 _usdnAmount) external view returns (uint256); function getSwapFeeBasisPoints(address _tokenIn, address _tokenOut, uint256 _usdnAmount) external view returns (uint256); function getFeeBasisPoints(address _token, uint256 _usdnDelta, uint256 _feeBasisPoints, uint256 _taxBasisPoints, bool _increment) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12; /** * @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, 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) { return sub(a, b, "SafeMath: subtraction overflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * 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); uint256 c = a - b; return c; } /** * @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) { // 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 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts 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) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts 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) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message 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, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; /** * @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.12; 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; /** * @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.3._ */ 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.3._ */ 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.12; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor () internal { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface INslpManager { function unstake(address _account, address _tokenOut, uint256 _nslpAmount) external returns (uint256); function stake(address _account, address _token, uint256 _amount) external returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IRewardRouterV2 { function feeNlpTracker() external view returns (address); function stakedNlpTracker() external view returns (address); function feeNslpTracker() external view returns (address); function stakedNslpTracker() external view returns (address); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12; interface IRewardTracker { function depositBalances(address _account, address _depositToken) external view returns (uint256); function stakedAmounts(address _account) external view returns (uint256); function updateRewards() external; function stake(address _depositToken, uint256 _amount) external; function stakeForAccount(address _fundingAccount, address _account, address _depositToken, uint256 _amount) external; function unstake(address _depositToken, uint256 _amount) external; function unstakeForAccount(address _account, address _depositToken, uint256 _amount, address _receiver) external; function tokensPerInterval() external view returns (uint256); function claim(address _receiver) external returns (uint256); function claimForAccount(address _account, address _receiver) external returns (uint256); function claimable(address _account) external view returns (uint256); function averageStakedAmounts(address _account) external view returns (uint256); function cumulativeRewards(address _account) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12; interface IVester { function rewardTracker() external view returns (address); function claimForAccount(address _account, address _receiver) external returns (uint256); function claimable(address _account) external view returns (uint256); function cumulativeClaimAmounts(address _account) external view returns (uint256); function claimedAmounts(address _account) external view returns (uint256); function pairAmounts(address _account) external view returns (uint256); function getVestedAmount(address _account) external view returns (uint256); function transferredAverageStakedAmounts(address _account) external view returns (uint256); function transferredCumulativeRewards(address _account) external view returns (uint256); function cumulativeRewardDeductions(address _account) external view returns (uint256); function bonusRewards(address _account) external view returns (uint256); function transferStakeValues(address _sender, address _receiver) external; function setTransferredAverageStakedAmounts(address _account, uint256 _amount) external; function setTransferredCumulativeRewards(address _account, uint256 _amount) external; function setCumulativeRewardDeductions(address _account, uint256 _amount) external; function setBonusRewards(address _account, uint256 _amount) external; function getMaxVestableAmount(address _account) external view returns (uint256); function getCombinedAverageStakedAmount(address _account) external view returns (uint256); function depositForAccount(address _account, uint256 _amount) external; }
// SPDX-License-Identifier: MIT pragma solidity >=0.6.12; interface IMintable { function isMinter(address _account) external returns (bool); function setMinter(address _minter, bool _isActive) external; function mint(address _account, uint256 _amount) external; function burn(address _account, uint256 _amount) external; }
//SPDX-License-Identifier: MIT pragma solidity 0.6.12; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
{ "evmVersion": "istanbul", "libraries": {}, "metadata": { "bytecodeHash": "ipfs", "useLiteralContent": true }, "optimizer": { "enabled": true, "runs": 14 }, "remappings": [], "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeNavi","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeNlp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"StakeNslp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeNavi","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeNlp","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"UnstakeNslp","type":"event"},{"inputs":[{"internalType":"address","name":"_sender","type":"address"}],"name":"acceptTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"}],"name":"batchCompoundForAccounts","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_accounts","type":"address[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"batchStakeNaviForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"bnNavi","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusNaviTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimEsNavi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimFees","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"compound","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"}],"name":"compoundForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"esNavi","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeNaviTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeNlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeNslpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gov","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_shouldClaimNavi","type":"bool"},{"internalType":"bool","name":"_shouldStakeNavi","type":"bool"},{"internalType":"bool","name":"_shouldClaimEsNavi","type":"bool"},{"internalType":"bool","name":"_shouldStakeEsNavi","type":"bool"},{"internalType":"bool","name":"_shouldStakeMultiplierPoints","type":"bool"},{"internalType":"bool","name":"_shouldClaimWeth","type":"bool"},{"internalType":"bool","name":"_shouldConvertWethToEth","type":"bool"}],"name":"handleRewards","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_configs","type":"address[]"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"isInitialized","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint256","name":"_minUsdn","type":"uint256"},{"internalType":"uint256","name":"_minNlp","type":"uint256"}],"name":"mintAndStakeNlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_minUsdn","type":"uint256"},{"internalType":"uint256","name":"_minNlp","type":"uint256"}],"name":"mintAndStakeNlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mintAndStakeNslp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"navi","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"naviVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nlp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nlpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nlpVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nslp","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nslpManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nslpVester","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pendingReceivers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_gov","type":"address"}],"name":"setGov","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"}],"name":"signalTransfer","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeEsNavi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeNavi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"stakeNaviForAccount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakedNaviTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedNlpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakedNslpTracker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_nlpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemNlp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_nlpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"},{"internalType":"address payable","name":"_receiver","type":"address"}],"name":"unstakeAndRedeemNlpETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenOut","type":"address"},{"internalType":"uint256","name":"_nslpAmount","type":"uint256"},{"internalType":"uint256","name":"_minOut","type":"uint256"}],"name":"unstakeAndRedeemNslp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeEsNavi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"unstakeNavi","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"weth","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_token","type":"address"},{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b506001600081905580546001600160a01b031916331790556159c680620000386000396000f3fe6080604052600436106102165760003560e01c8063877f1b781161011f578063877f1b781461079257806388a68632146107a7578063891c98c4146107d15780638fcb0c4f146107e657806397b756e71461081f5780639a221bc814610834578063a224cee714610849578063a30d7938146108f7578063b23272811461090c578063b5b3ce7214610921578063bec025be14610936578063c0eabe181461094b578063c47dcd8314610960578063cbe8ef341461098a578063cc2f86ce146109c9578063ce0a875514610a0e578063cfad57a214610a38578063d294f09314610a6b578063e1b9db8914610a80578063e9a1489414610ab3578063ef9aacfd14610ac8578063f69e204614610afb578063f8deba4714610b1057610275565b806301e336671461027a57806305e62bb1146102bd5780630add4853146102f65780630fa2ad531461032757806312d43a51146103805780631af276a6146103955780631d7bca7e146104435780632a9f4083146105735780632ce93494146105a657806330b70002146105e5578063333f084014610641578063392e53cd146106565780633fc8cef31461067f5780634628dd9d146106945780634a69e2aa146106a95780634e71d92d146106be578063527f3043146106d357806354723585146106f6578063592f19d314610720578063655603a4146107355780636969a2d61461076857806385e8d1af1461077d57610275565b36610275576002546001600160a01b03163314610273576040805162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b604482015290519081900360640190fd5b005b600080fd5b34801561028657600080fd5b506102736004803603606081101561029d57600080fd5b506001600160a01b03813581169160208101359091169060400135610b25565b3480156102c957600080fd5b50610273600480360360408110156102e057600080fd5b506001600160a01b038135169060200135610b8b565b34801561030257600080fd5b5061030b610c46565b604080516001600160a01b039092168252519081900360200190f35b34801561033357600080fd5b5061036e6004803603608081101561034a57600080fd5b506001600160a01b0381358116916020810135916040820135916060013516610c55565b60408051918252519081900360200190f35b34801561038c57600080fd5b5061030b610ee9565b3480156103a157600080fd5b50610273600480360360208110156103b857600080fd5b810190602081018135600160201b8111156103d257600080fd5b8201836020820111156103e457600080fd5b803590602001918460208302840111600160201b8311171561040557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ef8945050505050565b34801561044f57600080fd5b506102736004803603604081101561046657600080fd5b810190602081018135600160201b81111561048057600080fd5b82018360208201111561049257600080fd5b803590602001918460208302840111600160201b831117156104b357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561050257600080fd5b82018360208201111561051457600080fd5b803590602001918460208302840111600160201b8311171561053557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610fc0945050505050565b34801561057f57600080fd5b506102736004803603602081101561059657600080fd5b50356001600160a01b03166110b5565b3480156105b257600080fd5b5061036e600480360360608110156105c957600080fd5b50803590602081013590604001356001600160a01b031661115e565b3480156105f157600080fd5b50610273600480360360e081101561060857600080fd5b508035151590602081013515159060408101351515906060810135151590608081013515159060a081013515159060c00135151561146b565b34801561064d57600080fd5b5061030b6118a8565b34801561066257600080fd5b5061066b6118b7565b604080519115158252519081900360200190f35b34801561068b57600080fd5b5061030b6118c7565b3480156106a057600080fd5b5061030b6118d6565b3480156106b557600080fd5b5061030b6118e5565b3480156106ca57600080fd5b506102736118f4565b61036e600480360360408110156106e957600080fd5b5080359060200135611954565b34801561070257600080fd5b506102736004803603602081101561071957600080fd5b5035611cd1565b34801561072c57600080fd5b5061030b611d36565b34801561074157600080fd5b506102736004803603602081101561075857600080fd5b50356001600160a01b0316611d45565b34801561077457600080fd5b5061030b612b12565b34801561078957600080fd5b5061030b612b21565b34801561079e57600080fd5b5061030b612b30565b3480156107b357600080fd5b50610273600480360360208110156107ca57600080fd5b5035612b3f565b3480156107dd57600080fd5b5061030b612ba4565b3480156107f257600080fd5b5061036e6004803603604081101561080957600080fd5b506001600160a01b038135169060200135612bb3565b34801561082b57600080fd5b5061030b612e4e565b34801561084057600080fd5b5061030b612e5d565b34801561085557600080fd5b506102736004803603602081101561086c57600080fd5b810190602081018135600160201b81111561088657600080fd5b82018360208201111561089857600080fd5b803590602001918460208302840111600160201b831117156108b957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e6c945050505050565b34801561090357600080fd5b5061030b61333e565b34801561091857600080fd5b5061027361334d565b34801561092d57600080fd5b5061030b6133a2565b34801561094257600080fd5b5061030b6133b1565b34801561095757600080fd5b5061030b6133c0565b34801561096c57600080fd5b506102736004803603602081101561098357600080fd5b50356133cf565b34801561099657600080fd5b5061036e600480360360608110156109ad57600080fd5b506001600160a01b038135169060208101359060400135613434565b3480156109d557600080fd5b5061036e600480360360808110156109ec57600080fd5b506001600160a01b0381351690602081013590604081013590606001356136f6565b348015610a1a57600080fd5b5061027360048036036020811015610a3157600080fd5b5035613976565b348015610a4457600080fd5b5061027360048036036020811015610a5b57600080fd5b50356001600160a01b03166139db565b348015610a7757600080fd5b50610273613a4a565b348015610a8c57600080fd5b5061030b60048036036020811015610aa357600080fd5b50356001600160a01b0316613a9f565b348015610abf57600080fd5b5061030b613aba565b348015610ad457600080fd5b5061027360048036036020811015610aeb57600080fd5b50356001600160a01b0316613ac9565b348015610b0757600080fd5b50610273613d76565b348015610b1c57600080fd5b5061030b613dd1565b6001546001600160a01b03163314610b72576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b610b866001600160a01b0384168383613de0565b505050565b60026000541415610bd1576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610c23576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b600354610c3d90339084906001600160a01b031684613e32565b50506001600055565b600f546001600160a01b031681565b600060026000541415610c9d576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005583610cf4576040805162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f6e6c70416d6f756e74604482015290519081900360640190fd5b600b54600d546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b158015610d5d57600080fd5b505af1158015610d71573d6000803e3d6000fd5b5050600d546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b158015610ddf57600080fd5b505af1158015610df3573d6000803e3d6000fd5b5050600f54604080516371d597ad60e01b81526001600160a01b0386811660048301528b81166024830152604482018b9052606482018a905288811660848301529151600095509190921692506371d597ad9160a48082019260209290919082900301818787803b158015610e6757600080fd5b505af1158015610e7b573d6000803e3d6000fd5b505050506040513d6020811015610e9157600080fd5b5051604080516001600160a01b03851681526020810189905281519293507ff31c178fc58bad046a8cf4365d6f2d922b8b1aa41d6bed047ca8b85d494761ad929081900390910190a160016000559695505050505050565b6001546001600160a01b031681565b60026000541415610f3e576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610f90576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b60005b8151811015610c3d57610fb8828281518110610fab57fe5b6020026020010151614041565b600101610f93565b60026000541415611006576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314611058576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b6003546001600160a01b031660005b83518110156110aa576110a23385838151811061108057fe5b60200260200101518486858151811061109557fe5b6020026020010151613e32565b600101611067565b505060016000555050565b600260005414156110fb576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b0316331461114d576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b61115681614041565b506001600055565b6000600260005414156111a6576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055836111fd576040805162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f6e6c70416d6f756e74604482015290519081900360640190fd5b600b54600d546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b5050600d546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b5050600f54600254604080516371d597ad60e01b81526001600160a01b0387811660048301529283166024820152604481018b9052606481018a90523060848201529051600095509190921692506371d597ad9160a48082019260209290919082900301818787803b15801561137157600080fd5b505af1158015611385573d6000803e3d6000fd5b505050506040513d602081101561139b57600080fd5b505160025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50611419925050506001600160a01b0385168261405f565b604080516001600160a01b03841681526020810188905281517ff31c178fc58bad046a8cf4365d6f2d922b8b1aa41d6bed047ca8b85d494761ad929181900390910190a1600160005595945050505050565b600260005414156114b1576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260009081553390881561166f57601154604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561151957600080fd5b505af115801561152d573d6000803e3d6000fd5b505050506040513d602081101561154357600080fd5b5051601254604080516309f4173d60e11b81526001600160a01b03878116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b1580156115a057600080fd5b505af11580156115b4573d6000803e3d6000fd5b505050506040513d60208110156115ca57600080fd5b5051601354604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561162757600080fd5b505af115801561163b573d6000803e3d6000fd5b505050506040513d602081101561165157600080fd5b50519050611669816116638585614144565b90614144565b93505050505b87801561167c5750600081115b1561169b5760035461169b90839081906001600160a01b031684613e32565b600087156116b0576116ad83846141a5565b90505b8680156116bd5750600081115b156116dc576004546116dc90849081906001600160a01b031684613e32565b85156117f157600954604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561173b57600080fd5b505af115801561174f573d6000803e3d6000fd5b505050506040513d602081101561176557600080fd5b5051905080156117ef57600a5460055460408051631e42d69b60e21b81526001600160a01b038881166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b1580156117d657600080fd5b505af11580156117ea573d6000803e3d6000fd5b505050505b505b841561189757831561188b5760006118098430614353565b60025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b15801561185957600080fd5b505af115801561186d573d6000803e3d6000fd5b50611885925050506001600160a01b0385168261405f565b50611897565b6118958384614353565b505b505060016000555050505050505050565b600b546001600160a01b031681565b600154600160a01b900460ff1681565b6002546001600160a01b031681565b600c546001600160a01b031681565b6005546001600160a01b031681565b6002600054141561193a576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005561194933806141a5565b506111563333614353565b60006002600054141561199c576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055346119f3576040805162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a20696e76616c6964206d73672e76616c756500604482015290519081900360640190fd5b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b5050600254600f546040805163095ea7b360e01b81526001600160a01b039283166004820152346024820152905191909216945063095ea7b39350604480830193506020928290030181600087803b158015611ab257600080fd5b505af1158015611ac6573d6000803e3d6000fd5b505050506040513d6020811015611adc57600080fd5b5050600f54600254604080516317eb2a1560e01b815230600482015233602482018190526001600160a01b0393841660448301523460648301526084820188905260a482018790529151919360009316916317eb2a159160c48082019260209290919082900301818787803b158015611b5457600080fd5b505af1158015611b68573d6000803e3d6000fd5b505050506040513d6020811015611b7e57600080fd5b5051600d5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b158015611be957600080fd5b505af1158015611bfd573d6000803e3d6000fd5b5050600b54600d5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015611c6857600080fd5b505af1158015611c7c573d6000803e3d6000fd5b5050604080516001600160a01b03861681526020810185905281517f8c35ea96a2dba4a2125563c230bf2d0df1a4d28565b6873c1213b37eeee1bf0b9450908190039091019150a16001600055949350505050565b60026000541415611d17576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556003546111569033906001600160a01b03168360016144bb565b600e546001600160a01b031681565b60026000541415611d8b576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055601154604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015611ddd57600080fd5b505afa158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b505115611e49576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601254604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015611e9657600080fd5b505afa158015611eaa573d6000803e3d6000fd5b505050506040513d6020811015611ec057600080fd5b505115611f02576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601354604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015611f4f57600080fd5b505afa158015611f63573d6000803e3d6000fd5b505050506040513d6020811015611f7957600080fd5b505115611fbb576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b6001600160a01b0381811660009081526014602052604090205433911681146120155760405162461bcd60e51b815260040180806020018281038252602481526020018061589e6024913960400191505060405180910390fd5b6001600160a01b038216600090815260146020526040902080546001600160a01b0319169055612044816149fd565b61204d82614041565b60085460035460408051637aeceb1f60e11b81526001600160a01b03868116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156120a957600080fd5b505afa1580156120bd573d6000803e3d6000fd5b505050506040513d60208110156120d357600080fd5b505190508015612111576003546120f79084906001600160a01b03168360006144bb565b60035461211190849084906001600160a01b031684613e32565b6008546004805460408051637aeceb1f60e11b81526001600160a01b0388811694820194909452918316602483015251600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561216f57600080fd5b505afa158015612183573d6000803e3d6000fd5b505050506040513d602081101561219957600080fd5b5051905080156121d7576004546121bd9085906001600160a01b03168360006144bb565b6004546121d790859085906001600160a01b031684613e32565b600a5460055460408051637aeceb1f60e11b81526001600160a01b03888116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561223357600080fd5b505afa158015612247573d6000803e3d6000fd5b505050506040513d602081101561225d57600080fd5b50519050801561236a57600a546005546040805163098bf59d60e01b81526001600160a01b038981166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b1580156122d157600080fd5b505af11580156122e5573d6000803e3d6000fd5b5050600a5460055460408051631e42d69b60e21b81526001600160a01b038b811660048301528a81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561235157600080fd5b505af1158015612365573d6000803e3d6000fd5b505050505b6000600460009054906101000a90046001600160a01b03166001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123ce57600080fd5b505afa1580156123e2573d6000803e3d6000fd5b505050506040513d60208110156123f857600080fd5b5051905080156124915760048054604080516323b872dd60e01b81526001600160a01b038a811694820194909452888416602482015260448101859052905192909116916323b872dd916064808201926020929091908290030181600087803b15801561246457600080fd5b505af1158015612478573d6000803e3d6000fd5b505050506040513d602081101561248e57600080fd5b50505b600d5460065460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156124ed57600080fd5b505afa158015612501573d6000803e3d6000fd5b505050506040513d602081101561251757600080fd5b50519050801561272557600b54600d546040805163098bf59d60e01b81526001600160a01b038b81166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b15801561258b57600080fd5b505af115801561259f573d6000803e3d6000fd5b5050600d546006546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018890526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b15801561260d57600080fd5b505af1158015612621573d6000803e3d6000fd5b5050600d5460065460408051631e42d69b60e21b81526001600160a01b038d811660048301528c81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b5050600b54600d5460408051631e42d69b60e21b81526001600160a01b038c8116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561270c57600080fd5b505af1158015612720573d6000803e3d6000fd5b505050505b600e5460075460408051637aeceb1f60e11b81526001600160a01b038b8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561278157600080fd5b505afa158015612795573d6000803e3d6000fd5b505050506040513d60208110156127ab57600080fd5b5051905080156129b957600c54600e546040805163098bf59d60e01b81526001600160a01b038c81166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b15801561281f57600080fd5b505af1158015612833573d6000803e3d6000fd5b5050600e546007546040805163098bf59d60e01b81526001600160a01b038e8116600483018190529381166024830152604482018890526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b1580156128a157600080fd5b505af11580156128b5573d6000803e3d6000fd5b5050600e5460075460408051631e42d69b60e21b81526001600160a01b038e811660048301528d81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b5050600c54600e5460408051631e42d69b60e21b81526001600160a01b038d8116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b1580156129a057600080fd5b505af11580156129b4573d6000803e3d6000fd5b505050505b60115460408051630f713c2360e41b81526001600160a01b038b811660048301528a811660248301529151919092169163f713c23091604480830192600092919082900301818387803b158015612a0f57600080fd5b505af1158015612a23573d6000803e3d6000fd5b505060125460408051630f713c2360e41b81526001600160a01b038d811660048301528c81166024830152915191909216935063f713c2309250604480830192600092919082900301818387803b158015612a7d57600080fd5b505af1158015612a91573d6000803e3d6000fd5b505060135460408051630f713c2360e41b81526001600160a01b038d811660048301528c81166024830152915191909216935063f713c2309250604480830192600092919082900301818387803b158015612aeb57600080fd5b505af1158015612aff573d6000803e3d6000fd5b5050600160005550505050505050505050565b6011546001600160a01b031681565b6003546001600160a01b031681565b6010546001600160a01b031681565b60026000541415612b85576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005560045461115690339081906001600160a01b031684613e32565b6008546001600160a01b031681565b600060026000541415612bfb576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005581612c40576040805162461bcd60e51b815260206004820152601d6024820152600080516020615971833981519152604482015290519081900360640190fd5b33612c566001600160a01b038516823086614d04565b601054612c70906001600160a01b03868116911685614d64565b6010546040805163bf6eac2f60e01b81526001600160a01b0384811660048301528781166024830152604482018790529151600093929092169163bf6eac2f9160648082019260209290919082900301818787803b158015612cd157600080fd5b505af1158015612ce5573d6000803e3d6000fd5b505050506040513d6020811015612cfb57600080fd5b5051600e5460075460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b158015612d6657600080fd5b505af1158015612d7a573d6000803e3d6000fd5b5050600c54600e5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015612de557600080fd5b505af1158015612df9573d6000803e3d6000fd5b5050604080516001600160a01b03861681526020810185905281517f156ad2abc9b77025018f1ebf69580b5aea6ce5449359ca36da16d35ec0a2b0439450908190039091019150a16001600055949350505050565b600d546001600160a01b031681565b600a546001600160a01b031681565b6001546001600160a01b03163314612eb9576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b600154600160a01b900460ff1615612f025760405162461bcd60e51b81526004018080602001828103825260218152602001806158576021913960400191505060405180910390fd5b6001805460ff60a01b1916600160a01b17905580518190600090612f2257fe5b6020026020010151600260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600181518110612f5d57fe5b6020026020010151600360006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600281518110612f9857fe5b6020026020010151600460006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600381518110612fd357fe5b6020026020010151600560006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060048151811061300e57fe5b6020026020010151600660006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060058151811061304957fe5b6020026020010151600760006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060068151811061308457fe5b6020026020010151600860006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806007815181106130bf57fe5b6020026020010151600960006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806008815181106130fa57fe5b6020026020010151600a60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060098151811061313557fe5b6020026020010151600d60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600a8151811061317057fe5b6020026020010151600e60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600b815181106131ab57fe5b6020026020010151600b60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600c815181106131e657fe5b6020026020010151600c60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600d8151811061322157fe5b6020026020010151600f60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600e8151811061325c57fe5b6020026020010151601060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600f8151811061329757fe5b6020026020010151601160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806010815181106132d257fe5b6020026020010151601260006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060118151811061330d57fe5b6020026020010151601360006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b6006546001600160a01b031681565b60026000541415613393576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005561115633806141a5565b6009546001600160a01b031681565b6012546001600160a01b031681565b6013546001600160a01b031681565b60026000541415613415576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556004546111569033906001600160a01b03168360016144bb565b60006002600054141561347c576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055826134bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806159306021913960400191505060405180910390fd5b600c54600e546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018890526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b15801561352657600080fd5b505af115801561353a573d6000803e3d6000fd5b5050600e546007546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018b90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b1580156135a857600080fd5b505af11580156135bc573d6000803e3d6000fd5b5050601054604080516330414fc560e11b81526001600160a01b0386811660048301528a81166024830152604482018a90529151600095509190921692506360829f8a9160648082019260209290919082900301818787803b15801561362157600080fd5b505af1158015613635573d6000803e3d6000fd5b505050506040513d602081101561364b57600080fd5b50519050838110156136a4576040805162461bcd60e51b815260206004820152601d60248201527f526577617264526f757465723a20696e76616c6964205f6d696e4f7574000000604482015290519081900360640190fd5b604080516001600160a01b03841681526020810187905281517fc3a81d3e4fdfdf24abaa8334741fdf1abdc1c8bc88d05ce2da9bcd733c2d37f9929181900390910190a1600160005595945050505050565b60006002600054141561373e576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005583613783576040805162461bcd60e51b815260206004820152601d6024820152600080516020615971833981519152604482015290519081900360640190fd5b600f54604080516317eb2a1560e01b81523360048201819052602482018190526001600160a01b038981166044840152606483018990526084830188905260a483018790529251909360009316916317eb2a159160c480830192602092919082900301818787803b1580156137f757600080fd5b505af115801561380b573d6000803e3d6000fd5b505050506040513d602081101561382157600080fd5b5051600d5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b15801561388c57600080fd5b505af11580156138a0573d6000803e3d6000fd5b5050600b54600d5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561390b57600080fd5b505af115801561391f573d6000803e3d6000fd5b5050604080516001600160a01b03861681526020810185905281517f8c35ea96a2dba4a2125563c230bf2d0df1a4d28565b6873c1213b37eeee1bf0b9450908190039091019150a160016000559695505050505050565b600260005414156139bc576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005560035461115690339081906001600160a01b031684613e32565b6001546001600160a01b03163314613a28576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415613a90576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556111563380614353565b6014602052600090815260409020546001600160a01b031681565b6007546001600160a01b031681565b60026000541415613b0f576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055601154604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015613b5f57600080fd5b505afa158015613b73573d6000803e3d6000fd5b505050506040513d6020811015613b8957600080fd5b505115613bcb576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601254604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015613c1657600080fd5b505afa158015613c2a573d6000803e3d6000fd5b505050506040513d6020811015613c4057600080fd5b505115613c82576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601354604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015613ccd57600080fd5b505afa158015613ce1573d6000803e3d6000fd5b505050506040513d6020811015613cf757600080fd5b505115613d39576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b613d42816149fd565b33600090815260146020526040812080546001600160a01b0319166001600160a01b03939093169290921790915560019055565b60026000541415613dbc576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055613dca33614041565b6001600055565b6004546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b86908490614e4b565b60008111613e75576040805162461bcd60e51b815260206004820152601d6024820152600080516020615971833981519152604482015290519081900360640190fd5b60085460408051631e42d69b60e21b81526001600160a01b03878116600483015286811660248301528581166044830152606482018590529151919092169163790b5a6c91608480830192600092919082900301818387803b158015613eda57600080fd5b505af1158015613eee573d6000803e3d6000fd5b505060095460085460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613f5957600080fd5b505af1158015613f6d573d6000803e3d6000fd5b5050600a5460095460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613fd857600080fd5b505af1158015613fec573d6000803e3d6000fd5b5050604080516001600160a01b0380881682528616602082015280820185905290517f1a2829d91759b05f72340eac7ee551152ef793eafebc2cd16b6f99ac21495fb09350908190036060019150a150505050565b61404a81614efc565b614053816150b4565b61405c8161515f565b50565b804710156140b4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146140ff576040519150601f19603f3d011682016040523d82523d6000602084013e614104565b606091505b5050905080610b865760405162461bcd60e51b815260040180806020018281038252603a81526020018061581d603a913960400191505060405180910390fd5b60008282018381101561419c576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b90505b92915050565b600854604080516309f4173d60e11b81526001600160a01b03858116600483015284811660248301529151600093849316916313e82e7a91604480830192602092919082900301818787803b1580156141fd57600080fd5b505af1158015614211573d6000803e3d6000fd5b505050506040513d602081101561422757600080fd5b5051600b54604080516309f4173d60e11b81526001600160a01b0388811660048301528781166024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561428557600080fd5b505af1158015614299573d6000803e3d6000fd5b505050506040513d60208110156142af57600080fd5b5051600c54604080516309f4173d60e11b81526001600160a01b0389811660048301528881166024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561430d57600080fd5b505af1158015614321573d6000803e3d6000fd5b505050506040513d602081101561433757600080fd5b50519050614349816116638585614144565b9695505050505050565b600a54604080516309f4173d60e11b81526001600160a01b03858116600483015284811660248301529151600093849316916313e82e7a91604480830192602092919082900301818787803b1580156143ab57600080fd5b505af11580156143bf573d6000803e3d6000fd5b505050506040513d60208110156143d557600080fd5b5051600d54604080516309f4173d60e11b81526001600160a01b0388811660048301528781166024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561443357600080fd5b505af1158015614447573d6000803e3d6000fd5b505050506040513d602081101561445d57600080fd5b5051600e54604080516309f4173d60e11b81526001600160a01b0389811660048301528881166024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561430d57600080fd5b600082116144fe576040805162461bcd60e51b815260206004820152601d6024820152600080516020615971833981519152604482015290519081900360640190fd5b600854604080516310c1c10360e01b81526001600160a01b038781166004830152915160009392909216916310c1c10391602480820192602092909190829003018186803b15801561454f57600080fd5b505afa158015614563573d6000803e3d6000fd5b505050506040513d602081101561457957600080fd5b5051600a546009546040805163098bf59d60e01b81526001600160a01b038a8116600483018190529381166024830152604482018990526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b1580156145e757600080fd5b505af11580156145fb573d6000803e3d6000fd5b50506009546008546040805163098bf59d60e01b81526001600160a01b038b8116600483018190529381166024830152604482018a90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b15801561466957600080fd5b505af115801561467d573d6000803e3d6000fd5b50506008546040805163098bf59d60e01b81526001600160a01b038a8116600483018190528a82166024840152604483018a90526064830152915191909216935063098bf59d9250608480830192600092919082900301818387803b1580156146e557600080fd5b505af11580156146f9573d6000803e3d6000fd5b5050505081156149ac57600954604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561475c57600080fd5b505af1158015614770573d6000803e3d6000fd5b505050506040513d602081101561478657600080fd5b50519050801561481057600a5460055460408051631e42d69b60e21b81526001600160a01b038a81166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b1580156147f757600080fd5b505af115801561480b573d6000803e3d6000fd5b505050505b600a5460055460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561486c57600080fd5b505afa158015614880573d6000803e3d6000fd5b505050506040513d602081101561489657600080fd5b5051905080156149a95760006148b6846148b084896151b8565b90615211565b600a546005546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018690526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b15801561492257600080fd5b505af1158015614936573d6000803e3d6000fd5b505060055460408051632770a7eb60e21b81526001600160a01b038d81166004830152602482018790529151919092169350639dc29fac9250604480830192600092919082900301818387803b15801561498f57600080fd5b505af11580156149a3573d6000803e3d6000fd5b50505050505b50505b604080516001600160a01b0380881682528616602082015280820185905290517ff1cca4a4ac405431d71ef4ee5122cc93b5475349cac575db9584f2e879c56fa09181900360600190a15050505050565b600854614a13906001600160a01b031682615250565b600954614a29906001600160a01b031682615250565b600a54614a3f906001600160a01b031682615250565b601154614a55906001600160a01b0316826153d9565b600b54614a6b906001600160a01b031682615250565b600d54614a81906001600160a01b031682615250565b601254614a97906001600160a01b0316826153d9565b600c54614aad906001600160a01b031682615250565b600e54614ac3906001600160a01b031682615250565b601354614ad9906001600160a01b0316826153d9565b601154604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015614b2657600080fd5b505afa158015614b3a573d6000803e3d6000fd5b505050506040513d6020811015614b5057600080fd5b505115614b92576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601254604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015614bdf57600080fd5b505afa158015614bf3573d6000803e3d6000fd5b505050506040513d6020811015614c0957600080fd5b505115614c4b576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601354604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015614c9857600080fd5b505afa158015614cac573d6000803e3d6000fd5b505050506040513d6020811015614cc257600080fd5b50511561405c576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052614d5e908590614e4b565b50505050565b6000614dfa82856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015614dc857600080fd5b505afa158015614ddc573d6000803e3d6000fd5b505050506040513d6020811015614df257600080fd5b505190614144565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052909150614d5e9085905b6060614ea0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166155599092919063ffffffff16565b805190915015610b8657808060200190516020811015614ebf57600080fd5b5051610b865760405162461bcd60e51b815260040180806020018281038252602a815260200180615906602a913960400191505060405180910390fd5b600854604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614f5557600080fd5b505af1158015614f69573d6000803e3d6000fd5b505050506040513d6020811015614f7f57600080fd5b505190508015614fa357600454614fa390839081906001600160a01b031684613e32565b600954604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614ffc57600080fd5b505af1158015615010573d6000803e3d6000fd5b505050506040513d602081101561502657600080fd5b505190508015610b8657600a5460055460408051631e42d69b60e21b81526001600160a01b038781166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b15801561509757600080fd5b505af11580156150ab573d6000803e3d6000fd5b50505050505050565b600b54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561510d57600080fd5b505af1158015615121573d6000803e3d6000fd5b505050506040513d602081101561513757600080fd5b50519050801561515b5760045461515b90839081906001600160a01b031684613e32565b5050565b600c54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561510d57600080fd5b6000826151c75750600061419f565b828202828482816151d457fe5b041461419c5760405162461bcd60e51b81526004018080602001828103825260218152602001806158e56021913960400191505060405180910390fd5b600061419c83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250615572565b816001600160a01b031663a3180217826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561529d57600080fd5b505afa1580156152b1573d6000803e3d6000fd5b505050506040513d60208110156152c757600080fd5b505115615316576040805162461bcd60e51b81526020600482015260186024820152770617665726167655374616b6564416d6f756e7473203e20360441b604482015290519081900360640190fd5b816001600160a01b0316633792def3826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561536357600080fd5b505afa158015615377573d6000803e3d6000fd5b505050506040513d602081101561538d57600080fd5b50511561515b576040805162461bcd60e51b8152602060048201526015602482015274063756d756c617469766552657761726473203e203605c1b604482015290519081900360640190fd5b816001600160a01b0316637337035c826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561542657600080fd5b505afa15801561543a573d6000803e3d6000fd5b505050506040513d602081101561545057600080fd5b50511561548e5760405162461bcd60e51b81526004018080602001828103825260238152602001806158c26023913960400191505060405180910390fd5b816001600160a01b031663b71bce2a826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156154db57600080fd5b505afa1580156154ef573d6000803e3d6000fd5b505050506040513d602081101561550557600080fd5b50511561515b576040805162461bcd60e51b815260206004820181905260248201527f7472616e7366657272656443756d756c617469766552657761726473203e2030604482015290519081900360640190fd5b60606155688484600085615614565b90505b9392505050565b600081836155fe5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156155c35781810151838201526020016155ab565b50505050905090810190601f1680156155f05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161560a57fe5b0495945050505050565b6060824710156156555760405162461bcd60e51b81526004018080602001828103825260268152602001806158786026913960400191505060405180910390fd5b61565e85615770565b6156af576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106156ee5780518252601f1990920191602091820191016156cf565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615750576040519150601f19603f3d011682016040523d82523d6000602084013e615755565b606091505b5091509150615765828286615776565b979650505050505050565b3b151590565b6060831561578557508161556b565b8251156157955782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156155c35781810151838201526020016155ab56fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00476f7665726e61626c653a20666f7262696464656e0000000000000000000000416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564526577617264526f757465723a20616c726561647920696e697469616c697a6564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c526577617264526f757465723a207472616e73666572206e6f74207369676e616c6c65647472616e73666572726564417665726167655374616b6564416d6f756e7473203e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526577617264526f757465723a20696e76616c6964205f6e736c70416d6f756e74526577617264526f757465723a2062616c616e6365203e203000000000000000526577617264526f757465723a20696e76616c6964205f616d6f756e74000000a2646970667358221220ac126c32b0e9ef10cce9f739c5bd83ed0da387ca30ab928ff03ba85440bce09e64736f6c634300060c0033
Deployed Bytecode
0x6080604052600436106102165760003560e01c8063877f1b781161011f578063877f1b781461079257806388a68632146107a7578063891c98c4146107d15780638fcb0c4f146107e657806397b756e71461081f5780639a221bc814610834578063a224cee714610849578063a30d7938146108f7578063b23272811461090c578063b5b3ce7214610921578063bec025be14610936578063c0eabe181461094b578063c47dcd8314610960578063cbe8ef341461098a578063cc2f86ce146109c9578063ce0a875514610a0e578063cfad57a214610a38578063d294f09314610a6b578063e1b9db8914610a80578063e9a1489414610ab3578063ef9aacfd14610ac8578063f69e204614610afb578063f8deba4714610b1057610275565b806301e336671461027a57806305e62bb1146102bd5780630add4853146102f65780630fa2ad531461032757806312d43a51146103805780631af276a6146103955780631d7bca7e146104435780632a9f4083146105735780632ce93494146105a657806330b70002146105e5578063333f084014610641578063392e53cd146106565780633fc8cef31461067f5780634628dd9d146106945780634a69e2aa146106a95780634e71d92d146106be578063527f3043146106d357806354723585146106f6578063592f19d314610720578063655603a4146107355780636969a2d61461076857806385e8d1af1461077d57610275565b36610275576002546001600160a01b03163314610273576040805162461bcd60e51b81526020600482015260166024820152752937baba32b91d1034b73b30b634b21039b2b73232b960511b604482015290519081900360640190fd5b005b600080fd5b34801561028657600080fd5b506102736004803603606081101561029d57600080fd5b506001600160a01b03813581169160208101359091169060400135610b25565b3480156102c957600080fd5b50610273600480360360408110156102e057600080fd5b506001600160a01b038135169060200135610b8b565b34801561030257600080fd5b5061030b610c46565b604080516001600160a01b039092168252519081900360200190f35b34801561033357600080fd5b5061036e6004803603608081101561034a57600080fd5b506001600160a01b0381358116916020810135916040820135916060013516610c55565b60408051918252519081900360200190f35b34801561038c57600080fd5b5061030b610ee9565b3480156103a157600080fd5b50610273600480360360208110156103b857600080fd5b810190602081018135600160201b8111156103d257600080fd5b8201836020820111156103e457600080fd5b803590602001918460208302840111600160201b8311171561040557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610ef8945050505050565b34801561044f57600080fd5b506102736004803603604081101561046657600080fd5b810190602081018135600160201b81111561048057600080fd5b82018360208201111561049257600080fd5b803590602001918460208302840111600160201b831117156104b357600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050600160201b81111561050257600080fd5b82018360208201111561051457600080fd5b803590602001918460208302840111600160201b8311171561053557600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550610fc0945050505050565b34801561057f57600080fd5b506102736004803603602081101561059657600080fd5b50356001600160a01b03166110b5565b3480156105b257600080fd5b5061036e600480360360608110156105c957600080fd5b50803590602081013590604001356001600160a01b031661115e565b3480156105f157600080fd5b50610273600480360360e081101561060857600080fd5b508035151590602081013515159060408101351515906060810135151590608081013515159060a081013515159060c00135151561146b565b34801561064d57600080fd5b5061030b6118a8565b34801561066257600080fd5b5061066b6118b7565b604080519115158252519081900360200190f35b34801561068b57600080fd5b5061030b6118c7565b3480156106a057600080fd5b5061030b6118d6565b3480156106b557600080fd5b5061030b6118e5565b3480156106ca57600080fd5b506102736118f4565b61036e600480360360408110156106e957600080fd5b5080359060200135611954565b34801561070257600080fd5b506102736004803603602081101561071957600080fd5b5035611cd1565b34801561072c57600080fd5b5061030b611d36565b34801561074157600080fd5b506102736004803603602081101561075857600080fd5b50356001600160a01b0316611d45565b34801561077457600080fd5b5061030b612b12565b34801561078957600080fd5b5061030b612b21565b34801561079e57600080fd5b5061030b612b30565b3480156107b357600080fd5b50610273600480360360208110156107ca57600080fd5b5035612b3f565b3480156107dd57600080fd5b5061030b612ba4565b3480156107f257600080fd5b5061036e6004803603604081101561080957600080fd5b506001600160a01b038135169060200135612bb3565b34801561082b57600080fd5b5061030b612e4e565b34801561084057600080fd5b5061030b612e5d565b34801561085557600080fd5b506102736004803603602081101561086c57600080fd5b810190602081018135600160201b81111561088657600080fd5b82018360208201111561089857600080fd5b803590602001918460208302840111600160201b831117156108b957600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929550612e6c945050505050565b34801561090357600080fd5b5061030b61333e565b34801561091857600080fd5b5061027361334d565b34801561092d57600080fd5b5061030b6133a2565b34801561094257600080fd5b5061030b6133b1565b34801561095757600080fd5b5061030b6133c0565b34801561096c57600080fd5b506102736004803603602081101561098357600080fd5b50356133cf565b34801561099657600080fd5b5061036e600480360360608110156109ad57600080fd5b506001600160a01b038135169060208101359060400135613434565b3480156109d557600080fd5b5061036e600480360360808110156109ec57600080fd5b506001600160a01b0381351690602081013590604081013590606001356136f6565b348015610a1a57600080fd5b5061027360048036036020811015610a3157600080fd5b5035613976565b348015610a4457600080fd5b5061027360048036036020811015610a5b57600080fd5b50356001600160a01b03166139db565b348015610a7757600080fd5b50610273613a4a565b348015610a8c57600080fd5b5061030b60048036036020811015610aa357600080fd5b50356001600160a01b0316613a9f565b348015610abf57600080fd5b5061030b613aba565b348015610ad457600080fd5b5061027360048036036020811015610aeb57600080fd5b50356001600160a01b0316613ac9565b348015610b0757600080fd5b50610273613d76565b348015610b1c57600080fd5b5061030b613dd1565b6001546001600160a01b03163314610b72576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b610b866001600160a01b0384168383613de0565b505050565b60026000541415610bd1576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610c23576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b600354610c3d90339084906001600160a01b031684613e32565b50506001600055565b600f546001600160a01b031681565b600060026000541415610c9d576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005583610cf4576040805162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f6e6c70416d6f756e74604482015290519081900360640190fd5b600b54600d546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b158015610d5d57600080fd5b505af1158015610d71573d6000803e3d6000fd5b5050600d546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b158015610ddf57600080fd5b505af1158015610df3573d6000803e3d6000fd5b5050600f54604080516371d597ad60e01b81526001600160a01b0386811660048301528b81166024830152604482018b9052606482018a905288811660848301529151600095509190921692506371d597ad9160a48082019260209290919082900301818787803b158015610e6757600080fd5b505af1158015610e7b573d6000803e3d6000fd5b505050506040513d6020811015610e9157600080fd5b5051604080516001600160a01b03851681526020810189905281519293507ff31c178fc58bad046a8cf4365d6f2d922b8b1aa41d6bed047ca8b85d494761ad929081900390910190a160016000559695505050505050565b6001546001600160a01b031681565b60026000541415610f3e576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314610f90576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b60005b8151811015610c3d57610fb8828281518110610fab57fe5b6020026020010151614041565b600101610f93565b60026000541415611006576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b03163314611058576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b6003546001600160a01b031660005b83518110156110aa576110a23385838151811061108057fe5b60200260200101518486858151811061109557fe5b6020026020010151613e32565b600101611067565b505060016000555050565b600260005414156110fb576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556001546001600160a01b0316331461114d576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b61115681614041565b506001600055565b6000600260005414156111a6576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055836111fd576040805162461bcd60e51b815260206004820181905260248201527f526577617264526f757465723a20696e76616c6964205f6e6c70416d6f756e74604482015290519081900360640190fd5b600b54600d546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018990526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b15801561126657600080fd5b505af115801561127a573d6000803e3d6000fd5b5050600d546006546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018c90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b1580156112e857600080fd5b505af11580156112fc573d6000803e3d6000fd5b5050600f54600254604080516371d597ad60e01b81526001600160a01b0387811660048301529283166024820152604481018b9052606481018a90523060848201529051600095509190921692506371d597ad9160a48082019260209290919082900301818787803b15801561137157600080fd5b505af1158015611385573d6000803e3d6000fd5b505050506040513d602081101561139b57600080fd5b505160025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b1580156113ed57600080fd5b505af1158015611401573d6000803e3d6000fd5b50611419925050506001600160a01b0385168261405f565b604080516001600160a01b03841681526020810188905281517ff31c178fc58bad046a8cf4365d6f2d922b8b1aa41d6bed047ca8b85d494761ad929181900390910190a1600160005595945050505050565b600260005414156114b1576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260009081553390881561166f57601154604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561151957600080fd5b505af115801561152d573d6000803e3d6000fd5b505050506040513d602081101561154357600080fd5b5051601254604080516309f4173d60e11b81526001600160a01b03878116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b1580156115a057600080fd5b505af11580156115b4573d6000803e3d6000fd5b505050506040513d60208110156115ca57600080fd5b5051601354604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561162757600080fd5b505af115801561163b573d6000803e3d6000fd5b505050506040513d602081101561165157600080fd5b50519050611669816116638585614144565b90614144565b93505050505b87801561167c5750600081115b1561169b5760035461169b90839081906001600160a01b031684613e32565b600087156116b0576116ad83846141a5565b90505b8680156116bd5750600081115b156116dc576004546116dc90849081906001600160a01b031684613e32565b85156117f157600954604080516309f4173d60e11b81526001600160a01b03868116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561173b57600080fd5b505af115801561174f573d6000803e3d6000fd5b505050506040513d602081101561176557600080fd5b5051905080156117ef57600a5460055460408051631e42d69b60e21b81526001600160a01b038881166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b1580156117d657600080fd5b505af11580156117ea573d6000803e3d6000fd5b505050505b505b841561189757831561188b5760006118098430614353565b60025460408051632e1a7d4d60e01b81526004810184905290519293506001600160a01b0390911691632e1a7d4d9160248082019260009290919082900301818387803b15801561185957600080fd5b505af115801561186d573d6000803e3d6000fd5b50611885925050506001600160a01b0385168261405f565b50611897565b6118958384614353565b505b505060016000555050505050505050565b600b546001600160a01b031681565b600154600160a01b900460ff1681565b6002546001600160a01b031681565b600c546001600160a01b031681565b6005546001600160a01b031681565b6002600054141561193a576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005561194933806141a5565b506111563333614353565b60006002600054141561199c576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055346119f3576040805162461bcd60e51b815260206004820152601f60248201527f526577617264526f757465723a20696e76616c6964206d73672e76616c756500604482015290519081900360640190fd5b600260009054906101000a90046001600160a01b03166001600160a01b031663d0e30db0346040518263ffffffff1660e01b81526004016000604051808303818588803b158015611a4357600080fd5b505af1158015611a57573d6000803e3d6000fd5b5050600254600f546040805163095ea7b360e01b81526001600160a01b039283166004820152346024820152905191909216945063095ea7b39350604480830193506020928290030181600087803b158015611ab257600080fd5b505af1158015611ac6573d6000803e3d6000fd5b505050506040513d6020811015611adc57600080fd5b5050600f54600254604080516317eb2a1560e01b815230600482015233602482018190526001600160a01b0393841660448301523460648301526084820188905260a482018790529151919360009316916317eb2a159160c48082019260209290919082900301818787803b158015611b5457600080fd5b505af1158015611b68573d6000803e3d6000fd5b505050506040513d6020811015611b7e57600080fd5b5051600d5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b158015611be957600080fd5b505af1158015611bfd573d6000803e3d6000fd5b5050600b54600d5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015611c6857600080fd5b505af1158015611c7c573d6000803e3d6000fd5b5050604080516001600160a01b03861681526020810185905281517f8c35ea96a2dba4a2125563c230bf2d0df1a4d28565b6873c1213b37eeee1bf0b9450908190039091019150a16001600055949350505050565b60026000541415611d17576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556003546111569033906001600160a01b03168360016144bb565b600e546001600160a01b031681565b60026000541415611d8b576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055601154604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015611ddd57600080fd5b505afa158015611df1573d6000803e3d6000fd5b505050506040513d6020811015611e0757600080fd5b505115611e49576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601254604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015611e9657600080fd5b505afa158015611eaa573d6000803e3d6000fd5b505050506040513d6020811015611ec057600080fd5b505115611f02576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601354604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015611f4f57600080fd5b505afa158015611f63573d6000803e3d6000fd5b505050506040513d6020811015611f7957600080fd5b505115611fbb576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b6001600160a01b0381811660009081526014602052604090205433911681146120155760405162461bcd60e51b815260040180806020018281038252602481526020018061589e6024913960400191505060405180910390fd5b6001600160a01b038216600090815260146020526040902080546001600160a01b0319169055612044816149fd565b61204d82614041565b60085460035460408051637aeceb1f60e11b81526001600160a01b03868116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156120a957600080fd5b505afa1580156120bd573d6000803e3d6000fd5b505050506040513d60208110156120d357600080fd5b505190508015612111576003546120f79084906001600160a01b03168360006144bb565b60035461211190849084906001600160a01b031684613e32565b6008546004805460408051637aeceb1f60e11b81526001600160a01b0388811694820194909452918316602483015251600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561216f57600080fd5b505afa158015612183573d6000803e3d6000fd5b505050506040513d602081101561219957600080fd5b5051905080156121d7576004546121bd9085906001600160a01b03168360006144bb565b6004546121d790859085906001600160a01b031684613e32565b600a5460055460408051637aeceb1f60e11b81526001600160a01b03888116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561223357600080fd5b505afa158015612247573d6000803e3d6000fd5b505050506040513d602081101561225d57600080fd5b50519050801561236a57600a546005546040805163098bf59d60e01b81526001600160a01b038981166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b1580156122d157600080fd5b505af11580156122e5573d6000803e3d6000fd5b5050600a5460055460408051631e42d69b60e21b81526001600160a01b038b811660048301528a81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561235157600080fd5b505af1158015612365573d6000803e3d6000fd5b505050505b6000600460009054906101000a90046001600160a01b03166001600160a01b03166370a08231876040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156123ce57600080fd5b505afa1580156123e2573d6000803e3d6000fd5b505050506040513d60208110156123f857600080fd5b5051905080156124915760048054604080516323b872dd60e01b81526001600160a01b038a811694820194909452888416602482015260448101859052905192909116916323b872dd916064808201926020929091908290030181600087803b15801561246457600080fd5b505af1158015612478573d6000803e3d6000fd5b505050506040513d602081101561248e57600080fd5b50505b600d5460065460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b1580156124ed57600080fd5b505afa158015612501573d6000803e3d6000fd5b505050506040513d602081101561251757600080fd5b50519050801561272557600b54600d546040805163098bf59d60e01b81526001600160a01b038b81166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b15801561258b57600080fd5b505af115801561259f573d6000803e3d6000fd5b5050600d546006546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018890526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b15801561260d57600080fd5b505af1158015612621573d6000803e3d6000fd5b5050600d5460065460408051631e42d69b60e21b81526001600160a01b038d811660048301528c81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561268d57600080fd5b505af11580156126a1573d6000803e3d6000fd5b5050600b54600d5460408051631e42d69b60e21b81526001600160a01b038c8116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561270c57600080fd5b505af1158015612720573d6000803e3d6000fd5b505050505b600e5460075460408051637aeceb1f60e11b81526001600160a01b038b8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561278157600080fd5b505afa158015612795573d6000803e3d6000fd5b505050506040513d60208110156127ab57600080fd5b5051905080156129b957600c54600e546040805163098bf59d60e01b81526001600160a01b038c81166004830181905293811660248301526044820186905260648201939093529051919092169163098bf59d91608480830192600092919082900301818387803b15801561281f57600080fd5b505af1158015612833573d6000803e3d6000fd5b5050600e546007546040805163098bf59d60e01b81526001600160a01b038e8116600483018190529381166024830152604482018890526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b1580156128a157600080fd5b505af11580156128b5573d6000803e3d6000fd5b5050600e5460075460408051631e42d69b60e21b81526001600160a01b038e811660048301528d81166024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561292157600080fd5b505af1158015612935573d6000803e3d6000fd5b5050600c54600e5460408051631e42d69b60e21b81526001600160a01b038d8116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b1580156129a057600080fd5b505af11580156129b4573d6000803e3d6000fd5b505050505b60115460408051630f713c2360e41b81526001600160a01b038b811660048301528a811660248301529151919092169163f713c23091604480830192600092919082900301818387803b158015612a0f57600080fd5b505af1158015612a23573d6000803e3d6000fd5b505060125460408051630f713c2360e41b81526001600160a01b038d811660048301528c81166024830152915191909216935063f713c2309250604480830192600092919082900301818387803b158015612a7d57600080fd5b505af1158015612a91573d6000803e3d6000fd5b505060135460408051630f713c2360e41b81526001600160a01b038d811660048301528c81166024830152915191909216935063f713c2309250604480830192600092919082900301818387803b158015612aeb57600080fd5b505af1158015612aff573d6000803e3d6000fd5b5050600160005550505050505050505050565b6011546001600160a01b031681565b6003546001600160a01b031681565b6010546001600160a01b031681565b60026000541415612b85576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005560045461115690339081906001600160a01b031684613e32565b6008546001600160a01b031681565b600060026000541415612bfb576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005581612c40576040805162461bcd60e51b815260206004820152601d6024820152600080516020615971833981519152604482015290519081900360640190fd5b33612c566001600160a01b038516823086614d04565b601054612c70906001600160a01b03868116911685614d64565b6010546040805163bf6eac2f60e01b81526001600160a01b0384811660048301528781166024830152604482018790529151600093929092169163bf6eac2f9160648082019260209290919082900301818787803b158015612cd157600080fd5b505af1158015612ce5573d6000803e3d6000fd5b505050506040513d6020811015612cfb57600080fd5b5051600e5460075460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b158015612d6657600080fd5b505af1158015612d7a573d6000803e3d6000fd5b5050600c54600e5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015612de557600080fd5b505af1158015612df9573d6000803e3d6000fd5b5050604080516001600160a01b03861681526020810185905281517f156ad2abc9b77025018f1ebf69580b5aea6ce5449359ca36da16d35ec0a2b0439450908190039091019150a16001600055949350505050565b600d546001600160a01b031681565b600a546001600160a01b031681565b6001546001600160a01b03163314612eb9576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b600154600160a01b900460ff1615612f025760405162461bcd60e51b81526004018080602001828103825260218152602001806158576021913960400191505060405180910390fd5b6001805460ff60a01b1916600160a01b17905580518190600090612f2257fe5b6020026020010151600260006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600181518110612f5d57fe5b6020026020010151600360006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600281518110612f9857fe5b6020026020010151600460006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600381518110612fd357fe5b6020026020010151600560006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060048151811061300e57fe5b6020026020010151600660006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060058151811061304957fe5b6020026020010151600760006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060068151811061308457fe5b6020026020010151600860006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806007815181106130bf57fe5b6020026020010151600960006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806008815181106130fa57fe5b6020026020010151600a60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060098151811061313557fe5b6020026020010151600d60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600a8151811061317057fe5b6020026020010151600e60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600b815181106131ab57fe5b6020026020010151600b60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600c815181106131e657fe5b6020026020010151600c60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600d8151811061322157fe5b6020026020010151600f60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600e8151811061325c57fe5b6020026020010151601060006101000a8154816001600160a01b0302191690836001600160a01b0316021790555080600f8151811061329757fe5b6020026020010151601160006101000a8154816001600160a01b0302191690836001600160a01b03160217905550806010815181106132d257fe5b6020026020010151601260006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060118151811061330d57fe5b6020026020010151601360006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b6006546001600160a01b031681565b60026000541415613393576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005561115633806141a5565b6009546001600160a01b031681565b6012546001600160a01b031681565b6013546001600160a01b031681565b60026000541415613415576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556004546111569033906001600160a01b03168360016144bb565b60006002600054141561347c576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055826134bd5760405162461bcd60e51b81526004018080602001828103825260218152602001806159306021913960400191505060405180910390fd5b600c54600e546040805163098bf59d60e01b815233600482018190526001600160a01b039384166024830152604482018890526064820181905291519193929092169163098bf59d91608480830192600092919082900301818387803b15801561352657600080fd5b505af115801561353a573d6000803e3d6000fd5b5050600e546007546040805163098bf59d60e01b81526001600160a01b03878116600483018190529381166024830152604482018b90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b1580156135a857600080fd5b505af11580156135bc573d6000803e3d6000fd5b5050601054604080516330414fc560e11b81526001600160a01b0386811660048301528a81166024830152604482018a90529151600095509190921692506360829f8a9160648082019260209290919082900301818787803b15801561362157600080fd5b505af1158015613635573d6000803e3d6000fd5b505050506040513d602081101561364b57600080fd5b50519050838110156136a4576040805162461bcd60e51b815260206004820152601d60248201527f526577617264526f757465723a20696e76616c6964205f6d696e4f7574000000604482015290519081900360640190fd5b604080516001600160a01b03841681526020810187905281517fc3a81d3e4fdfdf24abaa8334741fdf1abdc1c8bc88d05ce2da9bcd733c2d37f9929181900390910190a1600160005595945050505050565b60006002600054141561373e576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005583613783576040805162461bcd60e51b815260206004820152601d6024820152600080516020615971833981519152604482015290519081900360640190fd5b600f54604080516317eb2a1560e01b81523360048201819052602482018190526001600160a01b038981166044840152606483018990526084830188905260a483018790529251909360009316916317eb2a159160c480830192602092919082900301818787803b1580156137f757600080fd5b505af115801561380b573d6000803e3d6000fd5b505050506040513d602081101561382157600080fd5b5051600d5460065460408051631e42d69b60e21b81526001600160a01b03878116600483018190526024830152928316604482015260648101859052905193945091169163790b5a6c9160848082019260009290919082900301818387803b15801561388c57600080fd5b505af11580156138a0573d6000803e3d6000fd5b5050600b54600d5460408051631e42d69b60e21b81526001600160a01b03888116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b15801561390b57600080fd5b505af115801561391f573d6000803e3d6000fd5b5050604080516001600160a01b03861681526020810185905281517f8c35ea96a2dba4a2125563c230bf2d0df1a4d28565b6873c1213b37eeee1bf0b9450908190039091019150a160016000559695505050505050565b600260005414156139bc576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b600260005560035461115690339081906001600160a01b031684613e32565b6001546001600160a01b03163314613a28576040805162461bcd60e51b815260206004820152601560248201526000805160206157fd833981519152604482015290519081900360640190fd5b600180546001600160a01b0319166001600160a01b0392909216919091179055565b60026000541415613a90576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b60026000556111563380614353565b6014602052600090815260409020546001600160a01b031681565b6007546001600160a01b031681565b60026000541415613b0f576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055601154604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015613b5f57600080fd5b505afa158015613b73573d6000803e3d6000fd5b505050506040513d6020811015613b8957600080fd5b505115613bcb576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601254604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015613c1657600080fd5b505afa158015613c2a573d6000803e3d6000fd5b505050506040513d6020811015613c4057600080fd5b505115613c82576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601354604080516370a0823160e01b815233600482015290516001600160a01b03909216916370a0823191602480820192602092909190829003018186803b158015613ccd57600080fd5b505afa158015613ce1573d6000803e3d6000fd5b505050506040513d6020811015613cf757600080fd5b505115613d39576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b613d42816149fd565b33600090815260146020526040812080546001600160a01b0319166001600160a01b03939093169290921790915560019055565b60026000541415613dbc576040805162461bcd60e51b815260206004820152601f60248201526000805160206157dd833981519152604482015290519081900360640190fd5b6002600055613dca33614041565b6001600055565b6004546001600160a01b031681565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610b86908490614e4b565b60008111613e75576040805162461bcd60e51b815260206004820152601d6024820152600080516020615971833981519152604482015290519081900360640190fd5b60085460408051631e42d69b60e21b81526001600160a01b03878116600483015286811660248301528581166044830152606482018590529151919092169163790b5a6c91608480830192600092919082900301818387803b158015613eda57600080fd5b505af1158015613eee573d6000803e3d6000fd5b505060095460085460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613f5957600080fd5b505af1158015613f6d573d6000803e3d6000fd5b5050600a5460095460408051631e42d69b60e21b81526001600160a01b03898116600483018190526024830152928316604482015260648101879052905191909216935063790b5a6c9250608480830192600092919082900301818387803b158015613fd857600080fd5b505af1158015613fec573d6000803e3d6000fd5b5050604080516001600160a01b0380881682528616602082015280820185905290517f1a2829d91759b05f72340eac7ee551152ef793eafebc2cd16b6f99ac21495fb09350908190036060019150a150505050565b61404a81614efc565b614053816150b4565b61405c8161515f565b50565b804710156140b4576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015290519081900360640190fd5b6040516000906001600160a01b0384169083908381818185875af1925050503d80600081146140ff576040519150601f19603f3d011682016040523d82523d6000602084013e614104565b606091505b5050905080610b865760405162461bcd60e51b815260040180806020018281038252603a81526020018061581d603a913960400191505060405180910390fd5b60008282018381101561419c576040805162461bcd60e51b815260206004820152601b60248201527a536166654d6174683a206164646974696f6e206f766572666c6f7760281b604482015290519081900360640190fd5b90505b92915050565b600854604080516309f4173d60e11b81526001600160a01b03858116600483015284811660248301529151600093849316916313e82e7a91604480830192602092919082900301818787803b1580156141fd57600080fd5b505af1158015614211573d6000803e3d6000fd5b505050506040513d602081101561422757600080fd5b5051600b54604080516309f4173d60e11b81526001600160a01b0388811660048301528781166024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561428557600080fd5b505af1158015614299573d6000803e3d6000fd5b505050506040513d60208110156142af57600080fd5b5051600c54604080516309f4173d60e11b81526001600160a01b0389811660048301528881166024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561430d57600080fd5b505af1158015614321573d6000803e3d6000fd5b505050506040513d602081101561433757600080fd5b50519050614349816116638585614144565b9695505050505050565b600a54604080516309f4173d60e11b81526001600160a01b03858116600483015284811660248301529151600093849316916313e82e7a91604480830192602092919082900301818787803b1580156143ab57600080fd5b505af11580156143bf573d6000803e3d6000fd5b505050506040513d60208110156143d557600080fd5b5051600d54604080516309f4173d60e11b81526001600160a01b0388811660048301528781166024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561443357600080fd5b505af1158015614447573d6000803e3d6000fd5b505050506040513d602081101561445d57600080fd5b5051600e54604080516309f4173d60e11b81526001600160a01b0389811660048301528881166024830152915193945060009391909216916313e82e7a91604480830192602092919082900301818787803b15801561430d57600080fd5b600082116144fe576040805162461bcd60e51b815260206004820152601d6024820152600080516020615971833981519152604482015290519081900360640190fd5b600854604080516310c1c10360e01b81526001600160a01b038781166004830152915160009392909216916310c1c10391602480820192602092909190829003018186803b15801561454f57600080fd5b505afa158015614563573d6000803e3d6000fd5b505050506040513d602081101561457957600080fd5b5051600a546009546040805163098bf59d60e01b81526001600160a01b038a8116600483018190529381166024830152604482018990526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b1580156145e757600080fd5b505af11580156145fb573d6000803e3d6000fd5b50506009546008546040805163098bf59d60e01b81526001600160a01b038b8116600483018190529381166024830152604482018a90526064820193909352905191909216935063098bf59d9250608480830192600092919082900301818387803b15801561466957600080fd5b505af115801561467d573d6000803e3d6000fd5b50506008546040805163098bf59d60e01b81526001600160a01b038a8116600483018190528a82166024840152604483018a90526064830152915191909216935063098bf59d9250608480830192600092919082900301818387803b1580156146e557600080fd5b505af11580156146f9573d6000803e3d6000fd5b5050505081156149ac57600954604080516309f4173d60e11b81526001600160a01b03888116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561475c57600080fd5b505af1158015614770573d6000803e3d6000fd5b505050506040513d602081101561478657600080fd5b50519050801561481057600a5460055460408051631e42d69b60e21b81526001600160a01b038a81166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b1580156147f757600080fd5b505af115801561480b573d6000803e3d6000fd5b505050505b600a5460055460408051637aeceb1f60e11b81526001600160a01b038a8116600483015292831660248201529051600093929092169163f5d9d63e91604480820192602092909190829003018186803b15801561486c57600080fd5b505afa158015614880573d6000803e3d6000fd5b505050506040513d602081101561489657600080fd5b5051905080156149a95760006148b6846148b084896151b8565b90615211565b600a546005546040805163098bf59d60e01b81526001600160a01b038d8116600483018190529381166024830152604482018690526064820193909352905193945091169163098bf59d9160848082019260009290919082900301818387803b15801561492257600080fd5b505af1158015614936573d6000803e3d6000fd5b505060055460408051632770a7eb60e21b81526001600160a01b038d81166004830152602482018790529151919092169350639dc29fac9250604480830192600092919082900301818387803b15801561498f57600080fd5b505af11580156149a3573d6000803e3d6000fd5b50505050505b50505b604080516001600160a01b0380881682528616602082015280820185905290517ff1cca4a4ac405431d71ef4ee5122cc93b5475349cac575db9584f2e879c56fa09181900360600190a15050505050565b600854614a13906001600160a01b031682615250565b600954614a29906001600160a01b031682615250565b600a54614a3f906001600160a01b031682615250565b601154614a55906001600160a01b0316826153d9565b600b54614a6b906001600160a01b031682615250565b600d54614a81906001600160a01b031682615250565b601254614a97906001600160a01b0316826153d9565b600c54614aad906001600160a01b031682615250565b600e54614ac3906001600160a01b031682615250565b601354614ad9906001600160a01b0316826153d9565b601154604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015614b2657600080fd5b505afa158015614b3a573d6000803e3d6000fd5b505050506040513d6020811015614b5057600080fd5b505115614b92576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601254604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015614bdf57600080fd5b505afa158015614bf3573d6000803e3d6000fd5b505050506040513d6020811015614c0957600080fd5b505115614c4b576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b601354604080516370a0823160e01b81526001600160a01b038481166004830152915191909216916370a08231916024808301926020929190829003018186803b158015614c9857600080fd5b505afa158015614cac573d6000803e3d6000fd5b505050506040513d6020811015614cc257600080fd5b50511561405c576040805162461bcd60e51b81526020600482015260196024820152600080516020615951833981519152604482015290519081900360640190fd5b604080516001600160a01b0380861660248301528416604482015260648082018490528251808303909101815260849091019091526020810180516001600160e01b03166323b872dd60e01b179052614d5e908590614e4b565b50505050565b6000614dfa82856001600160a01b031663dd62ed3e30876040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b158015614dc857600080fd5b505afa158015614ddc573d6000803e3d6000fd5b505050506040513d6020811015614df257600080fd5b505190614144565b604080516001600160a01b038616602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663095ea7b360e01b179052909150614d5e9085905b6060614ea0826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166155599092919063ffffffff16565b805190915015610b8657808060200190516020811015614ebf57600080fd5b5051610b865760405162461bcd60e51b815260040180806020018281038252602a815260200180615906602a913960400191505060405180910390fd5b600854604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614f5557600080fd5b505af1158015614f69573d6000803e3d6000fd5b505050506040513d6020811015614f7f57600080fd5b505190508015614fa357600454614fa390839081906001600160a01b031684613e32565b600954604080516309f4173d60e11b81526001600160a01b03858116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b158015614ffc57600080fd5b505af1158015615010573d6000803e3d6000fd5b505050506040513d602081101561502657600080fd5b505190508015610b8657600a5460055460408051631e42d69b60e21b81526001600160a01b038781166004830181905260248301529283166044820152606481018590529051919092169163790b5a6c91608480830192600092919082900301818387803b15801561509757600080fd5b505af11580156150ab573d6000803e3d6000fd5b50505050505050565b600b54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561510d57600080fd5b505af1158015615121573d6000803e3d6000fd5b505050506040513d602081101561513757600080fd5b50519050801561515b5760045461515b90839081906001600160a01b031684613e32565b5050565b600c54604080516309f4173d60e11b81526001600160a01b03848116600483018190526024830152915160009392909216916313e82e7a9160448082019260209290919082900301818787803b15801561510d57600080fd5b6000826151c75750600061419f565b828202828482816151d457fe5b041461419c5760405162461bcd60e51b81526004018080602001828103825260218152602001806158e56021913960400191505060405180910390fd5b600061419c83836040518060400160405280601a815260200179536166654d6174683a206469766973696f6e206279207a65726f60301b815250615572565b816001600160a01b031663a3180217826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561529d57600080fd5b505afa1580156152b1573d6000803e3d6000fd5b505050506040513d60208110156152c757600080fd5b505115615316576040805162461bcd60e51b81526020600482015260186024820152770617665726167655374616b6564416d6f756e7473203e20360441b604482015290519081900360640190fd5b816001600160a01b0316633792def3826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561536357600080fd5b505afa158015615377573d6000803e3d6000fd5b505050506040513d602081101561538d57600080fd5b50511561515b576040805162461bcd60e51b8152602060048201526015602482015274063756d756c617469766552657761726473203e203605c1b604482015290519081900360640190fd5b816001600160a01b0316637337035c826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b15801561542657600080fd5b505afa15801561543a573d6000803e3d6000fd5b505050506040513d602081101561545057600080fd5b50511561548e5760405162461bcd60e51b81526004018080602001828103825260238152602001806158c26023913960400191505060405180910390fd5b816001600160a01b031663b71bce2a826040518263ffffffff1660e01b815260040180826001600160a01b0316815260200191505060206040518083038186803b1580156154db57600080fd5b505afa1580156154ef573d6000803e3d6000fd5b505050506040513d602081101561550557600080fd5b50511561515b576040805162461bcd60e51b815260206004820181905260248201527f7472616e7366657272656443756d756c617469766552657761726473203e2030604482015290519081900360640190fd5b60606155688484600085615614565b90505b9392505050565b600081836155fe5760405162461bcd60e51b81526004018080602001828103825283818151815260200191508051906020019080838360005b838110156155c35781810151838201526020016155ab565b50505050905090810190601f1680156155f05780820380516001836020036101000a031916815260200191505b509250505060405180910390fd5b50600083858161560a57fe5b0495945050505050565b6060824710156156555760405162461bcd60e51b81526004018080602001828103825260268152602001806158786026913960400191505060405180910390fd5b61565e85615770565b6156af576040805162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015290519081900360640190fd5b60006060866001600160a01b031685876040518082805190602001908083835b602083106156ee5780518252601f1990920191602091820191016156cf565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114615750576040519150601f19603f3d011682016040523d82523d6000602084013e615755565b606091505b5091509150615765828286615776565b979650505050505050565b3b151590565b6060831561578557508161556b565b8251156157955782518084602001fd5b60405162461bcd60e51b81526020600482018181528451602484015284518593919283926044019190850190808383600083156155c35781810151838201526020016155ab56fe5265656e7472616e637947756172643a207265656e7472616e742063616c6c00476f7665726e61626c653a20666f7262696464656e0000000000000000000000416464726573733a20756e61626c6520746f2073656e642076616c75652c20726563697069656e74206d61792068617665207265766572746564526577617264526f757465723a20616c726561647920696e697469616c697a6564416464726573733a20696e73756666696369656e742062616c616e636520666f722063616c6c526577617264526f757465723a207472616e73666572206e6f74207369676e616c6c65647472616e73666572726564417665726167655374616b6564416d6f756e7473203e2030536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f775361666545524332303a204552433230206f7065726174696f6e20646964206e6f742073756363656564526577617264526f757465723a20696e76616c6964205f6e736c70416d6f756e74526577617264526f757465723a2062616c616e6365203e203000000000000000526577617264526f757465723a20696e76616c6964205f616d6f756e74000000a2646970667358221220ac126c32b0e9ef10cce9f739c5bd83ed0da387ca30ab928ff03ba85440bce09e64736f6c634300060c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.