Source Code
Overview
HYPE Balance
HYPE Value
$0.00Latest 25 from a total of 4,768 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact ETH F... | 7807625 | 1 hr ago | IN | 1.8 HYPE | 0.00003564 | ||||
Swap Exact Token... | 7806869 | 1 hr ago | IN | 0 HYPE | 0.00003013 | ||||
Swap Exact Token... | 7806445 | 1 hr ago | IN | 0 HYPE | 0.00005133 | ||||
Remove Liquidity | 7804933 | 1 hr ago | IN | 0 HYPE | 0.00022709 | ||||
Remove Liquidity | 7804607 | 2 hrs ago | IN | 0 HYPE | 0.00004877 | ||||
Swap Exact ETH F... | 7803768 | 2 hrs ago | IN | 0.0025 HYPE | 0.00006642 | ||||
Swap Exact ETH F... | 7802564 | 2 hrs ago | IN | 0.0025 HYPE | 0.00011935 | ||||
Swap Exact Token... | 7801406 | 2 hrs ago | IN | 0 HYPE | 0.00004235 | ||||
Remove Liquidity | 7800340 | 3 hrs ago | IN | 0 HYPE | 0.00026539 | ||||
Remove Liquidity | 7800283 | 3 hrs ago | IN | 0 HYPE | 0.00972198 | ||||
Add Liquidity | 7799984 | 3 hrs ago | IN | 0 HYPE | 0.00002469 | ||||
Remove Liquidity | 7798855 | 3 hrs ago | IN | 0 HYPE | 0.00126071 | ||||
Remove Liquidity | 7798035 | 3 hrs ago | IN | 0 HYPE | 0.00002906 | ||||
Swap Exact Token... | 7797163 | 4 hrs ago | IN | 0 HYPE | 0.00008408 | ||||
Swap Exact Token... | 7796278 | 4 hrs ago | IN | 0 HYPE | 0.0000746 | ||||
Swap Exact Token... | 7795512 | 4 hrs ago | IN | 0 HYPE | 0.00006306 | ||||
Swap Exact Token... | 7794224 | 4 hrs ago | IN | 0 HYPE | 0.00003041 | ||||
Swap Exact Token... | 7794106 | 4 hrs ago | IN | 0 HYPE | 0.00001899 | ||||
Swap Exact Token... | 7794044 | 4 hrs ago | IN | 0 HYPE | 0.00005415 | ||||
Swap Exact Token... | 7793727 | 5 hrs ago | IN | 0 HYPE | 0.00043283 | ||||
Remove Liquidity | 7791520 | 5 hrs ago | IN | 0 HYPE | 0.0003137 | ||||
Swap Exact Token... | 7791418 | 5 hrs ago | IN | 0 HYPE | 0.00038464 | ||||
Swap Exact Token... | 7791418 | 5 hrs ago | IN | 0 HYPE | 0.00178917 | ||||
Remove Liquidity | 7790165 | 5 hrs ago | IN | 0 HYPE | 0.00002429 | ||||
Remove Liquidity | 7790128 | 5 hrs ago | IN | 0 HYPE | 0.00002428 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
7807625 | 1 hr ago | 1.8 HYPE | ||||
7806869 | 1 hr ago | 0.19591914 HYPE | ||||
7806869 | 1 hr ago | 0.19591914 HYPE | ||||
7803768 | 2 hrs ago | 0.0025 HYPE | ||||
7802564 | 2 hrs ago | 0.0025 HYPE | ||||
7793727 | 5 hrs ago | 2.88151448 HYPE | ||||
7793727 | 5 hrs ago | 2.88151448 HYPE | ||||
7787416 | 6 hrs ago | 0.043 HYPE | ||||
7786266 | 7 hrs ago | 1.987689 HYPE | ||||
7786266 | 7 hrs ago | 1.987689 HYPE | ||||
7783929 | 7 hrs ago | 4.8992202 HYPE | ||||
7783929 | 7 hrs ago | 4.8992202 HYPE | ||||
7781428 | 8 hrs ago | 2 HYPE | ||||
7781114 | 8 hrs ago | 2.7 HYPE | ||||
7781088 | 8 hrs ago | 2.69759028 HYPE | ||||
7781088 | 8 hrs ago | 2.69759028 HYPE | ||||
7781025 | 8 hrs ago | 2.86 HYPE | ||||
7780310 | 8 hrs ago | 0.25 HYPE | ||||
7774788 | 10 hrs ago | 0.01 HYPE | ||||
7768925 | 11 hrs ago | 3.9 HYPE | ||||
7768816 | 11 hrs ago | 5.3 HYPE | ||||
7764266 | 13 hrs ago | 0.0009 HYPE | ||||
7764179 | 13 hrs ago | 0.0006 HYPE | ||||
7762109 | 13 hrs ago | 0.0001 HYPE | ||||
7754335 | 15 hrs ago | 0.1 HYPE |
Loading...
Loading
Contract Name:
RouterV2
Compiler Version
v0.8.13+commit.abaa5c0e
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: MIT // ftm.guru's extension of Solidly's periphery (Router) // https://github.com/andrecronje/solidly/blob/master/contracts/BaseV1-periphery.sol // BaseV1Router02.sol : Supporting Fee-on-transfer Tokens // https://github.com/ftm1337/solidly-with-FoT/blob/master/contracts/BaseV1-periphery.sol pragma solidity 0.8.13; import './interfaces/IBaseV1Factory.sol'; import './interfaces/IBaseV1Pair.sol'; import './interfaces/IPairFactory.sol'; import './interfaces/IWETH.sol'; import './interfaces/IERC20.sol'; import './libraries/Math.sol'; // Experimental Extension [ftm.guru/solidly/BaseV1Router02] // contract BaseV1Router02 is BaseV1Router01 // with Support for Fee-on-Transfer Tokens contract RouterV2 { using Math for uint; struct route { address from; address to; bool stable; } address public immutable factory; IWETH public immutable wETH; uint internal constant MINIMUM_LIQUIDITY = 10**3; bytes32 immutable pairCodeHash; // swap event for the referral system event Swap(address indexed sender,uint amount0In,address _tokenIn, address indexed to, bool stable); modifier ensure(uint deadline) { require(deadline >= block.timestamp, 'BaseV1Router: EXPIRED'); _; } constructor(address _factory, address _wETH) { factory = _factory; pairCodeHash = IBaseV1Factory(_factory).pairCodeHash(); wETH = IWETH(_wETH); } receive() external payable { assert(msg.sender == address(wETH)); // only accept ETH via fallback from the WETH contract } function sortTokens(address tokenA, address tokenB) public pure returns (address token0, address token1) { require(tokenA != tokenB, 'BaseV1Router: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'BaseV1Router: ZERO_ADDRESS'); } // calculates the CREATE2 address for a pair without making any external calls function pairFor(address tokenA, address tokenB, bool stable) public view returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address(uint160(uint256(keccak256(abi.encodePacked( hex'ff', factory, keccak256(abi.encodePacked(token0, token1, stable)), pairCodeHash // init code hash ))))); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quoteLiquidity(uint amountA, uint reserveA, uint reserveB) internal pure returns (uint amountB) { require(amountA > 0, 'BaseV1Router: INSUFFICIENT_AMOUNT'); require(reserveA > 0 && reserveB > 0, 'BaseV1Router: INSUFFICIENT_LIQUIDITY'); amountB = amountA * reserveB / reserveA; } // fetches and sorts the reserves for a pair function getReserves(address tokenA, address tokenB, bool stable) public view returns (uint reserveA, uint reserveB) { (address token0,) = sortTokens(tokenA, tokenB); (uint reserve0, uint reserve1,) = IBaseV1Pair(pairFor(tokenA, tokenB, stable)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // performs chained getAmountOut calculations on any number of pairs function getAmountOut(uint amountIn, address tokenIn, address tokenOut) public view returns (uint amount, bool stable) { address pair = pairFor(tokenIn, tokenOut, true); uint amountStable; uint amountVolatile; if (IBaseV1Factory(factory).isPair(pair)) { amountStable = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn); } pair = pairFor(tokenIn, tokenOut, false); if (IBaseV1Factory(factory).isPair(pair)) { amountVolatile = IBaseV1Pair(pair).getAmountOut(amountIn, tokenIn); } return amountStable > amountVolatile ? (amountStable, true) : (amountVolatile, false); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut(uint amountIn, route[] memory routes) public view returns (uint[] memory amounts) { require(routes.length >= 1, 'BaseV1Router: INVALID_PATH'); amounts = new uint[](routes.length+1); amounts[0] = amountIn; for (uint i = 0; i < routes.length; i++) { address pair = pairFor(routes[i].from, routes[i].to, routes[i].stable); if (IBaseV1Factory(factory).isPair(pair)) { amounts[i+1] = IBaseV1Pair(pair).getAmountOut(amounts[i], routes[i].from); } } } function isPair(address pair) external view returns (bool) { return IBaseV1Factory(factory).isPair(pair); } function quoteAddLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired ) external view returns (uint amountA, uint amountB, uint liquidity) { // create the pair if it doesn't exist yet address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable); (uint reserveA, uint reserveB) = (0,0); uint _totalSupply = 0; if (_pair != address(0)) { _totalSupply = IERC20(_pair).totalSupply(); (reserveA, reserveB) = getReserves(tokenA, tokenB, stable); } if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); liquidity = Math.sqrt(amountA * amountB) - MINIMUM_LIQUIDITY; } else { uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { (amountA, amountB) = (amountADesired, amountBOptimal); liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB); } else { uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); (amountA, amountB) = (amountAOptimal, amountBDesired); liquidity = Math.min(amountA * _totalSupply / reserveA, amountB * _totalSupply / reserveB); } } } function quoteRemoveLiquidity( address tokenA, address tokenB, bool stable, uint liquidity ) external view returns (uint amountA, uint amountB) { // create the pair if it doesn't exist yet address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { return (0,0); } (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable); uint _totalSupply = IERC20(_pair).totalSupply(); amountA = liquidity * reserveA / _totalSupply; // using balances ensures pro-rata distribution amountB = liquidity * reserveB / _totalSupply; // using balances ensures pro-rata distribution } function _addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin ) internal returns (uint amountA, uint amountB) { require(amountADesired >= amountAMin); require(amountBDesired >= amountBMin); // create the pair if it doesn't exist yet address _pair = IBaseV1Factory(factory).getPair(tokenA, tokenB, stable); if (_pair == address(0)) { _pair = IBaseV1Factory(factory).createPair(tokenA, tokenB, stable); } (uint reserveA, uint reserveB) = getReserves(tokenA, tokenB, stable); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint amountBOptimal = quoteLiquidity(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, 'BaseV1Router: INSUFFICIENT_B_AMOUNT'); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint amountAOptimal = quoteLiquidity(amountBDesired, reserveB, reserveA); assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, 'BaseV1Router: INSUFFICIENT_A_AMOUNT'); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, bool stable, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external ensure(deadline) returns (uint amountA, uint amountB, uint liquidity) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, stable, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = pairFor(tokenA, tokenB, stable); _safeTransferFrom(tokenA, msg.sender, pair, amountA); _safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IBaseV1Pair(pair).mint(to); } function addLiquidityETH( address token, bool stable, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable ensure(deadline) returns (uint amountToken, uint amountETH, uint liquidity) { (amountToken, amountETH) = _addLiquidity( token, address(wETH), stable, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = pairFor(token, address(wETH), stable); _safeTransferFrom(token, msg.sender, pair, amountToken); wETH.deposit{value: amountETH}(); assert(wETH.transfer(pair, amountETH)); liquidity = IBaseV1Pair(pair).mint(to); // refund dust ETH, if any if (msg.value > amountETH) _safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) public ensure(deadline) returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); require(IBaseV1Pair(pair).transferFrom(msg.sender, pair, liquidity)); // send liquidity to pair (uint amount0, uint amount1) = IBaseV1Pair(pair).burn(to); (address token0,) = sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, 'BaseV1Router: INSUFFICIENT_A_AMOUNT'); require(amountB >= amountBMin, 'BaseV1Router: INSUFFICIENT_B_AMOUNT'); } function removeLiquidityETH( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(wETH), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, amountToken); wETH.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityWithPermit( address tokenA, address tokenB, bool stable, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountA, uint amountB) { address pair = pairFor(tokenA, tokenB, stable); { uint value = approveMax ? type(uint).max : liquidity; IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); } (amountA, amountB) = removeLiquidity(tokenA, tokenB, stable, liquidity, amountAMin, amountBMin, to, deadline); } function removeLiquidityETHWithPermit( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH) { address pair = pairFor(token, address(wETH), stable); uint value = approveMax ? type(uint).max : liquidity; IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETH(token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline); } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap(uint[] memory amounts, route[] memory routes, address _to) internal virtual { for (uint i = 0; i < routes.length; i++) { (address token0,) = sortTokens(routes[i].from, routes[i].to); uint amountOut = amounts[i + 1]; (uint amount0Out, uint amount1Out) = routes[i].from == token0 ? (uint(0), amountOut) : (amountOut, uint(0)); address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to; IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)).swap( amount0Out, amount1Out, to, new bytes(0) ); emit Swap(msg.sender,amounts[i],routes[i].from, _to, routes[i].stable); } } function swapExactTokensForTokensSimple( uint amountIn, uint amountOutMin, address tokenFrom, address tokenTo, bool stable, address to, uint deadline ) external ensure(deadline) returns (uint[] memory amounts) { route[] memory routes = new route[](1); routes[0].from = tokenFrom; routes[0].to = tokenTo; routes[0].stable = stable; amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT'); _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(amounts, routes, to); } function swapExactTokensForTokens( uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline ) external ensure(deadline) returns (uint[] memory amounts) { amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT'); _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(amounts, routes, to); } function swapExactETHForTokens(uint amountOutMin, route[] calldata routes, address to, uint deadline) external payable ensure(deadline) returns (uint[] memory amounts) { require(routes[0].from == address(wETH), 'BaseV1Router: INVALID_PATH'); amounts = getAmountsOut(msg.value, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT'); wETH.deposit{value: amounts[0]}(); assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0])); _swap(amounts, routes, to); } function swapExactTokensForETH(uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline) external ensure(deadline) returns (uint[] memory amounts) { require(routes[routes.length - 1].to == address(wETH), 'BaseV1Router: INVALID_PATH'); amounts = getAmountsOut(amountIn, routes); require(amounts[amounts.length - 1] >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT'); _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0] ); _swap(amounts, routes, address(this)); wETH.withdraw(amounts[amounts.length - 1]); _safeTransferETH(to, amounts[amounts.length - 1]); } function UNSAFE_swapExactTokensForTokens( uint[] memory amounts, route[] calldata routes, address to, uint deadline ) external ensure(deadline) returns (uint[] memory) { _safeTransferFrom(routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amounts[0]); _swap(amounts, routes, to); return amounts; } function _safeTransferETH(address to, uint value) internal { (bool success,) = to.call{value:value}(new bytes(0)); require(success, 'TransferHelper: ETH_TRANSFER_FAILED'); } function _safeTransfer(address token, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transfer.selector, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } function _safeTransferFrom(address token, address from, address to, uint256 value) internal { require(token.code.length > 0); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(IERC20.transferFrom.selector, from, to, value)); require(success && (data.length == 0 || abi.decode(data, (bool)))); } // Experimental Extension [ETH.guru/solidly/BaseV1Router02] // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens)**** function removeLiquidityETHSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) public ensure(deadline) returns (uint amountToken, uint amountETH) { (amountToken, amountETH) = removeLiquidity( token, address(wETH), stable, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); _safeTransfer(token, to, IERC20(token).balanceOf(address(this))); wETH.withdraw(amountETH); _safeTransferETH(to, amountETH); } function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( address token, bool stable, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline, bool approveMax, uint8 v, bytes32 r, bytes32 s ) external returns (uint amountToken, uint amountETH) { address pair = pairFor(token, address(wETH), stable); uint value = approveMax ? type(uint).max : liquidity; IBaseV1Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); (amountToken, amountETH) = removeLiquidityETHSupportingFeeOnTransferTokens( token, stable, liquidity, amountTokenMin, amountETHMin, to, deadline ); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens(route[] calldata routes, address _to) internal virtual { for (uint i; i < routes.length; i++) { (address input, address output) = (routes[i].from, routes[i].to); (address token0,) = sortTokens(input, output); IBaseV1Pair pair = IBaseV1Pair(pairFor(routes[i].from, routes[i].to, routes[i].stable)); uint amountInput; uint amountOutput; { // scope to avoid stack too deep errors (uint reserve0, uint reserve1,) = pair.getReserves(); (uint reserveInput,) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput); (amountOutput,) = getAmountOut(amountInput, input, output); } (uint amount0Out, uint amount1Out) = input == token0 ? (uint(0), amountOutput) : (amountOutput, uint(0)); address to = i < routes.length - 1 ? pairFor(routes[i+1].from, routes[i+1].to, routes[i+1].stable) : _to; pair.swap(amount0Out, amount1Out, to, new bytes(0)); bool _stable = routes[i].stable; emit Swap(msg.sender,amountInput,input,_to,_stable); } } function swapExactTokensForTokensSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline ) external ensure(deadline) { _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn ); uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( IERC20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactETHForTokensSupportingFeeOnTransferTokens( uint amountOutMin, route[] calldata routes, address to, uint deadline ) external payable ensure(deadline) { require(routes[0].from == address(wETH), 'BaseV1Router: INVALID_PATH'); uint amountIn = msg.value; wETH.deposit{value: amountIn}(); assert(wETH.transfer(pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn)); uint balanceBefore = IERC20(routes[routes.length - 1].to).balanceOf(to); _swapSupportingFeeOnTransferTokens(routes, to); require( IERC20(routes[routes.length - 1].to).balanceOf(to).sub(balanceBefore) >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT' ); } function swapExactTokensForETHSupportingFeeOnTransferTokens( uint amountIn, uint amountOutMin, route[] calldata routes, address to, uint deadline ) external ensure(deadline) { require(routes[routes.length - 1].to == address(wETH), 'BaseV1Router: INVALID_PATH'); _safeTransferFrom( routes[0].from, msg.sender, pairFor(routes[0].from, routes[0].to, routes[0].stable), amountIn ); _swapSupportingFeeOnTransferTokens(routes, address(this)); uint amountOut = IERC20(address(wETH)).balanceOf(address(this)); require(amountOut >= amountOutMin, 'BaseV1Router: INSUFFICIENT_OUTPUT_AMOUNT'); wETH.withdraw(amountOut); _safeTransferETH(to, amountOut); } }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; interface IERC20 { function totalSupply() external view returns (uint256); function transfer(address recipient, uint amount) external returns (bool); function decimals() external view returns (uint8); function symbol() external view returns (string memory); function balanceOf(address) external view returns (uint); function transferFrom(address sender, address recipient, uint amount) external returns (bool); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); event Transfer(address indexed from, address indexed to, uint value); event Approval(address indexed owner, address indexed spender, uint value); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; interface IPairFactory { function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function getFee(bool) external view returns (uint); function allPairs(uint index) external view returns (address); function feeManager() external view returns (address); function pairCodeHash() external pure returns (bytes32); function getPair(address tokenA, address token, bool stable) external view returns (address); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); function getInitializable() external view returns (address, address, bool); function MAX_REFERRAL_FEE() external view returns(uint); function dibs() external view returns(address); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; interface IWETH { function deposit() external payable; function transfer(address to, uint256 value) external returns (bool); function withdraw(uint256) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; interface IBaseV1Factory { function allPairsLength() external view returns (uint); function isPair(address pair) external view returns (bool); function pairCodeHash() external pure returns (bytes32); function getPair(address tokenA, address token, bool stable) external view returns (address); function createPair(address tokenA, address tokenB, bool stable) external returns (address pair); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; interface IBaseV1Pair { function transferFrom(address src, address dst, uint amount) external returns (bool); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; function swap(uint amount0Out, uint amount1Out, address to, bytes calldata data) external; function burn(address to) external returns (uint amount0, uint amount1); function mint(address to) external returns (uint liquidity); function getReserves() external view returns (uint112 _reserve0, uint112 _reserve1, uint32 _blockTimestampLast); function getAmountOut(uint, address) external view returns (uint); }
// SPDX-License-Identifier: MIT pragma solidity 0.8.13; library Math { function max(uint a, uint b) internal pure returns (uint) { return a >= b ? a : b; } function min(uint a, uint b) internal pure returns (uint) { return a < b ? a : b; } function sqrt(uint y) internal pure returns (uint z) { if (y > 3) { z = y; uint x = y / 2 + 1; while (x < z) { z = x; x = (y / x + x) / 2; } } else if (y != 0) { z = 1; } } function cbrt(uint256 n) internal pure returns (uint256) { unchecked { uint256 x = 0; for (uint256 y = 1 << 255; y > 0; y >>= 3) { x <<= 1; uint256 z = 3 * x * (x + 1) + 1; if (n / y >= z) { n -= y * z; x += 1; } } return x; }} function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, 'Math: Sub-underflow'); } function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
{ "libraries": {}, "optimizer": { "enabled": true, "runs": 200 }, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_wETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount0In","type":"uint256"},{"indexed":false,"internalType":"address","name":"_tokenIn","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"bool","name":"stable","type":"bool"}],"name":"Swap","type":"event"},{"inputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"UNSAFE_swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountTokenDesired","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"addLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"factory","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address","name":"tokenIn","type":"address"},{"internalType":"address","name":"tokenOut","type":"address"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bool","name":"stable","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"getReserves","outputs":[{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pair","type":"address"}],"name":"isPair","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"name":"pairFor","outputs":[{"internalType":"address","name":"pair","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"amountADesired","type":"uint256"},{"internalType":"uint256","name":"amountBDesired","type":"uint256"}],"name":"quoteAddLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"}],"name":"quoteRemoveLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidity","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETH","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"removeLiquidityETHSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermit","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountTokenMin","type":"uint256"},{"internalType":"uint256","name":"amountETHMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityETHWithPermitSupportingFeeOnTransferTokens","outputs":[{"internalType":"uint256","name":"amountToken","type":"uint256"},{"internalType":"uint256","name":"amountETH","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"uint256","name":"liquidity","type":"uint256"},{"internalType":"uint256","name":"amountAMin","type":"uint256"},{"internalType":"uint256","name":"amountBMin","type":"uint256"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"},{"internalType":"bool","name":"approveMax","type":"bool"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"removeLiquidityWithPermit","outputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"}],"name":"sortTokens","outputs":[{"internalType":"address","name":"token0","type":"address"},{"internalType":"address","name":"token1","type":"address"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETHSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address","name":"tokenFrom","type":"address"},{"internalType":"address","name":"tokenTo","type":"address"},{"internalType":"bool","name":"stable","type":"bool"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSimple","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"components":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"bool","name":"stable","type":"bool"}],"internalType":"struct RouterV2.route[]","name":"routes","type":"tuple[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokensSupportingFeeOnTransferTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"wETH","outputs":[{"internalType":"contract IWETH","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60e06040523480156200001157600080fd5b506040516200483e3803806200483e8339810160408190526200003491620000d8565b6001600160a01b038216608081905260408051631355724960e31b81529051639aab9248916004808201926020929091908290030181865afa1580156200007f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000a5919062000110565b60c0526001600160a01b031660a052506200012a565b80516001600160a01b0381168114620000d357600080fd5b919050565b60008060408385031215620000ec57600080fd5b620000f783620000bb565b91506200010760208401620000bb565b90509250929050565b6000602082840312156200012357600080fd5b5051919050565b60805160a05160c0516146126200022c6000396000610f8301526000818161019501528181610547015281816109a301528181610be201528181610e330152818161151f01528181611632015281816116c001528181611b3f01528181611bbd01528181611c3101528181611e3401528181611ee701528181611f92015281816125690152818161259f015281816125d401528181612669015281816127a8015281816127f80152818161287e0152612b160152600081816104a301528181610cc801528181610f480152818161121401528181611328015281816121160152818161228a01528181612954015281816130ca015261316b01526146126000f3fe6080604052600436106101855760003560e01c806376c72751116100d1578063c45a01551161008a578063e5e31b1311610064578063e5e31b1314610505578063f242862114610535578063f41766d814610569578063fe411f141461058957600080fd5b8063c45a015514610491578063d7b0e0a5146104c5578063e2d9d4dc146104e557600080fd5b806376c72751146103eb5780637af728c8146103fe5780639881fcb41461041e57806398a0fb3c1461043e578063a32b1fcd1461045e578063b7e0d4c01461047e57600080fd5b8063544caa561161013e5780635e60dab5116101185780635e60dab51461037857806367ffb66a146103985780636cc1ae13146103ab5780637301e3c8146103cb57600080fd5b8063544caa56146102c85780635a47ddc3146103085780635e1e63251461034357600080fd5b80630dede6c4146101c957806313dcfc591461020357806318a13086146102305780634386e63c14610250578063448725b4146102705780634c1ee03e1461029057600080fd5b366101c457336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146101c2576101c2613908565b005b600080fd5b3480156101d557600080fd5b506101e96101e436600461394f565b6105a9565b604080519283526020830191909152015b60405180910390f35b34801561020f57600080fd5b5061022361021e3660046139d4565b610763565b6040516101fa9190613a4f565b34801561023c57600080fd5b5061022361024b366004613ad8565b610976565b34801561025c57600080fd5b506101e961026b366004613b4b565b610cc1565b34801561027c57600080fd5b506101e961028b366004613bad565b610e28565b34801561029c57600080fd5b506102b06102ab366004613c57565b610f01565b6040516001600160a01b0390911681526020016101fa565b3480156102d457600080fd5b506102e86102e3366004613ca2565b611009565b604080516001600160a01b039384168152929091166020830152016101fa565b34801561031457600080fd5b50610328610323366004613cdb565b6110fc565b604080519384526020840192909252908201526060016101fa565b34801561034f57600080fd5b5061036361035e366004613d6a565b6111dc565b604080519283529015156020830152016101fa565b34801561038457600080fd5b506101e9610393366004613c57565b611430565b6102236103a6366004613da1565b6114fa565b3480156103b757600080fd5b506101c26103c6366004613ad8565b611859565b3480156103d757600080fd5b506102236103e6366004613e73565b611a46565b6101c26103f9366004613da1565b611b1c565b34801561040a57600080fd5b506101c2610419366004613ad8565b611e09565b34801561042a57600080fd5b50610223610439366004613fb5565b612000565b34801561044a57600080fd5b5061032861045936600461405b565b612282565b34801561046a57600080fd5b506101e96104793660046140b6565b612482565b61032861048c366004614172565b61253d565b34801561049d57600080fd5b506102b07f000000000000000000000000000000000000000000000000000000000000000081565b3480156104d157600080fd5b506101e96104e0366004614172565b61277e565b3480156104f157600080fd5b506101e9610500366004613bad565b612873565b34801561051157600080fd5b506105256105203660046141cd565b612932565b60405190151581526020016101fa565b34801561054157600080fd5b506102b07f000000000000000000000000000000000000000000000000000000000000000081565b34801561057557600080fd5b50610223610584366004613ad8565b6129c7565b34801561059557600080fd5b506101e96105a4366004614172565b612aec565b60008082428110156105d65760405162461bcd60e51b81526004016105cd906141ea565b60405180910390fd5b60006105e38c8c8c610f01565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015610639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065d9190614219565b61066657600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190614236565b9150915060006106e68f8f611009565b509050806001600160a01b03168f6001600160a01b03161461070957818361070c565b82825b90975095508a8710156107315760405162461bcd60e51b81526004016105cd9061425a565b898610156107515760405162461bcd60e51b81526004016105cd9061429d565b50505050509850989650505050505050565b606081428110156107865760405162461bcd60e51b81526004016105cd906141ea565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161079d57905050905087816000815181106107e0576107e06142e0565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508681600081518110610818576108186142e0565b6020026020010151602001906001600160a01b031690816001600160a01b0316815250508581600081518110610850576108506142e0565b602090810291909101015190151560409091015261086e8a82612000565b9250888360018551610880919061430c565b81518110610890576108906142e0565b602002602001015110156108b65760405162461bcd60e51b81526004016105cd90614323565b61095e816000815181106108cc576108cc6142e0565b6020026020010151600001513361093e846000815181106108ef576108ef6142e0565b6020026020010151600001518560008151811061090e5761090e6142e0565b6020026020010151602001518660008151811061092d5761092d6142e0565b602002602001015160400151610f01565b86600081518110610951576109516142e0565b6020026020010151612bba565b610969838287612cb2565b5050979650505050505050565b606081428110156109995760405162461bcd60e51b81526004016105cd906141ea565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001686866109d060018261430c565b8181106109df576109df6142e0565b90506060020160200160208101906109f791906141cd565b6001600160a01b031614610a1d5760405162461bcd60e51b81526004016105cd9061436b565b610a79888787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f57610a60606083028601368190038101906143a2565b81526020019060010190610a43565b5050505050612000565b9150868260018451610a8b919061430c565b81518110610a9b57610a9b6142e0565b60200260200101511015610ac15760405162461bcd60e51b81526004016105cd90614323565b610b8386866000818110610ad757610ad76142e0565b610aed92602060609092020190810191506141cd565b33610b7089896000818110610b0457610b046142e0565b610b1a92602060609092020190810191506141cd565b8a8a6000818110610b2d57610b2d6142e0565b9050606002016020016020810190610b4591906141cd565b8b8b6000818110610b5857610b586142e0565b90506060020160400160208101906102ab91906143be565b85600081518110610951576109516142e0565b610be0828787808060200260200160405190810160405280939291908181526020016000905b82821015610bd557610bc6606083028601368190038101906143a2565b81526020019060010190610ba9565b505050505030612cb2565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551610c1e919061430c565b81518110610c2e57610c2e6142e0565b60200260200101516040518263ffffffff1660e01b8152600401610c5491815260200190565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b50505050610cb6848360018551610c99919061430c565b81518110610ca957610ca96142e0565b6020026020010151612fc5565b509695505050505050565b60008060007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610d16939291906143db565b602060405180830381865afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5791906143ff565b90506001600160a01b038116610d74576000809250925050610e1f565b600080610d82898989611430565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea919061441c565b905080610df78489614435565b610e019190614454565b955080610e0e8389614435565b610e189190614454565b9450505050505b94509492505050565b6000806000610e588e7f00000000000000000000000000000000000000000000000000000000000000008f610f01565b9050600087610e67578c610e6b565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610ea6903390309086908f908e908e908e90600401614476565b600060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b50505050610ee78f8f8f8f8f8f8f61277e565b809450819550505050509b509b9950505050505050505050565b6000806000610f108686611009565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f000000000000000000000000000000000000000000000000000000000000000090604901604051602081830303815290604052805190602001207f0000000000000000000000000000000000000000000000000000000000000000604051602001610fe7939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b0316036110775760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f41444452455353456044820152605360f81b60648201526084016105cd565b826001600160a01b0316846001600160a01b03161061109757828461109a565b83835b90925090506001600160a01b0382166110f55760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f4144445245535300000000000060448201526064016105cd565b9250929050565b600080600083428110156111225760405162461bcd60e51b81526004016105cd906141ea565b6111318d8d8d8d8d8d8d613093565b909450925060006111438e8e8e610f01565b90506111518e338388612bba565b61115d8d338387612bba565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c9919061441c565b9250505099509950999650505050505050565b60008060006111ed85856001610f01565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112819190614219565b156112fa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa1580156112d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f7919061441c565b91505b61130687876000610f01565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa158015611371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113959190614219565b1561140e576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa1580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b919061441c565b90505b80821161141d57806000611421565b8160015b94509450505050935093915050565b600080600061143f8686611009565b509050600080611450888888610f01565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561148d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b191906144ce565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b0316146114e85780826114eb565b81815b90999098509650505050505050565b6060814281101561151d5760405162461bcd60e51b81526004016105cd906141ea565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168686600081811061155a5761155a6142e0565b61157092602060609092020190810191506141cd565b6001600160a01b0316146115965760405162461bcd60e51b81526004016105cd9061436b565b6115e8348787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f576115d9606083028601368190038101906143a2565b815260200190600101906115bc565b91508682600184516115fa919061430c565b8151811061160a5761160a6142e0565b602002602001015110156116305760405162461bcd60e51b81526004016105cd90614323565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db083600081518110611672576116726142e0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156116a557600080fd5b505af11580156116b9573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb61175788886000818110611703576117036142e0565b61171992602060609092020190810191506141cd565b8989600081811061172c5761172c6142e0565b905060600201602001602081019061174491906141cd565b8a8a6000818110610b5857610b586142e0565b8460008151811061176a5761176a6142e0565b60200260200101516040518363ffffffff1660e01b81526004016117a39291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e69190614219565b6117f2576117f2613908565b61184f828787808060200260200160405190810160405280939291908181526020016000905b8282101561184457611835606083028601368190038101906143a2565b81526020019060010190611818565b505050505086612cb2565b5095945050505050565b804281101561187a5760405162461bcd60e51b81526004016105cd906141ea565b6118c385856000818110611890576118906142e0565b6118a692602060609092020190810191506141cd565b336118bd88886000818110611703576117036142e0565b8a612bba565b600085856118d260018261430c565b8181106118e1576118e16142e0565b90506060020160200160208101906118f991906141cd565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015611941573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611965919061441c565b90506119728686866132b1565b86611a1e82888861198460018261430c565b818110611993576119936142e0565b90506060020160200160208101906119ab91906141cd565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a18919061441c565b9061365d565b1015611a3c5760405162461bcd60e51b81526004016105cd90614323565b5050505050505050565b60608142811015611a695760405162461bcd60e51b81526004016105cd906141ea565b611abf86866000818110611a7f57611a7f6142e0565b611a9592602060609092020190810191506141cd565b33611aac89896000818110610b0457610b046142e0565b8a600081518110610951576109516142e0565b611b11878787808060200260200160405190810160405280939291908181526020016000905b8282101561184457611b02606083028601368190038101906143a2565b81526020019060010190611ae5565b509495945050505050565b8042811015611b3d5760405162461bcd60e51b81526004016105cd906141ea565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031685856000818110611b7a57611b7a6142e0565b611b9092602060609092020190810191506141cd565b6001600160a01b031614611bb65760405162461bcd60e51b81526004016105cd9061436b565b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb611c7488886000818110611703576117036142e0565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce59190614219565b611cf157611cf1613908565b60008686611d0060018261430c565b818110611d0f57611d0f6142e0565b9050606002016020016020810190611d2791906141cd565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d93919061441c565b9050611da08787876132b1565b87611a1e828989611db260018261430c565b818110611dc157611dc16142e0565b9050606002016020016020810190611dd991906141cd565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a08231906024016119d7565b8042811015611e2a5760405162461bcd60e51b81526004016105cd906141ea565b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168585611e6160018261430c565b818110611e7057611e706142e0565b9050606002016020016020810190611e8891906141cd565b6001600160a01b031614611eae5760405162461bcd60e51b81526004016105cd9061436b565b611ec485856000818110611890576118906142e0565b611ecf8585306132b1565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a919061441c565b905086811015611f7c5760405162461bcd60e51b81526004016105cd90614323565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611fde57600080fd5b505af1158015611ff2573d6000803e3d6000fd5b50505050611a3c8482612fc5565b60606001825110156120245760405162461bcd60e51b81526004016105cd9061436b565b8151612031906001614513565b67ffffffffffffffff81111561204957612049613e08565b604051908082528060200260200182016040528015612072578160200160208202803683370190505b5090508281600081518110612089576120896142e0565b60200260200101818152505060005b825181101561227b5760006120f48483815181106120b8576120b86142e0565b6020026020010151600001518584815181106120d6576120d66142e0565b60200260200101516020015186858151811061092d5761092d6142e0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561215f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121839190614219565b1561226857806001600160a01b031663f140a35a8484815181106121a9576121a96142e0565b60200260200101518685815181106121c3576121c36142e0565b6020026020010151600001516040518363ffffffff1660e01b81526004016121fe9291909182526001600160a01b0316602082015260400190565b602060405180830381865afa15801561221b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223f919061441c565b8361224b846001614513565b8151811061225b5761225b6142e0565b6020026020010181815250505b50806122738161452b565b915050612098565b5092915050565b6000806000807f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b81526004016122d8939291906143db565b602060405180830381865afa1580156122f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231991906143ff565b9050600080806001600160a01b038416156123a357836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561236c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612390919061441c565b905061239d8c8c8c611430565b90935091505b821580156123af575081155b156123e0578896508795506103e86123cf6123ca888a614435565b6136b1565b6123d9919061430c565b9450612473565b60006123ed8a8585613721565b90508881116124355789975095508561242e8461240a848b614435565b6124149190614454565b8461241f858b614435565b6124299190614454565b613801565b9550612471565b60006124428a8587613721565b985089975088905061246d856124588584614435565b6124629190614454565b8561241f868c614435565b9650505b505b50505050955095509592505050565b60008060006124928f8f8f610f01565b90506000876124a1578c6124a5565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906124e0903390309086908f908e908e908e90600401614476565b600060405180830381600087803b1580156124fa57600080fd5b505af115801561250e573d6000803e3d6000fd5b50505050506125238f8f8f8f8f8f8f8f6105a9565b8093508194505050509c509c9a5050505050505050505050565b600080600083428110156125635760405162461bcd60e51b81526004016105cd906141ea565b6125928b7f00000000000000000000000000000000000000000000000000000000000000008c8c348d8d613093565b909450925060006125c48c7f00000000000000000000000000000000000000000000000000000000000000008d610f01565b90506125d28c338388612bba565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561262d57600080fd5b505af1158015612641573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000000000000000000000000000000000000000000016935063a9059cbb925060440190506020604051808303816000875af11580156126b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126da9190614219565b6126e6576126e6613908565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561272e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612752919061441c565b92508334111561276f5761276f3361276a863461430c565b612fc5565b50509750975097945050505050565b60008082428110156127a25760405162461bcd60e51b81526004016105cd906141ea565b6127d28a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6105a9565b90935091506127e28a8685613819565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561284457600080fd5b505af1158015612858573d6000803e3d6000fd5b505050506128668583612fc5565b5097509795505050505050565b60008060006128a38e7f00000000000000000000000000000000000000000000000000000000000000008f610f01565b90506000876128b2578c6128b6565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906128f1903390309086908f908e908e908e90600401614476565b600060405180830381600087803b15801561290b57600080fd5b505af115801561291f573d6000803e3d6000fd5b50505050610ee78f8f8f8f8f8f8f612aec565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f00000000000000000000000000000000000000000000000000000000000000009091169063e5e31b1390602401602060405180830381865afa15801561299d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c19190614219565b92915050565b606081428110156129ea5760405162461bcd60e51b81526004016105cd906141ea565b612a3c888787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f57612a2d606083028601368190038101906143a2565b81526020019060010190612a10565b9150868260018451612a4e919061430c565b81518110612a5e57612a5e6142e0565b60200260200101511015612a845760405162461bcd60e51b81526004016105cd90614323565b612a9a86866000818110610ad757610ad76142e0565b610cb6828787808060200260200160405190810160405280939291908181526020016000905b8282101561184457612add606083028601368190038101906143a2565b81526020019060010190612ac0565b6000808242811015612b105760405162461bcd60e51b81526004016105cd906141ea565b612b408a7f00000000000000000000000000000000000000000000000000000000000000008b8b8b8b308b6105a9565b6040516370a0823160e01b815230600482015291945092506127e2908b9087906001600160a01b038316906370a0823190602401602060405180830381865afa158015612b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb5919061441c565b613819565b6000846001600160a01b03163b11612bd157600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612c359190614570565b6000604051808303816000865af19150503d8060008114612c72576040519150601f19603f3d011682016040523d82523d6000602084013e612c77565b606091505b5091509150818015612ca1575080511580612ca1575080806020019051810190612ca19190614219565b612caa57600080fd5b505050505050565b60005b8251811015612fbf576000612d04848381518110612cd557612cd56142e0565b602002602001015160000151858481518110612cf357612cf36142e0565b602002602001015160200151611009565b509050600085612d15846001614513565b81518110612d2557612d256142e0565b60200260200101519050600080836001600160a01b0316878681518110612d4e57612d4e6142e0565b6020026020010151600001516001600160a01b031614612d7057826000612d74565b6000835b91509150600060018851612d88919061430c565b8610612d945786612e07565b612e0788612da3886001614513565b81518110612db357612db36142e0565b60200260200101516000015189886001612dcd9190614513565b81518110612ddd57612ddd6142e0565b6020026020010151602001518a896001612df79190614513565b8151811061092d5761092d6142e0565b9050612e5a888781518110612e1e57612e1e6142e0565b602002602001015160000151898881518110612e3c57612e3c6142e0565b6020026020010151602001518a898151811061092d5761092d6142e0565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612e97576020820181803683370190505b506040518563ffffffff1660e01b8152600401612eb7949392919061458c565b600060405180830381600087803b158015612ed157600080fd5b505af1158015612ee5573d6000803e3d6000fd5b50505050866001600160a01b0316336001600160a01b03167f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e508b8981518110612f3057612f306142e0565b60200260200101518b8a81518110612f4a57612f4a6142e0565b6020026020010151600001518c8b81518110612f6857612f686142e0565b602002602001015160400151604051612f9f939291909283526001600160a01b039190911660208301521515604082015260600190565b60405180910390a350505050508080612fb79061452b565b915050612cb5565b50505050565b604080516000808252602082019092526001600160a01b038416908390604051612fef9190614570565b60006040518083038185875af1925050503d806000811461302c576040519150601f19603f3d011682016040523d82523d6000602084013e613031565b606091505b505090508061308e5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016105cd565b505050565b600080838610156130a357600080fd5b828510156130b057600080fd5b6040516306801cc360e41b81526000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690636801cc3090613103908d908d908d906004016143db565b602060405180830381865afa158015613120573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314491906143ff565b90506001600160a01b0381166131ea576040516320b7f73960e21b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906382dfdce4906131a4908d908d908d906004016143db565b6020604051808303816000875af11580156131c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e791906143ff565b90505b6000806131f88c8c8c611430565b9150915081600014801561320a575080155b1561321a578894508793506132a2565b60006132278a8484613721565b905088811161325b57868110156132505760405162461bcd60e51b81526004016105cd9061429d565b8995509350836132a0565b60006132688a8486613721565b90508a81111561327a5761327a613908565b8881101561329a5760405162461bcd60e51b81526004016105cd9061425a565b95508894505b505b50505097509795505050505050565b60005b82811015612fbf576000808585848181106132d1576132d16142e0565b6132e792602060609092020190810191506141cd565b8686858181106132f9576132f96142e0565b905060600201602001602081019061331191906141cd565b9150915060006133218383611009565b509050600061338d88888781811061333b5761333b6142e0565b61335192602060609092020190810191506141cd565b898988818110613363576133636142e0565b905060600201602001602081019061337b91906141cd565b8a8a89818110610b5857610b586142e0565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156133d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f791906144ce565b506001600160701b031691506001600160701b031691506000866001600160a01b0316896001600160a01b031614613430578183613433565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925061346c918391908c16906370a08231906024016119d7565b9450613479858a8a6111dc565b5080945050505050600080856001600160a01b0316886001600160a01b0316146134a5578260006134a9565b6000835b909250905060006134bb60018d61430c565b8a106134c7578a61354c565b61354c8d8d6134d78d6001614513565b8181106134e6576134e66142e0565b6134fc92602060609092020190810191506141cd565b8e8e6135098e6001614513565b818110613518576135186142e0565b905060600201602001602081019061353091906141cd565b8f8f61353d8f6001614513565b818110610b5857610b586142e0565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f9061358e908690869086906024810161458c565b600060405180830381600087803b1580156135a857600080fd5b505af11580156135bc573d6000803e3d6000fd5b5050505060008d8d8c8181106135d4576135d46142e0565b90506060020160400160208101906135ec91906143be565b604080518881526001600160a01b038d81166020830152831515828401529151929350908e169133917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50919081900360600190a35050505050505050505080806136559061452b565b9150506132b4565b60008261366a838261430c565b91508111156129c15760405162461bcd60e51b81526020600482015260136024820152724d6174683a205375622d756e646572666c6f7760681b60448201526064016105cd565b6000600382111561371257508060006136cb600283614454565b6136d6906001614513565b90505b8181101561370c579050806002816136f18186614454565b6136fb9190614513565b6137059190614454565b90506136d9565b50919050565b811561371c575060015b919050565b600080841161377c5760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e6044820152601560fa1b60648201526084016105cd565b60008311801561378c5750600082115b6137e45760405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c495155496044820152634449545960e01b60648201526084016105cd565b826137ef8386614435565b6137f99190614454565b949350505050565b60008183106138105781613812565b825b9392505050565b6000836001600160a01b03163b1161383057600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161388c9190614570565b6000604051808303816000865af19150503d80600081146138c9576040519150601f19603f3d011682016040523d82523d6000602084013e6138ce565b606091505b50915091508180156138f85750805115806138f85750808060200190518101906138f89190614219565b61390157600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461393357600080fd5b50565b803561371c8161391e565b801515811461393357600080fd5b600080600080600080600080610100898b03121561396c57600080fd5b88356139778161391e565b975060208901356139878161391e565b9650604089013561399781613941565b9550606089013594506080890135935060a0890135925060c08901356139bc8161391e565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156139ef57600080fd5b87359650602088013595506040880135613a088161391e565b94506060880135613a188161391e565b93506080880135613a2881613941565b925060a0880135613a388161391e565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613a8757835183529284019291840191600101613a6b565b50909695505050505050565b60008083601f840112613aa557600080fd5b50813567ffffffffffffffff811115613abd57600080fd5b6020830191508360206060830285010111156110f557600080fd5b60008060008060008060a08789031215613af157600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613b1657600080fd5b613b2289828a01613a93565b9095509350506060870135613b368161391e565b80925050608087013590509295509295509295565b60008060008060808587031215613b6157600080fd5b8435613b6c8161391e565b93506020850135613b7c8161391e565b92506040850135613b8c81613941565b9396929550929360600135925050565b803560ff8116811461371c57600080fd5b60008060008060008060008060008060006101608c8e031215613bcf57600080fd5b8b35613bda8161391e565b9a5060208c0135613bea81613941565b995060408c0135985060608c0135975060808c0135965060a08c0135613c0f8161391e565b955060c08c0135945060e08c0135613c2681613941565b9350613c356101008d01613b9c565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600060608486031215613c6c57600080fd5b8335613c778161391e565b92506020840135613c878161391e565b91506040840135613c9781613941565b809150509250925092565b60008060408385031215613cb557600080fd5b8235613cc08161391e565b91506020830135613cd08161391e565b809150509250929050565b60008060008060008060008060006101208a8c031215613cfa57600080fd5b8935613d058161391e565b985060208a0135613d158161391e565b975060408a0135613d2581613941565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613d518161391e565b809250506101008a013590509295985092959850929598565b600080600060608486031215613d7f57600080fd5b833592506020840135613d918161391e565b91506040840135613c978161391e565b600080600080600060808688031215613db957600080fd5b85359450602086013567ffffffffffffffff811115613dd757600080fd5b613de388828901613a93565b9095509350506040860135613df78161391e565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613e4757613e47613e08565b604052919050565b600067ffffffffffffffff821115613e6957613e69613e08565b5060051b60200190565b600080600080600060808688031215613e8b57600080fd5b853567ffffffffffffffff80821115613ea357600080fd5b818801915088601f830112613eb757600080fd5b81356020613ecc613ec783613e4f565b613e1e565b82815260059290921b8401810191818101908c841115613eeb57600080fd5b948201945b83861015613f0957853582529482019490820190613ef0565b99505089013592505080821115613f1f57600080fd5b50613f2c88828901613a93565b9095509350613df7905060408701613936565b600060608284031215613f5157600080fd5b6040516060810181811067ffffffffffffffff82111715613f7457613f74613e08565b6040529050808235613f858161391e565b81526020830135613f958161391e565b60208201526040830135613fa881613941565b6040919091015292915050565b60008060408385031215613fc857600080fd5b8235915060208084013567ffffffffffffffff811115613fe757600080fd5b8401601f81018613613ff857600080fd5b8035614006613ec782613e4f565b8181526060918202830184019184820191908984111561402557600080fd5b938501935b8385101561404b5761403c8a86613f3f565b8352938401939185019161402a565b5080955050505050509250929050565b600080600080600060a0868803121561407357600080fd5b853561407e8161391e565b9450602086013561408e8161391e565b9350604086013561409e81613941565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156140d957600080fd5b8c356140e48161391e565b9b5060208d01356140f48161391e565b9a5060408d013561410481613941565b995060608d0135985060808d0135975060a08d0135965060c08d01356141298161391e565b955060e08d013594506101008d013561414181613941565b93506141506101208e01613b9c565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561418d57600080fd5b87356141988161391e565b965060208801356141a881613941565b955060408801359450606088013593506080880135925060a0880135613a388161391e565b6000602082840312156141df57600080fd5b81356138128161391e565b60208082526015908201527410985cd9558c549bdd5d195c8e8811561412549151605a1b604082015260600190565b60006020828403121561422b57600080fd5b815161381281613941565b6000806040838503121561424957600080fd5b505080516020909101519092909150565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60408201526215539560ea1b606082015260800190565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60408201526215539560ea1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561431e5761431e6142f6565b500390565b60208082526028908201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b6020808252601a908201527f426173655631526f757465723a20494e56414c49445f50415448000000000000604082015260600190565b6000606082840312156143b457600080fd5b6138128383613f3f565b6000602082840312156143d057600080fd5b813561381281613941565b6001600160a01b039384168152919092166020820152901515604082015260600190565b60006020828403121561441157600080fd5b81516138128161391e565b60006020828403121561442e57600080fd5b5051919050565b600081600019048311821515161561444f5761444f6142f6565b500290565b60008261447157634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b80516001600160701b038116811461371c57600080fd5b6000806000606084860312156144e357600080fd5b6144ec846144b7565b92506144fa602085016144b7565b9150604084015163ffffffff81168114613c9757600080fd5b60008219821115614526576145266142f6565b500190565b60006001820161453d5761453d6142f6565b5060010190565b60005b8381101561455f578181015183820152602001614547565b83811115612fbf5750506000910152565b60008251614582818460208701614544565b9190910192915050565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526145c58160a0850160208701614544565b601f01601f19169190910160a0019594505050505056fea2646970667358221220162e9fe4f9be2e543f3a62d84003b16a2a0d005fd410f598fa2c2249847f6eec64736f6c634300080d00330000000000000000000000009c7397c9c5ecc400992843408d3a283fe91080090000000000000000000000005555555555555555555555555555555555555555
Deployed Bytecode
0x6080604052600436106101855760003560e01c806376c72751116100d1578063c45a01551161008a578063e5e31b1311610064578063e5e31b1314610505578063f242862114610535578063f41766d814610569578063fe411f141461058957600080fd5b8063c45a015514610491578063d7b0e0a5146104c5578063e2d9d4dc146104e557600080fd5b806376c72751146103eb5780637af728c8146103fe5780639881fcb41461041e57806398a0fb3c1461043e578063a32b1fcd1461045e578063b7e0d4c01461047e57600080fd5b8063544caa561161013e5780635e60dab5116101185780635e60dab51461037857806367ffb66a146103985780636cc1ae13146103ab5780637301e3c8146103cb57600080fd5b8063544caa56146102c85780635a47ddc3146103085780635e1e63251461034357600080fd5b80630dede6c4146101c957806313dcfc591461020357806318a13086146102305780634386e63c14610250578063448725b4146102705780634c1ee03e1461029057600080fd5b366101c457336001600160a01b037f000000000000000000000000555555555555555555555555555555555555555516146101c2576101c2613908565b005b600080fd5b3480156101d557600080fd5b506101e96101e436600461394f565b6105a9565b604080519283526020830191909152015b60405180910390f35b34801561020f57600080fd5b5061022361021e3660046139d4565b610763565b6040516101fa9190613a4f565b34801561023c57600080fd5b5061022361024b366004613ad8565b610976565b34801561025c57600080fd5b506101e961026b366004613b4b565b610cc1565b34801561027c57600080fd5b506101e961028b366004613bad565b610e28565b34801561029c57600080fd5b506102b06102ab366004613c57565b610f01565b6040516001600160a01b0390911681526020016101fa565b3480156102d457600080fd5b506102e86102e3366004613ca2565b611009565b604080516001600160a01b039384168152929091166020830152016101fa565b34801561031457600080fd5b50610328610323366004613cdb565b6110fc565b604080519384526020840192909252908201526060016101fa565b34801561034f57600080fd5b5061036361035e366004613d6a565b6111dc565b604080519283529015156020830152016101fa565b34801561038457600080fd5b506101e9610393366004613c57565b611430565b6102236103a6366004613da1565b6114fa565b3480156103b757600080fd5b506101c26103c6366004613ad8565b611859565b3480156103d757600080fd5b506102236103e6366004613e73565b611a46565b6101c26103f9366004613da1565b611b1c565b34801561040a57600080fd5b506101c2610419366004613ad8565b611e09565b34801561042a57600080fd5b50610223610439366004613fb5565b612000565b34801561044a57600080fd5b5061032861045936600461405b565b612282565b34801561046a57600080fd5b506101e96104793660046140b6565b612482565b61032861048c366004614172565b61253d565b34801561049d57600080fd5b506102b07f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe910800981565b3480156104d157600080fd5b506101e96104e0366004614172565b61277e565b3480156104f157600080fd5b506101e9610500366004613bad565b612873565b34801561051157600080fd5b506105256105203660046141cd565b612932565b60405190151581526020016101fa565b34801561054157600080fd5b506102b07f000000000000000000000000555555555555555555555555555555555555555581565b34801561057557600080fd5b50610223610584366004613ad8565b6129c7565b34801561059557600080fd5b506101e96105a4366004614172565b612aec565b60008082428110156105d65760405162461bcd60e51b81526004016105cd906141ea565b60405180910390fd5b60006105e38c8c8c610f01565b6040516323b872dd60e01b81523360048201526001600160a01b03821660248201819052604482018c90529192506323b872dd906064016020604051808303816000875af1158015610639573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061065d9190614219565b61066657600080fd5b60405163226bf2d160e21b81526001600160a01b03878116600483015260009182918416906389afcb449060240160408051808303816000875af11580156106b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906106d69190614236565b9150915060006106e68f8f611009565b509050806001600160a01b03168f6001600160a01b03161461070957818361070c565b82825b90975095508a8710156107315760405162461bcd60e51b81526004016105cd9061425a565b898610156107515760405162461bcd60e51b81526004016105cd9061429d565b50505050509850989650505050505050565b606081428110156107865760405162461bcd60e51b81526004016105cd906141ea565b604080516001808252818301909252600091816020015b604080516060810182526000808252602080830182905292820152825260001990920191018161079d57905050905087816000815181106107e0576107e06142e0565b6020026020010151600001906001600160a01b031690816001600160a01b0316815250508681600081518110610818576108186142e0565b6020026020010151602001906001600160a01b031690816001600160a01b0316815250508581600081518110610850576108506142e0565b602090810291909101015190151560409091015261086e8a82612000565b9250888360018551610880919061430c565b81518110610890576108906142e0565b602002602001015110156108b65760405162461bcd60e51b81526004016105cd90614323565b61095e816000815181106108cc576108cc6142e0565b6020026020010151600001513361093e846000815181106108ef576108ef6142e0565b6020026020010151600001518560008151811061090e5761090e6142e0565b6020026020010151602001518660008151811061092d5761092d6142e0565b602002602001015160400151610f01565b86600081518110610951576109516142e0565b6020026020010151612bba565b610969838287612cb2565b5050979650505050505050565b606081428110156109995760405162461bcd60e51b81526004016105cd906141ea565b6001600160a01b037f00000000000000000000000055555555555555555555555555555555555555551686866109d060018261430c565b8181106109df576109df6142e0565b90506060020160200160208101906109f791906141cd565b6001600160a01b031614610a1d5760405162461bcd60e51b81526004016105cd9061436b565b610a79888787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f57610a60606083028601368190038101906143a2565b81526020019060010190610a43565b5050505050612000565b9150868260018451610a8b919061430c565b81518110610a9b57610a9b6142e0565b60200260200101511015610ac15760405162461bcd60e51b81526004016105cd90614323565b610b8386866000818110610ad757610ad76142e0565b610aed92602060609092020190810191506141cd565b33610b7089896000818110610b0457610b046142e0565b610b1a92602060609092020190810191506141cd565b8a8a6000818110610b2d57610b2d6142e0565b9050606002016020016020810190610b4591906141cd565b8b8b6000818110610b5857610b586142e0565b90506060020160400160208101906102ab91906143be565b85600081518110610951576109516142e0565b610be0828787808060200260200160405190810160405280939291908181526020016000905b82821015610bd557610bc6606083028601368190038101906143a2565b81526020019060010190610ba9565b505050505030612cb2565b7f00000000000000000000000055555555555555555555555555555555555555556001600160a01b0316632e1a7d4d8360018551610c1e919061430c565b81518110610c2e57610c2e6142e0565b60200260200101516040518263ffffffff1660e01b8152600401610c5491815260200190565b600060405180830381600087803b158015610c6e57600080fd5b505af1158015610c82573d6000803e3d6000fd5b50505050610cb6848360018551610c99919061430c565b81518110610ca957610ca96142e0565b6020026020010151612fc5565b509695505050505050565b60008060007f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe91080096001600160a01b0316636801cc308888886040518463ffffffff1660e01b8152600401610d16939291906143db565b602060405180830381865afa158015610d33573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5791906143ff565b90506001600160a01b038116610d74576000809250925050610e1f565b600080610d82898989611430565b915091506000836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610dc6573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dea919061441c565b905080610df78489614435565b610e019190614454565b955080610e0e8389614435565b610e189190614454565b9450505050505b94509492505050565b6000806000610e588e7f00000000000000000000000055555555555555555555555555555555555555558f610f01565b9050600087610e67578c610e6b565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf90610ea6903390309086908f908e908e908e90600401614476565b600060405180830381600087803b158015610ec057600080fd5b505af1158015610ed4573d6000803e3d6000fd5b50505050610ee78f8f8f8f8f8f8f61277e565b809450819550505050509b509b9950505050505050505050565b6000806000610f108686611009565b6040516bffffffffffffffffffffffff19606084811b8216602084015283901b16603482015286151560f81b604882015291935091507f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe910800990604901604051602081830303815290604052805190602001207facf91715fc9ebfdee3c71c19f6f435248634be0b8adc0034420455b302d8dde9604051602001610fe7939291906001600160f81b0319815260609390931b6bffffffffffffffffffffffff191660018401526015830191909152603582015260550190565b60408051601f1981840301815291905280516020909101209695505050505050565b600080826001600160a01b0316846001600160a01b0316036110775760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a204944454e544943414c5f41444452455353456044820152605360f81b60648201526084016105cd565b826001600160a01b0316846001600160a01b03161061109757828461109a565b83835b90925090506001600160a01b0382166110f55760405162461bcd60e51b815260206004820152601a60248201527f426173655631526f757465723a205a45524f5f4144445245535300000000000060448201526064016105cd565b9250929050565b600080600083428110156111225760405162461bcd60e51b81526004016105cd906141ea565b6111318d8d8d8d8d8d8d613093565b909450925060006111438e8e8e610f01565b90506111518e338388612bba565b61115d8d338387612bba565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af11580156111a5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111c9919061441c565b9250505099509950999650505050505050565b60008060006111ed85856001610f01565b60405163e5e31b1360e01b81526001600160a01b03828116600483015291925060009182917f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe91080099091169063e5e31b1390602401602060405180830381865afa15801561125d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112819190614219565b156112fa576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa1580156112d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f7919061441c565b91505b61130687876000610f01565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529194507f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe91080099091169063e5e31b1390602401602060405180830381865afa158015611371573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113959190614219565b1561140e576040516378a051ad60e11b8152600481018990526001600160a01b03888116602483015284169063f140a35a90604401602060405180830381865afa1580156113e7573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061140b919061441c565b90505b80821161141d57806000611421565b8160015b94509450505050935093915050565b600080600061143f8686611009565b509050600080611450888888610f01565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa15801561148d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b191906144ce565b506001600160701b031691506001600160701b03169150826001600160a01b0316886001600160a01b0316146114e85780826114eb565b81815b90999098509650505050505050565b6060814281101561151d5760405162461bcd60e51b81526004016105cd906141ea565b7f00000000000000000000000055555555555555555555555555555555555555556001600160a01b03168686600081811061155a5761155a6142e0565b61157092602060609092020190810191506141cd565b6001600160a01b0316146115965760405162461bcd60e51b81526004016105cd9061436b565b6115e8348787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f576115d9606083028601368190038101906143a2565b815260200190600101906115bc565b91508682600184516115fa919061430c565b8151811061160a5761160a6142e0565b602002602001015110156116305760405162461bcd60e51b81526004016105cd90614323565b7f00000000000000000000000055555555555555555555555555555555555555556001600160a01b031663d0e30db083600081518110611672576116726142e0565b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b1580156116a557600080fd5b505af11580156116b9573d6000803e3d6000fd5b50505050507f00000000000000000000000055555555555555555555555555555555555555556001600160a01b031663a9059cbb61175788886000818110611703576117036142e0565b61171992602060609092020190810191506141cd565b8989600081811061172c5761172c6142e0565b905060600201602001602081019061174491906141cd565b8a8a6000818110610b5857610b586142e0565b8460008151811061176a5761176a6142e0565b60200260200101516040518363ffffffff1660e01b81526004016117a39291906001600160a01b03929092168252602082015260400190565b6020604051808303816000875af11580156117c2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117e69190614219565b6117f2576117f2613908565b61184f828787808060200260200160405190810160405280939291908181526020016000905b8282101561184457611835606083028601368190038101906143a2565b81526020019060010190611818565b505050505086612cb2565b5095945050505050565b804281101561187a5760405162461bcd60e51b81526004016105cd906141ea565b6118c385856000818110611890576118906142e0565b6118a692602060609092020190810191506141cd565b336118bd88886000818110611703576117036142e0565b8a612bba565b600085856118d260018261430c565b8181106118e1576118e16142e0565b90506060020160200160208101906118f991906141cd565b6040516370a0823160e01b81526001600160a01b03868116600483015291909116906370a0823190602401602060405180830381865afa158015611941573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611965919061441c565b90506119728686866132b1565b86611a1e82888861198460018261430c565b818110611993576119936142e0565b90506060020160200160208101906119ab91906141cd565b6040516370a0823160e01b81526001600160a01b03898116600483015291909116906370a08231906024015b602060405180830381865afa1580156119f4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a18919061441c565b9061365d565b1015611a3c5760405162461bcd60e51b81526004016105cd90614323565b5050505050505050565b60608142811015611a695760405162461bcd60e51b81526004016105cd906141ea565b611abf86866000818110611a7f57611a7f6142e0565b611a9592602060609092020190810191506141cd565b33611aac89896000818110610b0457610b046142e0565b8a600081518110610951576109516142e0565b611b11878787808060200260200160405190810160405280939291908181526020016000905b8282101561184457611b02606083028601368190038101906143a2565b81526020019060010190611ae5565b509495945050505050565b8042811015611b3d5760405162461bcd60e51b81526004016105cd906141ea565b7f00000000000000000000000055555555555555555555555555555555555555556001600160a01b031685856000818110611b7a57611b7a6142e0565b611b9092602060609092020190810191506141cd565b6001600160a01b031614611bb65760405162461bcd60e51b81526004016105cd9061436b565b60003490507f00000000000000000000000055555555555555555555555555555555555555556001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b158015611c1657600080fd5b505af1158015611c2a573d6000803e3d6000fd5b50505050507f00000000000000000000000055555555555555555555555555555555555555556001600160a01b031663a9059cbb611c7488886000818110611703576117036142e0565b6040516001600160e01b031960e084901b1681526001600160a01b039091166004820152602481018490526044016020604051808303816000875af1158015611cc1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ce59190614219565b611cf157611cf1613908565b60008686611d0060018261430c565b818110611d0f57611d0f6142e0565b9050606002016020016020810190611d2791906141cd565b6040516370a0823160e01b81526001600160a01b03878116600483015291909116906370a0823190602401602060405180830381865afa158015611d6f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611d93919061441c565b9050611da08787876132b1565b87611a1e828989611db260018261430c565b818110611dc157611dc16142e0565b9050606002016020016020810190611dd991906141cd565b6040516370a0823160e01b81526001600160a01b038a8116600483015291909116906370a08231906024016119d7565b8042811015611e2a5760405162461bcd60e51b81526004016105cd906141ea565b6001600160a01b037f0000000000000000000000005555555555555555555555555555555555555555168585611e6160018261430c565b818110611e7057611e706142e0565b9050606002016020016020810190611e8891906141cd565b6001600160a01b031614611eae5760405162461bcd60e51b81526004016105cd9061436b565b611ec485856000818110611890576118906142e0565b611ecf8585306132b1565b6040516370a0823160e01b81523060048201526000907f00000000000000000000000055555555555555555555555555555555555555556001600160a01b0316906370a0823190602401602060405180830381865afa158015611f36573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5a919061441c565b905086811015611f7c5760405162461bcd60e51b81526004016105cd90614323565b604051632e1a7d4d60e01b8152600481018290527f00000000000000000000000055555555555555555555555555555555555555556001600160a01b031690632e1a7d4d90602401600060405180830381600087803b158015611fde57600080fd5b505af1158015611ff2573d6000803e3d6000fd5b50505050611a3c8482612fc5565b60606001825110156120245760405162461bcd60e51b81526004016105cd9061436b565b8151612031906001614513565b67ffffffffffffffff81111561204957612049613e08565b604051908082528060200260200182016040528015612072578160200160208202803683370190505b5090508281600081518110612089576120896142e0565b60200260200101818152505060005b825181101561227b5760006120f48483815181106120b8576120b86142e0565b6020026020010151600001518584815181106120d6576120d66142e0565b60200260200101516020015186858151811061092d5761092d6142e0565b60405163e5e31b1360e01b81526001600160a01b0380831660048301529192507f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe91080099091169063e5e31b1390602401602060405180830381865afa15801561215f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121839190614219565b1561226857806001600160a01b031663f140a35a8484815181106121a9576121a96142e0565b60200260200101518685815181106121c3576121c36142e0565b6020026020010151600001516040518363ffffffff1660e01b81526004016121fe9291909182526001600160a01b0316602082015260400190565b602060405180830381865afa15801561221b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061223f919061441c565b8361224b846001614513565b8151811061225b5761225b6142e0565b6020026020010181815250505b50806122738161452b565b915050612098565b5092915050565b6000806000807f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe91080096001600160a01b0316636801cc308a8a8a6040518463ffffffff1660e01b81526004016122d8939291906143db565b602060405180830381865afa1580156122f5573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061231991906143ff565b9050600080806001600160a01b038416156123a357836001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa15801561236c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612390919061441c565b905061239d8c8c8c611430565b90935091505b821580156123af575081155b156123e0578896508795506103e86123cf6123ca888a614435565b6136b1565b6123d9919061430c565b9450612473565b60006123ed8a8585613721565b90508881116124355789975095508561242e8461240a848b614435565b6124149190614454565b8461241f858b614435565b6124299190614454565b613801565b9550612471565b60006124428a8587613721565b985089975088905061246d856124588584614435565b6124629190614454565b8561241f868c614435565b9650505b505b50505050955095509592505050565b60008060006124928f8f8f610f01565b90506000876124a1578c6124a5565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906124e0903390309086908f908e908e908e90600401614476565b600060405180830381600087803b1580156124fa57600080fd5b505af115801561250e573d6000803e3d6000fd5b50505050506125238f8f8f8f8f8f8f8f6105a9565b8093508194505050509c509c9a5050505050505050505050565b600080600083428110156125635760405162461bcd60e51b81526004016105cd906141ea565b6125928b7f00000000000000000000000055555555555555555555555555555555555555558c8c348d8d613093565b909450925060006125c48c7f00000000000000000000000055555555555555555555555555555555555555558d610f01565b90506125d28c338388612bba565b7f00000000000000000000000055555555555555555555555555555555555555556001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b15801561262d57600080fd5b505af1158015612641573d6000803e3d6000fd5b505060405163a9059cbb60e01b81526001600160a01b038581166004830152602482018990527f000000000000000000000000555555555555555555555555555555555555555516935063a9059cbb925060440190506020604051808303816000875af11580156126b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906126da9190614219565b6126e6576126e6613908565b6040516335313c2160e11b81526001600160a01b038881166004830152821690636a627842906024016020604051808303816000875af115801561272e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612752919061441c565b92508334111561276f5761276f3361276a863461430c565b612fc5565b50509750975097945050505050565b60008082428110156127a25760405162461bcd60e51b81526004016105cd906141ea565b6127d28a7f00000000000000000000000055555555555555555555555555555555555555558b8b8b8b308b6105a9565b90935091506127e28a8685613819565b604051632e1a7d4d60e01b8152600481018390527f00000000000000000000000055555555555555555555555555555555555555556001600160a01b031690632e1a7d4d90602401600060405180830381600087803b15801561284457600080fd5b505af1158015612858573d6000803e3d6000fd5b505050506128668583612fc5565b5097509795505050505050565b60008060006128a38e7f00000000000000000000000055555555555555555555555555555555555555558f610f01565b90506000876128b2578c6128b6565b6000195b60405163d505accf60e01b81529091506001600160a01b0383169063d505accf906128f1903390309086908f908e908e908e90600401614476565b600060405180830381600087803b15801561290b57600080fd5b505af115801561291f573d6000803e3d6000fd5b50505050610ee78f8f8f8f8f8f8f612aec565b60405163e5e31b1360e01b81526001600160a01b0382811660048301526000917f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe91080099091169063e5e31b1390602401602060405180830381865afa15801561299d573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906129c19190614219565b92915050565b606081428110156129ea5760405162461bcd60e51b81526004016105cd906141ea565b612a3c888787808060200260200160405190810160405280939291908181526020016000905b82821015610a6f57612a2d606083028601368190038101906143a2565b81526020019060010190612a10565b9150868260018451612a4e919061430c565b81518110612a5e57612a5e6142e0565b60200260200101511015612a845760405162461bcd60e51b81526004016105cd90614323565b612a9a86866000818110610ad757610ad76142e0565b610cb6828787808060200260200160405190810160405280939291908181526020016000905b8282101561184457612add606083028601368190038101906143a2565b81526020019060010190612ac0565b6000808242811015612b105760405162461bcd60e51b81526004016105cd906141ea565b612b408a7f00000000000000000000000055555555555555555555555555555555555555558b8b8b8b308b6105a9565b6040516370a0823160e01b815230600482015291945092506127e2908b9087906001600160a01b038316906370a0823190602401602060405180830381865afa158015612b91573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612bb5919061441c565b613819565b6000846001600160a01b03163b11612bd157600080fd5b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b1790529151600092839290881691612c359190614570565b6000604051808303816000865af19150503d8060008114612c72576040519150601f19603f3d011682016040523d82523d6000602084013e612c77565b606091505b5091509150818015612ca1575080511580612ca1575080806020019051810190612ca19190614219565b612caa57600080fd5b505050505050565b60005b8251811015612fbf576000612d04848381518110612cd557612cd56142e0565b602002602001015160000151858481518110612cf357612cf36142e0565b602002602001015160200151611009565b509050600085612d15846001614513565b81518110612d2557612d256142e0565b60200260200101519050600080836001600160a01b0316878681518110612d4e57612d4e6142e0565b6020026020010151600001516001600160a01b031614612d7057826000612d74565b6000835b91509150600060018851612d88919061430c565b8610612d945786612e07565b612e0788612da3886001614513565b81518110612db357612db36142e0565b60200260200101516000015189886001612dcd9190614513565b81518110612ddd57612ddd6142e0565b6020026020010151602001518a896001612df79190614513565b8151811061092d5761092d6142e0565b9050612e5a888781518110612e1e57612e1e6142e0565b602002602001015160000151898881518110612e3c57612e3c6142e0565b6020026020010151602001518a898151811061092d5761092d6142e0565b6001600160a01b031663022c0d9f84848460006040519080825280601f01601f191660200182016040528015612e97576020820181803683370190505b506040518563ffffffff1660e01b8152600401612eb7949392919061458c565b600060405180830381600087803b158015612ed157600080fd5b505af1158015612ee5573d6000803e3d6000fd5b50505050866001600160a01b0316336001600160a01b03167f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e508b8981518110612f3057612f306142e0565b60200260200101518b8a81518110612f4a57612f4a6142e0565b6020026020010151600001518c8b81518110612f6857612f686142e0565b602002602001015160400151604051612f9f939291909283526001600160a01b039190911660208301521515604082015260600190565b60405180910390a350505050508080612fb79061452b565b915050612cb5565b50505050565b604080516000808252602082019092526001600160a01b038416908390604051612fef9190614570565b60006040518083038185875af1925050503d806000811461302c576040519150601f19603f3d011682016040523d82523d6000602084013e613031565b606091505b505090508061308e5760405162461bcd60e51b815260206004820152602360248201527f5472616e7366657248656c7065723a204554485f5452414e534645525f46414960448201526213115160ea1b60648201526084016105cd565b505050565b600080838610156130a357600080fd5b828510156130b057600080fd5b6040516306801cc360e41b81526000906001600160a01b037f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe91080091690636801cc3090613103908d908d908d906004016143db565b602060405180830381865afa158015613120573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061314491906143ff565b90506001600160a01b0381166131ea576040516320b7f73960e21b81526001600160a01b037f0000000000000000000000009c7397c9c5ecc400992843408d3a283fe910800916906382dfdce4906131a4908d908d908d906004016143db565b6020604051808303816000875af11580156131c3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906131e791906143ff565b90505b6000806131f88c8c8c611430565b9150915081600014801561320a575080155b1561321a578894508793506132a2565b60006132278a8484613721565b905088811161325b57868110156132505760405162461bcd60e51b81526004016105cd9061429d565b8995509350836132a0565b60006132688a8486613721565b90508a81111561327a5761327a613908565b8881101561329a5760405162461bcd60e51b81526004016105cd9061425a565b95508894505b505b50505097509795505050505050565b60005b82811015612fbf576000808585848181106132d1576132d16142e0565b6132e792602060609092020190810191506141cd565b8686858181106132f9576132f96142e0565b905060600201602001602081019061331191906141cd565b9150915060006133218383611009565b509050600061338d88888781811061333b5761333b6142e0565b61335192602060609092020190810191506141cd565b898988818110613363576133636142e0565b905060600201602001602081019061337b91906141cd565b8a8a89818110610b5857610b586142e0565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b8152600401606060405180830381865afa1580156133d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906133f791906144ce565b506001600160701b031691506001600160701b031691506000866001600160a01b0316896001600160a01b031614613430578183613433565b82825b506040516370a0823160e01b81526001600160a01b03888116600483015291925061346c918391908c16906370a08231906024016119d7565b9450613479858a8a6111dc565b5080945050505050600080856001600160a01b0316886001600160a01b0316146134a5578260006134a9565b6000835b909250905060006134bb60018d61430c565b8a106134c7578a61354c565b61354c8d8d6134d78d6001614513565b8181106134e6576134e66142e0565b6134fc92602060609092020190810191506141cd565b8e8e6135098e6001614513565b818110613518576135186142e0565b905060600201602001602081019061353091906141cd565b8f8f61353d8f6001614513565b818110610b5857610b586142e0565b6040805160008152602081019182905263022c0d9f60e01b9091529091506001600160a01b0387169063022c0d9f9061358e908690869086906024810161458c565b600060405180830381600087803b1580156135a857600080fd5b505af11580156135bc573d6000803e3d6000fd5b5050505060008d8d8c8181106135d4576135d46142e0565b90506060020160400160208101906135ec91906143be565b604080518881526001600160a01b038d81166020830152831515828401529151929350908e169133917f423c093a1f80c354c75d4f9e86fde37d7c9014453df9643f585a1b199d094e50919081900360600190a35050505050505050505080806136559061452b565b9150506132b4565b60008261366a838261430c565b91508111156129c15760405162461bcd60e51b81526020600482015260136024820152724d6174683a205375622d756e646572666c6f7760681b60448201526064016105cd565b6000600382111561371257508060006136cb600283614454565b6136d6906001614513565b90505b8181101561370c579050806002816136f18186614454565b6136fb9190614513565b6137059190614454565b90506136d9565b50919050565b811561371c575060015b919050565b600080841161377c5760405162461bcd60e51b815260206004820152602160248201527f426173655631526f757465723a20494e53554646494349454e545f414d4f554e6044820152601560fa1b60648201526084016105cd565b60008311801561378c5750600082115b6137e45760405162461bcd60e51b8152602060048201526024808201527f426173655631526f757465723a20494e53554646494349454e545f4c495155496044820152634449545960e01b60648201526084016105cd565b826137ef8386614435565b6137f99190614454565b949350505050565b60008183106138105781613812565b825b9392505050565b6000836001600160a01b03163b1161383057600080fd5b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b179052915160009283929087169161388c9190614570565b6000604051808303816000865af19150503d80600081146138c9576040519150601f19603f3d011682016040523d82523d6000602084013e6138ce565b606091505b50915091508180156138f85750805115806138f85750808060200190518101906138f89190614219565b61390157600080fd5b5050505050565b634e487b7160e01b600052600160045260246000fd5b6001600160a01b038116811461393357600080fd5b50565b803561371c8161391e565b801515811461393357600080fd5b600080600080600080600080610100898b03121561396c57600080fd5b88356139778161391e565b975060208901356139878161391e565b9650604089013561399781613941565b9550606089013594506080890135935060a0890135925060c08901356139bc8161391e565b8092505060e089013590509295985092959890939650565b600080600080600080600060e0888a0312156139ef57600080fd5b87359650602088013595506040880135613a088161391e565b94506060880135613a188161391e565b93506080880135613a2881613941565b925060a0880135613a388161391e565b8092505060c0880135905092959891949750929550565b6020808252825182820181905260009190848201906040850190845b81811015613a8757835183529284019291840191600101613a6b565b50909695505050505050565b60008083601f840112613aa557600080fd5b50813567ffffffffffffffff811115613abd57600080fd5b6020830191508360206060830285010111156110f557600080fd5b60008060008060008060a08789031215613af157600080fd5b8635955060208701359450604087013567ffffffffffffffff811115613b1657600080fd5b613b2289828a01613a93565b9095509350506060870135613b368161391e565b80925050608087013590509295509295509295565b60008060008060808587031215613b6157600080fd5b8435613b6c8161391e565b93506020850135613b7c8161391e565b92506040850135613b8c81613941565b9396929550929360600135925050565b803560ff8116811461371c57600080fd5b60008060008060008060008060008060006101608c8e031215613bcf57600080fd5b8b35613bda8161391e565b9a5060208c0135613bea81613941565b995060408c0135985060608c0135975060808c0135965060a08c0135613c0f8161391e565b955060c08c0135945060e08c0135613c2681613941565b9350613c356101008d01613b9c565b92506101208c013591506101408c013590509295989b509295989b9093969950565b600080600060608486031215613c6c57600080fd5b8335613c778161391e565b92506020840135613c878161391e565b91506040840135613c9781613941565b809150509250925092565b60008060408385031215613cb557600080fd5b8235613cc08161391e565b91506020830135613cd08161391e565b809150509250929050565b60008060008060008060008060006101208a8c031215613cfa57600080fd5b8935613d058161391e565b985060208a0135613d158161391e565b975060408a0135613d2581613941565b965060608a0135955060808a0135945060a08a0135935060c08a0135925060e08a0135613d518161391e565b809250506101008a013590509295985092959850929598565b600080600060608486031215613d7f57600080fd5b833592506020840135613d918161391e565b91506040840135613c978161391e565b600080600080600060808688031215613db957600080fd5b85359450602086013567ffffffffffffffff811115613dd757600080fd5b613de388828901613a93565b9095509350506040860135613df78161391e565b949793965091946060013592915050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613e4757613e47613e08565b604052919050565b600067ffffffffffffffff821115613e6957613e69613e08565b5060051b60200190565b600080600080600060808688031215613e8b57600080fd5b853567ffffffffffffffff80821115613ea357600080fd5b818801915088601f830112613eb757600080fd5b81356020613ecc613ec783613e4f565b613e1e565b82815260059290921b8401810191818101908c841115613eeb57600080fd5b948201945b83861015613f0957853582529482019490820190613ef0565b99505089013592505080821115613f1f57600080fd5b50613f2c88828901613a93565b9095509350613df7905060408701613936565b600060608284031215613f5157600080fd5b6040516060810181811067ffffffffffffffff82111715613f7457613f74613e08565b6040529050808235613f858161391e565b81526020830135613f958161391e565b60208201526040830135613fa881613941565b6040919091015292915050565b60008060408385031215613fc857600080fd5b8235915060208084013567ffffffffffffffff811115613fe757600080fd5b8401601f81018613613ff857600080fd5b8035614006613ec782613e4f565b8181526060918202830184019184820191908984111561402557600080fd5b938501935b8385101561404b5761403c8a86613f3f565b8352938401939185019161402a565b5080955050505050509250929050565b600080600080600060a0868803121561407357600080fd5b853561407e8161391e565b9450602086013561408e8161391e565b9350604086013561409e81613941565b94979396509394606081013594506080013592915050565b6000806000806000806000806000806000806101808d8f0312156140d957600080fd5b8c356140e48161391e565b9b5060208d01356140f48161391e565b9a5060408d013561410481613941565b995060608d0135985060808d0135975060a08d0135965060c08d01356141298161391e565b955060e08d013594506101008d013561414181613941565b93506141506101208e01613b9c565b92506101408d013591506101608d013590509295989b509295989b509295989b565b600080600080600080600060e0888a03121561418d57600080fd5b87356141988161391e565b965060208801356141a881613941565b955060408801359450606088013593506080880135925060a0880135613a388161391e565b6000602082840312156141df57600080fd5b81356138128161391e565b60208082526015908201527410985cd9558c549bdd5d195c8e8811561412549151605a1b604082015260600190565b60006020828403121561422b57600080fd5b815161381281613941565b6000806040838503121561424957600080fd5b505080516020909101519092909150565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f415f414d4f60408201526215539560ea1b606082015260800190565b60208082526023908201527f426173655631526f757465723a20494e53554646494349454e545f425f414d4f60408201526215539560ea1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052601160045260246000fd5b60008282101561431e5761431e6142f6565b500390565b60208082526028908201527f426173655631526f757465723a20494e53554646494349454e545f4f555450556040820152671517d05353d5539560c21b606082015260800190565b6020808252601a908201527f426173655631526f757465723a20494e56414c49445f50415448000000000000604082015260600190565b6000606082840312156143b457600080fd5b6138128383613f3f565b6000602082840312156143d057600080fd5b813561381281613941565b6001600160a01b039384168152919092166020820152901515604082015260600190565b60006020828403121561441157600080fd5b81516138128161391e565b60006020828403121561442e57600080fd5b5051919050565b600081600019048311821515161561444f5761444f6142f6565b500290565b60008261447157634e487b7160e01b600052601260045260246000fd5b500490565b6001600160a01b0397881681529590961660208601526040850193909352606084019190915260ff16608083015260a082015260c081019190915260e00190565b80516001600160701b038116811461371c57600080fd5b6000806000606084860312156144e357600080fd5b6144ec846144b7565b92506144fa602085016144b7565b9150604084015163ffffffff81168114613c9757600080fd5b60008219821115614526576145266142f6565b500190565b60006001820161453d5761453d6142f6565b5060010190565b60005b8381101561455f578181015183820152602001614547565b83811115612fbf5750506000910152565b60008251614582818460208701614544565b9190910192915050565b84815283602082015260018060a01b038316604082015260806060820152600082518060808401526145c58160a0850160208701614544565b601f01601f19169190910160a0019594505050505056fea2646970667358221220162e9fe4f9be2e543f3a62d84003b16a2a0d005fd410f598fa2c2249847f6eec64736f6c634300080d0033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000009c7397c9c5ecc400992843408d3a283fe91080090000000000000000000000005555555555555555555555555555555555555555
-----Decoded View---------------
Arg [0] : _factory (address): 0x9c7397c9C5ecC400992843408D3A283fE9108009
Arg [1] : _wETH (address): 0x5555555555555555555555555555555555555555
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000009c7397c9c5ecc400992843408d3a283fe9108009
Arg [1] : 0000000000000000000000005555555555555555555555555555555555555555
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 35 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.