Feature Tip: Add private address tag to any address under My Name Tag !
Source Code
Latest 25 from a total of 3,348 transactions
| Transaction Hash |
Method
|
Block
|
From
|
|
To
|
||||
|---|---|---|---|---|---|---|---|---|---|
| Claim | 21357355 | 461 days ago | IN | 0 ETH | 0.00088076 | ||||
| Lock ETH | 21349352 | 463 days ago | IN | 0 ETH | 0.00075337 | ||||
| Lock ETH | 21349313 | 463 days ago | IN | 0 ETH | 0.00060694 | ||||
| Refund ETH | 21344184 | 463 days ago | IN | 0 ETH | 0.00262861 | ||||
| Refund ETH | 21342958 | 463 days ago | IN | 0 ETH | 0.00126434 | ||||
| Refund ETH | 21342266 | 463 days ago | IN | 0 ETH | 0.00121011 | ||||
| Refund ETH | 21342074 | 464 days ago | IN | 0 ETH | 0.00121037 | ||||
| Refund ETH | 21342061 | 464 days ago | IN | 0 ETH | 0.00101793 | ||||
| Refund ETH | 21342029 | 464 days ago | IN | 0 ETH | 0.0010727 | ||||
| Refund ETH | 21341919 | 464 days ago | IN | 0 ETH | 0.00110489 | ||||
| Refund ETH | 21341885 | 464 days ago | IN | 0 ETH | 0.00120716 | ||||
| Refund ETH | 21341624 | 464 days ago | IN | 0 ETH | 0.00115704 | ||||
| Refund ETH | 21341368 | 464 days ago | IN | 0 ETH | 0.00139708 | ||||
| Refund ETH | 21341072 | 464 days ago | IN | 0 ETH | 0.00126388 | ||||
| Refund ETH | 21336927 | 464 days ago | IN | 0 ETH | 0.00248206 | ||||
| Refund ETH | 21336898 | 464 days ago | IN | 0 ETH | 0.00257142 | ||||
| Refund ETH | 21336874 | 464 days ago | IN | 0 ETH | 0.00235779 | ||||
| Refund ETH | 21336837 | 464 days ago | IN | 0 ETH | 0.00222826 | ||||
| Refund ETH | 21336806 | 464 days ago | IN | 0 ETH | 0.00243795 | ||||
| Refund ETH | 21336388 | 464 days ago | IN | 0 ETH | 0.00178949 | ||||
| Refund ETH | 21336250 | 464 days ago | IN | 0 ETH | 0.00168234 | ||||
| Refund ETH | 21335898 | 464 days ago | IN | 0 ETH | 0.00170134 | ||||
| Refund ETH | 21335432 | 464 days ago | IN | 0 ETH | 0.00159829 | ||||
| Refund ETH | 21335402 | 464 days ago | IN | 0 ETH | 0.00161803 | ||||
| Refund ETH | 21334811 | 465 days ago | IN | 0 ETH | 0.00120949 |
Latest 25 internal transactions (View All)
Advanced mode:
| Parent Transaction Hash | Method | Block |
From
|
|
To
|
||
|---|---|---|---|---|---|---|---|
| Transfer | 21349352 | 463 days ago | 161.54862735 ETH | ||||
| Transfer | 21349313 | 463 days ago | 1 ETH | ||||
| Transfer | 21344184 | 463 days ago | 0.075 ETH | ||||
| Transfer | 21342958 | 463 days ago | 1.5 ETH | ||||
| Transfer | 21342266 | 463 days ago | 0.825 ETH | ||||
| Transfer | 21342074 | 464 days ago | 0.675 ETH | ||||
| Transfer | 21342061 | 464 days ago | 0.75 ETH | ||||
| Transfer | 21342029 | 464 days ago | 0.075 ETH | ||||
| Transfer | 21341919 | 464 days ago | 0.075 ETH | ||||
| Transfer | 21341885 | 464 days ago | 0.075 ETH | ||||
| Transfer | 21341624 | 464 days ago | 0.075 ETH | ||||
| Transfer | 21341368 | 464 days ago | 0.075 ETH | ||||
| Transfer | 21341072 | 464 days ago | 1.05 ETH | ||||
| Transfer | 21336927 | 464 days ago | 0.75 ETH | ||||
| Transfer | 21336898 | 464 days ago | 0.075 ETH | ||||
| Transfer | 21336874 | 464 days ago | 0.3 ETH | ||||
| Transfer | 21336837 | 464 days ago | 0.15 ETH | ||||
| Transfer | 21336806 | 464 days ago | 0.075 ETH | ||||
| Transfer | 21336388 | 464 days ago | 0.075 ETH | ||||
| Transfer | 21336250 | 464 days ago | 11.25 ETH | ||||
| Transfer | 21335898 | 464 days ago | 1.8 ETH | ||||
| Transfer | 21335432 | 464 days ago | 0.375 ETH | ||||
| Transfer | 21335402 | 464 days ago | 7.5 ETH | ||||
| Transfer | 21334811 | 465 days ago | 0.15 ETH | ||||
| Transfer | 21334724 | 465 days ago | 0.375 ETH |
Loading...
Loading
Loading...
Loading
Cross-Chain Transactions
Loading...
Loading
Contract Name:
JUMPTreasury
Compiler Version
v0.8.20+commit.a1b79de6
Optimization Enabled:
Yes with 200 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.20;
import "./libraries/SafeERC20.sol";
abstract contract Context {
function _msgSender() internal view virtual returns (address) {
return msg.sender;
}
function _msgData() internal view virtual returns (bytes calldata) {
return msg.data;
}
}
contract Ownable is Context {
address private _owner;
event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);
/**
* @dev Initializes the contract setting the deployer as the initial owner.
*/
constructor() {
address msgSender = _msgSender();
_owner = msgSender;
emit OwnershipTransferred(address(0), msgSender);
}
/**
* @dev Returns the address of the current owner.
*/
function owner() public view returns (address) {
return _owner;
}
/**
* @dev Throws if called by any account other than the owner.
*/
modifier onlyOwner() {
require(_owner == _msgSender(), 'Ownable: caller is not the owner');
_;
}
/**
* @dev Leaves the contract without owner. It will not be possible to call
* `onlyOwner` functions anymore. Can only be called by the current owner.
*
* NOTE: Renouncing ownership will leave the contract without an owner,
* thereby removing any functionality that is only available to the owner.
*/
function renounceOwnership() public onlyOwner {
emit OwnershipTransferred(_owner, address(0));
_owner = address(0);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
* Can only be called by the current owner.
*/
function transferOwnership(address newOwner) public onlyOwner {
_transferOwnership(newOwner);
}
/**
* @dev Transfers ownership of the contract to a new account (`newOwner`).
*/
function _transferOwnership(address newOwner) internal {
require(newOwner != address(0), 'Ownable: new owner is the zero address');
emit OwnershipTransferred(_owner, newOwner);
_owner = newOwner;
}
}
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 (){
_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;
}
}
interface IUniswapV2Factory {
function owner() external view returns (address);
function getPair(address tokenA, address tokenB) external view returns (address pair);
function allPairs(uint256) external view returns (address pair);
function allPairsLength() external view returns (uint256);
function createPair(address tokenA, address tokenB) external returns (address pair);
}
interface IUniswapV2Router01 {
function factory() external pure returns (address);
function WETH() external pure returns (address);
function addLiquidity(
address tokenA,
address tokenB,
uint amountADesired,
uint amountBDesired,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB, uint liquidity);
function addLiquidityETH(
address token,
uint amountTokenDesired,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
)
external
payable
returns (uint amountToken, uint amountETH, uint liquidity);
function removeLiquidity(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline
) external returns (uint amountA, uint amountB);
function removeLiquidityETH(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountToken, uint amountETH);
function removeLiquidityWithPermit(
address tokenA,
address tokenB,
uint liquidity,
uint amountAMin,
uint amountBMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountA, uint amountB);
function removeLiquidityETHWithPermit(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountToken, uint amountETH);
function quote(
uint amountA,
uint reserveA,
uint reserveB
) external pure returns (uint amountB);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint256 amountIn,
uint256 amountOutMin,
address[] calldata path,
address to,
uint256 deadline
) external;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
}
interface IUniswapV2Pair {
function decimals() external pure returns (uint8);
function totalSupply() external view returns (uint256);
function balanceOf(address owner) external view returns (uint256);
function token0() external view returns (address);
function token1() external view returns (address);
function getReserves() external
view
returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
}
interface IUniswapV2Router is IUniswapV2Router01 {
function removeLiquidityETHSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline
) external returns (uint amountETH);
function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens(
address token,
uint liquidity,
uint amountTokenMin,
uint amountETHMin,
address to,
uint deadline,
bool approveMax,
uint8 v,
bytes32 r,
bytes32 s
) external returns (uint amountETH);
function swapExactTokensForTokensSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function swapExactETHForTokensSupportingFeeOnTransferTokens(
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external payable;
function swapExactTokensForETHSupportingFeeOnTransferTokens(
uint amountIn,
uint amountOutMin,
address[] calldata path,
address to,
uint deadline
) external;
function getAmountsOut(
uint amountIn,
address[] calldata path
) external view returns (uint[] memory amounts);
}
interface IJUMPBonusPool {
function addTick(address user,uint256 mintTotal) external payable;
function getEndBonusTime() external view returns(uint256);
function startTime() external view returns(uint256);
}
contract JUMPTreasury is ReentrancyGuard,Ownable{
using SafeERC20 for IERC20;
// Info of each token lq.
struct TokenLqInfo{
uint256 ethAddAmount; //add eth amount
uint256 tokenAddAmount; //add token amount
uint256 lqAmountTotal;
uint256 addLqTime;
uint256 rmLqAmount;
bool isLiqWar;
bool isStartLiqWar;
bool isCTOFlag;
}
// Info of each user.
struct UserInfo {
uint256 depositAmount; // How many tokens the user has provided.
uint256 mintTotal; // How many mint tokens the user will receive.
uint256 mintReleased;
bool isRefund;
bool isStartClaim;
}
struct LiqWarInfo{
uint256 rewardETH;
uint256 rewardSeq;
address[2] rewardTokenAddrs;
bool rmFlag;
}
address public JUMPToken;
address public constant DEAD = 0x000000000000000000000000000000000000dEaD;
uint256 public constant basePoints = 100;
uint256 public constant refundRate = 75;
uint256 public constant rmLiqWarRate = 10;
uint256 public constant buyTokenCnt = 24;
uint256 public bonusRate = 7;
uint256 public marketMakerRate = 25;
uint256 public rmSlippage = 5;
uint256 public adLPRate = 15;
uint256 public inviteRate = 3;
uint256 public protectLQDuration = 24 * 3600;
uint256 public protectRefundDuration = 7 * 24 * 3600;
uint256 public minPerDeposit;
uint256 public mintTokenLimit;
uint256 public addLQTokenLimit;
uint256 public mintedToken;
uint256 public mintLimitETH;
uint256 public debitTotal;
uint256 public debitLimit;
uint256 public userDepositTotal;
mapping(address => bool) public keeperMap;
// address => amount
mapping(address => UserInfo) public userInfo;
mapping(address => address) public tokenPair;
mapping(address => TokenLqInfo) public tokenLqInfo;
address public marketMakerAddr;
address public inviteRewardAddr;
mapping(address => uint256) public tokenDebitLevel;
mapping(address => address) public tokenUser;
mapping(uint256 => LiqWarInfo) public seqLiqWarInfo;
uint256 public rangeIndex;
uint256[20] public buyRange;
uint256[20] public mintRange;
address public WETH;
IUniswapV2Factory public factory = IUniswapV2Factory(0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f); //ETH;
IUniswapV2Router public swapRouter = IUniswapV2Router(0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D); //ETH;
IJUMPBonusPool public bonusPool;
// The time when debit starts
uint256 public startTime;
// The time when debit ends
uint256 public endTime;
bool public isDestroyToken;
address public lockLPAddr;
event AddNewDebit(address user,address newToken,address pair,uint256 debitLevel,uint256 initBuyAmount);
event Donate(address indexed user, uint256 amount,uint256 range, uint256 userDeposit);
event Claim(address indexed user, uint256 amount);
event SetKeeper(address indexed sender,address addr,bool active);
event RemoveLiqWarLiquidity(uint256 seqNo,address tokenAddr,address pair,uint256 lqAmount,uint256 ethAmount);
event AddLiquidity(address tokenAddr,address pair,uint256 tokenAmount,uint256 ethAmount);
event WithdrawDebitForLiqWar(address tokenAddr,address pair,uint256 lqAmount,uint256 ethAmount,bool isLiqWar);
event RefundETH(address user, uint256 depositAmount,uint256 refundAmount);
event RemoveLiqWarFlag(address sender,address tokenAddr);
event SetRmLqSlippage(address sender,uint256 rmSlippage);
event SetDebitLimit(address sender,uint256 debitLimit);
event SetBonusPool(address sender,address bonusPool);
modifier onlyKeeper() {
require(isKeeper(msg.sender), "Not keeper");
_;
}
constructor(address _v2Factory,address _v2Router,address _bonusPool,address _rewardAddr,address _JUMPToken) {
swapRouter = IUniswapV2Router(_v2Router);
factory = IUniswapV2Factory(_v2Factory);
bonusPool = IJUMPBonusPool(_bonusPool);
WETH = swapRouter.WETH();
mintTokenLimit = 800_000_000e18;
addLQTokenLimit = 120_000_000e18;
mintLimitETH = 101287e17;
minPerDeposit = 1e17; //0.1 ETH
marketMakerAddr = 0xFE49c3D7b7EF988233FAddeD69f7B624A392E017;
inviteRewardAddr = _rewardAddr;
startTime = bonusPool.startTime();
endTime = bonusPool.getEndBonusTime();
JUMPToken = _JUMPToken;
buyRange = [4600e17,9246e17,13938e17,18678e17,23465e17,28299e17,33182e17,38114e17,43095e17,48126e17,53207e17,58340e17,63523e17,68758e17,74046e17,79386e17,84780e17,90228e17,95730e17,101287e17];
mintRange = [8695652174e13,8609556608e13,8524313473e13,8439914330e13,8356350822e13,8273614675e13,8191697698e13,8110591780e13,8030288891e13,7950781080e13,7872060476e13,7794119283e13,7716949785e13,7640544341e13,7564895388e13,7489995433e13,7415837063e13,7342412933e13,7269715776e13,7197738392e13];
keeperMap[msg.sender] = true;
lockLPAddr = 0xFE49c3D7b7EF988233FAddeD69f7B624A392E017;
}
function addNewDebit(address newToken,address user,uint256 debitLevel,bool isLiqWar) public payable onlyKeeper returns(address pair) {
require(address(this).balance >= debitLevel,'Balance less than debit level');
require(debitTotal + debitLevel <= debitLimit && (debitLimit > 0),'Exceed debitLimit');
tokenDebitLevel[newToken] = debitLevel;
tokenUser[newToken] = user;
tokenLqInfo[newToken].isLiqWar = isLiqWar;
_addLiquidity(newToken);
uint256 initBuyAmount = msg.value;
//swap buy
address[] memory path = new address[](2);
path[0] = address(WETH);
path[1] = address(newToken);
swapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value:initBuyAmount}(
0,
path,
user,
block.timestamp
);
debitTotal += debitLevel;
pair = tokenPair[newToken];
emit AddNewDebit(user,newToken,pair,debitLevel,initBuyAmount);
}
function donate(uint256 donateNum) external payable nonReentrant{
uint256 amount = msg.value;
require(block.timestamp <= endTime,'Deposit end');
require(amount >= minPerDeposit,'Less minPerDeposit');
require(donateNum * minPerDeposit == amount,'Donate amount not equal to value');
require(0 == amount % minPerDeposit,'Amount wrong');
require(userDepositTotal + amount <= mintLimitETH,'Exceed ETH Limit');
(uint256 tokenAmount,uint256 index,,) = getMintIndexAndAmount(userDepositTotal,amount);
rangeIndex = index;
address user = msg.sender;
userDepositTotal += amount;
userInfo[user].depositAmount += amount;
userInfo[user].mintTotal += tokenAmount;
mintedToken += tokenAmount;
uint256 bonusPoolAmount = amount * bonusRate / basePoints;
bonusPool.addTick{value: bonusPoolAmount}(msg.sender,userDepositTotal);
endTime = bonusPool.getEndBonusTime();
//marketMakerRate && add LP
uint256 marketMakerAmount = amount * (marketMakerRate + adLPRate) / basePoints;
(bool success, ) = marketMakerAddr.call{value: marketMakerAmount}("");
require(success, "marketMaker Fail to refund ETH");
//invite
uint256 inviteETH = amount * inviteRate / basePoints;
(bool success2, ) = inviteRewardAddr.call{value: inviteETH}("");
require(success2, "invite Fail to refund ETH");
if(userDepositTotal == mintLimitETH){
endTime = block.timestamp;
}
emit Donate(msg.sender, amount, rangeIndex, userDepositTotal);
}
function refundETH() public nonReentrant{
require(block.timestamp > endTime && block.timestamp <= endTime + protectRefundDuration,'Protect Refund Duration');
address user = msg.sender;
require(userInfo[user].depositAmount > 0,'Without Deposit');
require(!userInfo[user].isRefund && !userInfo[user].isStartClaim,'Has Refunded');
uint256 refundAmount = userInfo[user].depositAmount * refundRate / basePoints;
userInfo[user].isRefund = true;
(bool success, ) = user.call{value: refundAmount}("");
require(success, "Unable to refund ETH");
IERC20(JUMPToken).safeTransfer(DEAD,userInfo[user].mintTotal);
emit RefundETH(user,userInfo[user].depositAmount,refundAmount);
}
//After start claim, then claim the offering token
function claim() public nonReentrant {
address user = msg.sender;
require(userInfo[user].depositAmount > 0,'Without Deposit');
require(block.timestamp > endTime,'Mint Not Finished');
require(!userInfo[user].isRefund,'Has Refunded');
require(userInfo[user].mintTotal > userInfo[user].mintReleased,'All Released');
//claim release token
uint canRelease = userInfo[user].mintTotal - userInfo[user].mintReleased;
userInfo[user].mintReleased += canRelease;
IERC20(JUMPToken).safeTransfer(user,canRelease);
userInfo[user].isStartClaim = true;
emit Claim(user, canRelease);
}
// get the amount of IDO token you will get
function getOfferingAmount(address user) public view returns(uint256 userOfferingTotalAmount) {
if(userInfo[user].isRefund){
return 0;
}
userOfferingTotalAmount = userInfo[user].mintTotal;
}
function getMintAndLQInfo() public view returns(uint256 mintJUMPLimit,uint256 addLqJUMP,uint256 mintedJUMP){
mintJUMPLimit = mintTokenLimit;
addLqJUMP = addLQTokenLimit;
mintedJUMP = mintedToken;
}
function getCanReleaseInfo(address user) public view returns (uint256 total, uint256 canRelease, uint256 released,uint256 locked) {
total = userInfo[user].mintTotal;
released = userInfo[user].mintReleased;
if(block.timestamp <= endTime){
return (total,0,0,total);
}
if(userInfo[user].isRefund){
return (0,0,0,0);
}
if (uint128(block.timestamp) >= endTime) {
canRelease = total - released;
}
locked = (total > canRelease + released) ? (total-canRelease-released) : 0;
}
function _addLiquidity(address tokenAddr) internal{
require(tokenPair[tokenAddr] == address(0),'LQ added');
uint256 currentEth = address(this).balance;
uint256 tokenAmount = IERC20(tokenAddr).balanceOf(address(this));
uint256 ethAmount = tokenDebitLevel[tokenAddr];
require(currentEth >= ethAmount,'Amount exceed current ETH');
uint256 beforeEth = address(this).balance;
IERC20(tokenAddr).safeApprove(address(swapRouter), tokenAmount);
(,,uint lq) = swapRouter.addLiquidityETH{value: ethAmount}(tokenAddr, tokenAmount,0,0,address(this), block.timestamp);
//update lq info;
address pair = factory.getPair(tokenAddr,address(WETH));
tokenPair[tokenAddr] = pair;
uint256 afterEth = address(this).balance;
tokenLqInfo[tokenAddr].lqAmountTotal = lq;
tokenLqInfo[tokenAddr].ethAddAmount = beforeEth - afterEth;
tokenLqInfo[tokenAddr].tokenAddAmount = tokenAmount;
tokenLqInfo[tokenAddr].addLqTime = block.timestamp;
emit AddLiquidity(tokenAddr,pair,tokenAmount,ethAmount);
}
function withdrawDebitsForLiqWar(address[] memory tokenAddrs) public nonReentrant onlyKeeper{
for(uint256 i = 0; i < tokenAddrs.length;i++){
address tokenAddr = tokenAddrs[i];
require(tokenLqInfo[tokenAddr].isLiqWar,'Not LiqWar token');
_removeLiquidity(tokenAddrs[i],true);
}
}
function withdrawDebitsForWithoutLiqWar(address[] memory tokenAddrs) public nonReentrant onlyKeeper{
for(uint256 i = 0; i < tokenAddrs.length;i++){
address tokenAddr = tokenAddrs[i];
require(!tokenLqInfo[tokenAddr].isLiqWar,'LiqWar token');
_removeLiquidity(tokenAddr,false);
}
}
//Liqwar handle: remove failed tokens and mark two reward tokens
function startLiqWarHandle(uint256 seqNo,address[] memory rmTokenAddrs,address[2] calldata rewardTokenAddrs) public nonReentrant onlyKeeper{
require(!seqLiqWarInfo[seqNo].rmFlag,'seqNo has used');
for(uint256 i = 0; i < rmTokenAddrs.length;i++){
address tokenAddr = rmTokenAddrs[i];
require(tokenLqInfo[tokenAddr].isStartLiqWar,'Not allow to Start LiqWar');
_removeLiqWarLiquidity(seqNo,tokenAddr);
seqLiqWarInfo[seqNo].rewardTokenAddrs = rewardTokenAddrs;
}
}
//remove the LiqWar Flag && set CTO Flag
function removeLiqWarFlag(address[] calldata tokenAddrs) public nonReentrant onlyKeeper {
for(uint256 i =0;i < tokenAddrs.length; i++){
_removeLiqWarFlag(tokenAddrs[i]);
}
}
function _removeLiqWarFlag(address tokenAddr) internal {
require(tokenLqInfo[tokenAddr].isStartLiqWar,'remove LiqWar Flag wrong');
require(tokenLqInfo[tokenAddr].isLiqWar,'Not LiqWar token');
tokenLqInfo[tokenAddr].isStartLiqWar = false;
tokenLqInfo[tokenAddr].isCTOFlag = true;
address pair = tokenPair[tokenAddr];
uint256 lqBalance = IERC20(pair).balanceOf(address(this));
if(lqBalance > 0){
IERC20(pair).safeTransfer(DEAD, lqBalance);
}
emit RemoveLiqWarFlag(msg.sender,tokenAddr);
}
function _removeLiquidity(address tokenAddr,bool flag) internal {
address pair = tokenPair[tokenAddr];
uint256 lqBalance = IERC20(pair).balanceOf(address(this));
//get reserve
{
require(!tokenLqInfo[tokenAddr].isStartLiqWar,'Start LiqWar');
uint256 lqTotal = IERC20(pair).totalSupply();
(uint112 reserve0, uint112 reserve1, ) = IUniswapV2Pair(pair).getReserves();
uint256 reserveEth = (address(WETH) > tokenAddr) ? reserve1 : reserve0;
uint256 ethAmount = tokenDebitLevel[tokenAddr];
uint256 amountOutETHMin = (ethAmount + ethAmount * rmSlippage / basePoints) * (basePoints - rmSlippage) / basePoints;
require(block.timestamp >= tokenLqInfo[tokenAddr].addLqTime + protectLQDuration,'RemoveLiquidity condition fail');
uint256 lqAmount = (ethAmount + ethAmount * rmSlippage / basePoints) * lqTotal / reserveEth;
if(lqAmount > lqBalance){
lqAmount = lqBalance;
amountOutETHMin = 0;
}
IERC20(pair).safeApprove(address(swapRouter), lqAmount);
(,uint amountETH) = swapRouter.removeLiquidityETH(tokenAddr,lqAmount,0,amountOutETHMin,address(this), block.timestamp);
tokenLqInfo[tokenAddr].rmLqAmount += lqAmount;
tokenLqInfo[tokenAddr].isStartLiqWar = true;
//token
IERC20(tokenAddr).safeTransfer(DEAD,IERC20(tokenAddr).balanceOf(address(this)));
if(!flag){
tokenLqInfo[tokenAddr].isCTOFlag = true;
lqBalance = IERC20(pair).balanceOf(address(this));
if(lqBalance > 0){
IERC20(pair).safeTransfer(DEAD, lqBalance);
}
}
emit WithdrawDebitForLiqWar(tokenAddr,pair,lqAmount,amountETH,flag);
}
}
function _removeLiqWarLiquidity(uint256 seqNo,address tokenAddr) internal {
address pair = tokenPair[tokenAddr];
uint256 lqBalance = IERC20(pair).balanceOf(address(this));
uint256 lqAmount = lqBalance * rmLiqWarRate / basePoints;
IERC20(pair).safeApprove(address(swapRouter), lqAmount);
(, uint amountETH) = swapRouter.removeLiquidityETH(tokenAddr,lqAmount,0,0,address(this), block.timestamp);
tokenLqInfo[tokenAddr].rmLqAmount += lqAmount;
//token
uint256 tokenBalance = IERC20(tokenAddr).balanceOf(address(this));
IERC20(tokenAddr).safeTransfer(DEAD,tokenBalance);
//RefundETH
seqLiqWarInfo[seqNo].rewardETH += amountETH;
seqLiqWarInfo[seqNo].rmFlag = true;
emit RemoveLiqWarLiquidity(seqNo,tokenAddr,pair,lqAmount,amountETH);
}
//reward two LiqWar token
function rewardLiqWarToken(uint256 seqNo) public onlyKeeper{
require(seqLiqWarInfo[seqNo].rmFlag,'Not remove LiqWar');
require(seqLiqWarInfo[seqNo].rewardSeq < buyTokenCnt,'Not remove LiqWar');
seqLiqWarInfo[seqNo].rewardSeq++;
//swap buy
uint256 buyAmount = seqLiqWarInfo[seqNo].rewardETH / (buyTokenCnt * 2);
for(uint256 i = 0;i < 2; i++){
address buyToken = seqLiqWarInfo[seqNo].rewardTokenAddrs[i];
address[] memory path = new address[](2);
path[0] = address(WETH);
path[1] = address(buyToken);
swapRouter.swapExactETHForTokensSupportingFeeOnTransferTokens{value:buyAmount}(
0,
path,
address(this),
block.timestamp
);
//transfer buyToken
uint256 buyTokenAmount = IERC20(buyToken).balanceOf(address(this));
IERC20(buyToken).safeTransfer(DEAD,buyTokenAmount);
}
}
function destroyLeftToken() public onlyKeeper {
require(block.timestamp > endTime,'Not allow to destroy LeftToken');
require(mintedToken < mintTokenLimit,'Minted less than Limit');
require(!isDestroyToken,'Already Destroy');
//left mint token transfer to dead
uint256 leftMintAmount = mintTokenLimit - mintedToken;
IERC20(JUMPToken).safeTransfer(DEAD,leftMintAmount);
isDestroyToken = true;
}
//Avoid unable to remove liquidity
//The ownership will transfer to timeLock contract or emergency admin role will be multi-sig
function setRmLqSlippage(uint256 _rmSlippage) public onlyOwner{
rmSlippage = _rmSlippage;
emit SetRmLqSlippage(msg.sender,_rmSlippage);
}
//Prevent the lending pool from being drained by malicious lending
//The ownership will transfer to timeLock contract or emergency admin role will be multi-sig
function setDebitLimit(uint256 _debitLimit) public onlyOwner{
debitLimit = _debitLimit;
emit SetDebitLimit(msg.sender,_debitLimit);
}
//Prevent the eth Blockchain network congestion from being drained by malicious lending
//The ownership will transfer to timeLock contract or emergency admin role will be multi-sig
function setEmergencyBonusPool(address _bonusPool) public onlyOwner{
bonusPool = IJUMPBonusPool(_bonusPool);
emit SetBonusPool(msg.sender,address(bonusPool));
}
function getCurrMintPhaseInfo() public view returns(uint256 currPhase,uint256 currRate,uint256 nextPhase,uint256 nextRate,uint256 currETHLimit,uint256 currDepositETH){
currPhase = rangeIndex;
currRate = mintRange[currPhase];
if(rangeIndex + 1 < 20){
nextPhase = currPhase +1;
}else{
nextPhase = 19;
}
nextRate = mintRange[nextPhase];
currETHLimit = buyRange[currPhase];
currDepositETH = userDepositTotal;
}
function getMintIndexAndAmount(uint256 lastDeposit, uint256 userAmount) public view returns(uint256 mintTokenAmount,uint256 index,uint256[] memory mintRangeIndex,uint256[] memory mintAmounts){
mintRangeIndex = new uint256[](20);
mintAmounts = new uint256[](20);
uint256 cnt;
for(uint256 i = rangeIndex;i < 20; i++){
if(lastDeposit <= buyRange[i] && lastDeposit + userAmount <= buyRange[i]){
mintRangeIndex[cnt] = i;
index = i;
mintAmounts[cnt] = userAmount;
cnt++;
mintTokenAmount = userAmount * mintRange[i] /1e18;
break;
}else if(lastDeposit <= buyRange[i] && lastDeposit + userAmount >= buyRange[i]){
//cross multi range;
mintRangeIndex[cnt] = i;
index = i;
mintAmounts[cnt] = buyRange[i] - lastDeposit;
mintTokenAmount += (buyRange[i] - lastDeposit) * mintRange[i] /1e18;
cnt++;
//cycle next range:
uint256 lastMintAmount = buyRange[i];
for(uint256 j = i+1; j < 20; j++){
if(lastDeposit + userAmount >= buyRange[j]){
//add j
mintRangeIndex[cnt] = j;
index = j;
mintAmounts[cnt] = buyRange[j] - lastMintAmount;
mintTokenAmount += (buyRange[j] - lastMintAmount) * mintRange[j] /1e18;
lastMintAmount = buyRange[j];
cnt++;
}else{
mintRangeIndex[cnt] = j;
index = j;
mintAmounts[cnt] = lastDeposit + userAmount - buyRange[j-1];
mintTokenAmount += (lastDeposit + userAmount - buyRange[j-1]) * mintRange[j] /1e18;
cnt++;
break;
}
}
break;
}
}
// Downsize the array to fit.
assembly {
mstore(mintRangeIndex, cnt)
mstore(mintAmounts, cnt)
}
}
function getDebitTime() public view returns(uint256,uint256){
return (startTime,endTime);
}
function getTokenCirculation() public view returns(uint256 circulation){
circulation = mintedToken + addLQTokenLimit;
}
function getLeftInfo() public view returns(uint256 tokenLQAmount, uint256 realMintTokenAmount,uint256 leftLQAmount, uint256 leftMintAmount,uint256 totalLeft){
tokenLQAmount = addLQTokenLimit;
leftLQAmount = 0;
//left mint token transfer to dead
realMintTokenAmount = mintedToken;
leftMintAmount = mintTokenLimit - mintedToken;
totalLeft = leftLQAmount + leftMintAmount;
}
function lockLP(address tokenAddr,uint256 lockAmount) public onlyOwner{
require(block.timestamp > endTime + protectRefundDuration,'Protect lockLP Duration');
address pair = tokenPair[tokenAddr];
uint256 lqBalance = IERC20(pair).balanceOf(address(this));
if(lqBalance > lockAmount){
IERC20(pair).safeTransfer(lockLPAddr, lockAmount);
}
}
function lockETH(uint256 lockAmount) public onlyOwner{
require(block.timestamp > endTime + protectRefundDuration,'Protect lockETH Duration');
(bool success, ) = lockLPAddr.call{value: lockAmount}("");
require(success, "lockLPAddr Unable to Withdraw ETH");
}
function getLQ(address tokenAddr) public view returns(uint256 ethAmount,uint256 reserveEth,uint256 amountOutETHMin,uint256 lqAmount,uint256 lqBalance){
address pair = tokenPair[tokenAddr];
uint256 lqTotal = IERC20(pair).totalSupply();
(uint112 reserve0, uint112 reserve1, ) = IUniswapV2Pair(pair).getReserves();
reserveEth = (address(WETH) > tokenAddr) ? reserve1 : reserve0;
ethAmount = tokenDebitLevel[tokenAddr];
amountOutETHMin = (ethAmount + ethAmount * rmSlippage / basePoints) * (basePoints - rmSlippage) / basePoints;
lqAmount = (ethAmount + ethAmount * rmSlippage / basePoints) * lqTotal / reserveEth;
lqBalance = IERC20(pair).balanceOf(address(this));
}
function getCurrBlockAndTime() public view returns(uint256 blockNum,uint256 blockTime){
blockNum = block.number;
blockTime = block.timestamp;
}
function setKeeper(address addr, bool active) public onlyOwner {
keeperMap[addr] = active;
emit SetKeeper(msg.sender,addr,active);
}
function isKeeper(address addr) public view returns (bool) {
return keeperMap[addr];
}
receive() external payable {}
}// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)
pragma solidity ^0.8.0;
interface IERC20 {
/**
* @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);
/**
* @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 `to`.
*
* Returns a boolean value indicating whether the operation succeeded.
*
* Emits a {Transfer} event.
*/
function transfer(address to, 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 `from` to `to` 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 from,
address to,
uint256 amount
) external returns (bool);
}
interface IERC20Metadata is IERC20 {
/**
* @dev Returns the name of the token.
*/
function name() external view returns (string memory);
/**
* @dev Returns the symbol of the token.
*/
function symbol() external view returns (string memory);
/**
* @dev Returns the decimals places of the token.
*/
function decimals() external view returns (uint8);
}
/**
* @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
* ====
*
* [IMPORTANT]
* ====
* You shouldn't rely on `isContract` to protect against flash loan attacks!
*
* Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
* like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
* constructor.
* ====
*/
function isContract(address account) internal view returns (bool) {
// This method relies on extcodesize/address.code.length, which returns 0
// for contracts in construction, since the code is only stored at the end
// of the constructor execution.
return account.code.length > 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://consensys.net/diligence/blog/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");
(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 functionCallWithValue(target, data, 0, "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");
(bool success, bytes memory returndata) = target.call{value: value}(data);
return verifyCallResultFromTarget(target, 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) {
(bool success, bytes memory returndata) = target.staticcall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
return functionDelegateCall(target, data, "Address: low-level delegate call failed");
}
/**
* @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
* but performing a delegate call.
*
* _Available since v3.4._
*/
function functionDelegateCall(
address target,
bytes memory data,
string memory errorMessage
) internal returns (bytes memory) {
(bool success, bytes memory returndata) = target.delegatecall(data);
return verifyCallResultFromTarget(target, success, returndata, errorMessage);
}
/**
* @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
* the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
*
* _Available since v4.8._
*/
function verifyCallResultFromTarget(
address target,
bool success,
bytes memory returndata,
string memory errorMessage
) internal view returns (bytes memory) {
if (success) {
if (returndata.length == 0) {
// only check isContract if the call was successful and the return data is empty
// otherwise we already know that it was a contract
require(isContract(target), "Address: call to non-contract");
}
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
/**
* @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
* revert reason or using the provided one.
*
* _Available since v4.3._
*/
function verifyCallResult(
bool success,
bytes memory returndata,
string memory errorMessage
) internal pure returns (bytes memory) {
if (success) {
return returndata;
} else {
_revert(returndata, errorMessage);
}
}
function _revert(bytes memory returndata, string memory errorMessage) private pure {
// 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
/// @solidity memory-safe-assembly
assembly {
let returndata_size := mload(returndata)
revert(add(32, returndata), returndata_size)
}
} else {
revert(errorMessage);
}
}
}
library SafeERC20 {
using Address for address;
function safeTransfer(
IERC20 token,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
}
function safeTransferFrom(
IERC20 token,
address from,
address to,
uint256 value
) internal {
_callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
}
/**
* @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'
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) + value;
_callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
}
function safeDecreaseAllowance(
IERC20 token,
address spender,
uint256 value
) internal {
unchecked {
uint256 oldAllowance = token.allowance(address(this), spender);
require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
uint256 newAllowance = oldAllowance - value;
_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
require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
}
}
}{
"optimizer": {
"enabled": true,
"runs": 200
},
"evmVersion": "paris",
"outputSelection": {
"*": {
"*": [
"evm.bytecode",
"evm.deployedBytecode",
"devdoc",
"userdoc",
"metadata",
"abi"
]
}
},
"libraries": {}
}Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_v2Factory","type":"address"},{"internalType":"address","name":"_v2Router","type":"address"},{"internalType":"address","name":"_bonusPool","type":"address"},{"internalType":"address","name":"_rewardAddr","type":"address"},{"internalType":"address","name":"_JUMPToken","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddr","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"tokenAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"AddLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"address","name":"newToken","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"debitLevel","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"initBuyAmount","type":"uint256"}],"name":"AddNewDebit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Claim","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"range","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"userDeposit","type":"uint256"}],"name":"Donate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"depositAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"refundAmount","type":"uint256"}],"name":"RefundETH","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"tokenAddr","type":"address"}],"name":"RemoveLiqWarFlag","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"seqNo","type":"uint256"},{"indexed":false,"internalType":"address","name":"tokenAddr","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"lqAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"}],"name":"RemoveLiqWarLiquidity","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"bonusPool","type":"address"}],"name":"SetBonusPool","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"debitLimit","type":"uint256"}],"name":"SetDebitLimit","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"address","name":"addr","type":"address"},{"indexed":false,"internalType":"bool","name":"active","type":"bool"}],"name":"SetKeeper","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"rmSlippage","type":"uint256"}],"name":"SetRmLqSlippage","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddr","type":"address"},{"indexed":false,"internalType":"address","name":"pair","type":"address"},{"indexed":false,"internalType":"uint256","name":"lqAmount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"ethAmount","type":"uint256"},{"indexed":false,"internalType":"bool","name":"isLiqWar","type":"bool"}],"name":"WithdrawDebitForLiqWar","type":"event"},{"inputs":[],"name":"DEAD","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"JUMPToken","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"adLPRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"addLQTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newToken","type":"address"},{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"debitLevel","type":"uint256"},{"internalType":"bool","name":"isLiqWar","type":"bool"}],"name":"addNewDebit","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"basePoints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusPool","outputs":[{"internalType":"contract IJUMPBonusPool","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"bonusRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"buyRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"buyTokenCnt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"debitLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"debitTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"destroyLeftToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"donateNum","type":"uint256"}],"name":"donate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"endTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"contract IUniswapV2Factory","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getCanReleaseInfo","outputs":[{"internalType":"uint256","name":"total","type":"uint256"},{"internalType":"uint256","name":"canRelease","type":"uint256"},{"internalType":"uint256","name":"released","type":"uint256"},{"internalType":"uint256","name":"locked","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrBlockAndTime","outputs":[{"internalType":"uint256","name":"blockNum","type":"uint256"},{"internalType":"uint256","name":"blockTime","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getCurrMintPhaseInfo","outputs":[{"internalType":"uint256","name":"currPhase","type":"uint256"},{"internalType":"uint256","name":"currRate","type":"uint256"},{"internalType":"uint256","name":"nextPhase","type":"uint256"},{"internalType":"uint256","name":"nextRate","type":"uint256"},{"internalType":"uint256","name":"currETHLimit","type":"uint256"},{"internalType":"uint256","name":"currDepositETH","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDebitTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"}],"name":"getLQ","outputs":[{"internalType":"uint256","name":"ethAmount","type":"uint256"},{"internalType":"uint256","name":"reserveEth","type":"uint256"},{"internalType":"uint256","name":"amountOutETHMin","type":"uint256"},{"internalType":"uint256","name":"lqAmount","type":"uint256"},{"internalType":"uint256","name":"lqBalance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLeftInfo","outputs":[{"internalType":"uint256","name":"tokenLQAmount","type":"uint256"},{"internalType":"uint256","name":"realMintTokenAmount","type":"uint256"},{"internalType":"uint256","name":"leftLQAmount","type":"uint256"},{"internalType":"uint256","name":"leftMintAmount","type":"uint256"},{"internalType":"uint256","name":"totalLeft","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMintAndLQInfo","outputs":[{"internalType":"uint256","name":"mintJUMPLimit","type":"uint256"},{"internalType":"uint256","name":"addLqJUMP","type":"uint256"},{"internalType":"uint256","name":"mintedJUMP","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lastDeposit","type":"uint256"},{"internalType":"uint256","name":"userAmount","type":"uint256"}],"name":"getMintIndexAndAmount","outputs":[{"internalType":"uint256","name":"mintTokenAmount","type":"uint256"},{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256[]","name":"mintRangeIndex","type":"uint256[]"},{"internalType":"uint256[]","name":"mintAmounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getOfferingAmount","outputs":[{"internalType":"uint256","name":"userOfferingTotalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenCirculation","outputs":[{"internalType":"uint256","name":"circulation","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inviteRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"inviteRewardAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isDestroyToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isKeeper","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"keeperMap","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"lockAmount","type":"uint256"}],"name":"lockETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddr","type":"address"},{"internalType":"uint256","name":"lockAmount","type":"uint256"}],"name":"lockLP","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockLPAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketMakerAddr","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"marketMakerRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minPerDeposit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLimitETH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintRange","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintTokenLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protectLQDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"protectRefundDuration","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rangeIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"refundETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"refundRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddrs","type":"address[]"}],"name":"removeLiqWarFlag","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"seqNo","type":"uint256"}],"name":"rewardLiqWarToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rmLiqWarRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rmSlippage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"seqLiqWarInfo","outputs":[{"internalType":"uint256","name":"rewardETH","type":"uint256"},{"internalType":"uint256","name":"rewardSeq","type":"uint256"},{"internalType":"bool","name":"rmFlag","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_debitLimit","type":"uint256"}],"name":"setDebitLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_bonusPool","type":"address"}],"name":"setEmergencyBonusPool","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"bool","name":"active","type":"bool"}],"name":"setKeeper","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rmSlippage","type":"uint256"}],"name":"setRmLqSlippage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"seqNo","type":"uint256"},{"internalType":"address[]","name":"rmTokenAddrs","type":"address[]"},{"internalType":"address[2]","name":"rewardTokenAddrs","type":"address[2]"}],"name":"startLiqWarHandle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"startTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"swapRouter","outputs":[{"internalType":"contract IUniswapV2Router","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenDebitLevel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenLqInfo","outputs":[{"internalType":"uint256","name":"ethAddAmount","type":"uint256"},{"internalType":"uint256","name":"tokenAddAmount","type":"uint256"},{"internalType":"uint256","name":"lqAmountTotal","type":"uint256"},{"internalType":"uint256","name":"addLqTime","type":"uint256"},{"internalType":"uint256","name":"rmLqAmount","type":"uint256"},{"internalType":"bool","name":"isLiqWar","type":"bool"},{"internalType":"bool","name":"isStartLiqWar","type":"bool"},{"internalType":"bool","name":"isCTOFlag","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenPair","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"tokenUser","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"userDepositTotal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userInfo","outputs":[{"internalType":"uint256","name":"depositAmount","type":"uint256"},{"internalType":"uint256","name":"mintTotal","type":"uint256"},{"internalType":"uint256","name":"mintReleased","type":"uint256"},{"internalType":"bool","name":"isRefund","type":"bool"},{"internalType":"bool","name":"isStartClaim","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddrs","type":"address[]"}],"name":"withdrawDebitsForLiqWar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"tokenAddrs","type":"address[]"}],"name":"withdrawDebitsForWithoutLiqWar","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]Contract Creation Code
608060405260076003818155601960045560058055600f60065590556201518060085562093a80600955604580546001600160a01b0319908116735c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f1790915560468054909116737a250d5630b4cf539739df2c5dacb4c659f2488d1790553480156200007e57600080fd5b506040516200520e3803806200520e833981016040819052620000a1916200069a565b6001600081815581546001600160a01b031916339081179092556040518291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350604680546001600160a01b038087166001600160a01b03199283168117909355604580548983169084161790556047805491871691909216179055604080516315ab88c960e31b8152905163ad5c4648916004808201926020929091908290030181865afa1580156200015e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200018491906200070a565b604480546001600160a01b03199081166001600160a01b03938416179091556b0295be96e640669720000000600b556a6342fd08f00f6378000000600c5569022513f309d8f3060000600e5567016345785d8a0000600a556016805473fe49c3d7b7ef988233fadded69f7b624a392e01790831617905560178054909116848316179055604754604080516378e9792560e01b8152905191909216916378e979259160048281019260209291908290030181865afa1580156200024b573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906200027191906200072f565b604855604754604080516326beb82160e01b815290516001600160a01b03909216916326beb821916004808201926020929091908290030181865afa158015620002bf573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620002e591906200072f565b604955600280546001600160a01b0319166001600160a01b03831617905560408051610280810182526818efc84ad0c7b00000815268321f6711425e2c00006020820152684b8edc5354c374000091810191909152686540ee9bf8b29c00006060820152687f343aa5b5ce1a00006080820152689968c0708c15ee000060a082015268b3e146876c452c000060c082015268ce9dccea565bd4000060e082015268e99e53994a59e60000610100820152690104e43dd9c09cec00006101208201526901206f8babb924e6000061014082015269013c43039a24ace800006101608201526901585bdf1a1279de0000610180820152690174bce4b67346dc00006101a08201526901916777b4bf716c00006101c08201526901ae5a34cf7e9c0400006101e08201526901cb97e291a181b800006102008201526901e92080fb2822880000610220820152690206f4100c127e74000061024082015269022513f309d8f30600006102608201526200046090601c90601462000618565b506040805161028081018252691269ec283f21e84cc000815269123b3fff4be6aa500000602082015269120d0a22c7736da2a000918101919091526911df4966e1862dac400060608201526911b1fca2b3a6068bc000608082015269118522b04a3b8389e00060a0820152691158ba6ca4909f19400060c082015269112cc2b79987d77e800060e08201526911013a73e0b47d42e0006101008201526910d62087002a164f00006101208201526910ab73d95594ac5d80006101408201526910813355e8bf44bde0006101608201526910575dea990d6891a00061018082015269102df287f0019c8f20006101a0820152691004f0213c864c5980006101c0820152690fdc55ac4a2b56eba0006101e0820152690fb42221bc191f126000610200820152690f8c547c9fecde0d2000610220820152690f64ebbac8abb4080000610240820152690f3de6dc6ab7492f0000610260820152620005c790603090601462000618565b5050336000908152601260205260409020805460ff191660011790555050604a805474fe49c3d7b7ef988233fadded69f7b624a392e01700610100600160a81b031990911617905550620007499050565b826014810192821562000654579160200282015b828111156200065457825182906001600160501b03169055916020019190600101906200062c565b506200066292915062000666565b5090565b5b8082111562000662576000815560010162000667565b80516001600160a01b03811681146200069557600080fd5b919050565b600080600080600060a08688031215620006b357600080fd5b620006be866200067d565b9450620006ce602087016200067d565b9350620006de604087016200067d565b9250620006ee606087016200067d565b9150620006fe608087016200067d565b90509295509295909350565b6000602082840312156200071d57600080fd5b62000728826200067d565b9392505050565b6000602082840312156200074257600080fd5b5051919050565b614ab580620007596000396000f3fe6080604052600436106104125760003560e01c8063831cb8e81161021e578063c30b7ecb11610123578063e7740454116100ab578063f14faf6f1161007a578063f14faf6f14610d63578063f26bd8d914610d76578063f2fde38b14610d96578063f670ed4114610db6578063f7ed40a714610dcc57600080fd5b8063e774045414610c7f578063e805a8d014610d26578063ec6fdad014610d3b578063ed6a469f14610d5057600080fd5b8063c4b0ee39116100f2578063c4b0ee3914610be8578063c978a7bc14610bfd578063ce1ff67e14610c13578063d1b9e85314610c49578063d3c6d2b514610c6957600080fd5b8063c30b7ecb14610b72578063c31c9c0714610b88578063c320339514610ba8578063c45a015514610bc857600080fd5b8063a035b237116101a6578063ae0526d311610175578063ae0526d314610ad0578063b7dfa36c14610af0578063ba6f991c14610b06578063bc184cb914610b46578063bf040de114610b5c57600080fd5b8063a035b23714610a40578063a2c7608114610a70578063aa7f217014610a90578063ad5c464814610ab057600080fd5b80638eec6f7b116101ed5780638eec6f7b14610979578063923881661461099957806394afb0d5146109af578063965f8c9914610a0b5780639f3f54af14610a2b57600080fd5b8063831cb8e8146109105780638542925a1461092557806387e97bc61461093b5780638da5cb5b1461095b57600080fd5b80634c18ccfc116103245780636475c305116102ac578063715018a61161027b578063715018a61461088257806378e97925146108975780637bfb06b4146108ad5780637e3aac04146108c35780638283aee5146108f057600080fd5b80636475c3051461081357806365bbd34614610833578063685a043a146108485780636ba42aaa1461086257600080fd5b80635af123f4116102f35780635af123f4146107765780635b1e860c1461078c5780635b335e9c146107a2578063613fc6e7146107d357806362fc3ea6146107f357600080fd5b80634c18ccfc146106e65780634e71d92d146107265780634fa5f6511461073b5780635121a2e51461076057600080fd5b80631959a002116103a757806327dcc0601161037657806327dcc060146106475780632ee9a24d1461065d5780633197cbb614610673578063365c7a29146106895780634b0c86cf146106c657600080fd5b80631959a002146105575780631cc6391e146105d15780632295c42d146106075780632693ee801461062757600080fd5b80630dce4d45116103e35780630dce4d45146104b75780630ea479b4146104e05780630f018e271461050057806312210e8a1461054257600080fd5b806283b2f51461041e578062d4e77f1461044757806303fd2a4514610469578063058753951461049757600080fd5b3661041957005b600080fd5b34801561042a57600080fd5b50610434600e5481565b6040519081526020015b60405180910390f35b34801561045357600080fd5b5061046761046236600461446b565b610de0565b005b34801561047557600080fd5b5061047f61dead81565b6040516001600160a01b03909116815260200161043e565b3480156104a357600080fd5b5060175461047f906001600160a01b031681565b3480156104c357600080fd5b506048546049545b6040805192835260208301919091520161043e565b3480156104ec57600080fd5b5060165461047f906001600160a01b031681565b34801561050c57600080fd5b50610515610f7d565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161043e565b34801561054e57600080fd5b50610467611006565b34801561056357600080fd5b506105a56105723660046144ca565b60136020526000908152604090208054600182015460028301546003909301549192909160ff8082169161010090041685565b60408051958652602086019490945292840191909152151560608301521515608082015260a00161043e565b3480156105dd57600080fd5b5061047f6105ec3660046144ca565b6014602052600090815260409020546001600160a01b031681565b34801561061357600080fd5b506104676106223660046144ee565b6112e5565b34801561063357600080fd5b5060475461047f906001600160a01b031681565b34801561065357600080fd5b5061043460095481565b34801561066957600080fd5b50610434601b5481565b34801561067f57600080fd5b5061043460495481565b34801561069557600080fd5b5061069e611418565b604080519586526020860194909452928401919091526060830152608082015260a00161043e565b3480156106d257600080fd5b506104676106e136600461451a565b611448565b3480156106f257600080fd5b506107166107013660046144ca565b60126020526000908152604090205460ff1681565b604051901515815260200161043e565b34801561073257600080fd5b50610467611562565b34801561074757600080fd5b50604a5461047f9061010090046001600160a01b031681565b34801561076c57600080fd5b50610434600b5481565b34801561078257600080fd5b5061043460035481565b34801561079857600080fd5b5061043460105481565b3480156107ae57600080fd5b50600b54600c54600d546040805193845260208401929092529082015260600161043e565b3480156107df57600080fd5b506104676107ee36600461454f565b6117bb565b3480156107ff57600080fd5b5061046761080e36600461454f565b611aa2565b34801561081f57600080fd5b5061069e61082e3660046144ca565b611b0e565b34801561083f57600080fd5b50610467611d47565b34801561085457600080fd5b50604a546107169060ff1681565b34801561086e57600080fd5b5061071661087d3660046144ca565b611e8c565b34801561088e57600080fd5b50610467611eaa565b3480156108a357600080fd5b5061043460485481565b3480156108b957600080fd5b5061043460055481565b3480156108cf57600080fd5b506104346108de3660046144ca565b60186020526000908152604090205481565b3480156108fc57600080fd5b5060025461047f906001600160a01b031681565b34801561091c57600080fd5b50610434604b81565b34801561093157600080fd5b50610434600d5481565b34801561094757600080fd5b506104346109563660046144ca565b611f1e565b34801561096757600080fd5b506001546001600160a01b031661047f565b34801561098557600080fd5b5061046761099436600461454f565b611f69565b3480156109a557600080fd5b50610434600a5481565b3480156109bb57600080fd5b506109ee6109ca36600461454f565b601a6020526000908152604090208054600182015460049092015490919060ff1683565b60408051938452602084019290925215159082015260600161043e565b348015610a1757600080fd5b50610467610a2636600461454f565b6120a7565b348015610a3757600080fd5b50610434600a81565b348015610a4c57600080fd5b50610a60610a5b366004614568565b61210c565b60405161043e94939291906145c5565b348015610a7c57600080fd5b50610434610a8b36600461454f565b6125b6565b348015610a9c57600080fd5b50610467610aab3660046144ca565b6125cd565b348015610abc57600080fd5b5060445461047f906001600160a01b031681565b348015610adc57600080fd5b50610434610aeb36600461454f565b61264c565b348015610afc57600080fd5b50610434600f5481565b348015610b1257600080fd5b50610b26610b213660046144ca565b61265c565b60408051948552602085019390935291830152606082015260800161043e565b348015610b5257600080fd5b50610434600c5481565b348015610b6857600080fd5b5061043460045481565b348015610b7e57600080fd5b5061043460085481565b348015610b9457600080fd5b5060465461047f906001600160a01b031681565b348015610bb457600080fd5b50610467610bc33660046145f6565b61272e565b348015610bd457600080fd5b5060455461047f906001600160a01b031681565b348015610bf457600080fd5b50610434606481565b348015610c0957600080fd5b5061043460075481565b348015610c1f57600080fd5b5061047f610c2e3660046144ca565b6019602052600090815260409020546001600160a01b031681565b348015610c5557600080fd5b50610467610c64366004614679565b6127d0565b348015610c7557600080fd5b5061043460065481565b348015610c8b57600080fd5b50610ce5610c9a3660046144ca565b601560205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff808216916101008104821691620100009091041688565b6040805198895260208901979097529587019490945260608601929092526080850152151560a0840152151560c0830152151560e08201526101000161043e565b348015610d3257600080fd5b5061043461285f565b348015610d4757600080fd5b50610434601881565b61047f610d5e3660046146b2565b612876565b610467610d7136600461454f565b612b2d565b348015610d8257600080fd5b50610467610d9136600461451a565b613077565b348015610da257600080fd5b50610467610db13660046144ca565b61316c565b348015610dc257600080fd5b5061043460115481565b348015610dd857600080fd5b5043426104cb565b600260005403610e0b5760405162461bcd60e51b8152600401610e0290614705565b60405180910390fd5b6002600055610e1933611e8c565b610e355760405162461bcd60e51b8152600401610e029061473c565b6000838152601a602052604090206004015460ff1615610e885760405162461bcd60e51b815260206004820152600e60248201526d1cd95c539bc81a185cc81d5cd95960921b6044820152606401610e02565b60005b8251811015610f72576000838281518110610ea857610ea8614760565b6020026020010151905060156000826001600160a01b03166001600160a01b0316815260200190815260200160002060050160019054906101000a900460ff16610f345760405162461bcd60e51b815260206004820152601960248201527f4e6f7420616c6c6f7720746f205374617274204c6971576172000000000000006044820152606401610e02565b610f3e85826131a2565b6000858152601a60205260409020610f5d90600290810190859061432e565b50508080610f6a9061478c565b915050610e8b565b505060016000555050565b601b5460008080808060308660148110610f9957610f99614760565b015494506014601b546001610fae91906147a5565b1015610fc657610fbf8660016147a5565b9350610fcb565b601393505b60308460148110610fde57610fde614760565b01549250601c8660148110610ff557610ff5614760565b015491506011549050909192939495565b6002600054036110285760405162461bcd60e51b8152600401610e0290614705565b60026000556049544211801561104d575060095460495461104991906147a5565b4211155b6110995760405162461bcd60e51b815260206004820152601760248201527f50726f7465637420526566756e64204475726174696f6e0000000000000000006044820152606401610e02565b336000818152601360205260409020546110e75760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a1bdd5d0811195c1bdcda5d608a1b6044820152606401610e02565b6001600160a01b03811660009081526013602052604090206003015460ff1615801561113457506001600160a01b038116600090815260136020526040902060030154610100900460ff16155b61116f5760405162461bcd60e51b815260206004820152600c60248201526b12185cc81499599d5b99195960a21b6044820152606401610e02565b6001600160a01b03811660009081526013602052604081205460649061119790604b906147be565b6111a191906147eb565b6001600160a01b038316600081815260136020526040808220600301805460ff19166001179055519293509183908381818185875af1925050503d8060008114611207576040519150601f19603f3d011682016040523d82523d6000602084013e61120c565b606091505b50509050806112545760405162461bcd60e51b81526020600482015260146024820152730aadcc2c4d8ca40e8de40e4cacceadcc8408aa8960631b6044820152606401610e02565b6001600160a01b0380841660009081526013602052604090206001015460025461128392169061dead9061342e565b6001600160a01b0383166000818152601360209081526040918290205482519384529083015281018390527f0a51d2fc760fc947eee0ddb113878c9774c389343c0b08aa0afe1caa731e7a179060600160405180910390a15050600160005550565b6001546001600160a01b0316331461130f5760405162461bcd60e51b8152600401610e02906147ff565b60095460495461131f91906147a5565b421161136d5760405162461bcd60e51b815260206004820152601760248201527f50726f74656374206c6f636b4c50204475726174696f6e0000000000000000006044820152606401610e02565b6001600160a01b038281166000908152601460205260408082205490516370a0823160e01b815230600482015292169182906370a0823190602401602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190614834565b90508281111561141257604a54611412906001600160a01b03848116916101009004168561342e565b50505050565b600c54600d54600b546000908190819061143390859061484d565b915061143f82846147a5565b90509091929394565b60026000540361146a5760405162461bcd60e51b8152600401610e0290614705565b600260005561147833611e8c565b6114945760405162461bcd60e51b8152600401610e029061473c565b60005b81518110156115595760008282815181106114b4576114b4614760565b6020908102919091018101516001600160a01b0381166000908152601590925260409091206005015490915060ff166115225760405162461bcd60e51b815260206004820152601060248201526f2737ba102634b8abb0b9103a37b5b2b760811b6044820152606401610e02565b61154683838151811061153757611537614760565b60200260200101516001613491565b50806115518161478c565b915050611497565b50506001600055565b6002600054036115845760405162461bcd60e51b8152600401610e0290614705565b600260009081553380825260136020526040909120546115d85760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a1bdd5d0811195c1bdcda5d608a1b6044820152606401610e02565b604954421161161d5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d08139bdd08119a5b9a5cda1959607a1b6044820152606401610e02565b6001600160a01b03811660009081526013602052604090206003015460ff16156116785760405162461bcd60e51b815260206004820152600c60248201526b12185cc81499599d5b99195960a21b6044820152606401610e02565b6001600160a01b03811660009081526013602052604090206002810154600190910154116116d75760405162461bcd60e51b815260206004820152600c60248201526b105b1b0814995b19585cd95960a21b6044820152606401610e02565b6001600160a01b03811660009081526013602052604081206002810154600190910154611704919061484d565b6001600160a01b0383166000908152601360205260408120600201805492935083929091906117349084906147a5565b9091555050600254611750906001600160a01b0316838361342e565b6001600160a01b03821660008181526013602052604090819020600301805461ff001916610100179055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4906117aa9084815260200190565b60405180910390a250506001600055565b6117c433611e8c565b6117e05760405162461bcd60e51b8152600401610e029061473c565b6000818152601a602052604090206004015460ff166118355760405162461bcd60e51b81526020600482015260116024820152702737ba103932b6b7bb32902634b8abb0b960791b6044820152606401610e02565b6000818152601a602052604090206001015460181161188a5760405162461bcd60e51b81526020600482015260116024820152702737ba103932b6b7bb32902634b8abb0b960791b6044820152606401610e02565b6000818152601a602052604081206001018054916118a78361478c565b90915550600090506118bb601860026147be565b6000838152601a60205260409020546118d491906147eb565b905060005b6002811015611a9d576000838152601a602052604081206002908101908390811061190657611906614760565b01546040805160028082526060820183526001600160a01b0390931693506000929091602083019080368337505060445482519293506001600160a01b03169183915060009061195857611958614760565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061198c5761198c614760565b6001600160a01b03928316602091820292909201015260465460405163b6f9de9560e01b815291169063b6f9de959086906119d290600090869030904290600401614860565b6000604051808303818588803b1580156119eb57600080fd5b505af11580156119ff573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093506001600160a01b03861692506370a082319150602401602060405180830381865afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f9190614834565b9050611a876001600160a01b03841661dead8361342e565b5050508080611a959061478c565b9150506118d9565b505050565b6001546001600160a01b03163314611acc5760405162461bcd60e51b8152600401610e02906147ff565b600581905560408051338152602081018390527f81eb433ecff7578fea633a4eed84b25e60b72223d14b5296e94823b9e5571f5f91015b60405180910390a150565b6001600160a01b0380821660009081526014602090815260408083205481516318160ddd60e01b815291519394859485948594859490931692849284926318160ddd92600480820193918290030181865afa158015611b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b959190614834565b9050600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc91906148e1565b5060445491935091506001600160a01b03808c16911611611c1d5781611c1f565b805b6001600160a01b038b16600090815260186020526040902054600554909a506001600160701b03919091169850606490611c59908261484d565b60646005548c611c6991906147be565b611c7391906147eb565b611c7d908c6147a5565b611c8791906147be565b611c9191906147eb565b9650878360646005548c611ca591906147be565b611caf91906147eb565b611cb9908c6147a5565b611cc391906147be565b611ccd91906147eb565b6040516370a0823160e01b81523060048201529096506001600160a01b038516906370a0823190602401602060405180830381865afa158015611d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d389190614834565b94505050505091939590929450565b611d5033611e8c565b611d6c5760405162461bcd60e51b8152600401610e029061473c565b6049544211611dbd5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420616c6c6f7720746f2064657374726f79204c656674546f6b656e00006044820152606401610e02565b600b54600d5410611e095760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1959081b195cdcc81d1a185b88131a5b5a5d60521b6044820152606401610e02565b604a5460ff1615611e4e5760405162461bcd60e51b815260206004820152600f60248201526e416c72656164792044657374726f7960881b6044820152606401610e02565b6000600d54600b54611e60919061484d565b600254909150611e7c906001600160a01b031661dead8361342e565b50604a805460ff19166001179055565b6001600160a01b031660009081526012602052604090205460ff1690565b6001546001600160a01b03163314611ed45760405162461bcd60e51b8152600401610e02906147ff565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b6001600160a01b03811660009081526013602052604081206003015460ff1615611f4a57506000919050565b506001600160a01b031660009081526013602052604090206001015490565b6001546001600160a01b03163314611f935760405162461bcd60e51b8152600401610e02906147ff565b600954604954611fa391906147a5565b4211611ff15760405162461bcd60e51b815260206004820152601860248201527f50726f74656374206c6f636b455448204475726174696f6e00000000000000006044820152606401610e02565b604a5460405160009161010090046001600160a01b03169083908381818185875af1925050503d8060008114612043576040519150601f19603f3d011682016040523d82523d6000602084013e612048565b606091505b50509050806120a35760405162461bcd60e51b815260206004820152602160248201527f6c6f636b4c504164647220556e61626c6520746f2057697468647261772045546044820152600960fb1b6064820152608401610e02565b5050565b6001546001600160a01b031633146120d15760405162461bcd60e51b8152600401610e02906147ff565b601081905560408051338152602081018390527fa70cec5ab93bb60a6face5d07b91f1ffc5bdfd14803d27b1f5f5f0e9d36241109101611b03565b6040805160148082526102a082019092526000918291606091829190602082016102808036833750506040805160148082526102a082019092529294509050602082016102808036833701905050601b549091506000905b60148110156125a757601c816014811061218057612180614760565b015488111580156121ae5750601c816014811061219f5761219f614760565b01546121ab888a6147a5565b11155b1561223957808483815181106121c6576121c6614760565b602002602001018181525050809450868383815181106121e8576121e8614760565b6020908102919091010152816121fd8161478c565b925050670de0b6b3a76400006030826014811061221c5761221c614760565b015461222890896147be565b61223291906147eb565b95506125a7565b601c816014811061224c5761224c614760565b0154881115801561227a5750601c816014811061226b5761226b614760565b0154612277888a6147a5565b10155b15612595578084838151811061229257612292614760565b60200260200101818152505080945087601c82601481106122b5576122b5614760565b01546122c1919061484d565b8383815181106122d3576122d3614760565b602002602001018181525050670de0b6b3a7640000603082601481106122fb576122fb614760565b015489601c846014811061231157612311614760565b015461231d919061484d565b61232791906147be565b61233191906147eb565b61233b90876147a5565b9550816123478161478c565b9250506000601c826014811061235f5761235f614760565b0154905060006123708360016147a5565b90505b601481101561258e57601c816014811061238f5761238f614760565b015461239b8a8c6147a5565b1061248757808685815181106123b3576123b3614760565b60200260200101818152505080965081601c82601481106123d6576123d6614760565b01546123e2919061484d565b8585815181106123f4576123f4614760565b602002602001018181525050670de0b6b3a76400006030826014811061241c5761241c614760565b015483601c846014811061243257612432614760565b015461243e919061484d565b61244891906147be565b61245291906147eb565b61245c90896147a5565b9750601c816014811061247157612471614760565b015491508361247f8161478c565b94505061257c565b8086858151811061249a5761249a614760565b6020908102919091010152955085601c6124b560018361484d565b601481106124c5576124c5614760565b01546124d18a8c6147a5565b6124db919061484d565b8585815181106124ed576124ed614760565b602002602001018181525050670de0b6b3a76400006030826014811061251557612515614760565b0154601c61252460018561484d565b6014811061253457612534614760565b01546125408c8e6147a5565b61254a919061484d565b61255491906147be565b61255e91906147eb565b61256890896147a5565b9750836125748161478c565b94505061258e565b806125868161478c565b915050612373565b50506125a7565b8061259f8161478c565b915050612164565b50808352815292959194509250565b603081601481106125c657600080fd5b0154905081565b6001546001600160a01b031633146125f75760405162461bcd60e51b8152600401610e02906147ff565b604780546001600160a01b0319166001600160a01b0383169081179091556040805133815260208101929092527f6c8aa1451bb27118767004fb0f2f6ac5866736a3dc12d751a239043469e4cf319101611b03565b601c81601481106125c657600080fd5b6001600160a01b038116600090815260136020526040812060018101546002909101546049549192918290421161269b57506000915081905082612727565b6001600160a01b03851660009081526013602052604090206003015460ff16156126d057506000925082915081905080612727565b604954426fffffffffffffffffffffffffffffffff16106126f8576126f5828561484d565b92505b61270282846147a5565b841161270f576000612724565b8161271a848661484d565b612724919061484d565b90505b9193509193565b6002600054036127505760405162461bcd60e51b8152600401610e0290614705565b600260005561275e33611e8c565b61277a5760405162461bcd60e51b8152600401610e029061473c565b60005b818110156127c6576127b483838381811061279a5761279a614760565b90506020020160208101906127af91906144ca565b613a17565b806127be8161478c565b91505061277d565b5050600160005550565b6001546001600160a01b031633146127fa5760405162461bcd60e51b8152600401610e02906147ff565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915582519384529083015233917f8ff482920e9c46f3eaae463cb945cee6bf6ede646ff885e22885efa7c61cd1d3910160405180910390a25050565b6000600c54600d5461287191906147a5565b905090565b600061288133611e8c565b61289d5760405162461bcd60e51b8152600401610e029061473c565b824710156128ed5760405162461bcd60e51b815260206004820152601d60248201527f42616c616e6365206c657373207468616e206465626974206c6576656c0000006044820152606401610e02565b60105483600f546128fe91906147a5565b1115801561290e57506000601054115b61294e5760405162461bcd60e51b8152602060048201526011602482015270115e18d95959081919589a5d131a5b5a5d607a1b6044820152606401610e02565b6001600160a01b0385811660009081526018602090815260408083208790556019825280832080546001600160a01b031916948916949094179093556015905220600501805460ff19168315151790556129a785613be1565b60408051600280825260608201835234926000929190602083019080368337505060445482519293506001600160a01b0316918391506000906129ec576129ec614760565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110612a2057612a20614760565b6001600160a01b03928316602091820292909201015260465460405163b6f9de9560e01b815291169063b6f9de95908490612a669060009086908c904290600401614860565b6000604051808303818588803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b505050505084600f6000828254612aaa91906147a5565b90915550506001600160a01b038781166000818152601460209081526040918290205482518b86168152918201939093529190921691810182905260608101879052608081018490529093507ff1a35f5b0475d58d3efa229f8d7a18c81aa5b916585ab625274bacb363de7d249060a00160405180910390a15050949350505050565b600260005403612b4f5760405162461bcd60e51b8152600401610e0290614705565b60026000556049543490421115612b965760405162461bcd60e51b815260206004820152600b60248201526a11195c1bdcda5d08195b9960aa1b6044820152606401610e02565b600a54811015612bdd5760405162461bcd60e51b815260206004820152601260248201527113195cdcc81b5a5b94195c91195c1bdcda5d60721b6044820152606401610e02565b80600a5483612bec91906147be565b14612c395760405162461bcd60e51b815260206004820181905260248201527f446f6e61746520616d6f756e74206e6f7420657175616c20746f2076616c75656044820152606401610e02565b600a54612c469082614931565b15612c825760405162461bcd60e51b815260206004820152600c60248201526b416d6f756e742077726f6e6760a01b6044820152606401610e02565b600e5481601154612c9391906147a5565b1115612cd45760405162461bcd60e51b815260206004820152601060248201526f115e18d959590811551208131a5b5a5d60821b6044820152606401610e02565b600080612ce36011548461210c565b50509150915080601b8190555060003390508360116000828254612d0791906147a5565b90915550506001600160a01b03811660009081526013602052604081208054869290612d349084906147a5565b90915550506001600160a01b03811660009081526013602052604081206001018054859290612d649084906147a5565b9250508190555082600d6000828254612d7d91906147a5565b9091555050600354600090606490612d9590876147be565b612d9f91906147eb565b604754601154604051632b3773d760e11b815233600482015260248101919091529192506001600160a01b03169063566ee7ae9083906044016000604051808303818588803b158015612df157600080fd5b505af1158015612e05573d6000803e3d6000fd5b5050604754604080516326beb82160e01b815290516001600160a01b0390921694506326beb821935060048082019350602092918290030181865afa158015612e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e769190614834565b604955600654600454600091606491612e8f91906147a5565b612e9990886147be565b612ea391906147eb565b6016546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612ef5576040519150601f19603f3d011682016040523d82523d6000602084013e612efa565b606091505b5050905080612f4b5760405162461bcd60e51b815260206004820152601e60248201527f6d61726b65744d616b6572204661696c20746f20726566756e642045544800006044820152606401610e02565b6000606460075489612f5d91906147be565b612f6791906147eb565b6017546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612fb9576040519150601f19603f3d011682016040523d82523d6000602084013e612fbe565b606091505b505090508061300f5760405162461bcd60e51b815260206004820152601960248201527f696e76697465204661696c20746f20726566756e6420455448000000000000006044820152606401610e02565b600e546011540361301f57426049555b601b54601154604080518c8152602081019390935282015233907f94dfa012dbd3d53b6c092bf771f1f8891ba0605b776a2a861b84099e1b61d3e99060600160405180910390a2505060016000555050505050505050565b6002600054036130995760405162461bcd60e51b8152600401610e0290614705565b60026000556130a733611e8c565b6130c35760405162461bcd60e51b8152600401610e029061473c565b60005b81518110156115595760008282815181106130e3576130e3614760565b6020908102919091018101516001600160a01b0381166000908152601590925260409091206005015490915060ff161561314e5760405162461bcd60e51b815260206004820152600c60248201526b2634b8abb0b9103a37b5b2b760a11b6044820152606401610e02565b613159816000613491565b50806131648161478c565b9150506130c6565b6001546001600160a01b031633146131965760405162461bcd60e51b8152600401610e02906147ff565b61319f81613ef6565b50565b6001600160a01b038181166000908152601460205260408082205490516370a0823160e01b815230600482015292169182906370a0823190602401602060405180830381865afa1580156131fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321e9190614834565b90506000606461322f600a846147be565b61323991906147eb565b604654909150613256906001600160a01b03858116911683613fb7565b604654604051629d473b60e21b81526000916001600160a01b0316906302751cec9061329090889086908690819030904290600401614945565b60408051808303816000875af11580156132ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d29190614980565b6001600160a01b03871660009081526015602052604081206004018054929450859350916133019084906147a5565b90915550506040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa15801561334d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133719190614834565b90506133896001600160a01b03871661dead8361342e565b6000878152601a6020526040812080548492906133a79084906147a5565b90915550506000878152601a6020908152604091829020600401805460ff1916600117905581518981526001600160a01b038981169282019290925290871681830152606081018590526080810184905290517fa7b5a7547555e504fc5f79823a1a5f40bc542e88fbdd247c75d5aa16c354e1149160a0908290030190a150505050505050565b6040516001600160a01b038316602482015260448101829052611a9d90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526140cc565b6001600160a01b038281166000908152601460205260408082205490516370a0823160e01b815230600482015292169182906370a0823190602401602060405180830381865afa1580156134e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061350d9190614834565b6001600160a01b038516600090815260156020526040902060050154909150610100900460ff16156135705760405162461bcd60e51b815260206004820152600c60248201526b29ba30b93a102634b8abb0b960a11b6044820152606401610e02565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d49190614834565b9050600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363b91906148e1565b5060445491935091506000906001600160a01b03808a1691161161365f5782613661565b815b6001600160a01b0389166000908152601860205260408120546005546001600160701b0393909316935091606490613699908261484d565b6064600554856136a991906147be565b6136b391906147eb565b6136bd90856147a5565b6136c791906147be565b6136d191906147eb565b6008546001600160a01b038c166000908152601560205260409020600301549192506136fc916147a5565b42101561374b5760405162461bcd60e51b815260206004820152601e60248201527f52656d6f76654c697175696469747920636f6e646974696f6e206661696c00006044820152606401610e02565b6000838760646005548661375f91906147be565b61376991906147eb565b61377390866147a5565b61377d91906147be565b61378791906147eb565b905087811115613798575060009050865b6046546137b2906001600160a01b038b8116911683613fb7565b604654604051629d473b60e21b81526000916001600160a01b0316906302751cec906137ec908f9086908690899030904290600401614945565b60408051808303816000875af115801561380a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382e9190614980565b6001600160a01b038e16600090815260156020526040812060040180549294508593509161385d9084906147a5565b90915550506001600160a01b038c1660008181526015602052604090819020600501805461ff001916610100179055516370a0823160e01b81523060048201526139009161dead916370a0823190602401602060405180830381865afa1580156138cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ef9190614834565b6001600160a01b038f16919061342e565b8a6139af576001600160a01b038c811660009081526015602052604090819020600501805462ff0000191662010000179055516370a0823160e01b8152306004820152908b16906370a0823190602401602060405180830381865afa15801561396d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139919190614834565b985088156139af576139af6001600160a01b038b1661dead8b61342e565b604080516001600160a01b03808f1682528c166020820152908101839052606081018290528b151560808201527f7632fadb27e92c768fc7195eb0a1ee6337acb0446dcc2c1a1f3ba57d71ef8ac69060a00160405180910390a1505050505050505050505050565b6001600160a01b038116600090815260156020526040902060050154610100900460ff16613a875760405162461bcd60e51b815260206004820152601860248201527f72656d6f7665204c697157617220466c61672077726f6e6700000000000000006044820152606401610e02565b6001600160a01b03811660009081526015602052604090206005015460ff16613ae55760405162461bcd60e51b815260206004820152601060248201526f2737ba102634b8abb0b9103a37b5b2b760811b6044820152606401610e02565b6001600160a01b038181166000908152601560209081526040808320600501805462ffff0019166201000017905560149091528082205490516370a0823160e01b815230600482015292169182906370a0823190602401602060405180830381865afa158015613b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7d9190614834565b90508015613b9b57613b9b6001600160a01b03831661dead8361342e565b604080513381526001600160a01b03851660208201527f9186d1756a49f3b7102ee7c9a0d0be004d229e2eec7d1e789b41d4f935a8f3cf910160405180910390a1505050565b6001600160a01b038181166000908152601460205260409020541615613c345760405162461bcd60e51b8152602060048201526008602482015267131448185919195960c21b6044820152606401610e02565b6040516370a0823160e01b815230600482015247906000906001600160a01b038416906370a0823190602401602060405180830381865afa158015613c7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ca19190614834565b6001600160a01b03841660009081526018602052604090205490915080831015613d0d5760405162461bcd60e51b815260206004820152601960248201527f416d6f756e74206578636565642063757272656e7420455448000000000000006044820152606401610e02565b6046544790613d29906001600160a01b03878116911685613fb7565b60465460405163f305d71960e01b81526000916001600160a01b03169063f305d719908590613d66908a9089908790819030904290600401614945565b60606040518083038185885af1158015613d84573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613da991906149a4565b6045546044805460405163e6a4390560e01b81526001600160a01b038d81166004830152918216602482015293965060009550909116925063e6a439059101602060405180830381865afa158015613e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2991906149d2565b6001600160a01b03888116600090815260146020908152604080832080546001600160a01b031916948616949094179093556015905220600201839055905047613e73818561484d565b6001600160a01b03898116600081815260156020908152604091829020948555600185018b9055426003909501949094558051918252918516928101929092528101879052606081018690527fd2491a9b4fe81a7cd4511e8b7b7743951b061dad5bed7da8a7795b080ee08c7e9060800160405180910390a15050505050505050565b6001600160a01b038116613f5b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e02565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b8015806140315750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561400b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061402f9190614834565b155b61409c5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610e02565b6040516001600160a01b038316602482015260448101829052611a9d90849063095ea7b360e01b9060640161345a565b6000614121826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661419e9092919063ffffffff16565b805190915015611a9d578080602001905181019061413f91906149ef565b611a9d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e02565b60606141ad84846000856141b5565b949350505050565b6060824710156142165760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e02565b600080866001600160a01b031685876040516142329190614a30565b60006040518083038185875af1925050503d806000811461426f576040519150601f19603f3d011682016040523d82523d6000602084013e614274565b606091505b509150915061428587838387614290565b979650505050505050565b606083156142ff5782516000036142f8576001600160a01b0385163b6142f85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e02565b50816141ad565b6141ad83838151156143145781518083602001fd5b8060405162461bcd60e51b8152600401610e029190614a4c565b8260028101928215614374579160200282015b828111156143745781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190614341565b50614380929150614384565b5090565b5b808211156143805760008155600101614385565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461319f57600080fd5b80356143cf816143af565b919050565b600082601f8301126143e557600080fd5b8135602067ffffffffffffffff8083111561440257614402614399565b8260051b604051601f19603f8301168101818110848211171561442757614427614399565b60405293845285810183019383810192508785111561444557600080fd5b83870191505b848210156142855761445c826143c4565b8352918301919083019061444b565b60008060006080848603121561448057600080fd5b83359250602084013567ffffffffffffffff81111561449e57600080fd5b6144aa868287016143d4565b925050846080850111156144bd57600080fd5b6040840190509250925092565b6000602082840312156144dc57600080fd5b81356144e7816143af565b9392505050565b6000806040838503121561450157600080fd5b823561450c816143af565b946020939093013593505050565b60006020828403121561452c57600080fd5b813567ffffffffffffffff81111561454357600080fd5b6141ad848285016143d4565b60006020828403121561456157600080fd5b5035919050565b6000806040838503121561457b57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156145ba5781518752958201959082019060010161459e565b509495945050505050565b8481528360208201526080604082015260006145e4608083018561458a565b8281036060840152614285818561458a565b6000806020838503121561460957600080fd5b823567ffffffffffffffff8082111561462157600080fd5b818501915085601f83011261463557600080fd5b81358181111561464457600080fd5b8660208260051b850101111561465957600080fd5b60209290920196919550909350505050565b801515811461319f57600080fd5b6000806040838503121561468c57600080fd5b8235614697816143af565b915060208301356146a78161466b565b809150509250929050565b600080600080608085870312156146c857600080fd5b84356146d3816143af565b935060208501356146e3816143af565b92506040850135915060608501356146fa8161466b565b939692955090935050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600a90820152692737ba1035b2b2b832b960b11b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161479e5761479e614776565b5060010190565b808201808211156147b8576147b8614776565b92915050565b80820281158282048414176147b8576147b8614776565b634e487b7160e01b600052601260045260246000fd5b6000826147fa576147fa6147d5565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561484657600080fd5b5051919050565b818103818111156147b8576147b8614776565b600060808201868352602060808185015281875180845260a086019150828901935060005b818110156148aa5784516001600160a01b031683529383019391830191600101614885565b50506001600160a01b039690961660408501525050506060015292915050565b80516001600160701b03811681146143cf57600080fd5b6000806000606084860312156148f657600080fd5b6148ff846148ca565b925061490d602085016148ca565b9150604084015163ffffffff8116811461492657600080fd5b809150509250925092565b600082614940576149406147d5565b500690565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000806040838503121561499357600080fd5b505080516020909101519092909150565b6000806000606084860312156149b957600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156149e457600080fd5b81516144e7816143af565b600060208284031215614a0157600080fd5b81516144e78161466b565b60005b83811015614a27578181015183820152602001614a0f565b50506000910152565b60008251614a42818460208701614a0c565b9190910192915050565b6020815260008251806020840152614a6b816040850160208701614a0c565b601f01601f1916919091016040019291505056fea2646970667358221220bbdec15596cf3b219624098df4059c58ad3dbf0ed2d25f35a4e0c094f0a06fe564736f6c634300081400330000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000008f8eb567a9f875180eed690dd231fd9619bb09a7000000000000000000000000edffbd7b6f6060e29b262681e9ff52d8772258c90000000000000000000000005843988dfa70805ea740c4af464468c05d73a869
Deployed Bytecode
0x6080604052600436106104125760003560e01c8063831cb8e81161021e578063c30b7ecb11610123578063e7740454116100ab578063f14faf6f1161007a578063f14faf6f14610d63578063f26bd8d914610d76578063f2fde38b14610d96578063f670ed4114610db6578063f7ed40a714610dcc57600080fd5b8063e774045414610c7f578063e805a8d014610d26578063ec6fdad014610d3b578063ed6a469f14610d5057600080fd5b8063c4b0ee39116100f2578063c4b0ee3914610be8578063c978a7bc14610bfd578063ce1ff67e14610c13578063d1b9e85314610c49578063d3c6d2b514610c6957600080fd5b8063c30b7ecb14610b72578063c31c9c0714610b88578063c320339514610ba8578063c45a015514610bc857600080fd5b8063a035b237116101a6578063ae0526d311610175578063ae0526d314610ad0578063b7dfa36c14610af0578063ba6f991c14610b06578063bc184cb914610b46578063bf040de114610b5c57600080fd5b8063a035b23714610a40578063a2c7608114610a70578063aa7f217014610a90578063ad5c464814610ab057600080fd5b80638eec6f7b116101ed5780638eec6f7b14610979578063923881661461099957806394afb0d5146109af578063965f8c9914610a0b5780639f3f54af14610a2b57600080fd5b8063831cb8e8146109105780638542925a1461092557806387e97bc61461093b5780638da5cb5b1461095b57600080fd5b80634c18ccfc116103245780636475c305116102ac578063715018a61161027b578063715018a61461088257806378e97925146108975780637bfb06b4146108ad5780637e3aac04146108c35780638283aee5146108f057600080fd5b80636475c3051461081357806365bbd34614610833578063685a043a146108485780636ba42aaa1461086257600080fd5b80635af123f4116102f35780635af123f4146107765780635b1e860c1461078c5780635b335e9c146107a2578063613fc6e7146107d357806362fc3ea6146107f357600080fd5b80634c18ccfc146106e65780634e71d92d146107265780634fa5f6511461073b5780635121a2e51461076057600080fd5b80631959a002116103a757806327dcc0601161037657806327dcc060146106475780632ee9a24d1461065d5780633197cbb614610673578063365c7a29146106895780634b0c86cf146106c657600080fd5b80631959a002146105575780631cc6391e146105d15780632295c42d146106075780632693ee801461062757600080fd5b80630dce4d45116103e35780630dce4d45146104b75780630ea479b4146104e05780630f018e271461050057806312210e8a1461054257600080fd5b806283b2f51461041e578062d4e77f1461044757806303fd2a4514610469578063058753951461049757600080fd5b3661041957005b600080fd5b34801561042a57600080fd5b50610434600e5481565b6040519081526020015b60405180910390f35b34801561045357600080fd5b5061046761046236600461446b565b610de0565b005b34801561047557600080fd5b5061047f61dead81565b6040516001600160a01b03909116815260200161043e565b3480156104a357600080fd5b5060175461047f906001600160a01b031681565b3480156104c357600080fd5b506048546049545b6040805192835260208301919091520161043e565b3480156104ec57600080fd5b5060165461047f906001600160a01b031681565b34801561050c57600080fd5b50610515610f7d565b604080519687526020870195909552938501929092526060840152608083015260a082015260c00161043e565b34801561054e57600080fd5b50610467611006565b34801561056357600080fd5b506105a56105723660046144ca565b60136020526000908152604090208054600182015460028301546003909301549192909160ff8082169161010090041685565b60408051958652602086019490945292840191909152151560608301521515608082015260a00161043e565b3480156105dd57600080fd5b5061047f6105ec3660046144ca565b6014602052600090815260409020546001600160a01b031681565b34801561061357600080fd5b506104676106223660046144ee565b6112e5565b34801561063357600080fd5b5060475461047f906001600160a01b031681565b34801561065357600080fd5b5061043460095481565b34801561066957600080fd5b50610434601b5481565b34801561067f57600080fd5b5061043460495481565b34801561069557600080fd5b5061069e611418565b604080519586526020860194909452928401919091526060830152608082015260a00161043e565b3480156106d257600080fd5b506104676106e136600461451a565b611448565b3480156106f257600080fd5b506107166107013660046144ca565b60126020526000908152604090205460ff1681565b604051901515815260200161043e565b34801561073257600080fd5b50610467611562565b34801561074757600080fd5b50604a5461047f9061010090046001600160a01b031681565b34801561076c57600080fd5b50610434600b5481565b34801561078257600080fd5b5061043460035481565b34801561079857600080fd5b5061043460105481565b3480156107ae57600080fd5b50600b54600c54600d546040805193845260208401929092529082015260600161043e565b3480156107df57600080fd5b506104676107ee36600461454f565b6117bb565b3480156107ff57600080fd5b5061046761080e36600461454f565b611aa2565b34801561081f57600080fd5b5061069e61082e3660046144ca565b611b0e565b34801561083f57600080fd5b50610467611d47565b34801561085457600080fd5b50604a546107169060ff1681565b34801561086e57600080fd5b5061071661087d3660046144ca565b611e8c565b34801561088e57600080fd5b50610467611eaa565b3480156108a357600080fd5b5061043460485481565b3480156108b957600080fd5b5061043460055481565b3480156108cf57600080fd5b506104346108de3660046144ca565b60186020526000908152604090205481565b3480156108fc57600080fd5b5060025461047f906001600160a01b031681565b34801561091c57600080fd5b50610434604b81565b34801561093157600080fd5b50610434600d5481565b34801561094757600080fd5b506104346109563660046144ca565b611f1e565b34801561096757600080fd5b506001546001600160a01b031661047f565b34801561098557600080fd5b5061046761099436600461454f565b611f69565b3480156109a557600080fd5b50610434600a5481565b3480156109bb57600080fd5b506109ee6109ca36600461454f565b601a6020526000908152604090208054600182015460049092015490919060ff1683565b60408051938452602084019290925215159082015260600161043e565b348015610a1757600080fd5b50610467610a2636600461454f565b6120a7565b348015610a3757600080fd5b50610434600a81565b348015610a4c57600080fd5b50610a60610a5b366004614568565b61210c565b60405161043e94939291906145c5565b348015610a7c57600080fd5b50610434610a8b36600461454f565b6125b6565b348015610a9c57600080fd5b50610467610aab3660046144ca565b6125cd565b348015610abc57600080fd5b5060445461047f906001600160a01b031681565b348015610adc57600080fd5b50610434610aeb36600461454f565b61264c565b348015610afc57600080fd5b50610434600f5481565b348015610b1257600080fd5b50610b26610b213660046144ca565b61265c565b60408051948552602085019390935291830152606082015260800161043e565b348015610b5257600080fd5b50610434600c5481565b348015610b6857600080fd5b5061043460045481565b348015610b7e57600080fd5b5061043460085481565b348015610b9457600080fd5b5060465461047f906001600160a01b031681565b348015610bb457600080fd5b50610467610bc33660046145f6565b61272e565b348015610bd457600080fd5b5060455461047f906001600160a01b031681565b348015610bf457600080fd5b50610434606481565b348015610c0957600080fd5b5061043460075481565b348015610c1f57600080fd5b5061047f610c2e3660046144ca565b6019602052600090815260409020546001600160a01b031681565b348015610c5557600080fd5b50610467610c64366004614679565b6127d0565b348015610c7557600080fd5b5061043460065481565b348015610c8b57600080fd5b50610ce5610c9a3660046144ca565b601560205260009081526040902080546001820154600283015460038401546004850154600590950154939492939192909160ff808216916101008104821691620100009091041688565b6040805198895260208901979097529587019490945260608601929092526080850152151560a0840152151560c0830152151560e08201526101000161043e565b348015610d3257600080fd5b5061043461285f565b348015610d4757600080fd5b50610434601881565b61047f610d5e3660046146b2565b612876565b610467610d7136600461454f565b612b2d565b348015610d8257600080fd5b50610467610d9136600461451a565b613077565b348015610da257600080fd5b50610467610db13660046144ca565b61316c565b348015610dc257600080fd5b5061043460115481565b348015610dd857600080fd5b5043426104cb565b600260005403610e0b5760405162461bcd60e51b8152600401610e0290614705565b60405180910390fd5b6002600055610e1933611e8c565b610e355760405162461bcd60e51b8152600401610e029061473c565b6000838152601a602052604090206004015460ff1615610e885760405162461bcd60e51b815260206004820152600e60248201526d1cd95c539bc81a185cc81d5cd95960921b6044820152606401610e02565b60005b8251811015610f72576000838281518110610ea857610ea8614760565b6020026020010151905060156000826001600160a01b03166001600160a01b0316815260200190815260200160002060050160019054906101000a900460ff16610f345760405162461bcd60e51b815260206004820152601960248201527f4e6f7420616c6c6f7720746f205374617274204c6971576172000000000000006044820152606401610e02565b610f3e85826131a2565b6000858152601a60205260409020610f5d90600290810190859061432e565b50508080610f6a9061478c565b915050610e8b565b505060016000555050565b601b5460008080808060308660148110610f9957610f99614760565b015494506014601b546001610fae91906147a5565b1015610fc657610fbf8660016147a5565b9350610fcb565b601393505b60308460148110610fde57610fde614760565b01549250601c8660148110610ff557610ff5614760565b015491506011549050909192939495565b6002600054036110285760405162461bcd60e51b8152600401610e0290614705565b60026000556049544211801561104d575060095460495461104991906147a5565b4211155b6110995760405162461bcd60e51b815260206004820152601760248201527f50726f7465637420526566756e64204475726174696f6e0000000000000000006044820152606401610e02565b336000818152601360205260409020546110e75760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a1bdd5d0811195c1bdcda5d608a1b6044820152606401610e02565b6001600160a01b03811660009081526013602052604090206003015460ff1615801561113457506001600160a01b038116600090815260136020526040902060030154610100900460ff16155b61116f5760405162461bcd60e51b815260206004820152600c60248201526b12185cc81499599d5b99195960a21b6044820152606401610e02565b6001600160a01b03811660009081526013602052604081205460649061119790604b906147be565b6111a191906147eb565b6001600160a01b038316600081815260136020526040808220600301805460ff19166001179055519293509183908381818185875af1925050503d8060008114611207576040519150601f19603f3d011682016040523d82523d6000602084013e61120c565b606091505b50509050806112545760405162461bcd60e51b81526020600482015260146024820152730aadcc2c4d8ca40e8de40e4cacceadcc8408aa8960631b6044820152606401610e02565b6001600160a01b0380841660009081526013602052604090206001015460025461128392169061dead9061342e565b6001600160a01b0383166000818152601360209081526040918290205482519384529083015281018390527f0a51d2fc760fc947eee0ddb113878c9774c389343c0b08aa0afe1caa731e7a179060600160405180910390a15050600160005550565b6001546001600160a01b0316331461130f5760405162461bcd60e51b8152600401610e02906147ff565b60095460495461131f91906147a5565b421161136d5760405162461bcd60e51b815260206004820152601760248201527f50726f74656374206c6f636b4c50204475726174696f6e0000000000000000006044820152606401610e02565b6001600160a01b038281166000908152601460205260408082205490516370a0823160e01b815230600482015292169182906370a0823190602401602060405180830381865afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190614834565b90508281111561141257604a54611412906001600160a01b03848116916101009004168561342e565b50505050565b600c54600d54600b546000908190819061143390859061484d565b915061143f82846147a5565b90509091929394565b60026000540361146a5760405162461bcd60e51b8152600401610e0290614705565b600260005561147833611e8c565b6114945760405162461bcd60e51b8152600401610e029061473c565b60005b81518110156115595760008282815181106114b4576114b4614760565b6020908102919091018101516001600160a01b0381166000908152601590925260409091206005015490915060ff166115225760405162461bcd60e51b815260206004820152601060248201526f2737ba102634b8abb0b9103a37b5b2b760811b6044820152606401610e02565b61154683838151811061153757611537614760565b60200260200101516001613491565b50806115518161478c565b915050611497565b50506001600055565b6002600054036115845760405162461bcd60e51b8152600401610e0290614705565b600260009081553380825260136020526040909120546115d85760405162461bcd60e51b815260206004820152600f60248201526e15da5d1a1bdd5d0811195c1bdcda5d608a1b6044820152606401610e02565b604954421161161d5760405162461bcd60e51b8152602060048201526011602482015270135a5b9d08139bdd08119a5b9a5cda1959607a1b6044820152606401610e02565b6001600160a01b03811660009081526013602052604090206003015460ff16156116785760405162461bcd60e51b815260206004820152600c60248201526b12185cc81499599d5b99195960a21b6044820152606401610e02565b6001600160a01b03811660009081526013602052604090206002810154600190910154116116d75760405162461bcd60e51b815260206004820152600c60248201526b105b1b0814995b19585cd95960a21b6044820152606401610e02565b6001600160a01b03811660009081526013602052604081206002810154600190910154611704919061484d565b6001600160a01b0383166000908152601360205260408120600201805492935083929091906117349084906147a5565b9091555050600254611750906001600160a01b0316838361342e565b6001600160a01b03821660008181526013602052604090819020600301805461ff001916610100179055517f47cee97cb7acd717b3c0aa1435d004cd5b3c8c57d70dbceb4e4458bbd60e39d4906117aa9084815260200190565b60405180910390a250506001600055565b6117c433611e8c565b6117e05760405162461bcd60e51b8152600401610e029061473c565b6000818152601a602052604090206004015460ff166118355760405162461bcd60e51b81526020600482015260116024820152702737ba103932b6b7bb32902634b8abb0b960791b6044820152606401610e02565b6000818152601a602052604090206001015460181161188a5760405162461bcd60e51b81526020600482015260116024820152702737ba103932b6b7bb32902634b8abb0b960791b6044820152606401610e02565b6000818152601a602052604081206001018054916118a78361478c565b90915550600090506118bb601860026147be565b6000838152601a60205260409020546118d491906147eb565b905060005b6002811015611a9d576000838152601a602052604081206002908101908390811061190657611906614760565b01546040805160028082526060820183526001600160a01b0390931693506000929091602083019080368337505060445482519293506001600160a01b03169183915060009061195857611958614760565b60200260200101906001600160a01b031690816001600160a01b031681525050818160018151811061198c5761198c614760565b6001600160a01b03928316602091820292909201015260465460405163b6f9de9560e01b815291169063b6f9de959086906119d290600090869030904290600401614860565b6000604051808303818588803b1580156119eb57600080fd5b505af11580156119ff573d6000803e3d6000fd5b50506040516370a0823160e01b8152306004820152600093506001600160a01b03861692506370a082319150602401602060405180830381865afa158015611a4b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a6f9190614834565b9050611a876001600160a01b03841661dead8361342e565b5050508080611a959061478c565b9150506118d9565b505050565b6001546001600160a01b03163314611acc5760405162461bcd60e51b8152600401610e02906147ff565b600581905560408051338152602081018390527f81eb433ecff7578fea633a4eed84b25e60b72223d14b5296e94823b9e5571f5f91015b60405180910390a150565b6001600160a01b0380821660009081526014602090815260408083205481516318160ddd60e01b815291519394859485948594859490931692849284926318160ddd92600480820193918290030181865afa158015611b71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b959190614834565b9050600080836001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015611bd8573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bfc91906148e1565b5060445491935091506001600160a01b03808c16911611611c1d5781611c1f565b805b6001600160a01b038b16600090815260186020526040902054600554909a506001600160701b03919091169850606490611c59908261484d565b60646005548c611c6991906147be565b611c7391906147eb565b611c7d908c6147a5565b611c8791906147be565b611c9191906147eb565b9650878360646005548c611ca591906147be565b611caf91906147eb565b611cb9908c6147a5565b611cc391906147be565b611ccd91906147eb565b6040516370a0823160e01b81523060048201529096506001600160a01b038516906370a0823190602401602060405180830381865afa158015611d14573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d389190614834565b94505050505091939590929450565b611d5033611e8c565b611d6c5760405162461bcd60e51b8152600401610e029061473c565b6049544211611dbd5760405162461bcd60e51b815260206004820152601e60248201527f4e6f7420616c6c6f7720746f2064657374726f79204c656674546f6b656e00006044820152606401610e02565b600b54600d5410611e095760405162461bcd60e51b8152602060048201526016602482015275135a5b9d1959081b195cdcc81d1a185b88131a5b5a5d60521b6044820152606401610e02565b604a5460ff1615611e4e5760405162461bcd60e51b815260206004820152600f60248201526e416c72656164792044657374726f7960881b6044820152606401610e02565b6000600d54600b54611e60919061484d565b600254909150611e7c906001600160a01b031661dead8361342e565b50604a805460ff19166001179055565b6001600160a01b031660009081526012602052604090205460ff1690565b6001546001600160a01b03163314611ed45760405162461bcd60e51b8152600401610e02906147ff565b6001546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600180546001600160a01b0319169055565b6001600160a01b03811660009081526013602052604081206003015460ff1615611f4a57506000919050565b506001600160a01b031660009081526013602052604090206001015490565b6001546001600160a01b03163314611f935760405162461bcd60e51b8152600401610e02906147ff565b600954604954611fa391906147a5565b4211611ff15760405162461bcd60e51b815260206004820152601860248201527f50726f74656374206c6f636b455448204475726174696f6e00000000000000006044820152606401610e02565b604a5460405160009161010090046001600160a01b03169083908381818185875af1925050503d8060008114612043576040519150601f19603f3d011682016040523d82523d6000602084013e612048565b606091505b50509050806120a35760405162461bcd60e51b815260206004820152602160248201527f6c6f636b4c504164647220556e61626c6520746f2057697468647261772045546044820152600960fb1b6064820152608401610e02565b5050565b6001546001600160a01b031633146120d15760405162461bcd60e51b8152600401610e02906147ff565b601081905560408051338152602081018390527fa70cec5ab93bb60a6face5d07b91f1ffc5bdfd14803d27b1f5f5f0e9d36241109101611b03565b6040805160148082526102a082019092526000918291606091829190602082016102808036833750506040805160148082526102a082019092529294509050602082016102808036833701905050601b549091506000905b60148110156125a757601c816014811061218057612180614760565b015488111580156121ae5750601c816014811061219f5761219f614760565b01546121ab888a6147a5565b11155b1561223957808483815181106121c6576121c6614760565b602002602001018181525050809450868383815181106121e8576121e8614760565b6020908102919091010152816121fd8161478c565b925050670de0b6b3a76400006030826014811061221c5761221c614760565b015461222890896147be565b61223291906147eb565b95506125a7565b601c816014811061224c5761224c614760565b0154881115801561227a5750601c816014811061226b5761226b614760565b0154612277888a6147a5565b10155b15612595578084838151811061229257612292614760565b60200260200101818152505080945087601c82601481106122b5576122b5614760565b01546122c1919061484d565b8383815181106122d3576122d3614760565b602002602001018181525050670de0b6b3a7640000603082601481106122fb576122fb614760565b015489601c846014811061231157612311614760565b015461231d919061484d565b61232791906147be565b61233191906147eb565b61233b90876147a5565b9550816123478161478c565b9250506000601c826014811061235f5761235f614760565b0154905060006123708360016147a5565b90505b601481101561258e57601c816014811061238f5761238f614760565b015461239b8a8c6147a5565b1061248757808685815181106123b3576123b3614760565b60200260200101818152505080965081601c82601481106123d6576123d6614760565b01546123e2919061484d565b8585815181106123f4576123f4614760565b602002602001018181525050670de0b6b3a76400006030826014811061241c5761241c614760565b015483601c846014811061243257612432614760565b015461243e919061484d565b61244891906147be565b61245291906147eb565b61245c90896147a5565b9750601c816014811061247157612471614760565b015491508361247f8161478c565b94505061257c565b8086858151811061249a5761249a614760565b6020908102919091010152955085601c6124b560018361484d565b601481106124c5576124c5614760565b01546124d18a8c6147a5565b6124db919061484d565b8585815181106124ed576124ed614760565b602002602001018181525050670de0b6b3a76400006030826014811061251557612515614760565b0154601c61252460018561484d565b6014811061253457612534614760565b01546125408c8e6147a5565b61254a919061484d565b61255491906147be565b61255e91906147eb565b61256890896147a5565b9750836125748161478c565b94505061258e565b806125868161478c565b915050612373565b50506125a7565b8061259f8161478c565b915050612164565b50808352815292959194509250565b603081601481106125c657600080fd5b0154905081565b6001546001600160a01b031633146125f75760405162461bcd60e51b8152600401610e02906147ff565b604780546001600160a01b0319166001600160a01b0383169081179091556040805133815260208101929092527f6c8aa1451bb27118767004fb0f2f6ac5866736a3dc12d751a239043469e4cf319101611b03565b601c81601481106125c657600080fd5b6001600160a01b038116600090815260136020526040812060018101546002909101546049549192918290421161269b57506000915081905082612727565b6001600160a01b03851660009081526013602052604090206003015460ff16156126d057506000925082915081905080612727565b604954426fffffffffffffffffffffffffffffffff16106126f8576126f5828561484d565b92505b61270282846147a5565b841161270f576000612724565b8161271a848661484d565b612724919061484d565b90505b9193509193565b6002600054036127505760405162461bcd60e51b8152600401610e0290614705565b600260005561275e33611e8c565b61277a5760405162461bcd60e51b8152600401610e029061473c565b60005b818110156127c6576127b483838381811061279a5761279a614760565b90506020020160208101906127af91906144ca565b613a17565b806127be8161478c565b91505061277d565b5050600160005550565b6001546001600160a01b031633146127fa5760405162461bcd60e51b8152600401610e02906147ff565b6001600160a01b038216600081815260126020908152604091829020805460ff191685151590811790915582519384529083015233917f8ff482920e9c46f3eaae463cb945cee6bf6ede646ff885e22885efa7c61cd1d3910160405180910390a25050565b6000600c54600d5461287191906147a5565b905090565b600061288133611e8c565b61289d5760405162461bcd60e51b8152600401610e029061473c565b824710156128ed5760405162461bcd60e51b815260206004820152601d60248201527f42616c616e6365206c657373207468616e206465626974206c6576656c0000006044820152606401610e02565b60105483600f546128fe91906147a5565b1115801561290e57506000601054115b61294e5760405162461bcd60e51b8152602060048201526011602482015270115e18d95959081919589a5d131a5b5a5d607a1b6044820152606401610e02565b6001600160a01b0385811660009081526018602090815260408083208790556019825280832080546001600160a01b031916948916949094179093556015905220600501805460ff19168315151790556129a785613be1565b60408051600280825260608201835234926000929190602083019080368337505060445482519293506001600160a01b0316918391506000906129ec576129ec614760565b60200260200101906001600160a01b031690816001600160a01b0316815250508681600181518110612a2057612a20614760565b6001600160a01b03928316602091820292909201015260465460405163b6f9de9560e01b815291169063b6f9de95908490612a669060009086908c904290600401614860565b6000604051808303818588803b158015612a7f57600080fd5b505af1158015612a93573d6000803e3d6000fd5b505050505084600f6000828254612aaa91906147a5565b90915550506001600160a01b038781166000818152601460209081526040918290205482518b86168152918201939093529190921691810182905260608101879052608081018490529093507ff1a35f5b0475d58d3efa229f8d7a18c81aa5b916585ab625274bacb363de7d249060a00160405180910390a15050949350505050565b600260005403612b4f5760405162461bcd60e51b8152600401610e0290614705565b60026000556049543490421115612b965760405162461bcd60e51b815260206004820152600b60248201526a11195c1bdcda5d08195b9960aa1b6044820152606401610e02565b600a54811015612bdd5760405162461bcd60e51b815260206004820152601260248201527113195cdcc81b5a5b94195c91195c1bdcda5d60721b6044820152606401610e02565b80600a5483612bec91906147be565b14612c395760405162461bcd60e51b815260206004820181905260248201527f446f6e61746520616d6f756e74206e6f7420657175616c20746f2076616c75656044820152606401610e02565b600a54612c469082614931565b15612c825760405162461bcd60e51b815260206004820152600c60248201526b416d6f756e742077726f6e6760a01b6044820152606401610e02565b600e5481601154612c9391906147a5565b1115612cd45760405162461bcd60e51b815260206004820152601060248201526f115e18d959590811551208131a5b5a5d60821b6044820152606401610e02565b600080612ce36011548461210c565b50509150915080601b8190555060003390508360116000828254612d0791906147a5565b90915550506001600160a01b03811660009081526013602052604081208054869290612d349084906147a5565b90915550506001600160a01b03811660009081526013602052604081206001018054859290612d649084906147a5565b9250508190555082600d6000828254612d7d91906147a5565b9091555050600354600090606490612d9590876147be565b612d9f91906147eb565b604754601154604051632b3773d760e11b815233600482015260248101919091529192506001600160a01b03169063566ee7ae9083906044016000604051808303818588803b158015612df157600080fd5b505af1158015612e05573d6000803e3d6000fd5b5050604754604080516326beb82160e01b815290516001600160a01b0390921694506326beb821935060048082019350602092918290030181865afa158015612e52573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612e769190614834565b604955600654600454600091606491612e8f91906147a5565b612e9990886147be565b612ea391906147eb565b6016546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612ef5576040519150601f19603f3d011682016040523d82523d6000602084013e612efa565b606091505b5050905080612f4b5760405162461bcd60e51b815260206004820152601e60248201527f6d61726b65744d616b6572204661696c20746f20726566756e642045544800006044820152606401610e02565b6000606460075489612f5d91906147be565b612f6791906147eb565b6017546040519192506000916001600160a01b039091169083908381818185875af1925050503d8060008114612fb9576040519150601f19603f3d011682016040523d82523d6000602084013e612fbe565b606091505b505090508061300f5760405162461bcd60e51b815260206004820152601960248201527f696e76697465204661696c20746f20726566756e6420455448000000000000006044820152606401610e02565b600e546011540361301f57426049555b601b54601154604080518c8152602081019390935282015233907f94dfa012dbd3d53b6c092bf771f1f8891ba0605b776a2a861b84099e1b61d3e99060600160405180910390a2505060016000555050505050505050565b6002600054036130995760405162461bcd60e51b8152600401610e0290614705565b60026000556130a733611e8c565b6130c35760405162461bcd60e51b8152600401610e029061473c565b60005b81518110156115595760008282815181106130e3576130e3614760565b6020908102919091018101516001600160a01b0381166000908152601590925260409091206005015490915060ff161561314e5760405162461bcd60e51b815260206004820152600c60248201526b2634b8abb0b9103a37b5b2b760a11b6044820152606401610e02565b613159816000613491565b50806131648161478c565b9150506130c6565b6001546001600160a01b031633146131965760405162461bcd60e51b8152600401610e02906147ff565b61319f81613ef6565b50565b6001600160a01b038181166000908152601460205260408082205490516370a0823160e01b815230600482015292169182906370a0823190602401602060405180830381865afa1580156131fa573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061321e9190614834565b90506000606461322f600a846147be565b61323991906147eb565b604654909150613256906001600160a01b03858116911683613fb7565b604654604051629d473b60e21b81526000916001600160a01b0316906302751cec9061329090889086908690819030904290600401614945565b60408051808303816000875af11580156132ae573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906132d29190614980565b6001600160a01b03871660009081526015602052604081206004018054929450859350916133019084906147a5565b90915550506040516370a0823160e01b81523060048201526000906001600160a01b038716906370a0823190602401602060405180830381865afa15801561334d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133719190614834565b90506133896001600160a01b03871661dead8361342e565b6000878152601a6020526040812080548492906133a79084906147a5565b90915550506000878152601a6020908152604091829020600401805460ff1916600117905581518981526001600160a01b038981169282019290925290871681830152606081018590526080810184905290517fa7b5a7547555e504fc5f79823a1a5f40bc542e88fbdd247c75d5aa16c354e1149160a0908290030190a150505050505050565b6040516001600160a01b038316602482015260448101829052611a9d90849063a9059cbb60e01b906064015b60408051601f198184030181529190526020810180516001600160e01b03166001600160e01b0319909316929092179091526140cc565b6001600160a01b038281166000908152601460205260408082205490516370a0823160e01b815230600482015292169182906370a0823190602401602060405180830381865afa1580156134e9573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061350d9190614834565b6001600160a01b038516600090815260156020526040902060050154909150610100900460ff16156135705760405162461bcd60e51b815260206004820152600c60248201526b29ba30b93a102634b8abb0b960a11b6044820152606401610e02565b6000826001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156135b0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906135d49190614834565b9050600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa158015613617573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061363b91906148e1565b5060445491935091506000906001600160a01b03808a1691161161365f5782613661565b815b6001600160a01b0389166000908152601860205260408120546005546001600160701b0393909316935091606490613699908261484d565b6064600554856136a991906147be565b6136b391906147eb565b6136bd90856147a5565b6136c791906147be565b6136d191906147eb565b6008546001600160a01b038c166000908152601560205260409020600301549192506136fc916147a5565b42101561374b5760405162461bcd60e51b815260206004820152601e60248201527f52656d6f76654c697175696469747920636f6e646974696f6e206661696c00006044820152606401610e02565b6000838760646005548661375f91906147be565b61376991906147eb565b61377390866147a5565b61377d91906147be565b61378791906147eb565b905087811115613798575060009050865b6046546137b2906001600160a01b038b8116911683613fb7565b604654604051629d473b60e21b81526000916001600160a01b0316906302751cec906137ec908f9086908690899030904290600401614945565b60408051808303816000875af115801561380a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061382e9190614980565b6001600160a01b038e16600090815260156020526040812060040180549294508593509161385d9084906147a5565b90915550506001600160a01b038c1660008181526015602052604090819020600501805461ff001916610100179055516370a0823160e01b81523060048201526139009161dead916370a0823190602401602060405180830381865afa1580156138cb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138ef9190614834565b6001600160a01b038f16919061342e565b8a6139af576001600160a01b038c811660009081526015602052604090819020600501805462ff0000191662010000179055516370a0823160e01b8152306004820152908b16906370a0823190602401602060405180830381865afa15801561396d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906139919190614834565b985088156139af576139af6001600160a01b038b1661dead8b61342e565b604080516001600160a01b03808f1682528c166020820152908101839052606081018290528b151560808201527f7632fadb27e92c768fc7195eb0a1ee6337acb0446dcc2c1a1f3ba57d71ef8ac69060a00160405180910390a1505050505050505050505050565b6001600160a01b038116600090815260156020526040902060050154610100900460ff16613a875760405162461bcd60e51b815260206004820152601860248201527f72656d6f7665204c697157617220466c61672077726f6e6700000000000000006044820152606401610e02565b6001600160a01b03811660009081526015602052604090206005015460ff16613ae55760405162461bcd60e51b815260206004820152601060248201526f2737ba102634b8abb0b9103a37b5b2b760811b6044820152606401610e02565b6001600160a01b038181166000908152601560209081526040808320600501805462ffff0019166201000017905560149091528082205490516370a0823160e01b815230600482015292169182906370a0823190602401602060405180830381865afa158015613b59573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613b7d9190614834565b90508015613b9b57613b9b6001600160a01b03831661dead8361342e565b604080513381526001600160a01b03851660208201527f9186d1756a49f3b7102ee7c9a0d0be004d229e2eec7d1e789b41d4f935a8f3cf910160405180910390a1505050565b6001600160a01b038181166000908152601460205260409020541615613c345760405162461bcd60e51b8152602060048201526008602482015267131448185919195960c21b6044820152606401610e02565b6040516370a0823160e01b815230600482015247906000906001600160a01b038416906370a0823190602401602060405180830381865afa158015613c7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613ca19190614834565b6001600160a01b03841660009081526018602052604090205490915080831015613d0d5760405162461bcd60e51b815260206004820152601960248201527f416d6f756e74206578636565642063757272656e7420455448000000000000006044820152606401610e02565b6046544790613d29906001600160a01b03878116911685613fb7565b60465460405163f305d71960e01b81526000916001600160a01b03169063f305d719908590613d66908a9089908790819030904290600401614945565b60606040518083038185885af1158015613d84573d6000803e3d6000fd5b50505050506040513d601f19601f82011682018060405250810190613da991906149a4565b6045546044805460405163e6a4390560e01b81526001600160a01b038d81166004830152918216602482015293965060009550909116925063e6a439059101602060405180830381865afa158015613e05573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190613e2991906149d2565b6001600160a01b03888116600090815260146020908152604080832080546001600160a01b031916948616949094179093556015905220600201839055905047613e73818561484d565b6001600160a01b03898116600081815260156020908152604091829020948555600185018b9055426003909501949094558051918252918516928101929092528101879052606081018690527fd2491a9b4fe81a7cd4511e8b7b7743951b061dad5bed7da8a7795b080ee08c7e9060800160405180910390a15050505050505050565b6001600160a01b038116613f5b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610e02565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b8015806140315750604051636eb1769f60e11b81523060048201526001600160a01b03838116602483015284169063dd62ed3e90604401602060405180830381865afa15801561400b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061402f9190614834565b155b61409c5760405162461bcd60e51b815260206004820152603660248201527f5361666545524332303a20617070726f76652066726f6d206e6f6e2d7a65726f60448201527520746f206e6f6e2d7a65726f20616c6c6f77616e636560501b6064820152608401610e02565b6040516001600160a01b038316602482015260448101829052611a9d90849063095ea7b360e01b9060640161345a565b6000614121826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661419e9092919063ffffffff16565b805190915015611a9d578080602001905181019061413f91906149ef565b611a9d5760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b6064820152608401610e02565b60606141ad84846000856141b5565b949350505050565b6060824710156142165760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f6044820152651c8818d85b1b60d21b6064820152608401610e02565b600080866001600160a01b031685876040516142329190614a30565b60006040518083038185875af1925050503d806000811461426f576040519150601f19603f3d011682016040523d82523d6000602084013e614274565b606091505b509150915061428587838387614290565b979650505050505050565b606083156142ff5782516000036142f8576001600160a01b0385163b6142f85760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610e02565b50816141ad565b6141ad83838151156143145781518083602001fd5b8060405162461bcd60e51b8152600401610e029190614a4c565b8260028101928215614374579160200282015b828111156143745781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190614341565b50614380929150614384565b5090565b5b808211156143805760008155600101614385565b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461319f57600080fd5b80356143cf816143af565b919050565b600082601f8301126143e557600080fd5b8135602067ffffffffffffffff8083111561440257614402614399565b8260051b604051601f19603f8301168101818110848211171561442757614427614399565b60405293845285810183019383810192508785111561444557600080fd5b83870191505b848210156142855761445c826143c4565b8352918301919083019061444b565b60008060006080848603121561448057600080fd5b83359250602084013567ffffffffffffffff81111561449e57600080fd5b6144aa868287016143d4565b925050846080850111156144bd57600080fd5b6040840190509250925092565b6000602082840312156144dc57600080fd5b81356144e7816143af565b9392505050565b6000806040838503121561450157600080fd5b823561450c816143af565b946020939093013593505050565b60006020828403121561452c57600080fd5b813567ffffffffffffffff81111561454357600080fd5b6141ad848285016143d4565b60006020828403121561456157600080fd5b5035919050565b6000806040838503121561457b57600080fd5b50508035926020909101359150565b600081518084526020808501945080840160005b838110156145ba5781518752958201959082019060010161459e565b509495945050505050565b8481528360208201526080604082015260006145e4608083018561458a565b8281036060840152614285818561458a565b6000806020838503121561460957600080fd5b823567ffffffffffffffff8082111561462157600080fd5b818501915085601f83011261463557600080fd5b81358181111561464457600080fd5b8660208260051b850101111561465957600080fd5b60209290920196919550909350505050565b801515811461319f57600080fd5b6000806040838503121561468c57600080fd5b8235614697816143af565b915060208301356146a78161466b565b809150509250929050565b600080600080608085870312156146c857600080fd5b84356146d3816143af565b935060208501356146e3816143af565b92506040850135915060608501356146fa8161466b565b939692955090935050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b6020808252600a90820152692737ba1035b2b2b832b960b11b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60006001820161479e5761479e614776565b5060010190565b808201808211156147b8576147b8614776565b92915050565b80820281158282048414176147b8576147b8614776565b634e487b7160e01b600052601260045260246000fd5b6000826147fa576147fa6147d5565b500490565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60006020828403121561484657600080fd5b5051919050565b818103818111156147b8576147b8614776565b600060808201868352602060808185015281875180845260a086019150828901935060005b818110156148aa5784516001600160a01b031683529383019391830191600101614885565b50506001600160a01b039690961660408501525050506060015292915050565b80516001600160701b03811681146143cf57600080fd5b6000806000606084860312156148f657600080fd5b6148ff846148ca565b925061490d602085016148ca565b9150604084015163ffffffff8116811461492657600080fd5b809150509250925092565b600082614940576149406147d5565b500690565b6001600160a01b039687168152602081019590955260408501939093526060840191909152909216608082015260a081019190915260c00190565b6000806040838503121561499357600080fd5b505080516020909101519092909150565b6000806000606084860312156149b957600080fd5b8351925060208401519150604084015190509250925092565b6000602082840312156149e457600080fd5b81516144e7816143af565b600060208284031215614a0157600080fd5b81516144e78161466b565b60005b83811015614a27578181015183820152602001614a0f565b50506000910152565b60008251614a42818460208701614a0c565b9190910192915050565b6020815260008251806020840152614a6b816040850160208701614a0c565b601f01601f1916919091016040019291505056fea2646970667358221220bbdec15596cf3b219624098df4059c58ad3dbf0ed2d25f35a4e0c094f0a06fe564736f6c63430008140033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d0000000000000000000000008f8eb567a9f875180eed690dd231fd9619bb09a7000000000000000000000000edffbd7b6f6060e29b262681e9ff52d8772258c90000000000000000000000005843988dfa70805ea740c4af464468c05d73a869
-----Decoded View---------------
Arg [0] : _v2Factory (address): 0x5C69bEe701ef814a2B6a3EDD4B1652CB9cc5aA6f
Arg [1] : _v2Router (address): 0x7a250d5630B4cF539739dF2C5dAcb4c659F2488D
Arg [2] : _bonusPool (address): 0x8f8eb567a9f875180eED690Dd231fd9619bb09A7
Arg [3] : _rewardAddr (address): 0xedFfBd7B6F6060E29b262681E9ff52d8772258C9
Arg [4] : _JUMPToken (address): 0x5843988DFa70805Ea740c4af464468C05d73a869
-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000005c69bee701ef814a2b6a3edd4b1652cb9cc5aa6f
Arg [1] : 0000000000000000000000007a250d5630b4cf539739df2c5dacb4c659f2488d
Arg [2] : 0000000000000000000000008f8eb567a9f875180eed690dd231fd9619bb09a7
Arg [3] : 000000000000000000000000edffbd7b6f6060e29b262681e9ff52d8772258c9
Arg [4] : 0000000000000000000000005843988dfa70805ea740c4af464468c05d73a869
Loading...
Loading
Loading...
Loading
Net Worth in USD
$0.00
Net Worth in ETH
0
Multichain Portfolio | 33 Chains
| Chain | Token | Portfolio % | Price | Amount | Value |
|---|
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.