Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 683 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Swap Exact Token... | 17767105 | 403 days ago | IN | 0 ETH | 0.00469108 | ||||
Swap Exact ETH F... | 17765132 | 403 days ago | IN | 0.54 ETH | 0.00625131 | ||||
Swap Exact Token... | 17696491 | 412 days ago | IN | 0 ETH | 0.00204414 | ||||
Swap Exact ETH F... | 17675067 | 416 days ago | IN | 0.0001 ETH | 0.00229302 | ||||
Remove Liquidity... | 17578117 | 429 days ago | IN | 0 ETH | 0.0031551 | ||||
Swap Exact ETH F... | 17509105 | 439 days ago | IN | 0.01046575 ETH | 0.00239675 | ||||
Swap Exact Token... | 17497746 | 440 days ago | IN | 0 ETH | 0.00275202 | ||||
Swap Exact ETH F... | 17495652 | 441 days ago | IN | 0.15 ETH | 0.00292738 | ||||
Swap Exact ETH F... | 17495649 | 441 days ago | IN | 0.15 ETH | 0.00341234 | ||||
Remove Liquidity... | 17491872 | 441 days ago | IN | 0 ETH | 0.0029554 | ||||
Swap Exact ETH F... | 17489646 | 442 days ago | IN | 0.229488 ETH | 0.00265808 | ||||
Swap Exact Token... | 17461506 | 446 days ago | IN | 0 ETH | 0.00242668 | ||||
Swap Exact Token... | 17447745 | 447 days ago | IN | 0 ETH | 0.00634135 | ||||
Swap Exact Token... | 17429641 | 450 days ago | IN | 0 ETH | 0.00506299 | ||||
Swap Exact Token... | 17427564 | 450 days ago | IN | 0 ETH | 0.00357011 | ||||
Swap Exact Token... | 17346903 | 462 days ago | IN | 0 ETH | 0.00400133 | ||||
Remove Liquidity... | 17320762 | 465 days ago | IN | 0 ETH | 0.01135727 | ||||
Add Liquidity ET... | 17309342 | 467 days ago | IN | 0.00633928 ETH | 0.00944793 | ||||
Swap Exact Token... | 17301056 | 468 days ago | IN | 0 ETH | 0.00579442 | ||||
Remove Liquidity... | 17295035 | 469 days ago | IN | 0 ETH | 0.00896383 | ||||
Swap Exact Token... | 17250003 | 475 days ago | IN | 0 ETH | 0.00629631 | ||||
Swap Exact Token... | 17199837 | 482 days ago | IN | 0 ETH | 0.02343761 | ||||
Swap Exact Token... | 17195615 | 483 days ago | IN | 0 ETH | 0.03459881 | ||||
Swap Exact Token... | 17180996 | 485 days ago | IN | 0 ETH | 0.01390233 | ||||
Swap Exact Token... | 17180643 | 485 days ago | IN | 0 ETH | 0.01181499 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Block | From | To | |||
---|---|---|---|---|---|---|
20385127 | 36 days ago | 0.09291867 ETH | ||||
20385127 | 36 days ago | 0.09291867 ETH | ||||
19333313 | 183 days ago | 0.4658389 ETH | ||||
19333313 | 183 days ago | 0.4658389 ETH | ||||
19101732 | 216 days ago | 0.24183814 ETH | ||||
19101732 | 216 days ago | 0.24183814 ETH | ||||
19050995 | 223 days ago | 0.03768471 ETH | ||||
19050995 | 223 days ago | 0.03768471 ETH | ||||
18718891 | 269 days ago | 0.37732653 ETH | ||||
18718891 | 269 days ago | 0.37732653 ETH | ||||
18602007 | 286 days ago | 0.23654113 ETH | ||||
18602007 | 286 days ago | 0.23654113 ETH | ||||
18467953 | 304 days ago | 0.24209062 ETH | ||||
18467953 | 304 days ago | 0.24209062 ETH | ||||
18424435 | 311 days ago | 0.16948593 ETH | ||||
18424435 | 311 days ago | 0.16948593 ETH | ||||
18346305 | 321 days ago | 0.11459375 ETH | ||||
18346305 | 321 days ago | 0.11459375 ETH | ||||
18337708 | 323 days ago | 0.11175395 ETH | ||||
18337708 | 323 days ago | 0.11175395 ETH | ||||
18024298 | 367 days ago | 0.00236141 ETH | ||||
18024298 | 367 days ago | 0.00236141 ETH | ||||
18024298 | 367 days ago | 0.45399529 ETH | ||||
18024298 | 367 days ago | 0.45399529 ETH | ||||
17916831 | 382 days ago | 0.21185142 ETH |
Loading...
Loading
Contract Name:
UniswapV2Router02
Compiler Version
v0.6.6+commit.6c089d02
Optimization Enabled:
Yes with 200 runs
Other Settings:
default evmVersion
Contract Source Code (Solidity Standard Json-Input format)
pragma solidity =0.6.6; // import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Factory.sol'; import './interfaces/IUniswapV2Pair.sol'; import './interfaces/IUniswapV2Factory.sol'; import '@uniswap/lib/contracts/libraries/TransferHelper.sol'; import './interfaces/IUniswapV2Router02.sol'; import './libraries/UniswapV2Library.sol'; import './libraries/SafeMath.sol'; import './interfaces/IERC20.sol'; import './interfaces/IWETH.sol'; contract UniswapV2Router02 is IUniswapV2Router02 { using SafeMath for uint256; // string public name = 'PolkaBridgeAMM: Router'; address public immutable override factory; address public immutable override WETH; // address public owner; // string public debugStr; modifier ensure(uint256 deadline) { require(deadline >= block.timestamp, 'UniswapV2Router: EXPIRED'); _; } // modifier onlyOwner() { // require(msg.sender == owner, 'Only Owner'); // _; // } constructor(address _factory, address _WETH) public { factory = _factory; WETH = _WETH; // owner = msg.sender; } receive() external payable { require(msg.sender == WETH, 'transfer ETH from unexpected sender'); // only accept ETH via fallback from the WETH contract } // function transferOwnership(address _new_owner) public onlyOwner { // owner = _new_owner; // } // **** ADD LIQUIDITY **** function _addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin ) internal virtual returns (uint256 amountA, uint256 amountB) { // create the pair if it doesn't exist yet if (IUniswapV2Factory(factory).getPair(tokenA, tokenB) == address(0)) { IUniswapV2Factory(factory).createPair(tokenA, tokenB); } (uint256 reserveA, uint256 reserveB) = UniswapV2Library.getReserves(factory, tokenA, tokenB); if (reserveA == 0 && reserveB == 0) { (amountA, amountB) = (amountADesired, amountBDesired); } else { uint256 amountBOptimal = UniswapV2Library.quote(amountADesired, reserveA, reserveB); if (amountBOptimal <= amountBDesired) { require(amountBOptimal >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT'); (amountA, amountB) = (amountADesired, amountBOptimal); } else { uint256 amountAOptimal = UniswapV2Library.quote(amountBDesired, reserveB, reserveA); require(amountAOptimal <= amountADesired, 'amountA should less or equal than amountB'); // assert(amountAOptimal <= amountADesired); require(amountAOptimal >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT'); (amountA, amountB) = (amountAOptimal, amountBDesired); } } } function addLiquidity( address tokenA, address tokenB, uint256 amountADesired, uint256 amountBDesired, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) external virtual override ensure(deadline) returns ( uint256 amountA, uint256 amountB, uint256 liquidity ) { (amountA, amountB) = _addLiquidity(tokenA, tokenB, amountADesired, amountBDesired, amountAMin, amountBMin); address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB); TransferHelper.safeTransferFrom(tokenA, msg.sender, pair, amountA); TransferHelper.safeTransferFrom(tokenB, msg.sender, pair, amountB); liquidity = IUniswapV2Pair(pair).mint(to); } function addLiquidityETH( address token, uint256 amountTokenDesired, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns ( uint256 amountToken, uint256 amountETH, uint256 liquidity ) { (amountToken, amountETH) = _addLiquidity( token, WETH, amountTokenDesired, msg.value, amountTokenMin, amountETHMin ); address pair = UniswapV2Library.pairFor(factory, token, WETH); TransferHelper.safeTransferFrom(token, msg.sender, pair, amountToken); IWETH(WETH).deposit{value: amountETH}(); require(IWETH(WETH).transfer(pair, amountETH), 'WETH transfer failed in addLiquidityETH'); // assert(IWETH(WETH).transfer(pair, amountETH)); liquidity = IUniswapV2Pair(pair).mint(to); // refund dust eth, if any if (msg.value > amountETH) TransferHelper.safeTransferETH(msg.sender, msg.value - amountETH); } // **** REMOVE LIQUIDITY **** function removeLiquidity( address tokenA, address tokenB, uint256 liquidity, uint256 amountAMin, uint256 amountBMin, address to, uint256 deadline ) public virtual override ensure(deadline) returns (uint256 amountA, uint256 amountB) { address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB); bool bTransfered = IUniswapV2Pair(pair).transferFrom(msg.sender, pair, liquidity); require(bTransfered, 'Failed in sending liquidity to pair'); // send liquidity to pair (uint256 amount0, uint256 amount1) = IUniswapV2Pair(pair).burn(to); (address token0, ) = UniswapV2Library.sortTokens(tokenA, tokenB); (amountA, amountB) = tokenA == token0 ? (amount0, amount1) : (amount1, amount0); require(amountA >= amountAMin, 'UniswapV2Router: INSUFFICIENT_A_AMOUNT'); require(amountB >= amountBMin, 'UniswapV2Router: INSUFFICIENT_B_AMOUNT'); } function removeLiquidityETH( address token, uint256 liquidity, uint256 amountTokenMin, uint256 amountETHMin, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256 amountToken, uint256 amountETH) { (amountToken, amountETH) = removeLiquidity( token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline ); TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this))); IWETH(WETH).withdraw(amountETH); TransferHelper.safeTransferETH(to, amountETH); } // function removeLiquidityWithPermit( // address tokenA, // address tokenB, // uint256 liquidity, // uint256 amountAMin, // uint256 amountBMin, // address to, // uint256 deadline, // bool approveMax, // uint8 v, // bytes32 r, // bytes32 s // ) external virtual override returns (uint256 amountA, uint256 amountB) { // address pair = UniswapV2Library.pairFor(factory, tokenA, tokenB); // uint256 value = approveMax ? uint256(-1) : liquidity; // IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); // (amountA, amountB) = removeLiquidity(tokenA, tokenB, liquidity, amountAMin, amountBMin, to, deadline); // } // function removeLiquidityETHWithPermit( // address token, // uint256 liquidity, // uint256 amountTokenMin, // uint256 amountETHMin, // address to, // uint256 deadline, // bool approveMax, // uint8 v, // bytes32 r, // bytes32 s // ) external virtual override returns (uint256 amountToken, uint256 amountETH) { // address pair = UniswapV2Library.pairFor(factory, token, WETH); // uint256 value = approveMax ? uint256(-1) : liquidity; // IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); // (amountToken, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline); // } // **** REMOVE LIQUIDITY (supporting fee-on-transfer tokens) **** // function removeLiquidityETHSupportingFeeOnTransferTokens( // address token, // uint256 liquidity, // uint256 amountTokenMin, // uint256 amountETHMin, // address to, // uint256 deadline // ) public virtual override ensure(deadline) returns (uint256 amountETH) { // // (, amountETH) = removeLiquidity(token, WETH, liquidity, amountTokenMin, amountETHMin, address(this), deadline); // // TransferHelper.safeTransfer(token, to, IERC20(token).balanceOf(address(this))); // // IWETH(WETH).withdraw(amountETH); // // TransferHelper.safeTransferETH(to, amountETH); // (, amountETH) = removeLiquidityETH(token, liquidity, amountTokenMin, amountETHMin, to, deadline); // } // function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( // address token, // uint256 liquidity, // uint256 amountTokenMin, // uint256 amountETHMin, // address to, // uint256 deadline, // bool approveMax, // uint8 v, // bytes32 r, // bytes32 s // ) external virtual override returns (uint256 amountETH) { // address pair = UniswapV2Library.pairFor(factory, token, WETH); // uint256 value = approveMax ? uint256(-1) : liquidity; // IUniswapV2Pair(pair).permit(msg.sender, address(this), value, deadline, v, r, s); // amountETH = removeLiquidityETHSupportingFeeOnTransferTokens( // token, // liquidity, // amountTokenMin, // amountETHMin, // to, // deadline // ); // } // **** SWAP **** // requires the initial amount to have already been sent to the first pair function _swap( uint256[] memory amounts, address[] memory path, address _to ) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = UniswapV2Library.sortTokens(input, output); uint256 amountOut = amounts[i + 1]; (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOut) : (amountOut, uint256(0)); address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to; IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)).swap(amount0Out, amount1Out, to); } } function swapExactTokensForTokens( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { //returns (uint256[] memory amounts) { TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn ); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT' ); // amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path); // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'); // TransferHelper.safeTransferFrom( // path[0], // msg.sender, // UniswapV2Library.pairFor(factory, path[0], path[1]), // // amounts[0] // amountIn // ); // _swap(amounts, path, to); } function swapTokensForExactTokens( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT'); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, to); } function swapExactETHForTokens( uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) { //returns (uint256[] memory amounts) { require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH'); uint256 amountIn = msg.value; IWETH(WETH).deposit{value: amountIn}(); require( IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn), 'UniswapV2Router: WETH transfer failed in swapExactETHForTokens' ); // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn)); uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); _swapSupportingFeeOnTransferTokens(path, to); require( IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT' ); // require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH'); // amounts = UniswapV2Library.getAmountsOut(factory, msg.value, path); // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'); // // IWETH(WETH).deposit{value: amounts[0]}(); // IWETH(WETH).deposit{value: msg.value}(); // require( // // IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]), // IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), msg.value), // 'UniswapV2Router: WETH transfer failed in swapExactETHForTokens' // ); // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0])); // _swap(amounts, path, to); } function swapTokensForExactETH( uint256 amountOut, uint256 amountInMax, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH'); amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path); require(amounts[0] <= amountInMax, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT'); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0] ); _swap(amounts, path, address(this)); IWETH(WETH).withdraw(amounts[amounts.length - 1]); TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapExactTokensForETH( uint256 amountIn, uint256 amountOutMin, address[] calldata path, address to, uint256 deadline ) external virtual override ensure(deadline) { //returns (uint256[] memory amounts) { require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH'); TransferHelper.safeTransferFrom( path[0], msg.sender, UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn ); _swapSupportingFeeOnTransferTokens(path, address(this)); uint256 amountOut = IERC20(WETH).balanceOf(address(this)); require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'); IWETH(WETH).withdraw(amountOut); TransferHelper.safeTransferETH(to, amountOut); // require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH'); // amounts = UniswapV2Library.getAmountsOut(factory, amountIn, path); // require(amounts[amounts.length - 1] >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'); // TransferHelper.safeTransferFrom( // path[0], // msg.sender, // UniswapV2Library.pairFor(factory, path[0], path[1]), // // amounts[0] // amountIn // ); // _swap(amounts, path, address(this)); // IWETH(WETH).withdraw(amounts[amounts.length - 1]); // TransferHelper.safeTransferETH(to, amounts[amounts.length - 1]); } function swapETHForExactTokens( uint256 amountOut, address[] calldata path, address to, uint256 deadline ) external payable virtual override ensure(deadline) returns (uint256[] memory amounts) { require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH'); amounts = UniswapV2Library.getAmountsIn(factory, amountOut, path); require(amounts[0] <= msg.value, 'UniswapV2Router: EXCESSIVE_INPUT_AMOUNT'); IWETH(WETH).deposit{value: amounts[0]}(); require( IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0]), 'UniswapV2Router: WETH transfer failed in swapETHForExactTokens' ); // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amounts[0])); _swap(amounts, path, to); // refund dust eth, if any if (msg.value > amounts[0]) TransferHelper.safeTransferETH(msg.sender, msg.value - amounts[0]); } // **** SWAP (supporting fee-on-transfer tokens) **** // requires the initial amount to have already been sent to the first pair function _swapSupportingFeeOnTransferTokens(address[] memory path, address _to) internal virtual { for (uint256 i; i < path.length - 1; i++) { (address input, address output) = (path[i], path[i + 1]); (address token0, ) = UniswapV2Library.sortTokens(input, output); IUniswapV2Pair pair = IUniswapV2Pair(UniswapV2Library.pairFor(factory, input, output)); uint256 amountInput; uint256 amountOutput; { // scope to avoid stack too deep errors (uint256 reserve0, uint256 reserve1, ) = pair.getReserves(); (uint256 reserveInput, uint256 reserveOutput) = input == token0 ? (reserve0, reserve1) : (reserve1, reserve0); amountInput = IERC20(input).balanceOf(address(pair)).sub(reserveInput); amountOutput = UniswapV2Library.getAmountOut(amountInput, reserveInput, reserveOutput); } (uint256 amount0Out, uint256 amount1Out) = input == token0 ? (uint256(0), amountOutput) : (amountOutput, uint256(0)); address to = i < path.length - 2 ? UniswapV2Library.pairFor(factory, output, path[i + 2]) : _to; pair.swap(amount0Out, amount1Out, to); } } // function swapExactTokensForTokensSupportingFeeOnTransferTokens( // uint256 amountIn, // uint256 amountOutMin, // address[] calldata path, // address to, // uint256 deadline // ) external virtual override ensure(deadline) { // TransferHelper.safeTransferFrom( // path[0], // msg.sender, // UniswapV2Library.pairFor(factory, path[0], path[1]), // amountIn // ); // uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); // _swapSupportingFeeOnTransferTokens(path, to); // require( // IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, // 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT' // ); // } // function swapExactETHForTokensSupportingFeeOnTransferTokens( // uint256 amountOutMin, // address[] calldata path, // address to, // uint256 deadline // ) external payable virtual override ensure(deadline) { // require(path[0] == WETH, 'UniswapV2Router: INVALID_PATH'); // uint256 amountIn = msg.value; // IWETH(WETH).deposit{value: amountIn}(); // require( // IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn), // 'UniswapV2Router: WETH transfer failed in swapExactETHForTokensSupportingFeeOnTransferTokens' // ); // assert(IWETH(WETH).transfer(UniswapV2Library.pairFor(factory, path[0], path[1]), amountIn)); // uint256 balanceBefore = IERC20(path[path.length - 1]).balanceOf(to); // _swapSupportingFeeOnTransferTokens(path, to); // require( // IERC20(path[path.length - 1]).balanceOf(to).sub(balanceBefore) >= amountOutMin, // 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT' // ); // } // function swapExactTokensForETHSupportingFeeOnTransferTokens( // uint256 amountIn, // uint256 amountOutMin, // address[] calldata path, // address to, // uint256 deadline // ) external virtual override ensure(deadline) { // require(path[path.length - 1] == WETH, 'UniswapV2Router: INVALID_PATH'); // TransferHelper.safeTransferFrom( // path[0], // msg.sender, // UniswapV2Library.pairFor(factory, path[0], path[1]), // amountIn // ); // _swapSupportingFeeOnTransferTokens(path, address(this)); // uint256 amountOut = IERC20(WETH).balanceOf(address(this)); // require(amountOut >= amountOutMin, 'UniswapV2Router: INSUFFICIENT_OUTPUT_AMOUNT'); // IWETH(WETH).withdraw(amountOut); // TransferHelper.safeTransferETH(to, amountOut); // } // **** LIBRARY FUNCTIONS **** function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) external pure virtual override returns (uint256 amountB) { return UniswapV2Library.quote(amountA, reserveA, reserveB); } function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) external pure virtual override returns (uint256 amountOut) { return UniswapV2Library.getAmountOut(amountIn, reserveIn, reserveOut); } function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) external pure virtual override returns (uint256 amountIn) { return UniswapV2Library.getAmountIn(amountOut, reserveIn, reserveOut); } function getAmountsOut(uint256 amountIn, address[] calldata path) external view virtual override returns (uint256[] memory amounts) { return UniswapV2Library.getAmountsOut(factory, amountIn, path); } function getAmountsIn(uint256 amountOut, address[] calldata path) external view virtual override returns (uint256[] memory amounts) { return UniswapV2Library.getAmountsIn(factory, amountOut, path); } }
pragma solidity 0.6.6; // import '@uniswap/v2-core/contracts/interfaces/IUniswapV2Pair.sol'; import '../interfaces/IUniswapV2Pair.sol'; import './SafeMath.sol'; library UniswapV2Library { using SafeMath for uint256; // returns sorted token addresses, used to handle return values from pairs sorted in this order function sortTokens(address tokenA, address tokenB) internal pure returns (address token0, address token1) { require(tokenA != tokenB, 'UniswapV2Library: IDENTICAL_ADDRESSES'); (token0, token1) = tokenA < tokenB ? (tokenA, tokenB) : (tokenB, tokenA); require(token0 != address(0), 'UniswapV2Library: ZERO_ADDRESS'); } // calculates the CREATE2 address for a pair without making any external calls function pairFor( address factory, address tokenA, address tokenB ) internal pure returns (address pair) { (address token0, address token1) = sortTokens(tokenA, tokenB); pair = address( uint256( keccak256( abi.encodePacked( hex'ff', factory, keccak256(abi.encodePacked(token0, token1)), hex'8b59d0fbd3a2da5e26f61e1d4b91f355d2c382ec32c993635b0d80dce6e1ef1c' // init code hash of factory ) ) ) ); } // fetches and sorts the reserves for a pair function getReserves( address factory, address tokenA, address tokenB ) internal view returns (uint256 reserveA, uint256 reserveB) { (address token0, ) = sortTokens(tokenA, tokenB); (uint256 reserve0, uint256 reserve1, ) = IUniswapV2Pair(pairFor(factory, tokenA, tokenB)).getReserves(); (reserveA, reserveB) = tokenA == token0 ? (reserve0, reserve1) : (reserve1, reserve0); } // given some amount of an asset and pair reserves, returns an equivalent amount of the other asset function quote( uint256 amountA, uint256 reserveA, uint256 reserveB ) internal pure returns (uint256 amountB) { require(amountA > 0, 'UniswapV2Library: INSUFFICIENT_AMOUNT'); require(reserveA > 0 && reserveB > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY'); amountB = amountA.mul(reserveB) / reserveA; } // given an input amount of an asset and pair reserves, returns the maximum output amount of the other asset function getAmountOut( uint256 amountIn, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountOut) { require(amountIn > 0, 'UniswapV2Library: INSUFFICIENT_INPUT_AMOUNT'); require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY'); uint256 amountInWithFee = amountIn.mul(998); // uint256 amountInWithFee = amountIn.mul(9984); uint256 numerator = amountInWithFee.mul(reserveOut); uint256 denominator = reserveIn.mul(1000).add(amountInWithFee); amountOut = numerator / denominator; } // given an output amount of an asset and pair reserves, returns a required input amount of the other asset function getAmountIn( uint256 amountOut, uint256 reserveIn, uint256 reserveOut ) internal pure returns (uint256 amountIn) { require(amountOut > 0, 'UniswapV2Library: INSUFFICIENT_OUTPUT_AMOUNT'); require(reserveIn > 0 && reserveOut > 0, 'UniswapV2Library: INSUFFICIENT_LIQUIDITY'); // uint256 numerator = reserveIn.mul(amountOut).mul(10000); uint256 numerator = reserveIn.mul(amountOut).mul(1000); // uint256 denominator = reserveOut.sub(amountOut).mul(9984); uint256 denominator = reserveOut.sub(amountOut).mul(998); amountIn = (numerator / denominator).add(1); } // performs chained getAmountOut calculations on any number of pairs function getAmountsOut( address factory, uint256 amountIn, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, 'UniswapV2Library: INVALID_PATH'); amounts = new uint256[](path.length); amounts[0] = amountIn; for (uint256 i; i < path.length - 1; i++) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i], path[i + 1]); amounts[i + 1] = getAmountOut(amounts[i], reserveIn, reserveOut); } } // performs chained getAmountIn calculations on any number of pairs function getAmountsIn( address factory, uint256 amountOut, address[] memory path ) internal view returns (uint256[] memory amounts) { require(path.length >= 2, 'UniswapV2Library: INVALID_PATH'); amounts = new uint256[](path.length); amounts[amounts.length - 1] = amountOut; for (uint256 i = path.length - 1; i > 0; i--) { (uint256 reserveIn, uint256 reserveOut) = getReserves(factory, path[i - 1], path[i]); amounts[i - 1] = getAmountIn(amounts[i], reserveIn, reserveOut); } } }
pragma solidity =0.6.6; // a library for performing overflow-safe math, courtesy of DappHub (https://github.com/dapphub/ds-math) library SafeMath { function add(uint x, uint y) internal pure returns (uint z) { require((z = x + y) >= x, 'ds-math-add-overflow'); } function sub(uint x, uint y) internal pure returns (uint z) { require((z = x - y) <= x, 'ds-math-sub-underflow'); } function mul(uint x, uint y) internal pure returns (uint z) { require(y == 0 || (z = x * y) / y == x, 'ds-math-mul-overflow'); } function div(uint x, uint y) internal pure returns (uint z) { z = x / y; } }
pragma solidity >=0.5.0; interface IWETH { function deposit() external payable; function transfer(address to, uint value) external returns (bool); function withdraw(uint) external; }
pragma solidity >=0.6.2; import './IUniswapV2Router01.sol'; interface IUniswapV2Router02 is IUniswapV2Router01 { // function removeLiquidityETHSupportingFeeOnTransferTokens( // address token, // uint liquidity, // uint amountTokenMin, // uint amountETHMin, // address to, // uint deadline // ) external returns (uint amountETH); // function removeLiquidityETHWithPermitSupportingFeeOnTransferTokens( // address token, // uint liquidity, // uint amountTokenMin, // uint amountETHMin, // address to, // uint deadline, // bool approveMax, uint8 v, bytes32 r, bytes32 s // ) external returns (uint amountETH); // function swapExactTokensForTokensSupportingFeeOnTransferTokens( // uint amountIn, // uint amountOutMin, // address[] calldata path, // address to, // uint deadline // ) external; // function swapExactETHForTokensSupportingFeeOnTransferTokens( // uint amountOutMin, // address[] calldata path, // address to, // uint deadline // ) external payable; // function swapExactTokensForETHSupportingFeeOnTransferTokens( // uint amountIn, // uint amountOutMin, // address[] calldata path, // address to, // uint deadline // ) external; }
pragma solidity >=0.6.2; interface IUniswapV2Router01 { function factory() external pure returns (address); function WETH() external pure returns (address); function addLiquidity( address tokenA, address tokenB, uint amountADesired, uint amountBDesired, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB, uint liquidity); function addLiquidityETH( address token, uint amountTokenDesired, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external payable returns (uint amountToken, uint amountETH, uint liquidity); function removeLiquidity( address tokenA, address tokenB, uint liquidity, uint amountAMin, uint amountBMin, address to, uint deadline ) external returns (uint amountA, uint amountB); function removeLiquidityETH( address token, uint liquidity, uint amountTokenMin, uint amountETHMin, address to, uint deadline ) external returns (uint amountToken, uint amountETH); // function removeLiquidityWithPermit( // address tokenA, // address tokenB, // uint liquidity, // uint amountAMin, // uint amountBMin, // address to, // uint deadline, // bool approveMax, uint8 v, bytes32 r, bytes32 s // ) external returns (uint amountA, uint amountB); // function removeLiquidityETHWithPermit( // address token, // uint liquidity, // uint amountTokenMin, // uint amountETHMin, // address to, // uint deadline, // bool approveMax, uint8 v, bytes32 r, bytes32 s // ) external returns (uint amountToken, uint amountETH); function swapExactTokensForTokens( uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline ) external;// returns (uint[] memory amounts); function swapTokensForExactTokens( uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline ) external returns (uint[] memory amounts); function swapExactETHForTokens(uint amountOutMin, address[] calldata path, address to, uint deadline) external payable; // returns (uint[] memory amounts); function swapTokensForExactETH(uint amountOut, uint amountInMax, address[] calldata path, address to, uint deadline) external returns (uint[] memory amounts); function swapExactTokensForETH(uint amountIn, uint amountOutMin, address[] calldata path, address to, uint deadline) external; // returns (uint[] memory amounts); function swapETHForExactTokens(uint amountOut, address[] calldata path, address to, uint deadline) external payable returns (uint[] memory amounts); function quote(uint amountA, uint reserveA, uint reserveB) external pure returns (uint amountB); function getAmountOut(uint amountIn, uint reserveIn, uint reserveOut) external pure returns (uint amountOut); function getAmountIn(uint amountOut, uint reserveIn, uint reserveOut) external pure returns (uint amountIn); function getAmountsOut(uint amountIn, address[] calldata path) external view returns (uint[] memory amounts); function getAmountsIn(uint amountOut, address[] calldata path) external view returns (uint[] memory amounts); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.6; import './IUniswapV2ERC20.sol'; interface IUniswapV2Pair is IUniswapV2ERC20 { event Mint(address indexed sender, uint amount0, uint amount1); event Burn(address indexed sender, uint amount0, uint amount1, address indexed to); event Swap( address indexed sender, uint amount0In, uint amount1In, uint amount0Out, uint amount1Out, address indexed to ); event Sync(uint112 reserve0, uint112 reserve1); // event TreasurySet(address _address); // function setTreasuryAddress(address _address) external; // function MINIMUM_LIQUIDITY() external pure returns (uint); function factory() external view returns (address); function token0() external view returns (address); function token1() external view returns (address); function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast); function price0CumulativeLast() external view returns (uint); function price1CumulativeLast() external view returns (uint); // function kLast() external view returns (uint); function mint(address to) external returns (uint liquidity); function burn(address to) external returns (uint amount0, uint amount1); // function burnETH(address to, address to1) external returns (uint amount0, uint amount1); function swap(uint amount0Out, uint amount1Out, address to) external; // function skim(address to) external; function sync() external; function initialize(address, address, address) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.6; interface IUniswapV2Factory { event PairCreated(address indexed token0, address indexed token1, address pair, uint); event TreasurySet(address _address); function setTreasuryAddress(address _address) external; function getPair(address tokenA, address tokenB) external view returns (address pair); function allPairs() external view returns (uint); // function allPairsLength() external view returns (uint); function createPair(address tokenA, address tokenB) external returns (address pair); }
// SPDX-License-Identifier: MIT pragma solidity 0.6.6; interface IUniswapV2ERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external pure returns (string memory); function symbol() external pure returns (string memory); function decimals() external pure returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); function DOMAIN_SEPARATOR() external view returns (bytes32); function PERMIT_TYPEHASH() external pure returns (bytes32); function nonces(address owner) external view returns (uint); function permit(address owner, address spender, uint value, uint deadline, uint8 v, bytes32 r, bytes32 s) external; }
// SPDX-License-Identifier: MIT pragma solidity 0.6.6; interface IERC20 { event Approval(address indexed owner, address indexed spender, uint value); event Transfer(address indexed from, address indexed to, uint value); function name() external view returns (string memory); function symbol() external view returns (string memory); function decimals() external view returns (uint8); function totalSupply() external view returns (uint); function balanceOf(address owner) external view returns (uint); function allowance(address owner, address spender) external view returns (uint); function approve(address spender, uint value) external returns (bool); function transfer(address to, uint value) external returns (bool); function transferFrom(address from, address to, uint value) external returns (bool); }
// SPDX-License-Identifier: GPL-3.0-or-later pragma solidity >=0.6.0; // helper methods for interacting with ERC20 tokens and sending ETH that do not consistently return true/false library TransferHelper { function safeApprove( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('approve(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x095ea7b3, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeApprove: approve failed' ); } function safeTransfer( address token, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transfer(address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0xa9059cbb, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::safeTransfer: transfer failed' ); } function safeTransferFrom( address token, address from, address to, uint256 value ) internal { // bytes4(keccak256(bytes('transferFrom(address,address,uint256)'))); (bool success, bytes memory data) = token.call(abi.encodeWithSelector(0x23b872dd, from, to, value)); require( success && (data.length == 0 || abi.decode(data, (bool))), 'TransferHelper::transferFrom: transferFrom failed' ); } function safeTransferETH(address to, uint256 value) internal { (bool success, ) = to.call{value: value}(new bytes(0)); require(success, 'TransferHelper::safeTransferETH: ETH transfer failed'); } }
{ "remappings": [], "optimizer": { "enabled": true, "runs": 200 }, "evmVersion": "istanbul", "libraries": {}, "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "devdoc", "userdoc", "metadata", "abi" ] } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_factory","type":"address"},{"internalType":"address","name":"_WETH","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"WETH","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"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":"amountOut","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountIn","outputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"reserveIn","type":"uint256"},{"internalType":"uint256","name":"reserveOut","type":"uint256"}],"name":"getAmountOut","outputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsIn","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"}],"name":"getAmountsOut","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountA","type":"uint256"},{"internalType":"uint256","name":"reserveA","type":"uint256"},{"internalType":"uint256","name":"reserveB","type":"uint256"}],"name":"quote","outputs":[{"internalType":"uint256","name":"amountB","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"tokenA","type":"address"},{"internalType":"address","name":"tokenB","type":"address"},{"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":"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":"uint256","name":"amountOut","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapETHForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactETHForTokens","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForETH","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountIn","type":"uint256"},{"internalType":"uint256","name":"amountOutMin","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapExactTokensForTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactETH","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountOut","type":"uint256"},{"internalType":"uint256","name":"amountInMax","type":"uint256"},{"internalType":"address[]","name":"path","type":"address[]"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"deadline","type":"uint256"}],"name":"swapTokensForExactTokens","outputs":[{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]
Contract Creation Code
60c060405234801561001057600080fd5b50604051613af1380380613af18339818101604052604081101561003357600080fd5b5080516020909101516001600160601b0319606092831b8116608052911b1660a05260805160601c60a05160601c6139ba6101376000398061011252806108ff52806109af5280610aa45280610c185280610cce5280611034528061123a528061133f52806113d4528061144852806118115280611cd25280611d285280611d5c5280611dd05280611fa552806120e85280612170525080610b535280610d6552806110c25280611196528061147a5280611712528061188e5280611ac55280611aee5280611baa5280611d06528061203852806121a252806128ce5280612a4d5280612d725280612da8528061324852806132f6528061337652506139ba6000f3fe6080604052600436106101025760003560e01c80638803dbee11610095578063c45a015511610064578063c45a0155146106d1578063d06ca61f146106e6578063e8e3370014610768578063f305d719146107e8578063fb3bdb411461082e57610170565b80638803dbee14610577578063ad5c46481461060d578063ad615dec1461063e578063baa2abde1461067457610170565b806338ed1739116100d157806338ed1739146103915780634a25d94a146104275780637ff36ab5146104bd57806385f8c2591461054157610170565b806302751cec14610175578063054d50d4146101e157806318cbafe5146102295780631f00ca74146102bf57610170565b3661017057336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461016e5760405162461bcd60e51b815260040180806020018281038252602381526020018061363a6023913960400191505060405180910390fd5b005b600080fd5b34801561018157600080fd5b506101c8600480360360c081101561019857600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356108b2565b6040805192835260208301919091528051918290030190f35b3480156101ed57600080fd5b506102176004803603606081101561020457600080fd5b5080359060208101359060400135610a41565b60408051918252519081900360200190f35b34801561023557600080fd5b5061016e600480360360a081101561024c57600080fd5b813591602081013591810190606081016040820135600160201b81111561027257600080fd5b82018360208201111561028457600080fd5b803590602001918460208302840111600160201b831117156102a557600080fd5b91935091506001600160a01b038135169060200135610a56565b3480156102cb57600080fd5b50610341600480360360408110156102e257600080fd5b81359190810190604081016020820135600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b509092509050610d5e565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037d578181015183820152602001610365565b505050509050019250505060405180910390f35b34801561039d57600080fd5b5061016e600480360360a08110156103b457600080fd5b813591602081013591810190606081016040820135600160201b8111156103da57600080fd5b8201836020820111156103ec57600080fd5b803590602001918460208302840111600160201b8311171561040d57600080fd5b91935091506001600160a01b038135169060200135610dbe565b34801561043357600080fd5b50610341600480360360a081101561044a57600080fd5b813591602081013591810190606081016040820135600160201b81111561047057600080fd5b82018360208201111561048257600080fd5b803590602001918460208302840111600160201b831117156104a357600080fd5b91935091506001600160a01b038135169060200135610fe4565b61016e600480360360808110156104d357600080fd5b81359190810190604081016020820135600160201b8111156104f457600080fd5b82018360208201111561050657600080fd5b803590602001918460208302840111600160201b8311171561052757600080fd5b91935091506001600160a01b0381351690602001356112f9565b34801561054d57600080fd5b506102176004803603606081101561056457600080fd5b50803590602081013590604001356116ba565b34801561058357600080fd5b50610341600480360360a081101561059a57600080fd5b813591602081013591810190606081016040820135600160201b8111156105c057600080fd5b8201836020820111156105d257600080fd5b803590602001918460208302840111600160201b831117156105f357600080fd5b91935091506001600160a01b0381351690602001356116c7565b34801561061957600080fd5b5061062261180f565b604080516001600160a01b039092168252519081900360200190f35b34801561064a57600080fd5b506102176004803603606081101561066157600080fd5b5080359060208101359060400135611833565b34801561068057600080fd5b506101c8600480360360e081101561069757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135611840565b3480156106dd57600080fd5b50610622611ac3565b3480156106f257600080fd5b506103416004803603604081101561070957600080fd5b81359190810190604081016020820135600160201b81111561072a57600080fd5b82018360208201111561073c57600080fd5b803590602001918460208302840111600160201b8311171561075d57600080fd5b509092509050611ae7565b34801561077457600080fd5b506107ca600480360361010081101561078c57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135611b47565b60408051938452602084019290925282820152519081900360600190f35b6107ca600480360360c08110156107fe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611c83565b6103416004803603608081101561084457600080fd5b81359190810190604081016020820135600160201b81111561086557600080fd5b82018360208201111561087757600080fd5b803590602001918460208302840111600160201b8311171561089857600080fd5b91935091506001600160a01b038135169060200135611f5d565b60008082428110156108f9576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b610928897f00000000000000000000000000000000000000000000000000000000000000008a8a8a308a611840565b604080516370a0823160e01b815230600482015290519295509093506109ad918b9188916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561097c57600080fd5b505afa158015610990573d6000803e3d6000fd5b505050506040513d60208110156109a657600080fd5b505161231e565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610a1357600080fd5b505af1158015610a27573d6000803e3d6000fd5b50505050610a358583612472565b50965096945050505050565b6000610a4e84848461256a565b949350505050565b8042811015610a9a576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001685856000198101818110610ad457fe5b905060200201356001600160a01b03166001600160a01b031614610b2d576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b610bb785856000818110610b3d57fe5b905060200201356001600160a01b031633610bb17f000000000000000000000000000000000000000000000000000000000000000089896000818110610b7f57fe5b905060200201356001600160a01b03168a8a6001818110610b9c57fe5b905060200201356001600160a01b031661265a565b8a61271a565b610bf5858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612877915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016916370a0823191602480820192602092909190829003018186803b158015610c5f57600080fd5b505afa158015610c73573d6000803e3d6000fd5b505050506040513d6020811015610c8957600080fd5b5051905086811015610ccc5760405162461bcd60e51b815260040180806020018281038252602b815260200180613896602b913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d3257600080fd5b505af1158015610d46573d6000803e3d6000fd5b50505050610d548482612472565b5050505050505050565b6060610a4e7f000000000000000000000000000000000000000000000000000000000000000085858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b8042811015610e02576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b610e1285856000818110610b3d57fe5b600085856000198101818110610e2457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610e8957600080fd5b505afa158015610e9d573d6000803e3d6000fd5b505050506040513d6020811015610eb357600080fd5b50516040805160208881028281018201909352888252929350610ef5929091899189918291850190849080828437600092019190915250889250612877915050565b86610fa78288886000198101818110610f0a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b505afa158015610f83573d6000803e3d6000fd5b505050506040513d6020811015610f9957600080fd5b50519063ffffffff612c6d16565b1015610d545760405162461bcd60e51b815260040180806020018281038252602b815260200180613896602b913960400191505060405180910390fd5b6060814281101561102a576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b6001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000168686600019810181811061106457fe5b905060200201356001600160a01b03166001600160a01b0316146110bd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b61111b7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b9150868260008151811061112b57fe5b602002602001015111156111705760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b6111f98686600081811061118057fe5b905060200201356001600160a01b0316336111df7f00000000000000000000000000000000000000000000000000000000000000008a8a60008181106111c257fe5b905060200201356001600160a01b03168b8b6001818110610b9c57fe5b856000815181106111ec57fe5b602002602001015161271a565b61123882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612cc3915050565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316632e1a7d4d8360018551038151811061127757fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156112b557600080fd5b505af11580156112c9573d6000803e3d6000fd5b505050506112ee84836001855103815181106112e157fe5b6020026020010151612472565b509695505050505050565b804281101561133d576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168585600081811061137457fe5b905060200201356001600160a01b03166001600160a01b0316146113cd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b60003490507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561142d57600080fd5b505af1158015611441573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6114a67f000000000000000000000000000000000000000000000000000000000000000089896000818110610b7f57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156114f657600080fd5b505af115801561150a573d6000803e3d6000fd5b505050506040513d602081101561152057600080fd5b505161155d5760405162461bcd60e51b815260040180806020018281038252603e815260200180613761603e913960400191505060405180910390fd5b60008686600019810181811061156f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156115d457600080fd5b505afa1580156115e8573d6000803e3d6000fd5b505050506040513d60208110156115fe57600080fd5b505160408051602089810282810182019093528982529293506116409290918a918a918291850190849080828437600092019190915250899250612877915050565b87610fa7828989600019810181811061165557fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b6000610a4e848484612e66565b6060814281101561170d576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b61176b7f000000000000000000000000000000000000000000000000000000000000000089888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b9150868260008151811061177b57fe5b602002602001015111156117c05760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b6117d08686600081811061118057fe5b6112ee82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612cc3915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000610a4e848484612f56565b6000808242811015611887576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b60006118b47f00000000000000000000000000000000000000000000000000000000000000008c8c61265a565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d905291519293506000926323b872dd9160648082019260209290919082900301818787803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506040513d602081101561193957600080fd5b50519050806119795760405162461bcd60e51b81526004018080602001828103825260238152602001806139626023913960400191505060405180910390fd5b6040805163226bf2d160e21b81526001600160a01b03898116600483015282516000938493928716926389afcb44926024808301939282900301818787803b1580156119c457600080fd5b505af11580156119d8573d6000803e3d6000fd5b505050506040513d60408110156119ee57600080fd5b50805160209091015190925090506000611a088f8f613002565b509050806001600160a01b03168f6001600160a01b031614611a2b578183611a2e565b82825b90985096508b881015611a725760405162461bcd60e51b81526004018080602001828103825260268152602001806138706026913960400191505060405180910390fd5b8a871015611ab15760405162461bcd60e51b81526004018080602001828103825260268152602001806137136026913960400191505060405180910390fd5b50505050505097509795505050505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6060610a4e7f0000000000000000000000000000000000000000000000000000000000000000858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130e092505050565b60008060008342811015611b90576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b611b9e8c8c8c8c8c8c613217565b90945092506000611bd07f00000000000000000000000000000000000000000000000000000000000000008e8e61265a565b9050611bde8d33838861271a565b611bea8c33838761271a565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611c4257600080fd5b505af1158015611c56573d6000803e3d6000fd5b505050506040513d6020811015611c6c57600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015611ccc576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b611cfa8a7f00000000000000000000000000000000000000000000000000000000000000008b348c8c613217565b90945092506000611d4c7f00000000000000000000000000000000000000000000000000000000000000008c7f000000000000000000000000000000000000000000000000000000000000000061265a565b9050611d5a8b33838861271a565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611db557600080fd5b505af1158015611dc9573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e4e57600080fd5b505af1158015611e62573d6000803e3d6000fd5b505050506040513d6020811015611e7857600080fd5b5051611eb55760405162461bcd60e51b81526004018080602001828103825260278152602001806138496027913960400191505060405180910390fd5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611f0d57600080fd5b505af1158015611f21573d6000803e3d6000fd5b505050506040513d6020811015611f3757600080fd5b5051925034841015611f4f57611f4f33853403612472565b505096509650969350505050565b60608142811015611fa3576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031686866000818110611fda57fe5b905060200201356001600160a01b03166001600160a01b031614612033576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b6120917f000000000000000000000000000000000000000000000000000000000000000088888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b915034826000815181106120a157fe5b602002602001015111156120e65760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663d0e30db08360008151811061212257fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215557600080fd5b505af1158015612169573d6000803e3d6000fd5b50505050507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663a9059cbb6121ce7f000000000000000000000000000000000000000000000000000000000000000089896000818110610b7f57fe5b846000815181106121db57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561223257600080fd5b505af1158015612246573d6000803e3d6000fd5b505050506040513d602081101561225c57600080fd5b50516122995760405162461bcd60e51b815260040180806020018281038252603e8152602001806137eb603e913960400191505060405180910390fd5b6122d882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612cc3915050565b816000815181106122e557fe5b602002602001015134111561231457612314338360008151811061230557fe5b60200260200101513403612472565b5095945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061239b5780518252601f19909201916020918201910161237c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146123fd576040519150601f19603f3d011682016040523d82523d6000602084013e612402565b606091505b5091509150818015612430575080511580612430575080806020019051602081101561242d57600080fd5b50515b61246b5760405162461bcd60e51b815260040180806020018281038252602d8152602001806138c1602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106124be5780518252601f19909201916020918201910161249f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612520576040519150601f19603f3d011682016040523d82523d6000602084013e612525565b606091505b50509050806125655760405162461bcd60e51b81526004018080602001828103825260348152602001806136ba6034913960400191505060405180910390fd5b505050565b60008084116125aa5760405162461bcd60e51b815260040180806020018281038252602b815260200180613917602b913960400191505060405180910390fd5b6000831180156125ba5750600082115b6125f55760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b6000612609856103e663ffffffff6134c016565b9050600061261d828563ffffffff6134c016565b9050600061264383612637886103e863ffffffff6134c016565b9063ffffffff61352316565b905080828161264e57fe5b04979650505050505050565b60008060006126698585613002565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f8b59d0fbd3a2da5e26f61e1d4b91f355d2c382ec32c993635b0d80dce6e1ef1c609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061279f5780518252601f199092019160209182019101612780565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612801576040519150601f19603f3d011682016040523d82523d6000602084013e612806565b606091505b5091509150818015612834575080511580612834575080806020019051602081101561283157600080fd5b50515b61286f5760405162461bcd60e51b81526004018080602001828103825260318152602001806136896031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156125655760008084838151811061289557fe5b60200260200101518584600101815181106128ac57fe5b60200260200101519150915060006128c48383613002565b50905060006128f47f0000000000000000000000000000000000000000000000000000000000000000858561265a565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561293557600080fd5b505afa158015612949573d6000803e3d6000fd5b505050506040513d606081101561295f57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614612995578284612998565b83835b915091506129f6828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b9550612a0386838361256a565b945050505050600080856001600160a01b0316886001600160a01b031614612a2d57826000612a31565b6000835b91509150600060028c51038a10612a48578a612a89565b612a897f0000000000000000000000000000000000000000000000000000000000000000898e8d60020181518110612a7c57fe5b602002602001015161265a565b9050856001600160a01b0316636d9a640a8484846040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015612af357600080fd5b505af1158015612b07573d6000803e3d6000fd5b50506001909b019a5061287a9950505050505050505050565b6060600282511015612b79576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015612b9157600080fd5b50604051908082528060200260200182016040528015612bbb578160200160208202803683370190505b5090508281600183510381518110612bcf57fe5b60209081029190910101528151600019015b8015612c6557600080612c1e87866001860381518110612bfd57fe5b6020026020010151878681518110612c1157fe5b6020026020010151613572565b91509150612c40848481518110612c3157fe5b60200260200101518383612e66565b846001850381518110612c4f57fe5b6020908102919091010152505060001901612be1565b509392505050565b80820382811115612cbd576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b92915050565b60005b6001835103811015612e6057600080848381518110612ce157fe5b6020026020010151858460010181518110612cf857fe5b6020026020010151915091506000612d108383613002565b5090506000878560010181518110612d2457fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612d5257826000612d56565b6000835b91509150600060028a51038810612d6d5788612da1565b612da17f0000000000000000000000000000000000000000000000000000000000000000878c8b60020181518110612a7c57fe5b9050612dce7f0000000000000000000000000000000000000000000000000000000000000000888861265a565b6001600160a01b0316636d9a640a8484846040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015612e3557600080fd5b505af1158015612e49573d6000803e3d6000fd5b505060019099019850612cc6975050505050505050565b50505050565b6000808411612ea65760405162461bcd60e51b815260040180806020018281038252602c81526020018061365d602c913960400191505060405180910390fd5b600083118015612eb65750600082115b612ef15760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b6000612f156103e8612f09868863ffffffff6134c016565b9063ffffffff6134c016565b90506000612f2f6103e6612f09868963ffffffff612c6d16565b9050612f4c6001828481612f3f57fe5b049063ffffffff61352316565b9695505050505050565b6000808411612f965760405162461bcd60e51b815260040180806020018281038252602581526020018061379f6025913960400191505060405180910390fd5b600083118015612fa65750600082115b612fe15760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b82612ff2858463ffffffff6134c016565b81612ff957fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156130565760405162461bcd60e51b81526004018080602001828103825260258152602001806136ee6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613076578284613079565b83835b90925090506001600160a01b0382166130d9576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6060600282511015613139576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561315157600080fd5b5060405190808252806020026020018201604052801561317b578160200160208202803683370190505b509050828160008151811061318c57fe5b60200260200101818152505060005b6001835103811015612c65576000806131d1878685815181106131ba57fe5b6020026020010151878660010181518110612c1157fe5b915091506131f38484815181106131e457fe5b6020026020010151838361256a565b84846001018151811061320257fe5b6020908102919091010152505060010161319b565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f00000000000000000000000000000000000000000000000000000000000000009092169163e6a4390591604480820192602092909190829003018186803b15801561329157600080fd5b505afa1580156132a5573d6000803e3d6000fd5b505050506040513d60208110156132bb57600080fd5b50516001600160a01b0316141561336e57604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f00000000000000000000000000000000000000000000000000000000000000009092169163c9c65396916044808201926020929091908290030181600087803b15801561334157600080fd5b505af1158015613355573d6000803e3d6000fd5b505050506040513d602081101561336b57600080fd5b50505b60008061339c7f00000000000000000000000000000000000000000000000000000000000000008b8b613572565b915091508160001480156133ae575080155b156133be578793508692506134b3565b60006133cb898484612f56565b905087811161341e57858110156134135760405162461bcd60e51b81526004018080602001828103825260268152602001806137136026913960400191505060405180910390fd5b8894509250826134b1565b600061342b898486612f56565b90508981111561346c5760405162461bcd60e51b81526004018080602001828103825260298152602001806138ee6029913960400191505060405180910390fd5b878110156134ab5760405162461bcd60e51b81526004018080602001828103825260268152602001806138706026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806134db575050808202828282816134d857fe5b04145b612cbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015612cbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006135818585613002565b50905060008061359288888861265a565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156135ca57600080fd5b505afa1580156135de573d6000803e3d6000fd5b505050506040513d60608110156135f457600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461362757808261362a565b81815b9099909850965050505050505056fe7472616e73666572204554482066726f6d20756e65787065637465642073656e646572556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e69737761705632526f757465723a2057455448207472616e73666572206661696c656420696e20737761704578616374455448466f72546f6b656e73556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a2057455448207472616e73666572206661696c656420696e2073776170455448466f724578616374546f6b656e73556e69737761705632526f757465723a20494e56414c49445f5041544800000057455448207472616e73666572206661696c656420696e206164644c6971756964697479455448556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564616d6f756e74412073686f756c64206c657373206f7220657175616c207468616e20616d6f756e7442556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a204558504952454400000000000000004661696c656420696e2073656e64696e67206c697175696469747920746f2070616972a264697066735822122007fa60c233a402a9cebe612a5a5704ea0805a744a15b950845a4189e4049d2f264736f6c63430006060033000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Deployed Bytecode
0x6080604052600436106101025760003560e01c80638803dbee11610095578063c45a015511610064578063c45a0155146106d1578063d06ca61f146106e6578063e8e3370014610768578063f305d719146107e8578063fb3bdb411461082e57610170565b80638803dbee14610577578063ad5c46481461060d578063ad615dec1461063e578063baa2abde1461067457610170565b806338ed1739116100d157806338ed1739146103915780634a25d94a146104275780637ff36ab5146104bd57806385f8c2591461054157610170565b806302751cec14610175578063054d50d4146101e157806318cbafe5146102295780631f00ca74146102bf57610170565b3661017057336001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2161461016e5760405162461bcd60e51b815260040180806020018281038252602381526020018061363a6023913960400191505060405180910390fd5b005b600080fd5b34801561018157600080fd5b506101c8600480360360c081101561019857600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a001356108b2565b6040805192835260208301919091528051918290030190f35b3480156101ed57600080fd5b506102176004803603606081101561020457600080fd5b5080359060208101359060400135610a41565b60408051918252519081900360200190f35b34801561023557600080fd5b5061016e600480360360a081101561024c57600080fd5b813591602081013591810190606081016040820135600160201b81111561027257600080fd5b82018360208201111561028457600080fd5b803590602001918460208302840111600160201b831117156102a557600080fd5b91935091506001600160a01b038135169060200135610a56565b3480156102cb57600080fd5b50610341600480360360408110156102e257600080fd5b81359190810190604081016020820135600160201b81111561030357600080fd5b82018360208201111561031557600080fd5b803590602001918460208302840111600160201b8311171561033657600080fd5b509092509050610d5e565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561037d578181015183820152602001610365565b505050509050019250505060405180910390f35b34801561039d57600080fd5b5061016e600480360360a08110156103b457600080fd5b813591602081013591810190606081016040820135600160201b8111156103da57600080fd5b8201836020820111156103ec57600080fd5b803590602001918460208302840111600160201b8311171561040d57600080fd5b91935091506001600160a01b038135169060200135610dbe565b34801561043357600080fd5b50610341600480360360a081101561044a57600080fd5b813591602081013591810190606081016040820135600160201b81111561047057600080fd5b82018360208201111561048257600080fd5b803590602001918460208302840111600160201b831117156104a357600080fd5b91935091506001600160a01b038135169060200135610fe4565b61016e600480360360808110156104d357600080fd5b81359190810190604081016020820135600160201b8111156104f457600080fd5b82018360208201111561050657600080fd5b803590602001918460208302840111600160201b8311171561052757600080fd5b91935091506001600160a01b0381351690602001356112f9565b34801561054d57600080fd5b506102176004803603606081101561056457600080fd5b50803590602081013590604001356116ba565b34801561058357600080fd5b50610341600480360360a081101561059a57600080fd5b813591602081013591810190606081016040820135600160201b8111156105c057600080fd5b8201836020820111156105d257600080fd5b803590602001918460208302840111600160201b831117156105f357600080fd5b91935091506001600160a01b0381351690602001356116c7565b34801561061957600080fd5b5061062261180f565b604080516001600160a01b039092168252519081900360200190f35b34801561064a57600080fd5b506102176004803603606081101561066157600080fd5b5080359060208101359060400135611833565b34801561068057600080fd5b506101c8600480360360e081101561069757600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359091169060c00135611840565b3480156106dd57600080fd5b50610622611ac3565b3480156106f257600080fd5b506103416004803603604081101561070957600080fd5b81359190810190604081016020820135600160201b81111561072a57600080fd5b82018360208201111561073c57600080fd5b803590602001918460208302840111600160201b8311171561075d57600080fd5b509092509050611ae7565b34801561077457600080fd5b506107ca600480360361010081101561078c57600080fd5b506001600160a01b038135811691602081013582169160408201359160608101359160808201359160a08101359160c0820135169060e00135611b47565b60408051938452602084019290925282820152519081900360600190f35b6107ca600480360360c08110156107fe57600080fd5b506001600160a01b0381358116916020810135916040820135916060810135916080820135169060a00135611c83565b6103416004803603608081101561084457600080fd5b81359190810190604081016020820135600160201b81111561086557600080fd5b82018360208201111561087757600080fd5b803590602001918460208302840111600160201b8311171561089857600080fd5b91935091506001600160a01b038135169060200135611f5d565b60008082428110156108f9576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b610928897f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28a8a8a308a611840565b604080516370a0823160e01b815230600482015290519295509093506109ad918b9188916001600160a01b038416916370a08231916024808301926020929190829003018186803b15801561097c57600080fd5b505afa158015610990573d6000803e3d6000fd5b505050506040513d60208110156109a657600080fd5b505161231e565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d836040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610a1357600080fd5b505af1158015610a27573d6000803e3d6000fd5b50505050610a358583612472565b50965096945050505050565b6000610a4e84848461256a565b949350505050565b8042811015610a9a576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc21685856000198101818110610ad457fe5b905060200201356001600160a01b03166001600160a01b031614610b2d576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b610bb785856000818110610b3d57fe5b905060200201356001600160a01b031633610bb17f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889896000818110610b7f57fe5b905060200201356001600160a01b03168a8a6001818110610b9c57fe5b905060200201356001600160a01b031661265a565b8a61271a565b610bf5858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612877915050565b604080516370a0823160e01b815230600482015290516000916001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc216916370a0823191602480820192602092909190829003018186803b158015610c5f57600080fd5b505afa158015610c73573d6000803e3d6000fd5b505050506040513d6020811015610c8957600080fd5b5051905086811015610ccc5760405162461bcd60e51b815260040180806020018281038252602b815260200180613896602b913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d826040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b158015610d3257600080fd5b505af1158015610d46573d6000803e3d6000fd5b50505050610d548482612472565b5050505050505050565b6060610a4e7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6885858580806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b8042811015610e02576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b610e1285856000818110610b3d57fe5b600085856000198101818110610e2457fe5b905060200201356001600160a01b03166001600160a01b03166370a08231856040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610e8957600080fd5b505afa158015610e9d573d6000803e3d6000fd5b505050506040513d6020811015610eb357600080fd5b50516040805160208881028281018201909352888252929350610ef5929091899189918291850190849080828437600092019190915250889250612877915050565b86610fa78288886000198101818110610f0a57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b505afa158015610f83573d6000803e3d6000fd5b505050506040513d6020811015610f9957600080fd5b50519063ffffffff612c6d16565b1015610d545760405162461bcd60e51b815260040180806020018281038252602b815260200180613896602b913960400191505060405180910390fd5b6060814281101561102a576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b6001600160a01b037f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2168686600019810181811061106457fe5b905060200201356001600160a01b03166001600160a01b0316146110bd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b61111b7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b9150868260008151811061112b57fe5b602002602001015111156111705760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b6111f98686600081811061118057fe5b905060200201356001600160a01b0316336111df7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688a8a60008181106111c257fe5b905060200201356001600160a01b03168b8b6001818110610b9c57fe5b856000815181106111ec57fe5b602002602001015161271a565b61123882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250309250612cc3915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b0316632e1a7d4d8360018551038151811061127757fe5b60200260200101516040518263ffffffff1660e01b815260040180828152602001915050600060405180830381600087803b1580156112b557600080fd5b505af11580156112c9573d6000803e3d6000fd5b505050506112ee84836001855103815181106112e157fe5b6020026020010151612472565b509695505050505050565b804281101561133d576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b03168585600081811061137457fe5b905060200201356001600160a01b03166001600160a01b0316146113cd576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b60003490507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0826040518263ffffffff1660e01b81526004016000604051808303818588803b15801561142d57600080fd5b505af1158015611441573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6114a67f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889896000818110610b7f57fe5b836040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b1580156114f657600080fd5b505af115801561150a573d6000803e3d6000fd5b505050506040513d602081101561152057600080fd5b505161155d5760405162461bcd60e51b815260040180806020018281038252603e815260200180613761603e913960400191505060405180910390fd5b60008686600019810181811061156f57fe5b905060200201356001600160a01b03166001600160a01b03166370a08231866040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b1580156115d457600080fd5b505afa1580156115e8573d6000803e3d6000fd5b505050506040513d60208110156115fe57600080fd5b505160408051602089810282810182019093528982529293506116409290918a918a918291850190849080828437600092019190915250899250612877915050565b87610fa7828989600019810181811061165557fe5b905060200201356001600160a01b03166001600160a01b03166370a08231896040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b6000610a4e848484612e66565b6060814281101561170d576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b61176b7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b9150868260008151811061177b57fe5b602002602001015111156117c05760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b6117d08686600081811061118057fe5b6112ee82878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612cc3915050565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc281565b6000610a4e848484612f56565b6000808242811015611887576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b60006118b47f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688c8c61265a565b604080516323b872dd60e01b81523360048201526001600160a01b03831660248201819052604482018d905291519293506000926323b872dd9160648082019260209290919082900301818787803b15801561190f57600080fd5b505af1158015611923573d6000803e3d6000fd5b505050506040513d602081101561193957600080fd5b50519050806119795760405162461bcd60e51b81526004018080602001828103825260238152602001806139626023913960400191505060405180910390fd5b6040805163226bf2d160e21b81526001600160a01b03898116600483015282516000938493928716926389afcb44926024808301939282900301818787803b1580156119c457600080fd5b505af11580156119d8573d6000803e3d6000fd5b505050506040513d60408110156119ee57600080fd5b50805160209091015190925090506000611a088f8f613002565b509050806001600160a01b03168f6001600160a01b031614611a2b578183611a2e565b82825b90985096508b881015611a725760405162461bcd60e51b81526004018080602001828103825260268152602001806138706026913960400191505060405180910390fd5b8a871015611ab15760405162461bcd60e51b81526004018080602001828103825260268152602001806137136026913960400191505060405180910390fd5b50505050505097509795505050505050565b7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6881565b6060610a4e7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68858585808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152506130e092505050565b60008060008342811015611b90576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b611b9e8c8c8c8c8c8c613217565b90945092506000611bd07f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688e8e61265a565b9050611bde8d33838861271a565b611bea8c33838761271a565b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611c4257600080fd5b505af1158015611c56573d6000803e3d6000fd5b505050506040513d6020811015611c6c57600080fd5b5051949d939c50939a509198505050505050505050565b60008060008342811015611ccc576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b611cfa8a7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc28b348c8c613217565b90945092506000611d4c7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688c7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc261265a565b9050611d5a8b33838861271a565b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db0856040518263ffffffff1660e01b81526004016000604051808303818588803b158015611db557600080fd5b505af1158015611dc9573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb82866040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b158015611e4e57600080fd5b505af1158015611e62573d6000803e3d6000fd5b505050506040513d6020811015611e7857600080fd5b5051611eb55760405162461bcd60e51b81526004018080602001828103825260278152602001806138496027913960400191505060405180910390fd5b806001600160a01b0316636a627842886040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b03168152602001915050602060405180830381600087803b158015611f0d57600080fd5b505af1158015611f21573d6000803e3d6000fd5b505050506040513d6020811015611f3757600080fd5b5051925034841015611f4f57611f4f33853403612472565b505096509650969350505050565b60608142811015611fa3576040805162461bcd60e51b81526020600482015260186024820152600080516020613942833981519152604482015290519081900360640190fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031686866000818110611fda57fe5b905060200201356001600160a01b03166001600160a01b031614612033576040805162461bcd60e51b815260206004820152601d6024820152600080516020613829833981519152604482015290519081900360640190fd5b6120917f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6888888880806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250612b2092505050565b915034826000815181106120a157fe5b602002602001015111156120e65760405162461bcd60e51b81526004018080602001828103825260278152602001806137c46027913960400191505060405180910390fd5b7f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663d0e30db08360008151811061212257fe5b60200260200101516040518263ffffffff1660e01b81526004016000604051808303818588803b15801561215557600080fd5b505af1158015612169573d6000803e3d6000fd5b50505050507f000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc26001600160a01b031663a9059cbb6121ce7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d6889896000818110610b7f57fe5b846000815181106121db57fe5b60200260200101516040518363ffffffff1660e01b815260040180836001600160a01b03166001600160a01b0316815260200182815260200192505050602060405180830381600087803b15801561223257600080fd5b505af1158015612246573d6000803e3d6000fd5b505050506040513d602081101561225c57600080fd5b50516122995760405162461bcd60e51b815260040180806020018281038252603e8152602001806137eb603e913960400191505060405180910390fd5b6122d882878780806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250899250612cc3915050565b816000815181106122e557fe5b602002602001015134111561231457612314338360008151811061230557fe5b60200260200101513403612472565b5095945050505050565b604080516001600160a01b038481166024830152604480830185905283518084039091018152606490920183526020820180516001600160e01b031663a9059cbb60e01b178152925182516000946060949389169392918291908083835b6020831061239b5780518252601f19909201916020918201910161237c565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d80600081146123fd576040519150601f19603f3d011682016040523d82523d6000602084013e612402565b606091505b5091509150818015612430575080511580612430575080806020019051602081101561242d57600080fd5b50515b61246b5760405162461bcd60e51b815260040180806020018281038252602d8152602001806138c1602d913960400191505060405180910390fd5b5050505050565b604080516000808252602082019092526001600160a01b0384169083906040518082805190602001908083835b602083106124be5780518252601f19909201916020918201910161249f565b6001836020036101000a03801982511681845116808217855250505050505090500191505060006040518083038185875af1925050503d8060008114612520576040519150601f19603f3d011682016040523d82523d6000602084013e612525565b606091505b50509050806125655760405162461bcd60e51b81526004018080602001828103825260348152602001806136ba6034913960400191505060405180910390fd5b505050565b60008084116125aa5760405162461bcd60e51b815260040180806020018281038252602b815260200180613917602b913960400191505060405180910390fd5b6000831180156125ba5750600082115b6125f55760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b6000612609856103e663ffffffff6134c016565b9050600061261d828563ffffffff6134c016565b9050600061264383612637886103e863ffffffff6134c016565b9063ffffffff61352316565b905080828161264e57fe5b04979650505050505050565b60008060006126698585613002565b604080516bffffffffffffffffffffffff19606094851b811660208084019190915293851b81166034830152825160288184030181526048830184528051908501206001600160f81b031960688401529a90941b9093166069840152607d8301989098527f8b59d0fbd3a2da5e26f61e1d4b91f355d2c382ec32c993635b0d80dce6e1ef1c609d808401919091528851808403909101815260bd909201909752805196019590952095945050505050565b604080516001600160a01b0385811660248301528481166044830152606480830185905283518084039091018152608490920183526020820180516001600160e01b03166323b872dd60e01b17815292518251600094606094938a169392918291908083835b6020831061279f5780518252601f199092019160209182019101612780565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d8060008114612801576040519150601f19603f3d011682016040523d82523d6000602084013e612806565b606091505b5091509150818015612834575080511580612834575080806020019051602081101561283157600080fd5b50515b61286f5760405162461bcd60e51b81526004018080602001828103825260318152602001806136896031913960400191505060405180910390fd5b505050505050565b60005b60018351038110156125655760008084838151811061289557fe5b60200260200101518584600101815181106128ac57fe5b60200260200101519150915060006128c48383613002565b50905060006128f47f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68858561265a565b9050600080600080846001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b15801561293557600080fd5b505afa158015612949573d6000803e3d6000fd5b505050506040513d606081101561295f57600080fd5b5080516020909101516001600160701b0391821693501690506000806001600160a01b038a811690891614612995578284612998565b83835b915091506129f6828b6001600160a01b03166370a082318a6040518263ffffffff1660e01b815260040180826001600160a01b03166001600160a01b0316815260200191505060206040518083038186803b158015610f6f57600080fd5b9550612a0386838361256a565b945050505050600080856001600160a01b0316886001600160a01b031614612a2d57826000612a31565b6000835b91509150600060028c51038a10612a48578a612a89565b612a897f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68898e8d60020181518110612a7c57fe5b602002602001015161265a565b9050856001600160a01b0316636d9a640a8484846040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015612af357600080fd5b505af1158015612b07573d6000803e3d6000fd5b50506001909b019a5061287a9950505050505050505050565b6060600282511015612b79576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff81118015612b9157600080fd5b50604051908082528060200260200182016040528015612bbb578160200160208202803683370190505b5090508281600183510381518110612bcf57fe5b60209081029190910101528151600019015b8015612c6557600080612c1e87866001860381518110612bfd57fe5b6020026020010151878681518110612c1157fe5b6020026020010151613572565b91509150612c40848481518110612c3157fe5b60200260200101518383612e66565b846001850381518110612c4f57fe5b6020908102919091010152505060001901612be1565b509392505050565b80820382811115612cbd576040805162461bcd60e51b815260206004820152601560248201527464732d6d6174682d7375622d756e646572666c6f7760581b604482015290519081900360640190fd5b92915050565b60005b6001835103811015612e6057600080848381518110612ce157fe5b6020026020010151858460010181518110612cf857fe5b6020026020010151915091506000612d108383613002565b5090506000878560010181518110612d2457fe5b60200260200101519050600080836001600160a01b0316866001600160a01b031614612d5257826000612d56565b6000835b91509150600060028a51038810612d6d5788612da1565b612da17f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68878c8b60020181518110612a7c57fe5b9050612dce7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68888861265a565b6001600160a01b0316636d9a640a8484846040518463ffffffff1660e01b815260040180848152602001838152602001826001600160a01b03166001600160a01b031681526020019350505050600060405180830381600087803b158015612e3557600080fd5b505af1158015612e49573d6000803e3d6000fd5b505060019099019850612cc6975050505050505050565b50505050565b6000808411612ea65760405162461bcd60e51b815260040180806020018281038252602c81526020018061365d602c913960400191505060405180910390fd5b600083118015612eb65750600082115b612ef15760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b6000612f156103e8612f09868863ffffffff6134c016565b9063ffffffff6134c016565b90506000612f2f6103e6612f09868963ffffffff612c6d16565b9050612f4c6001828481612f3f57fe5b049063ffffffff61352316565b9695505050505050565b6000808411612f965760405162461bcd60e51b815260040180806020018281038252602581526020018061379f6025913960400191505060405180910390fd5b600083118015612fa65750600082115b612fe15760405162461bcd60e51b81526004018080602001828103825260288152602001806137396028913960400191505060405180910390fd5b82612ff2858463ffffffff6134c016565b81612ff957fe5b04949350505050565b600080826001600160a01b0316846001600160a01b031614156130565760405162461bcd60e51b81526004018080602001828103825260258152602001806136ee6025913960400191505060405180910390fd5b826001600160a01b0316846001600160a01b031610613076578284613079565b83835b90925090506001600160a01b0382166130d9576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a205a45524f5f414444524553530000604482015290519081900360640190fd5b9250929050565b6060600282511015613139576040805162461bcd60e51b815260206004820152601e60248201527f556e697377617056324c6962726172793a20494e56414c49445f504154480000604482015290519081900360640190fd5b815167ffffffffffffffff8111801561315157600080fd5b5060405190808252806020026020018201604052801561317b578160200160208202803683370190505b509050828160008151811061318c57fe5b60200260200101818152505060005b6001835103811015612c65576000806131d1878685815181106131ba57fe5b6020026020010151878660010181518110612c1157fe5b915091506131f38484815181106131e457fe5b6020026020010151838361256a565b84846001018151811061320257fe5b6020908102919091010152505060010161319b565b6040805163e6a4390560e01b81526001600160a01b03888116600483015287811660248301529151600092839283927f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d689092169163e6a4390591604480820192602092909190829003018186803b15801561329157600080fd5b505afa1580156132a5573d6000803e3d6000fd5b505050506040513d60208110156132bb57600080fd5b50516001600160a01b0316141561336e57604080516364e329cb60e11b81526001600160a01b038a81166004830152898116602483015291517f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d689092169163c9c65396916044808201926020929091908290030181600087803b15801561334157600080fd5b505af1158015613355573d6000803e3d6000fd5b505050506040513d602081101561336b57600080fd5b50505b60008061339c7f000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d688b8b613572565b915091508160001480156133ae575080155b156133be578793508692506134b3565b60006133cb898484612f56565b905087811161341e57858110156134135760405162461bcd60e51b81526004018080602001828103825260268152602001806137136026913960400191505060405180910390fd5b8894509250826134b1565b600061342b898486612f56565b90508981111561346c5760405162461bcd60e51b81526004018080602001828103825260298152602001806138ee6029913960400191505060405180910390fd5b878110156134ab5760405162461bcd60e51b81526004018080602001828103825260268152602001806138706026913960400191505060405180910390fd5b94508793505b505b5050965096945050505050565b60008115806134db575050808202828282816134d857fe5b04145b612cbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6d756c2d6f766572666c6f7760601b604482015290519081900360640190fd5b80820182811015612cbd576040805162461bcd60e51b815260206004820152601460248201527364732d6d6174682d6164642d6f766572666c6f7760601b604482015290519081900360640190fd5b60008060006135818585613002565b50905060008061359288888861265a565b6001600160a01b0316630902f1ac6040518163ffffffff1660e01b815260040160606040518083038186803b1580156135ca57600080fd5b505afa1580156135de573d6000803e3d6000fd5b505050506040513d60608110156135f457600080fd5b5080516020909101516001600160701b0391821693501690506001600160a01b038781169084161461362757808261362a565b81815b9099909850965050505050505056fe7472616e73666572204554482066726f6d20756e65787065637465642073656e646572556e697377617056324c6962726172793a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a7472616e7366657246726f6d3a207472616e7366657246726f6d206661696c65645472616e7366657248656c7065723a3a736166655472616e736665724554483a20455448207472616e73666572206661696c6564556e697377617056324c6962726172793a204944454e544943414c5f414444524553534553556e69737761705632526f757465723a20494e53554646494349454e545f425f414d4f554e54556e697377617056324c6962726172793a20494e53554646494349454e545f4c4951554944495459556e69737761705632526f757465723a2057455448207472616e73666572206661696c656420696e20737761704578616374455448466f72546f6b656e73556e697377617056324c6962726172793a20494e53554646494349454e545f414d4f554e54556e69737761705632526f757465723a204558434553534956455f494e5055545f414d4f554e54556e69737761705632526f757465723a2057455448207472616e73666572206661696c656420696e2073776170455448466f724578616374546f6b656e73556e69737761705632526f757465723a20494e56414c49445f5041544800000057455448207472616e73666572206661696c656420696e206164644c6971756964697479455448556e69737761705632526f757465723a20494e53554646494349454e545f415f414d4f554e54556e69737761705632526f757465723a20494e53554646494349454e545f4f55545055545f414d4f554e545472616e7366657248656c7065723a3a736166655472616e736665723a207472616e73666572206661696c6564616d6f756e74412073686f756c64206c657373206f7220657175616c207468616e20616d6f756e7442556e697377617056324c6962726172793a20494e53554646494349454e545f494e5055545f414d4f554e54556e69737761705632526f757465723a204558504952454400000000000000004661696c656420696e2073656e64696e67206c697175696469747920746f2070616972a264697066735822122007fa60c233a402a9cebe612a5a5704ea0805a744a15b950845a4189e4049d2f264736f6c63430006060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
-----Decoded View---------------
Arg [0] : _factory (address): 0xf5d8E98ef1f66f1cAb949A2555837FE755fc2D68
Arg [1] : _WETH (address): 0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000f5d8e98ef1f66f1cab949a2555837fe755fc2d68
Arg [1] : 000000000000000000000000c02aaa39b223fe8d0a0e5c4f27ead9083c756cc2
Loading...
Loading
Loading...
Loading
Multichain Portfolio | 26 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|
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.