S Price: $0.721867 (-5.32%)

Contract

0xeFC0fBD852Ee7D73809884EC5d9d5C03d528920c

Overview

S Balance

Sonic LogoSonic LogoSonic Logo0 S

S Value

$0.00

Multichain Info

No addresses found
Transaction Hash
Method
Block
From
To
Execute Swap101621682025-02-25 23:08:3623 hrs ago1740524916IN
0xeFC0fBD8...3d528920c
0 S0.0095740755
Execute Swap101618472025-02-25 23:06:5523 hrs ago1740524815IN
0xeFC0fBD8...3d528920c
0 S0.009559655
Execute Swap100862092025-02-25 15:55:0631 hrs ago1740498906IN
0xeFC0fBD8...3d528920c
0 S0.009559655
Execute Swap100851692025-02-25 15:49:3131 hrs ago1740498571IN
0xeFC0fBD8...3d528920c
0 S0.009559655
Add Token98404032025-02-24 15:53:512 days ago1740412431IN
0xeFC0fBD8...3d528920c
0 S0.0155525155
Add Token98402072025-02-24 15:52:472 days ago1740412367IN
0xeFC0fBD8...3d528920c
0 S0.0155558155
Add Token98400612025-02-24 15:51:592 days ago1740412319IN
0xeFC0fBD8...3d528920c
0 S0.0155518555
Add Token98399302025-02-24 15:51:172 days ago1740412277IN
0xeFC0fBD8...3d528920c
0 S0.0155597755
Add Token98396322025-02-24 15:49:432 days ago1740412183IN
0xeFC0fBD8...3d528920c
0 S0.0155564755
Add Token98394392025-02-24 15:48:422 days ago1740412122IN
0xeFC0fBD8...3d528920c
0 S0.0155558155
Add Token98392532025-02-24 15:47:432 days ago1740412063IN
0xeFC0fBD8...3d528920c
0 S0.0155525155
Add Token98390862025-02-24 15:46:512 days ago1740412011IN
0xeFC0fBD8...3d528920c
0 S0.0155538355
Add Token98389022025-02-24 15:45:542 days ago1740411954IN
0xeFC0fBD8...3d528920c
0 S0.0155498755
Add Token98387512025-02-24 15:45:072 days ago1740411907IN
0xeFC0fBD8...3d528920c
0 S0.0155558155
Add Token98385742025-02-24 15:44:112 days ago1740411851IN
0xeFC0fBD8...3d528920c
0 S0.0155511955
Add Token98384152025-02-24 15:43:182 days ago1740411798IN
0xeFC0fBD8...3d528920c
0 S0.0155498755
Add Dex96839382025-02-24 0:26:202 days ago1740356780IN
0xeFC0fBD8...3d528920c
0 S0.0071826155
Remove Dex96837872025-02-24 0:25:292 days ago1740356729IN
0xeFC0fBD8...3d528920c
0 S0.0040327655
Add Dex96811742025-02-24 0:10:352 days ago1740355835IN
0xeFC0fBD8...3d528920c
0 S0.0071832755
Remove Dex96802242025-02-24 0:04:582 days ago1740355498IN
0xeFC0fBD8...3d528920c
0 S0.0039571455
Add Dex93322152025-02-22 10:04:274 days ago1740218667IN
0xeFC0fBD8...3d528920c
0 S0.0105293655
Remove Dex93297872025-02-22 9:47:474 days ago1740217667IN
0xeFC0fBD8...3d528920c
0 S0.0061217255
Add Token92272072025-02-21 22:03:545 days ago1740175434IN
0xeFC0fBD8...3d528920c
0 S0.0155505355
Add Token92263192025-02-21 21:57:385 days ago1740175058IN
0xeFC0fBD8...3d528920c
0 S0.0155525155
Add Token92227532025-02-21 21:32:285 days ago1740173548IN
0xeFC0fBD8...3d528920c
0 S0.0155597755
View all transactions

Parent Transaction Hash Block From To
View All Internal Transactions
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
File 1 of 6 : PegasusAggregator.sol
// 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 {}    
}

File 2 of 6 : Ownable.sol
// 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);
    }
}

File 3 of 6 : IERC20.sol
// 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);
}

File 4 of 6 : Context.sol
// 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;
    }
}

File 5 of 6 : IDEXStructs.sol
// 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;
    }
}

File 6 of 6 : PriceOracle.sol
// 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");
    }
}

Settings
{
  "viaIR": true,
  "optimizer": {
    "enabled": true,
    "runs": 1
  },
  "evmVersion": "paris",
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"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"}]

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


Block Transaction Gas Used Reward
view all blocks produced

Block Uncle Number Difficulty Gas Used Reward
View All Uncles
Loading...
Loading
Loading...
Loading

Validator Index Block Amount
View All Withdrawals

Transaction Hash Block Value Eth2 PubKey Valid
View All Deposits
[ 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.