Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 1 from a total of 1 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Deploy | 10822978 | 3 days ago | IN | 0 S | 0.19380495 |
Latest 2 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
10822978 | 3 days ago | Contract Creation | 0 S | |||
10806683 | 3 days ago | Contract Creation | 0 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
DeployyyyerFactory
Compiler Version
v0.8.25+commit.b61c2a91
Optimization Enabled:
Yes with 800 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT /*********************************************************************************************\ * Deployyyyer Memes: https://deployyyyer.fun * Deployyyyer: https://deployyyyer.io * Twitter: https://x.com/deployyyyer * Telegram: https://t.me/Deployyyyer /*********************************************************************************************/ pragma solidity ^0.8.23; import {DeployyyyerToken} from "./DeployyyyerToken.sol"; interface IERC20 { function balanceOf(address owner) external view returns (uint); function transfer(address to, uint value) external returns (bool); } contract DeployyyyerFactory { address owner_; address taxWallet_; address teamFinanceLocker_; uint256 minLiq_; uint256 ethCost_; mapping(address => bool) validRouters_; mapping(address => address) launchedTokens_; event ContractDeployed(address owner, address childContract); struct ConstructorArgs { address owner; address taxwallet; address v2router; uint256 minLiq; address uniswapRouter; address sushiswapRouter; address pancakeswapRouter; address teamFinanceLocker; } struct TokParams { address owner; address token; bool isFree; bool isEthPaid; uint256 cost; string name; string symbol; uint256 supply; address router; } struct TokParamsExtra { address token; address taxWallet; uint256 maxBuyTax; uint256 maxSellTax; uint256 minBuyTax; uint256 minSellTax; uint256 lpTax; uint256 initTaxType; uint256 initInterval; uint256 countInterval; } event TokenLaunched(TokParams params); event TokenLaunchedExtra(TokParamsExtra params); event FactoryBuilt(string name, string symbol, uint256 supply); constructor(ConstructorArgs memory _args) { owner_ = _args.owner; taxWallet_ = payable(_args.taxwallet); teamFinanceLocker_ = _args.teamFinanceLocker; validRouters_[_args.v2router] = true; validRouters_[_args.uniswapRouter] = true; validRouters_[_args.sushiswapRouter] = true; validRouters_[_args.pancakeswapRouter] = true; minLiq_ = _args.minLiq; emit FactoryBuilt("Deployyyyer", "DEPLOY", 0); } /// @notice Set the address of the new owner of the contract /// @dev Set _newOwner to address(0) to renounce any ownership. /// @param _newOwner The address of the new owner of the contract function transferOwnership(address _newOwner) external { require(msg.sender == owner_); owner_ = _newOwner; } /// @notice Get the address of the owner /// @return _owner The address of the owner. function owner() external view returns (address _owner) { _owner = owner_; } function deploy(bytes32 _salt, DeployyyyerToken.InitParams memory params) public payable { require(msg.value == 0 || msg.value == ethCost_); require(params.owner == msg.sender, "1"); require(params.minLiq == minLiq_, "2"); require(params.teamFinanceLocker == teamFinanceLocker_, "3"); require(params.maxBuyTax >= params.minBuyTax && params.maxBuyTax <= 40, "6"); require(params.minBuyTax <= 6, "l"); require(params.maxSellTax >= params.minSellTax && params.maxSellTax <= 40, "k"); require(params.minSellTax <= 6, "j"); require(params.initTaxType <= 3, "i"); require(params.initInterval <= 7200, "h"); //2hours require(params.countInterval <= 100, "g"); require(params.lpTax <= 50); require(params.maxWallet > 0 && params.maxWallet <= 10000, "f"); require(params.maxTx > 0 && params.maxTx <= 10000, "e"); require(params.supply >= 1*10**18 && params.supply <= 1000000000000000*10**18, "d"); require(params.preventSwap <= 50, "c"); require(params.maxSwap >= params.supply/100 && params.maxSwap <= params.supply*2/100, "b"); //atleast 1% max 2% require(params.taxSwapThreshold >= params.supply/1000000 && params.taxSwapThreshold <= params.supply/1000, "a"); params.isFreeTier = true; if(msg.value > 0){ params.isFreeTier = false; } //isEth = false; //atleast 0.0001% max 0.1% DeployyyyerToken newContract = new DeployyyyerToken{salt: _salt}(params); launchedTokens_[address(newContract)] = msg.sender; emit ContractDeployed(msg.sender, address(newContract)); TokParams memory tokparams = TokParams({cost:0, owner:msg.sender, isFree:params.isFreeTier, isEthPaid:!params.isFreeTier, name: params.name, symbol: params.symbol, supply: params.supply, token: address(newContract), router: address(0)}); TokParamsExtra memory tokparamsx = TokParamsExtra({token: address(newContract), taxWallet: params.taxWallet, maxBuyTax: params.maxBuyTax, maxSellTax: params.maxSellTax, minBuyTax: params.minBuyTax, minSellTax: params.minSellTax, lpTax: params.lpTax, initTaxType: params.initTaxType, initInterval: params.initInterval, countInterval: params.countInterval}); emit TokenLaunched(tokparams); emit TokenLaunchedExtra(tokparamsx); } /// @notice add/remove routers to be supported /// @dev function changeValidRouters(address router, bool isSupported) public { require(msg.sender == owner_); require(router != address(0)); validRouters_[router] = isSupported; } /// @notice check if a router is valid /// @dev function isValidRouter(address router) external view returns (bool) { return(validRouters_[router]); } /// @notice check if a token is valid /// @dev function isValidToken(address token) external view returns (bool) { return(launchedTokens_[token] != address(0)); } /// @notice get Deployyyyer details like cost, minimum liquidity and team.finance locker address /// @dev function getLauncherDetails() public view returns (uint256, uint256, address) { return (ethCost_, minLiq_, teamFinanceLocker_); } function rescueERC20(address _address) external { require(IERC20(_address).transfer(owner_, IERC20(_address).balanceOf(address(this))), "x"); } /// @notice rescues ETH from the contract /// @dev sent to tax wallet function rescueEth() external { require(address(this).balance > 0, "y"); //s.taxWallet.transfer(address(this).balance); (bool stax, ) = taxWallet_.call{value: address(this).balance}(""); require(stax, "r"); } function setMinLiq(uint256 minLiq) external { require(msg.sender == owner_); minLiq_ = minLiq; } /// @notice receive receive() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address _owner) external view returns (uint256 balance); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool success); function transfer(address _to, uint256 _value) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed owner, address indexed spender, uint256 value); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.23; interface IStaking { struct StakingParams { address owner; uint256 withdrawTimeout; } struct StakingDetails { uint256 claimable; uint256 withdrawable; uint256 unstakedAmount; uint256 totalRewards; uint256 timeToWithdraw; uint256 stakedAmount; } function transferOwnership(address _newOwner) external; function owner() external view returns (address); function rescueERC20(address _address) external; function stake(uint256 _amount) external; function unstake(uint256 _amount) external; function restake() external; function withdraw() external; function claimRewards() external; //function refreshPool() external; function getUserDetails(address) external view returns (StakingDetails memory); }
// SPDX-License-Identifier: MIT /*********************************************************************************************\ * Deployyyyer Memes: https://deployyyyer.fun * Deployyyyer: https://deployyyyer.io * Twitter: https://x.com/deployyyyer * Telegram: https://t.me/Deployyyyer /*********************************************************************************************/ pragma solidity ^0.8.23; import {IStaking} from "../interfaces/IStaking.sol"; import {StakingPool} from "./StakingPool.sol"; library SafeCall { /** * @notice Perform a low level call without copying any returndata * * @param _target Address to call * @param _gas Amount of gas to pass to the call * @param _value Amount of value to pass to the call * @param _calldata Calldata to pass to the call */ function call( address _target, uint256 _gas, uint256 _value, bytes memory _calldata ) internal returns (bool) { bool _success; assembly { _success := call( _gas, // gas _target, // recipient _value, // ether value add(_calldata, 0x20), // inloc mload(_calldata), // inlen 0, // outloc 0 // outlen ) } return _success; } } interface IHelper { function isValidRouter(address router) external view returns (bool); } interface IERC20 { function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint256); function balanceOf(address _owner) external view returns (uint256 balance); function transferFrom( address _from, address _to, uint256 _value ) external returns (bool success); function transfer(address _to, uint256 _value) external returns (bool success); function approve(address _spender, uint256 _value) external returns (bool success); function allowance(address _owner, address _spender) external view returns (uint256 remaining); event Transfer(address indexed from, address indexed to, uint256 value); event Approval(address indexed ownerAddress, address indexed spender, uint256 value); } interface IUniswapV2Factory { function createPair(address tokenA, address tokenB) external returns (address pair); } interface IUniswapV2Router02 { function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external; function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); } interface ITeamFinanceLocker { function lockToken( address _tokenAddress, address _withdrawalAddress, uint256 _amount, uint256 _unlockTime, bool _mintNFT, address referrer ) external payable returns (uint256 _id); } /// @title DeployyyyerToken /// @notice Contains methods related to ERC20 /// @dev contract DeployyyyerToken is IERC20 { address owner_; uint256 minLiq; uint256 lockerId; address teamFinanceLocker; mapping(address => bool) isExTxLimit; //is excluded from transaction limit mapping(address => bool) isExWaLimit; //is excluded from wallet limit mapping (address => uint256) balances; //ERC20 balance mapping (address => mapping (address => uint256)) allowances; //ERC20 balance address payable taxWallet; //tax wallet for the token address payable deployyyyerCa; //deployyyyer contract address // Reduction Rules uint256 buyCount; uint256 initTaxType; //0-time,1-buyCount,2-hybrid,3-none //interval*1, lastIntEnd+(interval*2), lastIntEnd+(interval*3) uint256 initInterval; //seconds 0-1 hour(if 1m: 1m, 3m, 6m, 10m) uint256 countInterval; //0-100 //current taxes uint256 taxBuy; uint256 maxBuyTax; //40% uint256 minBuyTax; //0 uint256 taxSell; uint256 maxSellTax; //40% uint256 minSellTax; //0 uint256 tradingOpened; // Token Information uint8 decimals_; uint256 tTotal; string name_; string symbol_; // Contract Swap Rules uint256 lastSwapBlock; uint256 preventSwap; //50 uint256 taxSwapThreshold; //0.1% uint256 maxTaxSwap; //1% uint256 maxWallet; //1% uint256 maxTx; IUniswapV2Router02 uniswapV2Router; address uniswapV2Pair; bool tradingOpen; //true if liquidity pool is created bool inSwap; bool walletLimited; bool isFreeTier; bool isBurnt; bool isRetrieved; uint256 lockPeriod_; uint256 stakingShare; address stakingContract; uint256 lastSwap; bool liquidityOpen; uint256 halfLp; uint256 lpTax; event TradingEnabled(address pair, uint256 liq, uint256 lockPeriod, bool isBurnt, address router); event TaxMade(uint256 amount); event TaxGiven(uint256 amount); event StakingMade(uint256 amount); event ExternalLocked(uint256 id, uint256 lockPeriod); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); event IncreasedLimits(uint256 maxWallet, uint256 maxTx); event LockUpdated(uint256 ldays); event LockRetrieved(); event SocialsSet(string telegram, string twitter, string website); event LpBurnt(); event StakingLaunched(address stakingPool, address owner, uint256 share); event StakingShareIncreased(uint256 share); event StakingArgs(IStaking.StakingParams params); struct InitParams { address owner; address taxWallet; address teamFinanceLocker; uint256 minLiq; uint256 supply; uint256 initTaxType; //0-time,1-buyCount,2-hybrid uint256 initInterval; //seconds 0-1 hour(if 1m: 1m, 3m, 6m, 10m) uint256 countInterval; //0-100 uint256 maxBuyTax; //40% uint256 minBuyTax; //0 uint256 maxSellTax; //40% uint256 minSellTax; //0 uint256 lpTax; uint256 maxWallet; uint256 maxTx; uint256 preventSwap; uint256 maxSwap; uint256 taxSwapThreshold; string name; string symbol; bool isFreeTier; } struct LPDetails { address pair; uint256 buycount; uint256 taxBuy; uint256 taxSell; uint256 lockDays; bool isBurnt; uint256 tradingOpened; bool walletLimited; address stakingContract; //address(0) backward comp uint256 stakingShare; //external lock id here uint256 maxTx; uint256 maxWallet; address router; address presale; //address(0) backward comp } //reentrancy lock modifier lockTheSwap { inSwap = true; _; inSwap = false; } /// @notice Constructor of Diamond Proxy for a launched token constructor(InitParams memory params) { owner_ = params.owner; emit OwnershipTransferred(address(0), owner_); teamFinanceLocker = params.teamFinanceLocker; // adding ERC165 data deployyyyerCa = payable(msg.sender); minLiq = params.minLiq; taxBuy = params.maxBuyTax; //20% maxBuyTax = params.maxBuyTax; minBuyTax = params.minBuyTax; taxSell = params.maxSellTax; //20% maxSellTax = params.maxSellTax; minSellTax = params.minSellTax; lpTax = params.lpTax; initTaxType = params.initTaxType; initInterval = params.initInterval; countInterval = params.countInterval; // Reduction Rules buyCount = 0; isFreeTier = params.isFreeTier; // Token Information decimals_ = 18; taxWallet = payable(params.taxWallet); name_ = params.name; symbol_ = params.symbol; tTotal = params.supply; // Contract Swap Rules taxSwapThreshold = params.taxSwapThreshold; //0.1% maxTaxSwap = params.maxSwap; //1% walletLimited = true; maxWallet = tTotal * params.maxWallet / 10000; //1% (allow 1 - 100) maxTx = tTotal * params.maxTx / 10000; if (params.maxWallet == 10000 && params.maxTx == 10000) { walletLimited = false; } emit IncreasedLimits(params.maxWallet, params.maxTx); balances[address(this)] = tTotal; emit Transfer(address(0), address(this), tTotal); preventSwap = params.preventSwap; } /// @notice Create liquidity pool and start trading for the token /// @dev function startTrading(uint256 lockPeriod, bool shouldBurn, address router) external payable { require(msg.sender == owner_, "o"); require(!tradingOpen, "1"); require(address(this).balance >= minLiq, "2"); if(!shouldBurn) { require(lockPeriod >= 14); } tradingOpen = true; uint256 maxTxTemp = maxTx; uint256 maxWalletTemp = maxWallet; bool walletLimitedTemp = walletLimited; if(walletLimited == true) { maxTx = tTotal; maxWallet = tTotal; walletLimited = false; } isExTxLimit[address(this)] = true; isExTxLimit[owner_] = true; isExTxLimit[address(0x000000000000000000000000000000000000dEaD)] = true; isExWaLimit[address(this)] = true; isExWaLimit[owner_] = true; isExWaLimit[address(0x000000000000000000000000000000000000dEaD)] = true; //0x000000000000000000000000000000000000dEaD or address(0) address liqOwner = address(this); if(shouldBurn) { liqOwner = address(0); isBurnt = true; } else { lockPeriod_ = lockPeriod; isBurnt = false; } uint256 liqBalance = balances[address(this)]; tradingOpened = block.timestamp; require(IHelper(deployyyyerCa).isValidRouter(router)); uniswapV2Router = IUniswapV2Router02(router); allowances[address(this)][address(uniswapV2Router)] = tTotal; uniswapV2Pair = IUniswapV2Factory(uniswapV2Router.factory()).createPair(address(this), uniswapV2Router.WETH()); isExWaLimit[address(uniswapV2Pair)] = true; isExTxLimit[address(uniswapV2Pair)] = true; isExTxLimit[address(uniswapV2Router)] = true; isExWaLimit[address(uniswapV2Router)] = true; emit TradingEnabled(uniswapV2Pair, address(this).balance, lockPeriod_, shouldBurn, address(uniswapV2Router)); require(IERC20(uniswapV2Pair).approve(address(uniswapV2Router), type(uint).max), "3"); uniswapV2Router.addLiquidityETH{value: address(this).balance}(address(this),liqBalance,0,0,liqOwner,block.timestamp+60); liquidityOpen = true; if(walletLimitedTemp == true) { maxTx = maxTxTemp; maxWallet = maxWalletTemp; walletLimited = true; } } /* function lockOnTeamFinance(uint256 lps, bool ref) external payable { require(msg.sender == owner_ && isBurnt == false && isRetrieved == false && tradingOpen == true && lps >= 3600 * 24 * 14, "o"); //require(isBurnt == false && isRetrieved == false && tradingOpen == true, "lt"); //require(lps >= 3600 * 24 * 14, "ls"); uint256 lpBalance = IERC20(uniswapV2Pair).balanceOf(address(this)); IERC20(uniswapV2Pair).approve(teamFinanceLocker, lpBalance); lockerId = ITeamFinanceLocker(teamFinanceLocker).lockToken{value: msg.value}(uniswapV2Pair, msg.sender, lpBalance, block.timestamp + lps, false, ref?address(deployyyyerCa):address(0)); isRetrieved = true; emit ExternalLocked(lockerId, lps); //emit ExternalLocked(lockPeriodSec); } */ /// @notice Burn the liquidity pool tokens of the token function burnLP() external { require(msg.sender == owner_, "o"); require(!isBurnt && !isRetrieved && tradingOpen, "a"); isBurnt = true; emit LpBurnt(); require(IERC20(uniswapV2Pair).transfer(address(0x000000000000000000000000000000000000dEaD), IERC20( uniswapV2Pair).balanceOf(address(this))), "o2"); } /// @notice Get lp lock period remaining /// @return lpldays lock days remaining function getLockleft() private view returns (uint256) { if(!tradingOpen) { return 0; } //time traversed in days uint256 tt = ((block.timestamp - tradingOpened)/86400); if (tt > lockPeriod_) { return 0; } else { return lockPeriod_ - tt; } } /// @notice Extend LP lock /// @dev should not be already retrieved or burnt /// @param ldays no of days to extend function extendLock(uint256 ldays) external { require(msg.sender == owner_, "o"); require(!isRetrieved && !isBurnt && tradingOpen, "a"); //expired lock if((tradingOpened + (lockPeriod_*86400)) < block.timestamp) { lockPeriod_ = (block.timestamp - tradingOpened)/86400; } lockPeriod_ += ldays; emit LockUpdated(lockPeriod_); } /// @notice Retrieve LP tokens /// @dev should not be already retrieved or burnt function retrieveLock() external { require(msg.sender == owner_, "o"); require(!isRetrieved && !isBurnt && tradingOpen, "a"); if((tradingOpened + (lockPeriod_*60*60*24)) < block.timestamp) { isRetrieved = true; uint256 bal = IERC20(uniswapV2Pair).balanceOf(address(this)); emit LockRetrieved(); require(IERC20(uniswapV2Pair).transfer(msg.sender, bal), "b"); } } function increaseLimits(uint256 maxwallet, uint256 maxtx) external { require(msg.sender == owner_ && walletLimited, "o"); //require(walletLimited); require(tTotal * maxwallet / 10000 >= maxWallet && maxwallet <= 10000, "a"); require(tTotal * maxtx / 10000 >= maxTx && maxtx <= 10000, "b"); maxWallet = tTotal * maxwallet / 10000; maxTx = tTotal * maxtx / 10000; if (maxwallet == 10000 && maxtx == 10000) { walletLimited = false; } emit IncreasedLimits(maxwallet, maxtx); } ///@dev Returns the name of the token. function name() external view override returns (string memory) { return name_; } ///@dev Returns the symbol of the token, usually a shorter version of name. function symbol() external view override returns (string memory) { return symbol_; } ///@dev Returns the number of decimals used to get its user representation. function decimals() external view override returns (uint8) { return decimals_; } ///@dev Returns the value of tokens in existence. function totalSupply() public view override returns (uint256) { return tTotal; } ///@dev Returns the value of tokens owned by account. function balanceOf(address account) public view override returns (uint256) { return balances[account]; } ///@dev Moves a amount of tokens from the caller's account to receipient. function transfer(address recipient, uint256 amount) external override returns (bool) { _transfer(msg.sender, recipient, amount); return true; } ///@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 function allowance(address owner, address spender) external view override returns (uint256) { return allowances[owner][spender]; } /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's token * * 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 override returns (bool) { _approve(msg.sender, spender, amount); return true; } /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address sender, address recipient, uint256 amount) public override returns (bool) { require(amount <= allowances[sender][msg.sender], "25"); _approve(sender, msg.sender,allowances[sender][msg.sender] - amount); _transfer(sender, recipient, amount); return true; } function _approve(address _owner, address _spender, uint256 _amount) private { require(_owner != address(0)); require(_spender != address(0)); allowances[_owner][_spender] = _amount; emit Approval(_owner, _spender, _amount); } /// @notice sets tax for the trade /// @dev function _setTax(bool isBuy) private { uint256 maxTax; uint256 minTax; uint256 tax; if(isBuy) { maxTax = maxBuyTax; minTax = minBuyTax; tax = taxBuy; } else { maxTax = maxSellTax; minTax = minSellTax; tax = taxSell; } if(tax != minTax) { if(initTaxType == 0) { if (block.timestamp >= (tradingOpened + (initInterval))) { tax = minTax; } else if (block.timestamp >= (tradingOpened + (initInterval/2))) { tax = minTax + (maxTax - minTax)/4; } else if (block.timestamp >= (tradingOpened + (initInterval/4))) { tax = minTax + ((maxTax - minTax)/2); } else { tax = maxTax; } } else if(initTaxType == 1) { if (buyCount > (countInterval)) { tax = minTax; } else { tax = maxTax; } //this is forced after 2hrs if(block.timestamp >= (tradingOpened + 7200)) { tax = minTax; } } else if(initTaxType == 2){ if (buyCount > (countInterval) || block.timestamp >= (tradingOpened + (initInterval))) { tax = minTax; } else if (buyCount > (countInterval/2) || block.timestamp >= (tradingOpened + (initInterval/2))) { tax = minTax + (maxTax - minTax)/4; } else if (buyCount > (countInterval/4) || block.timestamp >= (tradingOpened + (initInterval/4))) { tax = minTax + ((maxTax - minTax)/2); } else { tax = maxTax; } // } else if( initTaxType == 3) { //check block number} } else { tax = minTax; } if(isBuy) { taxBuy = tax; } else { taxSell = tax; } } } /// @notice internal method of transfer /// @dev function _transfer(address from, address to, uint256 amount) private { require(from != address(0) && to != address(0)); //require(to != address(0)); //require(amount > 0); //compliance erc20 require(balances[from] >= amount, "66"); uint256 taxAmount=0; if (tradingOpen && walletLimited && !isExTxLimit[from] && !isExTxLimit[to]) require(maxTx >= amount, "30"); if (tradingOpen && walletLimited && !isExWaLimit[to]) require((balances[to] + amount) <= maxWallet, "31"); if (from != owner_ && to != owner_ && liquidityOpen == true) { if (from == uniswapV2Pair && to != address(uniswapV2Router)) { //buy from uniswap, only if amount > 0 buyCount++; _setTax(true); taxAmount = amount * taxBuy / 100; //console.log("_setTaxDone"); } if(to == uniswapV2Pair && from!= address(this)) { //sell from uniswap _setTax(false); taxAmount = amount * taxSell / 100; } } uint256 contractTokenBalance = balanceOf(address(this)); bool swapped = false; if (!inSwap && to == uniswapV2Pair && from!= address(this) && contractTokenBalance > 0 && buyCount > preventSwap) { //we swap only on sell to uniswap pool if(contractTokenBalance > taxSwapThreshold || ((block.timestamp - tradingOpened) > (86400) && minBuyTax == 0 && minSellTax == 0)) { if(block.number > lastSwapBlock) { if(contractTokenBalance < maxTaxSwap) { swapTokensForEth(contractTokenBalance); } else { swapTokensForEth(maxTaxSwap); } sendETHToFee(address(this).balance); swapped = true; lastSwapBlock = block.number; } } } if(taxAmount > 0) { balances[address(this)] = balances[address(this)] + (taxAmount); emit Transfer(from, address(this), taxAmount); } //from can be taxWallet balances[from] = balances[from] - amount; balances[to] = balances[to] + amount - taxAmount; emit Transfer(from, to, amount - taxAmount); if(swapped) { //everything else is taken care, anything left is for token's tax wallet //this call needs to be safe from reverts, consuming all gas and return bombs bool ttax = SafeCall.call(taxWallet, 100000, address(this).balance, ""); if(ttax) emit TaxMade(address(this).balance); } } /// @notice swaps tokens from tax into eth /// @dev this is nonrentrant using lockTheSwap function swapTokensForEth(uint256 tokenAmount) private lockTheSwap { address[] memory path = new address[](2); path[0] = address(this); path[1] = uniswapV2Router.WETH(); if(lpTax > 0) { halfLp = tokenAmount * lpTax / 200; tokenAmount -= halfLp; lastSwap = tokenAmount; } _approve(address(this), address(uniswapV2Router), tokenAmount); uniswapV2Router.swapExactTokensForETHSupportingFeeOnTransferTokens( tokenAmount, 0, path, address(this), block.timestamp ); } /// @notice sends the eth to respective tax wallets /// @dev function sendETHToFee(uint256 amount) private { uint256 da = 0; uint256 ethLpShare = 0; uint256 spshare = 0; uint256 halfLpTemp; //s.isFreeTier && if(isFreeTier == true && ((block.timestamp - tradingOpened) < (86400*90))) { da = amount * 10 / 100; emit TaxGiven(da); (bool stax, ) = deployyyyerCa.call{value: da}(""); require(stax, "99"); } if(lpTax > 0 && halfLp > 0) { //newly added liquidity is also locked //address liqOwner = address(this); //we should also be keeping half of lp in tokens, so that u add equal amount of eth and token to lp ethLpShare = halfLp * amount / lastSwap; halfLpTemp = halfLp; halfLp = 0; lastSwap = 0; _approve(address(this), address(uniswapV2Router), halfLpTemp); uniswapV2Router.addLiquidityETH{ value: ethLpShare }( address(this), halfLpTemp, 0, 0, address(this), block.timestamp + 60 ); } if(stakingContract != address(0)) { spshare = (amount - da - ethLpShare) * stakingShare / 100; //stakingContract is safe since its our own! (bool sent, ) = stakingContract.call{value: spshare}(""); require(sent, "s9"); emit StakingMade(spshare); } } /// @notice recovers eth to tax wallet if any /// @dev function recoverEth() private { //blocked while trading is disabled if(!inSwap && tradingOpen) { uint256 contractETHBalance = address(this).balance; if(contractETHBalance > 0) { sendETHToFee(contractETHBalance); (bool ttax, ) = taxWallet.call{value: address(this).balance}(""); if(ttax) emit TaxMade(address(this).balance); } } } /// @notice rescues any erc20 tokens sent to contract, also recovers eth to tax wallet if any /// @dev trying to rescue own token or own lp tokens will revert function rescueERC20(address _address) external { //block pulling out lp require(_address != uniswapV2Pair); require(_address != address(this)); require(IERC20(_address).transfer(taxWallet, IERC20(_address).balanceOf(address(this))), "r"); recoverEth(); } /// @notice Set the address of the new owner of the contract /// @param _newOwner The address of the new owner of the contract function transferOwnership(address _newOwner) external { require(msg.sender == owner_, "o"); emit OwnershipTransferred(owner_, _newOwner); //isExTxLimit[owner_] = false; //isExWaLimit[owner_] = false; owner_ = _newOwner; isExTxLimit[owner_] = true; isExWaLimit[owner_] = true; } /// @notice Get the address of the owner /// @return The address of the owner. function owner() public view returns (address) { //address _owner = owner_; return owner_; } /// @notice Get liquidity pool details of the token /// @return IOwnership.LPDetails /// @dev function getLPDetails() external view returns (LPDetails memory) { return LPDetails(uniswapV2Pair, buyCount, taxBuy, taxSell, getLockleft(), isBurnt, tradingOpened, walletLimited, stakingContract, stakingShare, maxTx, maxWallet, address(uniswapV2Router), address(0)); } /// @notice increase revenue share to staking pool for the token /// @dev function increaseStakingShare(uint256 share) external { require(msg.sender == owner_ && stakingShare > 0 && share > 0, "o"); //staking pool is live //require(stakingShare > 0 && share > 0); stakingShare += share; require(stakingShare <= 100, "os"); emit StakingShareIncreased(stakingShare); } /// @notice launch staking pool for the token /// @dev function launchStaking(uint256 share, IStaking.StakingParams memory params) external { require(msg.sender == owner_, "o"); require(stakingShare == 0 && share > 0 && share <= 100, "y"); //require(stakingShare == 0, "o12"); require(params.withdrawTimeout >= 2 days && params.withdrawTimeout < 10 days, "z"); stakingShare = share; params.owner = msg.sender; StakingPool stakingPool = new StakingPool(params); isExTxLimit[address(stakingPool)] = true; isExWaLimit[address(stakingPool)] = true; emit StakingLaunched(address(stakingPool), msg.sender, stakingShare); emit StakingArgs(params); stakingContract = payable(address(stakingPool)); } /// @notice receive eth receive() external payable {} }
// SPDX-License-Identifier: MIT /*********************************************************************************************\ * Deployyyyer Memes: https://deployyyyer.fun * Deployyyyer: https://deployyyyer.io * Twitter: https://x.com/deployyyyer * Telegram: https://t.me/Deployyyyer /*********************************************************************************************/ pragma solidity ^0.8.23; import "../interfaces/IStaking.sol"; import { IERC20 } from "../interfaces/IERC20.sol"; struct AppStorageStaking { address token; address owner; uint256 accRewardsPrecision; uint256 totalStakedAmount; uint256 withdrawTimeout; uint256 unallocatedETH; uint256 accRewardsPerShare; uint256 totalETHCollected; mapping(address => uint256) totalRewards; mapping(address => uint256) rewardDebt; mapping(address => uint256) stakedAmount; mapping(address => uint256) claimedAmount; mapping(address => uint256) claimableRewards; mapping(address => uint256) lastUnstakeTime; mapping(address => uint256) unstakedAmount; } contract Modifiers { AppStorageStaking internal s; } /// @title StakingPool /// @dev contract StakingPool is IStaking, Modifiers { event Stake(address indexed user, uint256 amount); event Unstake(address indexed user, uint256 amount); event Withdraw(address indexed user, uint256 amount); event ClaimRewards(address indexed user, uint256 amount); event RewardsReceived(address indexed sender, uint256 amount, uint256 accRewardsPerShare); //event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); constructor(IStaking.StakingParams memory params) { require(params.owner != address(0)); s.owner = params.owner; //init appStorage s.accRewardsPrecision = 1e18; s.token = msg.sender; s.withdrawTimeout = params.withdrawTimeout; } //tracking ownership in subgraph is not needed here, since ownership is unimportant /// @notice transfer ownership /// @dev function transferOwnership(address _newOwner) external override { require(msg.sender == s.owner); s.owner = _newOwner; } /// @notice return owner address /// @dev function owner() external override view returns (address owner_) { owner_ = s.owner; } /// @notice rescue erc20 tokens from the contract /// @dev function rescueERC20(address _address) external { //only use of owner: as the rescue wallet! bool ret = IERC20(_address).transfer(s.owner, IERC20(_address).balanceOf(address(this))); require(ret, "1"); } /// @notice stake tokens /// @dev function stake(uint256 _amount) external override { uint256 pending = 0; require(_amount > 0); if (s.stakedAmount[msg.sender] > 0) { pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender]; } uint256 unstakedAmount = s.unstakedAmount[msg.sender]; if (unstakedAmount >= _amount) { s.unstakedAmount[msg.sender] -= _amount; } else { uint256 tokensNeeded = _amount - unstakedAmount; s.unstakedAmount[msg.sender] = 0; //requires staking contract to be approved by user require(IERC20(s.token).transferFrom(msg.sender, address(this), tokensNeeded), "2"); } s.stakedAmount[msg.sender] += _amount; s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision; s.totalStakedAmount += _amount; if(pending > 0) { s.claimableRewards[msg.sender] += pending; } emit Stake(msg.sender, _amount); } /// @notice unstake staked tokens /// @dev function unstake(uint256 _amount) external override { require(_amount > 0 && s.stakedAmount[msg.sender] >= _amount, "3"); uint256 pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender]; s.stakedAmount[msg.sender] -= _amount; s.lastUnstakeTime[msg.sender] = block.timestamp; s.unstakedAmount[msg.sender] += _amount; s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision; s.totalStakedAmount -= _amount; if(pending > 0) { s.claimableRewards[msg.sender] += pending; } emit Unstake(msg.sender, _amount); } /// @notice restake unstaked tokens /// @dev function restake() external override { uint256 pending = 0; uint256 amountToRestake = s.unstakedAmount[msg.sender]; require(amountToRestake > 0, "4"); //allocateRewards(); if (s.stakedAmount[msg.sender] > 0) { pending = ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender]; } s.unstakedAmount[msg.sender] = 0; s.stakedAmount[msg.sender] += amountToRestake; s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision; s.totalStakedAmount += amountToRestake; if(pending > 0) { s.claimableRewards[msg.sender] += pending; } emit Stake(msg.sender, amountToRestake); } /// @notice withdraw unstaked tokens /// @dev function withdraw() external override { uint256 toWithdraw = s.unstakedAmount[msg.sender]; require(toWithdraw > 0, "5"); require(block.timestamp >= s.lastUnstakeTime[msg.sender] + s.withdrawTimeout, "6"); s.unstakedAmount[msg.sender] = 0; emit Withdraw(msg.sender, toWithdraw); require(IERC20(s.token).transfer(msg.sender, toWithdraw), "7"); } /// @notice claim rewards in eth /// @dev function claimRewards() external override { s.claimableRewards[msg.sender] += ((s.stakedAmount[msg.sender] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[msg.sender]; uint256 claimable = s.claimableRewards[msg.sender]; require(claimable > 0, "8"); s.rewardDebt[msg.sender] = s.stakedAmount[msg.sender] * s.accRewardsPerShare / s.accRewardsPrecision; uint256 amount = address(this).balance > claimable ? claimable : address(this).balance; s.claimableRewards[msg.sender] -= amount; s.claimedAmount[msg.sender] += amount; emit ClaimRewards(msg.sender, amount); (bool sent,) = payable(msg.sender).call{value: amount}(""); require(sent, "9"); } /// @notice get details related to the user /// @dev function getUserDetails(address _user) external view returns (IStaking.StakingDetails memory) { uint256 withdrawable = 0; uint256 timeToWithdraw = 0; uint256 claimable = s.claimableRewards[_user] + ((s.stakedAmount[_user] * s.accRewardsPerShare) / s.accRewardsPrecision) - s.rewardDebt[_user]; if (block.timestamp >= s.lastUnstakeTime[_user] + s.withdrawTimeout) { withdrawable = s.unstakedAmount[_user]; } else { timeToWithdraw = block.timestamp - s.lastUnstakeTime[_user] + s.withdrawTimeout; } return IStaking.StakingDetails(claimable, withdrawable, s.unstakedAmount[_user], s.totalRewards[_user], timeToWithdraw, s.stakedAmount[_user]); } /// @notice receive /// @dev staing rewards in eth, sets accRewardsPerShare receive() external payable { uint256 amount = msg.value; require(amount > 0, "r"); s.totalRewards[msg.sender] += amount; s.totalETHCollected += amount; if (s.totalStakedAmount == 0) { s.unallocatedETH += amount; } else { s.accRewardsPerShare += ((amount+s.unallocatedETH) * s.accRewardsPrecision) / s.totalStakedAmount; s.unallocatedETH = 0; } emit RewardsReceived(msg.sender, amount, s.accRewardsPerShare); } }
{ "optimizer": { "enabled": true, "runs": 800 }, "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":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"taxwallet","type":"address"},{"internalType":"address","name":"v2router","type":"address"},{"internalType":"uint256","name":"minLiq","type":"uint256"},{"internalType":"address","name":"uniswapRouter","type":"address"},{"internalType":"address","name":"sushiswapRouter","type":"address"},{"internalType":"address","name":"pancakeswapRouter","type":"address"},{"internalType":"address","name":"teamFinanceLocker","type":"address"}],"internalType":"struct DeployyyyerFactory.ConstructorArgs","name":"_args","type":"tuple"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"address","name":"childContract","type":"address"}],"name":"ContractDeployed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"name","type":"string"},{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"uint256","name":"supply","type":"uint256"}],"name":"FactoryBuilt","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"isFree","type":"bool"},{"internalType":"bool","name":"isEthPaid","type":"bool"},{"internalType":"uint256","name":"cost","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"address","name":"router","type":"address"}],"indexed":false,"internalType":"struct DeployyyyerFactory.TokParams","name":"params","type":"tuple"}],"name":"TokenLaunched","type":"event"},{"anonymous":false,"inputs":[{"components":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"taxWallet","type":"address"},{"internalType":"uint256","name":"maxBuyTax","type":"uint256"},{"internalType":"uint256","name":"maxSellTax","type":"uint256"},{"internalType":"uint256","name":"minBuyTax","type":"uint256"},{"internalType":"uint256","name":"minSellTax","type":"uint256"},{"internalType":"uint256","name":"lpTax","type":"uint256"},{"internalType":"uint256","name":"initTaxType","type":"uint256"},{"internalType":"uint256","name":"initInterval","type":"uint256"},{"internalType":"uint256","name":"countInterval","type":"uint256"}],"indexed":false,"internalType":"struct DeployyyyerFactory.TokParamsExtra","name":"params","type":"tuple"}],"name":"TokenLaunchedExtra","type":"event"},{"inputs":[{"internalType":"address","name":"router","type":"address"},{"internalType":"bool","name":"isSupported","type":"bool"}],"name":"changeValidRouters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_salt","type":"bytes32"},{"components":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"taxWallet","type":"address"},{"internalType":"address","name":"teamFinanceLocker","type":"address"},{"internalType":"uint256","name":"minLiq","type":"uint256"},{"internalType":"uint256","name":"supply","type":"uint256"},{"internalType":"uint256","name":"initTaxType","type":"uint256"},{"internalType":"uint256","name":"initInterval","type":"uint256"},{"internalType":"uint256","name":"countInterval","type":"uint256"},{"internalType":"uint256","name":"maxBuyTax","type":"uint256"},{"internalType":"uint256","name":"minBuyTax","type":"uint256"},{"internalType":"uint256","name":"maxSellTax","type":"uint256"},{"internalType":"uint256","name":"minSellTax","type":"uint256"},{"internalType":"uint256","name":"lpTax","type":"uint256"},{"internalType":"uint256","name":"maxWallet","type":"uint256"},{"internalType":"uint256","name":"maxTx","type":"uint256"},{"internalType":"uint256","name":"preventSwap","type":"uint256"},{"internalType":"uint256","name":"maxSwap","type":"uint256"},{"internalType":"uint256","name":"taxSwapThreshold","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"bool","name":"isFreeTier","type":"bool"}],"internalType":"struct DeployyyyerToken.InitParams","name":"params","type":"tuple"}],"name":"deploy","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"getLauncherDetails","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"router","type":"address"}],"name":"isValidRouter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"isValidToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"rescueERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"rescueEth","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"minLiq","type":"uint256"}],"name":"setMinLiq","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608060405234801561001057600080fd5b50604051615a7d380380615a7d83398101604081905261002f9161017d565b8051600080546001600160a01b039283166001600160a01b03199182161782556020808501516001805491861691841691909117815560e0860151600280549187169190941617909255604080860151851684526005909152808320805460ff199081168417909155608086015185168452818420805482168417905560a086015185168452818420805482168417905560c086015190941683528083208054909416909117909255606083015160035590517fe28fd1bead94852c1ee968d92f0d870ec63780bcdd79d68c7d990619ab42210c91610153916060808252600b908201526a2232b83637bcbcbcbcb2b960a91b608082015260a060208201819052600690820152654445504c4f5960d01b60c0820152604081019190915260e00190565b60405180910390a150610248565b80516001600160a01b038116811461017857600080fd5b919050565b600061010080838503121561019157600080fd5b604051908101906001600160401b03821181831017156101c157634e487b7160e01b600052604160045260246000fd5b816040526101ce84610161565b81526101dc60208501610161565b60208201526101ed60408501610161565b60408201526060840151606082015261020860808501610161565b608082015261021960a08501610161565b60a082015261022a60c08501610161565b60c082015261023b60e08501610161565b60e0820152949350505050565b615826806102576000396000f3fe6080604052600436106100b55760003560e01c8063c187645311610069578063ce31a06b1161004e578063ce31a06b14610201578063f2fde38b14610216578063f39bb7d21461023657600080fd5b8063c1876453146101a6578063ccec3716146101e157600080fd5b80638da5cb5b1161009a5780638da5cb5b14610115578063a99266471461013d578063b9efb9bf1461018657600080fd5b8063353a9e71146100c15780636bb185d81461010057600080fd5b366100bc57005b600080fd5b3480156100cd57600080fd5b506004546003546002546040805193845260208401929092526001600160a01b0316908201526060015b60405180910390f35b61011361010e366004610d06565b610256565b005b34801561012157600080fd5b506000546040516001600160a01b0390911681526020016100f7565b34801561014957600080fd5b50610176610158366004610e8f565b6001600160a01b031660009081526005602052604090205460ff1690565b60405190151581526020016100f7565b34801561019257600080fd5b506101136101a1366004610eb1565b610954565b3480156101b257600080fd5b506101766101c1366004610e8f565b6001600160a01b0390811660009081526006602052604090205416151590565b3480156101ed57600080fd5b506101136101fc366004610e8f565b610970565b34801561020d57600080fd5b50610113610aa1565b34801561022257600080fd5b50610113610231366004610e8f565b610b5c565b34801561024257600080fd5b50610113610251366004610eca565b610ba2565b341580610264575060045434145b61026d57600080fd5b80516001600160a01b031633146102af5760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064015b60405180910390fd5b6003548160600151146102e85760405162461bcd60e51b81526020600482015260016024820152601960f91b60448201526064016102a6565b60025460408201516001600160a01b0390811691161461032e5760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064016102a6565b8061012001518161010001511015801561034e5750602881610100015111155b61037e5760405162461bcd60e51b81526020600482015260016024820152601b60f91b60448201526064016102a6565b600681610120015111156103b85760405162461bcd60e51b81526020600482015260016024820152601b60fa1b60448201526064016102a6565b806101600151816101400151101580156103d85750602881610140015111155b6104085760405162461bcd60e51b81526020600482015260016024820152606b60f81b60448201526064016102a6565b600681610160015111156104425760405162461bcd60e51b81526020600482015260016024820152603560f91b60448201526064016102a6565b60038160a00151111561047b5760405162461bcd60e51b81526020600482015260016024820152606960f81b60448201526064016102a6565b611c208160c0015111156104b55760405162461bcd60e51b81526020600482015260016024820152600d60fb1b60448201526064016102a6565b60648160e0015111156104ee5760405162461bcd60e51b81526020600482015260016024820152606760f81b60448201526064016102a6565b6032816101800151111561050157600080fd5b6000816101a0015111801561051d5750612710816101a0015111155b61054d5760405162461bcd60e51b81526020600482015260016024820152603360f91b60448201526064016102a6565b6000816101c001511180156105695750612710816101c0015111155b6105995760405162461bcd60e51b81526020600482015260016024820152606560f81b60448201526064016102a6565b670de0b6b3a76400008160800151101580156105c757506d314dc6448d9338c15b0a00000000816080015111155b6105f75760405162461bcd60e51b81526020600482015260016024820152601960fa1b60448201526064016102a6565b6032816101e0015111156106315760405162461bcd60e51b81526020600482015260016024820152606360f81b60448201526064016102a6565b606481608001516106429190610f01565b8161020001511015801561067757506064816080015160026106649190610f23565b61066e9190610f01565b81610200015111155b6106a75760405162461bcd60e51b81526020600482015260016024820152603160f91b60448201526064016102a6565b620f424081608001516106ba9190610f01565b816102200151101580156106e457506103e881608001516106db9190610f01565b81610220015111155b6107145760405162461bcd60e51b81526020600482015260016024820152606160f81b60448201526064016102a6565b6001610280820152341561072b5760006102808201525b6000828260405161073b90610bf7565b6107459190610f94565b8190604051809103906000f5905080158015610765573d6000803e3d6000fd5b506001600160a01b038116600081815260066020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff1916339081179091558251908152908101929092529192507f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688910160405180910390a16000604051806101200160405280336001600160a01b03168152602001836001600160a01b0316815260200184610280015115158152602001846102800151151515815260200160008152602001846102400151815260200184610260015181526020018460800151815260200160006001600160a01b031681525090506000604051806101400160405280846001600160a01b0316815260200185602001516001600160a01b03168152602001856101000151815260200185610140015181526020018561012001518152602001856101600151815260200185610180015181526020018560a0015181526020018560c0015181526020018560e0015181525090507f05801121ffc1080c74d11ce5f437ed5f77b1014c00f7e1b8bb6cd899ad1f95048260405161090e91906110f9565b60405180910390a17f6789ae7431eb646c5e4f10cf3a38e4597b460ba0bc7629611376bbb0b4491a6c8160405161094591906111b9565b60405180910390a15050505050565b6000546001600160a01b0316331461096b57600080fd5b600355565b6000546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e79190611240565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6e9190611259565b610a9e5760405162461bcd60e51b81526020600482015260016024820152600f60fb1b60448201526064016102a6565b50565b60004711610ad55760405162461bcd60e51b81526020600482015260016024820152607960f81b60448201526064016102a6565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610b22576040519150601f19603f3d011682016040523d82523d6000602084013e610b27565b606091505b5050905080610a9e5760405162461bcd60e51b81526020600482015260016024820152603960f91b60448201526064016102a6565b6000546001600160a01b03163314610b7357600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610bb957600080fd5b6001600160a01b038216610bcc57600080fd5b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b61457a8061127783390190565b634e487b7160e01b600052604160045260246000fd5b6040516102a0810167ffffffffffffffff81118282101715610c3e57610c3e610c04565b60405290565b80356001600160a01b0381168114610c5b57600080fd5b919050565b600082601f830112610c7157600080fd5b813567ffffffffffffffff80821115610c8c57610c8c610c04565b604051601f8301601f19908116603f01168101908282118183101715610cb457610cb4610c04565b81604052838152866020858801011115610ccd57600080fd5b836020870160208301376000602085830101528094505050505092915050565b8015158114610a9e57600080fd5b8035610c5b81610ced565b60008060408385031215610d1957600080fd5b82359150602083013567ffffffffffffffff80821115610d3857600080fd5b908401906102a08287031215610d4d57600080fd5b610d55610c1a565b610d5e83610c44565b8152610d6c60208401610c44565b6020820152610d7d60408401610c44565b6040820152606083810135908201526080808401359082015260a0808401359082015260c0808401359082015260e08084013590820152610100808401359082015261012080840135908201526101408084013590820152610160808401359082015261018080840135908201526101a080840135908201526101c080840135908201526101e08084013590820152610200808401359082015261022080840135908201526102408084013583811115610e3657600080fd5b610e4289828701610c60565b8284015250506102608084013583811115610e5c57600080fd5b610e6889828701610c60565b8284015250506102809150610e7e828401610cfb565b828201528093505050509250929050565b600060208284031215610ea157600080fd5b610eaa82610c44565b9392505050565b600060208284031215610ec357600080fd5b5035919050565b60008060408385031215610edd57600080fd5b610ee683610c44565b91506020830135610ef681610ced565b809150509250929050565b600082610f1e57634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610f4857634e487b7160e01b600052601160045260246000fd5b92915050565b6000815180845260005b81811015610f7457602081850181015186830182015201610f58565b506000602082860101526020601f19601f83011685010191505092915050565b60208152610fae6020820183516001600160a01b03169052565b60006020830151610fca60408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015160808381019190915283015160a08084019190915283015160c08084019190915283015160e08084019190915283015161010080840191909152830151610120808401919091528301516101408084019190915283015161016080840191909152830151610180808401919091528301516101a0808401919091528301516101c0808401919091528301516101e0808401919091528301516102008084019190915283015161022080840191909152830151610240808401919091528301516102a06102608085018290526110be6102c0860184610f4e565b9250808601519050610280601f1986850301818701526110de8483610f4e565b908701518015158785015290935090505b5090949350505050565b602081526111136020820183516001600160a01b03169052565b6000602083015161112f60408401826001600160a01b03169052565b5060408301518015156060840152506060830151801515608084015250608083015160a083015260a08301516101208060c0850152611172610140850183610f4e565b915060c0850151601f198584030160e086015261118f8382610f4e565b60e0870151610100878101919091528701516001600160a01b0381168488015290935090506110ef565b81516001600160a01b03168152610140810160208301516111e560208401826001600160a01b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525092915050565b60006020828403121561125257600080fd5b5051919050565b60006020828403121561126b57600080fd5b8151610eaa81610ced56fe608060405234801561001057600080fd5b5060405161457a38038061457a83398101604081905261002f916103d0565b8051600080546001600160a01b0319166001600160a01b0390921691821781556040517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36040810151600380546001600160a01b039283166001600160a01b031991821617909155600980548216331790556060830151600155610100830151600e819055600f556101208301516010556101408301516011819055601290815561016084015160135561018084015160275560a0840151600b5560c0840151600c5560e0840151600d556000600a5561028084015160208054911515600160b81b0260ff60b81b199092169190911781556015805460ff19169092179091558301516008805491909316911617905561024081015160179061015690826105d9565b5061026081015160189061016a90826105d9565b5060808101516016819055610220820151601b55610200820151601c556020805460ff60b01b1916600160b01b1790556101a0820151612710916101ae9190610698565b6101b891906106c3565b601d556101c0810151601654612710916101d191610698565b6101db91906106c3565b601e556101a08101516127101480156101fa5750806101c00151612710145b1561020d576020805460ff60b01b191690555b7f3e470cf1ec3767d0209f5128c840997ff9b70dfe0da263b3f94eb114a05d9327816101a00151826101c00151604051610251929190918252602082015260400190565b60405180910390a160165430600081815260066020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36101e00151601a556106e5565b634e487b7160e01b600052604160045260246000fd5b6040516102a081016001600160401b03811182821017156102ea576102ea6102b1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610318576103186102b1565b604052919050565b80516001600160a01b038116811461033757600080fd5b919050565b600082601f83011261034d57600080fd5b81516001600160401b03811115610366576103666102b1565b602061037a601f8301601f191682016102f0565b828152858284870101111561038e57600080fd5b60005b838110156103ac578581018301518282018401528201610391565b506000928101909101919091529392505050565b8051801515811461033757600080fd5b6000602082840312156103e257600080fd5b81516001600160401b03808211156103f957600080fd5b908301906102a0828603121561040e57600080fd5b6104166102c7565b61041f83610320565b815261042d60208401610320565b602082015261043e60408401610320565b6040820152606083810151908201526080808401519082015260a0808401519082015260c0808401519082015260e08084015190820152610100808401519082015261012080840151908201526101408084015190820152610160808401519082015261018080840151908201526101a080840151908201526101c080840151908201526101e080840151908201526102008084015190820152610220808401519082015261024080840151838111156104f757600080fd5b6105038882870161033c565b828401525050610260808401518381111561051d57600080fd5b6105298882870161033c565b828401525050610280915061053f8284016103c0565b91810191909152949350505050565b600181811c9082168061056257607f821691505b60208210810361058257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156105d4576000816000526020600020601f850160051c810160208610156105b15750805b601f850160051c820191505b818110156105d0578281556001016105bd565b5050505b505050565b81516001600160401b038111156105f2576105f26102b1565b61060681610600845461054e565b84610588565b602080601f83116001811461063b57600084156106235750858301515b600019600386901b1c1916600185901b1785556105d0565b600085815260208120601f198616915b8281101561066a5788860151825594840194600190910190840161064b565b50858210156106885787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820281158282048414176106bd57634e487b7160e01b600052601160045260246000fd5b92915050565b6000826106e057634e487b7160e01b600052601260045260246000fd5b500490565b613e86806106f46000396000f3fe6080604052600436106101635760003560e01c806370a08231116100c0578063af66394d11610074578063db7c4dda11610059578063db7c4dda146103ac578063dd62ed3e146103bf578063f2fde38b1461040557600080fd5b8063af66394d1461036c578063ccec37161461038c57600080fd5b80638da5cb5b116100a55780638da5cb5b1461030f57806395d89b4114610337578063a9059cbb1461034c57600080fd5b806370a08231146102b957806378f8484b146102ef57600080fd5b806323b872dd1161011757806344ee3a1c116100fc57806344ee3a1c146102625780634839c8b3146102825780635c89dfe11461029757600080fd5b806323b872dd14610220578063313ce5671461024057600080fd5b80630b45260e116101485780630b45260e146101ca57806318160ddd146101e157806320ffb26d1461020057600080fd5b806306fdde031461016f578063095ea7b31461019a57600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b50610184610425565b6040516101919190612816565b60405180910390f35b3480156101a657600080fd5b506101ba6101b536600461287a565b6104b7565b6040519015158152602001610191565b3480156101d657600080fd5b506101df6104ce565b005b3480156101ed57600080fd5b506016545b604051908152602001610191565b34801561020c57600080fd5b506101df61021b3660046128a6565b6106d0565b34801561022c57600080fd5b506101ba61023b3660046128bf565b6107b5565b34801561024c57600080fd5b5060155460405160ff9091168152602001610191565b34801561026e57600080fd5b506101df61027d3660046128a6565b61085d565b34801561028e57600080fd5b506101df610993565b3480156102a357600080fd5b506102ac610be1565b6040516101919190612900565b3480156102c557600080fd5b506101f26102d43660046129c6565b6001600160a01b031660009081526006602052604090205490565b3480156102fb57600080fd5b506101df61030a3660046129ea565b610d2e565b34801561031b57600080fd5b506000546040516001600160a01b039091168152602001610191565b34801561034357600080fd5b50610184610edd565b34801561035857600080fd5b506101ba61036736600461287a565b610eec565b34801561037857600080fd5b506101df610387366004612a0c565b610ef9565b34801561039857600080fd5b506101df6103a73660046129c6565b61110d565b6101df6103ba366004612a9c565b61125b565b3480156103cb57600080fd5b506101f26103da366004612ade565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b34801561041157600080fd5b506101df6104203660046129c6565b61190c565b60606017805461043490612b17565b80601f016020809104026020016040519081016040528092919081815260200182805461046090612b17565b80156104ad5780601f10610482576101008083540402835291602001916104ad565b820191906000526020600020905b81548152906001019060200180831161049057829003601f168201915b5050505050905090565b60006104c43384846119d8565b5060015b92915050565b6000546001600160a01b031633146105115760405162461bcd60e51b81526020600482015260016024820152606f60f81b60448201526064015b60405180910390fd5b602054600160c01b900460ff161580156105355750602054600160c81b900460ff16155b801561054a5750602054600160a01b900460ff165b61057a5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b6020805460ff60c01b1916600160c01b1790556040517fc43e780723fe0e2a85c0bd4291955d83cac42c6036fd8bf58b10463d3f9f1ae890600090a16020546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb9061dead9083906370a0823190602401602060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e9190612b51565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069d9190612b6a565b6106ce5760405162461bcd60e51b8152602060048201526002602482015261379960f11b6044820152606401610508565b565b6000546001600160a01b0316331480156106ec57506000602254115b80156106f85750600081115b6107285760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b806022600082825461073a9190612b9d565b9091555050602254606410156107775760405162461bcd60e51b81526020600482015260026024820152616f7360f01b6044820152606401610508565b7fcc5d343fa3728e63489d08b6f42d710f12e9126dec83f9b9a9fa74b7e54d22416022546040516107aa91815260200190565b60405180910390a150565b6001600160a01b038316600090815260076020908152604080832033845290915281205482111561080d5760405162461bcd60e51b8152602060048201526002602482015261323560f01b6044820152606401610508565b6001600160a01b038416600090815260076020908152604080832033808552925290912054610848918691610843908690612bb0565b6119d8565b610853848484611a5f565b5060019392505050565b6000546001600160a01b0316331461089b5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160c81b900460ff161580156108bf5750602054600160c01b900460ff16155b80156108d45750602054600160a01b900460ff165b6109045760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b42602154620151806109169190612bc3565b6014546109239190612b9d565b101561094957620151806014544261093b9190612bb0565b6109459190612bda565b6021555b806021600082825461095b9190612b9d565b90915550506021546040519081527fa7b24c66dd3269a292a60b3facdbb8f3e7557d1e19e64d99e0d6ee7250be63ad906020016107aa565b6000546001600160a01b031633146109d15760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160c81b900460ff161580156109f55750602054600160c01b900460ff16155b8015610a0a5750602054600160a01b900460ff165b610a3a5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b42602154603c610a4a9190612bc3565b610a5590603c612bc3565b610a60906018612bc3565b601454610a6d9190612b9d565b10156106ce5760208054600160c81b7fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff8216179091556040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d9190612b51565b6040519091507faf0fe1663cb7e005c807c426024d6b7bedd6fea7b9df02852418932d71cd78bd90600090a160205460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610b8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bae9190612b6a565b610bde5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610508565b50565b610c7b604051806101c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604080516101c081018252602080546001600160a01b03168252600a5490820152600e5491810191909152601154606082015260808101610cba611fca565b81526020805460ff600160c01b820481161515928401929092526014546040840152600160b01b900416151560608201526023546001600160a01b03908116608083015260225460a0830152601e5460c0830152601d5460e0830152601f5416610100820152600061012090910152919050565b6000546001600160a01b031633148015610d515750602054600160b01b900460ff165b610d815760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b601d5461271083601654610d959190612bc3565b610d9f9190612bda565b10158015610daf57506127108211155b610ddf5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b601e5461271082601654610df39190612bc3565b610dfd9190612bda565b10158015610e0d57506127108111155b610e3d5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610508565b61271082601654610e4e9190612bc3565b610e589190612bda565b601d5560165461271090610e6d908390612bc3565b610e779190612bda565b601e5561271082148015610e8c575080612710145b15610e9f576020805460ff60b01b191690555b60408051838152602081018390527f3e470cf1ec3767d0209f5128c840997ff9b70dfe0da263b3f94eb114a05d932791015b60405180910390a15050565b60606018805461043490612b17565b60006104c4338484611a5f565b6000546001600160a01b03163314610f375760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602254158015610f475750600082115b8015610f54575060648211155b610f845760405162461bcd60e51b81526020600482015260016024820152607960f81b6044820152606401610508565b6202a300816020015110158015610fa15750620d2f008160200151105b610fd15760405162461bcd60e51b81526020600482015260016024820152603d60f91b6044820152606401610508565b60228290553381526040516000908290610fea90612809565b81516001600160a01b0316815260209182015191810191909152604001604051809103906000f080158015611023573d6000803e3d6000fd5b506001600160a01b03811660008181526004602090815260408083208054600160ff199182168117909255600584529382902080549094161790925560225482519384523391840191909152908201529091507fc718bf738f6d7cb0af735b17552ef9e5f1857d1719d7f882b8780ea2f08b3e7f9060600160405180910390a16040805183516001600160a01b03168152602080850151908201527f8bdc63644658897d37c2cff731dd7a8898394f85b3c9d9b4b7879390385d4c26910160405180910390a1602380546001600160a01b0319166001600160a01b03929092169190911790555050565b6020546001600160a01b039081169082160361112857600080fd5b306001600160a01b0382160361113d57600080fd5b6008546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b49190612b51565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190612b6a565b6112535760405162461bcd60e51b81526020600482015260016024820152603960f91b6044820152606401610508565b610bde61202a565b6000546001600160a01b031633146112995760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160a01b900460ff16156112d75760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610508565b60015447101561130d5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610508565b8161132057600e83101561132057600080fd5b602080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790819055601e54601d549091600160b01b900460ff1680151560010361138557601654601e819055601d556020805460ff60b01b191690555b3060008181526004602090815260408083208054600160ff19918216811790925584546001600160a01b03908116865283862080548316841790557f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd80548316841790558686526005909452828520805482168317905584549093168452908320805483168217905561dead9092527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80549091169091179055851561146057506020805460ff60c01b1916600160c01b1790556000611473565b60218790556020805460ff60c01b191690555b30600090815260066020526040908190205442601455600954915163a992664760e01b81526001600160a01b0388811660048301529192919091169063a992664790602401602060405180830381865afa1580156114d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f99190612b6a565b61150257600080fd5b601f80546001600160a01b0319166001600160a01b03888116918217835560165430600090815260076020908152604080832095835294815290849020919091559254825163c45a015560e01b8152925191169263c45a015592600480820193918290030181865afa15801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a09190612bfc565b6001600160a01b031663c9c6539630601f60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116269190612bfc565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116979190612bfc565b602080546001600160a01b0319166001600160a01b039283169081178255600090815260058083526040808320805460ff199081166001908117909255855487168552600486528285208054821683179055601f80548816865283862080548316841790558054881686529386529382902080549094161790925582546021549154835191861682524794820194909452918201528915156060820152911660808201527f0157a1a09a393e0b2567e699c9fafaa987dd8440f4b66795e9667d8749d7239e9060a00160405180910390a1602054601f5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156117be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e29190612b6a565b6118125760405162461bcd60e51b81526020600482015260016024820152603360f81b6044820152606401610508565b601f546001600160a01b031663f305d7194730846000808861183542603c612b9d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156118a2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118c79190612c19565b50506025805460ff191660019081179091558415159003905061190257601e859055601d8490556020805460ff60b01b1916600160b01b1790555b5050505050505050565b6000546001600160a01b0316331461194a5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392831690811782558152600460209081526040808320805460ff1990811660019081179092558454909516845260059092529091208054909216179055565b6001600160a01b0383166119eb57600080fd5b6001600160a01b0382166119fe57600080fd5b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831615801590611a7f57506001600160a01b03821615155b611a8857600080fd5b6001600160a01b038316600090815260066020526040902054811115611ad55760405162461bcd60e51b81526020600482015260026024820152611b1b60f11b6044820152606401610508565b602054600090600160a01b900460ff168015611afa5750602054600160b01b900460ff165b8015611b1f57506001600160a01b03841660009081526004602052604090205460ff16155b8015611b4457506001600160a01b03831660009081526004602052604090205460ff16155b15611b805781601e541015611b805760405162461bcd60e51b8152602060048201526002602482015261033360f41b6044820152606401610508565b602054600160a01b900460ff168015611ba25750602054600160b01b900460ff165b8015611bc757506001600160a01b03831660009081526005602052604090205460ff16155b15611c2657601d546001600160a01b038416600090815260066020526040902054611bf3908490612b9d565b1115611c265760405162461bcd60e51b8152602060048201526002602482015261333160f01b6044820152606401610508565b6000546001600160a01b03858116911614801590611c5257506000546001600160a01b03848116911614155b8015611c65575060255460ff1615156001145b15611d28576020546001600160a01b038581169116148015611c955750601f546001600160a01b03848116911614155b15611cd657600a8054906000611caa83612c47565b9190505550611cb960016120f2565b6064600e5483611cc99190612bc3565b611cd39190612bda565b90505b6020546001600160a01b038481169116148015611cfc57506001600160a01b0384163014155b15611d2857611d0b60006120f2565b606460115483611d1b9190612bc3565b611d259190612bda565b90505b30600090815260066020526040812054602054909150600090600160a81b900460ff16158015611d6557506020546001600160a01b038681169116145b8015611d7a57506001600160a01b0386163014155b8015611d865750600082115b8015611d955750601a54600a54115b15611e1357601b54821180611dd057506201518060145442611db79190612bb0565b118015611dc45750601054155b8015611dd05750601354155b15611e1357601954431115611e1357601c54821015611df757611df2826122f4565b611e02565b611e02601c546122f4565b611e0b476124b3565b504360195560015b8215611e8e5730600090815260066020526040902054611e34908490612b9d565b30600081815260066020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e859087815260200190565b60405180910390a35b6001600160a01b038616600090815260066020526040902054611eb2908590612bb0565b6001600160a01b0380881660009081526006602052604080822093909355908716815220548390611ee4908690612b9d565b611eee9190612bb0565b6001600160a01b0380871660008181526006602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611f388688612bb0565b60405190815260200160405180910390a38015611fc2576000611f84600860009054906101000a90046001600160a01b0316620186a047604051806020016040528060008152506127ef565b90508015611fc0576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb9060200160405180910390a15b505b505050505050565b602054600090600160a01b900460ff16611fe45750600090565b60006201518060145442611ff89190612bb0565b6120029190612bda565b905060215481111561201657600091505090565b806021546120249190612bb0565b91505090565b602054600160a81b900460ff1615801561204d5750602054600160a01b900460ff165b156106ce57478015610bde57612062816124b3565b6008546040516000916001600160a01b03169047908381818185875af1925050503d80600081146120af576040519150601f19603f3d011682016040523d82523d6000602084013e6120b4565b606091505b5050905080156120ee576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb90602001610ed1565b5050565b6000806000831561211157600f5492506010549150600e549050612121565b6012549250601354915060115490505b8181146122ee57600b546000036121ce57600c546014546121429190612b9d565b421061214f5750806122d8565b6002600c5461215e9190612bda565b60145461216b9190612b9d565b421061219857600461217d8385612bb0565b6121879190612bda565b6121919083612b9d565b90506122d8565b6004600c546121a79190612bda565b6014546121b49190612b9d565b42106121c657600261217d8385612bb0565b50815b6122d8565b600b5460010361220a57600d54600a5411156121eb5750806121ee565b50815b6014546121fd90611c20612b9d565b42106121c95750806122d8565b600b546002036122d557600d54600a5411806122355750600c546014546122319190612b9d565b4210155b156122415750806122d8565b6002600d546122509190612bda565b600a54118061227a57506002600c546122699190612bda565b6014546122769190612b9d565b4210155b1561228b57600461217d8385612bb0565b6004600d5461229a9190612bda565b600a5411806122c457506004600c546122b39190612bda565b6014546122c09190612b9d565b4210155b156121c657600261217d8385612bb0565b50805b83156122e857600e8190556122ee565b60118190555b50505050565b6020805460ff60a81b1916600160a81b1781556040805160028082526060820183526000939192909183019080368337019050509050308160008151811061233e5761233e612c60565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bb9190612bfc565b816001815181106123ce576123ce612c60565b6001600160a01b03909216602092830291909101909101526027541561241f5760c8602754836123fe9190612bc3565b6124089190612bda565b60268190556124179083612bb0565b602481905591505b601f546124379030906001600160a01b0316846119d8565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612470908590600090869030904290600401612c76565b600060405180830381600087803b15801561248a57600080fd5b505af115801561249e573d6000803e3d6000fd5b50506020805460ff60a81b1916905550505050565b600080600080602060179054906101000a900460ff161515600115151480156124eb57506276a700601454426124e99190612bb0565b105b156125cc5760646124fd86600a612bc3565b6125079190612bda565b93507f27becf433f6eafb15520b27cdc27123fc4bb3ab578777db9f713bd54da1611a68460405161253a91815260200190565b60405180910390a16009546040516000916001600160a01b03169086908381818185875af1925050503d806000811461258f576040519150601f19603f3d011682016040523d82523d6000602084013e612594565b606091505b50509050806125ca5760405162461bcd60e51b8152602060048201526002602482015261393960f01b6044820152606401610508565b505b60006027541180156125e057506000602654115b156126e657602454856026546125f69190612bc3565b6126009190612bda565b60268054600091829055602491909155601f54919450915061262d9030906001600160a01b0316836119d8565b601f546001600160a01b031663f305d7198430846000808361265042603c612b9d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156126bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126e29190612c19565b5050505b6023546001600160a01b0316156127e857602254606490846127088789612bb0565b6127129190612bb0565b61271c9190612bc3565b6127269190612bda565b6023546040519193506000916001600160a01b039091169084908381818185875af1925050503d8060008114612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b50509050806127b35760405162461bcd60e51b8152602060048201526002602482015261733960f01b6044820152606401610508565b6040518381527f3392b75a0721e4605be82daf22af3b927da9086deccc7dbb947b37bf895d3deb9060200160405180910390a1505b5050505050565b600080600080845160208601878a8af19695505050505050565b61116780612cea83390190565b60006020808352835180602085015260005b8181101561284457858101830151858201604001528201612828565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610bde57600080fd5b6000806040838503121561288d57600080fd5b823561289881612865565b946020939093013593505050565b6000602082840312156128b857600080fd5b5035919050565b6000806000606084860312156128d457600080fd5b83356128df81612865565b925060208401356128ef81612865565b929592945050506040919091013590565b81516001600160a01b031681526101c081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015161294d60a084018215159052565b5060c083015160c083015260e083015161296b60e084018215159052565b50610100838101516001600160a01b0390811691840191909152610120808501519084015261014080850151908401526101608085015190840152610180808501518216908401526101a09384015116929091019190915290565b6000602082840312156129d857600080fd5b81356129e381612865565b9392505050565b600080604083850312156129fd57600080fd5b50508035926020909101359150565b6000808284036060811215612a2057600080fd5b833592506040601f1982011215612a3657600080fd5b506040516040810181811067ffffffffffffffff82111715612a6857634e487b7160e01b600052604160045260246000fd5b6040526020840135612a7981612865565b81526040939093013560208401525092909150565b8015158114610bde57600080fd5b600080600060608486031215612ab157600080fd5b833592506020840135612ac381612a8e565b91506040840135612ad381612865565b809150509250925092565b60008060408385031215612af157600080fd5b8235612afc81612865565b91506020830135612b0c81612865565b809150509250929050565b600181811c90821680612b2b57607f821691505b602082108103612b4b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612b6357600080fd5b5051919050565b600060208284031215612b7c57600080fd5b81516129e381612a8e565b634e487b7160e01b600052601160045260246000fd5b808201808211156104c8576104c8612b87565b818103818111156104c8576104c8612b87565b80820281158282048414176104c8576104c8612b87565b600082612bf757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c0e57600080fd5b81516129e381612865565b600080600060608486031215612c2e57600080fd5b8351925060208401519150604084015190509250925092565b600060018201612c5957612c59612b87565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612cc85784516001600160a01b031683529383019391830191600101612ca3565b50506001600160a01b0396909616606085015250505060800152939250505056fe608060405234801561001057600080fd5b5060405161116738038061116783398101604081905261002f91610086565b80516001600160a01b031661004357600080fd5b8051600180546001600160a01b039092166001600160a01b0319928316179055670de0b6b3a76400006002556000805490911633179055602001516004556100f7565b60006040828403121561009857600080fd5b604080519081016001600160401b03811182821017156100c857634e487b7160e01b600052604160045260246000fd5b60405282516001600160a01b03811681146100e257600080fd5b81526020928301519281019290925250919050565b611061806101066000396000f3fe60806040526004361061009a5760003560e01c80638da5cb5b11610069578063cc3d967b1161004e578063cc3d967b1461027b578063ccec3716146102e7578063f2fde38b1461030757600080fd5b80638da5cb5b1461022e578063a694fc3a1461025b57600080fd5b80632e17de78146101cd578063372500ab146101ef5780633ccfd60b146102045780634f91440d1461021957600080fd5b366101c85734806100d65760405162461bcd60e51b81526020600482015260016024820152603960f91b60448201526064015b60405180910390fd5b33600090815260086020526040812080548392906100f5908490610f42565b90915550506007805482919060009061010f908490610f42565b909155505060035460000361013e5780600060050160008282546101339190610f42565b909155506101829050565b6003546002546005546101519084610f42565b61015b9190610f5b565b6101659190610f72565b60068054600090610177908490610f42565b909155505060006005555b60065460405133917f731185b941ee4773f1c8f1cf0c22be2c6b4eaeb0075fbb4c524ac1f80ad391f3916101be91858252602082015260400190565b60405180910390a2005b600080fd5b3480156101d957600080fd5b506101ed6101e8366004610f94565b610327565b005b3480156101fb57600080fd5b506101ed6104ca565b34801561021057600080fd5b506101ed6106c0565b34801561022557600080fd5b506101ed610845565b34801561023a57600080fd5b506001546040516001600160a01b0390911681526020015b60405180910390f35b34801561026757600080fd5b506101ed610276366004610f94565b6109c2565b34801561028757600080fd5b5061029b610296366004610fad565b610c17565b6040516102529190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b3480156102f357600080fd5b506101ed610302366004610fad565b610da1565b34801561031357600080fd5b506101ed610322366004610fad565b610edb565b6000811180156103465750336000908152600a60205260409020548111155b6103765760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064016100cd565b33600090815260096020908152604080832054600254600654600a9094529184205490926103a391610f5b565b6103ad9190610f72565b6103b79190610fdd565b336000908152600a60205260408120805492935084929091906103db908490610fdd565b9091555050336000908152600d60209081526040808320429055600e9091528120805484929061040c908490610f42565b9091555050600254600654336000908152600a60205260409020546104319190610f5b565b61043b9190610f72565b3360009081526009602052604081209190915560038054849290610460908490610fdd565b9091555050801561049057336000908152600c60205260408120805483929061048a908490610f42565b90915550505b60405182815233907f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd906020015b60405180910390a25050565b33600090815260096020908152604080832054600254600654600a909452919093205490916104f891610f5b565b6105029190610f72565b61050c9190610fdd565b336000908152600c60205260408120805490919061052b908490610f42565b9091555050336000908152600c6020526040902054806105715760405162461bcd60e51b81526020600482015260016024820152600760fb1b60448201526064016100cd565b600254600654336000908152600a60205260409020546105919190610f5b565b61059b9190610f72565b336000908152600960205260408120919091554782106105bb57476105bd565b815b336000908152600c60205260408120805492935083929091906105e1908490610fdd565b9091555050336000908152600b602052604081208054839290610605908490610f42565b909155505060405181815233907f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc679060200160405180910390a2604051600090339083908381818185875af1925050503d8060008114610681576040519150601f19603f3d011682016040523d82523d6000602084013e610686565b606091505b50509050806106bb5760405162461bcd60e51b81526020600482015260016024820152603960f81b60448201526064016100cd565b505050565b336000908152600e6020526040902054806107015760405162461bcd60e51b81526020600482015260016024820152603560f81b60448201526064016100cd565b600454336000908152600d602052604090205461071e9190610f42565b4210156107515760405162461bcd60e51b81526020600482015260016024820152601b60f91b60448201526064016100cd565b336000818152600e602052604080822091909155517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906107959084815260200190565b60405180910390a260005460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190610ff0565b6108425760405162461bcd60e51b81526020600482015260016024820152603760f81b60448201526064016100cd565b50565b336000908152600e6020526040812054806108865760405162461bcd60e51b81526020600482015260016024820152600d60fa1b60448201526064016100cd565b336000908152600a6020526040902054156108e05733600090815260096020908152604080832054600254600654600a909452919093205490916108c991610f5b565b6108d39190610f72565b6108dd9190610fdd565b91505b336000908152600e60209081526040808320839055600a9091528120805483929061090c908490610f42565b9091555050600254600654336000908152600a60205260409020546109319190610f5b565b61093b9190610f72565b3360009081526009602052604081209190915560038054839290610960908490610f42565b9091555050811561099057336000908152600c60205260408120805484929061098a908490610f42565b90915550505b60405181815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a906020016104be565b60008082116109d057600080fd5b336000908152600a602052604090205415610a2a5733600090815260096020908152604080832054600254600654600a90945291909320549091610a1391610f5b565b610a1d9190610f72565b610a279190610fdd565b90505b336000908152600e6020526040902054828110610a6b57336000908152600e602052604081208054859290610a60908490610fdd565b90915550610b3a9050565b6000610a778285610fdd565b336000818152600e6020526040808220829055905490516323b872dd60e01b81526004810192909252306024830152604482018390529192506001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190610ff0565b610b385760405162461bcd60e51b81526020600482015260016024820152601960f91b60448201526064016100cd565b505b336000908152600a602052604081208054859290610b59908490610f42565b9091555050600254600654336000908152600a6020526040902054610b7e9190610f5b565b610b889190610f72565b3360009081526009602052604081209190915560038054859290610bad908490610f42565b90915550508115610bdd57336000908152600c602052604081208054849290610bd7908490610f42565b90915550505b60405183815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9060200160405180910390a2505050565b610c506040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038216600090815260096020908152604080832054600254600654600a909452918420548493849391610c8a9190610f5b565b610c949190610f72565b6001600160a01b0387166000908152600c6020526040902054610cb79190610f42565b610cc19190610fdd565b6004546001600160a01b0387166000908152600d6020526040902054919250610ce991610f42565b4210610d0f576001600160a01b0385166000908152600e60205260409020549250610d42565b6004546001600160a01b0386166000908152600d6020526040902054610d359042610fdd565b610d3f9190610f42565b91505b6040805160c0810182529182526020808301949094526001600160a01b039095166000818152600e855286812054838801528181526008855286812054606084015260808301939093528252600a909252929092205460a08301525090565b6001546040516370a0823160e01b81523060048201526000916001600160a01b038481169263a9059cbb92919091169083906370a0823190602401602060405180830381865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190611012565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190610ff0565b905080610ed75760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064016100cd565b5050565b6001546001600160a01b03163314610ef257600080fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f5557610f55610f2c565b92915050565b8082028115828204841417610f5557610f55610f2c565b600082610f8f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610fa657600080fd5b5035919050565b600060208284031215610fbf57600080fd5b81356001600160a01b0381168114610fd657600080fd5b9392505050565b81810381811115610f5557610f55610f2c565b60006020828403121561100257600080fd5b81518015158114610fd657600080fd5b60006020828403121561102457600080fd5b505191905056fea26469706673582212201be65b40cb7776d62b638c878f0e41b37b004cbd039f7d54b20da61e3c9965eb64736f6c63430008190033a264697066735822122046423ee4c935bdced56258cde1f3d1fb2bf342aa964757dcbe6d6e2f64a4fcdf64736f6c63430008190033a2646970667358221220813ad1bb387b1626fb55a5f7da3188a0ea2efe4f0e527afd6d020a88cd87ea3264736f6c63430008190033000000000000000000000000a8939be8156f6adc5fbb519e346a11167acba1050000000000000000000000009c84288cb2c0fcad30f031ac1d4b1633ef994c63000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b948830000000000000000000000004f0fd563be89ec8c3e7d595bf3639128c0a7c33a
Deployed Bytecode
0x6080604052600436106100b55760003560e01c8063c187645311610069578063ce31a06b1161004e578063ce31a06b14610201578063f2fde38b14610216578063f39bb7d21461023657600080fd5b8063c1876453146101a6578063ccec3716146101e157600080fd5b80638da5cb5b1161009a5780638da5cb5b14610115578063a99266471461013d578063b9efb9bf1461018657600080fd5b8063353a9e71146100c15780636bb185d81461010057600080fd5b366100bc57005b600080fd5b3480156100cd57600080fd5b506004546003546002546040805193845260208401929092526001600160a01b0316908201526060015b60405180910390f35b61011361010e366004610d06565b610256565b005b34801561012157600080fd5b506000546040516001600160a01b0390911681526020016100f7565b34801561014957600080fd5b50610176610158366004610e8f565b6001600160a01b031660009081526005602052604090205460ff1690565b60405190151581526020016100f7565b34801561019257600080fd5b506101136101a1366004610eb1565b610954565b3480156101b257600080fd5b506101766101c1366004610e8f565b6001600160a01b0390811660009081526006602052604090205416151590565b3480156101ed57600080fd5b506101136101fc366004610e8f565b610970565b34801561020d57600080fd5b50610113610aa1565b34801561022257600080fd5b50610113610231366004610e8f565b610b5c565b34801561024257600080fd5b50610113610251366004610eca565b610ba2565b341580610264575060045434145b61026d57600080fd5b80516001600160a01b031633146102af5760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064015b60405180910390fd5b6003548160600151146102e85760405162461bcd60e51b81526020600482015260016024820152601960f91b60448201526064016102a6565b60025460408201516001600160a01b0390811691161461032e5760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064016102a6565b8061012001518161010001511015801561034e5750602881610100015111155b61037e5760405162461bcd60e51b81526020600482015260016024820152601b60f91b60448201526064016102a6565b600681610120015111156103b85760405162461bcd60e51b81526020600482015260016024820152601b60fa1b60448201526064016102a6565b806101600151816101400151101580156103d85750602881610140015111155b6104085760405162461bcd60e51b81526020600482015260016024820152606b60f81b60448201526064016102a6565b600681610160015111156104425760405162461bcd60e51b81526020600482015260016024820152603560f91b60448201526064016102a6565b60038160a00151111561047b5760405162461bcd60e51b81526020600482015260016024820152606960f81b60448201526064016102a6565b611c208160c0015111156104b55760405162461bcd60e51b81526020600482015260016024820152600d60fb1b60448201526064016102a6565b60648160e0015111156104ee5760405162461bcd60e51b81526020600482015260016024820152606760f81b60448201526064016102a6565b6032816101800151111561050157600080fd5b6000816101a0015111801561051d5750612710816101a0015111155b61054d5760405162461bcd60e51b81526020600482015260016024820152603360f91b60448201526064016102a6565b6000816101c001511180156105695750612710816101c0015111155b6105995760405162461bcd60e51b81526020600482015260016024820152606560f81b60448201526064016102a6565b670de0b6b3a76400008160800151101580156105c757506d314dc6448d9338c15b0a00000000816080015111155b6105f75760405162461bcd60e51b81526020600482015260016024820152601960fa1b60448201526064016102a6565b6032816101e0015111156106315760405162461bcd60e51b81526020600482015260016024820152606360f81b60448201526064016102a6565b606481608001516106429190610f01565b8161020001511015801561067757506064816080015160026106649190610f23565b61066e9190610f01565b81610200015111155b6106a75760405162461bcd60e51b81526020600482015260016024820152603160f91b60448201526064016102a6565b620f424081608001516106ba9190610f01565b816102200151101580156106e457506103e881608001516106db9190610f01565b81610220015111155b6107145760405162461bcd60e51b81526020600482015260016024820152606160f81b60448201526064016102a6565b6001610280820152341561072b5760006102808201525b6000828260405161073b90610bf7565b6107459190610f94565b8190604051809103906000f5905080158015610765573d6000803e3d6000fd5b506001600160a01b038116600081815260066020908152604091829020805473ffffffffffffffffffffffffffffffffffffffff1916339081179091558251908152908101929092529192507f33c981baba081f8fd2c52ac6ad1ea95b6814b4376640f55689051f6584729688910160405180910390a16000604051806101200160405280336001600160a01b03168152602001836001600160a01b0316815260200184610280015115158152602001846102800151151515815260200160008152602001846102400151815260200184610260015181526020018460800151815260200160006001600160a01b031681525090506000604051806101400160405280846001600160a01b0316815260200185602001516001600160a01b03168152602001856101000151815260200185610140015181526020018561012001518152602001856101600151815260200185610180015181526020018560a0015181526020018560c0015181526020018560e0015181525090507f05801121ffc1080c74d11ce5f437ed5f77b1014c00f7e1b8bb6cd899ad1f95048260405161090e91906110f9565b60405180910390a17f6789ae7431eb646c5e4f10cf3a38e4597b460ba0bc7629611376bbb0b4491a6c8160405161094591906111b9565b60405180910390a15050505050565b6000546001600160a01b0316331461096b57600080fd5b600355565b6000546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa1580156109c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109e79190611240565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610a4a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610a6e9190611259565b610a9e5760405162461bcd60e51b81526020600482015260016024820152600f60fb1b60448201526064016102a6565b50565b60004711610ad55760405162461bcd60e51b81526020600482015260016024820152607960f81b60448201526064016102a6565b6001546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610b22576040519150601f19603f3d011682016040523d82523d6000602084013e610b27565b606091505b5050905080610a9e5760405162461bcd60e51b81526020600482015260016024820152603960f91b60448201526064016102a6565b6000546001600160a01b03163314610b7357600080fd5b6000805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b6000546001600160a01b03163314610bb957600080fd5b6001600160a01b038216610bcc57600080fd5b6001600160a01b03919091166000908152600560205260409020805460ff1916911515919091179055565b61457a8061127783390190565b634e487b7160e01b600052604160045260246000fd5b6040516102a0810167ffffffffffffffff81118282101715610c3e57610c3e610c04565b60405290565b80356001600160a01b0381168114610c5b57600080fd5b919050565b600082601f830112610c7157600080fd5b813567ffffffffffffffff80821115610c8c57610c8c610c04565b604051601f8301601f19908116603f01168101908282118183101715610cb457610cb4610c04565b81604052838152866020858801011115610ccd57600080fd5b836020870160208301376000602085830101528094505050505092915050565b8015158114610a9e57600080fd5b8035610c5b81610ced565b60008060408385031215610d1957600080fd5b82359150602083013567ffffffffffffffff80821115610d3857600080fd5b908401906102a08287031215610d4d57600080fd5b610d55610c1a565b610d5e83610c44565b8152610d6c60208401610c44565b6020820152610d7d60408401610c44565b6040820152606083810135908201526080808401359082015260a0808401359082015260c0808401359082015260e08084013590820152610100808401359082015261012080840135908201526101408084013590820152610160808401359082015261018080840135908201526101a080840135908201526101c080840135908201526101e08084013590820152610200808401359082015261022080840135908201526102408084013583811115610e3657600080fd5b610e4289828701610c60565b8284015250506102608084013583811115610e5c57600080fd5b610e6889828701610c60565b8284015250506102809150610e7e828401610cfb565b828201528093505050509250929050565b600060208284031215610ea157600080fd5b610eaa82610c44565b9392505050565b600060208284031215610ec357600080fd5b5035919050565b60008060408385031215610edd57600080fd5b610ee683610c44565b91506020830135610ef681610ced565b809150509250929050565b600082610f1e57634e487b7160e01b600052601260045260246000fd5b500490565b8082028115828204841417610f4857634e487b7160e01b600052601160045260246000fd5b92915050565b6000815180845260005b81811015610f7457602081850181015186830182015201610f58565b506000602082860101526020601f19601f83011685010191505092915050565b60208152610fae6020820183516001600160a01b03169052565b60006020830151610fca60408401826001600160a01b03169052565b5060408301516001600160a01b038116606084015250606083015160808381019190915283015160a08084019190915283015160c08084019190915283015160e08084019190915283015161010080840191909152830151610120808401919091528301516101408084019190915283015161016080840191909152830151610180808401919091528301516101a0808401919091528301516101c0808401919091528301516101e0808401919091528301516102008084019190915283015161022080840191909152830151610240808401919091528301516102a06102608085018290526110be6102c0860184610f4e565b9250808601519050610280601f1986850301818701526110de8483610f4e565b908701518015158785015290935090505b5090949350505050565b602081526111136020820183516001600160a01b03169052565b6000602083015161112f60408401826001600160a01b03169052565b5060408301518015156060840152506060830151801515608084015250608083015160a083015260a08301516101208060c0850152611172610140850183610f4e565b915060c0850151601f198584030160e086015261118f8382610f4e565b60e0870151610100878101919091528701516001600160a01b0381168488015290935090506110ef565b81516001600160a01b03168152610140810160208301516111e560208401826001600160a01b03169052565b5060408301516040830152606083015160608301526080830151608083015260a083015160a083015260c083015160c083015260e083015160e083015261010080840151818401525061012080840151818401525092915050565b60006020828403121561125257600080fd5b5051919050565b60006020828403121561126b57600080fd5b8151610eaa81610ced56fe608060405234801561001057600080fd5b5060405161457a38038061457a83398101604081905261002f916103d0565b8051600080546001600160a01b0319166001600160a01b0390921691821781556040517f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36040810151600380546001600160a01b039283166001600160a01b031991821617909155600980548216331790556060830151600155610100830151600e819055600f556101208301516010556101408301516011819055601290815561016084015160135561018084015160275560a0840151600b5560c0840151600c5560e0840151600d556000600a5561028084015160208054911515600160b81b0260ff60b81b199092169190911781556015805460ff19169092179091558301516008805491909316911617905561024081015160179061015690826105d9565b5061026081015160189061016a90826105d9565b5060808101516016819055610220820151601b55610200820151601c556020805460ff60b01b1916600160b01b1790556101a0820151612710916101ae9190610698565b6101b891906106c3565b601d556101c0810151601654612710916101d191610698565b6101db91906106c3565b601e556101a08101516127101480156101fa5750806101c00151612710145b1561020d576020805460ff60b01b191690555b7f3e470cf1ec3767d0209f5128c840997ff9b70dfe0da263b3f94eb114a05d9327816101a00151826101c00151604051610251929190918252602082015260400190565b60405180910390a160165430600081815260066020908152604080832085905551938452919290917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a36101e00151601a556106e5565b634e487b7160e01b600052604160045260246000fd5b6040516102a081016001600160401b03811182821017156102ea576102ea6102b1565b60405290565b604051601f8201601f191681016001600160401b0381118282101715610318576103186102b1565b604052919050565b80516001600160a01b038116811461033757600080fd5b919050565b600082601f83011261034d57600080fd5b81516001600160401b03811115610366576103666102b1565b602061037a601f8301601f191682016102f0565b828152858284870101111561038e57600080fd5b60005b838110156103ac578581018301518282018401528201610391565b506000928101909101919091529392505050565b8051801515811461033757600080fd5b6000602082840312156103e257600080fd5b81516001600160401b03808211156103f957600080fd5b908301906102a0828603121561040e57600080fd5b6104166102c7565b61041f83610320565b815261042d60208401610320565b602082015261043e60408401610320565b6040820152606083810151908201526080808401519082015260a0808401519082015260c0808401519082015260e08084015190820152610100808401519082015261012080840151908201526101408084015190820152610160808401519082015261018080840151908201526101a080840151908201526101c080840151908201526101e080840151908201526102008084015190820152610220808401519082015261024080840151838111156104f757600080fd5b6105038882870161033c565b828401525050610260808401518381111561051d57600080fd5b6105298882870161033c565b828401525050610280915061053f8284016103c0565b91810191909152949350505050565b600181811c9082168061056257607f821691505b60208210810361058257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156105d4576000816000526020600020601f850160051c810160208610156105b15750805b601f850160051c820191505b818110156105d0578281556001016105bd565b5050505b505050565b81516001600160401b038111156105f2576105f26102b1565b61060681610600845461054e565b84610588565b602080601f83116001811461063b57600084156106235750858301515b600019600386901b1c1916600185901b1785556105d0565b600085815260208120601f198616915b8281101561066a5788860151825594840194600190910190840161064b565b50858210156106885787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b80820281158282048414176106bd57634e487b7160e01b600052601160045260246000fd5b92915050565b6000826106e057634e487b7160e01b600052601260045260246000fd5b500490565b613e86806106f46000396000f3fe6080604052600436106101635760003560e01c806370a08231116100c0578063af66394d11610074578063db7c4dda11610059578063db7c4dda146103ac578063dd62ed3e146103bf578063f2fde38b1461040557600080fd5b8063af66394d1461036c578063ccec37161461038c57600080fd5b80638da5cb5b116100a55780638da5cb5b1461030f57806395d89b4114610337578063a9059cbb1461034c57600080fd5b806370a08231146102b957806378f8484b146102ef57600080fd5b806323b872dd1161011757806344ee3a1c116100fc57806344ee3a1c146102625780634839c8b3146102825780635c89dfe11461029757600080fd5b806323b872dd14610220578063313ce5671461024057600080fd5b80630b45260e116101485780630b45260e146101ca57806318160ddd146101e157806320ffb26d1461020057600080fd5b806306fdde031461016f578063095ea7b31461019a57600080fd5b3661016a57005b600080fd5b34801561017b57600080fd5b50610184610425565b6040516101919190612816565b60405180910390f35b3480156101a657600080fd5b506101ba6101b536600461287a565b6104b7565b6040519015158152602001610191565b3480156101d657600080fd5b506101df6104ce565b005b3480156101ed57600080fd5b506016545b604051908152602001610191565b34801561020c57600080fd5b506101df61021b3660046128a6565b6106d0565b34801561022c57600080fd5b506101ba61023b3660046128bf565b6107b5565b34801561024c57600080fd5b5060155460405160ff9091168152602001610191565b34801561026e57600080fd5b506101df61027d3660046128a6565b61085d565b34801561028e57600080fd5b506101df610993565b3480156102a357600080fd5b506102ac610be1565b6040516101919190612900565b3480156102c557600080fd5b506101f26102d43660046129c6565b6001600160a01b031660009081526006602052604090205490565b3480156102fb57600080fd5b506101df61030a3660046129ea565b610d2e565b34801561031b57600080fd5b506000546040516001600160a01b039091168152602001610191565b34801561034357600080fd5b50610184610edd565b34801561035857600080fd5b506101ba61036736600461287a565b610eec565b34801561037857600080fd5b506101df610387366004612a0c565b610ef9565b34801561039857600080fd5b506101df6103a73660046129c6565b61110d565b6101df6103ba366004612a9c565b61125b565b3480156103cb57600080fd5b506101f26103da366004612ade565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205490565b34801561041157600080fd5b506101df6104203660046129c6565b61190c565b60606017805461043490612b17565b80601f016020809104026020016040519081016040528092919081815260200182805461046090612b17565b80156104ad5780601f10610482576101008083540402835291602001916104ad565b820191906000526020600020905b81548152906001019060200180831161049057829003601f168201915b5050505050905090565b60006104c43384846119d8565b5060015b92915050565b6000546001600160a01b031633146105115760405162461bcd60e51b81526020600482015260016024820152606f60f81b60448201526064015b60405180910390fd5b602054600160c01b900460ff161580156105355750602054600160c81b900460ff16155b801561054a5750602054600160a01b900460ff165b61057a5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b6020805460ff60c01b1916600160c01b1790556040517fc43e780723fe0e2a85c0bd4291955d83cac42c6036fd8bf58b10463d3f9f1ae890600090a16020546040516370a0823160e01b81523060048201526001600160a01b039091169063a9059cbb9061dead9083906370a0823190602401602060405180830381865afa15801561060a573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061062e9190612b51565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610679573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061069d9190612b6a565b6106ce5760405162461bcd60e51b8152602060048201526002602482015261379960f11b6044820152606401610508565b565b6000546001600160a01b0316331480156106ec57506000602254115b80156106f85750600081115b6107285760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b806022600082825461073a9190612b9d565b9091555050602254606410156107775760405162461bcd60e51b81526020600482015260026024820152616f7360f01b6044820152606401610508565b7fcc5d343fa3728e63489d08b6f42d710f12e9126dec83f9b9a9fa74b7e54d22416022546040516107aa91815260200190565b60405180910390a150565b6001600160a01b038316600090815260076020908152604080832033845290915281205482111561080d5760405162461bcd60e51b8152602060048201526002602482015261323560f01b6044820152606401610508565b6001600160a01b038416600090815260076020908152604080832033808552925290912054610848918691610843908690612bb0565b6119d8565b610853848484611a5f565b5060019392505050565b6000546001600160a01b0316331461089b5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160c81b900460ff161580156108bf5750602054600160c01b900460ff16155b80156108d45750602054600160a01b900460ff165b6109045760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b42602154620151806109169190612bc3565b6014546109239190612b9d565b101561094957620151806014544261093b9190612bb0565b6109459190612bda565b6021555b806021600082825461095b9190612b9d565b90915550506021546040519081527fa7b24c66dd3269a292a60b3facdbb8f3e7557d1e19e64d99e0d6ee7250be63ad906020016107aa565b6000546001600160a01b031633146109d15760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160c81b900460ff161580156109f55750602054600160c01b900460ff16155b8015610a0a5750602054600160a01b900460ff165b610a3a5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b42602154603c610a4a9190612bc3565b610a5590603c612bc3565b610a60906018612bc3565b601454610a6d9190612b9d565b10156106ce5760208054600160c81b7fffffffffffff00ffffffffffffffffffffffffffffffffffffffffffffffffff8216179091556040516370a0823160e01b81523060048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015610ae9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b0d9190612b51565b6040519091507faf0fe1663cb7e005c807c426024d6b7bedd6fea7b9df02852418932d71cd78bd90600090a160205460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af1158015610b8a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610bae9190612b6a565b610bde5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610508565b50565b610c7b604051806101c0016040528060006001600160a01b03168152602001600081526020016000815260200160008152602001600081526020016000151581526020016000815260200160001515815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b0316815260200160006001600160a01b031681525090565b604080516101c081018252602080546001600160a01b03168252600a5490820152600e5491810191909152601154606082015260808101610cba611fca565b81526020805460ff600160c01b820481161515928401929092526014546040840152600160b01b900416151560608201526023546001600160a01b03908116608083015260225460a0830152601e5460c0830152601d5460e0830152601f5416610100820152600061012090910152919050565b6000546001600160a01b031633148015610d515750602054600160b01b900460ff165b610d815760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b601d5461271083601654610d959190612bc3565b610d9f9190612bda565b10158015610daf57506127108211155b610ddf5760405162461bcd60e51b81526020600482015260016024820152606160f81b6044820152606401610508565b601e5461271082601654610df39190612bc3565b610dfd9190612bda565b10158015610e0d57506127108111155b610e3d5760405162461bcd60e51b81526020600482015260016024820152603160f91b6044820152606401610508565b61271082601654610e4e9190612bc3565b610e589190612bda565b601d5560165461271090610e6d908390612bc3565b610e779190612bda565b601e5561271082148015610e8c575080612710145b15610e9f576020805460ff60b01b191690555b60408051838152602081018390527f3e470cf1ec3767d0209f5128c840997ff9b70dfe0da263b3f94eb114a05d932791015b60405180910390a15050565b60606018805461043490612b17565b60006104c4338484611a5f565b6000546001600160a01b03163314610f375760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602254158015610f475750600082115b8015610f54575060648211155b610f845760405162461bcd60e51b81526020600482015260016024820152607960f81b6044820152606401610508565b6202a300816020015110158015610fa15750620d2f008160200151105b610fd15760405162461bcd60e51b81526020600482015260016024820152603d60f91b6044820152606401610508565b60228290553381526040516000908290610fea90612809565b81516001600160a01b0316815260209182015191810191909152604001604051809103906000f080158015611023573d6000803e3d6000fd5b506001600160a01b03811660008181526004602090815260408083208054600160ff199182168117909255600584529382902080549094161790925560225482519384523391840191909152908201529091507fc718bf738f6d7cb0af735b17552ef9e5f1857d1719d7f882b8780ea2f08b3e7f9060600160405180910390a16040805183516001600160a01b03168152602080850151908201527f8bdc63644658897d37c2cff731dd7a8898394f85b3c9d9b4b7879390385d4c26910160405180910390a1602380546001600160a01b0319166001600160a01b03929092169190911790555050565b6020546001600160a01b039081169082160361112857600080fd5b306001600160a01b0382160361113d57600080fd5b6008546040516370a0823160e01b81523060048201526001600160a01b038381169263a9059cbb9291169083906370a0823190602401602060405180830381865afa158015611190573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b49190612b51565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af11580156111ff573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112239190612b6a565b6112535760405162461bcd60e51b81526020600482015260016024820152603960f91b6044820152606401610508565b610bde61202a565b6000546001600160a01b031633146112995760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b602054600160a01b900460ff16156112d75760405162461bcd60e51b81526020600482015260016024820152603160f81b6044820152606401610508565b60015447101561130d5760405162461bcd60e51b81526020600482015260016024820152601960f91b6044820152606401610508565b8161132057600e83101561132057600080fd5b602080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16600160a01b1790819055601e54601d549091600160b01b900460ff1680151560010361138557601654601e819055601d556020805460ff60b01b191690555b3060008181526004602090815260408083208054600160ff19918216811790925584546001600160a01b03908116865283862080548316841790557f42c63635470f1fb1d6d4b6441c413cb435b1ebb6fedd1896dd5e25d1399147dd80548316841790558686526005909452828520805482168317905584549093168452908320805483168217905561dead9092527f7d509c07f0d4edcc2dd1b53aae68677132eb562dcba78e36381b63ccaf66e6ba80549091169091179055851561146057506020805460ff60c01b1916600160c01b1790556000611473565b60218790556020805460ff60c01b191690555b30600090815260066020526040908190205442601455600954915163a992664760e01b81526001600160a01b0388811660048301529192919091169063a992664790602401602060405180830381865afa1580156114d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114f99190612b6a565b61150257600080fd5b601f80546001600160a01b0319166001600160a01b03888116918217835560165430600090815260076020908152604080832095835294815290849020919091559254825163c45a015560e01b8152925191169263c45a015592600480820193918290030181865afa15801561157c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115a09190612bfc565b6001600160a01b031663c9c6539630601f60009054906101000a90046001600160a01b03166001600160a01b031663ad5c46486040518163ffffffff1660e01b8152600401602060405180830381865afa158015611602573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116269190612bfc565b6040516001600160e01b031960e085901b1681526001600160a01b039283166004820152911660248201526044016020604051808303816000875af1158015611673573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906116979190612bfc565b602080546001600160a01b0319166001600160a01b039283169081178255600090815260058083526040808320805460ff199081166001908117909255855487168552600486528285208054821683179055601f80548816865283862080548316841790558054881686529386529382902080549094161790925582546021549154835191861682524794820194909452918201528915156060820152911660808201527f0157a1a09a393e0b2567e699c9fafaa987dd8440f4b66795e9667d8749d7239e9060a00160405180910390a1602054601f5460405163095ea7b360e01b81526001600160a01b039182166004820152600019602482015291169063095ea7b3906044016020604051808303816000875af11580156117be573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e29190612b6a565b6118125760405162461bcd60e51b81526020600482015260016024820152603360f81b6044820152606401610508565b601f546001600160a01b031663f305d7194730846000808861183542603c612b9d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156118a2573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906118c79190612c19565b50506025805460ff191660019081179091558415159003905061190257601e859055601d8490556020805460ff60b01b1916600160b01b1790555b5050505050505050565b6000546001600160a01b0316331461194a5760405162461bcd60e51b81526020600482015260016024820152606f60f81b6044820152606401610508565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392831690811782558152600460209081526040808320805460ff1990811660019081179092558454909516845260059092529091208054909216179055565b6001600160a01b0383166119eb57600080fd5b6001600160a01b0382166119fe57600080fd5b6001600160a01b0383811660008181526007602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a3505050565b6001600160a01b03831615801590611a7f57506001600160a01b03821615155b611a8857600080fd5b6001600160a01b038316600090815260066020526040902054811115611ad55760405162461bcd60e51b81526020600482015260026024820152611b1b60f11b6044820152606401610508565b602054600090600160a01b900460ff168015611afa5750602054600160b01b900460ff165b8015611b1f57506001600160a01b03841660009081526004602052604090205460ff16155b8015611b4457506001600160a01b03831660009081526004602052604090205460ff16155b15611b805781601e541015611b805760405162461bcd60e51b8152602060048201526002602482015261033360f41b6044820152606401610508565b602054600160a01b900460ff168015611ba25750602054600160b01b900460ff165b8015611bc757506001600160a01b03831660009081526005602052604090205460ff16155b15611c2657601d546001600160a01b038416600090815260066020526040902054611bf3908490612b9d565b1115611c265760405162461bcd60e51b8152602060048201526002602482015261333160f01b6044820152606401610508565b6000546001600160a01b03858116911614801590611c5257506000546001600160a01b03848116911614155b8015611c65575060255460ff1615156001145b15611d28576020546001600160a01b038581169116148015611c955750601f546001600160a01b03848116911614155b15611cd657600a8054906000611caa83612c47565b9190505550611cb960016120f2565b6064600e5483611cc99190612bc3565b611cd39190612bda565b90505b6020546001600160a01b038481169116148015611cfc57506001600160a01b0384163014155b15611d2857611d0b60006120f2565b606460115483611d1b9190612bc3565b611d259190612bda565b90505b30600090815260066020526040812054602054909150600090600160a81b900460ff16158015611d6557506020546001600160a01b038681169116145b8015611d7a57506001600160a01b0386163014155b8015611d865750600082115b8015611d955750601a54600a54115b15611e1357601b54821180611dd057506201518060145442611db79190612bb0565b118015611dc45750601054155b8015611dd05750601354155b15611e1357601954431115611e1357601c54821015611df757611df2826122f4565b611e02565b611e02601c546122f4565b611e0b476124b3565b504360195560015b8215611e8e5730600090815260066020526040902054611e34908490612b9d565b30600081815260066020526040908190209290925590516001600160a01b038816907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90611e859087815260200190565b60405180910390a35b6001600160a01b038616600090815260066020526040902054611eb2908590612bb0565b6001600160a01b0380881660009081526006602052604080822093909355908716815220548390611ee4908690612b9d565b611eee9190612bb0565b6001600160a01b0380871660008181526006602052604090209290925587167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef611f388688612bb0565b60405190815260200160405180910390a38015611fc2576000611f84600860009054906101000a90046001600160a01b0316620186a047604051806020016040528060008152506127ef565b90508015611fc0576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb9060200160405180910390a15b505b505050505050565b602054600090600160a01b900460ff16611fe45750600090565b60006201518060145442611ff89190612bb0565b6120029190612bda565b905060215481111561201657600091505090565b806021546120249190612bb0565b91505090565b602054600160a81b900460ff1615801561204d5750602054600160a01b900460ff165b156106ce57478015610bde57612062816124b3565b6008546040516000916001600160a01b03169047908381818185875af1925050503d80600081146120af576040519150601f19603f3d011682016040523d82523d6000602084013e6120b4565b606091505b5050905080156120ee576040514781527f2488b4123934dca0dca56f8f7005a71c0a52e2c9158fe31ac31869efe776d6eb90602001610ed1565b5050565b6000806000831561211157600f5492506010549150600e549050612121565b6012549250601354915060115490505b8181146122ee57600b546000036121ce57600c546014546121429190612b9d565b421061214f5750806122d8565b6002600c5461215e9190612bda565b60145461216b9190612b9d565b421061219857600461217d8385612bb0565b6121879190612bda565b6121919083612b9d565b90506122d8565b6004600c546121a79190612bda565b6014546121b49190612b9d565b42106121c657600261217d8385612bb0565b50815b6122d8565b600b5460010361220a57600d54600a5411156121eb5750806121ee565b50815b6014546121fd90611c20612b9d565b42106121c95750806122d8565b600b546002036122d557600d54600a5411806122355750600c546014546122319190612b9d565b4210155b156122415750806122d8565b6002600d546122509190612bda565b600a54118061227a57506002600c546122699190612bda565b6014546122769190612b9d565b4210155b1561228b57600461217d8385612bb0565b6004600d5461229a9190612bda565b600a5411806122c457506004600c546122b39190612bda565b6014546122c09190612b9d565b4210155b156121c657600261217d8385612bb0565b50805b83156122e857600e8190556122ee565b60118190555b50505050565b6020805460ff60a81b1916600160a81b1781556040805160028082526060820183526000939192909183019080368337019050509050308160008151811061233e5761233e612c60565b6001600160a01b03928316602091820292909201810191909152601f54604080516315ab88c960e31b81529051919093169263ad5c46489260048083019391928290030181865afa158015612397573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123bb9190612bfc565b816001815181106123ce576123ce612c60565b6001600160a01b03909216602092830291909101909101526027541561241f5760c8602754836123fe9190612bc3565b6124089190612bda565b60268190556124179083612bb0565b602481905591505b601f546124379030906001600160a01b0316846119d8565b601f5460405163791ac94760e01b81526001600160a01b039091169063791ac94790612470908590600090869030904290600401612c76565b600060405180830381600087803b15801561248a57600080fd5b505af115801561249e573d6000803e3d6000fd5b50506020805460ff60a81b1916905550505050565b600080600080602060179054906101000a900460ff161515600115151480156124eb57506276a700601454426124e99190612bb0565b105b156125cc5760646124fd86600a612bc3565b6125079190612bda565b93507f27becf433f6eafb15520b27cdc27123fc4bb3ab578777db9f713bd54da1611a68460405161253a91815260200190565b60405180910390a16009546040516000916001600160a01b03169086908381818185875af1925050503d806000811461258f576040519150601f19603f3d011682016040523d82523d6000602084013e612594565b606091505b50509050806125ca5760405162461bcd60e51b8152602060048201526002602482015261393960f01b6044820152606401610508565b505b60006027541180156125e057506000602654115b156126e657602454856026546125f69190612bc3565b6126009190612bda565b60268054600091829055602491909155601f54919450915061262d9030906001600160a01b0316836119d8565b601f546001600160a01b031663f305d7198430846000808361265042603c612b9d565b60405160e089901b6001600160e01b03191681526001600160a01b039687166004820152602481019590955260448501939093526064840191909152909216608482015260a481019190915260c40160606040518083038185885af11580156126bd573d6000803e3d6000fd5b50505050506040513d601f19601f820116820180604052508101906126e29190612c19565b5050505b6023546001600160a01b0316156127e857602254606490846127088789612bb0565b6127129190612bb0565b61271c9190612bc3565b6127269190612bda565b6023546040519193506000916001600160a01b039091169084908381818185875af1925050503d8060008114612778576040519150601f19603f3d011682016040523d82523d6000602084013e61277d565b606091505b50509050806127b35760405162461bcd60e51b8152602060048201526002602482015261733960f01b6044820152606401610508565b6040518381527f3392b75a0721e4605be82daf22af3b927da9086deccc7dbb947b37bf895d3deb9060200160405180910390a1505b5050505050565b600080600080845160208601878a8af19695505050505050565b61116780612cea83390190565b60006020808352835180602085015260005b8181101561284457858101830151858201604001528201612828565b506000604082860101526040601f19601f8301168501019250505092915050565b6001600160a01b0381168114610bde57600080fd5b6000806040838503121561288d57600080fd5b823561289881612865565b946020939093013593505050565b6000602082840312156128b857600080fd5b5035919050565b6000806000606084860312156128d457600080fd5b83356128df81612865565b925060208401356128ef81612865565b929592945050506040919091013590565b81516001600160a01b031681526101c081016020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015161294d60a084018215159052565b5060c083015160c083015260e083015161296b60e084018215159052565b50610100838101516001600160a01b0390811691840191909152610120808501519084015261014080850151908401526101608085015190840152610180808501518216908401526101a09384015116929091019190915290565b6000602082840312156129d857600080fd5b81356129e381612865565b9392505050565b600080604083850312156129fd57600080fd5b50508035926020909101359150565b6000808284036060811215612a2057600080fd5b833592506040601f1982011215612a3657600080fd5b506040516040810181811067ffffffffffffffff82111715612a6857634e487b7160e01b600052604160045260246000fd5b6040526020840135612a7981612865565b81526040939093013560208401525092909150565b8015158114610bde57600080fd5b600080600060608486031215612ab157600080fd5b833592506020840135612ac381612a8e565b91506040840135612ad381612865565b809150509250925092565b60008060408385031215612af157600080fd5b8235612afc81612865565b91506020830135612b0c81612865565b809150509250929050565b600181811c90821680612b2b57607f821691505b602082108103612b4b57634e487b7160e01b600052602260045260246000fd5b50919050565b600060208284031215612b6357600080fd5b5051919050565b600060208284031215612b7c57600080fd5b81516129e381612a8e565b634e487b7160e01b600052601160045260246000fd5b808201808211156104c8576104c8612b87565b818103818111156104c8576104c8612b87565b80820281158282048414176104c8576104c8612b87565b600082612bf757634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215612c0e57600080fd5b81516129e381612865565b600080600060608486031215612c2e57600080fd5b8351925060208401519150604084015190509250925092565b600060018201612c5957612c59612b87565b5060010190565b634e487b7160e01b600052603260045260246000fd5b600060a08201878352602087602085015260a0604085015281875180845260c08601915060208901935060005b81811015612cc85784516001600160a01b031683529383019391830191600101612ca3565b50506001600160a01b0396909616606085015250505060800152939250505056fe608060405234801561001057600080fd5b5060405161116738038061116783398101604081905261002f91610086565b80516001600160a01b031661004357600080fd5b8051600180546001600160a01b039092166001600160a01b0319928316179055670de0b6b3a76400006002556000805490911633179055602001516004556100f7565b60006040828403121561009857600080fd5b604080519081016001600160401b03811182821017156100c857634e487b7160e01b600052604160045260246000fd5b60405282516001600160a01b03811681146100e257600080fd5b81526020928301519281019290925250919050565b611061806101066000396000f3fe60806040526004361061009a5760003560e01c80638da5cb5b11610069578063cc3d967b1161004e578063cc3d967b1461027b578063ccec3716146102e7578063f2fde38b1461030757600080fd5b80638da5cb5b1461022e578063a694fc3a1461025b57600080fd5b80632e17de78146101cd578063372500ab146101ef5780633ccfd60b146102045780634f91440d1461021957600080fd5b366101c85734806100d65760405162461bcd60e51b81526020600482015260016024820152603960f91b60448201526064015b60405180910390fd5b33600090815260086020526040812080548392906100f5908490610f42565b90915550506007805482919060009061010f908490610f42565b909155505060035460000361013e5780600060050160008282546101339190610f42565b909155506101829050565b6003546002546005546101519084610f42565b61015b9190610f5b565b6101659190610f72565b60068054600090610177908490610f42565b909155505060006005555b60065460405133917f731185b941ee4773f1c8f1cf0c22be2c6b4eaeb0075fbb4c524ac1f80ad391f3916101be91858252602082015260400190565b60405180910390a2005b600080fd5b3480156101d957600080fd5b506101ed6101e8366004610f94565b610327565b005b3480156101fb57600080fd5b506101ed6104ca565b34801561021057600080fd5b506101ed6106c0565b34801561022557600080fd5b506101ed610845565b34801561023a57600080fd5b506001546040516001600160a01b0390911681526020015b60405180910390f35b34801561026757600080fd5b506101ed610276366004610f94565b6109c2565b34801561028757600080fd5b5061029b610296366004610fad565b610c17565b6040516102529190600060c082019050825182526020830151602083015260408301516040830152606083015160608301526080830151608083015260a083015160a083015292915050565b3480156102f357600080fd5b506101ed610302366004610fad565b610da1565b34801561031357600080fd5b506101ed610322366004610fad565b610edb565b6000811180156103465750336000908152600a60205260409020548111155b6103765760405162461bcd60e51b81526020600482015260016024820152603360f81b60448201526064016100cd565b33600090815260096020908152604080832054600254600654600a9094529184205490926103a391610f5b565b6103ad9190610f72565b6103b79190610fdd565b336000908152600a60205260408120805492935084929091906103db908490610fdd565b9091555050336000908152600d60209081526040808320429055600e9091528120805484929061040c908490610f42565b9091555050600254600654336000908152600a60205260409020546104319190610f5b565b61043b9190610f72565b3360009081526009602052604081209190915560038054849290610460908490610fdd565b9091555050801561049057336000908152600c60205260408120805483929061048a908490610f42565b90915550505b60405182815233907f85082129d87b2fe11527cb1b3b7a520aeb5aa6913f88a3d8757fe40d1db02fdd906020015b60405180910390a25050565b33600090815260096020908152604080832054600254600654600a909452919093205490916104f891610f5b565b6105029190610f72565b61050c9190610fdd565b336000908152600c60205260408120805490919061052b908490610f42565b9091555050336000908152600c6020526040902054806105715760405162461bcd60e51b81526020600482015260016024820152600760fb1b60448201526064016100cd565b600254600654336000908152600a60205260409020546105919190610f5b565b61059b9190610f72565b336000908152600960205260408120919091554782106105bb57476105bd565b815b336000908152600c60205260408120805492935083929091906105e1908490610fdd565b9091555050336000908152600b602052604081208054839290610605908490610f42565b909155505060405181815233907f1f89f96333d3133000ee447473151fa9606543368f02271c9d95ae14f13bcc679060200160405180910390a2604051600090339083908381818185875af1925050503d8060008114610681576040519150601f19603f3d011682016040523d82523d6000602084013e610686565b606091505b50509050806106bb5760405162461bcd60e51b81526020600482015260016024820152603960f81b60448201526064016100cd565b505050565b336000908152600e6020526040902054806107015760405162461bcd60e51b81526020600482015260016024820152603560f81b60448201526064016100cd565b600454336000908152600d602052604090205461071e9190610f42565b4210156107515760405162461bcd60e51b81526020600482015260016024820152601b60f91b60448201526064016100cd565b336000818152600e602052604080822091909155517f884edad9ce6fa2440d8a54cc123490eb96d2768479d49ff9c7366125a9424364906107959084815260200190565b60405180910390a260005460405163a9059cbb60e01b8152336004820152602481018390526001600160a01b039091169063a9059cbb906044016020604051808303816000875af11580156107ee573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906108129190610ff0565b6108425760405162461bcd60e51b81526020600482015260016024820152603760f81b60448201526064016100cd565b50565b336000908152600e6020526040812054806108865760405162461bcd60e51b81526020600482015260016024820152600d60fa1b60448201526064016100cd565b336000908152600a6020526040902054156108e05733600090815260096020908152604080832054600254600654600a909452919093205490916108c991610f5b565b6108d39190610f72565b6108dd9190610fdd565b91505b336000908152600e60209081526040808320839055600a9091528120805483929061090c908490610f42565b9091555050600254600654336000908152600a60205260409020546109319190610f5b565b61093b9190610f72565b3360009081526009602052604081209190915560038054839290610960908490610f42565b9091555050811561099057336000908152600c60205260408120805484929061098a908490610f42565b90915550505b60405181815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a906020016104be565b60008082116109d057600080fd5b336000908152600a602052604090205415610a2a5733600090815260096020908152604080832054600254600654600a90945291909320549091610a1391610f5b565b610a1d9190610f72565b610a279190610fdd565b90505b336000908152600e6020526040902054828110610a6b57336000908152600e602052604081208054859290610a60908490610fdd565b90915550610b3a9050565b6000610a778285610fdd565b336000818152600e6020526040808220829055905490516323b872dd60e01b81526004810192909252306024830152604482018390529192506001600160a01b03909116906323b872dd906064016020604051808303816000875af1158015610ae4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b089190610ff0565b610b385760405162461bcd60e51b81526020600482015260016024820152601960f91b60448201526064016100cd565b505b336000908152600a602052604081208054859290610b59908490610f42565b9091555050600254600654336000908152600a6020526040902054610b7e9190610f5b565b610b889190610f72565b3360009081526009602052604081209190915560038054859290610bad908490610f42565b90915550508115610bdd57336000908152600c602052604081208054849290610bd7908490610f42565b90915550505b60405183815233907febedb8b3c678666e7f36970bc8f57abf6d8fa2e828c0da91ea5b75bf68ed101a9060200160405180910390a2505050565b610c506040518060c001604052806000815260200160008152602001600081526020016000815260200160008152602001600081525090565b6001600160a01b038216600090815260096020908152604080832054600254600654600a909452918420548493849391610c8a9190610f5b565b610c949190610f72565b6001600160a01b0387166000908152600c6020526040902054610cb79190610f42565b610cc19190610fdd565b6004546001600160a01b0387166000908152600d6020526040902054919250610ce991610f42565b4210610d0f576001600160a01b0385166000908152600e60205260409020549250610d42565b6004546001600160a01b0386166000908152600d6020526040902054610d359042610fdd565b610d3f9190610f42565b91505b6040805160c0810182529182526020808301949094526001600160a01b039095166000818152600e855286812054838801528181526008855286812054606084015260808301939093528252600a909252929092205460a08301525090565b6001546040516370a0823160e01b81523060048201526000916001600160a01b038481169263a9059cbb92919091169083906370a0823190602401602060405180830381865afa158015610df9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e1d9190611012565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015610e80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea49190610ff0565b905080610ed75760405162461bcd60e51b81526020600482015260016024820152603160f81b60448201526064016100cd565b5050565b6001546001600160a01b03163314610ef257600080fd5b600180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055565b634e487b7160e01b600052601160045260246000fd5b80820180821115610f5557610f55610f2c565b92915050565b8082028115828204841417610f5557610f55610f2c565b600082610f8f57634e487b7160e01b600052601260045260246000fd5b500490565b600060208284031215610fa657600080fd5b5035919050565b600060208284031215610fbf57600080fd5b81356001600160a01b0381168114610fd657600080fd5b9392505050565b81810381811115610f5557610f55610f2c565b60006020828403121561100257600080fd5b81518015158114610fd657600080fd5b60006020828403121561102457600080fd5b505191905056fea26469706673582212201be65b40cb7776d62b638c878f0e41b37b004cbd039f7d54b20da61e3c9965eb64736f6c63430008190033a264697066735822122046423ee4c935bdced56258cde1f3d1fb2bf342aa964757dcbe6d6e2f64a4fcdf64736f6c63430008190033a2646970667358221220813ad1bb387b1626fb55a5f7da3188a0ea2efe4f0e527afd6d020a88cd87ea3264736f6c63430008190033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000a8939be8156f6adc5fbb519e346a11167acba1050000000000000000000000009c84288cb2c0fcad30f031ac1d4b1633ef994c63000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883000000000000000000000000000000000000000000000000002386f26fc10000000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b948830000000000000000000000004f0fd563be89ec8c3e7d595bf3639128c0a7c33a
-----Decoded View---------------
Arg [0] : _args (tuple): System.Collections.Generic.List`1[Nethereum.ABI.FunctionEncoding.ParameterOutput]
-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 000000000000000000000000a8939be8156f6adc5fbb519e346a11167acba105
Arg [1] : 0000000000000000000000009c84288cb2c0fcad30f031ac1d4b1633ef994c63
Arg [2] : 000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883
Arg [3] : 000000000000000000000000000000000000000000000000002386f26fc10000
Arg [4] : 000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883
Arg [5] : 000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883
Arg [6] : 000000000000000000000000a6ad18c2ac47803e193f75c3677b14bf19b94883
Arg [7] : 0000000000000000000000004f0fd563be89ec8c3e7d595bf3639128c0a7c33a
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ 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.