Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 42 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute Swap | 10162168 | 23 hrs ago | IN | 0 S | 0.00957407 | ||||
Execute Swap | 10161847 | 23 hrs ago | IN | 0 S | 0.0095596 | ||||
Execute Swap | 10086209 | 31 hrs ago | IN | 0 S | 0.0095596 | ||||
Execute Swap | 10085169 | 31 hrs ago | IN | 0 S | 0.0095596 | ||||
Add Token | 9840403 | 2 days ago | IN | 0 S | 0.01555251 | ||||
Add Token | 9840207 | 2 days ago | IN | 0 S | 0.01555581 | ||||
Add Token | 9840061 | 2 days ago | IN | 0 S | 0.01555185 | ||||
Add Token | 9839930 | 2 days ago | IN | 0 S | 0.01555977 | ||||
Add Token | 9839632 | 2 days ago | IN | 0 S | 0.01555647 | ||||
Add Token | 9839439 | 2 days ago | IN | 0 S | 0.01555581 | ||||
Add Token | 9839253 | 2 days ago | IN | 0 S | 0.01555251 | ||||
Add Token | 9839086 | 2 days ago | IN | 0 S | 0.01555383 | ||||
Add Token | 9838902 | 2 days ago | IN | 0 S | 0.01554987 | ||||
Add Token | 9838751 | 2 days ago | IN | 0 S | 0.01555581 | ||||
Add Token | 9838574 | 2 days ago | IN | 0 S | 0.01555119 | ||||
Add Token | 9838415 | 2 days ago | IN | 0 S | 0.01554987 | ||||
Add Dex | 9683938 | 2 days ago | IN | 0 S | 0.00718261 | ||||
Remove Dex | 9683787 | 2 days ago | IN | 0 S | 0.00403276 | ||||
Add Dex | 9681174 | 2 days ago | IN | 0 S | 0.00718327 | ||||
Remove Dex | 9680224 | 2 days ago | IN | 0 S | 0.00395714 | ||||
Add Dex | 9332215 | 4 days ago | IN | 0 S | 0.01052936 | ||||
Remove Dex | 9329787 | 4 days ago | IN | 0 S | 0.00612172 | ||||
Add Token | 9227207 | 5 days ago | IN | 0 S | 0.01555053 | ||||
Add Token | 9226319 | 5 days ago | IN | 0 S | 0.01555251 | ||||
Add Token | 9222753 | 5 days ago | IN | 0 S | 0.01555977 |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PegasusAggregator
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 1 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./interfaces/IDEXStructs.sol"; import "./PriceOracle.sol"; interface IRouter { function WETH() external pure returns (address); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactTokensForETH( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); } // New V3 Router Interface interface IV3Router { struct ExactInputParams { bytes path; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; } struct ExactInputSingleParams { address tokenIn; address tokenOut; uint24 fee; address recipient; uint256 deadline; uint256 amountIn; uint256 amountOutMinimum; uint160 sqrtPriceLimitX96; } function exactInput(ExactInputParams calldata params) external payable returns (uint256 amountOut); function exactInputSingle(ExactInputSingleParams calldata params) external payable returns (uint256 amountOut); function WETH9() external view returns (address); } // New V3 Quoter Interface interface IV3Quoter { function quoteExactInput( bytes memory path, uint256 amountIn ) external returns (uint256 amountOut); function quoteExactInputSingle( address tokenIn, address tokenOut, uint24 fee, uint256 amountIn, uint160 sqrtPriceLimitX96 ) external returns (uint256 amountOut); } interface IWeth { function deposit() external payable; function withdraw(uint256) external; } contract PegasusAggregator is Ownable { //for wrapped natives struct WrappedNatives { string name; address _address; address stableCoin; } //for price and pools struct PoolInfo { address poolAddress; bool isV3; uint256 liquidity; uint24 fee; } //for split quote and swap struct SplitRoute { address dexRouter; uint256 percentage; // Out of 10000 (100.00%) address[] path; // For V2 bytes v3Path; // For V3 bool isV3; uint24 feeTier; // For V3 } struct SplitQuote { SplitRoute[] routes; uint256 totalAmountOut; string[] dexNames; } //for direct swaps and quotes struct Quote { string dexName; address dexRouter; uint256 amountIn; uint256 amountOut; address[] path; //for v2 bytes v3Path; // For V3 bool isV3; uint24 feeTier; // For V3 } struct Token { string symbol; string name; address tokenAddress; uint8 decimals; uint256 chainId; string logouri; bool active; } struct Staker { uint256 stakedAmount; uint256 rewardDebt; uint256 unclaimedRewards; // Changed to single uint256 for WBNB rewards } // Staking and Fee Distribution IERC20 public stakingToken; address public teamFeeCollector; bool public distributeFeesToStakers; uint256 public accRewardPerShare; uint256 private constant REWARD_PRECISION = 1e12; //implementing multichain and fixing issues with wrapped mapping(uint256 => WrappedNatives) public wrappedByChain; //check if a dex is v3 mapping(address => bool) public isV3Router; mapping(address => Staker) public stakers; //total staked amount uint256 public totalStaked; // Fee denominator for percentage calculations (100% = 10000) uint256 private constant FEE_DENOMINATOR = 10000; // Initial fee of 0.2% = 20 basis points uint256 private swapFeePercent = 20; //For very low amounts uint256 public constant MIN_FEE_TO_CONVERT = 0.001 ether; // PriceOracle instance PriceOracle public priceOracle; mapping(uint256 => IDEXStructs.DEX[]) public supportedDexes; mapping(uint256 => Token[]) public tokensByChain; // chainId => Token[] mapping(address => bool) public isSupportedToken; // shows that a token is supported event TokenAdded(string symbol, address tokenAddress, uint256 chainId); event TokenRemoved(address tokenAddress, uint256 chainId); event TokenUpdated(string symbol, address tokenAddress, uint256 chainId); event SwapExecuted(address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut, address router, address recipient); event Staked(address indexed user, uint256 amount); event Unstaked(address indexed user, uint256 amount); event RewardClaimed(address indexed user, uint256 amount); event FeeDistributionModeChanged(bool distributeToStakers); event StakingTokenSet(address token); event FeeUpdated(uint256 oldFee, uint256 newFee); event RewardDistributed(uint256 amount); event SmallFeeCollected(address token, uint256 amount); constructor(address _stakingToken, address _priceOracle) Ownable(msg.sender) { require(_stakingToken != address(0), "Invalid staking token"); stakingToken = IERC20(_stakingToken); priceOracle = PriceOracle(_priceOracle); teamFeeCollector = msg.sender; distributeFeesToStakers = false; accRewardPerShare = 5e10; } // Function to update fee percentage function updateFeePercent(uint256 newFeePercent) external onlyOwner { require(newFeePercent <= 100, "Fee cannot exceed 1%"); // Safety check emit FeeUpdated(swapFeePercent, newFeePercent); swapFeePercent = newFeePercent; } //Helper functions function getWrappedNative(uint256 chain) internal view returns (address) { if(wrappedByChain[chain]._address != address(0)) { return wrappedByChain[chain]._address; } return address(0); } function calculateFee(uint256 amount) public view returns (uint256 feeAmount, uint256 finalAmount) { feeAmount = amount * swapFeePercent / FEE_DENOMINATOR; finalAmount = amount - feeAmount; return (feeAmount, finalAmount); } function executeV3Swap( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, uint24 feeTier, uint256 deadline ) internal returns (uint256) { IV3Router.ExactInputSingleParams memory params = IV3Router.ExactInputSingleParams({ tokenIn: tokenIn, tokenOut: tokenOut, fee: feeTier, recipient: address(this), deadline: deadline, amountIn: amountIn, amountOutMinimum: amountOutMin, sqrtPriceLimitX96: 0 }); try IV3Router(router).exactInputSingle(params) returns (uint256 _amountOut) { return _amountOut; } catch { revert("V3 swap failed"); } } function executeV2Swap( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, uint256 deadline, address[] memory path ) internal returns (uint256) { require(path.length >= 2, "Invalid path length"); require(path[0] == tokenIn, "First token in path must be tokenIn"); require(path[path.length - 1] == tokenOut, "Last token in path must be tokenOut"); try IRouter(router).swapExactTokensForTokens( amountIn, amountOutMin, path, address(this), deadline ) returns (uint[] memory amounts) { return amounts[amounts.length - 1]; } catch { revert("V2 swap failed"); } } //Aggregator tokens, quotes and swap handling function addToken( string calldata symbol, string calldata name, address tokenAddress, uint8 decimals, uint256 chainId, string calldata logoUri ) external onlyOwner { require(!isSupportedToken[tokenAddress], "Token already exists"); require(tokenAddress != address(0), "Invalid token address"); Token memory newToken = Token({ symbol: symbol, name: name, tokenAddress: tokenAddress, decimals: decimals, chainId: chainId, logouri: logoUri, active: true }); tokensByChain[chainId].push(newToken); isSupportedToken[tokenAddress] = true; emit TokenAdded(symbol, tokenAddress, chainId); } function removeToken(address tokenAddress, uint256 chainId) external onlyOwner { require(isSupportedToken[tokenAddress], "Token not found"); Token[] storage tokens = tokensByChain[chainId]; for (uint i = 0; i < tokens.length; i++) { if (tokens[i].tokenAddress == tokenAddress) { tokens[i] = tokens[tokens.length - 1]; tokens.pop(); isSupportedToken[tokenAddress] = false; emit TokenRemoved(tokenAddress, chainId); break; } } } function updateToken( address findBY, address tokenAddress, string memory name, string memory symbol, uint8 decimals, uint256 chainId, string memory logouri, bool isActive ) external onlyOwner { require(isSupportedToken[findBY], "Token not found"); Token[] storage tokens = tokensByChain[chainId]; for (uint i = 0; i < tokens.length; i++) { if (tokens[i].tokenAddress == findBY) { // Only update if a valid address is provided if(tokenAddress != address(0)) { tokens[i].tokenAddress = tokenAddress; } // Update name if provided if (bytes(name).length > 0) { tokens[i].name = name; } // Update symbol if provided if (bytes(symbol).length > 0) { tokens[i].symbol = symbol; } // Update decimals if provided and valid if (decimals != 0) { // Changed from decimals > 0 tokens[i].decimals = decimals; } // Update logo URI if provided if (bytes(logouri).length > 0) { tokens[i].logouri = logouri; } // Always update isActive tokens[i].active = isActive; emit TokenUpdated(tokens[i].symbol, tokenAddress, chainId); break; } } } function getAllTokens(uint256 chainId) external view returns (Token[] memory) { return tokensByChain[chainId]; } function getQuotes( address tokenIn, address tokenOut, uint256 amount, bool isExactIn, uint256 chain ) internal view returns (Quote[] memory) { Quote[] memory quotes = new Quote[](supportedDexes[chain].length * 3); uint256 validQuotes = 0; for (uint i = 0; i < supportedDexes[chain].length; i++) { if (!supportedDexes[chain][i].active) continue; //account for v3 if(supportedDexes[chain][i].isV3) { IV3Quoter quoter = IV3Quoter(supportedDexes[chain][i].quoter); for (uint j = 0; j < supportedDexes[chain][i].feeTiers.length; j++) { // Encode the function call data bytes memory callData = abi.encodeWithSelector( quoter.quoteExactInputSingle.selector, tokenIn, tokenOut, supportedDexes[chain][i].feeTiers[j], amount, 0 ); // Use low-level staticcall to simulate the function (bool success, bytes memory result) = address(quoter).staticcall(callData); if (success) { uint256 amountOut = abi.decode(result, (uint256)); quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][i].routerAddress, amountIn: amount, amountOut: amountOut, path: new address[](0), v3Path: abi.encodePacked(tokenIn, supportedDexes[chain][i].feeTiers[j], tokenOut), isV3: true, feeTier: supportedDexes[chain][i].feeTiers[j] }); validQuotes++; } } } else { // Existing V2 quote logic address WBNB = getWrappedNative(chain); // Try direct path address[] memory path = new address[](2); path[0] = tokenIn; path[1] = tokenOut; // Try WETH path address[] memory wethPath = new address[](3); wethPath[0] = tokenIn; wethPath[1] = WBNB; wethPath[2] = tokenOut; // Try path with stable coin address[] memory stablePath = new address[](3); stablePath[0] = tokenIn; stablePath[1] = wrappedByChain[chain].stableCoin; stablePath[2] = tokenOut; IRouter router = IRouter(supportedDexes[chain][i].routerAddress); try router.getAmountsOut(amount, path) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][i].routerAddress, amountIn: amount, amountOut: amounts[1], path: path, v3Path: "", isV3: false, feeTier: 0 }); validQuotes++; } } catch { // If direct path fails, try through WETH try router.getAmountsOut(amount, wethPath) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][i].routerAddress, amountIn: amount, amountOut: amounts[2], path: wethPath, v3Path: "", isV3: false, feeTier: 0 }); validQuotes++; } } catch { // If WETH path fails, try reverse WETH path try router.getAmountsOut(amount, stablePath) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[chain][i].name, dexRouter: supportedDexes[chain][i].routerAddress, amountIn: amount, amountOut: amounts[2], path: stablePath, v3Path: "", isV3: false, feeTier: 0 }); validQuotes++; } } catch {} } } } } // Resize array to remove empty quotes assembly { mstore(quotes, validQuotes) } return quotes; } //for split quote function getBestSplitQuote( address tokenIn, address tokenOut, uint256 amount, uint256 chain ) public view returns (SplitQuote memory) { // Get all possible quotes first Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, true, chain); require(quotes.length > 0, "No valid quotes found"); // Sort quotes by amountOut in descending order for(uint i = 0; i < quotes.length - 1; i++) { for(uint j = i + 1; j < quotes.length; j++) { if(quotes[j].amountOut > quotes[i].amountOut) { Quote memory temp = quotes[i]; quotes[i] = quotes[j]; quotes[j] = temp; } } } // Start with the best single route uint256 bestTotalOutput = 0; SplitQuote memory bestSplit; // Try different split combinations for(uint i = 0; i < quotes.length; i++) { for(uint j = i + 1; j < quotes.length; j++) { // Try different split ratios (25-75, 50-50, 75-25) uint256[] memory splits = new uint256[](3); splits[0] = 2500; // 25% splits[1] = 5000; // 50% splits[2] = 7500; // 75% for(uint s = 0; s < splits.length; s++) { uint256 amount1 = (amount * splits[s]) / 10000; uint256 amount2 = amount - amount1; // Calculate theoretical output uint256 output1 = (quotes[i].amountOut * splits[s]) / 10000; uint256 output2 = (quotes[j].amountOut * (10000 - splits[s])) / 10000; uint256 totalOutput = output1 + output2; if(totalOutput > bestTotalOutput) { bestTotalOutput = totalOutput; // Update best split bestSplit.routes = new SplitRoute[](2); bestSplit.dexNames = new string[](2); bestSplit.routes[0] = SplitRoute({ dexRouter: quotes[i].dexRouter, percentage: splits[s], path: quotes[i].path, v3Path: quotes[i].v3Path, isV3: quotes[i].isV3, feeTier: quotes[i].feeTier }); bestSplit.routes[1] = SplitRoute({ dexRouter: quotes[j].dexRouter, percentage: 10000 - splits[s], path: quotes[j].path, v3Path: quotes[j].v3Path, isV3: quotes[j].isV3, feeTier: quotes[j].feeTier }); bestSplit.dexNames[0] = quotes[i].dexName; bestSplit.dexNames[1] = quotes[j].dexName; bestSplit.totalAmountOut = totalOutput; } } } } return bestSplit; } //For direct swaps and quotes function getBestQuote( address tokenIn, address tokenOut, uint256 amount, bool isExactIn, uint256 chain ) external view returns (Quote memory) { Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, isExactIn, chain); require(quotes.length > 0, "No valid quotes found"); uint256 bestIndex = 0; uint256 bestAmount = isExactIn ? 0 : type(uint256).max; for (uint i = 0; i < quotes.length; i++) { if (isExactIn) { if (quotes[i].amountOut > bestAmount) { bestAmount = quotes[i].amountOut; bestIndex = i; } } else { if (quotes[i].amountIn < bestAmount) { bestAmount = quotes[i].amountIn; bestIndex = i; } } } return quotes[bestIndex]; } // for direct swaps function executeSwap( address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOutMin, address router, address recipient, uint256 deadline, uint24 feeTier, uint256 minFee, address[] memory path, uint256 chain ) external returns (uint256) { require(isSupportedToken[tokenIn] && isSupportedToken[tokenOut], "Unsupported tokens"); require(recipient != address(0), "Invalid recipient"); // Transfer tokens from sender to this contract IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn); // Approve router to spend tokens IERC20(tokenIn).approve(router, amountIn); uint256 amountOut; //account for v3 if(isV3Router[router]) { amountOut = executeV3Swap( tokenIn, tokenOut, amountIn, amountOutMin, router, feeTier, deadline ); } else { amountOut = executeV2Swap( tokenIn, tokenOut, amountIn, amountOutMin, router, deadline, path ); } // Get WETH/WBNB for fee handling address wrappedNative = getWrappedNative(chain); // Calculate fee (uint256 feeAmount, uint256 finalAmount) = calculateFee(amountOut); hadleFeeDestribution(feeAmount, wrappedNative, tokenOut, router, deadline, minFee); // Transfer final amount to recipient IERC20(tokenOut).transfer(recipient, finalAmount); emit SwapExecuted(tokenIn, tokenOut, amountIn, amountOut, router, recipient); return amountOut; } //for split swaps function executeSplitSwap( address tokenIn, address tokenOut, uint256 amountIn, uint256 minAmountOut, SplitRoute[] calldata routes, address recipient, uint256 deadline, uint256 minFee, uint256 chain ) external returns (uint256) { require(routes.length > 0, "No routes provided"); require(isSupportedToken[tokenIn] && isSupportedToken[tokenOut], "Unsupported tokens"); uint256 totalAmountOut = 0; // Transfer total input amount from sender IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn); // Execute each route for(uint i = 0; i < routes.length; i++) { uint256 routeAmountIn = (amountIn * routes[i].percentage) / 10000; // Approve router IERC20(tokenIn).approve(routes[i].dexRouter, routeAmountIn); uint256 routeAmountOut = routes[i].isV3 ? executeV3Swap(tokenIn, tokenOut, routeAmountIn, 0, routes[i].dexRouter, routes[i].feeTier, deadline) : executeV2Swap(tokenIn, tokenOut, routeAmountIn, 0, routes[i].dexRouter, deadline, routes[i].path); totalAmountOut += routeAmountOut; } require(totalAmountOut >= minAmountOut, "Insufficient output amount"); // Get WETH/WBNB from the first route's router address wrappedNative = getWrappedNative(chain); // Calculate and handle fees (uint256 feeAmount, uint256 finalAmount) = calculateFee(totalAmountOut); hadleFeeDestribution(feeAmount, wrappedNative, tokenOut, routes[0].dexRouter, deadline, minFee); // Transfer final amount to recipient IERC20(tokenOut).transfer(recipient, finalAmount); emit SwapExecuted(tokenIn, tokenOut, amountIn, totalAmountOut, address(0), recipient); return totalAmountOut; } //Fee distribution handling function hadleFeeDestribution(uint feeAmount, address WBNB, address tokenOut, address router, uint deadline, uint256 minFeeRequired) internal { // Handle fees based on minimum conversion amount if (distributeFeesToStakers && totalStaked > 0) { if (tokenOut != WBNB) { if (feeAmount >= minFeeRequired) { // Convert fees to Native token address[] memory feePath = new address[](2); feePath[0] = tokenOut; feePath[1] = WBNB; //get current contract balance uint256 balanceBefore = address(this).balance; IERC20(tokenOut).approve(router, feeAmount); IRouter(router).swapExactTokensForETH( feeAmount, 0, feePath, address(this), deadline); uint256 receivedBNB = address(this).balance - balanceBefore; // Update rewards only if conversion happened if (receivedBNB > 0) { accRewardPerShare += (address(this).balance * REWARD_PRECISION) / totalStaked; emit RewardDistributed(address(this).balance); } } else { // If fee is too small, send to team instead IERC20(tokenOut).transfer(teamFeeCollector, feeAmount); emit SmallFeeCollected(tokenOut, feeAmount); } } else { // Handle WBNB fees if (feeAmount >= MIN_FEE_TO_CONVERT) { IWeth(WBNB).withdraw(feeAmount); accRewardPerShare += (feeAmount * REWARD_PRECISION) / totalStaked; emit RewardDistributed(feeAmount); } else { // If fee is too small, send to team IERC20(WBNB).transfer(teamFeeCollector, feeAmount); } } } else { // If staking is disabled, send fees to team (automate by converting to bnb before sending to team) IERC20(tokenOut).transfer(teamFeeCollector, feeAmount); } } //Staking functions function stake(uint256 amount) external { require(amount > 0, "Cannot stake 0"); // Update rewards before changing stake updateReward(msg.sender); stakingToken.transferFrom(msg.sender, address(this), amount); stakers[msg.sender].stakedAmount += amount; totalStaked += amount; // Update reward debt stakers[msg.sender].rewardDebt = (stakers[msg.sender].stakedAmount * accRewardPerShare) / REWARD_PRECISION; emit Staked(msg.sender, amount); } function updateReward(address user) internal { if (totalStaked > 0) { Staker storage staker = stakers[user]; uint256 pending = (staker.stakedAmount * accRewardPerShare / REWARD_PRECISION) - staker.rewardDebt; staker.unclaimedRewards += pending; staker.rewardDebt = (staker.stakedAmount * accRewardPerShare) / REWARD_PRECISION; } } function claimReward() external { updateReward(msg.sender); uint256 reward = stakers[msg.sender].unclaimedRewards; if (reward > 0) { stakers[msg.sender].unclaimedRewards = 0; // Transfer Native rewards (bool success, ) = msg.sender.call{value: reward}(""); require(success, "BNB transfer failed"); emit RewardClaimed(msg.sender, reward); } } function unstake(uint256 amount) external { require(amount > 0, "Cannot unstake 0"); require(stakers[msg.sender].stakedAmount >= amount, "Insufficient stake"); updateReward(msg.sender); stakers[msg.sender].stakedAmount -= amount; totalStaked -= amount; // Update reward debt stakers[msg.sender].rewardDebt = (stakers[msg.sender].stakedAmount * accRewardPerShare) / REWARD_PRECISION; // Ensure the contract has enough balance before transferring require(address(this).balance >= amount, "Contract balance too low"); (bool success, ) = payable(msg.sender).call{value: amount}(""); require(success, "Native transfer failed"); emit Unstaked(msg.sender, amount); } function getStakerInfo(address _staker) external view returns ( uint256 stakedAmount, uint256 rewardDebt, uint256 unclaimedRewards ) { Staker storage staker = stakers[_staker]; return (staker.stakedAmount, staker.rewardDebt, staker.unclaimedRewards); } function getPendingRewards(address _staker) external view returns (uint256) { Staker storage staker = stakers[_staker]; uint256 pending = ((staker.stakedAmount * accRewardPerShare) / REWARD_PRECISION) - staker.rewardDebt; return staker.unclaimedRewards + pending; } // Admin update functions and helper functions function setFeeDistributionMode(bool _distributeToStakers) external onlyOwner { distributeFeesToStakers = _distributeToStakers; emit FeeDistributionModeChanged(_distributeToStakers); } function updateStakingToken(address _newToken) external onlyOwner { require(_newToken != address(0), "invalid address"); stakingToken = IERC20(_newToken); } function setTeamFeeCollector(address _collector) external onlyOwner { require(_collector != address(0), "Invalid address"); teamFeeCollector = _collector; } function getDexes(uint256 chain) public view returns(IDEXStructs.DEX[] memory) { return supportedDexes[chain]; } function getADex(address _dexRouter, uint256 chain) internal view returns (IDEXStructs.DEX memory) { require(_dexRouter != address(0), "Invalid router address"); for (uint256 i = 0; i < supportedDexes[chain].length; i++) { if (supportedDexes[chain][i].routerAddress == _dexRouter) { return supportedDexes[chain][i]; } } revert("DEX not found"); } //Dex handling function addDex( string calldata name, address router, address factory, bool isV3, address quoter, uint24[] calldata feeTiers, uint256 chain ) external onlyOwner { require(router != address(0), "invalid address"); if (isV3) { require(quoter != address(0), "invalid quoter address"); require(feeTiers.length > 0, "must provide fee tiers"); } supportedDexes[chain].push(IDEXStructs.DEX(name, router, factory, true, isV3, quoter, feeTiers)); isV3Router[router] = isV3; } function updateDex( uint256 index, string calldata name, address router, bool active, bool isV3, address quoter, uint24[] calldata feeTiers, uint256 chain ) external onlyOwner { require(index < supportedDexes[chain].length, "Invalid index"); IDEXStructs.DEX storage dex = supportedDexes[chain][index]; // Update only if the provided value is not empty or default if (bytes(name).length > 0) { dex.name = name; } if (router != address(0)) { dex.routerAddress = router; } dex.active = active; // bools default to false if not provided, so always update if (isV3 != dex.isV3) { dex.isV3 = isV3; } if (isV3 && quoter != address(0)) { dex.quoter = quoter; } if (isV3 && feeTiers.length > 0) { dex.feeTiers = feeTiers; } } function removeDex(string calldata name, uint256 chain) external onlyOwner { for (uint i = 0; i < supportedDexes[chain].length; i++) { if (keccak256(bytes(supportedDexes[chain][i].name)) == keccak256(bytes(name))) { supportedDexes[chain][i] = supportedDexes[chain][supportedDexes[chain].length - 1]; isV3Router[supportedDexes[chain][i].routerAddress] = false; supportedDexes[chain].pop(); return; } } revert("DEX not found"); } function toggleDex(uint256 index, bool active, uint256 chain) external onlyOwner { require(index < supportedDexes[chain].length, "Invalid index"); supportedDexes[chain][index].active = active; } //For wrapped function addWrapped(string memory name, address _address, address stable, uint256 chain) external onlyOwner { require(_address != address(0), "bad address"); wrappedByChain[chain] = WrappedNatives(name, _address, stable); } function updateWrapped(string memory name, address _address, address stable, uint256 chain) external onlyOwner { require(_address != address(0), "bad address"); wrappedByChain[chain].name = name; wrappedByChain[chain]._address = _address; wrappedByChain[chain].stableCoin = stable; } // Emergency functions function rescueTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).transfer(to, amount); } function updateOwner(address newOwner) external onlyOwner { transferOwnership(newOwner); } function updatePriceOracle(address _newOracle) external onlyOwner { require(_newOracle != address(0), "invalid address type"); priceOracle = PriceOracle(_newOracle); } function getTokenPrice(address token, uint256 chain) public view returns (uint256 price) { IDEXStructs.DEX[] memory dexes = getDexes(chain); return priceOracle.getTokenPrice(token, dexes, wrappedByChain[chain].stableCoin, wrappedByChain[chain]._address); } // Allow contract to receive BNB receive() external payable {} fallback() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @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 from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; interface IDEXStructs { struct DEX { string name; address routerAddress; address factory; bool active; bool isV3; address quoter; uint24[] feeTiers; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/access/Ownable.sol"; import "./interfaces/IDEXStructs.sol"; interface IUniswapV2Pair { function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function token0() external view returns (address); function token1() external view returns (address); } interface IUniswapV3Pool { function slot0() external view returns (uint160 sqrtPriceX96, int24 tick, uint16 observationIndex, uint16 observationCardinality, uint16 observationCardinalityNext, uint8 feeProtocol, bool unlocked); function token0() external view returns (address); function token1() external view returns (address); } interface IUniswapV2Factory { function getPair(address tokenA, address tokenB) external view returns (address pair); } contract PriceOracle is Ownable { constructor() Ownable(msg.sender) {} // Get the price of a token in USD (or stablecoin equivalent) function getTokenPrice(address token, IDEXStructs.DEX[] calldata dexes, address defaultStablecoin, address WETH) external view returns (uint256 price) { require(token != address(0), "Invalid token address"); // Try to get the price directly from the token/defaultStablecoin pair for (uint i = 0; i < dexes.length; i++) { if (!dexes[i].active) continue; if (dexes[i].isV3) { // Handle V3 pools for (uint j = 0; j < dexes[i].feeTiers.length; j++) { address pool = getV3Pool(dexes[i].factory, token, defaultStablecoin, dexes[i].feeTiers[j]); if (pool != address(0)) { price = getV3Price(pool, token); if (price > 0) return price; } } } else { // Handle V2 pools address pair = IUniswapV2Factory(dexes[i].factory).getPair(token, defaultStablecoin); if (pair != address(0)) { price = getV2Price(pair, token); if (price > 0) return price; } } } // If no direct pair, try to get the price via WETH for (uint i = 0; i < dexes.length; i++) { if (!dexes[i].active) continue; if (dexes[i].isV3) { // Handle V3 pools for (uint j = 0; j < dexes[i].feeTiers.length; j++) { address pool = getV3Pool(dexes[i].factory, token, address(WETH), dexes[i].feeTiers[j]); // WETH address if (pool != address(0)) { uint256 tokenWethPrice = getV3Price(pool, token); if (tokenWethPrice > 0) { uint256 wethStablecoinPrice = getWethPriceInStablecoin(dexes, defaultStablecoin, WETH); if (wethStablecoinPrice > 0) { price = (tokenWethPrice * wethStablecoinPrice) / 1e18; return price; } } } } } else { // Handle V2 pools address pair = IUniswapV2Factory(dexes[i].factory).getPair(token, address(WETH)); // WETH address if (pair != address(0)) { uint256 tokenWethPrice = getV2Price(pair, token); if (tokenWethPrice > 0) { uint256 wethStablecoinPrice = getWethPriceInStablecoin(dexes, defaultStablecoin, WETH); if (wethStablecoinPrice > 0) { price = (tokenWethPrice * wethStablecoinPrice) / 1e18; return price; } } } } } revert("No liquid pool found"); } // Get price from a V2 pool function getV2Price(address pair, address token) internal view returns (uint256 price) { IUniswapV2Pair pairContract = IUniswapV2Pair(pair); (uint112 reserve0, uint112 reserve1,) = pairContract.getReserves(); address token0 = pairContract.token0(); address token1 = pairContract.token1(); if (token == token0) { price = (uint256(reserve1) * 1e18) / uint256(reserve0); // Price in token1 (stablecoin) } else { price = (uint256(reserve0) * 1e18) / uint256(reserve1); // Price in token0 (stablecoin) } return price; } // Get price from a V3 pool function getV3Price(address pool, address token) internal view returns (uint256 price) { IUniswapV3Pool poolContract = IUniswapV3Pool(pool); (uint160 sqrtPriceX96,,,,,,) = poolContract.slot0(); // Convert sqrtPriceX96 to price uint256 priceX96 = uint256(sqrtPriceX96) * uint256(sqrtPriceX96); price = (priceX96 * 1e18) >> 192; // Adjust price direction if needed if (token == poolContract.token0()) { price = (1e18 * 1e18) / price; } return price; } // Get V3 pool address function getV3Pool(address factory, address tokenA, address tokenB, uint24 fee) internal pure returns (address) { (address token0, address token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); bytes32 poolKeyHash = keccak256(abi.encode(token0, token1, fee)); bytes32 poolAddressHash = keccak256(abi.encodePacked( hex"ff", factory, poolKeyHash, hex"e34f199b19b2b4f47f68442619d555527d244f78a3297ea89325f843f87b8b54" )); return address(uint160(uint256(poolAddressHash))); } // Get WETH price in stablecoin function getWethPriceInStablecoin(IDEXStructs.DEX[] calldata dexes, address defaultStablecoin, address WETH) internal view returns (uint256 price) { for (uint i = 0; i < dexes.length; i++) { if (!dexes[i].active) continue; if (dexes[i].isV3) { // Handle V3 pools for (uint j = 0; j < dexes[i].feeTiers.length; j++) { address pool = getV3Pool(dexes[i].factory, address(WETH), defaultStablecoin, dexes[i].feeTiers[j]); // WETH address if (pool != address(0)) { price = getV3Price(pool, address(WETH)); if (price > 0) return price; } } } else { // Handle V2 pools address pair = IUniswapV2Factory(dexes[i].factory).getPair(address(WETH), defaultStablecoin); // WETH address if (pair != address(0)) { price = getV2Price(pair, address(WETH)); if (price > 0) return price; } } } revert("WETH price not found"); } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 1 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_stakingToken","type":"address"},{"internalType":"address","name":"_priceOracle","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"distributeToStakers","type":"bool"}],"name":"FeeDistributionModeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"oldFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardClaimed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"RewardDistributed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"SmallFeeCollected","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Staked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"token","type":"address"}],"name":"StakingTokenSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenIn","type":"address"},{"indexed":false,"internalType":"address","name":"tokenOut","type":"address"},{"indexed":false,"internalType":"uint256","name":"amountIn","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"amountOut","type":"uint256"},{"indexed":false,"internalType":"address","name":"router","type":"address"},{"indexed":false,"internalType":"address","name":"recipient","type":"address"}],"name":"SwapExecuted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"symbol","type":"string"},{"indexed":false,"internalType":"address","name":"tokenAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"TokenUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Unstaked","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MIN_FEE_TO_CONVERT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accRewardPerShare","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"},{"internalType":"uint24[]","name":"feeTiers","type":"uint24[]"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"addDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"logoUri","type":"string"}],"name":"addToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stable","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"addWrapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"calculateFee","outputs":[{"internalType":"uint256","name":"feeAmount","type":"uint256"},{"internalType":"uint256","name":"finalAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"distributeFeesToStakers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"minAmountOut","type":"uint256"},{"components":[{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes","name":"v3Path","type":"bytes"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"feeTier","type":"uint24"}],"internalType":"struct PegasusAggregator.SplitRoute[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint256","name":"minFee","type":"uint256"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"executeSplitSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"router","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"uint24","name":"feeTier","type":"uint24"},{"internalType":"uint256","name":"minFee","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"executeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"getAllTokens","outputs":[{"components":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct PegasusAggregator.Token[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"isExactIn","type":"bool"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"getBestQuote","outputs":[{"components":[{"internalType":"string","name":"dexName","type":"string"},{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes","name":"v3Path","type":"bytes"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"feeTier","type":"uint24"}],"internalType":"struct PegasusAggregator.Quote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"getBestSplitQuote","outputs":[{"components":[{"components":[{"internalType":"address","name":"dexRouter","type":"address"},{"internalType":"uint256","name":"percentage","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"bytes","name":"v3Path","type":"bytes"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"uint24","name":"feeTier","type":"uint24"}],"internalType":"struct PegasusAggregator.SplitRoute[]","name":"routes","type":"tuple[]"},{"internalType":"uint256","name":"totalAmountOut","type":"uint256"},{"internalType":"string[]","name":"dexNames","type":"string[]"}],"internalType":"struct PegasusAggregator.SplitQuote","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"getDexes","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"},{"internalType":"uint24[]","name":"feeTiers","type":"uint24[]"}],"internalType":"struct IDEXStructs.DEX[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getPendingRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_staker","type":"address"}],"name":"getStakerInfo","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"unclaimedRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"price","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isSupportedToken","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isV3Router","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"priceOracle","outputs":[{"internalType":"contract PriceOracle","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"removeDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"chainId","type":"uint256"}],"name":"removeToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"rescueTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_distributeToStakers","type":"bool"}],"name":"setFeeDistributionMode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collector","type":"address"}],"name":"setTeamFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"stake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"stakers","outputs":[{"internalType":"uint256","name":"stakedAmount","type":"uint256"},{"internalType":"uint256","name":"rewardDebt","type":"uint256"},{"internalType":"uint256","name":"unclaimedRewards","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"stakingToken","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"supportedDexes","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"routerAddress","type":"address"},{"internalType":"address","name":"factory","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamFeeCollector","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"toggleDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokensByChain","outputs":[{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalStaked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"unstake","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"router","type":"address"},{"internalType":"bool","name":"active","type":"bool"},{"internalType":"bool","name":"isV3","type":"bool"},{"internalType":"address","name":"quoter","type":"address"},{"internalType":"uint24[]","name":"feeTiers","type":"uint24[]"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"updateDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFeePercent","type":"uint256"}],"name":"updateFeePercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"updateOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newOracle","type":"address"}],"name":"updatePriceOracle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newToken","type":"address"}],"name":"updateStakingToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"findBY","type":"address"},{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"uint8","name":"decimals","type":"uint8"},{"internalType":"uint256","name":"chainId","type":"uint256"},{"internalType":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"isActive","type":"bool"}],"name":"updateToken","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stable","type":"address"},{"internalType":"uint256","name":"chain","type":"uint256"}],"name":"updateWrapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"wrappedByChain","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stableCoin","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60803461017057601f6160c038819003918201601f19168301916001600160401b0383118484101761017557808492604094855283398101031261017057610052602061004b8361018b565b920161018b565b90331561015a5760008054336001600160a01b0319821681178355604051939290916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a360146008556001600160a01b03169081156101185750600180546001600160a01b0319908116929092179055600980549091166001600160a01b0392909216919091179055600280546001600160a81b0319163360ff60a01b1916179055640ba43b7400600355604051615f2090816101a08239f35b62461bcd60e51b815260206004820152601560248201527f496e76616c6964207374616b696e6720746f6b656e00000000000000000000006044820152606490fd5b631e4fbdf760e01b600052600060045260246000fd5b600080fd5b634e487b7160e01b600052604160045260246000fd5b51906001600160a01b03821682036101705756fe60806040526004361015610010575b005b60003560e01c806303a56b32146102db57806313baf1e6146102d65780632182e467146102d1578063240028e8146102cc5780632630c12f146102c75780632688807c146102c25780632e17de78146102bd57806339d1fc82146102b857806346492600146102b35780634c984d38146102ae57806359e63b23146102a95780635bc4e0ec146102a45780635f524ea31461029f5780636c96b2bf1461029a578063715018a61461029557806372f702f314610290578063733bdef014610263578063817b1cd21461028b57806381ee07151461028657806383ad068c14610281578063849295881461027c57806384b06bc014610277578063880cdc31146102725780638cf106e11461026d5780638da5cb5b146102685780639168ae7214610263578063939d62371461025e57806399a5d747146102595780639ed12c3114610254578063a694fc3a1461024f578063a7d87c0e1461024a578063b0fa369414610245578063b24266cb14610240578063b5d52d1a1461023b578063b88a802f14610236578063ba14713214610231578063c9f7153c1461022c578063cc21392e14610227578063cea9d26f14610222578063e4a68abe1461021d578063f05c5fed14610218578063f2fde38b14610213578063f6ed20171461020e578063f7191877146102095763fa972c660361000e576125f9565b6124f1565b6123fd565b6123e0565b612347565b6122a6565b61221c565b61211d565b611f71565b611f4b565b611eb7565b611e8e565b611d41565b611c31565b611b59565b611a43565b6119e1565b6119b3565b611995565b61164e565b61196c565b61192a565b6118cf565b611847565b611737565b6116e8565b6116c6565b6116a8565b611625565b6115de565b611554565b611420565b6112a8565b61119a565b611002565b610f6e565b610ea1565b610dae565b6109b5565b610813565b6107c6565b6106e0565b610580565b6104ca565b600052600b602052604060002090565b6000526004602052604060002090565b600052600a602052604060002090565b90600182811c92168015610340575b602083101461032a57565b634e487b7160e01b600052602260045260246000fd5b91607f169161031f565b634e487b7160e01b600052604160045260246000fd5b60e081019081106001600160401b0382111761037b57604052565b61034a565b606081019081106001600160401b0382111761037b57604052565b60c081019081106001600160401b0382111761037b57604052565b601f909101601f19168101906001600160401b0382119082101761037b57604052565b90604051918260008254926103ed84610310565b808452936001811690811561045b5750600114610414575b50610412925003836103b6565b565b90506000929192526020600020906000915b81831061043f5750509060206104129282010138610405565b6020919350806001915483858901015201910190918492610426565b90506020925061041294915060ff191682840152151560051b82010138610405565b6001600160a01b031690565b919082519283825260005b8481106104b5575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201610494565b3461053657602036600319011261053657600435600052600460205261052760406000206104f7816103d9565b60018201546002909201546040516060808252909485946001600160a01b03908116949316929091850190610489565b91602084015260408301520390f35b600080fd5b6001600160a01b0381160361053657565b60a435906104128261053b565b602435906104128261053b565b608435906104128261053b565b600435906104128261053b565b346105365760403660031901126105365760043561059d8161053b565b6024356105a86148dd565b6105c36105be6105b784610778565b5460ff1690565b612689565b6105cc816102e0565b6001600160a01b038316929060005b81548082101561000e57856105f0838561257b565b50600201546001600160a01b03906106079061047d565b161461061657506001016105db565b7fbe9bb4bdca0a094babd75e3a98b1d2e2390633430d0a2f6e2b9970e2ee03fb2e9550610669929161065e610656610650610664946126dd565b8561257b565b50918461257b565b906128c9565b612a0c565b61067f61067582610778565b805460ff19169055565b61068e60405192839283612a63565b0390a1005b9181601f84011215610536578235916001600160401b038311610536576020838186019501011161053657565b6064359060ff8216820361053657565b6084359060ff8216820361053657565b346105365760c0366003190112610536576004356001600160401b03811161053657610710903690600401610693565b6024356001600160401b0381116105365761072f903690600401610693565b60449391933561073e8161053b565b6107466106c0565b9060843560a435969093906001600160401b0388116105365761077061000e983690600401610693565b979096612a7e565b6001600160a01b03166000908152600c6020526040902090565b6001600160a01b0316600090815260066020526040902090565b6001600160a01b0316600090815260056020526040902090565b34610536576020366003190112610536576004356107e38161053b565b60018060a01b0316600052600c602052602060ff604060002054166040519015158152f35b600091031261053657565b34610536576000366003190112610536576009546040516001600160a01b039091168152602090f35b906020808351928381520192019060005b81811061085a5750505090565b82516001600160a01b031684526020938401939092019160010161084d565b9080602083519182815201916020808360051b8301019401926000915b8383106108a557505050505090565b90919293946020806108c3600193601f198682030187528951610489565b97019301930191939290610896565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b828210610936575050505092604084602061093395960151828401520151906060601f1982850301910152610879565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610994610982604087015160c0604088015260c087019061083c565b60608701518682036060880152610489565b94608081015115156080860152015116910152970192019201909291610903565b34610536576080366003190112610536576004356109d28161053b565b6109ff602435916109e28361053b565b60443580936109f060643590565b926109f9612e5d565b50614ac2565b610a0b81511515612e7d565b60005b610a1882516126dd565b811015610aae57610a2881612ec1565b8251811015610aa557806060610a4060019386612f09565b5101516060610a4f8587612f09565b51015110610a5e575b01610a28565b610a688385612f09565b51610a738286612f09565b51610a7e8587612f09565b52610a898486612f09565b50610a948286612f09565b52610a9f8185612f09565b50610a58565b50600101610a0e565b50600090610aba612e5d565b906000905b8051821015610d9c57610ad182612ec1565b8151811015610d9157610ae2612f1d565b926109c4610aef85612edc565b52611388610afc85612ee9565b52611d4c610b0985612ef9565b5260005b8451811015610d8657610b3e610b38610b30610b298489612f09565b518b612999565b612710900490565b896126fc565b50610b9c610b68610b306060610b548689612f09565b510151610b61858a612f09565b5190612999565b610b96610b306060610b7a888a612f09565b510151610b90610b8a878c612f09565b516126ec565b90612999565b90612ecf565b878111610bad575b50600101610b0d565b965086610bb8612f5f565b8752610bc2612fda565b60408801908152610bd38487612f09565b5160200151610be19061047d565b610beb8489612f09565b51610bf68689612f09565b5160800151610c05878a612f09565b5160a00151610c14888b612f09565b5160c00151151591610c26898c612f09565b5160e0015162ffffff1693610c3961133a565b95610c449087612c01565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610c7082612edc565b52610c7a90612edc565b50610c858587612f09565b51602001610c9290612cbc565b610c9c8489612f09565b51610ca6906126ec565b610cb08789612f09565b5160800151610cbf888a612f09565b5160a00151610cce898b612f09565b5160c00151151591610ce08a8c612f09565b5160e0015162ffffff1693610cf361133a565b95610cfe9087612c01565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610d2a82612ee9565b52610d3490612ee9565b50610d3f8487612f09565b5151815190610d4d82612edc565b52610d5790612edc565b50610d628587612f09565b5151905190610d7082612ee9565b52610d7a90612ee9565b50602087015238610ba4565b509250600101610ad1565b509060010190610abf565b60405180610daa85826108d2565b0390f35b3461053657602036600319011261053657600435610dcd811515613015565b610de281610dda33610792565b541015613054565b610deb3361560f565b610df433610792565b610dff8282546126fc565b9055610e15610e10826007546126fc565b600755565b610e39610e2e610e2433610792565b5460035490612999565b64e8d4a51000900490565b6001610e4433610792565b0155610e5281471015613095565b610e6c600080808085335af1610e666130f1565b50613121565b60405190815233907f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f759080602081015b0390a2005b3461053657602036600319011261053657600435610ebe8161053b565b610ec66148dd565b6001600160a01b03168015610eeb57600980546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526014602482015273696e76616c69642061646472657373207479706560601b6044820152606490fd5b8015150361053657565b60e4359061041282610f27565b9181601f84011215610536578235916001600160401b038311610536576020808501948460051b01011161053657565b3461053657610100366003190112610536576004356024356001600160401b03811161053657610fa2903690600401610693565b6044359291610fb08461053b565b606435610fbc81610f27565b608435610fc881610f27565b610fd061054c565b60c435969092906001600160401b03881161053657610ff661000e983690600401610f3e565b96909560e43598613166565b346105365760203660031901126105365760043561101f8161053b565b6110276148dd565b6001600160a01b0316801561104c57600280546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b906020808351928381520192019060005b8181106110a15750505090565b825162ffffff16845260209384019390920191600101611094565b9080602083519182815201916020808360051b8301019401926000915b8383106110e857505050505090565b909192939460208061117a600193601f1986820301875289519060c0611117835160e0845260e0840190610489565b92878060a01b03868201511686840152878060a01b0360408201511660408401526060810151151560608401526111576080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c0818403910152611083565b970193019301919392906110d9565b9060206109339281815201906110bc565b3461053657602036600319011261053657600435600052600a602052604060002080546111c6816117bf565b916111d460405193846103b6565b818352602083019060005260206000206000915b8383106111fd5760405180610daa8782611189565b6005602060019260405161121081610360565b611219866103d9565b8152848060a01b03858701541683820152611270611267600288015461124a6112418261047d565b60408601612c01565b61125e60a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b611289611280600388015461047d565b60a08301612c01565b611295600487016134ed565b60c08201528152019201920191906111e8565b346105365760e0366003190112610536576004356001600160401b038111610536576112d8903690600401610693565b906024356112e58161053b565b604435926112f28461053b565b6064356112fe81610f27565b6084359061130b8261053b565b60a435956001600160401b0387116105365761132e61000e973690600401610f3e565b95909460c435976137da565b6040519061041260c0836103b6565b6040519061041260e0836103b6565b60405190610412610100836103b6565b6001600160401b03811161037b57601f01601f191660200190565b92919261138f82611368565b9161139d60405193846103b6565b829481845281830111610536578281602093846000960137010152565b9080601f830112156105365781602061093393359101611383565b608060031982011261053657600435906001600160401b038211610536576113ff916004016113ba565b9060243561140c8161053b565b906044356114198161053b565b9060643590565b346105365761142e366113d5565b9261143a9291926148dd565b61144e6001600160a01b0383161515613c06565b6000848152600460205260409020815190916001600160401b03821161037b576114828261147c8554610310565b85612736565b602090601f83116001146114d857936114c2936114b48461000e99956114c8956002996000926114cd575b505061277b565b90555b60016114c2846102f0565b01612873565b6102f0565b0151905038806114ad565b601f19831691906114ee85600052602060002090565b9260005b81811061153c5750846114c894600298946114c2989461000e9c9860019510611523575b505050811b0190556114b7565b015160001960f88460031b161c19169055388080611516565b929360206001819287860151815501950193016114f2565b3461053657610120366003190112610536576004356115728161053b565b6024359061157f8261053b565b6064359160843591906044356001600160401b03841161053657610daa946115ae6115ce953690600401610f3e565b9060a435926115bc8461053b565b60c4359460e435966101043598613dd4565b6040519081529081906020820190565b34610536576000366003190112610536576115f76148dd565b600080546001600160a01b0319811682556001600160a01b0316600080516020615e8b8339815191528280a3005b34610536576000366003190112610536576001546040516001600160a01b039091168152602090f35b346105365760203660031901126105365760043561166b8161053b565b6001600160a01b03166000908152600660209081526040918290208054600182015460029092015484519182529281019190915291820152606090f35b34610536576000366003190112610536576020600754604051908152f35b3461053657600036600319011261053657602060405166038d7ea4c680008152f35b34610536576020366003190112610536576004356117058161053b565b61170d6148dd565b6001600160a01b031661172181151561390e565b600180546001600160a01b031916919091179055005b34610536576060366003190112610536576024356117a1600261179560043561175f85610f27565b60443561176a6148dd565b80600052600a602052611783604060002054831061326c565b600052600a6020526040600020612487565b50019115158254612892565b9055005b62ffffff81160361053657565b60e43590610412826117a5565b6001600160401b03811161037b5760051b60200190565b9291906117e2816117bf565b936117f060405195866103b6565b602085838152019160051b810192831161053657905b82821061181257505050565b6020809183356118218161053b565b815201910190611806565b9080601f8301121561053657816020610933933591016117d6565b3461053657610160366003190112610536576004356118658161053b565b6024356118718161053b565b6044359160643591611881610566565b61188961054c565b60c4356118946117b2565b916101043561012435979094906001600160401b03891161053657610daa996118c46115ce9a369060040161182c565b9761014435996140cb565b34610536576020366003190112610536576004356118ec8161053b565b6118f46148dd565b6118fc6148dd565b6001600160a01b038116156119145761000e90615e55565b631e4fbdf760e01b600052600060045260246000fd5b34610536576020366003190112610536576004356119478161053b565b60018060a01b03166000526005602052602060ff604060002054166040519015158152f35b34610536576000366003190112610536576000546040516001600160a01b039091168152602090f35b34610536576000366003190112610536576020600354604051908152f35b34610536576020366003190112610536576119cf6004356142c4565b60408051928352602083019190915290f35b34610536576020366003190112610536577f4c8f77ced8e25e80ecc91fdca3da46ae6123bc7181d3a543bda07b8821f711906020600435611a2181610f27565b611a296148dd565b1515611a3781600254612892565b600255604051908152a1005b3461053657602036600319011261053657600435611a628115156142e3565b611a6b3361560f565b611a7e611a7960015461047d565b61047d565b602060405180926323b872dd60e01b825281600081611aa288303360048501613cd7565b03925af18015611b5457611b27575b50611abb33610792565b611ac6828254612ecf565b9055611ad7610e1082600754612ecf565b611ae6610e2e610e2433610792565b6001611af133610792565b015560405190815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d908060208101610e9c565b611b489060203d602011611b4d575b611b4081836103b6565b810190613cc2565b611ab1565b503d611b36565b613cf9565b34610536576040366003190112610536576004356001600160401b03811161053657611b8c61000e913690600401610693565b60243591611b986148dd565b614556565b610933906020815261010060e0611c19611c03611bc68751856020880152610120870190610489565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a088015261083c565b60a0870151858203601f190160c0870152610489565b60c086015115158483015294015162ffffff16910152565b346105365760a036600319011261053657600435611c4e8161053b565b611c8360243591611c5e8361053b565b60443592606435938491611c7183610f27565b60843593611c7d614648565b5061508c565b90611c9082511515612e7d565b6000908015611d3957815b90825b8451811015611d1f578115611ce757826060611cba8388612f09565b51015111611ccd575b6001905b01611c9e565b925090506060611cdd8385612f09565b5101519082611cc3565b826040611cf48388612f09565b51015110611d05575b600190611cc7565b925090506040611d158385612f09565b5101519082611cfd565b610daa611d2c8587612f09565b5160405191829182611b9d565b600019611c9b565b3461053657611d4f366113d5565b9291611d596148dd565b6001600160a01b031692611d6e841515613c06565b60405192611d7b84610380565b835260208301938452604083019160018060a01b0316825260005260046020526040600020915192835160018060401b03811161037b57611dc681611dc08654610310565b86612736565b6020601f8211600114611e1157611e01611e0a93611df88460029795611dfb9561000e9b6000926114cd57505061277b565b87555b5161047d565b60018601612873565b9101612873565b601f19821695611e2686600052602060002090565b9660005b818110611e7657509360018461000e99611dfb95611e019560029a98611e0a9a10611e5d575b505050811b018755611dfb565b015160001960f88460031b161c19169055388080611e50565b83830151895560019098019760209384019301611e2a565b34610536576000366003190112610536576002546040516001600160a01b039091168152602090f35b3461053657600036600319011261053657611ed13361560f565b33600052600660205260026040600020015480611eea57005b33600052600660205260006002604082200155611f17600080808085335af1611f116130f1565b50614699565b60405190815233907f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241908060208101610e9c565b3461053657600036600319011261053657602060ff60025460a01c166040519015158152f35b3461053657604036600319011261053657600435611f8e8161053b565b602060243580600052600a8252611fa8604060002061372c565b611fb6611a7960095461047d565b90611fda6001611fcd611fd46002611fcd886102f0565b015461047d565b956102f0565b94611ffb60405196879586948594633dfc3f3560e21b8652600486016146ea565b03915afa8015611b5457610daa91600091612022575b506040519081529081906020820190565b612044915060203d60201161204a575b61203c81836103b6565b8101906146db565b38612011565b503d612032565b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061208457505050505090565b9091929394602080600192603f1985820301865261210e89519160c0806121046120ca6120ba875160e0875260e0870190610489565b888801518682038a880152610489565b898060a01b03604088015116604086015260ff60608801511660608601526080870151608086015260a087015185820360a0870152610489565b9401511515910152565b97019301930191939290612075565b3461053657602036600319011261053657600435600052600b60205260406000208054612149816117bf565b9161215760405193846103b6565b818352602083019060005260206000206000915b8383106121805760405180610daa8782612051565b6006602060019260405161219381610360565b61219c866103d9565b81526121a98587016103d9565b838201526121d96121cf6002880154878060a01b038116604085015260ff9060a01c1690565b60ff166060830152565b600386015460808201526121ef600487016103d9565b60a082015261220e612205600588015460ff1690565b151560c0830152565b81520192019201919061216b565b3461053657606036600319011261053657612275602060043561223e8161053b565b6024359061224b8261053b565b604435916122576148dd565b600060405180968195829463a9059cbb60e01b845260048401612a63565b03926001600160a01b03165af18015611b545761228e57005b61000e9060203d602011611b4d57611b4081836103b6565b3461053657610100366003190112610536576122c0610573565b6122c8610559565b906044356001600160401b038111610536576122e89036906004016113ba565b916064356001600160401b038111610536576123089036906004016113ba565b6123106106d0565b60c4359460a43592906001600160401b0387116105365761233861000e9736906004016113ba565b94612341610f31565b96614727565b34610536576020366003190112610536576004356123636148dd565b606481116123a45760085460408051918252602082018390527f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df6130291a1600855005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b34610536576020366003190112610536576004356118f48161053b565b346105365760203660031901126105365760043561241a8161053b565b60018060a01b03166000526006602052604060002064e8d4a51000612443825460035490612999565b04906001810154820391821161246c576002015490810180911161246c57604051908152602090f35b6126c7565b634e487b7160e01b600052603260045260246000fd5b80548210156124a3576000526005602060002091020190600090565b612471565b94919695926124c260a0959260c0885260c0880190610489565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b346105365760403660031901126105365760043560243590600052600a60205260406000209081548110156105365761252991612487565b50612533816103d9565b60018201546002830154600390930154604051938493610daa936001600160a01b039384169360a884901c60ff9081169460a081901c909116939082169290911690876124a8565b80548210156124a3576000526006602060002091020190600090565b95916125f1946125c960ff926125bb60c099959c9b9c60e08c5260e08c0190610489565b908a820360208c0152610489565b6001600160a01b039095166040890152166060870152608086015284820360a0860152610489565b931515910152565b346105365760403660031901126105365760043560243590600052600b6020526040600020908154811015610536576126319161257b565b5061263b816103d9565b90610daa61264b600183016103d9565b91600281015490600381015460ff6005612667600485016103d9565b930154169260405196879660ff8360a01c169260018060a01b03169188612597565b1561269057565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b60001981019190821161246c57565b6127100390612710821161246c57565b9190820391821161246c57565b634e487b7160e01b600052600060045260246000fd5b81811061272a575050565b6000815560010161271f565b9190601f811161274557505050565b610412926000526020600020906020601f840160051c83019310612771575b601f0160051c019061271f565b9091508190612764565b8160011b916000199060031b1c19161790565b91909182811461286e576127a28354610310565b6001600160401b03811161037b576127c4816127be8454610310565b84612736565b600093601f82116001146127f7576127e892939482916000926127ec57505061277b565b9055565b0154905038806114ad565b61280b601f19831691600052602060002090565b9461281b84600052602060002090565b91815b8181106128565750958360019596971061283d575b505050811b019055565b015460001960f88460031b161c19169055388080612833565b9192600180602092868b01548155019401920161281e565b509050565b80546001600160a01b0319166001600160a01b03909216919091179055565b60ff60a01b191660a09190911b60ff60a01b161790565b9060ff6127e891168254612892565b9060ff801983541691151516179055565b9061294a578181036128d9575050565b600560ff81846128ec610412968661278e565b6128fc600182016001870161278e565b61292660028601846002840161291b60018060a01b0382541684612873565b5460a01c16906128a9565b60038101546003860155612940600482016004870161278e565b01541691016128b8565b612709565b634e487b7160e01b600052603160045260246000fd5b9060038202918083046003149015171561246c57565b9064e8d4a5100082029180830464e8d4a51000149015171561246c57565b8181029291811591840414171561246c57565b6129b68154610310565b90816129c0575050565b81601f600093116001146129d2575055565b818352602083206129ee91601f0160051c81019060010161271f565b808252602082209081548360011b9084198560031b1c191617905555565b80548015612a5e576000190190612a23828261257b565b61294a57600581612a356000936129ac565b612a41600182016129ac565b826002820155826003820155612a59600482016129ac565b015555565b61294f565b6001600160a01b039091168152602081019190915260400190565b95939281977f021066d9f43780503f155e50fc23c3d3ac8ba8edd3fbc3aee45c67ddb5f7078899612b29612b7598612b0d612b5097612b3696612b048e612ae0612adb60ff8f612ad590612ad06148dd565b610778565b54161590565b612b7a565b612af46001600160a01b038e161515612bbd565b612afc611349565b9a3691611383565b89523691611383565b6020870152612b1f8860408801612c01565b60ff166060860152565b8660808501523691611383565b60a0820152600160c0820152612b4b846102e0565b612cc9565b612b69612b5c82610778565b805460ff19166001179055565b60405194859485612e1f565b0390a1565b15612b8157565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b15612bc457565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606490fd5b6001600160a01b039091169052565b81519192916001600160401b03811161037b57612c31816127be8454610310565b6020601f8211600114612c545781906127e89394956000926114cd57505061277b565b601f19821690612c6984600052602060002090565b9160005b818110612ca457509583600195969710612c8b57505050811b019055565b015160001960f88460031b161c19169055388080612833565b9192602060018192868b015181550194019201612c6d565b516001600160a01b031690565b8054919291600160401b81101561037b57612ce99160018201815561257b565b61294a57825180519093906001600160401b03811161037b57612d108161147c8554610310565b6020601f8211600114612da657600592612d3e83612d9f9460c094610412999a6000926114cd57505061277b565b85555b612d52602082015160018701612c10565b612d7d60028601612d6f612d69604085015161047d565b82612873565b606083015160ff16906128a9565b60808101516003860155612d9860a082015160048701612c10565b0151151590565b91016128b8565b601f19821695612dbb85600052602060002090565b9660005b818110612e07575083610412979860c09460059794612d9f9760019510612dee575b505050811b018555612d41565b015160001960f88460031b161c19169055388080612de1565b83830151895560019098019760209384019301612dbf565b90826040936080929796959760608552816060860152838501376000828285010152601f80199101168201019460018060a01b031660208201520152565b60405190612e6a82610380565b6060604083828152600060208201520152565b15612e8457565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b906001820180921161246c57565b9190820180921161246c57565b8051156124a35760200190565b8051600110156124a35760400190565b8051600210156124a35760600190565b80518210156124a35760209160051b010190565b60405160809190612f2e83826103b6565b6003815291601f1901366020840137565b8115612f49570490565b634e487b7160e01b600052601260045260246000fd5b612f6960026117bf565b90612f7760405192836103b6565b6002825281601f19612f8960026117bf565b019060005b828110612f9a57505050565b602090604051612fa98161039b565b600081526000838201526060604082015260608082015260006080820152600060a082015282828501015201612f8e565b60405160609190612feb83826103b6565b6002815291601f19018260005b82811061300457505050565b806060602080938501015201612ff8565b1561301c57565b60405162461bcd60e51b815260206004820152601060248201526f043616e6e6f7420756e7374616b6520360841b6044820152606490fd5b1561305b57565b60405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e74207374616b6560701b6044820152606490fd5b1561309c57565b60405162461bcd60e51b8152602060048201526018602482015277436f6e74726163742062616c616e636520746f6f206c6f7760401b6044820152606490fd5b604051906130eb6020836103b6565b60008252565b3d1561311c573d9061310282611368565b9161311060405193846103b6565b82523d6000602084013e565b606090565b1561312857565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b61319361319892939a97969761317a6148dd565b61318e61318682610300565b54841061326c565b610300565b612487565b50978061325b575b50506001600160a01b038116613248575b506131c060028701918261335c565b826131d86131d3835460ff9060a81c1690565b151590565b81151503613238575b905080613226575b613213575b508061320a575b6131fe57505050565b6004610412930161341c565b508115156131f5565b6132209060038601612873565b386131ee565b506001600160a01b03811615156131e9565b6132419161336a565b38826131e1565b6132559060018801612873565b386131b1565b61326591896132a8565b38806131a0565b1561327357565b60405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b6044820152606490fd5b9092916001600160401b03811161037b576132c7816127be8454610310565b6000601f82116001146132f55781906127e89394956000926132ea57505061277b565b0135905038806114ad565b601f1982169461330a84600052602060002090565b91805b87811061334457508360019596971061332a57505050811b019055565b0135600019600384901b60f8161c19169055388080612833565b9092602060018192868601358155019401910161330d565b906127e89015158254612892565b805460ff60a81b191691151560a81b60ff60a81b16919091179055565b90600160401b811161037b5781548183558082106133a457505050565b61041292600052600a600960206000209260038380848801048601960602806133d2575b500104019061271f565b6000198601908154906000199060200360031b1c169055386133c8565b35610933816117a5565b62ffffff9160031b1c1690565b9062ffffff809160031b9316831b921b19161790565b91906001600160401b03821161037b576134469061343a8385613387565b92600052602060002090565b600a82049160005b8381106134ad5750600a8302900380613468575b50505050565b9260009360005b81811061348457505050015538808080613462565b90919460206134a3600192613498896133ef565b908560030290613406565b960192910161346f565b6000805b600a81106134c657508382015560010161344e565b959060206134e46001926134d9856133ef565b908a60030290613406565b920196016134b1565b6040518154808252909291839061350d6020830191600052602060002090565b926000905b8060098301106136715761041294549181811061365b575b818110613641575b818110613627575b81811061360d575b8181106135f3575b8181106135d9575b8181106135bf575b8181106135a5575b81811061358b575b10613578575b5003836103b6565b60d81c62ffffff16815260200138613570565b60c083901c62ffffff16845292600190602001930161356a565b60a883901c62ffffff168452926001906020019301613562565b609083901c62ffffff16845292600190602001930161355a565b607883901c62ffffff168452926001906020019301613552565b606083901c62ffffff16845292600190602001930161354a565b604883901c62ffffff168452926001906020019301613542565b603083901c62ffffff16845292600190602001930161353a565b601883901c62ffffff168452926001906020019301613532565b62ffffff8316845292600190602001930161352a565b91600a91935061014060019161371e87546136958362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b019401920185929391613512565b908154613738816117bf565b9261374660405194856103b6565b818452602084019060005260206000206000915b8383106137675750505050565b6005602060019260405161377a81610360565b613783866103d9565b8152848060a01b038587015416838201526137ab611267600288015461124a6112418261047d565b6137bb611280600388015461047d565b6137c7600487016134ed565b60c082015281520192019201919061375a565b9491979692909593966137eb6148dd565b876138006001600160a01b038b16151561390e565b61387e575b9361387996936138636104129a979461384b61386a9561383361382a6138749b610300565b98612afc611349565b89526138428b60208b01612c01565b60408901612c01565b600160608801528a1515608088015260a08701612c01565b3691613991565b60c0830152613aae565b6107ac565b6128b8565b9095929794919360018060a01b038516156138d057886138636138749661384b6138799a61383361382a6104129f986138bb61386a9a151561394c565b979b50505095505094979a5050939650613805565b60405162461bcd60e51b8152602060048201526016602482015275696e76616c69642071756f746572206164647265737360501b6044820152606490fd5b1561391557565b60405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606490fd5b1561395357565b60405162461bcd60e51b81526020600482015260166024820152756d7573742070726f766964652066656520746965727360501b6044820152606490fd5b92919061399d816117bf565b936139ab60405195866103b6565b602085838152019160051b810192831161053657905b8282106139cd57505050565b6020809183356139dc816117a5565b8152019101906139c1565b815190916001600160401b03821161037b576020613a1691613a098486613387565b0192600052602060002090565b600a82049160005b838110613a755750600a8302900380613a375750505050565b9260009360005b818110613a5357505050015538808080613462565b9091946020613a6b600192613498895162ffffff1690565b9601929101613a3e565b6000805b600a8110613a8e575083820155600101613a1e565b95906020613aa56001926134d9855162ffffff1690565b92019601613a79565b8054919291600160401b81101561037b57613ace91600182018155612487565b61294a57825180519093906001600160401b03811161037b57613af58161147c8554610310565b6020601f8211600114613b905791613b208260c09360049561041298996000926114cd57505061277b565b84555b613b33611e01602083015161047d565b613b6e60028501613b4a612d69604085015161047d565b613b60613b5a6060850151151590565b8261335c565b608083015115155b9061336a565b613b87613b7e60a083015161047d565b60038601612873565b015191016139e7565b601f19821695613ba585600052602060002090565b9660005b818110613bee5750926104129697600495936001938360c09710613bd5575b505050811b018455613b23565b015160001960f88460031b161c19169055388080613bc8565b83830151895560019098019760209384019301613ba9565b15613c0d57565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b15613c4757565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b15613c8857565b60405162461bcd60e51b8152602060048201526012602482015271556e737570706f7274656420746f6b656e7360701b6044820152606490fd5b90816020910312610536575161093381610f27565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b90156124a35780359060be1981360301821215610536570190565b91908110156124a35760051b8101359060be1981360301821215610536570190565b356109338161053b565b3561093381610f27565b903590601e198136030182121561053657018035906001600160401b03821161053657602001918160051b3603831361053657565b15613d9257565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b959493909691979298613de8851515613c40565b613df46105b788610778565b80614074575b613e0390613c81565b6000998a613e3460208c60018060a01b038c169360405180809581946323b872dd60e01b8352303360048501613cd7565b0391865af18015611b5457614057575b508b905b878210613f4057505092613e9792898c613e91613e8c613e84613e7e60209b98613e79613eb29f9e9c871015613d8b565b615aeb565b936142c4565b999095613d05565b613d42565b92615b54565b6040518094819263a9059cbb60e01b83528560048401612a63565b038160006001600160a01b0389165af18015611b5457600080516020615ecb83398151915295613f1d938892613f23575b50604080516001600160a01b039687168152968616602088015286015260608501526000608085015290911660a0830152819060c0820190565b0390a190565b613f3b9060203d602011611b4d57611b4081836103b6565b613ee3565b909b8c613f919160208a8f613e8c613f6d610b30613f769386613f658f888c91613d20565b013590612999565b9586938c613d20565b60405163095ea7b360e01b8152958692839260048401612a63565b03816000885af1918215611b54578f908d8f8b928b918f600199613ffd9961403b575b50613fcb6080613fc5898488613d20565b01613d4c565b156140055760a0613ff18883613feb613e8c610b969c613ff7978b613d20565b97613d20565b016133ef565b9361598a565b9c0190613e48565b61402e6140248883613feb613e8c610b969c614035978b9d9c9d613d20565b6040810190613d56565b36916117d6565b946157aa565b6140529060203d8111611b4d57611b4081836103b6565b613fb4565b61406f9060203d602011611b4d57611b4081836103b6565b613e44565b50613e036140846105b78a610778565b9050613dfa565b1561409257565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b96959299919890976140df6105b789610778565b806142ad575b6140ee90613c81565b6141026001600160a01b038716151561408b565b6040516323b872dd60e01b81526001600160a01b03891694906020818061412e8f303360048501613cd7565b038160008a5af18015611b545760009660209261416992614292575b508d60405198898094819363095ea7b360e01b83528d60048401612a63565b03925af1978815611b54578a6141c08b6141ba9f8f948b87926141e29f97876141c79c60209f859b614276575b506141a36105b7866107ac565b1561426a57506141b296615a74565b9e8f97615aeb565b966142c4565b9690615b54565b6040518095819263a9059cbb60e01b83528660048401612a63565b038160006001600160a01b038a165af18015611b5457600080516020615ecb83398151915296613f1d94899261424d575b50604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b6142659060203d602011611b4d57611b4081836103b6565b614213565b9594506141b2966158be565b61428d9060203d8111611b4d57611b4081836103b6565b614196565b6142a890843d8611611b4d57611b4081836103b6565b61414a565b506140ee6142bd6105b78b610778565b90506140e5565b906127106142d460085484612999565b0480830392831161246c579190565b156142ea57565b60405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606490fd5b6000929181549161433083610310565b8083529260018116908115614386575060011461434c57505050565b60009081526020812093945091925b83831061436c575060209250010190565b60018160209294939454838587010152019101919061435b565b915050602093945060ff929192191683830152151560051b010190565b906104126143b79260405193848092614320565b03836103b6565b90808214614454578054906001600160401b03821161037b5761343a6143f3916143e88486613387565b600052602060002090565b91600a82049181549160005b848110614437575050600a830280820361441b575b5050505050565b60039060001992030260031b1b19169101553880808080614414565b600191820180546001600160f01b039095168783015591016143ff565b5050565b9061294a57818103614468575050565b60048083614479610412958561278e565b61449260018060a01b0360018301541660018601612873565b6144d360028501613b68600284016144b360018060a01b0382541684612873565b6144c760ff825460a01c1615158454612892565b83555460a81c60ff1690565b6144e3613b7e600383015461047d565b0191016143be565b80548015612a5e5760001901906145028282612487565b61294a57806145126004926129ac565b600060018201556000600282015560006003820155018054600082558061453857505055565b61455391600052600a6009602060002092010481019061271f565b55565b919060005b61456483610300565b548110156146135761458261457c8261319386610300565b506143a3565b60208151910120614594368487611383565b60208151910120146145a85760010161455b565b6104129350829150610675613874600161460661318e946145fd6145e96145d161460e9a610300565b6145e36145dd8b610300565b546126dd565b90612487565b506145f7836131938b610300565b90614458565b61319387610300565b50015461047d565b6144eb565b60405162461bcd60e51b815260206004820152600d60248201526c111156081b9bdd08199bdd5b99609a1b6044820152606490fd5b6040519061010082016001600160401b0381118382101761037b57604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b156146a057565b60405162461bcd60e51b8152602060048201526013602482015272109390881d1c985b9cd9995c8819985a5b1959606a1b6044820152606490fd5b90816020910312610536575190565b929493906060926147109160018060a01b031685526080602086015260808501906110bc565b6001600160a01b0395861660408501529416910152565b969295919390956147366148dd565b6147456105be6105b78a610778565b61474e866102e0565b6001600160a01b03909816979460005b86548110156148a55789614772828961257b565b50600201546001600160a01b03906147899061047d565b16146147975760010161475e565b937f797b048fe238984247feb0b0239ad7d08a410e65210a7ce2b62bf9be4558662c9950612b75969361480c93614811979360018060a01b038c16614889575b8051614873575b508051614859575b5060ff811661483c575b50805161481f575b506005614805858561257b565b50016128b8565b61257b565b5091604051938493846148b1565b61483690600461482f878761257b565b5001612c10565b386147f8565b61485390600261484c888861257b565b50016128a9565b386147f0565b61486d90614867888861257b565b50612c10565b386147e6565b61488390600161482f8a8a61257b565b386147de565b6148a08c60026148998b8b61257b565b5001612873565b6147d7565b50505050505050505050565b6148c960409295949395606083526060830190614320565b6001600160a01b0390951660208201520152565b6000546001600160a01b031633036148f157565b63118cdaa760e01b6000523360045260246000fd5b90614910826117bf565b61491d60405191826103b6565b828152809261492e601f19916117bf565b019060005b82811061493f57505050565b60209061494a614648565b82828501015201614933565b6040516060919061496783826103b6565b6002815291601f1901366020840137565b604051906149876020836103b6565b6000808352366020840137565b602081830312610536578051906001600160401b03821161053657019080601f830112156105365781516149c7816117bf565b926149d560405194856103b6565b81845260208085019260051b82010192831161053657602001905b8282106149fd5750505090565b81518152602091820191016149f0565b60409061093393928152816020820152019061083c565b600019811461246c5760010190565b91909180548310156124a3576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b9392909193614ae1614adc614ad684610300565b54612965565b614906565b9160009384925b614af183610300565b5484101561508157614b1e614b1a6002614b0e8761319388610300565b50015460a01c60ff1690565b1590565b61507757614b406002614b348661319387610300565b50015460a81c60ff1690565b15614d5a57614b5a611a7960036146068761319388610300565b6001600160a01b03169660005b896004614b778861319389610300565b500154821015614d495760008091614bd1614bdf614bb0614ba9876004614ba28f8f61319390610300565b5001614a33565b90546133f9565b92604051928391602083019563f7729d4360e01b87528c8c60248601614a55565b03601f1981018352826103b6565b51908c5afa614bec6130f1565b90614bfb575b50600101614b67565b809891985181016020019060200190614c13916146db565b86614c1d87610300565b90614c2791612487565b5090858c89614c358a610300565b90614c3f91612487565b5060010154614c4d9061047d565b92614c56614978565b918d8c614c628d610300565b90614c6c91612487565b5060040190614c7a91614a33565b905490614c86916133f9565b896040519586926020840192614c9b93614a8b565b03601f1981018552614cad90856103b6565b8d8c614cb88d610300565b90614cc291612487565b5060040190614cd091614a33565b905490614cdc916133f9565b94614ce5611358565b96614cef906103d9565b8752614cfe9060208801612c01565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e0820152614d2d8289612f09565b52614d388188612f09565b50614d4290614a24565b9638614bf2565b50509360019197505b019295614ae8565b9592614d6583615aeb565b614d6d614956565b88614d7782612edc565b90614d8191612c01565b83614d8b82612ee9565b90614d9591612c01565b614d9d612f1d565b9189614da884612edc565b90614db291612c01565b614dbb83612ee9565b90614dc591612c01565b83614dcf83612ef9565b90614dd991612c01565b614de1612f1d565b9189614dec84612edc565b90614df691612c01565b614dff866102f0565b600201546001600160a01b0316614e1584612ee9565b90614e1f91612c01565b84614e2984612ef9565b90614e3391612c01565b83614e3d87610300565b90614e4791612487565b5060010154614e559061047d565b614e5e9061047d565b614e679061047d565b918b8360405180809363d06ca61f60e01b8252856004830191614e8992614a0d565b03815a93600094fa6000918161505c575b5061502a575050614ec36000828d604051938492839263d06ca61f60e01b845260048401614a0d565b0381865afa6000918161500f575b50614fdd575050600082614efc928c60405180958194829363d06ca61f60e01b845260048401614a0d565b03915afa60009181614fba575b50614f19575b5050600190614d52565b9684614fb2928499614f6c614f4e614f4860016146068a613193614f41849d6131938c610300565b5099610300565b92612ef9565b5191614f61614f5b611358565b956103d9565b855260208501612c01565b8c604084015260608301526080820152614f846130dc565b60a0820152600060c0820152600060e0820152614fa18289612f09565b52614fac8188612f09565b50614a24565b959038614f0f565b614fd691923d8091833e614fce81836103b6565b810190614994565b9038614f09565b615009935084999250908691614f6c614f4e614f4860016146068a613193614f41849d6131938c610300565b95614d52565b61502391923d8091833e614fce81836103b6565b9038614ed1565b6150099450859a9350879250614f6c614f4e61505660016146068a613193614f41849d6131938c610300565b92612ee9565b61507091923d8091833e614fce81836103b6565b9038614e9a565b9592600190614d52565b505050918152925050565b9293949091946150a1614adc614ad683610300565b9260009485935b6150b184610300565b54851015615602576150ce614b1a6002614b0e8861319389610300565b6155f6576150e46002614b348761319388610300565b156152e857966150ff611a7960036146068861319389610300565b6001600160a01b03169760005b8a600461511c896131938a610300565b5001548210156152d45760008091614bd1615169615148614ba98760048f8f90613193614ba292610300565b92604051928391602083019563f7729d4360e01b87528d8d60248601614a55565b51908d5afa6151766130f1565b90615185575b5060010161510c565b80999199518101602001906020019061519d916146db565b8b868b8a6151aa8b610300565b906151b491612487565b50938b6151c08c610300565b906151ca91612487565b50600101546151d89061047d565b936151e1614978565b928d8d82826151ef83610300565b906151f991612487565b506004019061520791614a33565b905490615213916133f9565b8d604051988992602084019261522893614a8b565b03601f198101885261523a90886103b6565b61524390610300565b9061524d91612487565b506004019061525b91614a33565b905490615267916133f9565b94615270611358565b9661527a906103d9565b87526152899060208801612c01565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e08201526152b8828a612f09565b526152c38189612f09565b506152cd90614a24565b973861517c565b5050946001919298505b01939690966150a8565b936152f584989298615aeb565b6152fd614956565b908961530883612edc565b9061531291612c01565b8461531c83612ee9565b9061532691612c01565b61532e612f1d565b908a61533983612edc565b9061534391612c01565b61534c82612ee9565b9061535691612c01565b8461536082612ef9565b9061536a91612c01565b838b615374612f1d565b928c61537f85612edc565b9061538991612c01565b615392896102f0565b600201546001600160a01b03166153a885612ee9565b906153b291612c01565b876153bc85612ef9565b906153c691612c01565b856153d08a610300565b906153da91612487565b50600101546153e89061047d565b6153f19061047d565b6153fa9061047d565b60405163d06ca61f60e01b815290959086818061541b858860048401614a0d565b03815a93600094fa600091816155db575b5061559f57505060405163d06ca61f60e01b815260008180615452858760048401614a0d565b0381895afa60009181615584575b506155405750508261548c939460009260405180968194829363d06ca61f60e01b845260048401614a0d565b03915afa60009281615525575b506154aa575b5050506001906152de565b6154b5575b8361549f565b978561551d92849a6154dd614f4e614f4860016146068a613193614f41849d6131938c610300565b8d6040840152606083015260808201526154f56130dc565b60a0820152600060c0820152600060e0820152615512828a612f09565b52614fac8189612f09565b9690386154af565b61553991933d8091833e614fce81836103b6565b9138615499565b9350935050615554575b50506001906152de565b978561557c92849a6154dd614f4e614f4860016146068a613193614f41849d6131938c610300565b96903861554a565b61559891923d8091833e614fce81836103b6565b9038615460565b9450945050506155b35750506001906152de565b978561557c92849a6154dd614f4e61505660016146068a613193614f41849d6131938c610300565b6155ef91923d8091833e614fce81836103b6565b903861542c565b936001909791976152de565b9750505050509150815290565b6007546156195750565b60018060a01b03166000526006602052604060002064e8d4a51000615642825460035490612999565b0460018201918254820391821161246c576002810190815492830180931161246c5764e8d4a510009261567a92555460035490612999565b049055565b1561568657565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b156156c857565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b1561572057565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b919260809361579692979695978452602084015260a0604084015260a083019061083c565b6001600160a01b0390951660608201520152565b615838956158176000969594936157ee88946157ca60028651101561567f565b6157db6157d686612edc565b612cbc565b6001600160a01b039081169116146156c1565b6158046157d66157fe85516126dd565b85612f09565b6001600160a01b03908116911614615719565b6040516338ed173960e01b8152968795869485933091869060048701615771565b03926001600160a01b03165af1600091816158a1575b506158895760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b8061589761589d92516126dd565b90612f09565b5190565b6158b79192503d806000833e614fce81836103b6565b903861584e565b926158ff60009697939594926158e988946158dd60028851101561567f565b6157db6157d688612edc565b6158046157d66158f987516126dd565b87612f09565b615838604051978896879586946338ed173960e01b8652309260048701615771565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b90916000956159c36020966159b7615a0297966159af6159a8611358565b9788612c01565b898701612c01565b62ffffff166040850152565b6159d03060608501612c01565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b835260048301615921565b03926001600160a01b03165af160009181615a53575b506109335760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b615a6d91925060203d60201161204a5761203c81836103b6565b9038615a18565b91600096615aad602097615aa1615a02989795615a99615a92611358565b9889612c01565b8a8801612c01565b62ffffff166040860152565b615aba3060608601612c01565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b835260048301615921565b6000818152600460205260409020600101546001600160a01b0316615b105750600090565b6000908152600460205260409020600101546001600160a01b031690565b90608092615796919695949683526000602084015260a0604084015260a083019061083c565b9391949290600254615b6a8160ff9060a01c1690565b80615e4a575b15615e1957506001600160a01b0386811694908216858114615d4e57508510615cbb57615bba90615bb1615ba2614956565b97615bac89612edc565b612c01565b615bac87612ee9565b47936020604051809563095ea7b360e01b825281600081615bdf878960048401612a63565b03925af18015611b5457615c17966000958692615c9e575b506040516318cbafe560e01b815297889586948593309160048601615b2e565b03926001600160a01b03165af1918215611b5457615c3b92615c85575b50476126fc565b615c4157565b615c69615c64615c5c615c534761297b565b60075490612f3f565b600354612ecf565b600355565b604051478152600080516020615eab83398151915290602090a1565b615c99903d806000833e614fce81836103b6565b615c34565b615cb69060203d602011611b4d57611b4081836103b6565b615bf7565b50505091602082615cef94615cd160025461047d565b600060405180988195829463a9059cbb60e01b845260048401612a63565b03925af1928315611b54577f908406b56189c30392bacd00cee68169cef0cd507c315e5efdbf09b99008d02793615d31575b50612b7560405192839283612a63565b615d499060203d602011611b4d57611b4081836103b6565b615d21565b96505066038d7ea4c6800085109350615ddd9250505057813b1561053657604051632e1a7d4d60e01b815260048101829052916000908390602490829084905af1908115611b5457600080516020615eab83398151915292612b7592615dc2575b506115ce615c64615c5c615c538461297b565b80615dd16000615dd7936103b6565b80610808565b38615daf565b602090615def9261225760025461047d565b03925af18015611b5457615e01575b50565b615dfe9060203d602011611b4d57611b4081836103b6565b90506020949350615e30959250612257915061047d565b03926001600160a01b03165af18015611b5457615e015750565b506007541515615b70565b600080546001600160a01b039283166001600160a01b0319821681178355921690600080516020615e8b8339815191529080a356fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e004944120d2e185fc95ba63f3ca24c385ec4c5215a801c8766c96486d7fc4ed8eb37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da264697066735822122031b4031342ff6a6c7c8e877358e94a74c9c12c0b4892702430e82e1f7ca9e10c64736f6c634300081c0033000000000000000000000000170eb0a66204feb483f9dd8c2c57f6fd8fc4dadc00000000000000000000000048518e6d26736e67275a5c920459da8a58da4e0e
Deployed Bytecode
0x60806040526004361015610010575b005b60003560e01c806303a56b32146102db57806313baf1e6146102d65780632182e467146102d1578063240028e8146102cc5780632630c12f146102c75780632688807c146102c25780632e17de78146102bd57806339d1fc82146102b857806346492600146102b35780634c984d38146102ae57806359e63b23146102a95780635bc4e0ec146102a45780635f524ea31461029f5780636c96b2bf1461029a578063715018a61461029557806372f702f314610290578063733bdef014610263578063817b1cd21461028b57806381ee07151461028657806383ad068c14610281578063849295881461027c57806384b06bc014610277578063880cdc31146102725780638cf106e11461026d5780638da5cb5b146102685780639168ae7214610263578063939d62371461025e57806399a5d747146102595780639ed12c3114610254578063a694fc3a1461024f578063a7d87c0e1461024a578063b0fa369414610245578063b24266cb14610240578063b5d52d1a1461023b578063b88a802f14610236578063ba14713214610231578063c9f7153c1461022c578063cc21392e14610227578063cea9d26f14610222578063e4a68abe1461021d578063f05c5fed14610218578063f2fde38b14610213578063f6ed20171461020e578063f7191877146102095763fa972c660361000e576125f9565b6124f1565b6123fd565b6123e0565b612347565b6122a6565b61221c565b61211d565b611f71565b611f4b565b611eb7565b611e8e565b611d41565b611c31565b611b59565b611a43565b6119e1565b6119b3565b611995565b61164e565b61196c565b61192a565b6118cf565b611847565b611737565b6116e8565b6116c6565b6116a8565b611625565b6115de565b611554565b611420565b6112a8565b61119a565b611002565b610f6e565b610ea1565b610dae565b6109b5565b610813565b6107c6565b6106e0565b610580565b6104ca565b600052600b602052604060002090565b6000526004602052604060002090565b600052600a602052604060002090565b90600182811c92168015610340575b602083101461032a57565b634e487b7160e01b600052602260045260246000fd5b91607f169161031f565b634e487b7160e01b600052604160045260246000fd5b60e081019081106001600160401b0382111761037b57604052565b61034a565b606081019081106001600160401b0382111761037b57604052565b60c081019081106001600160401b0382111761037b57604052565b601f909101601f19168101906001600160401b0382119082101761037b57604052565b90604051918260008254926103ed84610310565b808452936001811690811561045b5750600114610414575b50610412925003836103b6565b565b90506000929192526020600020906000915b81831061043f5750509060206104129282010138610405565b6020919350806001915483858901015201910190918492610426565b90506020925061041294915060ff191682840152151560051b82010138610405565b6001600160a01b031690565b919082519283825260005b8481106104b5575050826000602080949584010152601f8019910116010190565b80602080928401015182828601015201610494565b3461053657602036600319011261053657600435600052600460205261052760406000206104f7816103d9565b60018201546002909201546040516060808252909485946001600160a01b03908116949316929091850190610489565b91602084015260408301520390f35b600080fd5b6001600160a01b0381160361053657565b60a435906104128261053b565b602435906104128261053b565b608435906104128261053b565b600435906104128261053b565b346105365760403660031901126105365760043561059d8161053b565b6024356105a86148dd565b6105c36105be6105b784610778565b5460ff1690565b612689565b6105cc816102e0565b6001600160a01b038316929060005b81548082101561000e57856105f0838561257b565b50600201546001600160a01b03906106079061047d565b161461061657506001016105db565b7fbe9bb4bdca0a094babd75e3a98b1d2e2390633430d0a2f6e2b9970e2ee03fb2e9550610669929161065e610656610650610664946126dd565b8561257b565b50918461257b565b906128c9565b612a0c565b61067f61067582610778565b805460ff19169055565b61068e60405192839283612a63565b0390a1005b9181601f84011215610536578235916001600160401b038311610536576020838186019501011161053657565b6064359060ff8216820361053657565b6084359060ff8216820361053657565b346105365760c0366003190112610536576004356001600160401b03811161053657610710903690600401610693565b6024356001600160401b0381116105365761072f903690600401610693565b60449391933561073e8161053b565b6107466106c0565b9060843560a435969093906001600160401b0388116105365761077061000e983690600401610693565b979096612a7e565b6001600160a01b03166000908152600c6020526040902090565b6001600160a01b0316600090815260066020526040902090565b6001600160a01b0316600090815260056020526040902090565b34610536576020366003190112610536576004356107e38161053b565b60018060a01b0316600052600c602052602060ff604060002054166040519015158152f35b600091031261053657565b34610536576000366003190112610536576009546040516001600160a01b039091168152602090f35b906020808351928381520192019060005b81811061085a5750505090565b82516001600160a01b031684526020938401939092019160010161084d565b9080602083519182815201916020808360051b8301019401926000915b8383106108a557505050505090565b90919293946020806108c3600193601f198682030187528951610489565b97019301930191939290610896565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b828210610936575050505092604084602061093395960151828401520151906060601f1982850301910152610879565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610994610982604087015160c0604088015260c087019061083c565b60608701518682036060880152610489565b94608081015115156080860152015116910152970192019201909291610903565b34610536576080366003190112610536576004356109d28161053b565b6109ff602435916109e28361053b565b60443580936109f060643590565b926109f9612e5d565b50614ac2565b610a0b81511515612e7d565b60005b610a1882516126dd565b811015610aae57610a2881612ec1565b8251811015610aa557806060610a4060019386612f09565b5101516060610a4f8587612f09565b51015110610a5e575b01610a28565b610a688385612f09565b51610a738286612f09565b51610a7e8587612f09565b52610a898486612f09565b50610a948286612f09565b52610a9f8185612f09565b50610a58565b50600101610a0e565b50600090610aba612e5d565b906000905b8051821015610d9c57610ad182612ec1565b8151811015610d9157610ae2612f1d565b926109c4610aef85612edc565b52611388610afc85612ee9565b52611d4c610b0985612ef9565b5260005b8451811015610d8657610b3e610b38610b30610b298489612f09565b518b612999565b612710900490565b896126fc565b50610b9c610b68610b306060610b548689612f09565b510151610b61858a612f09565b5190612999565b610b96610b306060610b7a888a612f09565b510151610b90610b8a878c612f09565b516126ec565b90612999565b90612ecf565b878111610bad575b50600101610b0d565b965086610bb8612f5f565b8752610bc2612fda565b60408801908152610bd38487612f09565b5160200151610be19061047d565b610beb8489612f09565b51610bf68689612f09565b5160800151610c05878a612f09565b5160a00151610c14888b612f09565b5160c00151151591610c26898c612f09565b5160e0015162ffffff1693610c3961133a565b95610c449087612c01565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610c7082612edc565b52610c7a90612edc565b50610c858587612f09565b51602001610c9290612cbc565b610c9c8489612f09565b51610ca6906126ec565b610cb08789612f09565b5160800151610cbf888a612f09565b5160a00151610cce898b612f09565b5160c00151151591610ce08a8c612f09565b5160e0015162ffffff1693610cf361133a565b95610cfe9087612c01565b6020860152604085015260608401521515608083015262ffffff1660a0820152885190610d2a82612ee9565b52610d3490612ee9565b50610d3f8487612f09565b5151815190610d4d82612edc565b52610d5790612edc565b50610d628587612f09565b5151905190610d7082612ee9565b52610d7a90612ee9565b50602087015238610ba4565b509250600101610ad1565b509060010190610abf565b60405180610daa85826108d2565b0390f35b3461053657602036600319011261053657600435610dcd811515613015565b610de281610dda33610792565b541015613054565b610deb3361560f565b610df433610792565b610dff8282546126fc565b9055610e15610e10826007546126fc565b600755565b610e39610e2e610e2433610792565b5460035490612999565b64e8d4a51000900490565b6001610e4433610792565b0155610e5281471015613095565b610e6c600080808085335af1610e666130f1565b50613121565b60405190815233907f0f5bb82176feb1b5e747e28471aa92156a04d9f3ab9f45f28e2d704232b93f759080602081015b0390a2005b3461053657602036600319011261053657600435610ebe8161053b565b610ec66148dd565b6001600160a01b03168015610eeb57600980546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526014602482015273696e76616c69642061646472657373207479706560601b6044820152606490fd5b8015150361053657565b60e4359061041282610f27565b9181601f84011215610536578235916001600160401b038311610536576020808501948460051b01011161053657565b3461053657610100366003190112610536576004356024356001600160401b03811161053657610fa2903690600401610693565b6044359291610fb08461053b565b606435610fbc81610f27565b608435610fc881610f27565b610fd061054c565b60c435969092906001600160401b03881161053657610ff661000e983690600401610f3e565b96909560e43598613166565b346105365760203660031901126105365760043561101f8161053b565b6110276148dd565b6001600160a01b0316801561104c57600280546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b906020808351928381520192019060005b8181106110a15750505090565b825162ffffff16845260209384019390920191600101611094565b9080602083519182815201916020808360051b8301019401926000915b8383106110e857505050505090565b909192939460208061117a600193601f1986820301875289519060c0611117835160e0845260e0840190610489565b92878060a01b03868201511686840152878060a01b0360408201511660408401526060810151151560608401526111576080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c0818403910152611083565b970193019301919392906110d9565b9060206109339281815201906110bc565b3461053657602036600319011261053657600435600052600a602052604060002080546111c6816117bf565b916111d460405193846103b6565b818352602083019060005260206000206000915b8383106111fd5760405180610daa8782611189565b6005602060019260405161121081610360565b611219866103d9565b8152848060a01b03858701541683820152611270611267600288015461124a6112418261047d565b60408601612c01565b61125e60a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b611289611280600388015461047d565b60a08301612c01565b611295600487016134ed565b60c08201528152019201920191906111e8565b346105365760e0366003190112610536576004356001600160401b038111610536576112d8903690600401610693565b906024356112e58161053b565b604435926112f28461053b565b6064356112fe81610f27565b6084359061130b8261053b565b60a435956001600160401b0387116105365761132e61000e973690600401610f3e565b95909460c435976137da565b6040519061041260c0836103b6565b6040519061041260e0836103b6565b60405190610412610100836103b6565b6001600160401b03811161037b57601f01601f191660200190565b92919261138f82611368565b9161139d60405193846103b6565b829481845281830111610536578281602093846000960137010152565b9080601f830112156105365781602061093393359101611383565b608060031982011261053657600435906001600160401b038211610536576113ff916004016113ba565b9060243561140c8161053b565b906044356114198161053b565b9060643590565b346105365761142e366113d5565b9261143a9291926148dd565b61144e6001600160a01b0383161515613c06565b6000848152600460205260409020815190916001600160401b03821161037b576114828261147c8554610310565b85612736565b602090601f83116001146114d857936114c2936114b48461000e99956114c8956002996000926114cd575b505061277b565b90555b60016114c2846102f0565b01612873565b6102f0565b0151905038806114ad565b601f19831691906114ee85600052602060002090565b9260005b81811061153c5750846114c894600298946114c2989461000e9c9860019510611523575b505050811b0190556114b7565b015160001960f88460031b161c19169055388080611516565b929360206001819287860151815501950193016114f2565b3461053657610120366003190112610536576004356115728161053b565b6024359061157f8261053b565b6064359160843591906044356001600160401b03841161053657610daa946115ae6115ce953690600401610f3e565b9060a435926115bc8461053b565b60c4359460e435966101043598613dd4565b6040519081529081906020820190565b34610536576000366003190112610536576115f76148dd565b600080546001600160a01b0319811682556001600160a01b0316600080516020615e8b8339815191528280a3005b34610536576000366003190112610536576001546040516001600160a01b039091168152602090f35b346105365760203660031901126105365760043561166b8161053b565b6001600160a01b03166000908152600660209081526040918290208054600182015460029092015484519182529281019190915291820152606090f35b34610536576000366003190112610536576020600754604051908152f35b3461053657600036600319011261053657602060405166038d7ea4c680008152f35b34610536576020366003190112610536576004356117058161053b565b61170d6148dd565b6001600160a01b031661172181151561390e565b600180546001600160a01b031916919091179055005b34610536576060366003190112610536576024356117a1600261179560043561175f85610f27565b60443561176a6148dd565b80600052600a602052611783604060002054831061326c565b600052600a6020526040600020612487565b50019115158254612892565b9055005b62ffffff81160361053657565b60e43590610412826117a5565b6001600160401b03811161037b5760051b60200190565b9291906117e2816117bf565b936117f060405195866103b6565b602085838152019160051b810192831161053657905b82821061181257505050565b6020809183356118218161053b565b815201910190611806565b9080601f8301121561053657816020610933933591016117d6565b3461053657610160366003190112610536576004356118658161053b565b6024356118718161053b565b6044359160643591611881610566565b61188961054c565b60c4356118946117b2565b916101043561012435979094906001600160401b03891161053657610daa996118c46115ce9a369060040161182c565b9761014435996140cb565b34610536576020366003190112610536576004356118ec8161053b565b6118f46148dd565b6118fc6148dd565b6001600160a01b038116156119145761000e90615e55565b631e4fbdf760e01b600052600060045260246000fd5b34610536576020366003190112610536576004356119478161053b565b60018060a01b03166000526005602052602060ff604060002054166040519015158152f35b34610536576000366003190112610536576000546040516001600160a01b039091168152602090f35b34610536576000366003190112610536576020600354604051908152f35b34610536576020366003190112610536576119cf6004356142c4565b60408051928352602083019190915290f35b34610536576020366003190112610536577f4c8f77ced8e25e80ecc91fdca3da46ae6123bc7181d3a543bda07b8821f711906020600435611a2181610f27565b611a296148dd565b1515611a3781600254612892565b600255604051908152a1005b3461053657602036600319011261053657600435611a628115156142e3565b611a6b3361560f565b611a7e611a7960015461047d565b61047d565b602060405180926323b872dd60e01b825281600081611aa288303360048501613cd7565b03925af18015611b5457611b27575b50611abb33610792565b611ac6828254612ecf565b9055611ad7610e1082600754612ecf565b611ae6610e2e610e2433610792565b6001611af133610792565b015560405190815233907f9e71bc8eea02a63969f509818f2dafb9254532904319f9dbda79b67bd34a5f3d908060208101610e9c565b611b489060203d602011611b4d575b611b4081836103b6565b810190613cc2565b611ab1565b503d611b36565b613cf9565b34610536576040366003190112610536576004356001600160401b03811161053657611b8c61000e913690600401610693565b60243591611b986148dd565b614556565b610933906020815261010060e0611c19611c03611bc68751856020880152610120870190610489565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a088015261083c565b60a0870151858203601f190160c0870152610489565b60c086015115158483015294015162ffffff16910152565b346105365760a036600319011261053657600435611c4e8161053b565b611c8360243591611c5e8361053b565b60443592606435938491611c7183610f27565b60843593611c7d614648565b5061508c565b90611c9082511515612e7d565b6000908015611d3957815b90825b8451811015611d1f578115611ce757826060611cba8388612f09565b51015111611ccd575b6001905b01611c9e565b925090506060611cdd8385612f09565b5101519082611cc3565b826040611cf48388612f09565b51015110611d05575b600190611cc7565b925090506040611d158385612f09565b5101519082611cfd565b610daa611d2c8587612f09565b5160405191829182611b9d565b600019611c9b565b3461053657611d4f366113d5565b9291611d596148dd565b6001600160a01b031692611d6e841515613c06565b60405192611d7b84610380565b835260208301938452604083019160018060a01b0316825260005260046020526040600020915192835160018060401b03811161037b57611dc681611dc08654610310565b86612736565b6020601f8211600114611e1157611e01611e0a93611df88460029795611dfb9561000e9b6000926114cd57505061277b565b87555b5161047d565b60018601612873565b9101612873565b601f19821695611e2686600052602060002090565b9660005b818110611e7657509360018461000e99611dfb95611e019560029a98611e0a9a10611e5d575b505050811b018755611dfb565b015160001960f88460031b161c19169055388080611e50565b83830151895560019098019760209384019301611e2a565b34610536576000366003190112610536576002546040516001600160a01b039091168152602090f35b3461053657600036600319011261053657611ed13361560f565b33600052600660205260026040600020015480611eea57005b33600052600660205260006002604082200155611f17600080808085335af1611f116130f1565b50614699565b60405190815233907f106f923f993c2149d49b4255ff723acafa1f2d94393f561d3eda32ae348f7241908060208101610e9c565b3461053657600036600319011261053657602060ff60025460a01c166040519015158152f35b3461053657604036600319011261053657600435611f8e8161053b565b602060243580600052600a8252611fa8604060002061372c565b611fb6611a7960095461047d565b90611fda6001611fcd611fd46002611fcd886102f0565b015461047d565b956102f0565b94611ffb60405196879586948594633dfc3f3560e21b8652600486016146ea565b03915afa8015611b5457610daa91600091612022575b506040519081529081906020820190565b612044915060203d60201161204a575b61203c81836103b6565b8101906146db565b38612011565b503d612032565b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061208457505050505090565b9091929394602080600192603f1985820301865261210e89519160c0806121046120ca6120ba875160e0875260e0870190610489565b888801518682038a880152610489565b898060a01b03604088015116604086015260ff60608801511660608601526080870151608086015260a087015185820360a0870152610489565b9401511515910152565b97019301930191939290612075565b3461053657602036600319011261053657600435600052600b60205260406000208054612149816117bf565b9161215760405193846103b6565b818352602083019060005260206000206000915b8383106121805760405180610daa8782612051565b6006602060019260405161219381610360565b61219c866103d9565b81526121a98587016103d9565b838201526121d96121cf6002880154878060a01b038116604085015260ff9060a01c1690565b60ff166060830152565b600386015460808201526121ef600487016103d9565b60a082015261220e612205600588015460ff1690565b151560c0830152565b81520192019201919061216b565b3461053657606036600319011261053657612275602060043561223e8161053b565b6024359061224b8261053b565b604435916122576148dd565b600060405180968195829463a9059cbb60e01b845260048401612a63565b03926001600160a01b03165af18015611b545761228e57005b61000e9060203d602011611b4d57611b4081836103b6565b3461053657610100366003190112610536576122c0610573565b6122c8610559565b906044356001600160401b038111610536576122e89036906004016113ba565b916064356001600160401b038111610536576123089036906004016113ba565b6123106106d0565b60c4359460a43592906001600160401b0387116105365761233861000e9736906004016113ba565b94612341610f31565b96614727565b34610536576020366003190112610536576004356123636148dd565b606481116123a45760085460408051918252602082018390527f528d9479e9f9889a87a3c30c7f7ba537e5e59c4c85a37733b16e57c62df6130291a1600855005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b34610536576020366003190112610536576004356118f48161053b565b346105365760203660031901126105365760043561241a8161053b565b60018060a01b03166000526006602052604060002064e8d4a51000612443825460035490612999565b04906001810154820391821161246c576002015490810180911161246c57604051908152602090f35b6126c7565b634e487b7160e01b600052603260045260246000fd5b80548210156124a3576000526005602060002091020190600090565b612471565b94919695926124c260a0959260c0885260c0880190610489565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b346105365760403660031901126105365760043560243590600052600a60205260406000209081548110156105365761252991612487565b50612533816103d9565b60018201546002830154600390930154604051938493610daa936001600160a01b039384169360a884901c60ff9081169460a081901c909116939082169290911690876124a8565b80548210156124a3576000526006602060002091020190600090565b95916125f1946125c960ff926125bb60c099959c9b9c60e08c5260e08c0190610489565b908a820360208c0152610489565b6001600160a01b039095166040890152166060870152608086015284820360a0860152610489565b931515910152565b346105365760403660031901126105365760043560243590600052600b6020526040600020908154811015610536576126319161257b565b5061263b816103d9565b90610daa61264b600183016103d9565b91600281015490600381015460ff6005612667600485016103d9565b930154169260405196879660ff8360a01c169260018060a01b03169188612597565b1561269057565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b634e487b7160e01b600052601160045260246000fd5b60001981019190821161246c57565b6127100390612710821161246c57565b9190820391821161246c57565b634e487b7160e01b600052600060045260246000fd5b81811061272a575050565b6000815560010161271f565b9190601f811161274557505050565b610412926000526020600020906020601f840160051c83019310612771575b601f0160051c019061271f565b9091508190612764565b8160011b916000199060031b1c19161790565b91909182811461286e576127a28354610310565b6001600160401b03811161037b576127c4816127be8454610310565b84612736565b600093601f82116001146127f7576127e892939482916000926127ec57505061277b565b9055565b0154905038806114ad565b61280b601f19831691600052602060002090565b9461281b84600052602060002090565b91815b8181106128565750958360019596971061283d575b505050811b019055565b015460001960f88460031b161c19169055388080612833565b9192600180602092868b01548155019401920161281e565b509050565b80546001600160a01b0319166001600160a01b03909216919091179055565b60ff60a01b191660a09190911b60ff60a01b161790565b9060ff6127e891168254612892565b9060ff801983541691151516179055565b9061294a578181036128d9575050565b600560ff81846128ec610412968661278e565b6128fc600182016001870161278e565b61292660028601846002840161291b60018060a01b0382541684612873565b5460a01c16906128a9565b60038101546003860155612940600482016004870161278e565b01541691016128b8565b612709565b634e487b7160e01b600052603160045260246000fd5b9060038202918083046003149015171561246c57565b9064e8d4a5100082029180830464e8d4a51000149015171561246c57565b8181029291811591840414171561246c57565b6129b68154610310565b90816129c0575050565b81601f600093116001146129d2575055565b818352602083206129ee91601f0160051c81019060010161271f565b808252602082209081548360011b9084198560031b1c191617905555565b80548015612a5e576000190190612a23828261257b565b61294a57600581612a356000936129ac565b612a41600182016129ac565b826002820155826003820155612a59600482016129ac565b015555565b61294f565b6001600160a01b039091168152602081019190915260400190565b95939281977f021066d9f43780503f155e50fc23c3d3ac8ba8edd3fbc3aee45c67ddb5f7078899612b29612b7598612b0d612b5097612b3696612b048e612ae0612adb60ff8f612ad590612ad06148dd565b610778565b54161590565b612b7a565b612af46001600160a01b038e161515612bbd565b612afc611349565b9a3691611383565b89523691611383565b6020870152612b1f8860408801612c01565b60ff166060860152565b8660808501523691611383565b60a0820152600160c0820152612b4b846102e0565b612cc9565b612b69612b5c82610778565b805460ff19166001179055565b60405194859485612e1f565b0390a1565b15612b8157565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b15612bc457565b60405162461bcd60e51b8152602060048201526015602482015274496e76616c696420746f6b656e206164647265737360581b6044820152606490fd5b6001600160a01b039091169052565b81519192916001600160401b03811161037b57612c31816127be8454610310565b6020601f8211600114612c545781906127e89394956000926114cd57505061277b565b601f19821690612c6984600052602060002090565b9160005b818110612ca457509583600195969710612c8b57505050811b019055565b015160001960f88460031b161c19169055388080612833565b9192602060018192868b015181550194019201612c6d565b516001600160a01b031690565b8054919291600160401b81101561037b57612ce99160018201815561257b565b61294a57825180519093906001600160401b03811161037b57612d108161147c8554610310565b6020601f8211600114612da657600592612d3e83612d9f9460c094610412999a6000926114cd57505061277b565b85555b612d52602082015160018701612c10565b612d7d60028601612d6f612d69604085015161047d565b82612873565b606083015160ff16906128a9565b60808101516003860155612d9860a082015160048701612c10565b0151151590565b91016128b8565b601f19821695612dbb85600052602060002090565b9660005b818110612e07575083610412979860c09460059794612d9f9760019510612dee575b505050811b018555612d41565b015160001960f88460031b161c19169055388080612de1565b83830151895560019098019760209384019301612dbf565b90826040936080929796959760608552816060860152838501376000828285010152601f80199101168201019460018060a01b031660208201520152565b60405190612e6a82610380565b6060604083828152600060208201520152565b15612e8457565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b906001820180921161246c57565b9190820180921161246c57565b8051156124a35760200190565b8051600110156124a35760400190565b8051600210156124a35760600190565b80518210156124a35760209160051b010190565b60405160809190612f2e83826103b6565b6003815291601f1901366020840137565b8115612f49570490565b634e487b7160e01b600052601260045260246000fd5b612f6960026117bf565b90612f7760405192836103b6565b6002825281601f19612f8960026117bf565b019060005b828110612f9a57505050565b602090604051612fa98161039b565b600081526000838201526060604082015260608082015260006080820152600060a082015282828501015201612f8e565b60405160609190612feb83826103b6565b6002815291601f19018260005b82811061300457505050565b806060602080938501015201612ff8565b1561301c57565b60405162461bcd60e51b815260206004820152601060248201526f043616e6e6f7420756e7374616b6520360841b6044820152606490fd5b1561305b57565b60405162461bcd60e51b8152602060048201526012602482015271496e73756666696369656e74207374616b6560701b6044820152606490fd5b1561309c57565b60405162461bcd60e51b8152602060048201526018602482015277436f6e74726163742062616c616e636520746f6f206c6f7760401b6044820152606490fd5b604051906130eb6020836103b6565b60008252565b3d1561311c573d9061310282611368565b9161311060405193846103b6565b82523d6000602084013e565b606090565b1561312857565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b61319361319892939a97969761317a6148dd565b61318e61318682610300565b54841061326c565b610300565b612487565b50978061325b575b50506001600160a01b038116613248575b506131c060028701918261335c565b826131d86131d3835460ff9060a81c1690565b151590565b81151503613238575b905080613226575b613213575b508061320a575b6131fe57505050565b6004610412930161341c565b508115156131f5565b6132209060038601612873565b386131ee565b506001600160a01b03811615156131e9565b6132419161336a565b38826131e1565b6132559060018801612873565b386131b1565b61326591896132a8565b38806131a0565b1561327357565b60405162461bcd60e51b815260206004820152600d60248201526c092dcecc2d8d2c840d2dcc8caf609b1b6044820152606490fd5b9092916001600160401b03811161037b576132c7816127be8454610310565b6000601f82116001146132f55781906127e89394956000926132ea57505061277b565b0135905038806114ad565b601f1982169461330a84600052602060002090565b91805b87811061334457508360019596971061332a57505050811b019055565b0135600019600384901b60f8161c19169055388080612833565b9092602060018192868601358155019401910161330d565b906127e89015158254612892565b805460ff60a81b191691151560a81b60ff60a81b16919091179055565b90600160401b811161037b5781548183558082106133a457505050565b61041292600052600a600960206000209260038380848801048601960602806133d2575b500104019061271f565b6000198601908154906000199060200360031b1c169055386133c8565b35610933816117a5565b62ffffff9160031b1c1690565b9062ffffff809160031b9316831b921b19161790565b91906001600160401b03821161037b576134469061343a8385613387565b92600052602060002090565b600a82049160005b8381106134ad5750600a8302900380613468575b50505050565b9260009360005b81811061348457505050015538808080613462565b90919460206134a3600192613498896133ef565b908560030290613406565b960192910161346f565b6000805b600a81106134c657508382015560010161344e565b959060206134e46001926134d9856133ef565b908a60030290613406565b920196016134b1565b6040518154808252909291839061350d6020830191600052602060002090565b926000905b8060098301106136715761041294549181811061365b575b818110613641575b818110613627575b81811061360d575b8181106135f3575b8181106135d9575b8181106135bf575b8181106135a5575b81811061358b575b10613578575b5003836103b6565b60d81c62ffffff16815260200138613570565b60c083901c62ffffff16845292600190602001930161356a565b60a883901c62ffffff168452926001906020019301613562565b609083901c62ffffff16845292600190602001930161355a565b607883901c62ffffff168452926001906020019301613552565b606083901c62ffffff16845292600190602001930161354a565b604883901c62ffffff168452926001906020019301613542565b603083901c62ffffff16845292600190602001930161353a565b601883901c62ffffff168452926001906020019301613532565b62ffffff8316845292600190602001930161352a565b91600a91935061014060019161371e87546136958362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b019401920185929391613512565b908154613738816117bf565b9261374660405194856103b6565b818452602084019060005260206000206000915b8383106137675750505050565b6005602060019260405161377a81610360565b613783866103d9565b8152848060a01b038587015416838201526137ab611267600288015461124a6112418261047d565b6137bb611280600388015461047d565b6137c7600487016134ed565b60c082015281520192019201919061375a565b9491979692909593966137eb6148dd565b876138006001600160a01b038b16151561390e565b61387e575b9361387996936138636104129a979461384b61386a9561383361382a6138749b610300565b98612afc611349565b89526138428b60208b01612c01565b60408901612c01565b600160608801528a1515608088015260a08701612c01565b3691613991565b60c0830152613aae565b6107ac565b6128b8565b9095929794919360018060a01b038516156138d057886138636138749661384b6138799a61383361382a6104129f986138bb61386a9a151561394c565b979b50505095505094979a5050939650613805565b60405162461bcd60e51b8152602060048201526016602482015275696e76616c69642071756f746572206164647265737360501b6044820152606490fd5b1561391557565b60405162461bcd60e51b815260206004820152600f60248201526e696e76616c6964206164647265737360881b6044820152606490fd5b1561395357565b60405162461bcd60e51b81526020600482015260166024820152756d7573742070726f766964652066656520746965727360501b6044820152606490fd5b92919061399d816117bf565b936139ab60405195866103b6565b602085838152019160051b810192831161053657905b8282106139cd57505050565b6020809183356139dc816117a5565b8152019101906139c1565b815190916001600160401b03821161037b576020613a1691613a098486613387565b0192600052602060002090565b600a82049160005b838110613a755750600a8302900380613a375750505050565b9260009360005b818110613a5357505050015538808080613462565b9091946020613a6b600192613498895162ffffff1690565b9601929101613a3e565b6000805b600a8110613a8e575083820155600101613a1e565b95906020613aa56001926134d9855162ffffff1690565b92019601613a79565b8054919291600160401b81101561037b57613ace91600182018155612487565b61294a57825180519093906001600160401b03811161037b57613af58161147c8554610310565b6020601f8211600114613b905791613b208260c09360049561041298996000926114cd57505061277b565b84555b613b33611e01602083015161047d565b613b6e60028501613b4a612d69604085015161047d565b613b60613b5a6060850151151590565b8261335c565b608083015115155b9061336a565b613b87613b7e60a083015161047d565b60038601612873565b015191016139e7565b601f19821695613ba585600052602060002090565b9660005b818110613bee5750926104129697600495936001938360c09710613bd5575b505050811b018455613b23565b015160001960f88460031b161c19169055388080613bc8565b83830151895560019098019760209384019301613ba9565b15613c0d57565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b15613c4757565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b15613c8857565b60405162461bcd60e51b8152602060048201526012602482015271556e737570706f7274656420746f6b656e7360701b6044820152606490fd5b90816020910312610536575161093381610f27565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b90156124a35780359060be1981360301821215610536570190565b91908110156124a35760051b8101359060be1981360301821215610536570190565b356109338161053b565b3561093381610f27565b903590601e198136030182121561053657018035906001600160401b03821161053657602001918160051b3603831361053657565b15613d9257565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b959493909691979298613de8851515613c40565b613df46105b788610778565b80614074575b613e0390613c81565b6000998a613e3460208c60018060a01b038c169360405180809581946323b872dd60e01b8352303360048501613cd7565b0391865af18015611b5457614057575b508b905b878210613f4057505092613e9792898c613e91613e8c613e84613e7e60209b98613e79613eb29f9e9c871015613d8b565b615aeb565b936142c4565b999095613d05565b613d42565b92615b54565b6040518094819263a9059cbb60e01b83528560048401612a63565b038160006001600160a01b0389165af18015611b5457600080516020615ecb83398151915295613f1d938892613f23575b50604080516001600160a01b039687168152968616602088015286015260608501526000608085015290911660a0830152819060c0820190565b0390a190565b613f3b9060203d602011611b4d57611b4081836103b6565b613ee3565b909b8c613f919160208a8f613e8c613f6d610b30613f769386613f658f888c91613d20565b013590612999565b9586938c613d20565b60405163095ea7b360e01b8152958692839260048401612a63565b03816000885af1918215611b54578f908d8f8b928b918f600199613ffd9961403b575b50613fcb6080613fc5898488613d20565b01613d4c565b156140055760a0613ff18883613feb613e8c610b969c613ff7978b613d20565b97613d20565b016133ef565b9361598a565b9c0190613e48565b61402e6140248883613feb613e8c610b969c614035978b9d9c9d613d20565b6040810190613d56565b36916117d6565b946157aa565b6140529060203d8111611b4d57611b4081836103b6565b613fb4565b61406f9060203d602011611b4d57611b4081836103b6565b613e44565b50613e036140846105b78a610778565b9050613dfa565b1561409257565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b96959299919890976140df6105b789610778565b806142ad575b6140ee90613c81565b6141026001600160a01b038716151561408b565b6040516323b872dd60e01b81526001600160a01b03891694906020818061412e8f303360048501613cd7565b038160008a5af18015611b545760009660209261416992614292575b508d60405198898094819363095ea7b360e01b83528d60048401612a63565b03925af1978815611b54578a6141c08b6141ba9f8f948b87926141e29f97876141c79c60209f859b614276575b506141a36105b7866107ac565b1561426a57506141b296615a74565b9e8f97615aeb565b966142c4565b9690615b54565b6040518095819263a9059cbb60e01b83528660048401612a63565b038160006001600160a01b038a165af18015611b5457600080516020615ecb83398151915296613f1d94899261424d575b50604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b6142659060203d602011611b4d57611b4081836103b6565b614213565b9594506141b2966158be565b61428d9060203d8111611b4d57611b4081836103b6565b614196565b6142a890843d8611611b4d57611b4081836103b6565b61414a565b506140ee6142bd6105b78b610778565b90506140e5565b906127106142d460085484612999565b0480830392831161246c579190565b156142ea57565b60405162461bcd60e51b815260206004820152600e60248201526d043616e6e6f74207374616b6520360941b6044820152606490fd5b6000929181549161433083610310565b8083529260018116908115614386575060011461434c57505050565b60009081526020812093945091925b83831061436c575060209250010190565b60018160209294939454838587010152019101919061435b565b915050602093945060ff929192191683830152151560051b010190565b906104126143b79260405193848092614320565b03836103b6565b90808214614454578054906001600160401b03821161037b5761343a6143f3916143e88486613387565b600052602060002090565b91600a82049181549160005b848110614437575050600a830280820361441b575b5050505050565b60039060001992030260031b1b19169101553880808080614414565b600191820180546001600160f01b039095168783015591016143ff565b5050565b9061294a57818103614468575050565b60048083614479610412958561278e565b61449260018060a01b0360018301541660018601612873565b6144d360028501613b68600284016144b360018060a01b0382541684612873565b6144c760ff825460a01c1615158454612892565b83555460a81c60ff1690565b6144e3613b7e600383015461047d565b0191016143be565b80548015612a5e5760001901906145028282612487565b61294a57806145126004926129ac565b600060018201556000600282015560006003820155018054600082558061453857505055565b61455391600052600a6009602060002092010481019061271f565b55565b919060005b61456483610300565b548110156146135761458261457c8261319386610300565b506143a3565b60208151910120614594368487611383565b60208151910120146145a85760010161455b565b6104129350829150610675613874600161460661318e946145fd6145e96145d161460e9a610300565b6145e36145dd8b610300565b546126dd565b90612487565b506145f7836131938b610300565b90614458565b61319387610300565b50015461047d565b6144eb565b60405162461bcd60e51b815260206004820152600d60248201526c111156081b9bdd08199bdd5b99609a1b6044820152606490fd5b6040519061010082016001600160401b0381118382101761037b57604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b156146a057565b60405162461bcd60e51b8152602060048201526013602482015272109390881d1c985b9cd9995c8819985a5b1959606a1b6044820152606490fd5b90816020910312610536575190565b929493906060926147109160018060a01b031685526080602086015260808501906110bc565b6001600160a01b0395861660408501529416910152565b969295919390956147366148dd565b6147456105be6105b78a610778565b61474e866102e0565b6001600160a01b03909816979460005b86548110156148a55789614772828961257b565b50600201546001600160a01b03906147899061047d565b16146147975760010161475e565b937f797b048fe238984247feb0b0239ad7d08a410e65210a7ce2b62bf9be4558662c9950612b75969361480c93614811979360018060a01b038c16614889575b8051614873575b508051614859575b5060ff811661483c575b50805161481f575b506005614805858561257b565b50016128b8565b61257b565b5091604051938493846148b1565b61483690600461482f878761257b565b5001612c10565b386147f8565b61485390600261484c888861257b565b50016128a9565b386147f0565b61486d90614867888861257b565b50612c10565b386147e6565b61488390600161482f8a8a61257b565b386147de565b6148a08c60026148998b8b61257b565b5001612873565b6147d7565b50505050505050505050565b6148c960409295949395606083526060830190614320565b6001600160a01b0390951660208201520152565b6000546001600160a01b031633036148f157565b63118cdaa760e01b6000523360045260246000fd5b90614910826117bf565b61491d60405191826103b6565b828152809261492e601f19916117bf565b019060005b82811061493f57505050565b60209061494a614648565b82828501015201614933565b6040516060919061496783826103b6565b6002815291601f1901366020840137565b604051906149876020836103b6565b6000808352366020840137565b602081830312610536578051906001600160401b03821161053657019080601f830112156105365781516149c7816117bf565b926149d560405194856103b6565b81845260208085019260051b82010192831161053657602001905b8282106149fd5750505090565b81518152602091820191016149f0565b60409061093393928152816020820152019061083c565b600019811461246c5760010190565b91909180548310156124a3576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b9392909193614ae1614adc614ad684610300565b54612965565b614906565b9160009384925b614af183610300565b5484101561508157614b1e614b1a6002614b0e8761319388610300565b50015460a01c60ff1690565b1590565b61507757614b406002614b348661319387610300565b50015460a81c60ff1690565b15614d5a57614b5a611a7960036146068761319388610300565b6001600160a01b03169660005b896004614b778861319389610300565b500154821015614d495760008091614bd1614bdf614bb0614ba9876004614ba28f8f61319390610300565b5001614a33565b90546133f9565b92604051928391602083019563f7729d4360e01b87528c8c60248601614a55565b03601f1981018352826103b6565b51908c5afa614bec6130f1565b90614bfb575b50600101614b67565b809891985181016020019060200190614c13916146db565b86614c1d87610300565b90614c2791612487565b5090858c89614c358a610300565b90614c3f91612487565b5060010154614c4d9061047d565b92614c56614978565b918d8c614c628d610300565b90614c6c91612487565b5060040190614c7a91614a33565b905490614c86916133f9565b896040519586926020840192614c9b93614a8b565b03601f1981018552614cad90856103b6565b8d8c614cb88d610300565b90614cc291612487565b5060040190614cd091614a33565b905490614cdc916133f9565b94614ce5611358565b96614cef906103d9565b8752614cfe9060208801612c01565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e0820152614d2d8289612f09565b52614d388188612f09565b50614d4290614a24565b9638614bf2565b50509360019197505b019295614ae8565b9592614d6583615aeb565b614d6d614956565b88614d7782612edc565b90614d8191612c01565b83614d8b82612ee9565b90614d9591612c01565b614d9d612f1d565b9189614da884612edc565b90614db291612c01565b614dbb83612ee9565b90614dc591612c01565b83614dcf83612ef9565b90614dd991612c01565b614de1612f1d565b9189614dec84612edc565b90614df691612c01565b614dff866102f0565b600201546001600160a01b0316614e1584612ee9565b90614e1f91612c01565b84614e2984612ef9565b90614e3391612c01565b83614e3d87610300565b90614e4791612487565b5060010154614e559061047d565b614e5e9061047d565b614e679061047d565b918b8360405180809363d06ca61f60e01b8252856004830191614e8992614a0d565b03815a93600094fa6000918161505c575b5061502a575050614ec36000828d604051938492839263d06ca61f60e01b845260048401614a0d565b0381865afa6000918161500f575b50614fdd575050600082614efc928c60405180958194829363d06ca61f60e01b845260048401614a0d565b03915afa60009181614fba575b50614f19575b5050600190614d52565b9684614fb2928499614f6c614f4e614f4860016146068a613193614f41849d6131938c610300565b5099610300565b92612ef9565b5191614f61614f5b611358565b956103d9565b855260208501612c01565b8c604084015260608301526080820152614f846130dc565b60a0820152600060c0820152600060e0820152614fa18289612f09565b52614fac8188612f09565b50614a24565b959038614f0f565b614fd691923d8091833e614fce81836103b6565b810190614994565b9038614f09565b615009935084999250908691614f6c614f4e614f4860016146068a613193614f41849d6131938c610300565b95614d52565b61502391923d8091833e614fce81836103b6565b9038614ed1565b6150099450859a9350879250614f6c614f4e61505660016146068a613193614f41849d6131938c610300565b92612ee9565b61507091923d8091833e614fce81836103b6565b9038614e9a565b9592600190614d52565b505050918152925050565b9293949091946150a1614adc614ad683610300565b9260009485935b6150b184610300565b54851015615602576150ce614b1a6002614b0e8861319389610300565b6155f6576150e46002614b348761319388610300565b156152e857966150ff611a7960036146068861319389610300565b6001600160a01b03169760005b8a600461511c896131938a610300565b5001548210156152d45760008091614bd1615169615148614ba98760048f8f90613193614ba292610300565b92604051928391602083019563f7729d4360e01b87528d8d60248601614a55565b51908d5afa6151766130f1565b90615185575b5060010161510c565b80999199518101602001906020019061519d916146db565b8b868b8a6151aa8b610300565b906151b491612487565b50938b6151c08c610300565b906151ca91612487565b50600101546151d89061047d565b936151e1614978565b928d8d82826151ef83610300565b906151f991612487565b506004019061520791614a33565b905490615213916133f9565b8d604051988992602084019261522893614a8b565b03601f198101885261523a90886103b6565b61524390610300565b9061524d91612487565b506004019061525b91614a33565b905490615267916133f9565b94615270611358565b9661527a906103d9565b87526152899060208801612c01565b60408601526060850152608084015260a0830152600160c083015262ffffff1660e08201526152b8828a612f09565b526152c38189612f09565b506152cd90614a24565b973861517c565b5050946001919298505b01939690966150a8565b936152f584989298615aeb565b6152fd614956565b908961530883612edc565b9061531291612c01565b8461531c83612ee9565b9061532691612c01565b61532e612f1d565b908a61533983612edc565b9061534391612c01565b61534c82612ee9565b9061535691612c01565b8461536082612ef9565b9061536a91612c01565b838b615374612f1d565b928c61537f85612edc565b9061538991612c01565b615392896102f0565b600201546001600160a01b03166153a885612ee9565b906153b291612c01565b876153bc85612ef9565b906153c691612c01565b856153d08a610300565b906153da91612487565b50600101546153e89061047d565b6153f19061047d565b6153fa9061047d565b60405163d06ca61f60e01b815290959086818061541b858860048401614a0d565b03815a93600094fa600091816155db575b5061559f57505060405163d06ca61f60e01b815260008180615452858760048401614a0d565b0381895afa60009181615584575b506155405750508261548c939460009260405180968194829363d06ca61f60e01b845260048401614a0d565b03915afa60009281615525575b506154aa575b5050506001906152de565b6154b5575b8361549f565b978561551d92849a6154dd614f4e614f4860016146068a613193614f41849d6131938c610300565b8d6040840152606083015260808201526154f56130dc565b60a0820152600060c0820152600060e0820152615512828a612f09565b52614fac8189612f09565b9690386154af565b61553991933d8091833e614fce81836103b6565b9138615499565b9350935050615554575b50506001906152de565b978561557c92849a6154dd614f4e614f4860016146068a613193614f41849d6131938c610300565b96903861554a565b61559891923d8091833e614fce81836103b6565b9038615460565b9450945050506155b35750506001906152de565b978561557c92849a6154dd614f4e61505660016146068a613193614f41849d6131938c610300565b6155ef91923d8091833e614fce81836103b6565b903861542c565b936001909791976152de565b9750505050509150815290565b6007546156195750565b60018060a01b03166000526006602052604060002064e8d4a51000615642825460035490612999565b0460018201918254820391821161246c576002810190815492830180931161246c5764e8d4a510009261567a92555460035490612999565b049055565b1561568657565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b156156c857565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b1561572057565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b919260809361579692979695978452602084015260a0604084015260a083019061083c565b6001600160a01b0390951660608201520152565b615838956158176000969594936157ee88946157ca60028651101561567f565b6157db6157d686612edc565b612cbc565b6001600160a01b039081169116146156c1565b6158046157d66157fe85516126dd565b85612f09565b6001600160a01b03908116911614615719565b6040516338ed173960e01b8152968795869485933091869060048701615771565b03926001600160a01b03165af1600091816158a1575b506158895760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b8061589761589d92516126dd565b90612f09565b5190565b6158b79192503d806000833e614fce81836103b6565b903861584e565b926158ff60009697939594926158e988946158dd60028851101561567f565b6157db6157d688612edc565b6158046157d66158f987516126dd565b87612f09565b615838604051978896879586946338ed173960e01b8652309260048701615771565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b90916000956159c36020966159b7615a0297966159af6159a8611358565b9788612c01565b898701612c01565b62ffffff166040850152565b6159d03060608501612c01565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b835260048301615921565b03926001600160a01b03165af160009181615a53575b506109335760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b615a6d91925060203d60201161204a5761203c81836103b6565b9038615a18565b91600096615aad602097615aa1615a02989795615a99615a92611358565b9889612c01565b8a8801612c01565b62ffffff166040860152565b615aba3060608601612c01565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b835260048301615921565b6000818152600460205260409020600101546001600160a01b0316615b105750600090565b6000908152600460205260409020600101546001600160a01b031690565b90608092615796919695949683526000602084015260a0604084015260a083019061083c565b9391949290600254615b6a8160ff9060a01c1690565b80615e4a575b15615e1957506001600160a01b0386811694908216858114615d4e57508510615cbb57615bba90615bb1615ba2614956565b97615bac89612edc565b612c01565b615bac87612ee9565b47936020604051809563095ea7b360e01b825281600081615bdf878960048401612a63565b03925af18015611b5457615c17966000958692615c9e575b506040516318cbafe560e01b815297889586948593309160048601615b2e565b03926001600160a01b03165af1918215611b5457615c3b92615c85575b50476126fc565b615c4157565b615c69615c64615c5c615c534761297b565b60075490612f3f565b600354612ecf565b600355565b604051478152600080516020615eab83398151915290602090a1565b615c99903d806000833e614fce81836103b6565b615c34565b615cb69060203d602011611b4d57611b4081836103b6565b615bf7565b50505091602082615cef94615cd160025461047d565b600060405180988195829463a9059cbb60e01b845260048401612a63565b03925af1928315611b54577f908406b56189c30392bacd00cee68169cef0cd507c315e5efdbf09b99008d02793615d31575b50612b7560405192839283612a63565b615d499060203d602011611b4d57611b4081836103b6565b615d21565b96505066038d7ea4c6800085109350615ddd9250505057813b1561053657604051632e1a7d4d60e01b815260048101829052916000908390602490829084905af1908115611b5457600080516020615eab83398151915292612b7592615dc2575b506115ce615c64615c5c615c538461297b565b80615dd16000615dd7936103b6565b80610808565b38615daf565b602090615def9261225760025461047d565b03925af18015611b5457615e01575b50565b615dfe9060203d602011611b4d57611b4081836103b6565b90506020949350615e30959250612257915061047d565b03926001600160a01b03165af18015611b5457615e015750565b506007541515615b70565b600080546001600160a01b039283166001600160a01b0319821681178355921690600080516020615e8b8339815191529080a356fe8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e004944120d2e185fc95ba63f3ca24c385ec4c5215a801c8766c96486d7fc4ed8eb37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da264697066735822122031b4031342ff6a6c7c8e877358e94a74c9c12c0b4892702430e82e1f7ca9e10c64736f6c634300081c0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000170eb0a66204feb483f9dd8c2c57f6fd8fc4dadc00000000000000000000000048518e6d26736e67275a5c920459da8a58da4e0e
-----Decoded View---------------
Arg [0] : _stakingToken (address): 0x170EB0A66204FEb483F9Dd8c2C57f6fd8FC4daDC
Arg [1] : _priceOracle (address): 0x48518E6d26736e67275a5c920459da8A58da4e0e
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000170eb0a66204feb483f9dd8c2c57f6fd8fc4dadc
Arg [1] : 00000000000000000000000048518e6d26736e67275a5c920459da8a58da4e0e
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.