Overview
S Balance
S Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 28 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Execute Swap | 11823919 | 28 hrs ago | IN | 0 S | 0.01276619 | ||||
Execute Swap | 11810080 | 30 hrs ago | IN | 0 S | 0.01114711 | ||||
Execute Swap | 11804778 | 30 hrs ago | IN | 1 S | 0.01072172 | ||||
Execute Swap | 11804654 | 30 hrs ago | IN | 1 S | 0.00611612 | ||||
Execute Swap | 11804111 | 30 hrs ago | IN | 0 S | 0.00666638 | ||||
Execute Swap | 11795706 | 31 hrs ago | IN | 0 S | 0.01231301 | ||||
Execute Swap | 11786352 | 32 hrs ago | IN | 0 S | 0.01231301 | ||||
Execute Swap | 11786144 | 32 hrs ago | IN | 0 S | 0.01231301 | ||||
Execute Swap | 11776485 | 33 hrs ago | IN | 50 S | 0.01056115 | ||||
Execute Swap | 11743407 | 38 hrs ago | IN | 0 S | 0.01114601 | ||||
Execute Swap | 11743291 | 38 hrs ago | IN | 0 S | 0.01403553 | ||||
Add Dex | 11742474 | 38 hrs ago | IN | 0 S | 0.0076284 | ||||
Add Dex | 11742407 | 38 hrs ago | IN | 0 S | 0.00839352 | ||||
Add Dex | 11742299 | 38 hrs ago | IN | 0 S | 0.01331622 | ||||
Add Dex | 11742177 | 38 hrs ago | IN | 0 S | 0.00763115 | ||||
Add Dex | 11742108 | 38 hrs ago | IN | 0 S | 0.00762911 | ||||
Add Dex | 11741159 | 38 hrs ago | IN | 0 S | 0.01114981 | ||||
Add Multiple Tok... | 11740948 | 38 hrs ago | IN | 0 S | 0.05537361 | ||||
Add Multiple Tok... | 11740753 | 38 hrs ago | IN | 0 S | 0.01516801 | ||||
Add Multiple Tok... | 11740448 | 38 hrs ago | IN | 0 S | 0.06876371 | ||||
Add Multiple Tok... | 11740379 | 38 hrs ago | IN | 0 S | 0.09556612 | ||||
Add Multiple Tok... | 11739851 | 38 hrs ago | IN | 0 S | 0.0687686 | ||||
Execute Swap | 11723300 | 40 hrs ago | IN | 1 S | 0.00959706 | ||||
Add Token | 11720705 | 40 hrs ago | IN | 0 S | 0.01430203 | ||||
Add Token | 11720612 | 40 hrs ago | IN | 0 S | 0.01522669 |
Latest 13 internal transactions
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
11823919 | 28 hrs ago | 0.09291505 S | ||||
11823919 | 28 hrs ago | 0.0001862 S | ||||
11823919 | 28 hrs ago | 0.09310125 S | ||||
11810080 | 30 hrs ago | 1.14301298 S | ||||
11810080 | 30 hrs ago | 0.0022906 S | ||||
11810080 | 30 hrs ago | 1.14530358 S | ||||
11804778 | 30 hrs ago | 1 S | ||||
11804654 | 30 hrs ago | 1 S | ||||
11776485 | 33 hrs ago | 50 S | ||||
11743407 | 38 hrs ago | 0.08562117 S | ||||
11743407 | 38 hrs ago | 0.00017158 S | ||||
11743407 | 38 hrs ago | 0.08579276 S | ||||
11723300 | 40 hrs ago | 1 S |
Loading...
Loading
Contract Source Code Verified (Exact Match)
Contract Name:
PegasusAggregator
Compiler Version
v0.8.28+commit.7893614a
Optimization Enabled:
Yes with 1 runs
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "./DexManager.sol"; import "./PegasusStaking.sol"; import "./interfaces/IDEXStructs.sol"; import "hardhat/console.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); function swapExactETHForTokens( uint amountOutMin, address[] calldata path, address to, uint deadline ) external payable 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 DexManager { //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 } // Fee distribution address public teamFeeCollector; bool public distributeFeesToStakers; uint256 private swapFeePercent = 20; // Reference to the staking contract PegasusStaking public stakingContract; //mappings WrappedNatives public wrappedBy; // Fee denominator for percentage calculations (100% = 10000) uint256 private constant FEE_DENOMINATOR = 10000; //For very low amounts uint256 public constant MIN_FEE_TO_CONVERT = 0.001 ether; event SwapExecuted(address tokenIn, address tokenOut, uint256 amountIn, uint256 amountOut, address router, address recipient); constructor() DexManager(msg.sender) { teamFeeCollector = msg.sender; distributeFeesToStakers = false; } // Function to update fee percentage function updateFeePercent(uint256 newFeePercent) external onlyOwner { require(newFeePercent <= 100, "Fee cannot exceed 1%"); // Safety check swapFeePercent = newFeePercent; } //Helper functions function getWrappedNative() internal view returns (address) { return wrappedBy._address; } 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"); } } function _processRoute( address actualTokenIn, address actualTokenOut, uint256 routeAmountIn, SplitRoute calldata route, uint256 deadline, bool isNativeOut ) private returns (uint256) { // Approve router IERC20(actualTokenIn).approve(route.dexRouter, routeAmountIn); uint256 routeAmountOut; if (route.isV3) { routeAmountOut = executeV3Swap( actualTokenIn, actualTokenOut, routeAmountIn, 0, route.dexRouter, route.feeTier, deadline ); } else { // For V2, handle native output separately if needed if (isNativeOut) { address[] memory path = route.path; if (path.length == 0 || path[0] == address(0) || path[path.length - 1] == address(0)) { // Auto-create minimal path if not provided address[] memory autoPath = new address[](2); autoPath[0] = actualTokenIn; autoPath[1] = actualTokenOut; // Use wrapped native for V2 path path = autoPath; } try IRouter(route.dexRouter).swapExactTokensForETH( routeAmountIn, 0, // Minimum output validated at the end path, address(this), deadline ) returns (uint[] memory amounts) { routeAmountOut = amounts[amounts.length - 1]; } catch { revert("V2 swap to ETH failed"); } } else { // Regular token to token swap address[] memory path = route.path; if (path.length == 0 || path[0] == address(0) || path[path.length - 1] == address(0)) { // Auto-create minimal path if not provided address[] memory autoPath = new address[](2); autoPath[0] = actualTokenIn; autoPath[1] = actualTokenOut; path = autoPath; } routeAmountOut = executeV2Swap( actualTokenIn, actualTokenOut, routeAmountIn, 0, // Minimum output validated at the end route.dexRouter, deadline, path ); } } return routeAmountOut; } function getQuotes( address tokenIn, address tokenOut, uint256 amount, bool isExactIn ) internal view returns (Quote[] memory) { Quote[] memory quotes = new Quote[](supportedDexes.length * 3); uint256 validQuotes = 0; for (uint i = 0; i < supportedDexes.length; i++) { if (!supportedDexes[i].active) continue; //account for v3 if(supportedDexes[i].isV3) { IV3Quoter quoter = IV3Quoter(supportedDexes[i].quoter); for (uint j = 0; j < supportedDexes[i].feeTiers.length; j++) { // Encode the function call data bytes memory callData = abi.encodeWithSelector( quoter.quoteExactInputSingle.selector, tokenIn, tokenOut, supportedDexes[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[i].name, dexRouter: supportedDexes[i].routerAddress, amountIn: amount, amountOut: amountOut, path: new address[](0), v3Path: abi.encodePacked(tokenIn, supportedDexes[i].feeTiers[j], tokenOut), isV3: true, feeTier: supportedDexes[i].feeTiers[j] }); validQuotes++; } } } else { // Existing V2 quote logic address WBNB = getWrappedNative(); // 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] = wrappedBy.stableCoin; stablePath[2] = tokenOut; IRouter router = IRouter(supportedDexes[i].routerAddress); try router.getAmountsOut(amount, path) returns (uint[] memory amounts) { if (isExactIn) { quotes[validQuotes] = Quote({ dexName: supportedDexes[i].name, dexRouter: supportedDexes[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[i].name, dexRouter: supportedDexes[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[i].name, dexRouter: supportedDexes[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 ) public view returns (SplitQuote memory) { // Get all possible quotes first Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, true); 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 ) external view returns (Quote memory) { Quote[] memory quotes = getQuotes(tokenIn, tokenOut, amount, isExactIn); 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 ) external payable returns (uint256) { require(recipient != address(0), "Invalid recipient"); if(tokenIn == address(0) || tokenOut == address(0)) { require(!(path[0] == address(0) && path[1] == address(0)), "Invalid path"); } address wrappedNative = getWrappedNative(); require(wrappedNative != address(0), "Wrapped native not set"); bool isNativeIn = tokenIn == address(0); bool isNativeOut = tokenOut == address(0); require(!(isNativeIn && isNativeOut), "Cannot swap native to native"); // Real tokens to use in swap logic address actualTokenIn = isNativeIn ? wrappedNative : tokenIn; address actualTokenOut = isNativeOut ? wrappedNative : tokenOut; // Validate tokens require(isNativeIn || isSupportedToken[tokenIn], "Unsupported input token"); require(isNativeOut || isSupportedToken[tokenOut], "Unsupported output token"); uint256 swapAmount = isNativeIn ? msg.value : amountIn; require(swapAmount > 0, "amount must be greater than zero"); // Handle native input (convert to wrapped) if (isNativeIn) { IWeth(wrappedNative).deposit{value: msg.value}(); } else { // Transfer ERC20 tokens from sender IERC20(actualTokenIn).transferFrom(msg.sender, address(this), swapAmount); } // Approve router to spend tokens IERC20(actualTokenIn).approve(router, swapAmount); uint256 amountOut; //account for v3 if(isV3Router[router]) { amountOut = executeV3Swap( actualTokenIn, actualTokenOut, swapAmount, amountOutMin, router, feeTier, deadline ); } else { // For V2, ensure proper path if (path[0] == address(0) || path[1] == address(0)) { // Auto-create minimal path if not provided address[] memory autoPath = new address[](2); autoPath[0] = actualTokenIn; autoPath[1] = actualTokenOut; path = autoPath; } if (isNativeIn) { // Already converted to wrapped native, so use regular token swap amountOut = executeV2Swap( actualTokenIn, actualTokenOut, swapAmount, amountOutMin, router, deadline, path ); } else if (isNativeOut) { try IRouter(router).swapExactTokensForETH( swapAmount, amountOutMin, path, address(this), deadline ) returns (uint[] memory amounts) { amountOut = amounts[amounts.length - 1]; } catch { revert("V2 swap to ETH failed"); } } else { // Regular token to token swap amountOut = executeV2Swap( actualTokenIn, actualTokenOut, swapAmount, amountOutMin, router, deadline, path ); } } // Calculate fee (uint256 feeAmount, uint256 finalAmount) = calculateFee(amountOut); handleFeeDistribution(feeAmount, wrappedNative, actualTokenOut, router, deadline, minFee, isNativeOut); // Handle output transfer to recipient if (isNativeOut) { // Convert wrapped native to native and send if (isV3Router[router]) { // For V3, we need to unwrap manually IWeth(wrappedNative).withdraw(finalAmount); } // Send native to recipient (bool success, ) = recipient.call{value: finalAmount}(""); require(success, "Native transfer failed"); } else { // Transfer ERC20 tokens to recipient IERC20(actualTokenOut).transfer(recipient, finalAmount); } emit SwapExecuted( isNativeIn ? address(0) : tokenIn, isNativeOut ? address(0) : tokenOut, swapAmount, finalAmount, 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 ) external payable returns (uint256) { require(routes.length > 0, "No routes provided"); require(recipient != address(0), "Invalid recipient"); address wrappedNative = getWrappedNative(); require(wrappedNative != address(0), "Wrapped native not set"); bool isNativeIn = tokenIn == address(0); bool isNativeOut = tokenOut == address(0); require(!(isNativeIn && isNativeOut), "Cannot swap native to native"); // Real tokens to use in swap logic address actualTokenIn = isNativeIn ? wrappedNative : tokenIn; address actualTokenOut = isNativeOut ? wrappedNative : tokenOut; // Validate tokens require(isNativeIn || isSupportedToken[tokenIn], "Unsupported input token"); require(isNativeOut || isSupportedToken[tokenOut], "Unsupported output token"); uint256 swapAmount = isNativeIn ? msg.value : amountIn; require(swapAmount > 0, "Zero amount"); // Handle native input (convert to wrapped) if (isNativeIn) { IWeth(wrappedNative).deposit{value: msg.value}(); } else { // Transfer ERC20 tokens from sender IERC20(tokenIn).transferFrom(msg.sender, address(this), amountIn); } // Process all routes and track total output uint256 totalAmountOut; console.log(11, totalAmountOut); for(uint i = 0; i < routes.length; i++) { uint256 routeAmountIn = (swapAmount * routes[i].percentage) / 10000; totalAmountOut += _processRoute( actualTokenIn, actualTokenOut, routeAmountIn, routes[i], deadline, isNativeOut ); } require(totalAmountOut >= minAmountOut, "Insufficient output amount"); // Calculate and handle fees (uint256 feeAmount, uint256 finalAmount) = calculateFee(totalAmountOut); handleFeeDistribution(feeAmount, wrappedNative, actualTokenOut, routes[0].dexRouter, deadline, minFee, isNativeOut); // Handle output transfer to recipient if (isNativeOut) { // For V3, we need to unwrap manually IWeth(wrappedNative).withdraw(finalAmount); // Send native to recipient (bool success, ) = recipient.call{value: finalAmount}(""); require(success, "Native transfer failed"); } else { // Transfer ERC20 tokens to recipient IERC20(actualTokenOut).transfer(recipient, finalAmount); } emit SwapExecuted( isNativeIn ? address(0) : tokenIn, isNativeOut ? address(0) : tokenOut, swapAmount, finalAmount, address(0), // No specific router for split swaps recipient ); return totalAmountOut; } //Fee distribution handling function handleFeeDistribution(uint feeAmount, address WBNB, address tokenOut, address router, uint deadline, uint256 minFeeRequired, bool isNativeOut) internal { // Handle fees based on minimum conversion amount if (distributeFeesToStakers && address(stakingContract) != address(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) { stakingContract.distributeRewards{value: receivedBNB}(); } } else { // If fee is too small, send to team instead IERC20(tokenOut).transfer(teamFeeCollector, feeAmount); } } else { // Handle WBNB fees if (feeAmount >= MIN_FEE_TO_CONVERT) { IWeth(WBNB).withdraw(feeAmount); stakingContract.distributeRewards{value: feeAmount}(); } else { // If fee is too small, send to team IERC20(WBNB).transfer(teamFeeCollector, feeAmount); } } } else { if(isNativeOut) { (bool success, ) = payable(teamFeeCollector).call{value: feeAmount}(""); require(success, "Native transfer failed"); } else { // If staking is disabled, send fees to team (automate by converting to bnb before sending to team) IERC20(tokenOut).transfer(teamFeeCollector, feeAmount); } } } // Admin update functions and helper functions function setFeeDistributionMode(bool _distributeToStakers) external onlyOwner { distributeFeesToStakers = _distributeToStakers; } // Set the staking contract function setStakingContract(address _stakingContract) external onlyOwner { require(_stakingContract != address(0), "Invalid staking contract"); stakingContract = PegasusStaking(payable(_stakingContract)); } function setTeamFeeCollector(address _collector) external onlyOwner { require(_collector != address(0), "Invalid address"); teamFeeCollector = _collector; } function getADex(address _dexRouter) internal view returns (IDEXStructs.DEX memory) { require(_dexRouter != address(0), "Invalid router address"); for (uint256 i = 0; i < supportedDexes.length; i++) { if (supportedDexes[i].routerAddress == _dexRouter) { return supportedDexes[i]; } } revert("DEX not found"); } //For wrapped function addWrapped(string memory name, address _address, address stable) external onlyOwner { require(_address != address(0), "bad address"); wrappedBy = WrappedNatives(name, _address, stable); } function updateWrapped(string memory name, address _address, address stable) external onlyOwner { require(_address != address(0), "bad address"); wrappedBy.name = name; wrappedBy._address = _address; wrappedBy.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); } // Allow contract to receive BNB receive() external payable {} fallback() external payable {} }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol) pragma solidity ^0.8.20; import {Context} from "../utils/Context.sol"; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * The initial owner is set to the address provided by the deployer. This can * later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; /** * @dev The caller account is not authorized to perform an operation. */ error OwnableUnauthorizedAccount(address account); /** * @dev The owner is not a valid owner account. (eg. `address(0)`) */ error OwnableInvalidOwner(address owner); event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the address provided by the deployer as the initial owner. */ constructor(address initialOwner) { if (initialOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(initialOwner); } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { if (owner() != _msgSender()) { revert OwnableUnauthorizedAccount(_msgSender()); } } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby disabling any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { if (newOwner == address(0)) { revert OwnableInvalidOwner(address(0)); } _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.20; /** * @dev Interface of the ERC-20 standard as defined in the ERC. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the value of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the value of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves a `value` amount of tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 value) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets a `value` amount of tokens as the allowance of `spender` over the * caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 value) external returns (bool); /** * @dev Moves a `value` amount of tokens from `from` to `to` using the * allowance mechanism. `value` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 value) external returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol) pragma solidity ^0.8.20; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } function _contextSuffixLength() internal view virtual returns (uint256) { return 0; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "./interfaces/IDEXStructs.sol"; import "./TokenManager.sol"; contract DexManager is TokenManager { IDEXStructs.DEX[] public supportedDexes; // chainId => DEX[] mapping(address => bool) public isV3Router; // check if a dex is v3 event DexAdded(string indexed name, address indexed router); event DexUpdated(uint256 indexed index, string indexed name); event DexRemoved(string indexed name); constructor(address _someAddress) TokenManager(_someAddress) {} function addDex( string calldata name, address router, address factory, bool isV3, address quoter, uint24[] calldata feeTiers ) external onlyOwner { require(router != address(0), "Invalid router address"); if (isV3) { require(quoter != address(0), "Invalid quoter address"); require(feeTiers.length > 0, "Must provide fee tiers"); } supportedDexes.push(IDEXStructs.DEX({ name: name, routerAddress: router, factory: factory, active: true, isV3: isV3, quoter: quoter, feeTiers: feeTiers })); isV3Router[router] = isV3; emit DexAdded(name, router); } function removeDex(string calldata name) external onlyOwner { bytes32 nameHash = keccak256(bytes(name)); IDEXStructs.DEX[] storage dexes = supportedDexes; for (uint i = 0; i < dexes.length; i++) { if (keccak256(bytes(dexes[i].name)) == nameHash) { address routerToRemove = dexes[i].routerAddress; dexes[i] = dexes[dexes.length - 1]; dexes.pop(); isV3Router[routerToRemove] = false; emit DexRemoved(name); return; } } revert("DEX not found"); } function getDexes() external view returns (IDEXStructs.DEX[] memory) { return supportedDexes; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; interface IDEXStructs { struct DEX { string name; address routerAddress; address factory; bool active; bool isV3; address quoter; uint24[] feeTiers; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/token/ERC20/IERC20.sol"; import "@openzeppelin/contracts/access/Ownable.sol"; import "hardhat/console.sol"; contract PegasusStaking is Ownable { // Staking token (likely Pegasus token) IERC20 public stakingToken; // Total staked amount uint256 public totalStaked; // Accumulated reward per share uint256 public accRewardPerShare; // Precision for reward calculations uint256 private constant REWARD_PRECISION = 1e12; // Staker information struct Staker { uint256 stakedAmount; uint256 rewardDebt; uint256 unclaimedRewards; } // Mapping of staker address to their information mapping(address => Staker) public stakers; // PegasusAggregator contract address (rewards source) address public aggregator; // Events event Staked(address indexed user, uint256 amount); event Unstaked(address indexed user, uint256 amount); event RewardClaimed(address indexed user, uint256 amount); event RewardDistributed(uint256 indexed amount); // Modifier to restrict functions to the aggregator contract modifier onlyAggregator() { require(msg.sender == aggregator, "Only aggregator can call"); _; } constructor(address _stakingToken) Ownable(msg.sender) { require(_stakingToken != address(0), "Invalid staking token"); stakingToken = IERC20(_stakingToken); accRewardPerShare = 0; } // Set the aggregator contract address function setAggregator(address _aggregator) external onlyOwner { require(_aggregator != address(0), "Invalid aggregator address"); aggregator = _aggregator; } // Update reward for a specific user 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; } } // Stake tokens function stake(uint256 amount) external { require(amount > 0, "Cannot stake 0"); // Update rewards before changing stake updateReward(msg.sender); // Transfer tokens from sender to contract stakingToken.transferFrom(msg.sender, address(this), amount); // Update staker information 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); } // Unstake tokens function unstake(uint256 amount) external { require(amount > 0, "Cannot unstake 0"); require(stakers[msg.sender].stakedAmount >= amount, "Insufficient stake"); // Update rewards before changing stake updateReward(msg.sender); // Update staker information stakers[msg.sender].stakedAmount -= amount; totalStaked -= amount; // Update reward debt stakers[msg.sender].rewardDebt = (stakers[msg.sender].stakedAmount * accRewardPerShare) / REWARD_PRECISION; // Transfer tokens back to user stakingToken.transfer(msg.sender, amount); emit Unstaked(msg.sender, amount); } // Claim rewards 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, "Native transfer failed"); emit RewardClaimed(msg.sender, reward); } } // Distribute rewards (called by aggregator) function distributeRewards() external payable onlyAggregator { require(totalStaked > 0, "No stakers"); if (msg.value > 0) { // Update accumulated reward per share accRewardPerShare += (msg.value * REWARD_PRECISION) / totalStaked; emit RewardDistributed(msg.value); } } // Get pending rewards for a staker function getPendingRewards(address _staker) external view returns (uint256) { Staker storage staker = stakers[_staker]; if (totalStaked == 0) { return staker.unclaimedRewards; } uint256 pending = ((staker.stakedAmount * accRewardPerShare) / REWARD_PRECISION) - staker.rewardDebt; return staker.unclaimedRewards + pending; } // Get staker information 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); } // Emergency function to rescue tokens function rescueTokens(address token, address to, uint256 amount) external onlyOwner { IERC20(token).transfer(to, amount); } // Emergency function to rescue ETH/BNB function rescueETH(address payable to, uint256 amount) external onlyOwner { require(address(this).balance >= amount, "Insufficient balance"); (bool success, ) = to.call{value: amount}(""); require(success, "ETH transfer failed"); } // Allow contract to receive native currency receive() external payable {} fallback() external payable {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.28; import "@openzeppelin/contracts/access/Ownable.sol"; contract TokenManager is Ownable { struct Token { string symbol; string name; address tokenAddress; uint8 decimals; string logouri; bool active; } Token[] public tokens; // chainId => Token[] mapping(address => bool) public isSupportedToken; // shows that a token is supported event TokenAdded(string indexed symbol, address indexed tokenAddress); event TokenRemoved(address indexed tokenAddress); event TokenUpdated(string indexed symbol, address indexed tokenAddress); event MultipleTokensAdded(uint256 indexed count); constructor(address _someAddress) Ownable(_someAddress) {} function addToken( string calldata symbol, string calldata name, address tokenAddress, uint8 decimals, string calldata logoUri ) external onlyOwner { _addSingleToken( Token({ symbol: symbol, name: name, tokenAddress: tokenAddress, decimals: decimals, logouri: logoUri, active: true }) ); } function _addSingleToken(Token memory newToken) private { require(!isSupportedToken[newToken.tokenAddress], "Token already exists"); tokens.push(newToken); isSupportedToken[newToken.tokenAddress] = true; emit TokenAdded(newToken.symbol, newToken.tokenAddress); } function addMultipleTokens( Token[] calldata tokensIn ) external onlyOwner { require(tokensIn.length > 0, "No tokens provided"); uint256 addedCount = 0; Token[] storage newTokens = tokens; for (uint256 i = 0; i < tokensIn.length; i++) { if (isSupportedToken[tokensIn[i].tokenAddress] || tokensIn[i].tokenAddress == address(0)) { continue; } newTokens.push(tokensIn[i]); isSupportedToken[tokensIn[i].tokenAddress] = true; addedCount++; emit TokenAdded(tokensIn[i].symbol, tokensIn[i].tokenAddress); } if (addedCount > 0) { emit MultipleTokensAdded(addedCount); } } function removeToken(address tokenAddress) external onlyOwner { require(isSupportedToken[tokenAddress], "Token not found"); Token[] storage targetTokens = tokens; for (uint i = 0; i < targetTokens.length; i++) { if (targetTokens[i].tokenAddress == tokenAddress) { targetTokens[i] = tokens[tokens.length - 1]; targetTokens.pop(); isSupportedToken[tokenAddress] = false; emit TokenRemoved(tokenAddress); break; } } } function getAllTokens() external view returns (Token[] memory) { return tokens; } }
// SPDX-License-Identifier: MIT pragma solidity >=0.4.22 <0.9.0; library console { address constant CONSOLE_ADDRESS = 0x000000000000000000636F6e736F6c652e6c6f67; function _sendLogPayloadImplementation(bytes memory payload) internal view { address consoleAddress = CONSOLE_ADDRESS; /// @solidity memory-safe-assembly assembly { pop( staticcall( gas(), consoleAddress, add(payload, 32), mload(payload), 0, 0 ) ) } } function _castToPure( function(bytes memory) internal view fnIn ) internal pure returns (function(bytes memory) pure fnOut) { assembly { fnOut := fnIn } } function _sendLogPayload(bytes memory payload) internal pure { _castToPure(_sendLogPayloadImplementation)(payload); } function log() internal pure { _sendLogPayload(abi.encodeWithSignature("log()")); } function logInt(int256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(int256)", p0)); } function logUint(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function logString(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function logBool(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function logAddress(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function logBytes(bytes memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes)", p0)); } function logBytes1(bytes1 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0)); } function logBytes2(bytes2 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0)); } function logBytes3(bytes3 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0)); } function logBytes4(bytes4 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0)); } function logBytes5(bytes5 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0)); } function logBytes6(bytes6 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0)); } function logBytes7(bytes7 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0)); } function logBytes8(bytes8 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0)); } function logBytes9(bytes9 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0)); } function logBytes10(bytes10 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0)); } function logBytes11(bytes11 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0)); } function logBytes12(bytes12 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0)); } function logBytes13(bytes13 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0)); } function logBytes14(bytes14 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0)); } function logBytes15(bytes15 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0)); } function logBytes16(bytes16 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0)); } function logBytes17(bytes17 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0)); } function logBytes18(bytes18 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0)); } function logBytes19(bytes19 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0)); } function logBytes20(bytes20 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0)); } function logBytes21(bytes21 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0)); } function logBytes22(bytes22 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0)); } function logBytes23(bytes23 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0)); } function logBytes24(bytes24 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0)); } function logBytes25(bytes25 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0)); } function logBytes26(bytes26 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0)); } function logBytes27(bytes27 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0)); } function logBytes28(bytes28 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0)); } function logBytes29(bytes29 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0)); } function logBytes30(bytes30 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0)); } function logBytes31(bytes31 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0)); } function logBytes32(bytes32 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0)); } function log(uint256 p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256)", p0)); } function log(string memory p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string)", p0)); } function log(bool p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool)", p0)); } function log(address p0) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address)", p0)); } function log(uint256 p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1)); } function log(uint256 p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string)", p0, p1)); } function log(uint256 p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool)", p0, p1)); } function log(uint256 p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address)", p0, p1)); } function log(string memory p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256)", p0, p1)); } function log(string memory p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1)); } function log(string memory p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1)); } function log(string memory p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1)); } function log(bool p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", p0, p1)); } function log(bool p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1)); } function log(bool p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1)); } function log(bool p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1)); } function log(address p0, uint256 p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256)", p0, p1)); } function log(address p0, string memory p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1)); } function log(address p0, bool p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1)); } function log(address p0, address p1) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1)); } function log(uint256 p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address)", p0, p1, p2)); } function log(uint256 p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256)", p0, p1, p2)); } function log(uint256 p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string)", p0, p1, p2)); } function log(uint256 p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool)", p0, p1, p2)); } function log(uint256 p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address)", p0, p1, p2)); } function log(uint256 p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256)", p0, p1, p2)); } function log(uint256 p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string)", p0, p1, p2)); } function log(uint256 p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool)", p0, p1, p2)); } function log(uint256 p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address)", p0, p1, p2)); } function log(uint256 p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256)", p0, p1, p2)); } function log(uint256 p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string)", p0, p1, p2)); } function log(uint256 p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool)", p0, p1, p2)); } function log(uint256 p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address)", p0, p1, p2)); } function log(string memory p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256)", p0, p1, p2)); } function log(string memory p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string)", p0, p1, p2)); } function log(string memory p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool)", p0, p1, p2)); } function log(string memory p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address)", p0, p1, p2)); } function log(string memory p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", p0, p1, p2)); } function log(string memory p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2)); } function log(string memory p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2)); } function log(string memory p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2)); } function log(string memory p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", p0, p1, p2)); } function log(string memory p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2)); } function log(string memory p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2)); } function log(string memory p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2)); } function log(string memory p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", p0, p1, p2)); } function log(string memory p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2)); } function log(string memory p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2)); } function log(string memory p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2)); } function log(bool p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2)); } function log(bool p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string)", p0, p1, p2)); } function log(bool p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool)", p0, p1, p2)); } function log(bool p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address)", p0, p1, p2)); } function log(bool p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", p0, p1, p2)); } function log(bool p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2)); } function log(bool p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2)); } function log(bool p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2)); } function log(bool p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", p0, p1, p2)); } function log(bool p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2)); } function log(bool p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2)); } function log(bool p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2)); } function log(bool p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", p0, p1, p2)); } function log(bool p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2)); } function log(bool p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2)); } function log(bool p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2)); } function log(address p0, uint256 p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2)); } function log(address p0, uint256 p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string)", p0, p1, p2)); } function log(address p0, uint256 p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool)", p0, p1, p2)); } function log(address p0, uint256 p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address)", p0, p1, p2)); } function log(address p0, string memory p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", p0, p1, p2)); } function log(address p0, string memory p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2)); } function log(address p0, string memory p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2)); } function log(address p0, string memory p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2)); } function log(address p0, bool p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", p0, p1, p2)); } function log(address p0, bool p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2)); } function log(address p0, bool p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2)); } function log(address p0, bool p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2)); } function log(address p0, address p1, uint256 p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", p0, p1, p2)); } function log(address p0, address p1, string memory p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2)); } function log(address p0, address p1, bool p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2)); } function log(address p0, address p1, address p2) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2)); } function log(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,string,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,bool,address,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,uint256,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,string,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,bool,address)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,uint256)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,string)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,bool)", p0, p1, p2, p3)); } function log(uint256 p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(uint256,address,address,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,string,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,string)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,uint256,address,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3)); } function log(string memory p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,string,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,bool,address)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,string)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,bool)", p0, p1, p2, p3)); } function log(bool p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,uint256,address,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3)); } function log(bool p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3)); } function log(bool p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3)); } function log(bool p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,string,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,bool,address)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,uint256)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,string)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,bool)", p0, p1, p2, p3)); } function log(address p0, uint256 p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,uint256,address,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,uint256,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3)); } function log(address p0, string memory p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3)); } function log(address p0, bool p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,string)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, uint256 p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,address)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, string memory p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, bool p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, uint256 p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, string memory p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, bool p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3)); } function log(address p0, address p1, address p2, address p3) internal pure { _sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3)); } }
{ "viaIR": true, "optimizer": { "enabled": true, "runs": 1 }, "evmVersion": "paris", "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } }, "libraries": {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[],"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":true,"internalType":"string","name":"name","type":"string"},{"indexed":true,"internalType":"address","name":"router","type":"address"}],"name":"DexAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"name","type":"string"}],"name":"DexRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"string","name":"name","type":"string"}],"name":"DexUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"count","type":"uint256"}],"name":"MultipleTokensAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"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":true,"internalType":"string","name":"symbol","type":"string"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"string","name":"symbol","type":"string"},{"indexed":true,"internalType":"address","name":"tokenAddress","type":"address"}],"name":"TokenUpdated","type":"event"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"MIN_FEE_TO_CONVERT","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[]"}],"name":"addDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"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":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct TokenManager.Token[]","name":"tokensIn","type":"tuple[]"}],"name":"addMultipleTokens","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":"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"}],"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":"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"}],"name":"executeSplitSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","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[]"}],"name":"executeSwap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"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":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"internalType":"struct TokenManager.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"}],"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"}],"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":[],"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":"","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":[{"internalType":"string","name":"name","type":"string"}],"name":"removeDex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"}],"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":"_stakingContract","type":"address"}],"name":"setStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_collector","type":"address"}],"name":"setTeamFeeCollector","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingContract","outputs":[{"internalType":"contract PegasusStaking","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"","type":"uint256"}],"name":"tokens","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":"string","name":"logouri","type":"string"},{"internalType":"bool","name":"active","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","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":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stable","type":"address"}],"name":"updateWrapped","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wrappedBy","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"_address","type":"address"},{"internalType":"address","name":"stableCoin","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
608080604052346093573315607d5760008054336001600160a01b0319821681178355916001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09080a36014600655600580546001600160a81b0319163360ff60a01b1916179055615a0a90816100998239f35b631e4fbdf760e01b600052600060045260246000fd5b600080fdfe60806040526004361015610010575b005b60003560e01c806309a477c7146102105780630ae9c2771461020b578063124e694c14610206578063240028e8146102015780632a5c792a146101fc5780634c984d38146101f75780634d24df9d146101f25780634f64b2be146101ed5780635fa7b584146101e8578063715018a6146101e35780637765fd0d146101de57806381ee0715146101d957806386f75f62146101d4578063880cdc31146101cf5780638a142ea4146101ca5780638cf106e1146101c55780638da5cb5b146101c057806399a5d747146101bb5780639b396b65146101b65780639dd373b9146101b15780639ed12c31146101ac578063b1db3096146101a7578063b5d52d1a146101a2578063ba1471321461019d578063c74b92ca14610198578063cea9d26f14610193578063d2f0ee8b1461018e578063ee99205c14610189578063f05c5fed14610184578063f2fde38b1461017f578063fccdfe4f1461017a5763fda493c90361000e576122c8565b612050565b612033565b611fce565b611fa5565b611eac565b611e40565b611db3565b611d8d565b611d64565b611bfb565b611b1d565b611a93565b611a52565b611a24565b6119fb565b6119b9565b611922565b6117f7565b611761565b611707565b6115fc565b611517565b611422565b6113a8565b610f8d565b610d67565b610c74565b610b76565b610656565b610598565b6103e6565b600091031261022057565b600080fd5b90600182811c92168015610255575b602083101461023f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610234565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b0382111761029057604052565b61025f565b606081019081106001600160401b0382111761029057604052565b60e081019081106001600160401b0382111761029057604052565b601f909101601f19168101906001600160401b0382119082101761029057604052565b906040519182600082549261030284610225565b80845293600181169081156103705750600114610329575b50610327925003836102cb565b565b90506000929192526020600020906000915b818310610354575050906020610327928201013861031a565b602091935080600191548385890101520191019091849261033b565b90506020925061032794915060ff191682840152151560051b8201013861031a565b6001600160a01b031690565b60005b8381106103b15750506000910152565b81810151838201526020016103a1565b906020916103da8151809281855285808601910161039e565b601f01601f1916010190565b3461022057600036600319011261022057604051600060085461040881610225565b80845290600181169081156104b65750600114610469575b61045a83610430818503826102cb565b60018060a01b036009541660018060a01b03600a54166040519384936060855260608501906103c1565b91602084015260408301520390f35b60086000908152600080516020615995833981519152939250905b80821061049c57509091508101602001610430610420565b919260018160209254838588010152019101909291610484565b60ff191660208086019190915291151560051b840190910191506104309050610420565b634e487b7160e01b600052603260045260246000fd5b60035481101561050f5760036000526005602060002091020190600090565b6104da565b60015481101561050f5760016000526005602060002091020190600090565b805482101561050f576000526005602060002091020190600090565b949196959261056960a0959260c0885260c08801906103c1565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b3461022057602036600319011261022057600435600354811015610220576105bf906104f0565b506105c9816102ee565b60018201546002830154600390930154604051938493610611936001600160a01b039384169360a884901c60ff9081169460a081901c9091169390821692909116908761054f565b0390f35b6001600160a01b0381160361022057565b9181601f84011215610220578235916001600160401b038311610220576020808501948460051b01011161022057565b6101003660031901126102205761066e600435610615565b610679602435610615565b6044356064356084356001600160401b0381116102205761069e903690600401610626565b9190926106ac60a435610615565b60c4359160e435946000956106c28615156123e3565b6106d860a4356001600160a01b03161515612424565b6009546001600160a01b0316946106f0861515612464565b6004356001600160a01b03161580610b2f575b61070d90156124a9565b6004356001600160a01b0316610b265785965b6024356001600160a01b0316610b1d5786945b6004356001600160a01b0316801590610b04575b610750906124f4565b6024356001600160a01b0316801590610ae4575b61076d9061253a565b6004356001600160a01b0316610ade5734965b61078b881515612581565b6004356001600160a01b0316610a7a57506001600160a01b0388163b15610a7657604051630d0e30db60e41b81528a81600481346001600160a01b038e165af1801561096a57610a62575b505b89986107e261437f565b8a905b8b8483106109ff5750505091610838939161080761082d9796948b1015612699565b85896108326108158d6135d7565b9a6024356001600160a01b0316159891959091612613565b6126e2565b926146b3565b6024356001600160a01b031661097357506001600160a01b0383163b1561096f57604051632e1a7d4d60e01b8152600481018290529285908490602490829084906001600160a01b03165af1801561096a57610611956000805160206159b58339815191529461092a92610950575b506108c3818080808760a4355af16108bd61271c565b5061274c565b6004356001600160a01b031661094757805b6024356001600160a01b031661093d57925b604080516001600160a01b039384168152948316602086015284019490945260608301939093526000608083015260a43590921660a082015290819060c0820190565b0390a16040519081529081906020820190565b50602435926108e7565b600435906108d5565b8061095e83610964936102cb565b80610215565b386108a7565b6125f2565b8480fd5b60405163a9059cbb60e01b81529350602090849081888161099a8760a435600484016126ec565b03926001600160a01b03165af1801561096a57610611956000805160206159b58339815191529461092a926109d0575b506108c3565b6109f19060203d6020116109f8575b6109e981836102cb565b8101906125bb565b50386109ca565b503d6109df565b829b610a5489888c878f610a3a610a32610a4d92610a5a9a8f610a2860019e9f6020928c612623565b019050359061266b565b612710900490565b918c8a8060a01b03602435161596612623565b9189614428565b9061268c565b9a01906107e5565b8061095e8c610a70936102cb565b386107d6565b8980fd5b6020610a9e918c60405180809581946323b872dd60e01b83523033600485016125d0565b03916004356001600160a01b03165af1801561096a57610abf575b506107d8565b610ad79060203d6020116109f8576109e981836102cb565b5038610ab9565b86610780565b5061076d610afd610af6602435610b42565b5460ff1690565b9050610764565b50610750610b16610af6600435610b42565b9050610747565b60243594610733565b60043596610720565b506024356001600160a01b031615610703565b6001600160a01b0316600090815260026020526040902090565b6001600160a01b0316600090815260046020526040902090565b3461022057602036600319011261022057600435610b9381610615565b60018060a01b03166000526002602052602060ff604060002054166040519015158152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610beb57505050505090565b9091929394602080600192603f1985820301865288519060a080610c5d610c2e610c1e865160c0875260c08701906103c1565b87870151868203898801526103c1565b8880841b03604087015116604086015260ff6060870151166060860152608086015185820360808701526103c1565b930151151591015297019301930191939290610bdc565b3461022057600036600319011261022057600154610c918161189a565b90610c9f60405192836102cb565b808252600160009081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6602084015b838310610ce457604051806106118782610bb8565b60056020600192604051610cf781610275565b610d00866102ee565b8152610d0d8587016102ee565b81840152600286015460a086811b879003821660408401521c60ff166060820152610d3a600387016102ee565b6080820152610d59610d50600488015460ff1690565b151560a0830152565b815201920192019190610ccf565b3461022057602036600319011261022057600435610d8481610615565b610d8c61499d565b6001600160a01b03168015610db157600580546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b606090600319011261022057600435610e0081610615565b90602435610e0d81610615565b9060443590565b906020808351928381520192019060005b818110610e325750505090565b82516001600160a01b0316845260209384019390920191600101610e25565b9080602083519182815201916020808360051b8301019401926000915b838310610e7d57505050505090565b9091929394602080610e9b600193601f1986820301875289516103c1565b97019301930191939290610e6e565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b828210610f0e5750505050926040846020610f0b95960151828401520151906060601f1982850301910152610e51565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610f6c610f5a604087015160c0604088015260c0870190610e14565b606087015186820360608801526103c1565b94608081015115156080860152015116910152970192019201909291610edb565b3461022057610fb1610f9e36610de8565b9291908391610fab6127e1565b50614a94565b610fbd81511515612801565b60005b610fca8251612845565b81101561106057610fda8161267e565b825181101561105757806060610ff26001938661289e565b5101516060611001858761289e565b51015110611010575b01610fda565b61101a838561289e565b51611025828661289e565b51611030858761289e565b5261103b848661289e565b50611046828661289e565b52611051818561289e565b5061100a565b50600101610fc0565b5060009061106c6127e1565b906000905b8051821015611340576110838261267e565b8151811015611335576110946128b2565b926109c46110a185612871565b526113886110ae8561287e565b52611d4c6110bb8561288e565b5260005b845181101561132a576110e86110e2610a326110db848961289e565b518b61266b565b89612864565b50611140611112610a3260606110fe868961289e565b51015161110b858a61289e565b519061266b565b610a54610a326060611124888a61289e565b51015161113a611134878c61289e565b51612854565b9061266b565b878111611151575b506001016110bf565b96508661115c6128d4565b875261116661294f565b60408801908152611177848761289e565b516020015161118590610392565b61118f848961289e565b5161119a868961289e565b51608001516111a9878a61289e565b5160a001516111b8888b61289e565b5160c001511515916111ca898c61289e565b5160e0015162ffffff16936111dd61186c565b956111e89087612791565b6020860152604085015260608401521515608083015262ffffff1660a082015288519061121482612871565b5261121e90612871565b50611229858761289e565b516020016112369061298a565b611240848961289e565b5161124a90612854565b611254878961289e565b5160800151611263888a61289e565b5160a00151611272898b61289e565b5160c001511515916112848a8c61289e565b5160e0015162ffffff169361129761186c565b956112a29087612791565b6020860152604085015260608401521515608083015262ffffff1660a08201528851906112ce8261287e565b526112d89061287e565b506112e3848761289e565b51518151906112f182612871565b526112fb90612871565b50611306858761289e565b51519051906113148261287e565b5261131e9061287e565b50602087015238611148565b509250600101611083565b509060010190611071565b604051806106118582610eaa565b949060a0946113806113a0959461137260ff949b9a9b60c08b5260c08b01906103c1565b9089820360208b01526103c1565b93600180881b0316604088015216606086015284820360808601526103c1565b931515910152565b3461022057602036600319011261022057600435600154811015610220576113cf90610514565b506113d9816102ee565b906106116113e9600183016102ee565b9160028101549060ff6004611400600384016102ee565b920154169160405195869560ff8360a01c169260018060a01b0316918761134e565b346102205760203660031901126102205760043561143f81610615565b61144761499d565b6001600160a01b03811660008181526002602052604090205490919061146f9060ff16612997565b60005b6001548082101561000e578361148783610514565b50600201546001600160a01b039061149e90610392565b16146114ad5750600101611472565b916114d96114e6926114d36114cc6114c76114f097612845565b610514565b5091610514565b90612bb0565b6114e1612ca7565b610b42565b805460ff19169055565b7f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd3600080a2005b346102205760003660031901126102205761153061499d565b600080546001600160a01b0319811682556001600160a01b03166000805160206159758339815191528280a3005b8015150361022057565b610f0b906020815261010060e06115e46115ce61159187518560208801526101208701906103c1565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a0880152610e14565b60a0870151858203601f190160c08701526103c1565b60c086015115158483015294015162ffffff16910152565b346102205760803660031901126102205760043561161981610615565b6116496024359161162983610615565b60443560643593849261163b8461155e565b611643612cfb565b50614f98565b9061165682511515612801565b60009080156116ff57815b90825b84518110156116e55781156116ad57826060611680838861289e565b51015111611693575b6001905b01611664565b9250905060606116a3838561289e565b5101519082611689565b8260406116ba838861289e565b510151106116cb575b60019061168d565b9250905060406116db838561289e565b51015190826116c3565b6106116116f2858761289e565b5160405191829182611568565b600019611661565b3461022057600036600319011261022057602060405166038d7ea4c680008152f35b9181601f84011215610220578235916001600160401b038311610220576020838186019501011161022057565b60ff81160361022057565b346102205760a0366003190112610220576004356001600160401b03811161022057611791903690600401611729565b6024356001600160401b038111610220576117b0903690600401611729565b6044939193356117bf81610615565b606435916117cc83611756565b608435956001600160401b038711610220576117ef61000e973690600401611729565b969095612d4c565b346102205760203660031901126102205760043561181481610615565b61181c61499d565b61182461499d565b6001600160a01b0381161561183c5761000e90615399565b631e4fbdf760e01b600052600060045260246000fd5b62ffffff81160361022057565b60e4359061032782611852565b6040519061032760c0836102cb565b6040519061032760e0836102cb565b60405190610327610100836102cb565b6001600160401b0381116102905760051b60200190565b9291906118bd8161189a565b936118cb60405195866102cb565b602085838152019160051b810192831161022057905b8282106118ed57505050565b6020809183356118fc81610615565b8152019101906118e1565b9080601f8301121561022057816020610f0b933591016118b1565b6101403660031901126102205760043561193b81610615565b6024359061194882610615565b6044359060643560843561195b81610615565b60a43561196781610615565b60c4359061197361185f565b926101043561012435979095906001600160401b03891161022057610611996119a36119a99a3690600401611907565b98613007565b6040519081529081906020820190565b34610220576020366003190112610220576004356119d681610615565b60018060a01b03166000526004602052602060ff604060002054166040519015158152f35b34610220576000366003190112610220576000546040516001600160a01b039091168152602090f35b3461022057602036600319011261022057611a406004356135d7565b60408051928352602083019190915290f35b34610220576020366003190112610220576004356001600160401b03811161022057611a8561000e913690600401611729565b90611a8e61499d565b613854565b3461022057602036600319011261022057600435611ab081610615565b611ab861499d565b6001600160a01b03168015611add57600780546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a59081cdd185ada5b99c818dbdb9d1c9858dd60421b6044820152606490fd5b3461022057602036600319011261022057611b4f600435611b3d8161155e565b611b4561499d565b1515600554612b79565b600555005b6001600160401b03811161029057601f01601f191660200190565b929192611b7b82611b54565b91611b8960405193846102cb565b829481845281830111610220578281602093846000960137010152565b606060031982011261022057600435906001600160401b038211610220578060238301121561022057816024611be193600401359101611b6f565b90602435611bee81610615565b90604435610f0b81610615565b3461022057611c0936611ba6565b9190611c1361499d565b6001600160a01b031690611c28821515613953565b60408051611c3581610295565b828152602081019384526001600160a01b0390941693019283528051906001600160401b03821161029057611c7482611c6f600854610225565b612a02565b602090601f8311600114611ce257611cb593611ca68461000e9795611caa95611cb095600092611cd7575b5050612a81565b6008555b51610392565b6127a0565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b015190503880611c9f565b6008600052601f19831691906000805160206159958339815191529260005b818110611d4c575084611caa94611cb094611cb5989461000e9a9860019510611d33575b505050811b01600855611caa565b015160001960f88460031b161c19169055388080611d25565b92936020600181928786015181550195019301611d01565b34610220576000366003190112610220576005546040516001600160a01b039091168152602090f35b3461022057600036600319011261022057602060ff60055460a01c166040519015158152f35b346102205760c0366003190112610220576004356001600160401b03811161022057611de3903690600401611729565b60243591611df083610615565b604435611dfc81610615565b606435611e088161155e565b60843591611e1583610615565b60a435956001600160401b03871161022057611e3861000e973690600401610626565b969095613a39565b3461022057611e7b6020611e5336610de8565b9190611e5d61499d565b600060405180968195829463a9059cbb60e01b8452600484016126ec565b03926001600160a01b03165af1801561096a57611e9457005b61000e9060203d6020116109f8576109e981836102cb565b3461022057611eba36611ba6565b9091611ec461499d565b611ed86001600160a01b0384161515613953565b8051906001600160401b03821161029057611ef882611c6f600854610225565b602090601f8311600114611f2a5782611cb59361000e9693611f2293600092611cd7575050612a81565b6008556127a0565b6008600052601f19831691906000805160206159958339815191529260005b818110611f8d5750926001928592611cb59661000e999610611f74575b505050811b016008556127a0565b015160001960f88460031b161c19169055388080611f66565b92936020600181928786015181550195019301611f49565b34610220576000366003190112610220576007546040516001600160a01b039091168152602090f35b3461022057602036600319011261022057600435611fea61499d565b60648111611ff757600655005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b346102205760203660031901126102205760043561181c81610615565b34610220576020366003190112610220576004356001600160401b03811161022057612080903690600401610626565b9061208961499d565b612094821515613e94565b6000916000915b8183106120d15783806120aa57005b7f0e18d302d46528f9fe1ca287fbdc60b7b9d0a6d9ed00fc3f6303e98683a0bac6600080a2005b9091926120f0610af66114e160406120ea888888612623565b016126e2565b801561219b575b6121925761213c60019161211461210f878787612623565b613fcf565b61213761212a6114e160406120ea8a8a8a612623565b805460ff19166001179055565b614131565b9361216d61215461214e838787612623565b80613ed5565b61216760406120ea868a8a979697612623565b9261383f565b90838060a01b031690600080516020615955833981519152600080a35b01919061209b565b9260019061218a565b506001600160a01b036121b460406120ea878787612623565b16156120f7565b906020808351928381520192019060005b8181106121d95750505090565b825162ffffff168452602093840193909201916001016121cc565b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061222757505050505090565b90919293946020806122b9600193603f1986820301875289519060c0612256835160e0845260e08401906103c1565b92878060a01b03868201511686840152878060a01b0360408201511660408401526060810151151560608401526122966080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c08184039101526121bb565b97019301930191939290612218565b34610220576000366003190112610220576003546122e58161189a565b906122f360405192836102cb565b808252600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602084015b838310612338576040518061061187826121f4565b6005602060019260405161234b816102b0565b612354866102ee565b8152848060a01b038587015416838201526123ab6123a2600288015461238561237c82610392565b60408601612791565b61239960a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b6123c46123bb6003880154610392565b60a08301612791565b6123d060048701614140565b60c0820152815201920192019190612323565b156123ea57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b1561242b57565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b1561246b57565b60405162461bcd60e51b815260206004820152601660248201527515dc985c1c1959081b985d1a5d99481b9bdd081cd95d60521b6044820152606490fd5b156124b057565b60405162461bcd60e51b815260206004820152601c60248201527b43616e6e6f742073776170206e617469766520746f206e617469766560201b6044820152606490fd5b156124fb57565b60405162461bcd60e51b81526020600482015260176024820152762ab739bab83837b93a32b21034b7383aba103a37b5b2b760491b6044820152606490fd5b1561254157565b60405162461bcd60e51b81526020600482015260186024820152772ab739bab83837b93a32b21037baba383aba103a37b5b2b760411b6044820152606490fd5b1561258857565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b908160209103126102205751610f0b8161155e565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b90359060be1981360301821215610220570190565b901561050f5780610f0b916125fe565b9082101561050f57610f0b9160051b8101906125fe565b634e487b7160e01b600052601160045260246000fd5b9060038202918083046003149015171561266657565b61263a565b8181029291811591840414171561266657565b906001820180921161266657565b9190820180921161266657565b156126a057565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b35610f0b81610615565b6001600160a01b039091168152602081019190915260400190565b604051906127166020836102cb565b60008252565b3d15612747573d9061272d82611b54565b9161273b60405193846102cb565b82523d6000602084013e565b606090565b1561275357565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b6001600160a01b039091169052565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b80546001600160a01b0319166001600160a01b03909216919091179055565b604051906127ee82610295565b6060604083828152600060208201520152565b1561280857565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b60001981019190821161266657565b6127100390612710821161266657565b9190820391821161266657565b80511561050f5760200190565b80516001101561050f5760400190565b80516002101561050f5760600190565b805182101561050f5760209160051b010190565b604051608091906128c383826102cb565b6003815291601f1901366020840137565b6128de600261189a565b906128ec60405192836102cb565b6002825281601f196128fe600261189a565b019060005b82811061290f57505050565b60209060405161291e81610275565b600081526000838201526060604082015260608082015260006080820152600060a082015282828501015201612903565b6040516060919061296083826102cb565b6002815291601f19018260005b82811061297957505050565b80606060208093850101520161296d565b516001600160a01b031690565b1561299e57565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b634e487b7160e01b600052600060045260246000fd5b8181106129f6575050565b600081556001016129eb565b90601f8211612a0f575050565b6103279160086000526020600020906020601f840160051c83019310612a3d575b601f0160051c01906129eb565b9091508190612a30565b9190601f8111612a5657505050565b610327926000526020600020906020601f840160051c83019310612a3d57601f0160051c01906129eb565b8160011b916000199060031b1c19161790565b919091828114612b7457612aa88354610225565b6001600160401b03811161029057612aca81612ac48454610225565b84612a47565b600093601f8211600114612afd57612aee9293948291600092612af2575050612a81565b9055565b015490503880611c9f565b612b11601f19831691600052602060002090565b94612b2184600052602060002090565b91815b818110612b5c57509583600195969710612b43575b505050811b019055565b015460001960f88460031b161c19169055388080612b39565b9192600180602092868b015481550194019201612b24565b509050565b60ff60a01b191660a09190911b60ff60a01b161790565b9060ff612aee91168254612b79565b9060ff801983541691151516179055565b90612c2c57818103612bc0575050565b600460ff8184612bd36103279686612a94565b612be36001820160018701612a94565b60028501612c10848060028501612c0360018060a01b03825416866127c2565b5460a01c16168254612b79565b9055612c226003820160038701612a94565b0154169101612b9f565b6129d5565b634e487b7160e01b600052603160045260246000fd5b612c518154610225565b9081612c5b575050565b81601f60009311600114612c6d575055565b81835260208320612c8991601f0160051c8101906001016129eb565b808252602082209081548360011b9084198560031b1c191617905555565b6001548015612cf65760001901612cbf816001610533565b612c2c57600481612cd1600093612c47565b612cdd60018201612c47565b826002820155612cef60038201612c47565b0155600155565b612c31565b6040519061010082016001600160401b0381118382101761029057604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b60ff92612da9969297959894612d7b612d8493612d6761499d565b6040519a612d748c610275565b3691611b6f565b89523691611b6f565b60208701526001600160a01b0390961660408601908152951660608501523691611b6f565b6080820152600160a082015281516001600160a01b031660009081526002602052604090205460ff16612e2557612dfe81612de6612e04936153ce565b612df661212a6114e18651610392565b519251610392565b9161550e565b6001600160a01b0390911690600080516020615955833981519152600080a3565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b15612e6857565b60405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b6044820152606490fd5b15612ea357565b606460405162461bcd60e51b815260206004820152602060248201527f616d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152fd5b60405160609190612ef883826102cb565b6002815291601f1901366020840137565b60405190612f186020836102cb565b6000808352366020840137565b602081830312610220578051906001600160401b03821161022057019080601f83011215610220578151612f588161189a565b92612f6660405194856102cb565b81845260208085019260051b82010192831161022057602001905b828210612f8e5750505090565b8151815260209182019101612f81565b9192608093612fc392979695978452602084015260a0604084015260a0830190610e14565b6001600160a01b0390951660608201520152565b606090602081526015602082015274158c881cddd85c081d1bc81155120819985a5b1959605a1b60408201520190565b9598949794969095939493926130276001600160a01b038a161515612424565b6001600160a01b03841615928315919084836135c6575b613586575b6009546001600160a01b03169361305b851515612464565b8580613575575b61306c90156124a9565b851561356e5784915b6001600160a01b038b166135675785945b8790613550575b613096906124f4565b6001600160a01b038b16801590613539575b6130b19061253a565b86156135335750349a5b6130c68c1515612e9c565b86156134d1576001600160a01b0386163b1561022057604051630d0e30db60e41b8152600081600481346001600160a01b038c165af1801561096a576134bc575b505b61312b60208d8c604051938492839263095ea7b360e01b8452600484016126ec565b038160006001600160a01b0389165af1801561096a578f948c938f93899361349f575b5061315b610af686610b5c565b1561334c5750916131989691613173969594936158dd565b9a5b61317e8c6135d7565b976001600160a01b038b16159290918a90869088906146b3565b6001600160a01b0387166132d057506131b3610af686610b5c565b61324c575b509161323a939187936131e46000808080876000805160206159b58339815191529e5af16108bd61271c565b1561324657506000945b6001600160a01b03811661324057506000955b604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b0390a190565b95613201565b946131ee565b969093909290916001600160a01b0388163b1561022057604051632e1a7d4d60e01b815260048101839052976000908990602490829084906001600160a01b03165af194851561096a576000805160206159b58339815191529861323a966132bb575b509193975091936131b8565b8061095e60006132ca936102cb565b386132af565b979391949290506020604051809963a9059cbb60e01b8252816000816132fa888b600484016126ec565b03926001600160a01b03165af194851561096a576000805160206159b58339815191529861323a9661332d575b506131e4565b6133459060203d6020116109f8576109e981836102cb565b5038613327565b95945061336861336361335e88612871565b61298a565b610392565b158015613489575b61345a575b89156133935791613198969161338d96959493615717565b9a613175565b91949392916001600160a01b038e1661344b5750506040516318cbafe560e01b815294600094869485946133ce945092309260048701612f9e565b0381836001600160a01b038c165af160009181613426575b506134085760405162461bcd60e51b81528061340460048201612fd7565b0390fd5b61341f816134196131989351612845565b9061289e565b519a613175565b6134449192503d806000833e61343c81836102cb565b810190612f25565b90386133e6565b94613198969161338d96615717565b9450613464612ee7565b6134768661347183612871565b612791565b613483826134718361287e565b94613375565b5061349961336361335e8861287e565b15613370565b6134b79060203d6020116109f8576109e981836102cb565b61314e565b8061095e60006134cb936102cb565b38613107565b6134f360208d604051809381926323b872dd60e01b83523033600485016125d0565b038160006001600160a01b0389165af1801561096a57613514575b50613109565b61352c9060203d6020116109f8576109e981836102cb565b503861350e565b9a6130bb565b506130b1613549610af68d610b42565b90506130a8565b50613096613560610af68a610b42565b905061308d565b8a94613086565b8691613075565b506001600160a01b038a1615613062565b61359561336361335e8c612871565b15806135ab575b6135a69015612e61565b613043565b506135a66135be61336361335e8d61287e565b15905061359c565b506001600160a01b0389161561303e565b906127106135e76006548461266b565b04808303928311612666579190565b90612aee9015158254612b79565b90600160401b811161029057815481835580821061362157505050565b61032792600052600a6009602060002092600383808488010486019606028061364f575b50010401906129eb565b6000198601908154906000199060200360031b1c16905538613645565b9080821461370e578054906001600160401b038211610290576136a16136ad916136968486613604565b600052602060002090565b92600052602060002090565b91600a82049181549160005b8481106136f1575050600a83028082036136d5575b5050505050565b60039060001992030260031b1b191691015538808080806136ce565b600191820180546001600160f01b039095168783015591016136b9565b5050565b90612c2c57818103613722575050565b600480836137336103279585612a94565b61374c60018060a01b03600183015416600186016127c2565b6137ab6002850161378d6002840161376d60018060a01b03825416846127c2565b61378160ff825460a01c1615158454612b79565b83555460a81c60ff1690565b90805460ff60a81b191691151560a81b60ff60a81b16919091179055565b6137c46137bb6003830154610392565b600386016127c2565b01910161366c565b6003548015612cf657600019016137e4816003610533565b612c2c57806137f4600492612c47565b600060018201556000600282015560006003820155018054600082558061381d575b5050600355565b61383891600052600a600960206000209201048101906129eb565b3880613816565b81604051928392833781016000815203902090565b90613860368284611b6f565b602081519101209160005b6003548082101561391e5784613889613883846104f0565b506102ee565b602081519101201461389e575060010161386b565b6138f794506114e6906138e5836138df6138d86138d36138cd60016138c56138f29a6104f0565b500154610392565b95612845565b6104f0565b50916104f0565b90613712565b6138ed6137cc565b610b5c565b61383f565b7f1bb636980af07b7a1d7c053eb0be1fe7712e8bf304f9b36de7aa8b2fdda05699600080a2565b60405162461bcd60e51b815260206004820152600d60248201526c111156081b9bdd08199bdd5b99609a1b6044820152606490fd5b1561395a57565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b81519192916001600160401b038111610290576139ae81612ac48454610225565b6020601f82116001146139d1578190612aee939495600092611cd7575050612a81565b601f198216906139e684600052602060002090565b9160005b818110613a2157509583600195969710613a0857505050811b019055565b015160001960f88460031b161c19169055388080612b39565b9192602060018192868b0151815501940192016139ea565b93919590949295613a4861499d565b6001600160a01b038116978815613b1e5786613ac4613ace946138ed93613abd6138f299613aa5613ad39e613a8d8e8d613afa575b613a8561187b565b993691611b6f565b8852613a9c8a60208a01612791565b60408801612791565b60016060870152891515608087015260a08601612791565b3691613be6565b60c0820152613d30565b612b9f565b7f2175f84b6c6dcc917bbec41b7f62cf11694eacf7a87f2fd2eda7e36d4c2c58b2600080a3565b613b0e6001600160a01b0386161515613b5c565b613b19871515613ba1565b613a7d565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420726f75746572206164647265737360501b6044820152606490fd5b15613b6357565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642071756f746572206164647265737360501b6044820152606490fd5b15613ba857565b60405162461bcd60e51b81526020600482015260166024820152754d7573742070726f766964652066656520746965727360501b6044820152606490fd5b929190613bf28161189a565b93613c0060405195866102cb565b602085838152019160051b810192831161022057905b828210613c2257505050565b602080918335613c3181611852565b815201910190613c16565b9062ffffff809160031b9316831b921b19161790565b815190916001600160401b038211610290576020613c8191613c748486613604565b0192600052602060002090565b600a82049160005b838110613cec5750600a8302900380613ca3575b50505050565b9260009360005b818110613cbf57505050015538808080613c9d565b9091946020613ce2600192613cd7895162ffffff1690565b908560030290613c3c565b9601929101613caa565b6000805b600a8110613d05575083820155600101613c89565b95906020613d27600192613d1c855162ffffff1690565b908a60030290613c3c565b92019601613cf0565b90600354600160401b81101561029057806001613d5292016003556003610533565b612c2c57825180519093906001600160401b03811161029057613d7f81613d798554610225565b85612a47565b6020601f8211600114613e1e5791613daa8260c0936004956103279899600092611cd7575050612a81565b84555b613dc6613dbd6020830151610392565b600186016127c2565b613e0560028501613de3613ddd6040850151610392565b826127c2565b613df9613df36060850151151590565b826135f6565b6080830151151561378d565b613e156137bb60a0830151610392565b01519101613c52565b601f19821695613e3385600052602060002090565b9660005b818110613e7c5750926103279697600495936001938360c09710613e63575b505050811b018455613dad565b015160001960f88460031b161c19169055388080613e56565b83830151895560019098019760209384019301613e37565b15613e9b57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81d1bdad95b9cc81c1c9bdd9a59195960721b6044820152606490fd5b903590601e198136030182121561022057018035906001600160401b0382116102205760200191813603831361022057565b9092916001600160401b03811161029057613f2681612ac48454610225565b6000601f8211600114613f54578190612aee939495600092613f49575050612a81565b013590503880611c9f565b601f19821694613f6984600052602060002090565b91805b878110613fa3575083600195969710613f8957505050811b019055565b0135600019600384901b60f8161c19169055388080612b39565b90926020600181928686013581550194019101613f6c565b35610f0b81611756565b35610f0b8161155e565b90600154600160401b81101561029057806001613ff192016001556001610533565b612c2c57613fff8380613ed5565b9093906001600160401b0381116102905761401e81613d798554610225565b6000601f82116001146140b85760049261404c836140b19460a094610327999a600092613f49575050612a81565b85555b61406961405f6020830183613ed5565b9060018801613f07565b6140916002860161407f613ddd604085016126e2565b61408b60608401613fbb565b90612b90565b6140ab6140a16080830183613ed5565b9060038801613f07565b01613fc5565b9101612b9f565b601f198216906140cd85600052602060002090565b91815b81811061411957508360a0936103279899600497946140b197600195106140ff575b505050811b01855561404f565b0135600019600384901b60f8161c191690553880806140f2565b9192602060018192868c0135815501940192016140d0565b60001981146126665760010190565b604051815480825290929183906141606020830191600052602060002090565b926000905b8060098301106142c4576103279454918181106142ae575b818110614294575b81811061427a575b818110614260575b818110614246575b81811061422c575b818110614212575b8181106141f8575b8181106141de575b106141cb575b5003836102cb565b60d81c62ffffff168152602001386141c3565b60c083901c62ffffff1684529260019060200193016141bd565b60a883901c62ffffff1684529260019060200193016141b5565b609083901c62ffffff1684529260019060200193016141ad565b607883901c62ffffff1684529260019060200193016141a5565b606083901c62ffffff16845292600190602001930161419d565b604883901c62ffffff168452926001906020019301614195565b603083901c62ffffff16845292600190602001930161418d565b601883901c62ffffff168452926001906020019301614185565b62ffffff8316845292600190602001930161417d565b91600a91935061014060019161437187546142e88362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b019401920185929391614165565b6000806040516020810190637b3338ad60e11b8252600b6024820152826044820152604481526143b06064826102cb565b51906a636f6e736f6c652e6c6f675afa50565b903590601e198136030182121561022057018035906001600160401b03821161022057602001918160051b3603831361022057565b90608092612fc3919695949683526000602084015260a0604084015260a0830190610e14565b35610f0b81611852565b9291909461445660208361443b866126e2565b60405163095ea7b360e01b81529384928392600484016126ec565b038160006001600160a01b038a165af1801561096a57614696575b5061447e60808401613fc5565b156144a35750610f0b9461449d60a0614496856126e2565b940161441e565b936157e3565b909290156145e9579181600094936144cc6144c56040614515999601846143c3565b36916118b1565b9384511580156145cd575b80156145a8575b61456f575b50506144f561336361336387936126e2565b92604051968795869485936318cbafe560e01b85523091600486016143f8565b03925af160009181614552575b506145405760405162461bcd60e51b81528061340460048201612fd7565b8061341961454e9251612845565b5190565b6145689192503d806000833e61343c81836102cb565b9038614522565b869294506133636144f59261459f6133639361459661458c612ee7565b9361347185612871565b6134718361287e565b959350506144e3565b5060018060a01b036145c661335e6145c08851612845565b8861289e565b16156144de565b506001600160a01b036145e261335e87612871565b16156144d7565b909291610f0b946146006144c560408701876143c3565b94855115801561467a575b8015614655575b614626575b614620906126e2565b92615620565b9450614620614633612ee7565b6146408561347183612871565b61464d836134718361287e565b959050614617565b5060018060a01b0361467361335e61466d8951612845565b8961289e565b1615614612565b506001600160a01b0361468f61335e88612871565b161561460b565b6146ae9060203d6020116109f8576109e981836102cb565b614471565b9493929195600554906146ca8260ff9060a01c1690565b8061497b575b1561491b5750506001600160a01b038681169490821685811461485d5750851061481d576147169061470d614703612ee7565b9761347189612871565b6134718761287e565b47936020604051809563095ea7b360e01b82528160008161473b8789600484016126ec565b03925af1801561096a57614773966000958692614800575b506040516318cbafe560e01b8152978895869485933091600486016143f8565b03926001600160a01b03165af191821561096a57614797926147e7575b5047612864565b806147a0575b50565b6147ae613363600754610392565b803b15610220576000906004604051809481936306f4a2cd60e41b83525af1801561096a571561479d578061095e6000610327936102cb565b6147fb903d806000833e61343c81836102cb565b614790565b6148189060203d6020116109f8576109e981836102cb565b614753565b505050614834925090602091611e5d600554610392565b03925af1801561096a576148455750565b61479d9060203d6020116109f8576109e981836102cb565b9596505066038d7ea4c68000861093506149099250505057803b1561022057604051632e1a7d4d60e01b815260048101839052906000908290602490829084905af1801561096a576148f4575b506148b9613363600754610392565b803b15610220576000906004604051809481936306f4a2cd60e41b83525af1801561096a576148e55750565b8061095e6000610327936102cb565b8061095e6000614903936102cb565b386148aa565b61483491602091611e5d600554610392565b935093505050929192600014614951575050600080808061032794614947613363613363600554610392565b5af16108bd61271c565b91602091611e5d61496194610392565b03926001600160a01b03165af1801561096a576148455750565b506007546001600160a01b03906149959061336390610392565b1615156146d0565b6000546001600160a01b031633036149b157565b63118cdaa760e01b6000523360045260246000fd5b906149d08261189a565b6149dd60405191826102cb565b82815280926149ee601f199161189a565b019060005b8281106149ff57505050565b602090614a0a612cfb565b828285010152016149f3565b604090610f0b939281528160208201520190610e14565b919091805483101561050f576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b90816020910312610220575190565b919060035490614aab614aa683612650565b6149c6565b93600093845b848110614ac2575050505050815290565b614aea614ae66002614ada849a95969799989a6104f0565b50015460a01c60ff1690565b1590565b614f8957614b086002614afc836104f0565b50015460a81c60ff1690565b15614cf957614b1e61336360036138c5846104f0565b6001600160a01b03169660005b6004614b36846104f0565b500154811015614ce757876000808888614ba1614b71614b62886004614b5b8d6104f0565b5001614a2d565b905462ffffff9160031b1c1690565b614b9360405193849289602085019763f7729d4360e01b895260248601614a4f565b03601f1981018352826102cb565b51908d5afa614bae61271c565b90614bbe575b5050600101614b2b565b9782614cc286614cdd948b614be08e6001999f60208091518301019101614a85565b614c94614c77614b62614bf2876104f0565b50986004614b5b614c068f6138c58c6104f0565b996138d3614c12612f09565b99614c69614c27614b628888614b5b886104f0565b9c6040519d8e9360208501606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b03601f1981018c528b6102cb565b94614c89614c8361188a565b986102ee565b885260208801612791565b8c60408701526060860152608085015260a0840152614cb660c0840160019052565b62ffffff1660e0830152565b614ccc828861289e565b52614cd7818761289e565b50614131565b9690508738614bb4565b50949593929196506001905b01614ab1565b614d0b60099795969493929754610392565b614d13612ee7565b614d208561347183612871565b614d2d866134718361287e565b614d4f614d386128b2565b92614d468761347186612871565b6134718461287e565b614d5c866134718461288e565b614d646128b2565b91614d728661347185612871565b614d89614d80600a54610392565b6134718561287e565b614d96876134718561288e565b614daa61336361336360016138c5886104f0565b9160405163d06ca61f60e01b815260008180614dca858b60048401614a16565b0381875afa60009181614f6e575b50614f4457505060405163d06ca61f60e01b815260008180614dfe858a60048401614a16565b0381865afa60009181614f29575b50614eff5750506000604051809263d06ca61f60e01b82528180614e34878a60048401614a16565b03915afa60009181614ee4575b50614e51575b5050600190614cf3565b9682614edc928199614e9c614e7e614e7860016138c5614e71829b6104f0565b50976104f0565b9261288e565b5191614e91614e8b61188a565b956102ee565b855260208501612791565b86604084015260608301526080820152614eb4612707565b60a0820152600060c0820152600060e0820152614ed1828b61289e565b52614cd7818a61289e565b959038614e47565b614ef891923d8091833e61343c81836102cb565b9038614e41565b614f23935084999250908491614e9c614e7e614e7860016138c5614e71829b6104f0565b95614cf3565b614f3d91923d8091833e61343c81836102cb565b9038614e0c565b614f239450859a9350859250614e9c614e7e614f6860016138c5614e71829b6104f0565b9261287e565b614f8291923d8091833e61343c81836102cb565b9038614dd8565b60019096949593929196614cf3565b91929060035492614fab614aa685612650565b9460009485905b808210614fc457505050505050815290565b614fdc614ae66002614ada859b9697989a999b6104f0565b61538a57614fee6002614afc846104f0565b1561510a579661500561336360036138c5856104f0565b6001600160a01b03169760005b600461501d856104f0565b5001548110156150f557886000808c8a8a615065615043614b62896004614b5b8f6104f0565b614b936040519384928a602085019763f7729d4360e01b895260248601614a4f565b51915afa61507161271c565b90615081575b5050600101615012565b98826150d6876150eb948c6150a26001989f60208082518301019101614a85565b6150b4614c77614b62614bf2876104f0565b8d60408701526060860152608085015260a0840152614cb660c0840160019052565b6150e0828961289e565b52614cd7818861289e565b9790508838615077565b5095969493929750906001905b019094614fb2565b9495939291969061511c600954610392565b615124612ee7565b6151318661347183612871565b61513e876134718361287e565b6151576151496128b2565b92614d468861347186612871565b615164876134718461288e565b61516c6128b2565b9161517a8761347185612871565b615188614d80600a54610392565b615195886134718561288e565b6151a961336361336360016138c5886104f0565b9160405163d06ca61f60e01b815286600082806151ca868d60048401614a16565b0381885afa6000928161536f575b5061533b57505060405163d06ca61f60e01b815290508560008280615201868c60048401614a16565b0381875afa60009281615320575b506152e4579150506000604051809363d06ca61f60e01b82528180615238888c60048401614a16565b03915afa600092816152c9575b50615256575b505050600190615102565b615261575b8361524b565b97826152c192819a615281614e7e614e7860016138c5614e71829b6104f0565b87604084015260608301526080820152615299612707565b60a0820152600060c0820152600060e08201526152b6828c61289e565b52614cd7818b61289e565b96903861525b565b6152dd91933d8091833e61343c81836102cb565b9138615245565b91935091506152f8575b5050600190615102565b978261531892819a615281614e7e614e7860016138c5614e71829b6104f0565b9690386152ee565b61533491933d8091833e61343c81836102cb565b913861520f565b92509250925061534f575050600190615102565b978261531892819a615281614e7e614f6860016138c5614e71829b6104f0565b61538391933d8091833e61343c81836102cb565b91386151d8565b94959392919690600190615102565b600080546001600160a01b039283166001600160a01b03198216811783559216906000805160206159758339815191529080a3565b90600154600160401b811015610290578060016153f092016001556001610533565b612c2c57825180519093906001600160401b0381116102905761541781613d798554610225565b6020601f821160011461549557600492615445836140b19460a094610327999a600092611cd7575050612a81565b85555b61545960208201516001870161398d565b61547d60028601615470613ddd6040850151610392565b606083015160ff1661408b565b61548e60808201516003870161398d565b0151151590565b601f198216956154aa85600052602060002090565b9660005b8181106154f6575083610327979860a094600497946140b197600195106154dd575b505050811b018555615448565b015160001960f88460031b161c191690553880806154d0565b838301518955600190980197602093840193016154ae565b6155269060206040519282848094519384920161039e565b810103902090565b1561553557565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b1561557757565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b156155cf57565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b6156a99561568860009695949361565f889461564060028651101561552e565b61564c61335e86612871565b6001600160a01b03908116911614615570565b61567561335e61566f8551612845565b8561289e565b6001600160a01b039081169116146155c8565b6040516338ed173960e01b8152968795869485933091869060048701612f9e565b03926001600160a01b03165af1600091816156fa575b506145405760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b6157109192503d806000833e61343c81836102cb565b90386156bf565b926157586000969793959492615742889461573660028851101561552e565b61564c61335e88612871565b61567561335e6157528751612845565b8761289e565b6156a9604051978896879586946338ed173960e01b8652309260048701612f9e565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b909160009561581c60209661581061585b979661580861580161188a565b9788612791565b898701612791565b62ffffff166040850152565b6158293060608501612791565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b83526004830161577a565b03926001600160a01b03165af1600091816158ac575b50610f0b5760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b6158cf91925060203d6020116158d6575b6158c781836102cb565b810190614a85565b9038615871565b503d6158bd565b9160009661591660209761590a61585b9897956159026158fb61188a565b9889612791565b8a8801612791565b62ffffff166040860152565b6159233060608601612791565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b83526004830161577a56fe6d97a31531bdb3c43d920bc996ec8b9fd7733f5f55a81cd74700f88631fc60328be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3b37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da2646970667358221220891ef0ecdaf5ec50750e980cfc8c93a9bc2bf6996b99282bf48e0b75a858703264736f6c634300081c0033
Deployed Bytecode
0x60806040526004361015610010575b005b60003560e01c806309a477c7146102105780630ae9c2771461020b578063124e694c14610206578063240028e8146102015780632a5c792a146101fc5780634c984d38146101f75780634d24df9d146101f25780634f64b2be146101ed5780635fa7b584146101e8578063715018a6146101e35780637765fd0d146101de57806381ee0715146101d957806386f75f62146101d4578063880cdc31146101cf5780638a142ea4146101ca5780638cf106e1146101c55780638da5cb5b146101c057806399a5d747146101bb5780639b396b65146101b65780639dd373b9146101b15780639ed12c31146101ac578063b1db3096146101a7578063b5d52d1a146101a2578063ba1471321461019d578063c74b92ca14610198578063cea9d26f14610193578063d2f0ee8b1461018e578063ee99205c14610189578063f05c5fed14610184578063f2fde38b1461017f578063fccdfe4f1461017a5763fda493c90361000e576122c8565b612050565b612033565b611fce565b611fa5565b611eac565b611e40565b611db3565b611d8d565b611d64565b611bfb565b611b1d565b611a93565b611a52565b611a24565b6119fb565b6119b9565b611922565b6117f7565b611761565b611707565b6115fc565b611517565b611422565b6113a8565b610f8d565b610d67565b610c74565b610b76565b610656565b610598565b6103e6565b600091031261022057565b600080fd5b90600182811c92168015610255575b602083101461023f57565b634e487b7160e01b600052602260045260246000fd5b91607f1691610234565b634e487b7160e01b600052604160045260246000fd5b60c081019081106001600160401b0382111761029057604052565b61025f565b606081019081106001600160401b0382111761029057604052565b60e081019081106001600160401b0382111761029057604052565b601f909101601f19168101906001600160401b0382119082101761029057604052565b906040519182600082549261030284610225565b80845293600181169081156103705750600114610329575b50610327925003836102cb565b565b90506000929192526020600020906000915b818310610354575050906020610327928201013861031a565b602091935080600191548385890101520191019091849261033b565b90506020925061032794915060ff191682840152151560051b8201013861031a565b6001600160a01b031690565b60005b8381106103b15750506000910152565b81810151838201526020016103a1565b906020916103da8151809281855285808601910161039e565b601f01601f1916010190565b3461022057600036600319011261022057604051600060085461040881610225565b80845290600181169081156104b65750600114610469575b61045a83610430818503826102cb565b60018060a01b036009541660018060a01b03600a54166040519384936060855260608501906103c1565b91602084015260408301520390f35b60086000908152600080516020615995833981519152939250905b80821061049c57509091508101602001610430610420565b919260018160209254838588010152019101909291610484565b60ff191660208086019190915291151560051b840190910191506104309050610420565b634e487b7160e01b600052603260045260246000fd5b60035481101561050f5760036000526005602060002091020190600090565b6104da565b60015481101561050f5760016000526005602060002091020190600090565b805482101561050f576000526005602060002091020190600090565b949196959261056960a0959260c0885260c08801906103c1565b6000196001871b0198891660208801529088166040870152901515606086015290151560808501529416910152565b3461022057602036600319011261022057600435600354811015610220576105bf906104f0565b506105c9816102ee565b60018201546002830154600390930154604051938493610611936001600160a01b039384169360a884901c60ff9081169460a081901c9091169390821692909116908761054f565b0390f35b6001600160a01b0381160361022057565b9181601f84011215610220578235916001600160401b038311610220576020808501948460051b01011161022057565b6101003660031901126102205761066e600435610615565b610679602435610615565b6044356064356084356001600160401b0381116102205761069e903690600401610626565b9190926106ac60a435610615565b60c4359160e435946000956106c28615156123e3565b6106d860a4356001600160a01b03161515612424565b6009546001600160a01b0316946106f0861515612464565b6004356001600160a01b03161580610b2f575b61070d90156124a9565b6004356001600160a01b0316610b265785965b6024356001600160a01b0316610b1d5786945b6004356001600160a01b0316801590610b04575b610750906124f4565b6024356001600160a01b0316801590610ae4575b61076d9061253a565b6004356001600160a01b0316610ade5734965b61078b881515612581565b6004356001600160a01b0316610a7a57506001600160a01b0388163b15610a7657604051630d0e30db60e41b81528a81600481346001600160a01b038e165af1801561096a57610a62575b505b89986107e261437f565b8a905b8b8483106109ff5750505091610838939161080761082d9796948b1015612699565b85896108326108158d6135d7565b9a6024356001600160a01b0316159891959091612613565b6126e2565b926146b3565b6024356001600160a01b031661097357506001600160a01b0383163b1561096f57604051632e1a7d4d60e01b8152600481018290529285908490602490829084906001600160a01b03165af1801561096a57610611956000805160206159b58339815191529461092a92610950575b506108c3818080808760a4355af16108bd61271c565b5061274c565b6004356001600160a01b031661094757805b6024356001600160a01b031661093d57925b604080516001600160a01b039384168152948316602086015284019490945260608301939093526000608083015260a43590921660a082015290819060c0820190565b0390a16040519081529081906020820190565b50602435926108e7565b600435906108d5565b8061095e83610964936102cb565b80610215565b386108a7565b6125f2565b8480fd5b60405163a9059cbb60e01b81529350602090849081888161099a8760a435600484016126ec565b03926001600160a01b03165af1801561096a57610611956000805160206159b58339815191529461092a926109d0575b506108c3565b6109f19060203d6020116109f8575b6109e981836102cb565b8101906125bb565b50386109ca565b503d6109df565b829b610a5489888c878f610a3a610a32610a4d92610a5a9a8f610a2860019e9f6020928c612623565b019050359061266b565b612710900490565b918c8a8060a01b03602435161596612623565b9189614428565b9061268c565b9a01906107e5565b8061095e8c610a70936102cb565b386107d6565b8980fd5b6020610a9e918c60405180809581946323b872dd60e01b83523033600485016125d0565b03916004356001600160a01b03165af1801561096a57610abf575b506107d8565b610ad79060203d6020116109f8576109e981836102cb565b5038610ab9565b86610780565b5061076d610afd610af6602435610b42565b5460ff1690565b9050610764565b50610750610b16610af6600435610b42565b9050610747565b60243594610733565b60043596610720565b506024356001600160a01b031615610703565b6001600160a01b0316600090815260026020526040902090565b6001600160a01b0316600090815260046020526040902090565b3461022057602036600319011261022057600435610b9381610615565b60018060a01b03166000526002602052602060ff604060002054166040519015158152f35b602081016020825282518091526040820191602060408360051b8301019401926000915b838310610beb57505050505090565b9091929394602080600192603f1985820301865288519060a080610c5d610c2e610c1e865160c0875260c08701906103c1565b87870151868203898801526103c1565b8880841b03604087015116604086015260ff6060870151166060860152608086015185820360808701526103c1565b930151151591015297019301930191939290610bdc565b3461022057600036600319011261022057600154610c918161189a565b90610c9f60405192836102cb565b808252600160009081527fb10e2d527612073b26eecdfd717e6a320cf44b4afac2b0732d9fcbe2b7fa0cf6602084015b838310610ce457604051806106118782610bb8565b60056020600192604051610cf781610275565b610d00866102ee565b8152610d0d8587016102ee565b81840152600286015460a086811b879003821660408401521c60ff166060820152610d3a600387016102ee565b6080820152610d59610d50600488015460ff1690565b151560a0830152565b815201920192019190610ccf565b3461022057602036600319011261022057600435610d8481610615565b610d8c61499d565b6001600160a01b03168015610db157600580546001600160a01b031916919091179055005b60405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b6044820152606490fd5b606090600319011261022057600435610e0081610615565b90602435610e0d81610615565b9060443590565b906020808351928381520192019060005b818110610e325750505090565b82516001600160a01b0316845260209384019390920191600101610e25565b9080602083519182815201916020808360051b8301019401926000915b838310610e7d57505050505090565b9091929394602080610e9b600193601f1986820301875289516103c1565b97019301930191939290610e6e565b919060208352608083019080519160606020860152825180915260a0850190602060a08260051b8801019401916000905b828210610f0e5750505050926040846020610f0b95960151828401520151906060601f1982850301910152610e51565b90565b90919294602080600192609f198b8203018552885190848060a01b038251168152828201518382015260a062ffffff81610f6c610f5a604087015160c0604088015260c0870190610e14565b606087015186820360608801526103c1565b94608081015115156080860152015116910152970192019201909291610edb565b3461022057610fb1610f9e36610de8565b9291908391610fab6127e1565b50614a94565b610fbd81511515612801565b60005b610fca8251612845565b81101561106057610fda8161267e565b825181101561105757806060610ff26001938661289e565b5101516060611001858761289e565b51015110611010575b01610fda565b61101a838561289e565b51611025828661289e565b51611030858761289e565b5261103b848661289e565b50611046828661289e565b52611051818561289e565b5061100a565b50600101610fc0565b5060009061106c6127e1565b906000905b8051821015611340576110838261267e565b8151811015611335576110946128b2565b926109c46110a185612871565b526113886110ae8561287e565b52611d4c6110bb8561288e565b5260005b845181101561132a576110e86110e2610a326110db848961289e565b518b61266b565b89612864565b50611140611112610a3260606110fe868961289e565b51015161110b858a61289e565b519061266b565b610a54610a326060611124888a61289e565b51015161113a611134878c61289e565b51612854565b9061266b565b878111611151575b506001016110bf565b96508661115c6128d4565b875261116661294f565b60408801908152611177848761289e565b516020015161118590610392565b61118f848961289e565b5161119a868961289e565b51608001516111a9878a61289e565b5160a001516111b8888b61289e565b5160c001511515916111ca898c61289e565b5160e0015162ffffff16936111dd61186c565b956111e89087612791565b6020860152604085015260608401521515608083015262ffffff1660a082015288519061121482612871565b5261121e90612871565b50611229858761289e565b516020016112369061298a565b611240848961289e565b5161124a90612854565b611254878961289e565b5160800151611263888a61289e565b5160a00151611272898b61289e565b5160c001511515916112848a8c61289e565b5160e0015162ffffff169361129761186c565b956112a29087612791565b6020860152604085015260608401521515608083015262ffffff1660a08201528851906112ce8261287e565b526112d89061287e565b506112e3848761289e565b51518151906112f182612871565b526112fb90612871565b50611306858761289e565b51519051906113148261287e565b5261131e9061287e565b50602087015238611148565b509250600101611083565b509060010190611071565b604051806106118582610eaa565b949060a0946113806113a0959461137260ff949b9a9b60c08b5260c08b01906103c1565b9089820360208b01526103c1565b93600180881b0316604088015216606086015284820360808601526103c1565b931515910152565b3461022057602036600319011261022057600435600154811015610220576113cf90610514565b506113d9816102ee565b906106116113e9600183016102ee565b9160028101549060ff6004611400600384016102ee565b920154169160405195869560ff8360a01c169260018060a01b0316918761134e565b346102205760203660031901126102205760043561143f81610615565b61144761499d565b6001600160a01b03811660008181526002602052604090205490919061146f9060ff16612997565b60005b6001548082101561000e578361148783610514565b50600201546001600160a01b039061149e90610392565b16146114ad5750600101611472565b916114d96114e6926114d36114cc6114c76114f097612845565b610514565b5091610514565b90612bb0565b6114e1612ca7565b610b42565b805460ff19169055565b7f4c910b69fe65a61f7531b9c5042b2329ca7179c77290aa7e2eb3afa3c8511fd3600080a2005b346102205760003660031901126102205761153061499d565b600080546001600160a01b0319811682556001600160a01b03166000805160206159758339815191528280a3005b8015150361022057565b610f0b906020815261010060e06115e46115ce61159187518560208801526101208701906103c1565b60208801516001600160a01b0316604087015260408801516060870152606088015160808701526080880151601f198783030160a0880152610e14565b60a0870151858203601f190160c08701526103c1565b60c086015115158483015294015162ffffff16910152565b346102205760803660031901126102205760043561161981610615565b6116496024359161162983610615565b60443560643593849261163b8461155e565b611643612cfb565b50614f98565b9061165682511515612801565b60009080156116ff57815b90825b84518110156116e55781156116ad57826060611680838861289e565b51015111611693575b6001905b01611664565b9250905060606116a3838561289e565b5101519082611689565b8260406116ba838861289e565b510151106116cb575b60019061168d565b9250905060406116db838561289e565b51015190826116c3565b6106116116f2858761289e565b5160405191829182611568565b600019611661565b3461022057600036600319011261022057602060405166038d7ea4c680008152f35b9181601f84011215610220578235916001600160401b038311610220576020838186019501011161022057565b60ff81160361022057565b346102205760a0366003190112610220576004356001600160401b03811161022057611791903690600401611729565b6024356001600160401b038111610220576117b0903690600401611729565b6044939193356117bf81610615565b606435916117cc83611756565b608435956001600160401b038711610220576117ef61000e973690600401611729565b969095612d4c565b346102205760203660031901126102205760043561181481610615565b61181c61499d565b61182461499d565b6001600160a01b0381161561183c5761000e90615399565b631e4fbdf760e01b600052600060045260246000fd5b62ffffff81160361022057565b60e4359061032782611852565b6040519061032760c0836102cb565b6040519061032760e0836102cb565b60405190610327610100836102cb565b6001600160401b0381116102905760051b60200190565b9291906118bd8161189a565b936118cb60405195866102cb565b602085838152019160051b810192831161022057905b8282106118ed57505050565b6020809183356118fc81610615565b8152019101906118e1565b9080601f8301121561022057816020610f0b933591016118b1565b6101403660031901126102205760043561193b81610615565b6024359061194882610615565b6044359060643560843561195b81610615565b60a43561196781610615565b60c4359061197361185f565b926101043561012435979095906001600160401b03891161022057610611996119a36119a99a3690600401611907565b98613007565b6040519081529081906020820190565b34610220576020366003190112610220576004356119d681610615565b60018060a01b03166000526004602052602060ff604060002054166040519015158152f35b34610220576000366003190112610220576000546040516001600160a01b039091168152602090f35b3461022057602036600319011261022057611a406004356135d7565b60408051928352602083019190915290f35b34610220576020366003190112610220576004356001600160401b03811161022057611a8561000e913690600401611729565b90611a8e61499d565b613854565b3461022057602036600319011261022057600435611ab081610615565b611ab861499d565b6001600160a01b03168015611add57600780546001600160a01b031916919091179055005b60405162461bcd60e51b8152602060048201526018602482015277125b9d985b1a59081cdd185ada5b99c818dbdb9d1c9858dd60421b6044820152606490fd5b3461022057602036600319011261022057611b4f600435611b3d8161155e565b611b4561499d565b1515600554612b79565b600555005b6001600160401b03811161029057601f01601f191660200190565b929192611b7b82611b54565b91611b8960405193846102cb565b829481845281830111610220578281602093846000960137010152565b606060031982011261022057600435906001600160401b038211610220578060238301121561022057816024611be193600401359101611b6f565b90602435611bee81610615565b90604435610f0b81610615565b3461022057611c0936611ba6565b9190611c1361499d565b6001600160a01b031690611c28821515613953565b60408051611c3581610295565b828152602081019384526001600160a01b0390941693019283528051906001600160401b03821161029057611c7482611c6f600854610225565b612a02565b602090601f8311600114611ce257611cb593611ca68461000e9795611caa95611cb095600092611cd7575b5050612a81565b6008555b51610392565b6127a0565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b015190503880611c9f565b6008600052601f19831691906000805160206159958339815191529260005b818110611d4c575084611caa94611cb094611cb5989461000e9a9860019510611d33575b505050811b01600855611caa565b015160001960f88460031b161c19169055388080611d25565b92936020600181928786015181550195019301611d01565b34610220576000366003190112610220576005546040516001600160a01b039091168152602090f35b3461022057600036600319011261022057602060ff60055460a01c166040519015158152f35b346102205760c0366003190112610220576004356001600160401b03811161022057611de3903690600401611729565b60243591611df083610615565b604435611dfc81610615565b606435611e088161155e565b60843591611e1583610615565b60a435956001600160401b03871161022057611e3861000e973690600401610626565b969095613a39565b3461022057611e7b6020611e5336610de8565b9190611e5d61499d565b600060405180968195829463a9059cbb60e01b8452600484016126ec565b03926001600160a01b03165af1801561096a57611e9457005b61000e9060203d6020116109f8576109e981836102cb565b3461022057611eba36611ba6565b9091611ec461499d565b611ed86001600160a01b0384161515613953565b8051906001600160401b03821161029057611ef882611c6f600854610225565b602090601f8311600114611f2a5782611cb59361000e9693611f2293600092611cd7575050612a81565b6008556127a0565b6008600052601f19831691906000805160206159958339815191529260005b818110611f8d5750926001928592611cb59661000e999610611f74575b505050811b016008556127a0565b015160001960f88460031b161c19169055388080611f66565b92936020600181928786015181550195019301611f49565b34610220576000366003190112610220576007546040516001600160a01b039091168152602090f35b3461022057602036600319011261022057600435611fea61499d565b60648111611ff757600655005b60405162461bcd60e51b81526020600482015260146024820152734665652063616e6e6f742065786365656420312560601b6044820152606490fd5b346102205760203660031901126102205760043561181c81610615565b34610220576020366003190112610220576004356001600160401b03811161022057612080903690600401610626565b9061208961499d565b612094821515613e94565b6000916000915b8183106120d15783806120aa57005b7f0e18d302d46528f9fe1ca287fbdc60b7b9d0a6d9ed00fc3f6303e98683a0bac6600080a2005b9091926120f0610af66114e160406120ea888888612623565b016126e2565b801561219b575b6121925761213c60019161211461210f878787612623565b613fcf565b61213761212a6114e160406120ea8a8a8a612623565b805460ff19166001179055565b614131565b9361216d61215461214e838787612623565b80613ed5565b61216760406120ea868a8a979697612623565b9261383f565b90838060a01b031690600080516020615955833981519152600080a35b01919061209b565b9260019061218a565b506001600160a01b036121b460406120ea878787612623565b16156120f7565b906020808351928381520192019060005b8181106121d95750505090565b825162ffffff168452602093840193909201916001016121cc565b602081016020825282518091526040820191602060408360051b8301019401926000915b83831061222757505050505090565b90919293946020806122b9600193603f1986820301875289519060c0612256835160e0845260e08401906103c1565b92878060a01b03868201511686840152878060a01b0360408201511660408401526060810151151560608401526122966080820151608085019015159052565b60a0818101516001600160a01b03169084015201519060c08184039101526121bb565b97019301930191939290612218565b34610220576000366003190112610220576003546122e58161189a565b906122f360405192836102cb565b808252600360009081527fc2575a0e9e593c00f959f8c92f12db2869c3395a3b0502d05e2516446f71f85b602084015b838310612338576040518061061187826121f4565b6005602060019260405161234b816102b0565b612354866102ee565b8152848060a01b038587015416838201526123ab6123a2600288015461238561237c82610392565b60408601612791565b61239960a082901c60ff1615156060860152565b60a81c60ff1690565b15156080830152565b6123c46123bb6003880154610392565b60a08301612791565b6123d060048701614140565b60c0820152815201920192019190612323565b156123ea57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81c9bdd5d195cc81c1c9bdd9a59195960721b6044820152606490fd5b1561242b57565b60405162461bcd60e51b8152602060048201526011602482015270125b9d985b1a59081c9958da5c1a595b9d607a1b6044820152606490fd5b1561246b57565b60405162461bcd60e51b815260206004820152601660248201527515dc985c1c1959081b985d1a5d99481b9bdd081cd95d60521b6044820152606490fd5b156124b057565b60405162461bcd60e51b815260206004820152601c60248201527b43616e6e6f742073776170206e617469766520746f206e617469766560201b6044820152606490fd5b156124fb57565b60405162461bcd60e51b81526020600482015260176024820152762ab739bab83837b93a32b21034b7383aba103a37b5b2b760491b6044820152606490fd5b1561254157565b60405162461bcd60e51b81526020600482015260186024820152772ab739bab83837b93a32b21037baba383aba103a37b5b2b760411b6044820152606490fd5b1561258857565b60405162461bcd60e51b815260206004820152600b60248201526a16995c9bc8185b5bdd5b9d60aa1b6044820152606490fd5b908160209103126102205751610f0b8161155e565b6001600160a01b03918216815291166020820152604081019190915260600190565b6040513d6000823e3d90fd5b90359060be1981360301821215610220570190565b901561050f5780610f0b916125fe565b9082101561050f57610f0b9160051b8101906125fe565b634e487b7160e01b600052601160045260246000fd5b9060038202918083046003149015171561266657565b61263a565b8181029291811591840414171561266657565b906001820180921161266657565b9190820180921161266657565b156126a057565b60405162461bcd60e51b815260206004820152601a602482015279125b9cdd59999a58da595b9d081bdd5d1c1d5d08185b5bdd5b9d60321b6044820152606490fd5b35610f0b81610615565b6001600160a01b039091168152602081019190915260400190565b604051906127166020836102cb565b60008252565b3d15612747573d9061272d82611b54565b9161273b60405193846102cb565b82523d6000602084013e565b606090565b1561275357565b60405162461bcd60e51b815260206004820152601660248201527513985d1a5d99481d1c985b9cd9995c8819985a5b195960521b6044820152606490fd5b6001600160a01b039091169052565b600980546001600160a01b0319166001600160a01b0392909216919091179055565b80546001600160a01b0319166001600160a01b03909216919091179055565b604051906127ee82610295565b6060604083828152600060208201520152565b1561280857565b60405162461bcd60e51b8152602060048201526015602482015274139bc81d985b1a59081c5d5bdd195cc8199bdd5b99605a1b6044820152606490fd5b60001981019190821161266657565b6127100390612710821161266657565b9190820391821161266657565b80511561050f5760200190565b80516001101561050f5760400190565b80516002101561050f5760600190565b805182101561050f5760209160051b010190565b604051608091906128c383826102cb565b6003815291601f1901366020840137565b6128de600261189a565b906128ec60405192836102cb565b6002825281601f196128fe600261189a565b019060005b82811061290f57505050565b60209060405161291e81610275565b600081526000838201526060604082015260608082015260006080820152600060a082015282828501015201612903565b6040516060919061296083826102cb565b6002815291601f19018260005b82811061297957505050565b80606060208093850101520161296d565b516001600160a01b031690565b1561299e57565b60405162461bcd60e51b815260206004820152600f60248201526e151bdad95b881b9bdd08199bdd5b99608a1b6044820152606490fd5b634e487b7160e01b600052600060045260246000fd5b8181106129f6575050565b600081556001016129eb565b90601f8211612a0f575050565b6103279160086000526020600020906020601f840160051c83019310612a3d575b601f0160051c01906129eb565b9091508190612a30565b9190601f8111612a5657505050565b610327926000526020600020906020601f840160051c83019310612a3d57601f0160051c01906129eb565b8160011b916000199060031b1c19161790565b919091828114612b7457612aa88354610225565b6001600160401b03811161029057612aca81612ac48454610225565b84612a47565b600093601f8211600114612afd57612aee9293948291600092612af2575050612a81565b9055565b015490503880611c9f565b612b11601f19831691600052602060002090565b94612b2184600052602060002090565b91815b818110612b5c57509583600195969710612b43575b505050811b019055565b015460001960f88460031b161c19169055388080612b39565b9192600180602092868b015481550194019201612b24565b509050565b60ff60a01b191660a09190911b60ff60a01b161790565b9060ff612aee91168254612b79565b9060ff801983541691151516179055565b90612c2c57818103612bc0575050565b600460ff8184612bd36103279686612a94565b612be36001820160018701612a94565b60028501612c10848060028501612c0360018060a01b03825416866127c2565b5460a01c16168254612b79565b9055612c226003820160038701612a94565b0154169101612b9f565b6129d5565b634e487b7160e01b600052603160045260246000fd5b612c518154610225565b9081612c5b575050565b81601f60009311600114612c6d575055565b81835260208320612c8991601f0160051c8101906001016129eb565b808252602082209081548360011b9084198560031b1c191617905555565b6001548015612cf65760001901612cbf816001610533565b612c2c57600481612cd1600093612c47565b612cdd60018201612c47565b826002820155612cef60038201612c47565b0155600155565b612c31565b6040519061010082016001600160401b0381118382101761029057604052600060e0836060815282602082015282604082015282606082015260606080820152606060a08201528260c08201520152565b60ff92612da9969297959894612d7b612d8493612d6761499d565b6040519a612d748c610275565b3691611b6f565b89523691611b6f565b60208701526001600160a01b0390961660408601908152951660608501523691611b6f565b6080820152600160a082015281516001600160a01b031660009081526002602052604090205460ff16612e2557612dfe81612de6612e04936153ce565b612df661212a6114e18651610392565b519251610392565b9161550e565b6001600160a01b0390911690600080516020615955833981519152600080a3565b60405162461bcd60e51b8152602060048201526014602482015273546f6b656e20616c72656164792065786973747360601b6044820152606490fd5b15612e6857565b60405162461bcd60e51b815260206004820152600c60248201526b092dcecc2d8d2c840e0c2e8d60a31b6044820152606490fd5b15612ea357565b606460405162461bcd60e51b815260206004820152602060248201527f616d6f756e74206d7573742062652067726561746572207468616e207a65726f6044820152fd5b60405160609190612ef883826102cb565b6002815291601f1901366020840137565b60405190612f186020836102cb565b6000808352366020840137565b602081830312610220578051906001600160401b03821161022057019080601f83011215610220578151612f588161189a565b92612f6660405194856102cb565b81845260208085019260051b82010192831161022057602001905b828210612f8e5750505090565b8151815260209182019101612f81565b9192608093612fc392979695978452602084015260a0604084015260a0830190610e14565b6001600160a01b0390951660608201520152565b606090602081526015602082015274158c881cddd85c081d1bc81155120819985a5b1959605a1b60408201520190565b9598949794969095939493926130276001600160a01b038a161515612424565b6001600160a01b03841615928315919084836135c6575b613586575b6009546001600160a01b03169361305b851515612464565b8580613575575b61306c90156124a9565b851561356e5784915b6001600160a01b038b166135675785945b8790613550575b613096906124f4565b6001600160a01b038b16801590613539575b6130b19061253a565b86156135335750349a5b6130c68c1515612e9c565b86156134d1576001600160a01b0386163b1561022057604051630d0e30db60e41b8152600081600481346001600160a01b038c165af1801561096a576134bc575b505b61312b60208d8c604051938492839263095ea7b360e01b8452600484016126ec565b038160006001600160a01b0389165af1801561096a578f948c938f93899361349f575b5061315b610af686610b5c565b1561334c5750916131989691613173969594936158dd565b9a5b61317e8c6135d7565b976001600160a01b038b16159290918a90869088906146b3565b6001600160a01b0387166132d057506131b3610af686610b5c565b61324c575b509161323a939187936131e46000808080876000805160206159b58339815191529e5af16108bd61271c565b1561324657506000945b6001600160a01b03811661324057506000955b604080516001600160a01b039788168152978716602089015287015260608601528316608085015290911660a0830152819060c0820190565b0390a190565b95613201565b946131ee565b969093909290916001600160a01b0388163b1561022057604051632e1a7d4d60e01b815260048101839052976000908990602490829084906001600160a01b03165af194851561096a576000805160206159b58339815191529861323a966132bb575b509193975091936131b8565b8061095e60006132ca936102cb565b386132af565b979391949290506020604051809963a9059cbb60e01b8252816000816132fa888b600484016126ec565b03926001600160a01b03165af194851561096a576000805160206159b58339815191529861323a9661332d575b506131e4565b6133459060203d6020116109f8576109e981836102cb565b5038613327565b95945061336861336361335e88612871565b61298a565b610392565b158015613489575b61345a575b89156133935791613198969161338d96959493615717565b9a613175565b91949392916001600160a01b038e1661344b5750506040516318cbafe560e01b815294600094869485946133ce945092309260048701612f9e565b0381836001600160a01b038c165af160009181613426575b506134085760405162461bcd60e51b81528061340460048201612fd7565b0390fd5b61341f816134196131989351612845565b9061289e565b519a613175565b6134449192503d806000833e61343c81836102cb565b810190612f25565b90386133e6565b94613198969161338d96615717565b9450613464612ee7565b6134768661347183612871565b612791565b613483826134718361287e565b94613375565b5061349961336361335e8861287e565b15613370565b6134b79060203d6020116109f8576109e981836102cb565b61314e565b8061095e60006134cb936102cb565b38613107565b6134f360208d604051809381926323b872dd60e01b83523033600485016125d0565b038160006001600160a01b0389165af1801561096a57613514575b50613109565b61352c9060203d6020116109f8576109e981836102cb565b503861350e565b9a6130bb565b506130b1613549610af68d610b42565b90506130a8565b50613096613560610af68a610b42565b905061308d565b8a94613086565b8691613075565b506001600160a01b038a1615613062565b61359561336361335e8c612871565b15806135ab575b6135a69015612e61565b613043565b506135a66135be61336361335e8d61287e565b15905061359c565b506001600160a01b0389161561303e565b906127106135e76006548461266b565b04808303928311612666579190565b90612aee9015158254612b79565b90600160401b811161029057815481835580821061362157505050565b61032792600052600a6009602060002092600383808488010486019606028061364f575b50010401906129eb565b6000198601908154906000199060200360031b1c16905538613645565b9080821461370e578054906001600160401b038211610290576136a16136ad916136968486613604565b600052602060002090565b92600052602060002090565b91600a82049181549160005b8481106136f1575050600a83028082036136d5575b5050505050565b60039060001992030260031b1b191691015538808080806136ce565b600191820180546001600160f01b039095168783015591016136b9565b5050565b90612c2c57818103613722575050565b600480836137336103279585612a94565b61374c60018060a01b03600183015416600186016127c2565b6137ab6002850161378d6002840161376d60018060a01b03825416846127c2565b61378160ff825460a01c1615158454612b79565b83555460a81c60ff1690565b90805460ff60a81b191691151560a81b60ff60a81b16919091179055565b6137c46137bb6003830154610392565b600386016127c2565b01910161366c565b6003548015612cf657600019016137e4816003610533565b612c2c57806137f4600492612c47565b600060018201556000600282015560006003820155018054600082558061381d575b5050600355565b61383891600052600a600960206000209201048101906129eb565b3880613816565b81604051928392833781016000815203902090565b90613860368284611b6f565b602081519101209160005b6003548082101561391e5784613889613883846104f0565b506102ee565b602081519101201461389e575060010161386b565b6138f794506114e6906138e5836138df6138d86138d36138cd60016138c56138f29a6104f0565b500154610392565b95612845565b6104f0565b50916104f0565b90613712565b6138ed6137cc565b610b5c565b61383f565b7f1bb636980af07b7a1d7c053eb0be1fe7712e8bf304f9b36de7aa8b2fdda05699600080a2565b60405162461bcd60e51b815260206004820152600d60248201526c111156081b9bdd08199bdd5b99609a1b6044820152606490fd5b1561395a57565b60405162461bcd60e51b815260206004820152600b60248201526a626164206164647265737360a81b6044820152606490fd5b81519192916001600160401b038111610290576139ae81612ac48454610225565b6020601f82116001146139d1578190612aee939495600092611cd7575050612a81565b601f198216906139e684600052602060002090565b9160005b818110613a2157509583600195969710613a0857505050811b019055565b015160001960f88460031b161c19169055388080612b39565b9192602060018192868b0151815501940192016139ea565b93919590949295613a4861499d565b6001600160a01b038116978815613b1e5786613ac4613ace946138ed93613abd6138f299613aa5613ad39e613a8d8e8d613afa575b613a8561187b565b993691611b6f565b8852613a9c8a60208a01612791565b60408801612791565b60016060870152891515608087015260a08601612791565b3691613be6565b60c0820152613d30565b612b9f565b7f2175f84b6c6dcc917bbec41b7f62cf11694eacf7a87f2fd2eda7e36d4c2c58b2600080a3565b613b0e6001600160a01b0386161515613b5c565b613b19871515613ba1565b613a7d565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c696420726f75746572206164647265737360501b6044820152606490fd5b15613b6357565b60405162461bcd60e51b8152602060048201526016602482015275496e76616c69642071756f746572206164647265737360501b6044820152606490fd5b15613ba857565b60405162461bcd60e51b81526020600482015260166024820152754d7573742070726f766964652066656520746965727360501b6044820152606490fd5b929190613bf28161189a565b93613c0060405195866102cb565b602085838152019160051b810192831161022057905b828210613c2257505050565b602080918335613c3181611852565b815201910190613c16565b9062ffffff809160031b9316831b921b19161790565b815190916001600160401b038211610290576020613c8191613c748486613604565b0192600052602060002090565b600a82049160005b838110613cec5750600a8302900380613ca3575b50505050565b9260009360005b818110613cbf57505050015538808080613c9d565b9091946020613ce2600192613cd7895162ffffff1690565b908560030290613c3c565b9601929101613caa565b6000805b600a8110613d05575083820155600101613c89565b95906020613d27600192613d1c855162ffffff1690565b908a60030290613c3c565b92019601613cf0565b90600354600160401b81101561029057806001613d5292016003556003610533565b612c2c57825180519093906001600160401b03811161029057613d7f81613d798554610225565b85612a47565b6020601f8211600114613e1e5791613daa8260c0936004956103279899600092611cd7575050612a81565b84555b613dc6613dbd6020830151610392565b600186016127c2565b613e0560028501613de3613ddd6040850151610392565b826127c2565b613df9613df36060850151151590565b826135f6565b6080830151151561378d565b613e156137bb60a0830151610392565b01519101613c52565b601f19821695613e3385600052602060002090565b9660005b818110613e7c5750926103279697600495936001938360c09710613e63575b505050811b018455613dad565b015160001960f88460031b161c19169055388080613e56565b83830151895560019098019760209384019301613e37565b15613e9b57565b60405162461bcd60e51b8152602060048201526012602482015271139bc81d1bdad95b9cc81c1c9bdd9a59195960721b6044820152606490fd5b903590601e198136030182121561022057018035906001600160401b0382116102205760200191813603831361022057565b9092916001600160401b03811161029057613f2681612ac48454610225565b6000601f8211600114613f54578190612aee939495600092613f49575050612a81565b013590503880611c9f565b601f19821694613f6984600052602060002090565b91805b878110613fa3575083600195969710613f8957505050811b019055565b0135600019600384901b60f8161c19169055388080612b39565b90926020600181928686013581550194019101613f6c565b35610f0b81611756565b35610f0b8161155e565b90600154600160401b81101561029057806001613ff192016001556001610533565b612c2c57613fff8380613ed5565b9093906001600160401b0381116102905761401e81613d798554610225565b6000601f82116001146140b85760049261404c836140b19460a094610327999a600092613f49575050612a81565b85555b61406961405f6020830183613ed5565b9060018801613f07565b6140916002860161407f613ddd604085016126e2565b61408b60608401613fbb565b90612b90565b6140ab6140a16080830183613ed5565b9060038801613f07565b01613fc5565b9101612b9f565b601f198216906140cd85600052602060002090565b91815b81811061411957508360a0936103279899600497946140b197600195106140ff575b505050811b01855561404f565b0135600019600384901b60f8161c191690553880806140f2565b9192602060018192868c0135815501940192016140d0565b60001981146126665760010190565b604051815480825290929183906141606020830191600052602060002090565b926000905b8060098301106142c4576103279454918181106142ae575b818110614294575b81811061427a575b818110614260575b818110614246575b81811061422c575b818110614212575b8181106141f8575b8181106141de575b106141cb575b5003836102cb565b60d81c62ffffff168152602001386141c3565b60c083901c62ffffff1684529260019060200193016141bd565b60a883901c62ffffff1684529260019060200193016141b5565b609083901c62ffffff1684529260019060200193016141ad565b607883901c62ffffff1684529260019060200193016141a5565b606083901c62ffffff16845292600190602001930161419d565b604883901c62ffffff168452926001906020019301614195565b603083901c62ffffff16845292600190602001930161418d565b601883901c62ffffff168452926001906020019301614185565b62ffffff8316845292600190602001930161417d565b91600a91935061014060019161437187546142e88362ffffff831662ffffff169052565b601881901c62ffffff166020840152603081901c62ffffff166040840152604881901c62ffffff166060840152606081901c62ffffff166080840152607881901c62ffffff1660a0840152609081901c62ffffff1660c084015260a881901c62ffffff1660e084015260c081901c62ffffff1661010084015260d81c62ffffff16610120830152565b019401920185929391614165565b6000806040516020810190637b3338ad60e11b8252600b6024820152826044820152604481526143b06064826102cb565b51906a636f6e736f6c652e6c6f675afa50565b903590601e198136030182121561022057018035906001600160401b03821161022057602001918160051b3603831361022057565b90608092612fc3919695949683526000602084015260a0604084015260a0830190610e14565b35610f0b81611852565b9291909461445660208361443b866126e2565b60405163095ea7b360e01b81529384928392600484016126ec565b038160006001600160a01b038a165af1801561096a57614696575b5061447e60808401613fc5565b156144a35750610f0b9461449d60a0614496856126e2565b940161441e565b936157e3565b909290156145e9579181600094936144cc6144c56040614515999601846143c3565b36916118b1565b9384511580156145cd575b80156145a8575b61456f575b50506144f561336361336387936126e2565b92604051968795869485936318cbafe560e01b85523091600486016143f8565b03925af160009181614552575b506145405760405162461bcd60e51b81528061340460048201612fd7565b8061341961454e9251612845565b5190565b6145689192503d806000833e61343c81836102cb565b9038614522565b869294506133636144f59261459f6133639361459661458c612ee7565b9361347185612871565b6134718361287e565b959350506144e3565b5060018060a01b036145c661335e6145c08851612845565b8861289e565b16156144de565b506001600160a01b036145e261335e87612871565b16156144d7565b909291610f0b946146006144c560408701876143c3565b94855115801561467a575b8015614655575b614626575b614620906126e2565b92615620565b9450614620614633612ee7565b6146408561347183612871565b61464d836134718361287e565b959050614617565b5060018060a01b0361467361335e61466d8951612845565b8961289e565b1615614612565b506001600160a01b0361468f61335e88612871565b161561460b565b6146ae9060203d6020116109f8576109e981836102cb565b614471565b9493929195600554906146ca8260ff9060a01c1690565b8061497b575b1561491b5750506001600160a01b038681169490821685811461485d5750851061481d576147169061470d614703612ee7565b9761347189612871565b6134718761287e565b47936020604051809563095ea7b360e01b82528160008161473b8789600484016126ec565b03925af1801561096a57614773966000958692614800575b506040516318cbafe560e01b8152978895869485933091600486016143f8565b03926001600160a01b03165af191821561096a57614797926147e7575b5047612864565b806147a0575b50565b6147ae613363600754610392565b803b15610220576000906004604051809481936306f4a2cd60e41b83525af1801561096a571561479d578061095e6000610327936102cb565b6147fb903d806000833e61343c81836102cb565b614790565b6148189060203d6020116109f8576109e981836102cb565b614753565b505050614834925090602091611e5d600554610392565b03925af1801561096a576148455750565b61479d9060203d6020116109f8576109e981836102cb565b9596505066038d7ea4c68000861093506149099250505057803b1561022057604051632e1a7d4d60e01b815260048101839052906000908290602490829084905af1801561096a576148f4575b506148b9613363600754610392565b803b15610220576000906004604051809481936306f4a2cd60e41b83525af1801561096a576148e55750565b8061095e6000610327936102cb565b8061095e6000614903936102cb565b386148aa565b61483491602091611e5d600554610392565b935093505050929192600014614951575050600080808061032794614947613363613363600554610392565b5af16108bd61271c565b91602091611e5d61496194610392565b03926001600160a01b03165af1801561096a576148455750565b506007546001600160a01b03906149959061336390610392565b1615156146d0565b6000546001600160a01b031633036149b157565b63118cdaa760e01b6000523360045260246000fd5b906149d08261189a565b6149dd60405191826102cb565b82815280926149ee601f199161189a565b019060005b8281106149ff57505050565b602090614a0a612cfb565b828285010152016149f3565b604090610f0b939281528160208201520190610e14565b919091805483101561050f576000526003600a60206000208185040193060290565b6001600160a01b0391821681529116602082015262ffffff91909116604082015260608101919091526000608082015260a00190565b90816020910312610220575190565b919060035490614aab614aa683612650565b6149c6565b93600093845b848110614ac2575050505050815290565b614aea614ae66002614ada849a95969799989a6104f0565b50015460a01c60ff1690565b1590565b614f8957614b086002614afc836104f0565b50015460a81c60ff1690565b15614cf957614b1e61336360036138c5846104f0565b6001600160a01b03169660005b6004614b36846104f0565b500154811015614ce757876000808888614ba1614b71614b62886004614b5b8d6104f0565b5001614a2d565b905462ffffff9160031b1c1690565b614b9360405193849289602085019763f7729d4360e01b895260248601614a4f565b03601f1981018352826102cb565b51908d5afa614bae61271c565b90614bbe575b5050600101614b2b565b9782614cc286614cdd948b614be08e6001999f60208091518301019101614a85565b614c94614c77614b62614bf2876104f0565b50986004614b5b614c068f6138c58c6104f0565b996138d3614c12612f09565b99614c69614c27614b628888614b5b886104f0565b9c6040519d8e9360208501606091821b6001600160601b0319908116825260e89390931b6001600160e81b031916601482015292901b166017820152602b0190565b03601f1981018c528b6102cb565b94614c89614c8361188a565b986102ee565b885260208801612791565b8c60408701526060860152608085015260a0840152614cb660c0840160019052565b62ffffff1660e0830152565b614ccc828861289e565b52614cd7818761289e565b50614131565b9690508738614bb4565b50949593929196506001905b01614ab1565b614d0b60099795969493929754610392565b614d13612ee7565b614d208561347183612871565b614d2d866134718361287e565b614d4f614d386128b2565b92614d468761347186612871565b6134718461287e565b614d5c866134718461288e565b614d646128b2565b91614d728661347185612871565b614d89614d80600a54610392565b6134718561287e565b614d96876134718561288e565b614daa61336361336360016138c5886104f0565b9160405163d06ca61f60e01b815260008180614dca858b60048401614a16565b0381875afa60009181614f6e575b50614f4457505060405163d06ca61f60e01b815260008180614dfe858a60048401614a16565b0381865afa60009181614f29575b50614eff5750506000604051809263d06ca61f60e01b82528180614e34878a60048401614a16565b03915afa60009181614ee4575b50614e51575b5050600190614cf3565b9682614edc928199614e9c614e7e614e7860016138c5614e71829b6104f0565b50976104f0565b9261288e565b5191614e91614e8b61188a565b956102ee565b855260208501612791565b86604084015260608301526080820152614eb4612707565b60a0820152600060c0820152600060e0820152614ed1828b61289e565b52614cd7818a61289e565b959038614e47565b614ef891923d8091833e61343c81836102cb565b9038614e41565b614f23935084999250908491614e9c614e7e614e7860016138c5614e71829b6104f0565b95614cf3565b614f3d91923d8091833e61343c81836102cb565b9038614e0c565b614f239450859a9350859250614e9c614e7e614f6860016138c5614e71829b6104f0565b9261287e565b614f8291923d8091833e61343c81836102cb565b9038614dd8565b60019096949593929196614cf3565b91929060035492614fab614aa685612650565b9460009485905b808210614fc457505050505050815290565b614fdc614ae66002614ada859b9697989a999b6104f0565b61538a57614fee6002614afc846104f0565b1561510a579661500561336360036138c5856104f0565b6001600160a01b03169760005b600461501d856104f0565b5001548110156150f557886000808c8a8a615065615043614b62896004614b5b8f6104f0565b614b936040519384928a602085019763f7729d4360e01b895260248601614a4f565b51915afa61507161271c565b90615081575b5050600101615012565b98826150d6876150eb948c6150a26001989f60208082518301019101614a85565b6150b4614c77614b62614bf2876104f0565b8d60408701526060860152608085015260a0840152614cb660c0840160019052565b6150e0828961289e565b52614cd7818861289e565b9790508838615077565b5095969493929750906001905b019094614fb2565b9495939291969061511c600954610392565b615124612ee7565b6151318661347183612871565b61513e876134718361287e565b6151576151496128b2565b92614d468861347186612871565b615164876134718461288e565b61516c6128b2565b9161517a8761347185612871565b615188614d80600a54610392565b615195886134718561288e565b6151a961336361336360016138c5886104f0565b9160405163d06ca61f60e01b815286600082806151ca868d60048401614a16565b0381885afa6000928161536f575b5061533b57505060405163d06ca61f60e01b815290508560008280615201868c60048401614a16565b0381875afa60009281615320575b506152e4579150506000604051809363d06ca61f60e01b82528180615238888c60048401614a16565b03915afa600092816152c9575b50615256575b505050600190615102565b615261575b8361524b565b97826152c192819a615281614e7e614e7860016138c5614e71829b6104f0565b87604084015260608301526080820152615299612707565b60a0820152600060c0820152600060e08201526152b6828c61289e565b52614cd7818b61289e565b96903861525b565b6152dd91933d8091833e61343c81836102cb565b9138615245565b91935091506152f8575b5050600190615102565b978261531892819a615281614e7e614e7860016138c5614e71829b6104f0565b9690386152ee565b61533491933d8091833e61343c81836102cb565b913861520f565b92509250925061534f575050600190615102565b978261531892819a615281614e7e614f6860016138c5614e71829b6104f0565b61538391933d8091833e61343c81836102cb565b91386151d8565b94959392919690600190615102565b600080546001600160a01b039283166001600160a01b03198216811783559216906000805160206159758339815191529080a3565b90600154600160401b811015610290578060016153f092016001556001610533565b612c2c57825180519093906001600160401b0381116102905761541781613d798554610225565b6020601f821160011461549557600492615445836140b19460a094610327999a600092611cd7575050612a81565b85555b61545960208201516001870161398d565b61547d60028601615470613ddd6040850151610392565b606083015160ff1661408b565b61548e60808201516003870161398d565b0151151590565b601f198216956154aa85600052602060002090565b9660005b8181106154f6575083610327979860a094600497946140b197600195106154dd575b505050811b018555615448565b015160001960f88460031b161c191690553880806154d0565b838301518955600190980197602093840193016154ae565b6155269060206040519282848094519384920161039e565b810103902090565b1561553557565b60405162461bcd60e51b8152602060048201526013602482015272092dcecc2d8d2c840e0c2e8d040d8cadccee8d606b1b6044820152606490fd5b1561557757565b60405162461bcd60e51b815260206004820152602360248201527f466972737420746f6b656e20696e2070617468206d75737420626520746f6b656044820152623724b760e91b6064820152608490fd5b156155cf57565b60405162461bcd60e51b815260206004820152602360248201527f4c61737420746f6b656e20696e2070617468206d75737420626520746f6b656e60448201526213dd5d60ea1b6064820152608490fd5b6156a99561568860009695949361565f889461564060028651101561552e565b61564c61335e86612871565b6001600160a01b03908116911614615570565b61567561335e61566f8551612845565b8561289e565b6001600160a01b039081169116146155c8565b6040516338ed173960e01b8152968795869485933091869060048701612f9e565b03926001600160a01b03165af1600091816156fa575b506145405760405162461bcd60e51b815260206004820152600e60248201526d158c881cddd85c0819985a5b195960921b6044820152606490fd5b6157109192503d806000833e61343c81836102cb565b90386156bf565b926157586000969793959492615742889461573660028851101561552e565b61564c61335e88612871565b61567561335e6157528751612845565b8761289e565b6156a9604051978896879586946338ed173960e01b8652309260048701612f9e565b81516001600160a01b03908116825260208084015182169083015260408084015162ffffff16908301526060808401518216908301526080808401519083015260a0808401519083015260c0808401519083015260e09283015116918101919091526101000190565b909160009561581c60209661581061585b979661580861580161188a565b9788612791565b898701612791565b62ffffff166040850152565b6158293060608501612791565b608083015260a08201528460c08201528460e082015260405194858094819363414bf38960e01b83526004830161577a565b03926001600160a01b03165af1600091816158ac575b50610f0b5760405162461bcd60e51b815260206004820152600e60248201526d158cc81cddd85c0819985a5b195960921b6044820152606490fd5b6158cf91925060203d6020116158d6575b6158c781836102cb565b810190614a85565b9038615871565b503d6158bd565b9160009661591660209761590a61585b9897956159026158fb61188a565b9889612791565b8a8801612791565b62ffffff166040860152565b6159233060608601612791565b608084015260a083015260c08201528460e082015260405194858094819363414bf38960e01b83526004830161577a56fe6d97a31531bdb3c43d920bc996ec8b9fd7733f5f55a81cd74700f88631fc60328be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0f3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee3b37b1e53309cdd58e462210a7e4f59c9a3928143321973720377c45860bdb05da2646970667358221220891ef0ecdaf5ec50750e980cfc8c93a9bc2bf6996b99282bf48e0b75a858703264736f6c634300081c0033
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 31 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.